home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG008.ARK / PRINT2.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  476 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. ;MODIFIED AGAIN BY J. KRAVITZ TO
  13. ;INCLUDE HIGH SPEED TAB FUNCTION
  14. ;FOR DIABLO HYTYPE DRIVER 11/10/77
  15. ;********************************;
  16.  
  17. ;********************************;
  18. ;      MISCELLANEOUS EQUATES     ;
  19. ;********************************;
  20.  
  21.  
  22. MAXLN    EQU    56    ;LINES/PAGE
  23. NULLS    EQU    12    ;NULLS AFTER A FORM FEED
  24.  
  25. BOOT    EQU    0000H    ;REBOOT ENTRY POINT
  26. CPM    EQU    0005H    ;CPM ENTRY POINT
  27.  
  28. TBUF    EQU    0080H    ;TRANSIENT PROGRAM BUFFER 
  29. TFCB    EQU    005CH    ;TRANSIENT PROGRAM FCB
  30.  
  31. OPEN    EQU    15    ;OPEN FUNCTION CODE
  32. READ    EQU    20    ;READ FUNCTION CODE
  33.  
  34. LINES    EQU    7    ;LINES TO PAGE TOP
  35. LF    EQU    0AH    ;<LF>
  36.  
  37. FF    EQU    0CH    ;<FF>
  38. CR    EQU    0DH    ;<CR>
  39.  
  40. TAB    EQU    09H    ;<TAB>
  41. SPACE    EQU    20H    ;<SPACE>
  42. RUBOUT    EQU    7FH    ;USED AS FF NULL. MAY CAUSE PROBLEM
  43.             ;TO SOME PRINTERS
  44.  
  45. DIABLO    EQU    0FFFFH    ;SET TO 0FFFFH FOR DIABLO, 0 OTHERWISE
  46. ODEV    EQU    0    ;CON:=2  LST:=5
  47. FORM    EQU    0H    ;SET 0FFFFH FOR 0CH <FF>
  48.             ;SET 0 FOR <LF>'S TO PAGE TOP
  49. ;TO DEVICE THAT NEEDS LINE-FEEDS
  50. ;
  51. ;********************************;
  52.  
  53. ;********************************;
  54. ;          MAIN LOOP             ;
  55. ;********************************;
  56.  
  57.     ORG    100H
  58.     JMP    PRINT
  59.  
  60. ;PUT A CLUE IN OBJECT
  61.     DB    '/ PRINT UTILITY VERS. 1.2 /'
  62.     IF FORM AND (NOT DIABLO)
  63.     DB    ' HARDWARE FF /'
  64.     ENDIF
  65.     IF    NOT FORM AND (NOT DIABLO)
  66.     DB    ' LF TO PAGE TOP /'
  67.     ENDIF
  68.     IF    NOT ODEV-5 AND (NOT DIABLO)
  69.     DB    ' OUT TO LST: /'
  70.     ENDIF
  71.     IF    NOT ODEV-2 AND (NOT DIABLO)
  72.     DB    ' OUT TO CON: /'
  73.     ENDIF
  74.     IF DIABLO
  75.     DB    ' OUT TO DIABLO: '
  76.     ENDIF
  77.  
  78. PRINT:    LXI    SP,STACK
  79.     LXI    D,TFCB    ;POINT TO FCB
  80.     CALL    FOPEN    ;OPEN FILE
  81.     JC    ERR    ;IF ERROR, EXIT
  82.     IF    DIABLO
  83.     CALL    RSTR    ;RESTORE THE PRINTER
  84.     ENDIF
  85. ;
  86.     IF    FORM AND (NOT DIABLO)    ;DO <FF> IF HARDWARE
  87.     CALL    TOF    ;PRINT HEADING
  88.     ENDIF
  89. ;
  90.     IF     (NOT FORM) OR DIABLO;IF NO HARDWARE, ASSUME THERE
  91.     CALL TOF3
  92.     ENDIF
  93. ;
  94.  
  95. LOOP:    CALL    GETBT    ;GET A BYTE
  96.     JC    ERR    ;ERROR
  97.     CPI    1AH    ;EOF?
  98.     JZ    DONE    ;YES
  99.     CPI    CR    ;CR?
  100.     JZ    CRET    ;YES
  101.     CPI    LF    ;LF?
  102.     JZ    LFEED    ;YES
  103.     CPI    TAB    ;TAB?
  104.     JZ    TABMOV    ;YES
  105.     CPI    SPACE    ;ODD CONTROL CHR?
  106.     JNC    LOOPX    ;NO, PRINT CHR.
  107.     JMP    LOOP    ;YES, DROP IT
  108.  
  109. TABMOV:    LXI    H,COL    ;POINT TO COLUMN
  110. TBLP:    MVI    A,SPACE    ;PRINT ONE SPACE
  111.     CALL    PBYT
  112.     MOV    A,M    ;GET COLUMN
  113.     ANI    07H    ;MODULO 8
  114.     JNZ    TBLP    ;IF NOT AT TAB STOP, KEEP TYPEIN
  115.     JMP    LOOP
  116. LOOPX:    CALL    PBYT    ;PRINT BYTE
  117.     JMP    LOOP
  118.  
  119. CRET:    XRA    A
  120.     STA    COL
  121.     MVI    A,CR
  122.     JMP    LOOPX
  123.  
  124. LFEED:    LDA    LINE    ;GET LINE COUNT
  125.     CPI    MAXLN    ;PAGE OVERFLOW?
  126.     JZ    NEWPG    ;YES
  127.     INR    A    ;BUMP LINE COUNT
  128.     STA    LINE
  129.     MVI    A,LF
  130.     JMP    LOOPX    ;CONTINUE
  131.  
  132. NEWPG:    MVI    A,CR
  133.     CALL    PBYT    ;PRINT CR
  134.     CALL    TOF
  135.     JMP    LOOP
  136. ;
  137. ;
  138.     IF    FORM AND (NOT DIABLO)    ;ROUTINE TO FORM FEED WITH 0CH
  139. TOF:    MVI    A,FF    ;FORM FEED
  140.     CALL    PBYT
  141.     MVI    B,NULLS    ;NUMBER OF RUBOUTS
  142. TOF2:    MVI    A,RUBOUT
  143.     CALL    PBYT
  144.     DCR    B    ;DCREMENT COUNT
  145.     JNZ    TOF2    ;PRINT 'N' RUBOUTS
  146.     ENDIF
  147. ;
  148. ;
  149.     IF    (NOT FORM) OR DIABLO;ROUTINE TO PAGE TOP WITH <LF>'S
  150. TOF:    MVI    B,LINES    ;NUMBER OF LINES
  151. TOF2:    MVI    A,LF    ;<LF>
  152.     CALL    PBYT
  153.     DCR    B    ;DCREMENT COUNT
  154.     JNZ    TOF2    ;PRINT 'N' <LF>'S
  155.     ENDIF
  156. ;
  157. ;
  158. TOF3:    LXI    H,FMSG    ;POINT TO MESSAGE
  159.     CALL    PSTRNG    ;PRINT STRING
  160.     LXI    H,TFCB+1;POINT TO NAME
  161.     MVI    B,8    ;SIZE OF NAME
  162.     CALL    PCNT    ;PRINT COUNT
  163.     MVI    A,SPACE    ;PRINT A SPACE
  164.     CALL    PBYT
  165.     LXI    H,TFCB+9;POINT TO TYPE
  166.     MVI    B,03    ;SIZE OF TYPE
  167.     CALL    PCNT    ;PRINT COUNT
  168.     LXI    H,PMSG    ;POINT TO MESSAGE
  169.     CALL    PSTRNG    ;PRINT STRING
  170.     LDA    PAGE    ;GET PAGE NUMBER
  171.     INR    A    ;BUMP IT
  172.     STA    PAGE    ;SAVE IT
  173.     CALL    DEC    ;CONVERT TO DECIMAL
  174.     LXI    H,DECWRK;POINT TO DEC STRING
  175.     MVI    B,3
  176.     CALL    PCNT    ;PRINT PAGE NUMBER
  177.     MVI    A,CR    ;PRINT CR
  178.     CALL    PBYT
  179.     MVI    A,LF
  180.     CALL    PBYT    ;PRINT LF
  181.     MVI    A,LF
  182.     CALL    PBYT    ;AND SECOND
  183.     MVI    A,LF
  184.     CALL    PBYT    ;AND A THIRD
  185.     XRA    A
  186.     STA    LINE    ;RESET LINE COUNT
  187.     STA    COL    ;RESET COLUMN
  188.     RET
  189.  
  190. PBYT:    PUSH    H
  191.     PUSH    B
  192.     PUSH    PSW
  193.     IF    NOT DIABLO
  194.     MOV    E,A
  195.     MVI    C,ODEV
  196.     CALL    CPM    ;PRINT
  197.     ENDIF
  198.     IF    DIABLO
  199.     CALL    DDVR
  200.     ENDIF
  201.     POP    PSW
  202.     CPI    SPACE    ;NON-PRINTING?
  203.     JC    PBY2    ;YES, DONT BUMP COL
  204.     LXI    H,COL    ;INCREMENT COLUMN
  205.     INR    M
  206. PBY2:    MVI    C,11    ;GET CONSOLE STATUS
  207.     CALL    CPM
  208.     CPI    00    ;BREAK?
  209.     JNZ    BOOT    ;YES, DONE
  210.     POP    B
  211.     POP    H
  212.     RET
  213. PSTRNG:    MOV    A,M    ;GET BYTE
  214.     CPI    '$'    ;STRING END?
  215.     RZ        ;YES, DONE
  216.     CALL    PBYT    ;PRINT BYTE
  217.     INX    H    ;BUMP POINTER
  218.     JMP    PSTRNG    ;LOOP
  219.  
  220. PCNT:    MOV    A,M    ;GET BYTE
  221.     CALL    PBYT    ;PRINT IT
  222.     INX    H    ;BUMP POINTER
  223.     DCR    B    ;DECREMENT COUNT
  224.     JNZ    PCNT
  225.     RET
  226.  
  227. DEC:    LXI    H,DECWRK
  228.     MVI    C,100
  229.     CALL    DIGIT
  230.     MVI    C,10
  231.     CALL    DIGIT
  232.     MVI    C,1
  233.     CALL    DIGIT
  234.     RET
  235.  
  236. DIGIT:    MVI    M,'0'
  237. DI0:    SUB    C
  238.     JM    DI1
  239.     INR    M
  240.     JMP    DI0
  241. DI1:    ADD    C
  242.     INX    H
  243.     RET
  244.  
  245.  
  246.     IF    FORM
  247. DONE:    MVI    A,FF    ;FORM FEED
  248.     CALL    PBYT
  249.     MVI    B,NULLS    ;RUBOUT COUNT
  250. DLP2:    MVI    A,RUBOUT
  251.     CALL    PBYT
  252.     DCR    B
  253.     JNZ    DLP2
  254.     ENDIF
  255. ;
  256.     IF    (NOT FORM) OR DIABLO
  257. DONE:    LXI    H,LINE    ;POINT TO CURRENT LINE
  258.     MVI    A,MAXLN
  259.     SUB    M    ;LINES LEFT TO PRINT
  260.     ADI    LINES    ;PLUS LINE TO PAGE TOP
  261.     MOV    B,A
  262. DLP2:    MVI    A,LF    ;<LF>
  263.     CALL    PBYT
  264.     DCR    B    ;DCREMENT COUNT
  265.     JNZ    DLP2    ;PRINT 'N' LINES TO PAGE TOP
  266.     ENDIF
  267. ;
  268.     JMP    BOOT    ;EXIT
  269.  
  270. ERR:    LXI    D,ERMSG
  271.     MVI    C,09H    ;WRITE MSG
  272.     CALL    CPM
  273.     JMP    BOOT
  274.  
  275.  
  276. ;********************************;
  277. ;           F O P E N            ;
  278. ;  ROUTINE TO OPEN A DISK FILE   ;
  279. ;                                ;
  280. ;  INPUT:     DE=A(FCB)          ;
  281. ; OUTPUT:     CARRY=ERROR        ;
  282. ;********************************;
  283.  
  284. FOPEN:    MVI    C,OPEN    ;OPEN CODE
  285.     CALL    CPM    ;ISSUE OPEN
  286.     CPI    0FFH    ;ERROR?
  287.     JZ    FOERR    ;YES
  288.     XRA    A    ;CLEAR CARRY
  289.     RET
  290. FOERR:    STC
  291.     RET
  292.  
  293.  
  294. ;********************************;
  295. ;            G E T B T           ;
  296. ;   ROUTINE TO READ A BYTE       ;
  297. ;                                ;
  298. ;  OUTPUTS:     A=BYTE           ;
  299. ;               CARRY=ERROR      ;
  300. ;********************************;
  301.  
  302. GETBT:    LXI    H,TBUF+128
  303.     XCHG        ;BUFFER END ADDR. IN DE
  304.     LHLD    INPTR    ;CURRENT POINTER IN HL
  305.     CALL    CPHL    ;TEST FOR END OF BUFFER
  306.     JZ    GETB2    ;YES, READ
  307. GETB1:    MOV    A,M    ;GET BYTE
  308.     INX    H    ;BUMP POINTER
  309.     SHLD    INPTR    ;SAVE POINTER
  310.     ORA    A    ;RESET CARRY
  311.     RET
  312. GETB2:    MVI    C,READ    ;READ CODE
  313.     LXI    D,TFCB    ;FCB ADDRESS
  314.     CALL    CPM    ;ISSUE READ
  315.     CPI    00    ;ERROR?
  316.     JNZ    IERR    ;YES
  317.     LXI    H,TBUF    ;RESET BUFFER POINTER
  318.     SHLD    INPTR
  319.     JMP    GETB1    ;CONTINUE
  320. IERR:    STC
  321.     RET
  322.  
  323. ;********************************;
  324. ;   MISCELLANEOUS SUBROUTINES    ;
  325. ;********************************;
  326.  
  327. ;********************************;
  328. ;             C P H L            ;
  329. ;  ROUTINE TO COMPARE HL VS DE   ;
  330. ;********************************;
  331.  
  332. CPHL:    MOV    A,H
  333.     CMP    D
  334.     RNZ
  335.     MOV    A,L
  336.     CMP    E
  337.     RET
  338.  
  339.  
  340. ;
  341. ;  DIABLO DRIVER FOR N.Y. INTERFACE BOARD
  342. ;  WITH HI SPEED TABBING FUNCTION
  343. ;
  344.     IF    DIABLO
  345. DDVR:    PUSH    PSW    ;SAVE PSW
  346.     PUSH    B    ;SAVE BC
  347.     PUSH    D    ;SAVE DE
  348.     PUSH    H    ;SAVE HL
  349.     CPI    0DH    ;CR?    
  350.     JZ    PCR    ;YES    
  351.     CPI    0AH    ;LINE FEED?
  352.     JZ    PLF    ;YES
  353.     CPI    20H    ;OTHER CONTROL?
  354.     JC    DXIT    ;YES, IGNORE
  355.     JZ    PSP    ;SPACE    
  356.     CPI    7FH
  357.     JC    PCH    ;CONTINUE IF ASCII
  358. DXIT:    POP    H
  359.     POP    D
  360.     POP    B
  361.     POP    PSW    ;EXIT TO CALLER
  362.     RET
  363.  
  364. PCH:    PUSH    PSW    ;SAVE CHAR
  365.     CALL    CKMOV    ;TEST FOR SAVED MOVE
  366.     POP    PSW    ;RESTORE CHAR
  367.     STA    DLOW    ;SAVE CHAR
  368.     MVI    A,0
  369.     STA    DHIGH    ;CLEAR DATA HIGH
  370.     MVI    B,CHRDY    ;TEST FOR CHAR READY
  371.     CALL    CKSTT    ;CALL STATUS CHECK
  372.     CALL    OUT16    ;OUTPUT 16 BITS TO DIABLO
  373.     OUT    CHSTB    ;OUTPUT CHARACTER STROBE
  374.     JMP    PSP
  375. PCR:    LHLD    CLOC    ;GET CURRENT LOCATION
  376.     MOV    A,H
  377.     ORI    04H    ;SET REVERSE DIRECTION BIT
  378.     MOV    H,A    ;SET DIRECTION
  379.     CALL    CMOVE    ;RETURN CARRIAGE
  380.     LXI    H,0000    ;ZERO CLOC
  381.     SHLD    CLOC
  382.     SHLD    SPCNT    ;ZERO SPACE COUNT
  383.     JMP    DXIT    ;EXIT TO CALLER
  384. PLF:    CALL    CKMOV    ;CHECK FOR PREVIOUS MOVE
  385.     LXI    H,0008    ;MOVE DOWN 8 INCR.
  386.     CALL    PMOVE
  387.     JMP    DXIT    ;RETURN TO CALLER
  388. PSP:    LHLD    SPCNT    ;GET SPACE COUNT
  389.     LXI    D,0006    ;NEW INCREMENT
  390.     DAD    D    ;ADD TO CURRENT SPACE COUNT
  391.     SHLD    SPCNT    ;SAVE IT
  392.     JMP    DXIT    ;DONE
  393.  
  394. CKMOV:    LHLD    SPCNT    ;TEST FOR NON ZERO SPACE COUNT
  395.     MOV    A,H
  396.     ORA    L
  397.     RZ        ;ZERO, IGNORE
  398.     CALL    CMOVE    ;NON ZERO, MOVE CARRIAGE
  399.     LHLD    SPCNT
  400.     XCHG
  401.     LHLD    CLOC
  402.     DAD    D
  403.     SHLD    CLOC    ;UPDATE CARRIAGE LOCATION
  404.     LXI    H,0000
  405.     SHLD    SPCNT    ;ZERO THE SPACE COUNT
  406.     RET
  407.  
  408.  
  409. CKSTT:    IN    DSTAT    ;GET DIABLO STATUS
  410.     CMA
  411.     ANA    B    ;TEST STATUS
  412.     JZ    CKSTT    ;LOOP TILL READY
  413.     RET
  414.  
  415. CMOVE:    SHLD    DLOW    ;SAVE DATA
  416.     MVI    B,CMRDY
  417.     CALL    CKSTT
  418.     CALL    OUT16    ;SEND 16 BITS TO DIABLO
  419.     OUT    CMSTB    ;CARRIAGE MOVEMENT STROBE
  420.     RET
  421.  
  422. PMOVE:    SHLD    DLOW
  423.     MVI    B,PMRDY    ;TEST PAPER MOVEMENT STATUS
  424.     CALL    CKSTT
  425.     CALL    OUT16    ;OUTPUT 16 BITS TO DIABLO
  426.     OUT    PMSTB    ;PAPER MOVEMENT STROBE
  427.     RET
  428. OUT16:    LDA    DLOW    ;GET LOW ORDER DATA BYTE
  429.     RAL        ;ROTATE TO POSITION BITS
  430.     OUT    DALOW    ;OUTPUT TO DATA LOW PORT
  431.     LDA    DHIGH    ;GET HIGH ORDER BYTE
  432.     RAL        ;ROTATE
  433.     OUT    DAHIGH
  434.     RET
  435.  
  436. RSTR:    OUT    RSSTB    ;OUTPUT TO RESTORE STROBE
  437.     LXI    H,0000
  438.     SHLD    CLOC    ;ZERO CURRENT CARRIAGE LOC
  439.     SHLD    SPCNT    ;ZERO SPACE COUNTER
  440.     RET
  441.  
  442. DLOW    EQU    0047H        ;BYTES LOCATED AT 47-4F
  443. DHIGH    EQU    DLOW+1
  444. CLOC    EQU    DHIGH+1
  445. SPCNT    EQU    CLOC+2
  446.  
  447. DSTAT:    EQU    40H
  448. DALOW:    EQU    40H
  449. DAHIGH:    EQU    41H
  450. CHSTB    EQU    42H
  451. CMSTB    EQU    43H
  452. PMSTB    EQU    44H
  453. RSSTB:    EQU    45H
  454.  
  455. CHRDY    EQU    01H
  456. CMRDY    EQU    02H
  457. PMRDY    EQU    04H
  458.     ENDIF
  459.  
  460. ;********************************;
  461. ;             D A T A            ;
  462. ;********************************;
  463.  
  464. COL:    DB    0    ;COLUMN COUNTER
  465. LINE:    DB    0    ;LINE COUNTER
  466. PAGE:    DB    0    ;PAGE COUNTER
  467.  
  468. FMSG:    DB    CR,'FILE: $'
  469. PMSG:    DB    '                 PAGE $'
  470. ERMSG:    DB    'ERROR',0DH,0AH,'$'
  471.     DS    32
  472. STACK    EQU    $
  473. INPTR:    DW    TBUF+128;INPUT POINTER
  474. DECWRK:    DB    '000'
  475.     END    PRINT
  476.