; ;TEST PROGRAM FOR CRT, CENTRONICS AND RS 232C ASYNCHRONOUS PRINTERS ;WRITTEN IN AUGUST, 83 ; TPA EQU 100H BDOS EQU 05H CONIO EQU 06H PRINT EQU 09H PUNCH EQU 04H LIST EQU 05H CONSOLE EQU 06H TIB EQU 080H ;TERMINAL INPUT BUFFER COUNT EQU 06DH CR EQU 0DH LF EQU 0AH TAB EQU 09H ; ORG TPA ; JMP START HEADER: DB ' TEST PROGRAM FOR PRINTERS' DB CR,LF,'GENERATES BARBER-POLE PATTERN ON THE SPECIFIED DEVICE',01AH ; START: LDA TIB ;GET THE LENGTH OF THE INPUT BUFFER CPI 02 ; IF < 2, THEN DEVICE NOT SPECIFIED JC ERR1 MVI C,1 LDA TIB+2 ;GET ONE BYTE DEVICE CODE CPI 'T' ;CRT SPECIFIED ? JZ BPOLE INR C CPI 'R' ;RS 232C PRINTER SPECIFIED ? JZ BPOLE INR C CPI 'C' ;CENTRONICS PRINTER SPECIFIED ? JZ BPOLE LXI D,MSG2 ;PRINT ERROR MESSAGE MVI C,PRINT CALL BDOS PRTERR: LXI D,MSG MVI C,PRINT CALL BDOS RET ;RETURN TO CP/M ERR1: LXI D,MSG1 MVI C,PRINT CALL BDOS JMP PRTERR EXIT: MVI C,0 ;RETURN TO CP/M JMP BDOS ; ; BPOLE: MOV A,C STA PORT ;SAVE PORT NO. MVI A,CR ;SEND CR AND LF CALL TESTOUT MVI A,LF CALL TESTOUT LDA COUNT ;GET THE NO. OF LINES TO BE PRINTED CPI 'A' JZ INIT ;IF 'A' SPECIFIED, JUMP ANI 0FH JNZ STORE MVI A,1 ;IF NOT SPECIFIED, PUT 1 AT COUNT STORE: STA COUNT INIT: MVI A,20H ;INIT. BARBER POLE TEST STA BGNCHAR ; A=CHAR. TO PRINT PRNTLP: MVI A,05FH MOV B,A ; B=NO. OF CHAR. BEFORE CR/LF LDA BGNCHAR ;GET CHAR. TO START WITH OUTLP: CALL TESTOUT ;OUTPUT THE CHAR. DCR B ;ADJUST CHAR. COUNT JZ SHIFT ;IF END, CHANGE START FOR NEXT LINE INR A ;ELSE NEXT CHAR. JP OUTLP ;SEND NEXT CHAR. MVI A,20H ;JUMP OVER CONTROL CODES JMP OUTLP ;THEN CONTINUE SENDING SHIFT: MVI A,CR ;SEND OUT CR AND LF CALL TESTOUT MVI A,LF CALL TESTOUT CALL KEYSTAT ;SEE IF A KEY HAS BEEN TYPED RNZ ;IF SO, END THE TEST LDA BGNCHAR ;CHANGE STARTING CHAR. INR A JM INIT ;IF 80H, THEN RESTART STA BGNCHAR LDA COUNT ;GET THE LINE COUNT CPI 'A' JZ NEXTLN ;'A' SPECIFIED, PRINT LINES UNTIL A KEY IS DEPRESSED DCR A ;OTHERWISE DECREMENT LINE COUNT JZ EXIT ;IF LINE COUNT=0, THEN RETURN TO CP/M STA COUNT 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 ; TESTOUT:PUSH PSW PUSH B MOV E,A LDA PORT ;GET PORT TO TEST CPI 1 ;PORT 1 ? JNZ PORT2 CALL CONOUT ;YES. CALL CRT OUTPUT HANDLER JMP EXITOUT PORT2: CPI 2 ;PORT 2 ? JNZ CENT CALL SEROUT ;YES. THEN CALL RS232C OUTPUT HANDLER JMP EXITOUT CENT: CALL CENTOUT ;PORT 3, SO CALL CENTRONICS OUTPUT HANDLER EXITOUT:POP B POP PSW RET ;RETURN TO CALLER ; CONOUT: ;OUTPUT TO CONSOLE (CRT) MVI C,CONSOLE JMP BDOS ; CENTOUT: ;OUTPUT TO CENTRONICS PRINTER MVI C,PUNCH JMP BDOS ; SEROUT: ;OUTPUT RS 232C PRINTER MVI C,LIST JMP BDOS ; KEYSTAT:MVI E,0FFH ;CHECK KEY STATUS MVI C,CONIO CALL BDOS ORA A RET ; ;ERROR MESSAGES ; MSG1: DB CR,LF,TAB,'DEVICE NOT SPECIFIED$' MSG2: DB CR,LF,TAB,'ILLEGAL DEVICE SPECIFIED$' MSG: DB CR,LF,LF,TAB,'VALID DEVICES ARE: ' DB CR,LF,TAB,' C = CENTRONICS PRINTER ' DB CR,LF,TAB,' R = RS 232C ASYNCHRONOUS PRINTER ' DB CR,LF,TAB,' T = CONSOLE ' DB CR,LF,LF,TAB,'IF DESIRED, LINE COUNT(1-9) CAN BE ENTERED' DB CR,LF,TAB,'AS A SECOND PARAMETER.' DB CR,LF,TAB,'EXAMPLE: BP R 3' DB CR,LF,TAB,'THE ABOVE COMMAND WILL SEND 3 LINES TO SERIAL PORT.' DB CR,LF,LF,TAB,'TRY AGAIN$' ; ;DATA AREA ; PORT: DS 1 BGNCHAR:DS 1 ; END