RBOOT EQU 0 BDOS EQU 5 FCB EQU 5CH FCBN EQU FCB+32 TYPE EQU FCB+9 QTY EQU FCB+17 INBUF EQU 80H ; READF EQU 1 TYPEF EQU 2 LISTF EQU 5 INTRF EQU 11 OPEN EQU 15 FIND EQU 17 READ EQU 20 ; RUB EQU 08H EOF EQU 1AH TAB EQU 9 FFEED EQU 0CH ; ORG 100H ; JMP START ; ;CONSOLE I/O VIA BDOS ; CI PUSH H PUSH D PUSH B MVI C,READF CALL BDOS POP B POP D POP H RET ; CO PUSH H PUSH D PUSH B MOV E,A MVI C,TYPEF CALL BDOS POP B POP D POP H RET ; LO PUSH H PUSH D PUSH B MOV E,A MVI C,LISTF CALL BDOS MVI C,INTRF CALL BDOS ANI 1 JZ LOX CALL CI CPI RUB JZ EXIT LOX POP B POP D POP H RET ; CCRLF MVI A,0DH CALL CO MVI A,0AH JMP CO ; LCRLF MVI A,0DH CALL LO MVI A,0AH JMP LO ; MSGXP POP H MSGX1 MOV A,M CPI 0 JZ MSGEX CALL CO INX H JMP MSGX1 MSGEX INX H PCHL ; ;PRINT UTILITY CONSOLE MESSAGE SUBS ; RDMSG CALL CCRLF CALL MSGXP DB 'READ DISK IN DRIVE, THEN CR' DB 0 RDMS1 CALL CI CPI 'X' JZ RBOOT CPI 0DH JNZ RDMS1 CALL CCRLF RET ; RDERR CALL CCRLF CALL MSGXP DB 'READ ERROR! ENTER X TO ABORT ' DB 0DH,0AH DB ' CR TO IGNORE ' DB 0 RDER1 CALL CI CPI 'X' JZ EXIT CPI 0DH RZ JMP RDER1 ; EXIT CALL MSGXP DB 0DH,0AH DB 'BACK TO CP/M?' DB 0 EXIT1 CALL CI CPI 0DH JZ RBOOT CPI 'X' JZ RBOOT JNZ EXIT1 ; START XRA A STA CONTD STA RELOD INR A STA COUNT LXI H,TYPE MOV A,M CPI ' ' JNZ STAR1 MVI M,'P' INX H MVI M,'R' INX H MVI M,'N' STAR1 LXI H,QTY MOV A,M CPI ' ' JZ PRNIN SUI 30H STA COUNT INX H MOV A,M CPI ' ' JZ PRNIN CALL MULTI MOV A,M SUI 30H ADD C STA COUNT INX H MOV A,M CPI ' ' JZ PRNIN CALL MULTI MOV A,M SUI 30H ADD C STA COUNT ; ;INPUT THE PRINT FILE ; PRNIN CALL CCRLF CALL MSGXP DB 'CP/M PRINT UTILITY V80.0' DB 0DH,0AH DB 0 CALL RDMSG LXI D,FCB MVI C,FIND CALL BDOS CPI 255 JNZ PRNI1 CALL CCRLF CALL MSGXP DB 'FILE DOES NOT EXIST!' DB 0 JMP EXIT PRNI1 LXI H,0 SHLD DSAVE LXI H,BUFFR SHLD HSAVE LXI D,FCB MVI C,OPEN CALL BDOS CPI 255 JNZ PRNI2 CALL CCRLF DB 'UNABLE TO OPEN FILE! ' DB 0 JMP EXIT PRNI2 LXI D,FCB MVI C,READ CALL BDOS CPI 0 JZ PRNI3 CPI 1 JZ RDEND CALL RDERR PRNI3 LHLD HSAVE LXI D,INBUF MVI C,80H PRNI4 LDAX D MOV M,A INX H INX D DCR C JNZ PRNI4 SHLD HSAVE LDA 7 DCR A CMP H JNZ PRNI2 XRA A CMA STA CONTD STA RELOD JMP RDEN1 ; RDEND XRA A STA CONTD STA FCBN RDEN1 LHLD HSAVE MVI M,EOF ; ;PRINT THE FILE ; PRNOU LHLD DSAVE XCHG LXI H,BUFFR PRNO1 MOV A,M INX H CPI EOF JZ PRNEX CPI 0AH JZ PRNO1 CPI 0DH JZ NXTLN CPI TAB JZ TABBR CPI 1FH JC PRNO2 INR E PRNO2 CALL LO JMP PRNO1 NXTLN CALL LCRLF MVI E,0 INR D MOV A,D CPI 60 CZ FORMO JMP PRNO1 ; PRNEX XCHG SHLD DSAVE LDA CONTD ORA A JZ PRNE1 LXI H,BUFFR SHLD HSAVE JMP PRNI2 PRNE1 MVI A,FFEED CALL LO LXI H,0 SHLD DSAVE LDA COUNT DCR A STA COUNT JNZ PRNE2 CALL MSGXP DB 'ALL DONE! ' DB 0 JMP EXIT PRNE2 LDA RELOD ORA A JZ PRNOU XRA A STA RELOD JMP PRNI1 ; TABBR MOV A,E ANI 07 MOV C,A TABB1 MOV A,C ANI 8 JNZ PRNO1 MVI A,' ' CALL LO INR E INR C JMP TABB1 ; FORMO MVI A,FFEED CALL LO MVI D,0 RET ; MULTI LDA COUNT MOV C,A RLC RLC RLC ADD C ADD C MOV C,A RET ; ;RAM BUFFERS ; HSAVE DS 2 DSAVE DS 2 CONTD DS 1 RELOD DS 1 COUNT DS 1 BUFFR DS 1 ; END RBOOT EQU 0 BDOS EQU 5 FCB EQU 5CH FCBN EQU FCB+32 TYPE EQU FCB+9 QTY EQU FCB+17 INBUF EQU 80H ; ;BDOS FUNCTIONS ; READF EQU 1 TYPEF EQU 2 LISTF EQU 5 INTRF EQU 11 OPEN EQU 15 FIND EQU 17 READ EQU 20 ; ;CONTROL CHARACTERS ;