PL/M-51 COMPILER PAGE 1 ISIS-II PL/M-51 V1.0 COMPILER INVOKED BY: PLM51 :F1:TSTR00.P51 $ROM(LARGE) $DEBUG NOSYMBOLS NOPAGING /*THIS PLM/51 PROGRAM IS THE CONTROL FOR THE VIKING ELECTRONICS UNIVERSAL PRODUCT TESTER. MAIN MODULE VERSION 1.1 26 JULY 1988 BY BILL HEIDEMAN */ 1 1 TSTR_MAIN: DO; $NOLIST $INCLUDE(TSTR.PUB) 5 1 = DECLARE DCL LITERALLY 'DECLARE'; 6 1 = DCL LIT LITERALLY 'LITERALLY'; 7 1 = DCL FOREVER LIT 'WHILE 1'; 8 1 = DCL AUX LIT 'AUXILIARY'; = 9 1 = DCL STOP LIT '0'; 10 1 = DCL MODE LIT '1'; 11 1 = DCL TEST LIT '2'; 12 1 = DCL REPEAT LIT '3'; 13 1 = DCL ERASE LIT '9'; = 14 1 = DCL (KEY_EDGE,FAULT,TICK_2MSEC) BIT PUBLIC; = 15 1 = DCL (KEY_DEBN,KEY_DATA,KEY_LAST) BYTE PUBLIC; 16 1 = DCL (TMR_CNT,BIT_CNT,COMMND,CURSOR) BYTE PUBLIC; 17 1 = DCL (FLASH_CNT,MAIN_TIMER) BYTE PUBLIC; = 18 1 = DCL (TEST_BUFF,BOARD_BUFF,ERROR_CODE,MODE_BUFF) BYTE PUBLIC; 19 1 = DCL DISP_DATA (5) BYTE PUBLIC; 20 1 = DCL DISP_BUFF (10) BYTE PUBLIC; 21 1 = DCL DIA WORD PUBLIC; = 22 1 = DCL H1_DATA (512) BYTE PUBLIC AT (4000H) AUX; 23 1 = DCL H2_DATA (512) BYTE PUBLIC AT (4200H) AUX; 24 1 = DCL CODE_DATA (512) BYTE PUBLIC AT (4400H) AUX; 25 1 = DCL CODE_PNTR WORD PUBLIC AT (4600H) AUX; 26 1 = DCL BD_COUNT_LOW BYTE AT (4602H) AUX; 27 1 = DCL BD_COUNT_HIGH BYTE AT (4603H) AUX; = 28 1 = DCL EXP0_A BYTE PUBLIC AT (0F000H) AUX; 29 1 = DCL EXP0_B BYTE PUBLIC AT (0F001H) AUX; 30 1 = DCL EXP0_C BYTE PUBLIC AT (0F002H) AUX; 31 1 = DCL EXP0_COM BYTE PUBLIC AT (0F003H) AUX; = 32 1 = DCL EXP1_A BYTE PUBLIC AT (0F100H) AUX; 33 1 = DCL EXP1_B BYTE PUBLIC AT (0F101H) AUX; 34 1 = DCL EXP1_C BYTE PUBLIC AT (0F102H) AUX; 35 1 = DCL EXP1_COM BYTE PUBLIC AT (0F103H) AUX; = 36 1 = DCL EXP2_A BYTE PUBLIC AT (0F200H) AUX; 37 1 = DCL EXP2_B BYTE PUBLIC AT (0F201H) AUX; 38 1 = DCL EXP2_C BYTE PUBLIC AT (0F202H) AUX; 39 1 = DCL EXP2_COM BYTE PUBLIC AT (0F203H) AUX; = 40 1 = DCL EXP3_A BYTE PUBLIC AT (0F300H) AUX; 41 1 = DCL EXP3_B BYTE PUBLIC AT (0F301H) AUX; 42 1 = DCL EXP3_C BYTE PUBLIC AT (0F302H) AUX; 43 1 = DCL EXP3_COM BYTE PUBLIC AT (0F303H) AUX; = 44 1 = DCL EXP4_A BYTE PUBLIC AT (0F400H) AUX; 45 1 = DCL EXP4_B BYTE PUBLIC AT (0F401H) AUX; 46 1 = DCL EXP4_C BYTE PUBLIC AT (0F402H) AUX; 47 1 = DCL EXP4_COM BYTE PUBLIC AT (0F403H) AUX; = 48 1 = DCL TTG_OUT (12) BYTE PUBLIC CONSTANT (28H, = 11H,21H,41H,12H,22H,42H,14H,24H,44H,18H,48H); = /******************************************** * * * THESE ARE THE EXTERNAL PROCEDURES * * * ********************************************/ 49 2 BOARD_TEST: PROCEDURE (SELECT) EXTERNAL; 50 2 DCL SELECT BYTE; 51 1 END BOARD_TEST; /******************************************** * * * THESE ARE THE PUBLIC PROCEDURES * * * ********************************************/ 52 2 WAITM: PROCEDURE (LENGTH) PUBLIC; 53 2 DCL (LENGTH,I) BYTE; 54 3 DO I=1 TO LENGTH; 55 3 CALL TIME(10); 56 3 END; 57 1 END WAITM; /******************************************** * * * THESE ARE THE INTERNAL PROCEDURES * * * ********************************************/ 58 2 KEY_DECODE: PROCEDURE USING 1; 59 2 DCL (MASK2,COUNT) BYTE; 60 2 MASK2=1; 61 2 COUNT=0; 62 3 DO WHILE (MASK2 AND NOT(KEY_DEBN))=0; 63 3 COUNT=COUNT+1; 64 3 MASK2=SHL(MASK2,1); 65 3 END; 66 2 MASK2=10H; 67 3 DO WHILE (MASK2 AND NOT(KEY_DEBN))=0; 68 3 COUNT=COUNT+3; 69 3 MASK2=SHL(MASK2,1); 70 3 END; 71 2 IF COUNT=0AH THEN COUNT=0FFH; 73 2 ELSE IF COUNT=9 THEN COUNT=0AH; 75 2 COUNT=COUNT+1; 76 2 KEY_DATA=COUNT; 77 1 END KEY_DECODE; 78 2 BCD_CONV: PROCEDURE (ITEM) WORD USING 1; 79 2 DCL (BCDN,ITEM,COUNT,ZERO) BYTE; 80 2 DCL (RESULT) WORD; 81 2 ZERO=0; 82 2 COUNT=SHR(ITEM,4); 83 2 BCDN=0; 84 3 DO WHILE COUNT<>0; 85 3 BCDN=BCDN+16H; 86 3 BCDN=DEC(BCDN); 87 3 COUNT=COUNT-1; 88 3 END; 89 2 COUNT=(ITEM AND 0FH)+ZERO; /* FORM BCD OF LSB */ 90 2 COUNT=DEC(COUNT); 91 2 BCDN=BCDN+COUNT; 92 2 BCDN=DEC(BCDN); 93 2 RESULT=(DOUBLE(BCDN AND 0FH)) OR (SHL(DOUBLE(BCDN AND 0F0H),4)); 94 2 RETURN RESULT; 95 1 END BCD_CONV; 96 2 DISP_MON: PROCEDURE USING 1; 97 2 DISP_DATA(4)=MODE_BUFF; 98 2 DISP_DATA(0)=LOW(BCD_CONV(ERROR_CODE)); 99 2 DISP_DATA(1)=HIGH(BCD_CONV(ERROR_CODE)); 100 3 IF MODE_BUFF=5 THEN DO; 102 3 DISP_DATA(2)=LOW(BCD_CONV(BOARD_BUFF)); 103 3 DISP_DATA(3)=HIGH(BCD_CONV(BOARD_BUFF)); 104 3 END; 105 3 ELSE DO; 106 3 DISP_DATA(2)=LOW(BCD_CONV(TEST_BUFF)); 107 3 DISP_DATA(3)=HIGH(BCD_CONV(TEST_BUFF)); 108 3 END; 109 1 END DISP_MON; 110 2 DISP_FORMAT: PROCEDURE USING 1; 111 2 DCL DEC_TBL (16) BYTE CONSTANT(6FH,03H,5EH,1FH,33H, 3DH,7DH,07H,7FH,37H,1,2,4,8,10H,20H); 112 2 DCL (I,VALUE,DATA) BYTE; 113 3 DO I=0 TO 3; 114 3 DATA=DISP_DATA(I); 115 3 DISP_BUFF(I)=DEC_TBL(DATA); 116 3 END; 117 2 VALUE=DEC_TBL(DISP_DATA(4)); 118 2 DISP_BUFF(4)=SHR(VALUE,4); 119 2 DISP_BUFF(0)=(DISP_BUFF(0)) OR (ROR(VALUE,1) AND 80H); 120 2 DISP_BUFF(1)=(DISP_BUFF(1)) OR (ROR(VALUE,3) AND 80H); 121 2 DISP_BUFF(2)=(DISP_BUFF(2)) OR (ROR(VALUE,2) AND 80H); 122 2 DISP_BUFF(3)=(DISP_BUFF(3)) OR (ROR(VALUE,4) AND 80H); 123 3 IF CURSOR<>0 THEN DO; 125 4 IF (FLASH_CNT AND 1)=0 THEN DO; 127 4 IF CURSOR<>1 THEN DISP_BUFF(5-CURSOR)= 128 4 (DISP_BUFF(5-CURSOR) AND 80H); 129 5 ELSE DO; 130 5 DISP_BUFF(0)=(DISP_BUFF(0) AND 7FH); 131 5 DISP_BUFF(1)=(DISP_BUFF(1) AND 7FH); 132 5 DISP_BUFF(2)=(DISP_BUFF(2) AND 7FH); 133 5 DISP_BUFF(3)=(DISP_BUFF(3) AND 7FH); 134 5 DISP_BUFF(4)=0; 135 5 END; 136 4 END; 137 3 END; 138 3 ELSE IF ((FAULT<>0) AND ((FLASH_CNT AND 1)=0)) THEN DO; 140 3 DISP_BUFF(0)=(DISP_BUFF(0) AND 80H); 141 3 DISP_BUFF(1)=(DISP_BUFF(1) AND 80H); 142 3 END; 143 1 END DISP_FORMAT; 144 2 RESET_STATS: PROCEDURE; 145 2 BD_COUNT_LOW=0; 146 2 BD_COUNT_HIGH=0; 147 1 END RESET_STATS; 148 2 KEY_MON: PROCEDURE; 149 2 KEY_EDGE=0; 150 3 IF KEY_DATA=0BH THEN DO; 152 3 IF CURSOR=5 THEN CURSOR=1; 154 3 ELSE CURSOR=CURSOR+1; 155 3 END; 156 3 ELSE IF KEY_DATA=0CH THEN DO; 158 3 IF CURSOR=1 THEN 159 3 COMMND=MODE; 160 3 ELSE IF MODE_BUFF=ERASE THEN 161 3 CALL RESET_STATS; 162 3 ELSE COMMND=TEST; 163 3 CURSOR=0; 164 3 END; 165 3 ELSE DO CASE CURSOR; 166 3 COMMND=REPEAT; /* CASE 0 */ 167 4 DO; /* CASE 1 */ 168 4 MODE_BUFF=KEY_DATA; 169 4 CURSOR=2; 170 4 END; 171 4 DO; /* CASE 2 */ 172 4 IF MODE_BUFF=5 THEN BOARD_BUFF= 173 4 ((KEY_DATA*10)+DISP_DATA(2)); 174 4 ELSE TEST_BUFF=((KEY_DATA*10)+DISP_DATA(2)); 175 4 CURSOR=3; 176 4 END; 177 4 DO; /* CASE 3 */ 178 4 IF MODE_BUFF=5 THEN BOARD_BUFF= 179 4 ((DISP_DATA(3)*10)+KEY_DATA); 180 4 ELSE TEST_BUFF=((DISP_DATA(3)*10)+KEY_DATA); 181 4 CURSOR=4; 182 4 END; 183 4 DO; /* CASE 4 */ 184 4 ERROR_CODE=(KEY_DATA*10)+DISP_DATA(0); 185 4 CURSOR=5; 186 4 END; 187 4 DO; /* CASE 5 */ 188 4 ERROR_CODE=(DISP_DATA(1)*10)+KEY_DATA; 189 4 CURSOR=1; 190 4 END; 191 3 END; 192 1 END KEY_MON; 193 2 BCD_CONVM: PROCEDURE (ITEM) WORD; 194 2 DCL (BCDN,ITEM,COUNT,ZERO) BYTE; 195 2 DCL (RESULT) WORD; 196 2 ZERO=0; 197 2 COUNT=SHR(ITEM,4); 198 2 BCDN=0; 199 3 DO WHILE COUNT<>0; 200 3 BCDN=BCDN+16H; 201 3 BCDN=DEC(BCDN); 202 3 COUNT=COUNT-1; 203 3 END; 204 2 COUNT=(ITEM AND 0FH)+ZERO; /* FORM BCD OF LSB */ 205 2 COUNT=DEC(COUNT); 206 2 BCDN=BCDN+COUNT; 207 2 BCDN=DEC(BCDN); 208 2 RESULT=(DOUBLE(BCDN AND 0FH)) OR (SHL(DOUBLE(BCDN AND 0F0H),4)); 209 2 RETURN RESULT; 210 1 END BCD_CONVM; 211 2 SND_MSG: PROCEDURE; 212 2 DCL (ASCII,NUM,I) BYTE; 213 2 CODE_PNTR=0; 214 2 NUM=0; 215 3 DO WHILE NUM<>0FFH; 216 3 NUM=CODE_DATA(CODE_PNTR); 217 4 IF NUM<>0FFH THEN DO; 219 4 IF CODE_PNTR<2 THEN 220 4 ASCII=SHR(NUM,4)+30H; 221 4 ELSE ASCII=HIGH(BCD_CONVM(NUM))+30H; 222 4 TI=0; 223 4 SBUF=ASCII; 224 5 DO WHILE TI=0; 225 5 END; 226 4 IF CODE_PNTR<2 THEN 227 4 ASCII=(NUM AND 0FH)+30H; 228 4 ELSE ASCII=LOW(BCD_CONVM(NUM))+30H; 229 4 TI=0; 230 4 SBUF=ASCII; 231 5 DO WHILE TI=0; 232 5 END; 233 4 IF ((CODE_PNTR=25) OR (CODE_PNTR=51) OR (CODE_PNTR=77)) THEN DO; 235 5 TI=0; 236 5 SBUF=0AH; 237 6 DO WHILE TI=0; 238 6 END; 239 5 TI=0; 240 5 SBUF=0DH; 241 6 DO WHILE TI=0; 242 6 END; 243 5 END; 244 5 ELSE IF (CODE_PNTR AND 1)<>0 THEN DO; 246 5 IF CODE_DATA(CODE_PNTR+1)<>0FFH THEN DO; 248 6 TI=0; 249 6 SBUF=','; 250 7 DO WHILE TI=0; 251 7 END; 252 6 END; 253 5 END; 254 4 END; 255 3 CODE_PNTR=CODE_PNTR+1; 256 3 END; 257 3 DO I=1 TO 8; 258 3 TI=0; 259 3 SBUF=0AH; 260 4 DO WHILE TI=0; 261 4 END; 262 3 TI=0; 263 3 SBUF=0DH; 264 4 DO WHILE TI=0; 265 4 END; 266 3 END; 267 1 END SND_MSG; 268 2 COMMAND: PROCEDURE; 269 3 DO CASE COMMND; 270 3 COMMND=0; /* CASE 0 */ 271 3 COMMND=0; /* CASE 1 */ 272 4 DO; /* CASE 2 */ 273 4 IF BOARD_BUFF=0 THEN 274 4 CALL BOARD_TEST(BOARD_BUFF); 275 5 ELSE DO; 276 5 FAULT=0; 277 6 IF MODE_BUFF=0 THEN DO; 279 7 DO WHILE((FAULT=0) AND (TEST_BUFF<7)); 280 7 CALL BOARD_TEST(BOARD_BUFF); 281 7 IF ERROR_CODE=99 THEN 282 7 TEST_BUFF=TEST_BUFF+1; 283 7 END; 284 7 IF FAULT=0 THEN DO; 286 7 TEST_BUFF=0; 287 7 ERROR_CODE=0; 288 7 EXP2_C=10H; 289 7 END; 290 6 END; 291 6 ELSE DO; 292 6 CODE_DATA(0)=BD_COUNT_HIGH; 293 6 CODE_DATA(1)=BD_COUNT_LOW; 294 6 CODE_DATA(2)=0FFH; 295 6 CODE_PNTR=2; 296 7 DO WHILE TEST_BUFF<>7; 297 7 CALL BOARD_TEST(BOARD_BUFF); 298 7 IF ERROR_CODE=99 THEN 299 7 TEST_BUFF=TEST_BUFF+1; 300 8 ELSE DO; 301 8 CODE_DATA(CODE_PNTR)= TEST_BUFF; 302 8 CODE_PNTR=CODE_PNTR+1; 303 8 CODE_DATA(CODE_PNTR)= ERROR_CODE; 304 8 CODE_PNTR=CODE_PNTR+1; 305 8 CODE_DATA(CODE_PNTR)=0FFH; 306 8 END; 307 7 END; 308 6 TEST_BUFF=0; 309 6 ERROR_CODE=0; 310 6 EXP2_C=10H; 311 6 CALL SND_MSG; 312 6 BD_COUNT_LOW=BD_COUNT_LOW+1; 313 6 BD_COUNT_LOW=DEC(BD_COUNT_LOW); 314 7 IF BD_COUNT_LOW=0 THEN DO; 316 7 BD_COUNT_HIGH=BD_COUNT_HIGH+1; 317 7 BD_COUNT_HIGH=DEC(BD_COUNT_HIGH); 318 7 END; 319 6 END; 320 5 END; 321 4 COMMND=0; 322 4 END; 323 4 DO; /* CASE 3 */ 324 4 ERROR_CODE=99; 325 4 CALL BOARD_TEST(BOARD_BUFF); 326 4 COMMND=0; 327 4 END; 328 3 END; 329 1 END COMMAND; /******************************************** * * * THIS IS THE REAL TIME CLOCK * * * ********************************************/ 330 2 TIMER_ZERO: PROCEDURE INTERRUPT 1 USING 1; 331 2 TH0=0CAH; 332 2 TL0=0FFH; /* SET TO 2 MSEC */ 333 2 TMR_CNT=TMR_CNT+1; 334 2 TICK_2MSEC=1; 335 2 IF MAIN_TIMER<>0 THEN MAIN_TIMER=MAIN_TIMER-1; 337 3 DISP: DO; 338 3 DCL (PNTR,MASK) BYTE; 339 3 MASK=SHL(1,(BIT_CNT AND 7)); 340 3 PNTR=SHR(BIT_CNT,3); 341 3 IF (DISP_BUFF(PNTR) AND MASK)<>0 THEN INT1=1; 343 3 ELSE INT1=0; 344 3 INT0=1; 345 3 IF BIT_CNT=75 THEN BIT_CNT=0; 347 3 ELSE BIT_CNT=BIT_CNT+1; 348 3 INT0=0; 349 4 IF BIT_CNT=0 THEN DO; 351 4 INT1=1; 352 4 INT0=1; 353 4 INT0=0; 354 4 FLASH_CNT=FLASH_CNT+1; 355 4 END; 356 2 END DISP; 357 3 KEY_IN: DO; 358 4 IF (TMR_CNT AND 7)=0 THEN DO; 360 4 DCL (MASK,KEY_NEW) BYTE; 361 4 MASK=0EFH; 362 5 DO WHILE MASK<>0FEH; 363 5 P1=(MASK OR 0FH); 364 5 KEY_NEW=P1; 365 6 IF (KEY_NEW AND 0FH)<>0FH THEN DO; 367 7 IF KEY_NEW<>KEY_LAST THEN DO; 369 7 KEY_LAST=KEY_NEW; 370 7 MASK=0FEH; 371 7 END; 372 7 ELSE DO; 373 8 IF KEY_NEW<>KEY_DEBN THEN DO; 375 8 KEY_DEBN=KEY_NEW; 376 8 CALL KEY_DECODE; 377 8 KEY_EDGE=1; 378 8 MASK=0FEH; 379 8 END; 380 7 END; 381 6 END; 382 6 ELSE DO; 383 6 MASK=ROL(MASK,1); 384 7 IF MASK=0FEH THEN DO; 386 7 IF KEY_LAST<>0FFH THEN KEY_LAST=0FFH; 388 7 ELSE KEY_DEBN=0FFH; 389 7 END; 390 6 END; 391 5 END; 392 4 END; 393 2 END KEY_IN; 394 3 IF BIT_CNT=0 THEN DO; 396 3 CALL DISP_MON; 397 3 CALL DISP_FORMAT; 398 3 END; 399 1 END TIMER_ZERO; /************************************ * * * THIS IS THE MAIN LOOP * * * ***********************************/ 400 2 INIT: DO; 401 2 DCL I BYTE; 402 2 P1=0FFH; 403 2 SCON=50H; /* USART */ 404 2 TH1=0F5H; 405 2 TL1=0F5H; 406 2 TMOD=20H; 407 2 TR0=1; 408 2 TR1=1; 409 2 IE=82H; 410 3 DO I=0 TO 9; 411 3 DISP_BUFF(I)=0; 412 3 END; 413 2 CURSOR=0; 414 2 KEY_DATA=0; 415 2 KEY_DEBN=0FFH; 416 2 KEY_LAST=0FFH; 417 2 COMMND=0; 418 2 FAULT=0; 419 2 ERROR_CODE=0; 420 2 TEST_BUFF=0; 421 2 BOARD_BUFF=1; 422 2 MODE_BUFF=1; 423 2 CALL RESET_STATS; 424 2 CALL WAITM(250); 425 2 EXP2_COM=82H; 426 2 EXP3_COM=82H; 427 2 EXP4_COM=8BH; 428 1 END INIT; 429 2 MAIN_LOOP: DO FOREVER; 430 2 IF KEY_EDGE<>0 THEN 431 2 CALL KEY_MON; 432 2 IF COMMND<>0 THEN 433 2 CALL COMMAND; 434 1 END MAIN_LOOP; 435 1 END TSTR_MAIN; WARNINGS: 1 IS THE HIGHEST USED INTERRUPT MODULE INFORMATION: (STATIC+OVERLAYABLE) CODE SIZE = 06D4H 1748D CONSTANT SIZE = 001CH 28D DIRECT VARIABLE SIZE = 1FH+11H 31D+ 17D INDIRECT VARIABLE SIZE = 00H+00H 0D+ 0D BIT SIZE = 03H+00H 3D+ 0D BIT-ADDRESSABLE SIZE = 00H+00H 0D+ 0D AUXILIARY VARIABLE SIZE = 0000H 0D MAXIMUM STACK SIZE = 001BH 27D REGISTER-BANK(S) USED: 0 1 619 LINES READ 0 PROGRAM ERROR(S) END OF PL/M-51 COMPILATION