'CORAL'GLIB 'COMMENT' LIBRARY FOR 8086 LOADER; 'LIBRARY' ":F1:GLIB.EXT"; 'BEGIN' 'INTEGER' A; 'INTEGER' 'PROCEDURE' INPORT('VALUE' 'INTEGER' PORT); 'COMMENT' INPUTS FROM AN 8-BIT PORT AND RETURNS THE RESULT; 'BEGIN' 'INTEGER' ANS; 'CODE' 'BEGIN' MOV DX,%PORT; IN AL,DX; MOV AH,0; MOV %ANS,AX; SIZ 10 'END';'ANSWER' ANS 'END'; 'PROCEDURE' OUTPORT('VALUE' 'INTEGER' PORT,DATA); 'COMMENT' OUTPUTS 8-BIT DATA TO 8-BIT PORT; 'BEGIN' 'CODE' 'BEGIN' MOV DX,%PORT; MOV AX,%DATA; OUT DX,AL; SIZ 8 'END' 'END'; 'INTEGER' 'PROCEDURE' INSERIAL('INTEGER' 'ARRAY' PORTS); 'COMMENT' INPUTS A CHARACTER FROM A SERIAL PORT AND RETURNS IT. PORTS[0] CONTAINS THE STATUS PORT ADDRESS, PORTS[1] CONTAINS THE DATA PORT ADDRESS; 'BEGIN' 'FOR' A := INPORT(PORTS[0]) 'WHILE' A 'MASK' 2 = 0 'DO'; 'ANSWER' INPORT(PORTS[1]) 'END'; 'PROCEDURE' OUTSERIAL('INTEGER' 'ARRAY' PORTS; 'VALUE' 'INTEGER' CHAR); 'COMMENT' OUTPUTS A CHARACTER VIA A SERIAL PORT, PORT NUMBERS BEING ELEMENTS OF THE ARRAY AS FOR "INSERIAL"; 'BEGIN' 'FOR' A := INPORT(PORTS[0]) 'WHILE' A 'MASK' 1 = 0 'DO'; OUTPORT(PORTS[1],CHAR) 'END'; 'INTEGER' 'PROCEDURE' ATOH('VALUE' 'INTEGER' CHAR); 'COMMENT' CONVERTS ASCII 0-F TO HEX EQUIVALENT AND RETURNS RESULT; 'BEGIN' 'ANSWER' 'IF' CHAR >= 'LITERAL'(0) 'AND' CHAR <= 'LITERAL'(9) 'THEN' CHAR - 'LITERAL'(0) 'ELSE' 'IF' CHAR >= 'LITERAL'(A) 'AND' CHAR <= 'LITERAL' (F) 'THEN' CHAR -'LITERAL'(A)+ 10 'ELSE' 0 'END'; 'INTEGER' 'PROCEDURE' HTOA ('VALUE' 'INTEGER' NUMBER); 'COMMENT' CONVERTS A 4-BIT HEX VALUE TO ITS ASCII EQUIVALENT; 'BEGIN' 'ANSWER' 'IF' NUMBER >= 0 'AND' NUMBER <= 9 'THEN' NUMBER+'LITERAL'(0) 'ELSE' 'IF' NUMBER >= 10 'AND' NUMBER <= 15 'THEN' NUMBER+'LITERAL'(A) -10 'ELSE' 0 'END'; 'INTEGER' 'PROCEDURE' INBYTE('INTEGER' 'ARRAY' PORTSA,PORTSB); 'COMMENT' INPUTS TWO ASCII CHARACTERS FROM A SERIAL PORT WHOSE ADDRESSES ARE IN THE PORTS ARRAY, FORMS A HEX BYTE AND RETURNS ITS VALUE, AND ECHOES THE CHARACTERS TO ANOTHER SERIAL PORT; 'BEGIN' 'INTEGER' C1,C2; C1 := INSERIAL(PORTSA)'MASK'127; OUTSERIAL(PORTSB,C1); C2 := INSERIAL(PORTSA)'MASK'127; OUTSERIAL(PORTSB,C2); 'ANSWER' ATOH(C1)*16 + ATOH(C2) 'END'; 'INTEGER''PROCEDURE'INBTE('INTEGER''ARRAY'PORTS); 'ANSWER' ATOH(INSERIAL(PORTS)'MASK'127)*16+ATOH(INSERIAL(PORTS)'MASK'127); 'INTEGER' 'PROCEDURE' INWRDH('INTEGER' 'ARRAY' PORTSA,PORTSB); 'COMMENT' INPUTS TWO BYTES (HIGH BYTE FIRST) FROM A SERIAL PORT WHOSE ADDRESSES ARE IN THE PORTS ARRAY, FORMS A HEX WORD AND RETURNS ITS VALUE; 'BEGIN' 'ANSWER' INBYTE(PORTSA,PORTSB)*256+INBYTE(PORTSA,PORTSB) 'END'; 'INTEGER''PROCEDURE'INWDH('INTEGER''ARRAY'PORTS); 'ANSWER' INBTE(PORTS)*256+INBTE(PORTS); 'INTEGER''PROCEDURE'INWDL('INTEGER''ARRAY'PORTS); 'ANSWER'INBTE(PORTS)+INBTE(PORTS)*256; 'INTEGER' 'PROCEDURE' INWRDL('INTEGER' 'ARRAY' PORTSA,PORTSB); 'COMMENT' SAME AS INWRDH EXCEPT LOW BYTE IS INPUT FIRST; 'BEGIN' 'ANSWER' INBYTE(PORTSA,PORTSB)+INBYTE(PORTSA,PORTSB)*256 'END'; 'PROCEDURE' OUTBYTE('INTEGER' 'ARRAY' PORTS; 'VALUE' 'INTEGER' DATA); 'COMMENT' CONVERTS A BYTE TO ITS TWO CORRESPONBXNG ASCII CHARACTERS AND OUTPUTS THEM TO A SERIAL PORT WHOSE ADDRESSES ARE SPECIFIED IN THE PORTS ARRAY; 'BEGIN' OUTSERIAL(PORTS,HTOA('BITS'[4,4]DATA)); OUTSERIAL(PORTS,HTOA('BITS'[4,0]DATA)) 'END'; 'PROCEDURE' OUTWDH('INTEGER' 'ARRAY' PORTS; 'VALUE' 'INTEGER' DATA); 'COMMENT' OUTPUTS A WORD AS TWO BYTES(HIGH BYTE FIRST); 'BEGIN' OUTBYTE(PORTS,'BITS'[8,8]DATA); OUTBYTE(PORTS,'BITS'[8,0]DATA) 'END'; 'PROCEDURE' OUTWDL('INTEGER' 'ARRAY' PORTS; 'VALUE' 'INTEGER' DATA); 'COMMENT' SAME AS OUTWDH EXCEPT LOW BYTE FIRST; 'BEGIN' OUTBYTE(PORTS,'BITS'[8,0]DATA); OUTBYTE(PORTS,'BITS'[8,8]DATA) 'END'; 'PROCEDURE' WRBYTE('VALUE' 'INTEGER' SEG, OFF, DATA); 'COMMENT' WRITES A BYTE TO ANYWHERE IN MEMORY (SEGMENT AND OFFSET SPECIFIED); 'BEGIN' 'CODE' 'BEGIN' MOV ES,%SEG; MOV BX,%OFF; MOV AX,%DATA; MOV ES:[BX],AL; SIZ 14 'END' 'END'; 'INTEGER' 'PROCEDURE' RDBYTE('VALUE' 'INTEGER' SEG,OFF); 'COMMENT' READS THE VALUE OF A BYTE ANYWHERE IN MEMORY AND REURNS ITS VALUE; 'BEGIN' 'INTEGER' DATA; 'CODE' 'BEGIN' MOV ES,%SEG; MOV BX,%OFF; MOV AL,ES:[BX]; MOV AH,0; MOV %DATA,AX; SIZ 16 'END'; 'ANSWER' DATA 'END'; 'PROCEDURE' OUTSTRING('INTEGER' 'ARRAY' PORTS; 'VALUE' 'INTEGER' SEG,OFF); 'COMMENT' OUTPUTS A STRING WHOSE LOCATION IS SPECIFIED BY SEG AND OFF TO A SERIAL PORT WHOSE ADDRESS IS SPECIFIED BY THE PORTS ARRAY; 'BEGIN' 'INTEGER' LENGTH,PTR; LENGTH := RDBYTE(SEG,OFF); 'FOR' PTR := 1 'STEP' 1 'UNTIL' LENGTH 'DO' OUTSERIAL(PORTS, RDBYTE(SEG,OFF+PTR)) 'END'; 'PROCEDURE' CRLF('INTEGER' 'ARRAY' PORTS); 'COMMENT' OUTPUTS CARRIAGE RETURN, LINE FEED TO SERIAL PORT SPECIFIED; 'BEGIN' OUTSERIAL(PORTS,10); OUTSERIAL(PORTS,13) 'END'; 'INTEGER' 'PROCEDURE' GETDS; 'COMMENT' RETURNS CURRENT VALUE OF DATA SEGMENT REGISTER; 'BEGIN' 'INTEGER' DSEG; 'CODE''BEGIN' MOV %DSEG,DS; SIZ 4 'END'; 'ANSWER' DSEG 'END'; 'INTEGER' 'PROCEDURE' GETCS; 'COMMENT' RETURNS CURRENT VALUE OF CODE SEGMENT REGISTER; 'BEGIN' 'INTEGER' CSEG; 'CODE''BEGIN' MOV %CSEG,CS; SIZ 4 'END'; 'ANSWER' CSEG 'END'; 'END' 'FINISH'