TITLE PRINT SUBTTL Print an ascii file a specified number of times .Z80 WBOOT EQU 0 BDOS EQU 5 BEEP EQU 7 TAB EQU 9 CR EQU 0DH LF EQU 0AH FF EQU 0CH ESC EQU 27 CTRLC EQU "C"-40H CTRLZ EQU "Z"-40H TFCB EQU 5CH TFCB2 EQU TFCB+10H BLKRAT EQU 200H BEPRAT EQU 20 NBEEPS EQU 3 BEPSPD EQU 2520H PRINT: LD (CCPSP),SP LD SP,STACK CALL CLRSCR LD A,(TFCB+1) CP " " JR NZ,NOSTER LD DE,STXMSG CALL PRINT$ EXIT: LD SP,(CCPSP) RET NOSTER: CP "?" JR Z,NOTSPC LD HL,TFCB2+1 LD DE,NUMBUF+2 LD BC,8 LDIR LD A," " LD (DE),A JP ENDPRS NOTSPC: XOR A LD (NUMFLG),A INPFIL: LD DE,FILMSG CALL PRINT$ LD C,10 ;Input buffer LD DE,FILBUF CALL BDOS CALL CRLF LD HL,FILBUF+1 LD C,(HL) LD B,0 ADD HL,BC INC HL LD (HL),0 LD DE,FILBUF+2 LD HL,TFCB SCHNSP: LD A,(DE) CP " " JR NZ,TXTFND INC DE JR SCHNSP TXTFND: SUB "A"-1 LD B,A INC DE LD A,(DE) INC DE CP ":" LD A,B JR Z,DRVFND DEC DE DEC DE LD B,0 DRVFND: LD (HL),B LD B,8 ;Maximum number of bytes in file name NXTCR2: CALL DLMCHK JR C,NOTFND JR Z,DLMFND INC HL LD (HL),A INC DE DJNZ NXTCR2 FNDDLM: CALL DLMCHK JR C,NOTFND JR Z,GETTYP INC DE JR FNDDLM DLMFND: INC HL LD (HL)," " DJNZ DLMFND GETTYP: LD B,3 ;Maximum number of bytes in file type CP "." JR NZ,ENDTYP INC DE NXTCR4: CALL DLMCHK JR C,NOTFND JR Z,ENDTYP INC HL LD (HL),A INC DE DJNZ NXTCR4 JR ENDPRS ENDTYP: INC HL LD (HL)," " DJNZ ENDTYP ENDPRS: LD C,15 ;Open file LD DE,TFCB CALL BDOS INC A JR NZ,FILXIS NOTFND: LD DE,NFMSG FILERR: CALL PRINT$ JP INPFIL FILXIS: LD A,(NUMFLG) OR A JR NZ,SPECED NUMERR: LD DE,NUMMSG CALL PRINT$ LD C,10 ;Input buffer LD DE,NUMBUF CALL BDOS CALL CRLF LD HL,NUMBUF+1 LD C,(HL) LD B,0 ADD HL,BC INC HL LD (HL)," " SPECED: LD HL,NUMBUF+2 LD B,1 LD A,(HL) CP " " JR Z,ENDNUM DEC B NXTDGT: SUB "0" CP 10 JR C,GOODNM LD DE,IVNMSG CALL PRINT$ JR NUMERR GOODNM: LD C,A LD A,B AND 0F0H JR Z,NOTOVF LD DE,OVFMSG CALL PRINT$ JR NUMERR NOTOVF: LD A,B RLA RLA RLA RLA AND 0F0H OR C LD B,A INC HL LD A,(HL) CP " " JR Z,ENDNUM JR NXTDGT ENDNUM: LD A,B OR A JP Z,EXIT LD (NTIMES),A ASK?S: LD HL,SFFFLG LD DE,SFFMSG CALL YESNO LD DE,SDCMSG CALL YESNO LD DE,IFFMSG CALL YESNO CALL CLRSCR LD DE,PRTMSG CALL PRINT$ LD HL,TFCB LD A,(HL) OR A INC HL JR Z,NODRIV ADD A,"A"-1 PUSH HL CALL CONOUT LD A,":" CALL CONOUT POP HL NODRIV: LD B,8 NXTCRN: LD A,(HL) AND 7FH CP " " JR Z,ENDNAM ;End of name PUSH HL PUSH BC CALL CONOUT POP BC POP HL INC HL DJNZ NXTCRN ENDNAM: LD E,B LD D,0 ADD HL,DE PUSH HL LD A,(HL) AND 7FH CP " " JR Z,NOTYPE ;No filetype LD A,"." CALL CONOUT ;Output type LD B,3 POP HL PUSH HL NXTCR3: LD A,(HL) AND 7FH CP " " JR Z,NOTYPE ;End of type PUSH HL PUSH BC CALL CONOUT POP BC POP HL INC HL DJNZ NXTCR3 NOTYPE: CALL OUTNUM FILBEG: LD DE,ANKMSG CALL PRINT$ CALL BEGFIL NXTCHR: LD C,11 ;Console status CALL BDOS OR A JR Z,NOSTOP LD C,1 ;Console input CALL BDOS LD DE,SPMSG STOP: CALL PRINT$ LD DE,STPMSG CALL PRINT$ LD A,1 LD (BEPCNT),A DEC A BLINK: XOR 0FFH ;Complement A and set flags LD DE,PPFMSG JR Z,PPOFF LD DE,PPNMSG PPOFF: PUSH AF CALL PRINT$ LD HL,BEPCNT DEC (HL) JR NZ,NOBEEP LD (HL),BEPRAT LD A,BEEP CALL CONOUT NOBEEP: LD BC,BLKRAT STCHEK: PUSH BC LD C,11 ;Console status CALL BDOS POP BC OR A JR NZ,KEYPSD LD A,B OR C DEC BC JP NZ,STCHEK POP AF JR BLINK KEYPSD: POP AF OR A JR Z,PPOFF1 LD DE,PPFMSG CALL PRINT$ PPOFF1: LD C,1 ;Console input CALL BDOS AND 5FH ;Convert lowercase to uppercase CP "E" JR Z,BEXIT CP "B" JR Z,FILBEG LD DE,ANKMSG CALL PRINT$ NOSTOP: CALL GETCHR JR Z,ENDFIL AND 7FH PUSH AF LD HL,(PRTPOS) CP CR JR NZ,NOTCR LD HL,0 LD (PRTPOS),HL JR LSTOUT NOTCR: CP TAB JR NZ,INCPOS NXTSP: PUSH HL LD E," " LD C,5 ;List output CALL BDOS POP HL INC HL LD A,L AND 7 JR NZ,NXTSP LD (PRTPOS),HL JR PSTTAB INCPOS: CP " " JR C,LSTOUT INC HL LD (PRTPOS),HL LSTOUT: LD E,A LD C,5 ;List output CALL BDOS PSTTAB: POP AF CP FF JP NZ,NXTCHR LD A,(SFFFLG) OR A JP NZ,NXTCHR LD DE,FFMSG JP STOP ENDFIL: LD A,(IFFFLG) OR A JR NZ,NOFF LD E,FF LD C,5 ;List output CALL BDOS NOFF: LD A,(NTIMES) DEC A DAA JR NZ,NOTDON BEXIT: CALL CLRSCR LD B,NBEEPS-1 NXTBEP: PUSH BC LD A,BEEP CALL CONOUT POP BC LD DE,BEPSPD BEPDEL: LD A,D OR E DEC DE JR NZ,BEPDEL DJNZ NXTBEP LD A,BEEP CALL CONOUT JP EXIT NOTDON: LD (NTIMES),A CALL OUTNUM CALL BEGFIL LD A,(SDCFLG) OR A JP NZ,NXTCHR LD DE,EOFMSG JP STOP BEGFIL: LD HL,ENDSRC LD (SRCPOS),HL LD HL,0 LD (PRTPOS),HL LD E,CR LD C,5 ;List output CALL BDOS XOR A LD (TFCB+32),A LD A,(TFCB+12) OR A RET Z XOR A LD (TFCB+12),A LD C,15 ;Open file LD DE,TFCB JP BDOS OUTNUM: LD DE,NPMSG CALL PRINT$ LD A,(NTIMES) PUSH AF RRA RRA RRA RRA AND 0FH JR Z,LT10 ADD A,"0" CALL CONOUT LT10: POP AF AND 0FH ADD A,"0" CALL CONOUT LD DE,CPYMSG PRINT$: LD C,9 ;Print string JP BDOS CLRSCR: LD DE,CLRMSG JR PRINT$ CRLF: LD A,CR CALL CONOUT LD A,LF CONOUT: LD E,A LD C,2 ;Console output JP BDOS YESNO: PUSH HL CALL PRINT$ CALL CONIN POP HL CP CTRLC JP Z,EXIT CP ESC JR NZ,NOTESC POP AF CALL CLRSCR JP ASK?S NOTESC: AND 5FH SUB "Y" LD (HL),A LD A,"Y" JR Z,YES LD A,"N" YES: PUSH HL CALL CONOUT CALL CRLF POP HL INC HL RET CONIN: LD HL,(WBOOT+1) LD DE,6 ADD HL,DE JP (HL) DLMCHK: LD A,(DE) OR A RET Z CP "." RET Z CP " " RET GETCHR: LD HL,(SRCPOS) LD DE,ENDSRC OR A SBC HL,DE CALL Z,READNR RET Z LD HL,(SRCPOS) LD A,(HL) CP CTRLZ RET Z INC HL LD (SRCPOS),HL RET READNR: LD DE,RDBUFF LD C,26 ;Set DMA address CALL BDOS LD DE,TFCB LD C,20 ;Read sequential CALL BDOS OR A JR NZ,RET0 INC A LD HL,RDBUFF LD (SRCPOS),HL RET RET0: XOR A RET CLRMSG: DEFB ESC,"*",0,0,0,0,0,0,"$" STXMSG: DEFB " PRINT program",CR,LF DEFB " syntax definition",CR,LF DEFB " (print multiple copies of a file)",CR,LF,LF DEFB "The correct syntax for this command is:",CR,LF DEFB LF," PRINT []",CR,LF,LF DEFB "Example: PRINT d:xxxxxxxx.yyy nn",CR,LF DEFB " ^ ^ ^ ^",CR,LF DEFB " drive filename type # of copies",CR,LF,LF DEFB "If the drive name is not specified the current drive is assumed.",CR,LF DEFB "If the is not specified 1 is assumed.",CR,LF DEFB "If the command PRINT * is entered,",CR,LF DEFB " you will be prompted for the above parameters.",LF,"$" FILMSG: DEFB "Name of file to print?$" NFMSG: DEFB "File not found",CR,LF,"$" NUMMSG: DEFB "Number of copies?$" IVNMSG: DEFB "Illegal character found in number",CR,LF,"$" OVFMSG: DEFB "Number too large",CR,LF,"$" SFFMSG: DEFB "Do you want to pause after every form feed?$" SDCMSG: DEFB "Do you want to pause between copies?$" IFFMSG: DEFB "Do you want a form feed inserted between copies?$" PRTMSG: DEFB ESC,"=""=COPIES LEFT TO PRINT:" DEFB ESC,"= =PRINTING FILE: $" NPMSG: DEFB ESC,"=""T$" CPYMSG: DEFB " ",ESC,"=+ $" ANKMSG: DEFB ESC,"=* ",ESC,"Y",0,0,0,0,0,0,0 DEFB "Press any key to stop print" DEFB CR,LF,"$" SPMSG: DEFB ESC,"=* ",ESC,"T$" FFMSG: DEFB ESC,"=* ",ESC,"TForm feed encountered in file$" EOFMSG: DEFB ESC,"=* ",ESC,"TEnd of copy encountered$" STPMSG: DEFB ESC,"=+ Type B to CONTINUE FROM BEGINNING of file" DEFB CR,LF,"Type E to EXIT back to CP/M" DEFB CR,LF,LF,"Press ANY other KEY to RESUME PRINTING$" PPFMSG: DEFB ESC,"= a",ESC,"T",ESC,"=/ $" PPNMSG: DEFB ESC,"= aPrint paused",ESC,"=/ $" NUMFLG: DEFB 1 NUMBUF: DEFB 9 DEFS 11 FILBUF: DEFB 20 END: DEFS 22 CCPSP: DEFS 2 PRTPOS: DEFS 2 SFFFLG: DEFS 1 SDCFLG: DEFS 1 IFFFLG: DEFS 1 NTIMES: DEFS 1 BEPCNT: DEFS 1 RDBUFF: DEFS 80H ENDSRC: SRCPOS: DEFS 2 DEFS 30H STACK: ORG END END PRINT