

                *****************************************
                *                                       *
                *  PRINTER PROGRAM FOR CROWE PRN FILES  *
                *  EXPANDS TAB WITH NO COL RESET ON LF  *
                *  PRN.COM  by Dennis E Baker   8/8/82  *
                *                                       *
                *****************************************
                
 0005 =         CPMENT   EQU   5         ;CP/M ENTRY POINT
 000B =         KBSTAT   EQU   11        ;KEYBOARD STATUS
 000F =         OPNFIL   EQU   15        ;OPEN FILE FUNCTION#
 0005 =         PRNCHR   EQU   5         ;PRINTER FUNCTION
 0014 =         RDSEQ    EQU   20        ;SEQUENTIAL READ FUNCTION
 001A =         SETDMA   EQU   26        ;SET ADDRESS FOR READ
 00FF =         T        EQU   255       ;TERMINATOR
                
 0100                    ORG   100H
                
 0100 210503    START:   LXI   H,FCB+12       ;INIT FILE CONTROL BLOCK
 0103 061C97             MVI   B,28! SUB A
 0106 7723      CLR1:    MOV   M,A! INX H     ;CLEAR REMAINDER
 0108 05C20601           DCR   B! JNZ CLR1
 010C CD4D02             CALL  CLRBUF         ;RESET BUFFER TO SPACES
 010F 3E09               MVI   A,9
 0111 326D02             STA   IGNOR
 0114 3A8300FE3A         LDA   83H! CPI ':'   ;TEST DRIVE SPEC
 0119 118200C231         LXI   D,82H! JNZ NAME
 011F 3A8200E65F         LDA   82H! ANI 5FH   ;GET DRIVE SPEC UPPER CASE
 0124 FE41F8             CPI   'A'! RM        ;A-D OK
 0127 FE45F0             CPI   'E'! RP
 012A D64032F902         SUI   64! STA FCB    ;SET DRIVE
 012F 1313               INX   D! INX D
 0131 060821FA02NAME:    MVI   B,8! LXI H,FCB+1
 0136 1AB7      NMLP:    LDAX  D! ORA A
 0138 CA4201             JZ    OPEN
 013B 77                 MOV   M,A
 013C 1323               INX   D! INX H
 013E 05C23601           DCR   B! JNZ NMLP
 0142 11F902    OPEN:    LXI   D,FCB
 0145 0E0F               MVI   C,OPNFIL
 0147 CD0500             CALL  CPMENT         ;OPEN THE FILE
 014A FEFFC8             CPI   T! RZ
 014D 3A0803             LDA   FCB+15         ;NO. OF BLOCKS
 0150 B7C8               ORA   A! RZ
 0152 326B02             STA   SECT           ;SAVE
 0155 3E40      PLOOP:   MVI   A,64           ;64*128 = 8K BUFFER
 0157 326C02             STA   CNTR
 015A 3A6B02             LDA   SECT
 015D FE09F26C01         CPI   9! JP OVER
 0162 A717               ANA   A! RAL         ;X8
 0164 1717               RAL!  RAL
 0166 326C02             STA   CNTR
 0169 C37701             JMP   PRINT
 016C D608326B02OVER:    SUI   8! STA SECT    ;ADJUST
 0171 CD7701             CALL  PRINT
 0174 C35501             JMP   PLOOP
                
 0177 212103    PRINT:   LXI   H,BUFFER       ;READ & PRINT BUFFER
 017A 226F02             SHLD  PNTR
 017D 2A6F02EB  RDLOOP:  LHLD  PNTR! XCHG     ;GET 128 BLOCK
 0181 21800019           LXI   H,128! DAD D
 0185 226F02             SHLD  PNTR
 0188 0E1A               MVI   C,SETDMA       ;SET ADDRESS
 018A CD0500             CALL  CPMENT
 018D 11F902             LXI   D,FCB          ;NOW READ SEQUENTIAL
 0190 0E14               MVI   C,RDSEQ
 0192 CD0500             CALL  CPMENT
 0195 216C0235           LXI   H,CNTR! DCR M  ;CNTR-1
 0199 C27D01             JNZ   RDLOOP
 019C 212103             LXI   H,BUFFER       ;SET FOR PRINTOUT
 019F 226F02             SHLD  PNTR
 01A2 210020             LXI   H,8192         ;BUFFER LENGTH
 01A5 227102    PRLOOP:  SHLD  BUFCNT         ;SET COUNTER
 01A8 7CB5C8             MOV   A,H! ORA L! RZ
 01AB 2A6F02             LHLD  PNTR
 01AE 7E23               MOV   A,M! INX H
 01B0 226F02             SHLD  PNTR
 01B3 FE0DCAED01         CPI   13! JZ CR      ;CAR RET
 01B8 FE09CAE001         CPI   9!  JZ TAB     ;TAB
 01BD FE0ACAF401         CPI   10! JZ LF      ;LINE FEED
 01C2 FE0CCAD901         CPI   12! JZ CHRBAK  ;FORM FEED
 01C7 FE1ACAFA01         CPI   26! JZ ENDOUT  ;END ON 26
 01CC 47                 MOV   B,A            ;SAVE
 01CD 216E02             LXI   H,TABCNT
 01D0 5E34               MOV   E,M! INR M
 01D2 1600               MVI   D,0
 01D4 217502             LXI   H,PBUFER
 01D7 1970               DAD   D! MOV M,B     ;PLACE CHARACTER
 01D9 2A71022B  CHRBAK:  LHLD  BUFCNT! DCX H  ;CNTR-1
 01DD C3A501             JMP   PRLOOP
                
 01E0 216E0234  TAB:     LXI   H,TABCNT! INR M
 01E4 7EE607             MOV   A,M! ANI 7     ;TEST TAB END
 01E7 C2E001             JNZ   TAB
 01EA C3D901             JMP   CHRBAK
                
 01ED 97326E02  CR:      SUB   A! STA TABCNT  ;CARR RETURN
 01F1 C3D901             JMP   CHRBAK
                
 01F4 CD0002    LF:      CALL  PRNTBF         ;LINE FEED
 01F7 C3D901             JMP   CHRBAK
                
 01FA CD0002    ENDOUT:  CALL  PRNTBF
 01FD C30000             JMP   0
                
 0200 3A6D02    PRNTBF:  LDA   IGNOR
 0203 B7                 ORA   A
 0204 CA0C02             JZ    CONT
 0207 3D                 DCR   A
 0208 326D02             STA   IGNOR
 020B C9                 RET
                
 020C 21F702    CONT:    LXI   H,PBUFER+130   ;TERM & PRINT BUFFER
 020F 0683               MVI   B,131
 0211 7E2B      PRNT1:   MOV   A,M! DCX H
 0213 FE20C21C02         CPI   ' '! JNZ PRNT2
 0218 05C21102           DCR   B! JNZ PRNT1
 021C 232336FF  PRNT2:   INX   H! INX H! MVI M,T
 0220 3A7B02             LDA   PBUFER+6
 0223 FE5ACC5E02         CPI   'Z'! CZ CRLF   ;EXTRA LINE BEFORE CROWE HEADING
 0228 217502             LXI   H,PBUFER
 022B 227302             SHLD  PRPNTR
 022E 2A7302    LINLOP:  LHLD  PRPNTR         ;CHAR LOOP
 0231 7E23               MOV   A,M! INX H
 0233 227302             SHLD  PRPNTR
 0236 FEFFCA4102         CPI   T! JZ ENDLIN
 023B CD6502             CALL  CHROUT
 023E C32E02             JMP   LINLOP
 0241 CD5E02    ENDLIN:  CALL  CRLF
 0244 0E0B               MVI   C,KBSTAT       ;CHECK KEYBOARD
 0246 CD0500             CALL  CPMENT
 0249 3DCA0000           DCR   A! JZ  0       ;EXIT ON ANY KEY
 024D 21F802    CLRBUF:  LXI   H,PBUFER+131   ;CLEAR BUFFER
 0250 36FF2B             MVI   M,T! DCX H
 0253 06833E20           MVI   B,131! MVI A,' '
 0257 772B      CLR2:    MOV   M,A! DCX H
 0259 05C25702           DCR   B! JNZ CLR2
 025D C9                 RET
                
 025E 3E0D      CRLF:    MVI   A,13           ;CARR RET
 0260 CD6502             CALL  CHROUT
 0263 3E0A               MVI   A,10
 0265 5F        CHROUT:  MOV   E,A            ;CHARACTER OUT
 0266 0E05               MVI   C,PRNCHR
 0268 C30500             JMP   CPMENT
                
 026B 00        SECT:    DB    0              ;NUMBER OF SECTORS
 026C 00        CNTR:    DB    0              ;SECT COUNTER
 026D 00        IGNOR:   DB    0              ;IGNOR COUNTER
 026E 00        TABCNT:  DB    0              ;COL COUNTER
 026F 0000      PNTR:    DW    0              ;BUFF POINTER
 0271 0000      BUFCNT:  DW    0              ;BUFF CHAR COUNT
 0273 0000      PRPNTR:  DW    0              ;PRINTER COL POINTER
 0275           PBUFER:  DS    132            ;PRINTER BUFFER
 02F9 0020202020FCB:     DB    0,'        PRN'  ;FILE CONTROL BLOCK
 0305                    DS    28
 0321 00        BUFFER:  DB    0              ;START OF 4096 CHAR BUFF
 0322                    END
