; ;TEST PROGRAM FOR CRT, CENTRONICS AND RS 232C ASYNCHRONOUS PRINTERS ;WRITTEN IN AUGUST, 83 ; 0100 = TPA EQU 100H 0005 = BDOS EQU 05H 0006 = CONIO EQU 06H 0009 = PRINT EQU 09H 0004 = PUNCH EQU 04H 0005 = LIST EQU 05H 0006 = CONSOLE EQU 06H 0080 = TIB EQU 080H ;TERMINAL INPUT BUFFER 006D = COUNT EQU 06DH 000D = CR EQU 0DH 000A = LF EQU 0AH 0009 = TAB EQU 09H ; 0100 ORG TPA ; 0100 C35601 JMP START 0103 2020544553HEADER: DB ' TEST PROGRAM FOR PRINTERS' 011E 0D0A47454E DB CR,LF,'GENERATES BARBER-POLE PATTERN ON THE SPECIFIED DEVICE',01AH ; 0156 3A8000 START: LDA TIB ;GET THE LENGTH OF THE INPUT BUFFER 0159 FE02 CPI 02 ; IF < 2, THEN DEVICE NOT SPECIFIED 015B DA8501 JC ERR1 015E 0E01 MVI C,1 0160 3A8200 LDA TIB+2 ;GET ONE BYTE DEVICE CODE 0163 FE54 CPI 'T' ;CRT SPECIFIED ? 0165 CA9501 JZ BPOLE 0168 0C INR C 0169 FE52 CPI 'R' ;RS 232C PRINTER SPECIFIED ? 016B CA9501 JZ BPOLE 016E 0C INR C 016F FE43 CPI 'C' ;CENTRONICS PRINTER SPECIFIED ? 0171 CA9501 JZ BPOLE 0174 114C02 LXI D,MSG2 ;PRINT ERROR MESSAGE 0177 0E09 MVI C,PRINT 0179 CD0500 CALL BDOS 017C 116802 PRTERR: LXI D,MSG 017F 0E09 MVI C,PRINT 0181 CD0500 CALL BDOS 0184 C9 RET ;RETURN TO CP/M 0185 113402 ERR1: LXI D,MSG1 0188 0E09 MVI C,PRINT 018A CD0500 CALL BDOS 018D C37C01 JMP PRTERR 0190 0E00 EXIT: MVI C,0 ;RETURN TO CP/M 0192 C30500 JMP BDOS ; ; 0195 79 BPOLE: MOV A,C 0196 326C03 STA PORT ;SAVE PORT NO. 0199 3E0D MVI A,CR ;SEND CR AND LF 019B CDFA01 CALL TESTOUT 019E 3E0A MVI A,LF 01A0 CDFA01 CALL TESTOUT 01A3 3A6D00 LDA COUNT ;GET THE NO. OF LINES TO BE PRINTED 01A6 FE41 CPI 'A' 01A8 CAB501 JZ INIT ;IF 'A' SPECIFIED, JUMP 01AB E60F ANI 0FH 01AD C2B201 JNZ STORE 01B0 3E01 MVI A,1 ;IF NOT SPECIFIED, PUT 1 AT COUNT 01B2 326D00 STORE: STA COUNT 01B5 3E20 INIT: MVI A,20H ;INIT. BARBER POLE TEST 01B7 326D03 STA BGNCHAR ; A=CHAR. TO PRINT 01BA 3E5F PRNTLP: MVI A,05FH 01BC 47 MOV B,A ; B=NO. OF CHAR. BEFORE CR/LF 01BD 3A6D03 LDA BGNCHAR ;GET CHAR. TO START WITH 01C0 CDFA01 OUTLP: CALL TESTOUT ;OUTPUT THE CHAR. 01C3 05 DCR B ;ADJUST CHAR. COUNT 01C4 CAD001 JZ SHIFT ;IF END, CHANGE START FOR NEXT LINE 01C7 3C INR A ;ELSE NEXT CHAR. 01C8 F2C001 JP OUTLP ;SEND NEXT CHAR. 01CB 3E20 MVI A,20H ;JUMP OVER CONTROL CODES 01CD C3C001 JMP OUTLP ;THEN CONTINUE SENDING 01D0 3E0D SHIFT: MVI A,CR ;SEND OUT CR AND LF 01D2 CDFA01 CALL TESTOUT 01D5 3E0A MVI A,LF 01D7 CDFA01 CALL TESTOUT 01DA CD2B02 CALL KEYSTAT ;SEE IF A KEY HAS BEEN TYPED 01DD C0 RNZ ;IF SO, END THE TEST 01DE 3A6D03 LDA BGNCHAR ;CHANGE STARTING CHAR. 01E1 3C INR A 01E2 FAB501 JM INIT ;IF 80H, THEN RESTART 01E5 326D03 STA BGNCHAR 01E8 3A6D00 LDA COUNT ;GET THE LINE COUNT 01EB FE41 CPI 'A' 01ED CAF701 JZ NEXTLN ;'A' SPECIFIED, PRINT LINES UNTIL A KEY IS DEPRESSED 01F0 3D DCR A ;OTHERWISE DECREMENT LINE COUNT 01F1 CA9001 JZ EXIT ;IF LINE COUNT=0, THEN RETURN TO CP/M 01F4 326D00 STA COUNT 01F7 C3BA01 NEXTLN: JMP PRNTLP ;THEN PRINT NEXT LINE ; ;OUTPUT A CHAR. TO A PORT (PORT SAVED IN MEMORY LOCATION 'PORT' ;ON ENTRY, A=CHAR. TO OUTPUT. THIS ROUTINE APPROP. OUTPUT HANDLER ; 01FA F5 TESTOUT:PUSH PSW 01FB C5 PUSH B 01FC 5F MOV E,A 01FD 3A6C03 LDA PORT ;GET PORT TO TEST 0200 FE01 CPI 1 ;PORT 1 ? 0202 C20B02 JNZ PORT2 0205 CD1C02 CALL CONOUT ;YES. CALL CRT OUTPUT HANDLER 0208 C31902 JMP EXITOUT 020B FE02 PORT2: CPI 2 ;PORT 2 ? 020D C21602 JNZ CENT 0210 CD2602 CALL SEROUT ;YES. THEN CALL RS232C OUTPUT HANDLER 0213 C31902 JMP EXITOUT 0216 CD2102 CENT: CALL CENTOUT ;PORT 3, SO CALL CENTRONICS OUTPUT HANDLER 0219 C1 EXITOUT:POP B 021A F1 POP PSW 021B C9 RET ;RETURN TO CALLER ; CONOUT: ;OUTPUT TO CONSOLE (CRT) 021C 0E06 MVI C,CONSOLE 021E C30500 JMP BDOS ; CENTOUT: ;OUTPUT TO CENTRONICS PRINTER 0221 0E04 MVI C,PUNCH 0223 C30500 JMP BDOS ; SEROUT: ;OUTPUT RS 232C PRINTER 0226 0E05 MVI C,LIST 0228 C30500 JMP BDOS ; 022B 1EFF KEYSTAT:MVI E,0FFH ;CHECK KEY STATUS 022D 0E06 MVI C,CONIO 022F CD0500 CALL BDOS 0232 B7 ORA A 0233 C9 RET ; ;ERROR MESSAGES ; 0234 0D0A094445MSG1: DB CR,LF,TAB,'DEVICE NOT SPECIFIED$' 024C 0D0A09494CMSG2: DB CR,LF,TAB,'ILLEGAL DEVICE SPECIFIED$' 0268 0D0A0A0956MSG: DB CR,LF,LF,TAB,'VALID DEVICES ARE: ' 027F 0D0A092043 DB CR,LF,TAB,' C = CENTRONICS PRINTER ' 029A 0D0A092052 DB CR,LF,TAB,' R = RS 232C ASYNCHRONOUS PRINTER ' 02BF 0D0A092054 DB CR,LF,TAB,' T = CONSOLE ' 02CF 0D0A0A0949 DB CR,LF,LF,TAB,'IF DESIRED, LINE COUNT(1-9) CAN BE ENTERED' 02FD 0D0A094153 DB CR,LF,TAB,'AS A SECOND PARAMETER.' 0316 0D0A094558 DB CR,LF,TAB,'EXAMPLE: BP R 3' 0328 0D0A095448 DB CR,LF,TAB,'THE ABOVE COMMAND WILL SEND 3 LINES TO SERIAL PORT.' 035E 0D0A0A0954 DB CR,LF,LF,TAB,'TRY AGAIN$' ; ;DATA AREA ; 036C PORT: DS 1 036D BGNCHAR:DS 1 ; 036E END