home *** CD-ROM | disk | FTP | other *** search
- $COMPACT(h550drv -CONST IN CODE- HAS
- $ h550drv,
- $ xh550;
- $ EXPORTS
- $ host$550$init,
- $ host$550$finish,
- $ host$550$setup,
- $ host$550$output,
- $ host$550$answer,
- $ host$550$hangup,
- $ host$550$utility,
- $ host$550$check)
- h550drv:
- DO;
-
- $include(/rmx386/inc/rmxplm.ext)
- $include(/rmx386/inc/error.lit)
- $include(/rmx386/inc/common.lit)
- $include(/rmx386/inc/io.lit)
- $include(lddinfo.lit)
- $include(lddvers.lit)
-
- host$550$init: PROCEDURE(cdata$p) EXTERNAL;
- DECLARE
- cdata$p POINTER;
- END host$550$init;
-
- host$550$finish: PROCEDURE(cdata$p) EXTERNAL;
- DECLARE
- cdata$p POINTER;
- END host$550$finish;
-
- host$550$setup: PROCEDURE(udata$p) EXTERNAL;
- DECLARE
- udata$p POINTER;
- END host$550$setup;
-
- host$550$answer: PROCEDURE(udata$p) EXTERNAL;
- DECLARE
- udata$p POINTER;
- END host$550$answer;
-
- host$550$hangup: PROCEDURE(udata$p) EXTERNAL;
- DECLARE
- udata$p POINTER;
- END host$550$hangup;
-
- host$550$utility: PROCEDURE(udata$p) EXTERNAL;
- DECLARE
- udata$p POINTER;
- END host$550$utility;
-
- host$550$check: PROCEDURE(cdata$p) EXTERNAL;
- DECLARE
- cdata$p POINTER;
- END host$550$check;
-
- DECLARE
- dinfo_550(1) BYTE EXTERNAL DATA,
- num_duibs BYTE EXTERNAL DATA,
- duibtable(1) BYTE EXTERNAL DATA;
-
- host$550$output: PROCEDURE(udata$p,output$char) REENTRANT PUBLIC;
- DECLARE
- udata$p POINTER,
- output$char BYTE;
-
- RETURN;
- END host$550$output;
-
- DECLARE
- duib$p POINTER,
- duib BASED duib$p (1) DUIB$STRUCT,
- dinfo$p POINTER,
- dinfo BASED dinfo$p LOADABLE$TERM$DINFO,
- local$dinfo BASED dinfo$p STRUCTURE(
- term$dinfo LOADABLE$TERM$DINFO,
- port$base WORD,
- reset$char BYTE,
- break$char BYTE),
- uinfo$p POINTER,
- uinfo BASED uinfo$p STRUCTURE(
- conn$flags WORD,
- term$flags WORD,
- in$baud$rate DWORD,
- out$baud$rate DWORD,
- scroll$count WORD);
-
- DECLARE
- co$conn$t TOKEN,
- root$t TOKEN,
- HI$job$$t TOKEN,
- parent$job$t TOKEN,
- input$buff(128) BYTE,
- status WORD,
- bytes$read WORD,
- del BYTE, /* Delimeter returned by get$argument */
- num$channels WORD,
- IO$address WORD,
- interrupt$level WORD,
- exception$info STRUCTURE(
- entry$point POINTER,
- mode BYTE),
- NO$BUFFERS LITERALLY '0',
- RT_PREN LITERALLY '29H',
- ROOT_JOB LITERALLY '3',
- PARENT_JOB LITERALLY '1',
- NO$EXCEPTIONS LITERALLY '00',
- sign$on$msg(*) BYTE DATA(CR,LF,
- ' iRMX III Loadable Hostess 550 Terminal Driver Front End',CR,LF,LF),
- badparm$msg(*) BYTE DATA(CR,LF,
- 'Invalid Command Tail',CR,LF), /* Unknown parameter msg */
- missing$parm$msg(*) BYTE DATA(CR,LF,
- 'Missing input parameter',CR,LF), /* missing input parm msg */
- invalid$parm$msg(*) BYTE DATA(CR,LF,
- 'Invalid input parameter',CR,LF), /* invalid input parm msg */
- usage$msg(*) BYTE DATA(CR,LF,
- 'USAGE: h550drv( (Hostess 550 Number of channels (4 or 8)),',CR,LF,
- ' (Hostess 550 I/O Address(in HEX)),',CR,LF,
- ' (Hostess 550 Encoded Interrupt Level))',CR,LF);
-
- DECLARE
- version(*) BYTE DATA(H550$version,H550$name,0);
-
- $subtitle('CONVERT')
- convert: PROCEDURE(char$p) DWORD REENTRANT;
-
- DECLARE
- char$p POINTER,
- char BASED char$p (1) BYTE,
- char$value BYTE,
- value DWORD,
- i BYTE;
-
- value = 0;
- DO i = 1 to char(0);
- IF (char(i) < 30H) OR (char(i) > 46H) OR
- ((char(i) > 39H) AND (char(i) < 41H)) THEN
- RETURN 0;
- IF char(i) > 39H THEN
- char$value = char(i) - 37H;
- ELSE
- char$value = char(i) - 30H;
- value = (value * 16) + char$value;
- END;
- RETURN value;
-
- END convert;
-
- $subtitle('append$string')
- append$string: PROCEDURE(str1$p, str2$p) REENTRANT;
-
- DECLARE
- str1$p POINTER,
- str2$p POINTER,
- str1 BASED str1$p(1) BYTE,
- str2 BASED str2$p(1) BYTE,
- i BYTE,
- j BYTE;
-
- j = str1(0);
- DO i = 1 to str2(0);
- str1(j+i) = str2(i);
- END;
- str1(0) = str1(0) + str2(0);
-
- END append$string;
-
- $subtitle('Check Exception')
- check$exception: PROCEDURE(exception, info$p) REENTRANT;
-
- DECLARE
- exception WORD,
- info$p POINTER,
- info BASED info$p STRUCTURE(
- count BYTE,
- char(1) BYTE),
- exc$buf STRUCTURE(
- count BYTE,
- char(80) BYTE),
- dummy WORD;
-
- IF exception <> E$OK THEN
- DO;
- CALL dq$decode$exception(exception, @exc$buf, @dummy);
- CALL dq$write(co$conn$t, @(CR,LF), 2, @dummy);
- CALL dq$write(co$conn$t, @exc$buf.char, exc$buf.count, @dummy);
- CALL dq$write(co$conn$t, @(': '), 2, @dummy);
- IF info$p <> NIL THEN
- CALL dq$write(co$conn$t, @info.char, info.count, @dummy);
- CALL dq$write(co$conn$t, @(CR,LF), 2, @dummy);
-
- CALL dq$detach(co$conn$t,@status);
-
- CALL rq$delete$job (SELECTOR$OF(NIL), @status);
-
- CALL rq$suspend$task(SELECTOR$OF(NIL),@status); /* if all else fails */
- END;
-
- END check$exception;
-
-
- /*
- * MAIN PROGRAM
- */
-
- /*
- * Turn off exceptions
- */
-
- exception$info.mode = NO$EXCEPTIONS;
- CALL rq$set$exception$handler( @exception$info, @status);
-
- /*
- * Get the arguments. The first one should be the name
- * of this program.
- */
-
- del = dq$get$argument(@input$buff, @status );
-
- /*
- * Create a log file for the program
- */
- IF status = E$OK THEN
- DO;
- /* log file name = <prog name>.log */
-
- CALL append$string (@input$buff, @(4,'.log'));
- END;
- ELSE
- DO;
- input$buff(0) = 0;
- CALL append$string (@input$buff, @(17,'/work/h550drv.log'));
- END;
-
- /*
- * Create a connection to the log file
- */
-
- co$conn$t = dq$create(@input$buff, @status );
- CALL check$exception(status,NIL);
-
- CALL dq$open( co$conn$t, WRITE$ONLY, NO$BUFFERS, @status );
-
- CALL dq$write(co$conn$t,@sign$on$msg,LENGTH(sign$on$msg),@status);
- CALL check$exception(status,NIL);
-
- /*
- * If the delimeter is a CR or LF then there are no parameters.
- * This is an error so print out the usage message.
- */
-
- IF (del = CR) OR (del = LF) THEN
- DO;
- CALL dq$write(co$conn$t,@usage$msg,LENGTH(usage$msg),@status);
- GOTO exit;
- END;
-
- /* Get Number of Channels */
-
- del = dq$get$argument(@input$buff,@status);
- CALL check$exception(status,NIL);
- IF (del = CR) OR (del = LF) OR (input$buff(0) = 0) THEN
- DO;
- CALL dq$write(co$conn$t,@missing$parm$msg,
- LENGTH(missing$parm$msg),@status);
- CALL dq$write(co$conn$t,@usage$msg,LENGTH(usage$msg),@status);
- GOTO exit;
- END;
-
- num$channels = convert(@input$buff);
-
- IF (num$channels <> 4) AND (num$channels <> 8)
- AND (num$channels <> 16) THEN
- DO;
- CALL dq$write(co$conn$t,@invalid$parm$msg,
- LENGTH(invalid$parm$msg),@status);
- CALL dq$write(co$conn$t,@usage$msg,LENGTH(usage$msg),@status);
- GOTO exit;
- END;
-
- /* Get Hostess 550 I/O Base Address */
-
- del = dq$get$argument(@input$buff,@status);
- CALL check$exception(status,NIL);
- IF (del = CR) OR (del = LF) OR (input$buff(0) = 0) THEN
- DO;
- CALL dq$write(co$conn$t,@missing$parm$msg,
- LENGTH(missing$parm$msg),@status);
- CALL dq$write(co$conn$t,@usage$msg,LENGTH(usage$msg),@status);
- GOTO exit;
- END;
-
- IO$address = convert(@input$buff);
-
- /* Get Hostess 550 Interrupt Level */
-
- del = dq$get$argument(@input$buff,@status);
- CALL check$exception(status,NIL);
- IF (del = CR) OR (del = LF) OR (input$buff(0) = 0) THEN
- DO;
- CALL dq$write(co$conn$t,@missing$parm$msg,
- LENGTH(missing$parm$msg),@status);
- CALL dq$write(co$conn$t,@usage$msg,
- LENGTH(usage$msg),@status);
- GOTO exit;
- END;
-
- interrupt$level = convert(@input$buff);
-
- load$driver:
-
- dinfo$p = BUILD$PTR(
- rqe$create$descriptor(
- rqe$get$address(@dinfo_550,@status),
- SIZE(local$dinfo),
- @status),0);
- CALL check$exception(status,@input$buff);
-
- dinfo.interrupt$level = interrupt$level;
- local$dinfo.port$base = IO$address;
- dinfo.num$units = num$channels;
-
- CALL rqe$delete$descriptor(SELECTOR$OF(dinfo$p),@status);
- CALL check$exception(status,@input$buff);
-
- IF num$channels = 4 THEN
- DO;
- duib$p = BUILD$PTR(
- rqe$create$descriptor(
- rqe$get$address(@duibtable,@status),
- (SIZE(duib) * 8),
- @status),0);
- CALL check$exception(status,@input$buff);
-
- /* Null out DUIB names for channels 4 thru 7 */
- CALL SETB(20H,@duib(4).name,14);
- CALL SETB(20H,@duib(5).name,14);
- CALL SETB(20H,@duib(6).name,14);
- CALL SETB(20H,@duib(7).name,14);
-
- CALL rqe$delete$descriptor(SELECTOR$OF(duib$p),@status);
- CALL check$exception(status,@input$buff);
- END;
-
- duib$p = @duibtable;
-
- CALL rq$install$duibs(num$channels,
- duib$p,
- NIL,
- @status);
- CALL check$exception(status,NIL);
-
- root$t = rq$get$task$tokens(ROOT_JOB,@status);
- CALL check$exception(status,NIL);
-
- HI$job$t = rq$lookup$object(root$t,@(8,'R?HI$JOB'),0,@status);
- CALL check$exception(status,NIL);
-
- parent$job$t = rq$get$task$tokens(PARENT_JOB,@status);
- CALL check$exception(status,NIL);
-
- CALL rq$catalog$object(HI$job$t,parent$job$t,
- @(11,'H550DRV_JOB'),@status);
- IF status = E$CONTEXT THEN
- DO;
- CALL rq$uncatalog$object(HI$job$t,
- @(11,'H550DRV_JOB'),@status);
- CALL rq$catalog$object(HI$job$t,parent$job$t,
- @(11,'H550DRV_JOB'),@status);
- END;
-
- CALL dq$detach(co$conn$t,@status); /* detach the log file */
-
- CALL rq$suspend$task(SELECTOR$OF(NIL),@status);
-
- exit:
-
- /*
- * Clean up. Detach :CO:.
- */
-
- CALL dq$detach(co$conn$t,@status);
-
- CALL rq$delete$job (SELECTOR$OF(NIL), @status);
-
- CALL rq$suspend$task(SELECTOR$OF(NIL),@status); /* if all else fails */
-
- END h550drv;
-