home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug001.ark / PRINT.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  340 lines

  1. ;********************************;
  2. ;     FILE PRINT UTILITY         ;
  3. ;********************************;
  4.  
  5. ;********************************;
  6. ;VERSION 1.1
  7. ;ORIGINAL CODED BY JEFF KRAVITZ
  8. ;MODIFIED BY A. GOLD
  9. ;CONDITIONAL ASSEMBLY FOR <FF> HARDWARE AND
  10. ;OUTPUT TO CONSOLE OR CP/M LIST DEVICE
  11. ;10/15/77
  12. ;********************************;
  13.  
  14. ;********************************;
  15. ;      MISCELLANEOUS EQUATES     ;
  16. ;********************************;
  17.  
  18.  
  19. MAXLN    EQU    56    ;LINES/PAGE
  20. NULLS    EQU    12    ;NULLS AFTER A FORM FEED
  21.  
  22. BOOT    EQU    0000H    ;REBOOT ENTRY POINT
  23. CPM    EQU    0005H    ;CPM ENTRY POINT
  24.  
  25. TBUF    EQU    0080H    ;TRANSIENT PROGRAM BUFFER 
  26. TFCB    EQU    005CH    ;TRANSIENT PROGRAM FCB
  27.  
  28. OPEN    EQU    15    ;OPEN FUNCTION CODE
  29. READ    EQU    20    ;READ FUNCTION CODE
  30.  
  31. LINES    EQU    7    ;LINES TO PAGE TOP
  32. LF    EQU    0AH    ;<LF>
  33.  
  34. FF    EQU    0CH    ;<FF>
  35. CR    EQU    0DH    ;<CR>
  36.  
  37. TAB    EQU    09H    ;<TAB>
  38. SPACE    EQU    20H    ;<SPACE>
  39. RUBOUT    EQU    7FH    ;USED AS FF NULL. MAY CAUSE PROBLEM
  40.             ;TO SOME PRINTERS
  41.  
  42. ODEV    EQU    5    ;CON:=2  LST:=5
  43. FORM    EQU    0H    ;SET 0FFFFH FOR 0CH <FF>
  44.             ;SET 0 FOR <LF>'S TO PAGE TOP
  45. ;TO DEVICE THAT NEEDS LINE-FEEDS
  46. ;
  47. ;********************************;
  48.  
  49. ;********************************;
  50. ;          MAIN LOOP             ;
  51. ;********************************;
  52.  
  53.     ORG    100H
  54.     JMP    PRINT
  55.  
  56. ;PUT A CLUE IN OBJECT
  57.     DB    '/ PRINT UTILITY VERS. 1.1 /'
  58.     IF FORM
  59.     DB    ' HARDWARE FF /'
  60.     ENDIF
  61.     IF    NOT FORM
  62.     DB    ' LF TO PAGE TOP /'
  63.     ENDIF
  64.     IF    NOT ODEV-5
  65.     DB    ' OUT TO LST: /'
  66.     ENDIF
  67.     IF    NOT ODEV-2
  68.     DB    ' OUT TO CON: /'
  69.     ENDIF
  70.  
  71. PRINT:    LXI    SP,STACK
  72.     LXI    D,TFCB    ;POINT TO FCB
  73.     CALL    FOPEN    ;OPEN FILE
  74.     JC    ERR    ;IF ERROR, EXIT
  75. ;
  76.     IF    FORM    ;DO <FF> IF HARDWARE
  77.     CALL    TOF    ;PRINT HEADING
  78.     ENDIF
  79. ;
  80.     IF     NOT FORM;IF NO HARDWARE, ASSUME THERE
  81.     CALL TOF3
  82.     ENDIF
  83. ;
  84.  
  85. LOOP:    CALL    GETBT    ;GET A BYTE
  86.     JC    ERR    ;ERROR
  87.     CPI    1AH    ;EOF?
  88.     JZ    DONE    ;YES
  89.     CPI    CR    ;CR?
  90.     JZ    CRET    ;YES
  91.     CPI    LF    ;LF?
  92.     JZ    LFEED    ;YES
  93.     CPI    TAB    ;TAB?
  94.     JZ    TABMOV    ;YES
  95.     CPI    SPACE    ;ODD CONTROL CHR?
  96.     JNC    LOOPX    ;NO, PRINT CHR.
  97.     JMP    LOOP    ;YES, DROP IT
  98.  
  99. TABMOV:    LXI    H,COL    ;POINT TO COLUMN
  100. TBLP:    MVI    A,SPACE    ;PRINT ONE SPACE
  101.     CALL    PBYT
  102.     MOV    A,M    ;GET COLUMN
  103.     ANI    07H    ;MODULO 8
  104.     JNZ    TBLP    ;IF NOT AT TAB STOP, KEEP TYPEIN
  105.     JMP    LOOP
  106. LOOPX:    CALL    PBYT    ;PRINT BYTE
  107.     JMP    LOOP
  108.  
  109. CRET:    XRA    A
  110.     STA    COL
  111.     MVI    A,CR
  112.     JMP    LOOPX
  113.  
  114. LFEED:    LDA    LINE    ;GET LINE COUNT
  115.     CPI    MAXLN    ;PAGE OVERFLOW?
  116.     JZ    NEWPG    ;YES
  117.     INR    A    ;BUMP LINE COUNT
  118.     STA    LINE
  119.     MVI    A,LF
  120.     JMP    LOOPX    ;CONTINUE
  121.  
  122. NEWPG:    MVI    A,CR
  123.     CALL    PBYT    ;PRINT CR
  124.     CALL    TOF
  125.     JMP    LOOP
  126. ;
  127. ;
  128.     IF    FORM    ;ROUTINE TO FORM FEED WITH 0CH
  129. TOF:    MVI    A,FF    ;FORM FEED
  130.     CALL    PBYT
  131.     MVI    B,NULLS    ;NUMBER OF RUBOUTS
  132. TOF2:    MVI    A,RUBOUT
  133.     CALL    PBYT
  134.     DCR    B    ;DCREMENT COUNT
  135.     JNZ    TOF2    ;PRINT 'N' RUBOUTS
  136.     ENDIF
  137. ;
  138. ;
  139.     IF    NOT FORM;ROUTINE TO PAGE TOP WITH <LF>'S
  140. TOF:    MVI    B,LINES    ;NUMBER OF LINES
  141. TOF2:    MVI    A,LF    ;<LF>
  142.     CALL    PBYT
  143.     DCR    B    ;DCREMENT COUNT
  144.     JNZ    TOF2    ;PRINT 'N' <LF>'S
  145.     ENDIF
  146. ;
  147. ;
  148. TOF3:    LXI    H,FMSG    ;POINT TO MESSAGE
  149.     CALL    PSTRNG    ;PRINT STRING
  150.     LXI    H,TFCB+1;POINT TO NAME
  151.     MVI    B,8    ;SIZE OF NAME
  152.     CALL    PCNT    ;PRINT COUNT
  153.     MVI    A,SPACE    ;PRINT A SPACE
  154.     CALL    PBYT
  155.     LXI    H,TFCB+9;POINT TO TYPE
  156.     MVI    B,03    ;SIZE OF TYPE
  157.     CALL    PCNT    ;PRINT COUNT
  158.     LXI    H,PMSG    ;POINT TO MESSAGE
  159.     CALL    PSTRNG    ;PRINT STRING
  160.     LDA    PAGE    ;GET PAGE NUMBER
  161.     INR    A    ;BUMP IT
  162.     STA    PAGE    ;SAVE IT
  163.     CALL    DEC    ;CONVERT TO DECIMAL
  164.     LXI    H,DECWRK;POINT TO DEC STRING
  165.     MVI    B,3
  166.     CALL    PCNT    ;PRINT PAGE NUMBER
  167.     MVI    A,CR    ;PRINT CR
  168.     CALL    PBYT
  169.     MVI    A,LF
  170.     CALL    PBYT    ;PRINT LF
  171.     MVI    A,LF
  172.     CALL    PBYT    ;AND SECOND
  173.     MVI    A,LF
  174.     CALL    PBYT    ;AND A THIRD
  175.     XRA    A
  176.     STA    LINE    ;RESET LINE COUNT
  177.     STA    COL    ;RESET COLUMN
  178.     RET
  179.  
  180. PBYT:    PUSH    H
  181.     PUSH    B
  182.     PUSH    PSW
  183.     MOV    E,A
  184.     MVI    C,ODEV
  185.     CALL    CPM    ;PRINT
  186.     POP    PSW
  187.     CPI    SPACE    ;NON-PRINTING?
  188.     JC    PBY2    ;YES, DONT BUMP COL
  189.     LXI    H,COL    ;INCREMENT COLUMN
  190.     INR    M
  191. PBY2:    MVI    C,11    ;GET CONSOLE STATUS
  192.     CALL    CPM
  193.     CPI    00    ;BREAK?
  194.     JNZ    BOOT    ;YES, DONE
  195.     POP    B
  196.     POP    H
  197.     RET
  198. PSTRNG:    MOV    A,M    ;GET BYTE
  199.     CPI    '$'    ;STRING END?
  200.     RZ        ;YES, DONE
  201.     CALL    PBYT    ;PRINT BYTE
  202.     INX    H    ;BUMP POINTER
  203.     JMP    PSTRNG    ;LOOP
  204.  
  205. PCNT:    MOV    A,M    ;GET BYTE
  206.     CALL    PBYT    ;PRINT IT
  207.     INX    H    ;BUMP POINTER
  208.     DCR    B    ;DECREMENT COUNT
  209.     JNZ    PCNT
  210.     RET
  211.  
  212. DEC:    LXI    H,DECWRK
  213.     MVI    C,100
  214.     CALL    DIGIT
  215.     MVI    C,10
  216.     CALL    DIGIT
  217.     MVI    C,1
  218.     CALL    DIGIT
  219.     RET
  220.  
  221. DIGIT:    MVI    M,'0'
  222. DI0:    SUB    C
  223.     JM    DI1
  224.     INR    M
  225.     JMP    DI0
  226. DI1:    ADD    C
  227.     INX    H
  228.     RET
  229.  
  230.  
  231.     IF    FORM
  232. DONE:    MVI    A,FF    ;FORM FEED
  233.     CALL    PBYT
  234.     MVI    B,NULLS    ;RUBOUT COUNT
  235. DLP2:    MVI    A,RUBOUT
  236.     CALL    PBYT
  237.     DCR    B
  238.     JNZ    DLP2
  239.     ENDIF
  240. ;
  241.     IF    NOT FORM
  242. DONE:    LXI    H,LINE    ;POINT TO CURRENT LINE
  243.     MVI    A,MAXLN
  244.     SUB    M    ;LINES LEFT TO PRINT
  245.     ADI    LINES    ;PLUS LINE TO PAGE TOP
  246.     MOV    B,A
  247. DLP2:    MVI    A,LF    ;<LF>
  248.     CALL    PBYT
  249.     DCR    B    ;DCREMENT COUNT
  250.     JNZ    DLP2    ;PRINT 'N' LINES TO PAGE TOP
  251.     ENDIF
  252. ;
  253.     JMP    BOOT    ;EXIT
  254.  
  255. ERR:    LXI    D,ERMSG
  256.     MVI    C,09H    ;WRITE MSG
  257.     CALL    CPM
  258.     JMP    BOOT
  259.  
  260.  
  261. ;********************************;
  262. ;           F O P E N            ;
  263. ;  ROUTINE TO OPEN A DISK FILE   ;
  264. ;                                ;
  265. ;  INPUT:     DE=A(FCB)          ;
  266. ; OUTPUT:     CARRY=ERROR        ;
  267. ;********************************;
  268.  
  269. FOPEN:    MVI    C,OPEN    ;OPEN CODE
  270.     CALL    CPM    ;ISSUE OPEN
  271.     CPI    0FFH    ;ERROR?
  272.     JZ    FOERR    ;YES
  273.     XRA    A    ;CLEAR CARRY
  274.     RET
  275. FOERR:    STC
  276.     RET
  277.  
  278.  
  279. ;********************************;
  280. ;            G E T B T           ;
  281. ;   ROUTINE TO READ A BYTE       ;
  282. ;                                ;
  283. ;  OUTPUTS:     A=BYTE           ;
  284. ;               CARRY=ERROR      ;
  285. ;********************************;
  286.  
  287. GETBT:    LXI    H,TBUF+128
  288.     XCHG        ;BUFFER END ADDR. IN DE
  289.     LHLD    INPTR    ;CURRENT POINTER IN HL
  290.     CALL    CPHL    ;TEST FOR END OF BUFFER
  291.     JZ    GETB2    ;YES, READ
  292. GETB1:    MOV    A,M    ;GET BYTE
  293.     INX    H    ;BUMP POINTER
  294.     SHLD    INPTR    ;SAVE POINTER
  295.     ORA    A    ;RESET CARRY
  296.     RET
  297. GETB2:    MVI    C,READ    ;READ CODE
  298.     LXI    D,TFCB    ;FCB ADDRESS
  299.     CALL    CPM    ;ISSUE READ
  300.     CPI    00    ;ERROR?
  301.     JNZ    IERR    ;YES
  302.     LXI    H,TBUF    ;RESET BUFFER POINTER
  303.     SHLD    INPTR
  304.     JMP    GETB1    ;CONTINUE
  305. IERR:    STC
  306.     RET
  307.  
  308. ;********************************;
  309. ;   MISCELLANEOUS SUBROUTINES    ;
  310. ;********************************;
  311.  
  312. ;********************************;
  313. ;             C P H L            ;
  314. ;  ROUTINE TO COMPARE HL VS DE   ;
  315. ;********************************;
  316.  
  317. CPHL:    MOV    A,H
  318.     CMP    D
  319.     RNZ
  320.     MOV    A,L
  321.     CMP    E
  322.     RET
  323.  
  324. ;********************************;
  325. ;             D A T A            ;
  326. ;********************************;
  327.  
  328. COL:    DB    0    ;COLUMN COUNTER
  329. LINE:    DB    0    ;LINE COUNTER
  330. PAGE:    DB    0    ;PAGE COUNTER
  331.  
  332. FMSG:    DB    CR,'FILE: $'
  333. PMSG:    DB    '                 PAGE $'
  334. ERMSG:    DB    'ERROR',0DH,0AH,'$'
  335.     DS    32
  336. STACK    EQU    $
  337. INPTR:    DW    TBUF+128;INPUT POINTER
  338. DECWRK:    DB    '000'
  339.     END    PRINT
  340.