PL/M-86 COMPILER TQDEVICEMODULE PAGE 1 ISIS-II PL/M-86 V2.0 COMPILATION OF MODULE TQDEVICEMODULE OBJECT MODULE PLACED IN :F5:AB31.OBJ COMPILER INVOKED BY: :F9:PLM86 :F5:AB31.SRC $LARGE /* INSITE ORDER NO. AB31 */ /* TITLE/VERSION: TQNEW, V1.0 */ /* FUNCTION: THIS PROGRAM PROVIDES RUN-TIME SUPPORT FOR TERMINAL INPUT AND OUTPUT VIA THE USART ON AN ISBC 88/25, 86/05, 86/12B, 86/14, OR 86/30 BOARD. THIS RUN-TIME SUPPORT IS USED IN CONJUNCTION WITH PASCAL 86 OR FORTRAN 86. */ /* REQ'D HARDWARE: DEVELOPMENT SYSTEM, ICE86, ICE88, OR ISBC-957B FOR DOWNLOADING. TARGET SYSTEM INCLUDING AN ISBC 88/25, 86/05, 86/12A, 86/14, OR 86/30 BOARD. */ /* REQ'D SOFTWARE: DEVELOPMENT SYSTEM, ISBC-957B */ /* REGISTERS MODIFIED: - */ /* RAM REQUIRED: DATA + STACK */ /* 54D + 14D= 68D */ /* ROM REQUIRED: 657D */ /* MAX. SUBROUTINE NESTING LEVEL: 2 */ /* PROGRAMMER: STEVE COOPER INTEL CORPORATION 5200 NE ELAM YOUNG PKWY HILLSBORO, OR. 97123 */ 1 TQ$DEVICE$MODULE: DO; 2 1 TQDEVICE: PROCEDURE(NAME$PTR,NAME$LENGTH,DRIVER$TABLE$PTR) WORD PUBLIC; 3 2 DECLARE (NAME$PTR,DRIVER$TABLE$PTR) POINTER; 4 2 DECLARE NAME$LENGTH BYTE; 5 2 DECLARE (NO$MATCH$FLAG,I) BYTE; 6 2 DECLARE DRIVER$BASE BASED DRIVER$TABLE$PTR POINTER; 7 2 DECLARE DRIVER$NAME BASED NAME$PTR(1) BYTE; 8 2 DECLARE NAME(4) BYTE DATA(':T1:'); 9 2 DECLARE DRIVER$TABLE(10) POINTER; /* IF SPECIAL DEVICE THEN REASSIGN DEVICE DRIVER TABLE */ 10 2 NO$MATCH$FLAG = 0; /* IF NAME$LENGTH <> 4 THEN NO$MATCH$FLAG = 1; */ /* IF NO$MATCH$FLAG = 0 THEN DO I=0 TO 3; */ /* IF NAME(I) <> DRIVER$NAME(I) THEN NO$MATCH$FLAG = 1; */ /* END; */ 11 2 IF NO$MATCH$FLAG = 0 THEN DO; PL/M-86 COMPILER TQDEVICEMODULE PAGE 2 13 3 DRIVER$BASE = @DRIVER$TABLE; 14 3 DRIVER$TABLE(0) = @OPEN$NEW$DEVICE; 15 3 DRIVER$TABLE(1) = @CLOSE$NEW$DEVICE; 16 3 DRIVER$TABLE(2) = @READ$NEW$DEVICE; 17 3 DRIVER$TABLE(3) = @WRITE$NEW$DEVICE; 18 3 DRIVER$TABLE(4) = @SEEK$NEW$DEVICE; 19 3 DRIVER$TABLE(5) = @NEW$MOVE; 20 3 DRIVER$TABLE(6) = @NEW$MARK$END; 21 3 DRIVER$TABLE(7) = @NEW$REWIND; 22 3 DRIVER$TABLE(8) = @NEW$BACKSPACE; 23 3 DRIVER$TABLE(9) = @NEW$END$FILE; 24 3 END; 25 2 RETURN 0; 26 2 END TQDEVICE; /***********************************************************************/ /***********************************************************************/ /***********************************************************************/ /* D E V I C E D R I V E R S */ /***********************************************************************/ /***********************************************************************/ /***********************************************************************/ /* OPEN A FILE */ /***********************************************************************/ 27 1 OPEN$NEW$DEVICE: PROCEDURE(FD$SEG,NAME$PTR,NAME$LENGTH,ATTRIB,REC$LENGTH) WORD PUBLIC; 28 2 DECLARE (FD$SEG,ATTRIB,REC$LENGTH) WORD; 29 2 DECLARE NAME$PTR POINTER; 30 2 DECLARE NAME$LENGTH BYTE; 31 2 DECLARE CNTL$PORT$8253 LITERALLY '0D6H' ; /* 3-4 OF 86/12A HRM */ 32 2 DECLARE COUNT$REG$8253 LITERALLY '0D4H' ; 33 2 DECLARE STAT$PORT$8251 LITERALLY '0DAH' ; 34 2 DECLARE CONTROL$BYTE$8253 LITERALLY '0B6H' ; /* COUNTER 2*/ /* READ/LOAD LEAST SIG. BYTE FIRST */ /* MODE 3 - SQUARE WAVE RATE GENERATOR */ /* 16 BIT BINARY COUNTER */ 35 2 DECLARE RESET$8251$TO$MODE LITERALLY '40H' ; 36 2 DECLARE CONTROL$BYTE$8251 LITERALLY '4EH' ; /* BAUD RATE - ASYN X16 */ /* 8 BIT CHARACTER LENGTH */ /* NO PARITY */ /* ONE STOP BIT */ 37 2 DECLARE BAUD$CODE LITERALLY '0008H'; /* 9600 BAUD */ 38 2 DECLARE ENABLE$8251 LITERALLY '27H'; /* TRANSMIT ENABLE */ /* RECEIVE ENABLE */ /* DTR BAR = 0 (READY)*/ /* RTS BAR = 0 (READY)*/ /* FILE DESCRIPTOR HAS 16 BYTES TO STORE NECESSARY INFORMATION */ /* VAR WILL CONTAIN THE POINTER TO THE FILE DESCRIPTOR */ /* FD$SEG FORMS THE BASE PORTION OF THE ADDRESS POINTING TO THE FILE DESC.*/ /* STORE INFO REGARDING TYPE OF FILE TO BE USED WHEN MARKING END OF RECORD*/ 39 2 DECLARE VAR POINTER; 40 2 DECLARE VAR$DESCRIPTOR STRUCTURE (OFFSET WORD, BASE WORD) AT (@VAR); 41 2 DECLARE FILE$DESCRIPTOR BASED VAR STRUCTURE( AVAILABLE(16) BYTE, RESERVE(32) BYTE); PL/M-86 COMPILER TQDEVICEMODULE PAGE 3 42 2 VAR$DESCRIPTOR.OFFSET = 0; 43 2 VAR$DESCRIPTOR.BASE = FD$SEG; 44 2 FILE$DESCRIPTOR.AVAILABLE(0)=(ATTRIB AND 08H); /* FORM OF FILE */ /* INITIALIZE THE INTERVAL TIMER (8253) */ 45 2 OUTPUT (CNTL$PORT$8253) = CONTROL$BYTE$8253; 46 2 OUTPUT (COUNT$REG$8253) = LOW(BAUD$CODE); 47 2 OUTPUT (COUNT$REG$8253) = HIGH(BAUD$CODE); /* INITIALIZE THE USART (8251) SEND 3 ZERO'S TO CLEAR FIRST */ 48 2 OUTPUT (STAT$PORT$8251) = 0H; 49 2 OUTPUT (STAT$PORT$8251) = 0H; 50 2 OUTPUT (STAT$PORT$8251) = 0H; 51 2 OUTPUT (STAT$PORT$8251) = RESET$8251$TO$MODE; 52 2 OUTPUT (STAT$PORT$8251) = CONTROL$BYTE$8251; 53 2 OUTPUT (STAT$PORT$8251) = ENABLE$8251; /* RETURN STATUS OF ZERO TO INDICATE SUCCESSFUL OPEN */ 54 2 RETURN 0; 55 2 END OPEN$NEW$DEVICE; /*************************************************************************/ /* CLOSE A FILE */ /*************************************************************************/ 56 1 CLOSE$NEW$DEVICE: PROCEDURE(FD$SEG,DISPOSE) WORD PUBLIC; 57 2 DECLARE FD$SEG WORD; 58 2 DECLARE DISPOSE BYTE; 59 2 RETURN 0; 60 2 END CLOSE$NEW$DEVICE; /*************************************************************************/ /* READ A BLOCK */ /*************************************************************************/ 61 1 READ$NEW$DEVICE: PROCEDURE(FD$SEG,BUFFER$PTR,COUNT,ACTUAL$PTR) WORD PUBLIC; 62 2 DECLARE (FD$SEG,COUNT) WORD; 63 2 DECLARE (BUFFER$PTR,ACTUAL$PTR) POINTER; 64 2 DECLARE ACTUAL BASED ACTUAL$PTR WORD; 65 2 DECLARE BUFFER BASED BUFFER$PTR (128) BYTE; 66 2 DECLARE CR LITERALLY '0DH'; 67 2 DECLARE LF LITERALLY '0AH'; 68 2 DECLARE READING BYTE; 69 2 DECLARE STAT$PORT$8251 LITERALLY '0DAH'; 70 2 DECLARE DATA$PORT$8251 LITERALLY '0D8H'; 71 2 READING = 1; 72 2 ACTUAL = 0; 73 2 IF COUNT = 0 THEN READING = 0; 75 2 DO WHILE READING = 1; 76 3 IF ((INPUT(STAT$PORT$8251) AND 2) <> 0) THEN DO; 78 4 BUFFER(ACTUAL) = INPUT(DATA$PORT$8251) AND 7FH; 79 4 OUTPUT(DATA$PORT$8251) = BUFFER(ACTUAL); 80 4 IF BUFFER(ACTUAL) <> CR THEN DO; 82 5 ACTUAL = ACTUAL + 1; PL/M-86 COMPILER TQDEVICEMODULE PAGE 4 83 5 IF ACTUAL = COUNT THEN READING = 0; 85 5 END; 86 4 ELSE DO; 87 5 OUTPUT(DATA$PORT$8251) = LF; 88 5 READING = 0; 89 5 END; 90 4 END; 91 3 END; 92 2 RETURN 0; 93 2 END READ$NEW$DEVICE; /************************************************************************/ /* WRITE A BLOCK */ /************************************************************************/ 94 1 WRITE$NEW$DEVICE: PROCEDURE (FD$SEG,BUFFER,COUNT) WORD PUBLIC; 95 2 DECLARE (FD$SEG,COUNT) WORD; 96 2 DECLARE BUFFER POINTER; 97 2 DECLARE STATUS BYTE; 98 2 DECLARE I WORD; 99 2 DECLARE BUF BASED BUFFER(1) BYTE; 100 2 DECLARE STAT$PORT$8251 LITERALLY '0DAH'; 101 2 DECLARE DATA$PORT$8251 LITERALLY '0D8H'; 102 2 DO I=0 TO COUNT-1; 103 3 DO WHILE ((INPUT(STAT$PORT$8251) AND 4H) = 0); /* CHECK FOR TxEMPTY */ 104 4 END; 105 3 OUTPUT(DATA$PORT$8251) = BUF(I); 106 3 END; 107 2 RETURN 0; 108 2 END WRITE$NEW$DEVICE; /**************************************************************************/ /* RECORD SEEK */ /**************************************************************************/ 109 1 SEEK$NEW$DEVICE: PROCEDURE(FD$SEG,MODE,HIGH$OFFSET,LOW$OFFSET) WORD PUBLIC; 110 2 DECLARE (FD$SEG,HIGH$OFFSET,LOW$OFFSET) WORD; 111 2 DECLARE MODE BYTE; 112 2 RETURN 0; 113 2 END SEEK$NEW$DEVICE; /*************************************************************************/ /* MOVE FORWARD */ /*************************************************************************/ 114 1 NEW$MOVE: PROCEDURE(FD$SEG) WORD PUBLIC; 115 2 DECLARE FD$SEG WORD; 116 2 RETURN 0; 117 2 END NEW$MOVE; /*************************************************************************/ /* MARK RECORD END */ /*************************************************************************/ 118 1 NEW$MARK$END: PROCEDURE(FD$SEG) WORD PUBLIC; 119 2 DECLARE FD$SEG WORD; 120 2 DECLARE DATA$PORT$8251 LITERALLY '0D8H'; 121 2 DECLARE STAT$PORT$8251 LITERALLY '0DAH'; 122 2 DECLARE CR LITERALLY '0DH'; 123 2 DECLARE LF LITERALLY '0AH'; PL/M-86 COMPILER TQDEVICEMODULE PAGE 5 /* FILE DESCRIPTOR HAS 16 BYTES TO STORE NECESSARY INFORMATION */ /* VAR WILL CONTAIN THE POINTER TO THE FILE DESCRIPTOR */ /* FD$SEG FORMS THE BASE PORTION OF THE ADDRESS POINTING TO THE FILE DESC.*/ /* RETRIEVE INFO REGARDING TYPE OF FILE TO KNOW HOW TO END A RECORD*/ 124 2 DECLARE VAR POINTER; 125 2 DECLARE VAR$DESCRIPTOR STRUCTURE (OFFSET WORD, BASE WORD) AT (@VAR); 126 2 DECLARE FILE$DESCRIPTOR BASED VAR STRUCTURE( AVAILABLE(16) BYTE, RESERVE(32) BYTE); 127 2 VAR$DESCRIPTOR.OFFSET = 0; 128 2 VAR$DESCRIPTOR.BASE = FD$SEG; 129 2 IF (FILE$DESCRIPTOR.AVAILABLE(0) = 08H) THEN DO; /* OUTPUT A CARRIAGE RETURN AND LINE FEED FOR FORMATTED FILES */ 131 3 DO WHILE ((INPUT(STAT$PORT$8251) AND 4) = 0); 132 4 END; 133 3 OUTPUT(DATA$PORT$8251) = CR; 134 3 CALL TIME(10000); /* DELAY SO CR CAN OCCUR*/ 135 3 DO WHILE ((INPUT(STAT$PORT$8251) AND 4) = 0); 136 4 END; 137 3 OUTPUT(DATA$PORT$8251) = LF; 138 3 END; 139 2 RETURN 0; 140 2 END NEW$MARK$END; /************************************************************************/ /* REWIND A FILE */ /************************************************************************/ 141 1 NEW$REWIND: PROCEDURE(FD$SEG,MODE) WORD PUBLIC; 142 2 DECLARE FD$SEG WORD; 143 2 DECLARE MODE BYTE; 144 2 RETURN 0; 145 2 END NEW$REWIND; /************************************************************************/ /* BACKSPACE */ /************************************************************************/ 146 1 NEW$BACKSPACE: PROCEDURE(FD$SEG) WORD PUBLIC; 147 2 DECLARE FD$SEG WORD; 148 2 RETURN 0; 149 2 END NEW$BACKSPACE; /************************************************************************/ /* END FILE */ /************************************************************************/ 150 1 NEW$END$FILE: PROCEDURE(FD$SEG) WORD PUBLIC; 151 2 DECLARE FD$SEG WORD; 152 2 RETURN 0; 153 2 END NEW$END$FILE; 154 1 END TQ$DEVICE$MODULE; PL/M-86 COMPILER TQDEVICEMODULE PAGE 6 MODULE INFORMATION: CODE AREA SIZE = 028FH 655D CONSTANT AREA SIZE = 0000H 0D VARIABLE AREA SIZE = 0036H 54D MAXIMUM STACK SIZE = 000EH 14D 277 LINES READ 0 PROGRAM ERROR(S) END OF PL/M-86 COMPILATION