home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug034.arc / PRINTPRN.ASM < prev    next >
Assembly Source File  |  1979-12-31  |  5KB  |  159 lines

  1. *****************************************
  2. *                                       *
  3. *  PRINTER PROGRAM FOR CROWE PRN FILES  *
  4. *  EXPANDS TAB WITH NO COL RESET ON LF  *
  5. *  PRN.COM  by Dennis E Baker   8/8/82  *
  6. *                                       *
  7. *****************************************
  8.  
  9. CPMENT   EQU   5         ;CP/M ENTRY POINT
  10. KBSTAT   EQU   11        ;KEYBOARD STATUS
  11. OPNFIL   EQU   15        ;OPEN FILE FUNCTION#
  12. PRNCHR   EQU   5         ;PRINTER FUNCTION
  13. RDSEQ    EQU   20        ;SEQUENTIAL READ FUNCTION
  14. SETDMA   EQU   26        ;SET ADDRESS FOR READ
  15. T        EQU   255       ;TERMINATOR
  16.  
  17.          ORG   100H
  18.  
  19. START:   LXI   H,FCB+12       ;INIT FILE CONTROL BLOCK
  20.          MVI   B,28! SUB A
  21. CLR1:    MOV   M,A! INX H     ;CLEAR REMAINDER
  22.          DCR   B! JNZ CLR1
  23.          CALL  CLRBUF         ;RESET BUFFER TO SPACES
  24.          MVI   A,9
  25.          STA   IGNOR
  26.          LDA   83H! CPI ':'   ;TEST DRIVE SPEC
  27.          LXI   D,82H! JNZ NAME
  28.          LDA   82H! ANI 5FH   ;GET DRIVE SPEC UPPER CASE
  29.          CPI   'A'! RM        ;A-D OK
  30.          CPI   'E'! RP
  31.          SUI   64! STA FCB    ;SET DRIVE
  32.          INX   D! INX D
  33. NAME:    MVI   B,8! LXI H,FCB+1
  34. NMLP:    LDAX  D! ORA A
  35.          JZ    OPEN
  36.          MOV   M,A
  37.          INX   D! INX H
  38.          DCR   B! JNZ NMLP
  39. OPEN:    LXI   D,FCB
  40.          MVI   C,OPNFIL
  41.          CALL  CPMENT         ;OPEN THE FILE
  42.          CPI   T! RZ
  43.          LDA   FCB+15         ;NO. OF BLOCKS
  44.          ORA   A! RZ
  45.          STA   SECT           ;SAVE
  46. PLOOP:   MVI   A,64           ;64*128 = 8K BUFFER
  47.          STA   CNTR
  48.          LDA   SECT
  49.          CPI   9! JP OVER
  50.          ANA   A! RAL         ;X8
  51.          RAL!  RAL
  52.          STA   CNTR
  53.          JMP   PRINT
  54. OVER:    SUI   8! STA SECT    ;ADJUST
  55.          CALL  PRINT
  56.          JMP   PLOOP
  57.  
  58. PRINT:   LXI   H,BUFFER       ;READ & PRINT BUFFER
  59.          SHLD  PNTR
  60. RDLOOP:  LHLD  PNTR! XCHG     ;GET 128 BLOCK
  61.          LXI   H,128! DAD D
  62.          SHLD  PNTR
  63.          MVI   C,SETDMA       ;SET ADDRESS
  64.          CALL  CPMENT
  65.          LXI   D,FCB          ;NOW READ SEQUENTIAL
  66.          MVI   C,RDSEQ
  67.          CALL  CPMENT
  68.          LXI   H,CNTR! DCR M  ;CNTR-1
  69.          JNZ   RDLOOP
  70.          LXI   H,BUFFER       ;SET FOR PRINTOUT
  71.          SHLD  PNTR
  72.          LXI   H,8192         ;BUFFER LENGTH
  73. PRLOOP:  SHLD  BUFCNT         ;SET COUNTER
  74.          MOV   A,H! ORA L! RZ
  75.          LHLD  PNTR
  76.          MOV   A,M! INX H
  77.          SHLD  PNTR
  78.          CPI   13! JZ CR      ;CAR RET
  79.          CPI   9!  JZ TAB     ;TAB
  80.          CPI   10! JZ LF      ;LINE FEED
  81.          CPI   12! JZ CHRBAK  ;FORM FEED
  82.          CPI   26! JZ ENDOUT  ;END ON 26
  83.          MOV   B,A            ;SAVE
  84.          LXI   H,TABCNT
  85.          MOV   E,M! INR M
  86.          MVI   D,0
  87.          LXI   H,PBUFER
  88.          DAD   D! MOV M,B     ;PLACE CHARACTER
  89. CHRBAK:  LHLD  BUFCNT! DCX H  ;CNTR-1
  90.          JMP   PRLOOP
  91.  
  92. TAB:     LXI   H,TABCNT! INR M
  93.          MOV   A,M! ANI 7     ;TEST TAB END
  94.          JNZ   TAB
  95.          JMP   CHRBAK
  96.  
  97. CR:      SUB   A! STA TABCNT  ;CARR RETURN
  98.          JMP   CHRBAK
  99.  
  100. LF:      CALL  PRNTBF         ;LINE FEED
  101.          JMP   CHRBAK
  102.  
  103. ENDOUT:  CALL  PRNTBF
  104.          JMP   0
  105.  
  106. PRNTBF:  LDA   IGNOR
  107.          ORA   A
  108.          JZ    CONT
  109.          DCR   A
  110.          STA   IGNOR
  111.          RET
  112.  
  113. CONT:    LXI   H,PBUFER+130   ;TERM & PRINT BUFFER
  114.          MVI   B,131
  115. PRNT1:   MOV   A,M! DCX H
  116.          CPI   ' '! JNZ PRNT2
  117.          DCR   B! JNZ PRNT1
  118. PRNT2:   INX   H! INX H! MVI M,T
  119.          LDA   PBUFER+6
  120.          CPI   'Z'! CZ CRLF   ;EXTRA LINE BEFORE CROWE HEADING
  121.          LXI   H,PBUFER
  122.          SHLD  PRPNTR
  123. LINLOP:  LHLD  PRPNTR         ;CHAR LOOP
  124.          MOV   A,M! INX H
  125.          SHLD  PRPNTR
  126.          CPI   T! JZ ENDLIN
  127.          CALL  CHROUT
  128.          JMP   LINLOP
  129. ENDLIN:  CALL  CRLF
  130.          MVI   C,KBSTAT       ;CHECK KEYBOARD
  131.          CALL  CPMENT
  132.          DCR   A! JZ  0       ;EXIT ON ANY KEY
  133. CLRBUF:  LXI   H,PBUFER+131   ;CLEAR BUFFER
  134.          MVI   M,T! DCX H
  135.          MVI   B,131! MVI A,' '
  136. CLR2:    MOV   M,A! DCX H
  137.          DCR   B! JNZ CLR2
  138.          RET
  139.  
  140. CRLF:    MVI   A,13           ;CARR RET
  141.          CALL  CHROUT
  142.          MVI   A,10
  143. CHROUT:  MOV   E,A            ;CHARACTER OUT
  144.          MVI   C,PRNCHR
  145.          JMP   CPMENT
  146.  
  147. SECT:    DB    0              ;NUMBER OF SECTORS
  148. CNTR:    DB    0              ;SECT COUNTER
  149. IGNOR:   DB    0              ;IGNOR COUNTER
  150. TABCNT:  DB    0              ;COL COUNTER
  151. PNTR:    DW    0              ;BUFF POINTER
  152. BUFCNT:  DW    0              ;BUFF CHAR COUNT
  153. PRPNTR:  DW    0              ;PRINTER COL POINTER
  154. PBUFER:  DS    132            ;PRINTER BUFFER
  155. FCB:     DB    0,'        PRN'  ;FILE CONTROL BLOCK
  156.          DS    28
  157. BUFFER:  DB    0              ;START OF 4096 CHAR BUFF
  158.          END
  159.