home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol146 / print10b.a86 < prev    next >
Encoding:
Text File  |  1984-04-29  |  13.8 KB  |  666 lines

  1.     TITLE    'PRINT version 1.0B utility for CP/M-86'
  2.  
  3. ; DATE  10/06/83 17:39   revised by H.M. Van Tassell to include
  4. ; revision 1.0B
  5. ; print the date in header and help messages
  6. ; changed default of Header & Page
  7. ; added fake form feed and always print header
  8. ;************************************************
  9. ;*                        *
  10. ;*        FILE PRINT UTILITY        *
  11. ;*                        *
  12. ;************************************************
  13. ;
  14. ;    By        Bill Bolton
  15. ;            Software Tools
  16. ;            P.O. Box 80
  17. ;            Newport Beach
  18. ;            NSW, 2016
  19. ;            AUSTRALIA
  20. ;
  21. ;    CP/M-86 History (most recent version at top)
  22. ;
  23. ;    Version    1.0    Adapted from PAGE utility
  24. ;            4/Mar/82
  25. ;
  26.     EJECT
  27.  
  28. ;************************************************
  29. ;*                        *
  30. ;*           MISCELLANEOUS EQUATES        *
  31. ;*                        *
  32. ;************************************************
  33. FALSE    EQU    0
  34. TRUE    EQU    NOT FALSE
  35.  
  36. CLOCK    EQU    TRUE            ;TRUE FOR SYSTEM CLOCK
  37.                     ;YOU MUST SUPPLY RDTIME ROUTINE
  38. TFCB    EQU    005CH            ;TRANSIENT PROGRAM FCB
  39. TBUF    EQU    0080H            ;TRANSIENT PROGRAM BUFFER 
  40. OPEN    EQU    15            ;OPEN FUNCTION CODE
  41. READ    EQU    20            ;READ FUNCTION CODE
  42. BS    EQU    08H            ;ASCII Back Space
  43. TAB    EQU    09H            ;ASCII TAB
  44. LF    EQU    0AH            ;ASCII Line Feed
  45. FORMF    EQU    0CH            ;ASCII Form Feed
  46. CR    EQU    0DH            ;ASCII Carriage Return
  47. SPACE    EQU    20H            ;ASCII Blank
  48. FILLER    EQU    00H            ;USED AS FF NULL
  49. PAGSZ    EQU    66            ;LINES/PAGE
  50. MAXLN    EQU    58            ;USABLE LINES/PAGE
  51. NULLS    EQU    1            ;NULLS AFTER A FORM FEED
  52. ODEV    EQU    5            ;CON:=2  LST:=5
  53. M    EQU    Byte Ptr 0[BX]        ;Handy for ASM86
  54.  
  55.     EJECT
  56.     CSEG
  57.     ORG    100H
  58.  
  59. ;************************************************
  60. ;*                        *    
  61. ;*    GET PARAMETERS FROM COMMAND LINE    *
  62. ;*                        *
  63. ;************************************************
  64.  
  65. PRINT:
  66. RDTIME:    ;PUT YOUR CLOCK ROUTINE HERE AND SET CLOCK EQUATE TRUE
  67.     IF    CLOCK            ;COMPUPRO CLOCK ROUTINE
  68. CLKCP    EQU    50H+10            ;CLOCK COMMAND PORT
  69.  
  70.     MOV    BX,OFFSET DATESTR     ;POINT TO DATE STRING
  71.      MOV    SI,OFFSET DIGTAB     ;POINT TO DIGIT TABLE
  72.     MOV    CL,6            ;READ TWO COUNTER
  73. RTWO:    MOV    CH,2            ;READ ONE COUNTER
  74. ;
  75. ; READ A DIGIT FROM CLOCK CHIP
  76. ; ENTRY: SI => DIGIT TABLE DATA ENTRY
  77. ;        BX => STRING POSITION
  78. ; EXIT:  ASCII DIGIT LOADED IN STRING
  79. ;        SI & BX INCREMENTED
  80. ;
  81. RONE:    MOV    AL,[SI]        ;GET DIGIT TABLE DATA
  82.     INC    SI        ;BUMP TO NEXT ENTRY
  83.     ADD    AL,10H        ;SET READ BIT
  84.     OUT    CLKCP,AL    ;OUTPUT DIGIT DATA
  85.     CMP    AL,15H        ;CHECK FOR HOURS 10 DIGIT
  86.     IN    AL,CLKCP+1    ;READ BCD DIGIT FROM CLOCK
  87.     JNE    NOHOUR
  88.     SUB    AL,8
  89. NOHOUR:    ADD    AL,'0'        ;MAKE ASCII
  90.     MOV    [BX],AL
  91.     INC    BX        ;POINT TO NEXT STR POSITION
  92.     DEC    CH
  93.     JNZ    RONE        ;GET SECOND DIGIT
  94.     INC    BX        ;BUMP OVER SEPERATOR
  95.     CMP    CL,4
  96.     JNE    NOBUMP
  97.     INC    BX        ;BIG BUMP OVER WHITE SPACE
  98. NOBUMP:    DEC    CL
  99.     JNZ    RTWO        ;READ TWO MORE DIGITS
  100.     JMPS    GOTOIT        ;GO TO IT
  101.  
  102. DIGTAB    DB    10,9,8,7,12,11,5,4,3,2,1,0 ;CLOCK DIGIT TABLE
  103.     ENDIF    ;CLOCK
  104.  
  105. GOTOIT:    MOV    BX,TBUF            ;POINT TO BUFFER
  106.     MOV    CH,M            ;GET COUNT OF CHARACTERS IN CMD
  107.     MOV    AL,M            ;GET COUNT AGAIN
  108.     OR    AL,AL            ;TEST FOR ZERO
  109.     JNZ    L_1    
  110.     JMP    PERR            ;YES, NO ARGUMENTS
  111. L_1:
  112.     INC    BX            ;SKIP COUNT
  113. SKP1:
  114.     MOV    AL,M            ;GET BYTE
  115.     CMP    AL,' '            ;SPACE?
  116.     JNZ    SKP2            ;NO
  117.     INC    BX            ;BUMP POINTER
  118.     DEC    CH            ;DECRMENT COUNT
  119.     JNZ    SKP1            ;SKIP TO FIRST NON-SPACE
  120.     JMPS    PERR            ;NO, NON SPACE AFTER FILE ID
  121. SKP2:
  122.     MOV    AL,M            ;GET CHAR
  123.     CMP    AL,' '            ;SPACE?
  124.     JZ    SKP3            ;YES
  125.     INC    BX            ;BUMP POINTER
  126.     DEC    CH            ;DECREMENT COUNT
  127.     JNZ    SKP2            ;SKIP TO SPACE
  128.     JMP    PEND            ;NO SPACE AFTER FILE ID
  129. SKP3:
  130.     MOV    AL,M            ;GET CHAR
  131.     CMP    AL,' '            ;TEST FOR NON,SPACE
  132.     JNZ    SKP4            ;FOUND ARGUMENTS
  133.     INC    BX            ;BUMP POINTER
  134.     DEC    CH            ;DECREMENT COUNT
  135.     JNZ    SKP3
  136.     JMP    PEND
  137. SKP4:
  138.     MOV    DX,(Offset PARMS)
  139. SKP4A:
  140.     MOV    AL,M
  141.     MOV    SI,DX
  142.     MOV    [SI],AL
  143.     INC    BX
  144.     INC    DX
  145.     DEC    CH
  146.     JNZ    SKP4A
  147.     MOV    AL,' '
  148.     MOV    SI,DX            ;INDICATE END OF PARMS
  149.     MOV    [SI],AL
  150.  
  151. ;************************************************
  152. ;*                        *
  153. ;*         PROCESS PARAMETERS            *
  154. ;*                        *
  155. ;************************************************
  156.  
  157. PPARM:
  158.     MOV    DX,(Offset PARMS)    ;POINT TO PARMS AREA
  159. PLP0:
  160.     MOV    BX,(Offset PTAB)    ;POINT TO PARM TABLE
  161.     MOV    CH,(Offset PTABS)    ;SIZE OF PARM TABLE
  162. PLP1:
  163.     MOV    SI,DX            ;GET PARM BYTE
  164.     MOV    AL,[SI]
  165.     CMP    AL,' '            ;END OF PARMS?
  166.     JZ    PEND            ;YES, DONE
  167.     CMP    AL,00            ;END OF PARMS?
  168.     JZ    PEND            ;YES, DONE
  169.     CMP    AL,M            ;COMPARE TO TABLE ENTRY
  170.     JZ    PFND            ;FOUND IT
  171.     INC    BX            ;BUMP PARM TABLE PTR
  172.     INC    BX
  173.     INC    BX
  174.     DEC    CH            ;DECREMENT COUNT
  175.     JNZ    PLP1            ;KEEP LOOKING
  176. PERR:
  177.     MOV    DX,(Offset PERMSG)    ;POINT TO PARM ERROR MSG
  178.     MOV    CL,09            ;WRITE MSG
  179.     INT    224
  180.     MOV    CL,0            ;EXIT
  181.     MOV    DL,0
  182.     INT    224
  183. PFND:
  184.     INC    BX            ;POINT TO ROUTINE ADDR
  185.     PUSH    DX            ;SAVE PARM POINTER
  186.     MOV    DL,M
  187.     INC    BX
  188.     MOV    DH,M            ;GET ROUTINE ADDR
  189.     MOV    BX,(Offset PRET)    ;RETURN ADDRESS
  190.     PUSH    BX            ;SIMULATE CALL
  191.     XCHG    BX,DX            ;GET ROUTINE ADDR
  192.     JMP    BX            ;EXIT TO PARM PROC. ROUTINE
  193. PRET:
  194.     POP    DX            ;GET PARM POINTER AGAIN
  195.     INC    DX            ;POINT TO NEXT ONE
  196.     JMPS    PLP0            ;CONTINUE
  197. ;
  198. ;************************************************
  199. ;*                        *
  200. ;*    PARAMETER PROCESSING ROUTINES        *
  201. ;*                        *
  202. ;************************************************
  203.  
  204. NPARM:
  205.     MOV    AL,0            ;RESET 'NO HEADING' SWITCH
  206.     MOV    Byte Ptr NSWT,AL
  207.     RET
  208. ;
  209. CPARM:
  210.     MOV    AL,0            ;RESET 'NO PAGINATION' SWITCH
  211.     MOV    Byte Ptr CSWT,AL
  212.     RET
  213.  
  214. ;************************************************
  215. ;*                        *
  216. ;*        OPEN FILE FOR INPUT        *
  217. ;*                        *
  218. ;************************************************
  219.  
  220. PEND:
  221.     MOV    DX,TFCB            ;POINT TO FCB
  222.     CALL    FOPEN            ;OPEN FILE
  223.     JNB    L_2    
  224.     JMP    ERR            ;IF ERROR, EXIT
  225. L_2:
  226.     CALL    HEAD            ;PRINT HEADING
  227.  
  228. ;****************************************
  229. ;*                    *
  230. ;*        MAIN PROCESSING LOOP    *
  231. ;*                    *
  232. ;****************************************
  233.  
  234. LOOP:
  235.     CALL    GETBT            ;GET A BYTE
  236.     JNB    L_3    
  237.     JMP    ERR            ;ERROR
  238. L_3:
  239.     CMP    AL,1AH            ;EOF?
  240.     JZ    DONE            ;YES
  241.     CMP    AL,CR            ;CR?
  242.     JZ    CRET            ;YES
  243.     CMP    AL,LF            ;LF?
  244.     JZ    LFEED            ;YES
  245.     CMP    AL,TAB            ;TAB?
  246.     JZ    TABMOV            ;YES
  247.     CMP    AL,FORMF        ;FORM FEED?
  248.     JZ    FFEED            ;YES
  249.     CMP    AL,BS            ;BACKSPACE
  250.     JZ    BSPACE            ;YES
  251.     CMP    AL,SPACE        ;ODD CONTROL CHR?
  252.     JB    LOOP            ;YES, IGNORE IT
  253.     CALL    PBYT            ;OTHERWISE PRINT IT
  254.     JMPS    LOOP            ;CONTINUE
  255.  
  256. ;************************************************
  257. ;*                        *
  258. ;*        FINAL PROCESSING        *
  259. ;*                        *
  260. ;************************************************
  261.  
  262. DONE:
  263.     CALL    TPAGE            ;MOVE TO TOP OF PAGE
  264.     MOV    CL,0            ;EXIT TO BDOS
  265.     MOV    DL,0
  266.     INT    224
  267.  
  268. ;************************************************
  269. ;*                        *
  270. ;*        PROCESS TABS            *
  271. ;*                        *
  272. ;************************************************
  273.  
  274. TABMOV:
  275.     MOV    BX,(Offset COL)        ;POINT TO COLUMN
  276. TBLP:
  277.     MOV    AL,SPACE        ;PRINT ONE SPACE
  278.     CALL    PBYT
  279.     MOV    AL,M            ;GET COLUMN
  280.     AND    AL,07H            ;MODULO 8
  281.     JNZ    TBLP            ;IF NOT AT TAB STOP, KEEP TYPING
  282.     JMPS    LOOP
  283.     CALL    PBYT            ;PRINT BYTE
  284.     JMPS    LOOP
  285.  
  286. ;************************************************
  287. ;*                        *
  288. ;*        PROCESS <CR>            *
  289. ;*                        *
  290. ;************************************************
  291.  
  292. CRET:
  293.     XOR    AL,AL
  294.     MOV    Byte Ptr COL,AL
  295.     MOV    AL,CR
  296.     CALL    PBYT            ;PRINT <CR>
  297.     JMPS    LOOP            ;CONTINUE IN MAIN LOOP
  298.  
  299. ;************************************************
  300. ;*                        *
  301. ;*        PROCESS <LF>            *
  302. ;*                        *
  303. ;************************************************
  304.  
  305. LFEED:
  306.     MOV    AL,Byte Ptr CSWT    ;GET PAGINATION SWITCH
  307.     OR    AL,AL            ;SEE IF 'NO PAGINATION'
  308.     JNZ    LFEED2            ;TRUE, SKIP PAGINATION TEST
  309.     MOV    AL,Byte Ptr LINE    ;GET LINE COUNT
  310.     CMP    AL,MAXLN        ;PAGE OVERFLOW?
  311.     JZ    FFEED            ;YES
  312. LFEED2:
  313.     MOV    AL,Byte Ptr LINE    ;GET LINE  COUNT
  314.     INC    AL            ;BUMP LINE COUNT
  315.     MOV    Byte Ptr LINE,AL
  316.     MOV    AL,LF
  317.     CALL    PBYT
  318.     JMP    LOOP
  319.  
  320. ;****************************************
  321. ;*                    *
  322. ;*        PROCESS <BS>        *
  323. ;*                    *
  324. ;****************************************
  325.  
  326. BSPACE:
  327.     MOV    AL,BS
  328.     CALL    PBYT
  329.     MOV    AL,Byte Ptr COL        ;GET COLUMN COUNTER
  330.     OR    AL,AL            ;IF ZERO, DONT DECREMENT IT
  331.     JNZ    L_4    
  332.     JMP    LOOP
  333. L_4:
  334.     DEC    AL
  335.     MOV    Byte Ptr COL,AL        ;DECREMENT COLUMN COUNT
  336.     JMP    LOOP
  337.  
  338. ;************************************************
  339. ;*                        *
  340. ;*        PROCESS FORM FEED        *
  341. ;*                        *
  342. ;************************************************
  343.  
  344. FFEED:
  345.     MOV    AL,CR
  346.     CALL    PBYT            ;PRINT CR
  347.     CALL    TPAGE            ;POSITION AT TOP OF PAGE
  348.     CALL    HEAD            ;PRINT HEADING
  349.     JMP    LOOP            ;CONTINUE IN MAIN LOOP
  350.  
  351. ;************************************************
  352. ;*                        *
  353. ;*        HEADING PRINT ROUTINE        *
  354. ;*                        *
  355. ;************************************************
  356.  
  357. HEAD:
  358.     MOV    AL,PAGE1        ;IF THIS PAGE 1
  359.     OR    AL,AL
  360.     JNZ    FPAGE1            ;ALWAYS PRINT FILE NAME & DATE
  361.     MOV    AL,Byte Ptr NSWT    ;NO HEADING SWITCH
  362.     OR    AL,AL            ;IF SET, NO HEADING
  363.     JNZ    HEADA
  364. FPAGE1:    MOV    BX,(Offset FMSG)    ;POINT TO MESSAGE
  365.     CALL    PSTRNG            ;PRINT STRING
  366.     MOV    BX,TFCB+1        ;POINT TO NAME
  367.     MOV    CH,8            ;SIZE OF NAME
  368.     CALL    PCNT            ;PRINT COUNT
  369.     MOV    AL,SPACE        ;PRINT A SPACE
  370.     CALL    PBYT
  371.     MOV    BX,TFCB+9        ;POINT TO TYPE
  372.     MOV    CH,03            ;SIZE OF TYPE
  373.     CALL    PCNT            ;PRINT COUNT
  374.     MOV    BX,(Offset PMSG)    ;POINT TO MESSAGE
  375.     CALL    PSTRNG            ;PRINT STRING
  376.  
  377.     MOV    AL,Byte Ptr NSWT    ;NO HEADING SWITCH
  378.     OR    AL,AL            ;IF SET, NO HEADING
  379.     JZ    HEAD1
  380.     MOV    AL,PAGE1        ;IF THIS PAGE 1
  381.     OR    AL,AL
  382.     JNZ    FPAGE2            ;DONT PRINT 'PAGE 001'
  383. HEAD1:
  384.     MOV    BX,(Offset PPMSG)    ;POINT TO PAGE MESSAGE
  385.     CALL    PSTRNG            ;PRINT STRING
  386.  
  387.     MOV    AL,Byte Ptr PAGEN    ;GET PAGE NUMBER
  388.     INC    AL            ;BUMP IT
  389.     MOV    Byte Ptr PAGEN,AL    ;SAVE IT
  390.     CALL    DEC            ;CONVERT TO DECIMAL
  391.     MOV    BX,(Offset DECWRK)    ;POINT TO DEC STRING
  392.     MOV    CH,3
  393.     CALL    PCNT            ;PRINT PAGE NUMBER
  394. FPAGE2:    MOV    PAGE1,0            ;SET PAGE1 FLAG FALSE
  395.     MOV    AL,CR            ;PRINT CR
  396.     CALL    PBYT
  397.     MOV    AL,LF
  398.     CALL    PBYT            ;PRINT LF
  399.     MOV    AL,LF
  400.     CALL    PBYT            ;AND SECOND
  401.     MOV    AL,LF
  402.     CALL    PBYT            ;AND A THIRD
  403.     MOV    AL,3            ;SET NUMBER OF LINES PRINTED
  404.     JMPS    HEADB
  405. HEADA:
  406.     XOR    AL,AL
  407. HEADB:
  408.     MOV    Byte Ptr LINE,AL    ;RESET LINE COUNT
  409.     XOR    AL,AL            ;RESET COLUMN
  410.     MOV    Byte Ptr COL,AL        ;RESET COLUMN
  411.     RET
  412.  
  413. ;************************************************
  414. ;*                        *
  415. ;*        CHARACTER PRINT ROUTINE        *
  416. ;*                        *
  417. ;************************************************
  418.  
  419. PBYT:
  420.     PUSH    BX
  421.     PUSH    CX
  422.     PUSH    AX
  423.     MOV    DL,AL
  424.     MOV    CL,ODEV
  425.     INT    224            ;PRINT
  426.     POP    AX
  427.     CMP    AL,SPACE        ;NON-PRINTING?
  428.     JB    PBY2            ;YES, DONT BUMP COL
  429.     MOV    BX,(Offset COL)        ;INCREMENT COLUMN
  430.     INC    M
  431. PBY2:
  432.     MOV    CL,11            ;GET CONSOLE STATUS
  433.     INT    224
  434.     CMP    AL,00            ;BREAK?
  435.     JZ    L_5    
  436.     MOV    CL,0            ;YES, DONE
  437.     MOV    DL,0
  438.     INT    224
  439. L_5:
  440.     POP    CX
  441.     POP    BX
  442.     RET
  443.  
  444. ;************************************************
  445. ;*                        *
  446. ;*        STRING PRINT ROUTINE        *
  447. ;*                        *
  448. ;************************************************
  449.  
  450. PSTRNG:
  451.     MOV    AL,M            ;GET BYTE
  452.     CMP    AL,'$'            ;STRING END?
  453.     JNZ    L_6    
  454.     RET                ;YES, DONE
  455. L_6:
  456.     CALL    PBYT            ;PRINT BYTE
  457.     INC    BX            ;BUMP POINTER
  458.     JMPS    PSTRNG            ;LOOP
  459.  
  460. ;************************************************
  461. ;*                        *
  462. ;*    STRING PRINT ROUTINE (COUNT IN B)    *
  463. ;*                        *
  464. ;************************************************
  465.  
  466. PCNT:
  467.     MOV    AL,M            ;GET BYTE
  468.     CALL    PBYT            ;PRINT IT
  469.     INC    BX            ;BUMP POINTER
  470.     DEC    CH            ;DECREMENT COUNT
  471.     JNZ    PCNT
  472.     RET
  473.  
  474. ;************************************************
  475. ;*                        *
  476. ;*        DECIMAL OUTPUT ROUTINE        *
  477. ;*                        *
  478. ;************************************************
  479.  
  480. DEC:
  481.     MOV    BX,(Offset DECWRK)
  482.     MOV    CL,100
  483.     CALL    DIGIT
  484.     MOV    CL,10
  485.     CALL    DIGIT
  486.     MOV    CL,1
  487.     CALL    DIGIT
  488.     RET
  489.  
  490. DIGIT:
  491.     MOV    M,'0'
  492. DI0:
  493.     SUB    AL,CL
  494.     JS    DI1
  495.     INC    M
  496.     JMPS    DI0
  497. DI1:
  498.     ADD    AL,CL
  499.     LAHF
  500.     INC    BX
  501.     SAHF
  502.     RET
  503.  
  504. ;************************************************
  505. ;*                        *
  506. ;*        TOP OF PAGE ROUTINE        *
  507. ;*                        *
  508. ;************************************************
  509. TPAGE:
  510.     MOV    CL,Byte Ptr LINE    ;GET LINE COUNT
  511. TPAGE1:    MOV    AL,LF            ;FAKE A FORM FEED
  512.     CALL    PBYT
  513.     INC    CL
  514.     CMP    CL,PAGSZ        ;AT TOP OF PAGE?
  515.     JB    TPAGE1            ;NO-LOOP AGAIN
  516. ;TPAGE:                    ;CODE TO USE FORM FEEDS
  517. ;    MOV    AL,FORMF        ;ISSUE FORM FEED
  518. ;    CALL    PBYT
  519.  
  520.     MOV    CH,NULLS        ;NUMBER OF NULLS
  521. TPAGE2:
  522.     MOV    AL,FILLER
  523.     CALL    PBYT
  524.     DEC    CH            ;PRINT N FILLERS
  525.     JNZ    TPAGE2
  526.     RET
  527.  
  528. ;************************************************
  529. ;*                        *
  530. ;*       I/O ERROR MESSAGE ROUTINE        *
  531. ;*                        *
  532. ;************************************************
  533.  
  534. ERR:
  535.     MOV    DX,(Offset ERMSG)
  536.     MOV    CL,09H            ;WRITE MSG
  537.     INT    224
  538.     MOV    CL,0
  539.     MOV    DL,0
  540.     INT    224
  541.  
  542. ;************************************************
  543. ;*                        *
  544. ;*               F O P E N                *
  545. ;*        ROUTINE TO OPEN A DISK FILE        *
  546. ;*                                           *
  547. ;*      INPUT:     DX= pointer to FCB     *
  548. ;*     OUTPUT:     CARRY=ERROR        *
  549. ;*                        *
  550. ;************************************************
  551.  
  552. FOPEN:
  553.     MOV    CL,OPEN            ;OPEN CODE
  554.     INT    224            ;ISSUE OPEN
  555.     CMP    AL,0FFH            ;ERROR?
  556.     JZ    FOERR            ;YES
  557.     XOR    AL,AL            ;CLEAR CARRY
  558.     RET
  559. FOERR:
  560.     STC
  561.     RET
  562.  
  563. ;********************************************************
  564. ;*                            *
  565. ;*                 G E T B T                   *
  566. ;*            ROUTINE TO READ A BYTE        *
  567. ;*                            *
  568. ;*          OUTPUTS:     AL = BYTE        *
  569. ;*                       CARRY = ERROR        *
  570. ;*                            *
  571. ;********************************************************
  572.  
  573. GETBT:
  574.     MOV    BX,TBUF+128
  575.     XCHG    BX,DX            ;BUFFER END ADDR. IN DE
  576.     MOV    BX,Word Ptr INPTR    ;CURRENT POINTER IN HL
  577.     CMP    BX,DX            ;TEST FOR END OF BUFFER
  578.     JZ    GETB2            ;YES, READ
  579. GETB1:
  580.     MOV    AL,M            ;GET BYTE
  581.     INC    BX            ;BUMP POINTER
  582.     INC    Word Ptr INPTR        ;BUMP POINTER
  583.     OR    AL,AL            ;RESET CARRY
  584.     RET
  585. GETB2:
  586.     MOV    CL,READ            ;READ CODE
  587.     MOV    DX,TFCB            ;FCB ADDRESS
  588.     INT    224            ;ISSUE READ
  589.     CMP    AL,00            ;ERROR?
  590.     JNZ    IERR            ;YES
  591.     MOV    BX,TBUF            ;RESET BUFFER POINTER
  592.     MOV    Word Ptr INPTR,BX
  593.     JMPS    GETB1            ;CONTINUE
  594. IERR:
  595.     STC
  596.     RET
  597.  
  598.     EJECT
  599.  
  600. ;************************************************
  601. ;*                        *
  602. ;*           D  A  T  A            *
  603. ;*                        *
  604. ;************************************************
  605.  
  606. L_8    EQU    $
  607.     DSEG
  608.     ORG    Offset L_8
  609.  
  610.     DB    'PRINT.CMD - File PRINT Utility, CP/M-86 Version 1.0, '
  611.     DB    '(C) Copyright March 1982, '
  612.     DB    'By Bill Bolton, Software Tools, Sydney, Australia'
  613.     BD    'Revised 10/06/83 v1.0B by H.M. Van Tassell'
  614.  
  615.  
  616. NSWT    DB    0FFH            ;NO HEADING SWITCH
  617. CSWT    DB    0FFH            ;NO PAGINATION SWITCH
  618. PAGE1    DB    0FFH            ;FIRST PAGE FLAG
  619.  
  620. INPTR    DW    TBUF+128        ;INPUT POINTER
  621. DECWRK    DB    '000'            ;DECIMAL WORK AREA
  622. COL    DB    0            ;COLUMN COUNTER
  623. LINE    DB    0            ;LINE COUNTER
  624. PAGEN    DB    0            ;PAGE COUNTER
  625.  
  626. FMSG    DB    CR,'FILE: $'
  627.  
  628. PMSG    DB    '             '
  629.     IF    CLOCK
  630. DATESTR    DB    'MM/DD/YY  HH:MM:SS $'    ;DATE & TIME GO HERE
  631.     ENDIF
  632.     IF  NOT  CLOCK
  633.     DB    '                   $'
  634.     ENDIF
  635.  
  636. PPMSG    DB    '             PAGE $'
  637.  
  638. PERMSG    DB    'Parameter error',CR,LF,LF
  639. ERMSG    DB    'Usage:',CR,LF,LF
  640.     DB    'A> PRINT FILENAME.TYP {pram1,pram2...}',CR,LF,LF
  641.     DB    'Parameters are:',CR,LF
  642.     DB    TAB,'H = Header',CR,LF
  643.     DB    TAB,'P = Pagination',CR,LF
  644.     DB    '$'
  645. PARMS    RS    16            ;PARAMETER STORAGE AREA
  646.  
  647. ;************************************************
  648. ;*                        *
  649. ;*         PARAMETER PROCESSING TABLE        *
  650. ;*                        *
  651. ;*          ENTRIES ARE 3 BYTES WIDE        *
  652. ;*                        *
  653. ;*          BYTE 1 = PARAMETER BYTE        *
  654. ;*                        *
  655. ;*          BYTES 2,3 = ROUTINE ADDRESS    *
  656. ;*                        *
  657. ;************************************************
  658.  
  659. PTAB    DB    'H'
  660.     DW    (Offset NPARM)
  661.     DB    'P'
  662.     DW    (Offset CPARM)
  663. PTABS    EQU    ((Offset $)-(Offset PTAB))/3
  664.  
  665.     END
  666.