PL/M-80 COMPILER 7/3/79 PAGE 1 ISIS-II PL/M-80 V3.1 COMPILATION OF MODULE BLKIO OBJECT MODULE PLACED IN :F1:SBLKIO.OBJ COMPILER INVOKED BY: PLM80 :F1:SBLKIO.SRC DEBUG DATE(7/3/79) 1 BLKIO: DO; $NOLIST 27 1 DECL MAX$RE$TRY LIT '010', ACK LIT '01H', NACK LIT '02H', ABO LIT '03H', NAME LIT '021H', DRECD LIT '023H', END$REC LIT '024H', ABORT LIT '025H', EXIT LIT '026H', RVINT LIT '027H', TM$OUT LIT '0FEH', CS$ERR LIT '0FFH'; 28 1 DECL BLK$LNGTH LIT '0255'; 29 1 DECL CHKSM ADDRESS; 30 1 DECL LEN BYTE; 31 1 DECL RE$TRY BYTE; 32 1 DECL TIMER ADDRESS; 33 1 DECL TYPE BYTE; 34 1 REC$DATA: PROCEDURE BYTE PUBLIC; 35 2 RETURN(INPUT(SIO$DATA) AND 07FH); 36 2 END REC$DATA; 37 1 REC$RDY: PROCEDURE BYTE PUBLIC; 38 2 RETURN(INPUT(SIO$STAT) AND SIO$RXRDY); 39 2 END REC$RDY; 40 1 SCHAR: PROCEDURE (CHAR) PUBLIC; 41 2 DECL CHAR BYTE; 42 2 DO WHILE (INPUT(SIO$STAT) AND SIO$TXRDY) = 0; 43 3 END; 44 2 OUTPUT (SIO$DATA) = CHAR; 45 2 END SCHAR; PL/M-80 COMPILER 7/3/79 PAGE 2 46 1 BLOCK$SEND: PROCEDURE (BUFFER$ADD,LEN,TYPE)PUBLIC; 47 2 DECL BUFFER$ADD ADDRESS; 48 2 DECL (BUFFER BASED BUFFER$ADD) (BLK$LNGTH) BYTE; 49 2 DECL I BYTE; 50 2 DECL LEN BYTE; 51 2 DECL TYPE BYTE; /* BLOCK$SEND TRANSMITS A RECORD. RECORD FORMAT IS BYTE 1 RECORD TYPE BYTE 2 - 253 DATA BYTE 254 LSB OF CHECKSUM BYTE 255 MSB OF CHECKSUM RECORDS ARE FIXED LENGTH 255 CHARS SO SHORT RECORDS ARE PADDED WITH NULLS. */ 52 2 CHKSM = 0; 53 2 CALL SCHAR (TYPE); 54 2 CHKSM = CHKSM + TYPE; 55 2 IF LEN = 0 THEN GOTO PAD; 57 2 DO I = 0 TO (LEN-1); 58 3 CALL SCHAR (BUFFER(I)); 59 3 CHKSM = CHKSM + BUFFER(I); 60 3 END; 61 2 PAD: IF LEN < (BLK$LNGTH-3) THEN 62 2 DO WHILE I < (BLK$LNGTH-3); 63 3 CALL SCHAR (NULL); 64 3 I = I + 1; 65 3 END; 66 2 CALL SCHAR (LOW(CHKSM)); 67 2 CALL SCHAR (HIGH(CHKSM)); 68 2 RETURN; 69 2 END BLOCK$SEND; 70 1 BLOCK$RECV: PROCEDURE (BUFFER$ADD) BYTE PUBLIC; 71 2 DECL BUFFER$ADD ADDRESS; 72 2 DECL (BUFFER BASED BUFFER$ADD) (BLK$LNGTH) BYTE; 73 2 DECL I BYTE; 74 2 DECL CS$TEMP ADDRESS; /* BLOCK$RECV INPUTS A RECORD FROM THE USART. INPUT REQUIRED IS A BUFFER ADDRESS FOR A 255 CHARACTER BUFFER RECORD TYPE IS RETURNED AS THE FIRST CHARACTER IN THE BUFFER TYPES ARE: ! NAME RECORD # DATA RECORD $ END OF FILE % ABORT & TERMINATE LINK PL/M-80 COMPILER 7/3/79 PAGE 3 ' REVERSE INTERUPT RUB OUT(0FFH) CHECKSUM ERROR (0FEH) TIMEOUT ERROR ACTUAL RECORD LENGTH IS RETURNED AS PARAMETER A ONE SECOND TIME OUT IS USED TO DETERMINE POSSIBLE LINE FAILURE*/ 75 2 CHKSM = 0; 76 2 CS$TEMP = 0; 77 2 I = 0; 78 2 LEN = 0; 79 2 TIMER = 01FFFH; 80 2 DO FOREVER; 81 3 DO WHILE ((REC$RDY = 0) AND (TIMER > 0)); 82 4 CALL TIME (1); 83 4 TIMER = TIMER - 1; 84 4 END; 85 3 IF TIMER = 0 THEN 86 3 DO; 87 4 BUFFER(0) = TM$OUT; 88 4 RETURN (LEN-1); 89 4 END; 90 3 TIMER = 01FFFH; 91 3 IF I < (BLK$LNGTH-6) THEN 92 3 DO; 93 4 BUFFER(LEN) = REC$DATA; 94 4 IF (((BUFFER(LEN) > 0) AND (BUFFER(LEN) < 8)) OR ((BUFFER(LEN) > LF) AND (BUFFER(LEN) < SPACE))) THEN 95 4 DO; 96 5 BUFFER(LEN) = BUFFER(LEN); 97 5 END; 98 4 IF BUFFER(LEN) > 0 THEN 99 4 DO; 100 5 CHKSM = CHKSM + BUFFER(LEN); 101 5 LEN = LEN + 1; 102 5 END; 103 4 END; ELSE 104 3 DO; 105 4 BUFFER(I) = REC$DATA; 106 4 IF ((BUFFER(I) < '0') OR (BUFFER(I) > '7')) THEN 107 4 DO; 108 5 BUFFER(0) = CS$ERR; 109 5 END; 110 4 BUFFER(I) = (BUFFER(I) AND 07H); 111 4 IF I = (BLK$LNGTH-1) THEN 112 4 DO; 113 5 CS$TEMP = ((SHL(BUFFER(BLK$LNGTH-1),3)) OR (BUFFER(BLK$LNGTH-2))); 114 5 CS$TEMP = (SHL(CS$TEMP,3)) OR (BUFFER(BLK$LNGTH-3)); 115 5 CS$TEMP = (SHL(CS$TEMP,3)) OR (BUFFER(BLK$LNGTH-4)); PL/M-80 COMPILER 7/3/79 PAGE 4 116 5 CS$TEMP = (SHL(CS$TEMP,3)) OR (BUFFER(BLK$LNGTH-5)); 117 5 CS$TEMP = (SHL(CS$TEMP,3)) OR (BUFFER(BLK$LNGTH-6)); 118 5 IF CS$TEMP - CHKSM <> 0 THEN BUFFER(0) = CS$ERR; 120 5 RETURN(LEN-1); 121 5 END; 122 4 END; 123 3 I = I + 1; 124 3 END; 125 2 END BLOCK$RECV; 126 1 DECL ENQ$CODE LIT '03H'; 127 1 DECL ENQ$POS LIT '03H'; 128 1 ENQ: PROCEDURE BYTE PUBLIC; 129 2 DECL RESP$CHAR BYTE; 130 2 RE$TRY = MAX$RE$TRY; 131 2 DO WHILE RE$TRY > 0; 132 3 TIMER = 1FFFH; 133 3 CALL SCHAR(ENQ$CODE); 134 3 DO WHILE (TIMER > 0) AND (REC$RDY = 0); 135 4 CALL TIME(1); 136 4 TIMER = TIMER - 1; 137 4 END; 138 3 IF TIMER > 0 THEN 139 3 DO; 140 4 RESP$CHAR = REC$DATA; 141 4 IF RESP$CHAR = ENQ$POS THEN 142 4 DO; 143 5 TIMER = 1FFFH; 144 5 DO WHILE ((TIMER > 0) AND (REC$RDY = 0)); 145 6 CALL TIME(1); 146 6 TIMER = TIMER - 1; 147 6 END; 148 5 IF TIMER = 0 THEN RETURN(TRUE); 150 5 IF REC$DATA = ACK THEN RETURN(TRUE); 152 5 END; 153 4 END; 154 3 RE$TRY = RE$TRY - 1; 155 3 END; 156 2 CALL SCHAR(CR); 157 2 RETURN(FALSE); 158 2 END ENQ; 159 1 BLK$XMT: PROCEDURE (BUFFER$ADD,LEN,TYPE) BYTE PUBLIC; 160 2 DECL BUFFER$ADD ADDRESS; 161 2 DECL LEN BYTE; 162 2 DECL RESP BYTE; 163 2 DECL TYPE BYTE; 164 2 RE$TRY = MAX$RE$TRY; 165 2 DO WHILE RE$TRY > 0; PL/M-80 COMPILER 7/3/79 PAGE 5 166 3 TIMER = 1FFFH; 167 3 CALL BLOCK$SEND(BUFFER$ADD,LEN,TYPE); 168 3 DO WHILE (TIMER > 0) AND (REC$RDY = 0); 169 4 CALL TIME(1); 170 4 TIMER = TIMER - 1; 171 4 END; 172 3 IF TIMER > 0 THEN 173 3 DO; 174 4 RESP = REC$DATA; 175 4 IF ((RESP = ACK) OR (RESP = ABO)) THEN RETURN (RESP); 177 4 END; 178 3 RE$TRY = RE$TRY - 1; 179 3 END; 180 2 IF TIMER = 0 THEN RETURN (TM$OUT); 182 2 RETURN (RESP); 183 2 END BLK$XMT; 184 1 BLOCK$INP: PROCEDURE (BUFFER$ADD) BYTE PUBLIC; 185 2 DECL BUFFER$ADD ADDRESS; 186 2 DECL (BUFFER BASED BUFFER$ADD) (BLK$LNGTH) BYTE; 187 2 DECL DUMMY BYTE; 188 2 DECL RTYPE LIT 'BUFFER(0)'; 189 2 RE$TRY = MAX$RE$TRY; 190 2 CALL SCHAR(ACK); 191 2 RTYPE = 0; 192 2 IF REC$RDY > 0 THEN DUMMY = REC$DATA; 194 2 DO WHILE RE$TRY > 0; 195 3 LEN = BLOCK$RECV(BUFFER$ADD); 196 3 IF ((RTYPE = NAME) OR (RTYPE = DRECD) OR (RTYPE = END$REC) OR (RTYPE = EXIT) OR (RTYPE = RVINT)) THEN 197 3 DO; 198 4 RETURN(LEN); 199 4 END; ELSE 200 3 DO; 201 4 IF RTYPE = ABORT THEN 202 4 DO; 203 5 CALL SCHAR(ABO); 204 5 RETURN(LEN); 205 5 END; ELSE 206 4 DO; 207 5 RE$TRY = RE$TRY - 1; 208 5 IF RE$TRY > 0 THEN 209 5 CALL SCHAR(NACK); ELSE 210 5 CALL SCHAR(ABO); 211 5 END; 212 4 END; 213 3 END; 214 2 RETURN(LEN); 215 2 END BLOCK$INP; PL/M-80 COMPILER 7/3/79 PAGE 6 216 1 END; EOF MODULE INFORMATION: CODE AREA SIZE = 0448H 1096D VARIABLE AREA SIZE = 001BH 27D MAXIMUM STACK SIZE = 0006H 6D 354 LINES READ 0 PROGRAM ERROR(S) END OF PL/M-80 COMPILATION