home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol096 / print.a86 < prev    next >
Text File  |  1984-04-29  |  12KB  |  579 lines

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