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 / CPMUG015.ARK / PRINT3.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  16KB  |  777 lines

  1. ;**************************************************;
  2. ;
  3. ;        FILE PRINT UTILITY
  4. ;
  5. ;        VERSION        1.3
  6. ;
  7. ;        WRITTEN BY J. KRAVITZ
  8. ;
  9. ;        COPYRIGHT (C) 1977
  10. ;        BY INTELLECT ENTERPRISES
  11. ;
  12. ;--------------------------------------------------;
  13. ;
  14. ;        CHANGE HISTORY
  15. ;
  16. ; 10/15/77 A.R.G    COND. ASSM. FOR NON-
  17. ;            FORM FEED HARDWARE
  18. ; 10/15/77 A.R.G    COND. ASSM FOR OUTPUT TO
  19. ;            CONSOLE OR PRINTER
  20. ; 11/10/77 J.K.K    DIABLO HY-TYPE I DRIVER
  21. ;            WITH HI SPEED MOVEMENT
  22. ; 11/17/77 J.K.K    HANDLE IMBEDDED FORM FEED
  23. ;            CHARACTERS IN FILE
  24. ; 11/17/77 J.K.K    HANDLE 'N' AND 'C'
  25. ;            PARAMETERS
  26. ; 11/17/77 J.K.K    HANDLE '0' AND '2'
  27. ;            PARAMETERS
  28. ; 11/17/77 J.K.K    HANDLE PRINTING OF BACKSPACE
  29. ;            IMBEDDED IN TEXT
  30. ;
  31. ;**************************************************;
  32.  
  33. ;**************************************************;
  34. ;
  35. ;           MISCELLANEOUS EQUATES
  36. ;
  37. ;**************************************************;
  38.  
  39.  
  40. PAGSZ    EQU    66    ;LINES/PAGE
  41. MAXLN    EQU    58    ;USABLE LINES/PAGE
  42. NULLS    EQU    12    ;NULLS AFTER A FORM FEED
  43.  
  44. BOOT    EQU    0000H    ;REBOOT ENTRY POINT
  45. CPM    EQU    0005H    ;CPM ENTRY POINT
  46.  
  47. TBUF    EQU    0080H    ;TRANSIENT PROGRAM BUFFER 
  48. TFCB    EQU    005CH    ;TRANSIENT PROGRAM FCB
  49.  
  50. OPEN    EQU    15    ;OPEN FUNCTION CODE
  51. READ    EQU    20    ;READ FUNCTION CODE
  52.  
  53. LF    EQU    0AH    ;<LF>
  54. BS    EQU    08H    ;<BS>
  55.  
  56. FF    EQU    0CH    ;<FF>
  57. CR    EQU    0DH    ;<CR>
  58.  
  59. TAB    EQU    09H    ;<TAB>
  60. SPACE    EQU    20H    ;<SPACE>
  61. RUBOUT    EQU    7FH    ;USED AS FF NULL. MAY CAUSE PROBLEM
  62.             ;TO SOME PRINTERS
  63.  
  64. DIABLO    EQU    0FFFFH    ;SET TO 0FFFFH FOR DIABLO, 0 OTHERWISE
  65. ODEV    EQU    5    ;CON:=2  LST:=5
  66. FORM    EQU    0H    ;SET 0FFFFH FOR 0CH <FF>
  67.             ;SET 0 FOR <LF>'S TO PAGE TOP
  68.             ;TO DEVICE THAT NEEDS LINE-FEEDS
  69.  
  70. ;**************************************************;
  71. ;
  72. ;            INITIALIZATION
  73. ;
  74. ;**************************************************;
  75.  
  76.     ORG    100H
  77.     JMP    PRINT
  78.  
  79.     DB    '/ PRINT UTILITY VERS. 1.3 /'
  80.     IF    FORM AND (NOT DIABLO)
  81.     DB    ' HARDWARE FF /'
  82.     ENDIF
  83.     IF    NOT FORM AND (NOT DIABLO)
  84.     DB    ' LF TO PAGE TOP /'
  85.     ENDIF
  86.     IF    NOT ODEV-5 AND (NOT DIABLO)
  87.     DB    ' OUT TO LST: /'
  88.     ENDIF
  89.     IF    NOT ODEV-2 AND (NOT DIABLO)
  90.     DB    ' OUT TO CON: /'
  91.     ENDIF
  92.     IF    DIABLO
  93.     DB    ' OUT TO DIABLO: '
  94.     ENDIF
  95.  
  96. ;**************************************************;
  97. ;
  98. ;    GET PARAMETERS FROM COMMAND LINE
  99. ;
  100. ;**************************************************;
  101.  
  102. PRINT:    LXI    SP,STACK
  103.     LXI    H,TBUF        ;POINT TO BUFFER
  104.     MOV    B,M        ;GET COUNT OF CHARACTERS IN CMD
  105.     MOV    A,B        ;GET COUNT AGAIN
  106.     ORA    A        ;TEST FOR ZERO
  107.     JZ    PERR        ;YES, NO ARGUMENTS
  108.     INX    H        ;SKIP COUNT
  109. SKP1:    MOV    A,M        ;GET BYTE
  110.     CPI    ' '        ;SPACE?
  111.     JNZ    SKP2        ;NO
  112.     INX    H        ;BUMP 
  113.     DCR    B        ;DECRMENT COUNT
  114.     JNZ    SKP1        ;SKIP TO FIRST NON-SPACE
  115.     JMP    PERR        ;NO, NON SPACE AFTER FILE ID
  116. SKP2:    MOV    A,M        ;GET CHAR
  117.     CPI    ' '        ;SPACE?
  118.     JZ    SKP3        ;YES
  119.     INX    H        ;BUMP POINTER
  120.     DCR    B        ;DECREMENT COUNT
  121.     JNZ    SKP2        ;SKIP TO SPACE
  122.     JMP    PEND        ;NO SPACE AFTER FILE ID
  123. SKP3:    MOV    A,M        ;GET CHAR
  124.     CPI    ' '        ;TEST FOR NON,SPACE
  125.     JNZ    SKP4        ;FOUND ARGUMENTS
  126.     INX    H        ;BUMP POINTER
  127.     DCR    B        ;DECREMENT COUNT
  128.     JNZ    SKP3
  129.     JMP    PEND
  130. SKP4:    LXI    D,PARMS
  131. SKP4A:    MOV    A,M
  132.     STAX    D
  133.     INX    H
  134.     INX    D
  135.     DCR    B
  136.     JNZ    SKP4A
  137.     MVI    A,' '
  138.     STAX    D        ;INDICATE END OF PARMS
  139.  
  140. ;**************************************************;
  141. ;
  142. ;         PROCESS PARAMETERS
  143. ;
  144. ;**************************************************;
  145.  
  146. PPARM:    LXI    D,PARMS        ;POINT TO PARMS AREA
  147. PLP0:    LXI    H,PTAB        ;POINT TO PARM TABLE
  148.     MVI    B,PTABS        ;SIIZE OF PARM TABLE
  149. PLP1:    LDAX    D        ;GET PARM BYTE
  150.     CPI    ' '        ;END OF PARMS?
  151.     JZ    PEND        ;YES, DONE
  152.     CPI    00        ;END OF PARMS?
  153.     JZ    PEND        ;YES, DONE
  154.     CMP    M        ;COMPARE TO TABLE ENTRY
  155.     JZ    PFND        ;FOUND IT
  156.     INX    H        ;BUMP PARM TABLE PTR
  157.     INX    H
  158.     INX    H
  159.     DCR    B        ;DECREMENT COUNT
  160.     JNZ    PLP1        ;KEEP LOOKING
  161. PERR:    LXI    D,PERMSG    ;POINT TO PARM ERROR MSG
  162.     MVI    C,09        ;WRITE MSG
  163.     CALL    CPM
  164.     JMP    BOOT        ;EXIT
  165. PFND:    INX    H        ;POINT TO ROUTINE ADDR
  166.     PUSH    D        ;SAVE PARM POINTER
  167.     MOV    E,M
  168.     INX    H
  169.     MOV    D,M        ;GET ROUTINE ADDR
  170.     LXI    H,PRET        ;RETURN ADDRESS
  171.     PUSH    H        ;SIMULATE CALL
  172.     XCHG            ;GET ROUTINE ADDR
  173.     PCHL            ;EXIT TO PARM PROC. ROUTINE
  174. PRET:    POP    D        ;GET PARM POINTER AGAIN
  175.     INX    D        ;POINT TO NEXT ONE
  176.     JMP    PLP0        ;CONTINUE
  177.  
  178. ;**************************************************;
  179. ;
  180. ;        PARAMETER PROCESSING ROUTINES
  181. ;
  182. ;**************************************************;
  183.  
  184. NPARM:    MVI    A,0FFH    ;SET 'NO HEADING' SWITCH
  185.     STA    NSWT
  186.     RET
  187.  
  188. CPARM:    MVI    A,0FFH    ;SET 'NO PAGINATION' SWITCH
  189.     STA    CSWT
  190.     RET
  191.  
  192. TENP:    LXI    H,0006    ;SET TEN PITCH
  193.     SHLD    CHRINC
  194.     RET
  195.  
  196. TWELVEP:
  197.     LXI    H,0005    ;SET 12 PITCH
  198.     SHLD    CHRINC
  199.     RET
  200.  
  201. ;**************************************************;
  202. ;
  203. ;        OPEN FILE FOR INPUT
  204. ;
  205. ;**************************************************;
  206.  
  207. PEND:    LXI    D,TFCB    ;POINT TO FCB
  208.     CALL    FOPEN    ;OPEN FILE
  209.     JC    ERR    ;IF ERROR, EXIT
  210.     IF    DIABLO
  211.     CALL    RSTR    ;RESTORE THE PRINTER
  212.     ENDIF
  213.  
  214.     IF    FORM AND (NOT DIABLO)
  215.     CALL    TPAGE    ;POSITION AT TOP OF PAGE
  216.     CALL    HEAD    ;PRINT HEADING
  217.     ENDIF
  218.  
  219.     IF    (NOT FORM) OR DIABLO
  220.     ;IF NO HARDWARE FF, ASSUME
  221.     ;PAPER IS IN POSITION
  222.     CALL    HEAD    ;PRINT HEADING
  223.     ENDIF
  224.  
  225. ;**************************************************;
  226. ;
  227. ;        MAIN PROCESSING LOOP
  228. ;
  229. ;**************************************************;
  230.  
  231. LOOP:    CALL    GETBT    ;GET A BYTE
  232.     JC    ERR    ;ERROR
  233.     CPI    1AH    ;EOF?
  234.     JZ    DONE    ;YES
  235.     CPI    CR    ;CR?
  236.     JZ    CRET    ;YES
  237.     CPI    LF    ;LF?
  238.     JZ    LFEED    ;YES
  239.     CPI    TAB    ;TAB?
  240.     JZ    TABMOV    ;YES
  241.     CPI    FF    ;FORM FEED?
  242.     JZ    FFEED    ;YES
  243.     CPI    BS    ;BACKSPACE
  244.     JZ    BSPACE    ;YES
  245.     CPI    SPACE    ;ODD CONTROL CHR?
  246.     JC    LOOP    ;YES, IGNORE IT
  247.     CALL    PBYT    ;OTHERWISE PRINT IT
  248.     JMP    LOOP    ;CONTINUE
  249.  
  250. ;*************************************************;
  251. ;
  252. ;        FINAL PROCESSING
  253. ;
  254. ;*************************************************;
  255.  
  256. DONE:    CALL    TPAGE    ;MOVE TO TOP OF PAGE
  257.     JMP    BOOT    ;EXIT TO CPM
  258.  
  259.  
  260. ;**************************************************;
  261. ;
  262. ;        PROCESS TABS
  263. ;
  264. ;**************************************************;
  265.  
  266. TABMOV:    LXI    H,COL    ;POINT TO COLUMN
  267. TBLP:    MVI    A,SPACE    ;PRINT ONE SPACE
  268.     CALL    PBYT
  269.     MOV    A,M    ;GET COLUMN
  270.     ANI    07H    ;MODULO 8
  271.     JNZ    TBLP    ;IF NOT AT TAB STOP, KEEP TYPEIN
  272.     JMP    LOOP
  273.     CALL    PBYT    ;PRINT BYTE
  274.     JMP    LOOP
  275.  
  276. ;**************************************************;
  277. ;
  278. ;        PROCESS <CR>
  279. ;
  280. ;**************************************************;
  281.  
  282. CRET:    XRA    A
  283.     STA    COL
  284.     MVI    A,CR
  285.     CALL    PBYT    ;PRINT <CR>
  286.     JMP    LOOP    ;CONTINUE IN MAIN LOOP
  287.  
  288. ;**************************************************;
  289. ;
  290. ;        PROCESS <LF>
  291. ;
  292. ;**************************************************;
  293.  
  294. LFEED:    LDA    CSWT    ;GET PAGINATION SWITCH
  295.     ORA    A    ;SEE IF 'NO PAGINATION'
  296.     JNZ    LFEED2    ;TRUE, SKIP PAGINATION TEST
  297.     LDA    LINE    ;GET LINE COUNT
  298.     CPI    MAXLN    ;PAGE OVERFLOW?
  299.     JZ    FFEED    ;YES
  300. LFEED2:    LDA    LINE    ;GET LINE  COUNT
  301.     INR    A    ;BUMP LINE COUNT
  302.     STA    LINE
  303.     MVI    A,LF
  304.     CALL    PBYT
  305.     JMP    LOOP
  306.  
  307. ;**************************************************;
  308. ;
  309. ;            PROCESS <BS>
  310. ;
  311. ;**************************************************;
  312.  
  313. BSPACE:    MVI    A,BS
  314.     CALL    PBYT
  315.     LDA    COL    ;GET COLUMN COUNTER
  316.     ORA    A    ;IF ZERO, DONT DECREMENT IT
  317.     JZ    LOOP
  318.     DCR    A
  319.     STA    COL    ;DECREMENT COLUMN COUNT
  320.     JMP    LOOP
  321.  
  322. ;**************************************************;
  323. ;
  324. ;        PROCESS FORM FEED
  325. ;
  326. ;**************************************************;
  327.  
  328. FFEED:    MVI    A,CR
  329.     CALL    PBYT    ;PRINT CR
  330.     CALL    TPAGE    ;POSITION AT TOP OF PAGE
  331.     CALL    HEAD    ;PRINT HEADING
  332.     JMP    LOOP    ;CONTINUE IN MAIN LOOP
  333.  
  334.  
  335. ;**************************************************;
  336. ;
  337. ;        HEADING PRINT ROUTINE
  338. ;
  339. ;**************************************************;
  340.  
  341. HEAD:    LDA    NSWT    ;NO HEADING SWITCH
  342.     ORA    A    ;IF SET, NO HEADING
  343.     JNZ    HEADA
  344.     LXI    H,FMSG    ;POINT TO MESSAGE
  345.     CALL    PSTRNG    ;PRINT STRING
  346.     LXI    H,TFCB+1;POINT TO NAME
  347.     MVI    B,8    ;SIZE OF NAME
  348.     CALL    PCNT    ;PRINT COUNT
  349.     MVI    A,SPACE    ;PRINT A SPACE
  350.     CALL    PBYT
  351.     LXI    H,TFCB+9;POINT TO TYPE
  352.     MVI    B,03    ;SIZE OF TYPE
  353.     CALL    PCNT    ;PRINT COUNT
  354.     LXI    H,PMSG    ;POINT TO MESSAGE
  355.     CALL    PSTRNG    ;PRINT STRING
  356.     LDA    PAGE    ;GET PAGE NUMBER
  357.     INR    A    ;BUMP IT
  358.     STA    PAGE    ;SAVE IT
  359.     CALL    DEC    ;CONVERT TO DECIMAL
  360.     LXI    H,DECWRK;POINT TO DEC STRING
  361.     MVI    B,3
  362.     CALL    PCNT    ;PRINT PAGE NUMBER
  363.     MVI    A,CR    ;PRINT CR
  364.     CALL    PBYT
  365.     MVI    A,LF
  366.     CALL    PBYT    ;PRINT LF
  367.     MVI    A,LF
  368.     CALL    PBYT    ;AND SECOND
  369.     MVI    A,LF
  370.     CALL    PBYT    ;AND A THIRD
  371.     MVI    A,3    ;SET NUMBER OF LINES PRINTED
  372.     JMP    HEADB
  373. HEADA:    XRA    A
  374. HEADB:    STA    LINE    ;RESET LINE COUNT
  375.     XRA    A    ;RESET COLUMN
  376.     STA    COL    ;RESET COLUMN
  377.     RET
  378.  
  379. ;**************************************************;
  380. ;
  381. ;        CHARACTER PRINT ROUTINE
  382. ;
  383. ;**************************************************;
  384.  
  385. PBYT:    PUSH    H
  386.     PUSH    B
  387.     PUSH    PSW
  388.     IF    NOT DIABLO
  389.     MOV    E,A
  390.     MVI    C,ODEV
  391.     CALL    CPM    ;PRINT
  392.     ENDIF
  393.     IF    DIABLO
  394.     CALL    DDVR
  395.     ENDIF
  396.     POP    PSW
  397.     CPI    SPACE    ;NON-PRINTING?
  398.     JC    PBY2    ;YES, DONT BUMP COL
  399.     LXI    H,COL    ;INCREMENT COLUMN
  400.     INR    M
  401. PBY2:    MVI    C,11    ;GET CONSOLE STATUS
  402.     CALL    CPM
  403.     CPI    00    ;BREAK?
  404.     JNZ    BOOT    ;YES, DONE
  405.     POP    B
  406.     POP    H
  407.     RET
  408.  
  409. ;**************************************************;
  410. ;
  411. ;        STRING PRINT ROUTINE
  412. ;
  413. ;**************************************************;
  414.  
  415. PSTRNG:    MOV    A,M    ;GET BYTE
  416.     CPI    '$'    ;STRING END?
  417.     RZ        ;YES, DONE
  418.     CALL    PBYT    ;PRINT BYTE
  419.     INX    H    ;BUMP POINTER
  420.     JMP    PSTRNG    ;LOOP
  421.  
  422. ;**************************************************;
  423. ;
  424. ;    STRING PRINT ROUTINE (COUNT IN B)
  425. ;
  426. ;**************************************************;
  427.  
  428. PCNT:    MOV    A,M    ;GET BYTE
  429.     CALL    PBYT    ;PRINT IT
  430.     INX    H    ;BUMP POINTER
  431.     DCR    B    ;DECREMENT COUNT
  432.     JNZ    PCNT
  433.     RET
  434.  
  435. ;**************************************************;
  436. ;
  437. ;        DECIMAL OUTPUT ROUTINE
  438. ;
  439. ;**************************************************;
  440.  
  441. DEC:    LXI    H,DECWRK
  442.     MVI    C,100
  443.     CALL    DIGIT
  444.     MVI    C,10
  445.     CALL    DIGIT
  446.     MVI    C,1
  447.     CALL    DIGIT
  448.     RET
  449.  
  450. DIGIT:    MVI    M,'0'
  451. DI0:    SUB    C
  452.     JM    DI1
  453.     INR    M
  454.     JMP    DI0
  455. DI1:    ADD    C
  456.     INX    H
  457.     RET
  458.  
  459.  
  460. ;**************************************************;
  461. ;
  462. ;        TOP OF PAGE ROUTINE
  463. ;
  464. ;**************************************************;
  465.  
  466.     IF    FORM AND (NOT DIABLO)
  467. TPAGE:    MVI    A,FF    ;ISSUE FORM FEED
  468.     CALL    PBYT
  469.     MVI    B,NULLS    ;NUMBER OF NULLS
  470. TPAGE2:    MVI    A,RUBOUT
  471.     CALL    PBYT
  472.     DCR    B    ;PRINT N RUBOUTS
  473.     JNZ    TPAGE2
  474.     RET
  475.     ENDIF
  476.  
  477.     IF    (NOT FORM) OR DIABLO
  478. TPAGE:    LXI    H,LINE    ;POINT TO CURRENT LINE
  479.     MVI    A,PAGSZ
  480.     SUB    M    ;LINES LEFT TO PRINT
  481.     MOV    B,A
  482. TLP2:    MVI    A,LF    ;<LF>
  483.     CALL    PBYT
  484.     DCR    B    ;DCREMENT COUNT
  485.     JNZ    TLP2    ;PRINT 'N' LINES TO PAGE TOP
  486.     CALL    PBYT    ;ONE MORE TO TOP OF PAGE
  487.     RET
  488.     ENDIF
  489.  
  490. ;**************************************************;
  491. ;
  492. ;        I/O ERROR MESSAGE ROUTINE
  493. ;
  494. ;**************************************************;
  495.  
  496. ERR:    LXI    D,ERMSG
  497.     MVI    C,09H    ;WRITE MSG
  498.     CALL    CPM
  499.     JMP    BOOT
  500.  
  501.  
  502. ;**************************************************;
  503. ;
  504. ;                F O P E N            
  505. ;        ROUTINE TO OPEN A DISK FILE
  506. ;                                       
  507. ;          INPUT:     DE=A(FCB)          
  508. ;         OUTPUT:     CARRY=ERROR        
  509. ;
  510. ;**************************************************;
  511.  
  512. FOPEN:    MVI    C,OPEN    ;OPEN CODE
  513.     CALL    CPM    ;ISSUE OPEN
  514.     CPI    0FFH    ;ERROR?
  515.     JZ    FOERR    ;YES
  516.     XRA    A    ;CLEAR CARRY
  517.     RET
  518. FOERR:    STC
  519.     RET
  520.  
  521.  
  522. ;**************************************************;
  523. ;
  524. ;                 G E T B T           
  525. ;         ROUTINE TO READ A BYTE       
  526. ;                                        
  527. ;          OUTPUTS:     A=BYTE           
  528. ;                       CARRY=ERROR      
  529. ;
  530. ;**************************************************;
  531.  
  532. GETBT:    LXI    H,TBUF+128
  533.     XCHG        ;BUFFER END ADDR. IN DE
  534.     LHLD    INPTR    ;CURRENT POINTER IN HL
  535.     CALL    CPHL    ;TEST FOR END OF BUFFER
  536.     JZ    GETB2    ;YES, READ
  537. GETB1:    MOV    A,M    ;GET BYTE
  538.     INX    H    ;BUMP POINTER
  539.     SHLD    INPTR    ;SAVE POINTER
  540.     ORA    A    ;RESET CARRY
  541.     RET
  542. GETB2:    MVI    C,READ    ;READ CODE
  543.     LXI    D,TFCB    ;FCB ADDRESS
  544.     CALL    CPM    ;ISSUE READ
  545.     CPI    00    ;ERROR?
  546.     JNZ    IERR    ;YES
  547.     LXI    H,TBUF    ;RESET BUFFER POINTER
  548.     SHLD    INPTR
  549.     JMP    GETB1    ;CONTINUE
  550. IERR:    STC
  551.     RET
  552.  
  553. ;**************************************************;
  554. ;
  555. ;        MISCELLANEOUS SUBROUTINES
  556. ;
  557. ;**************************************************;
  558.  
  559. ;**************************************************;
  560. ;
  561. ;            C P H L
  562. ;           COMPARE HL VS DE
  563. ;
  564. ;**************************************************;
  565.  
  566. CPHL:    MOV    A,H
  567.     CMP    D
  568.     RNZ
  569.     MOV    A,L
  570.     CMP    E
  571.     RET
  572.  
  573.  
  574. ;**************************************************;
  575. ;
  576. ;    DIABLO DRIVER FOR N.Y. INTERFACE BOARD
  577. ;       WITH HI SPEED TABBING FUNCTION
  578. ;
  579. ;**************************************************;
  580.  
  581.     IF    DIABLO
  582. DDVR:    PUSH    PSW    ;SAVE PSW
  583.     PUSH    B    ;SAVE BC
  584.     PUSH    D    ;SAVE DE
  585.     PUSH    H    ;SAVE HL
  586.     CPI    0DH    ;CR?    
  587.     JZ    PCR    ;YES    
  588.     CPI    0AH    ;LINE FEED?
  589.     JZ    PLF    ;YES
  590.     CPI    08H    ;BACKSPACE?
  591.     JZ    PBS    ;YES
  592.     CPI    20H    ;OTHER CONTROL?
  593.     JC    DXIT    ;YES, IGNORE
  594.     JZ    PSP    ;SPACE    
  595.     CPI    7FH
  596.     JC    PCH    ;CONTINUE IF ASCII
  597. DXIT:    POP    H
  598.     POP    D
  599.     POP    B
  600.     POP    PSW    ;EXIT TO CALLER
  601.     RET
  602.  
  603. PCH:    PUSH    PSW    ;SAVE CHAR
  604.     CALL    CKMOV    ;TEST FOR SAVED MOVE
  605.     POP    PSW    ;RESTORE CHAR
  606.     STA    DLOW    ;SAVE CHAR
  607.     MVI    A,0
  608.     STA    DHIGH    ;CLEAR DATA HIGH
  609.     MVI    B,CHRDY    ;TEST FOR CHAR READY
  610.     CALL    CKSTT    ;CALL STATUS CHECK
  611.     CALL    OUT16    ;OUTPUT 16 BITS TO DIABLO
  612.     OUT    CHSTB    ;OUTPUT CHARACTER STROBE
  613.     OUT    CHSTB    ;AND AGAIN FOR Z-80
  614.     JMP    PSP
  615. PCR:    LHLD    CLOC    ;GET CURRENT LOCATION
  616.     MOV    A,H
  617.     ORI    04H    ;SET REVERSE DIRECTION BIT
  618.     MOV    H,A    ;SET DIRECTION
  619.     CALL    CMOVE    ;RETURN CARRIAGE
  620.     LXI    H,0000    ;ZERO CLOC
  621.     SHLD    CLOC
  622.     SHLD    SPCNT    ;ZERO SPACE COUNT
  623.     JMP    DXIT    ;EXIT TO CALLER
  624. PLF:    CALL    CKMOV    ;CHECK FOR PREVIOUS MOVE
  625.     LHLD    LININC    ;GET LINE INCREMENTS
  626.     CALL    PMOVE
  627.     JMP    DXIT    ;RETURN TO CALLER
  628. PSP:    LHLD    SPCNT    ;GET SPACE COUNT
  629.     XCHG        ;INTO DE
  630.     LHLD    CHRINC    ;GET CHARACTER INCREMENT
  631.     DAD    D    ;ADD TO CURRENT SPACE COUNT
  632.     SHLD    SPCNT    ;SAVE IT
  633.     JMP    DXIT    ;DONE
  634. PBS:    CALL    CKMOV    ;CHECK FOR PREVIOUS MOVE
  635.     LHLD    CLOC    ;CURRENT LOCATION
  636.     XCHG
  637.     LHLD    CHRINC    ;GET SINGLE CHARACTER SIZE
  638.     XCHG
  639.     CALL    CPHL
  640.     JC    DXIT    ;IF CLOC<CHRINC IGNORE BACKSPACE
  641. PBS2:    LHLD    CHRINC
  642.     MOV    A,H
  643.     ORI    04H    ;SET REVERSE DIRECTION
  644.     MOV    H,A
  645.     CALL    CMOVE    ;MOVE CARRIAGE
  646.     LHLD    CHRINC    ;CHARACTER INCREMENT
  647.     XCHG
  648.     LHLD    CLOC    ;CURRENT LOCATION
  649.     MOV    A,L
  650.     SUB    E    ;SUBTRACT CHRINC FROM CLOC
  651.     MOV    L,A
  652.     MOV    A,H
  653.     SBB    D
  654.     MOV    H,A
  655.     SHLD    CLOC
  656.     JMP    DXIT
  657.  
  658.  
  659. CKMOV:    LHLD    SPCNT    ;TEST FOR NON ZERO SPACE COUNT
  660.     MOV    A,H
  661.     ORA    L
  662.     RZ        ;ZERO, IGNORE
  663.     CALL    CMOVE    ;NON ZERO, MOVE CARRIAGE
  664.     LHLD    SPCNT
  665.     XCHG
  666.     LHLD    CLOC
  667.     DAD    D
  668.     SHLD    CLOC    ;UPDATE CARRIAGE LOCATION
  669.     LXI    H,0000
  670.     SHLD    SPCNT    ;ZERO THE SPACE COUNT
  671.     RET
  672.  
  673.  
  674. CKSTT:    IN    DSTAT    ;GET DIABLO STATUS
  675.     CMA
  676.     ANA    B    ;TEST STATUS
  677.     JZ    CKSTT    ;LOOP TILL READY
  678.     RET
  679.  
  680. CMOVE:    SHLD    DLOW    ;SAVE DATA
  681.     MVI    B,CMRDY
  682.     CALL    CKSTT
  683.     CALL    OUT16    ;SEND 16 BITS TO DIABLO
  684.     OUT    CMSTB    ;CARRIAGE MOVEMENT STROBE
  685.     RET
  686.  
  687. PMOVE:    SHLD    DLOW
  688.     MVI    B,PMRDY    ;TEST PAPER MOVEMENT STATUS
  689.     CALL    CKSTT
  690.     CALL    OUT16    ;OUTPUT 16 BITS TO DIABLO
  691.     OUT    PMSTB    ;PAPER MOVEMENT STROBE
  692.     RET
  693. OUT16:    LDA    DLOW    ;GET LOW ORDER DATA BYTE
  694.     RAL        ;ROTATE TO POSITION BITS
  695.     OUT    DALOW    ;OUTPUT TO DATA LOW PORT
  696.     OUT    DALOW    ;AND AGAIN
  697.     LDA    DHIGH    ;GET HIGH ORDER BYTE
  698.     RAL        ;ROTATE
  699.     OUT    DAHIGH
  700.     OUT    DAHIGH    ;AND AGAIN
  701.     RET
  702.  
  703. RSTR:    OUT    RSSTB    ;OUTPUT TO RESTORE STROBE
  704.     LXI    H,0000
  705.     SHLD    CLOC    ;ZERO CURRENT CARRIAGE LOC
  706.     SHLD    SPCNT    ;ZERO SPACE COUNTER
  707.     RET
  708.  
  709. DLOW:    DB    0
  710. DHIGH:    DB    0
  711. CLOC:    DW    0000
  712. SPCNT:    DW    0000
  713. CHRINC:    DW    0006        ;TEN PITCH
  714. LININC:    DW    0008        ;6 LINES PER INCH
  715.  
  716. DSTAT:    EQU    20H
  717. DALOW:    EQU    20H
  718. DAHIGH:    EQU    21H
  719. CHSTB    EQU    22H
  720. CMSTB    EQU    23H
  721. PMSTB    EQU    24H
  722. RSSTB:    EQU    25H
  723.  
  724. CHRDY    EQU    01H
  725. CMRDY    EQU    02H
  726. PMRDY    EQU    04H
  727.     ENDIF
  728.  
  729. ;**************************************************;
  730. ;
  731. ;            D  A  T  A
  732. ;
  733. ;**************************************************;
  734.  
  735. NSWT:    DB    00    ;NO HEADING SWITCH
  736. CSWT:    DB    00    ;NO PAGINATION SWITCH
  737.  
  738. INPTR:    DW    TBUF+128    ;INPUT POINTER
  739. DECWRK:    DB    '000'    ;DECIMAL WORK AREA
  740. COL:    DB    0    ;COLUMN COUNTER
  741. LINE:    DB    0    ;LINE COUNTER
  742. PAGE:    DB    0    ;PAGE COUNTER
  743.  
  744. FMSG:    DB    CR,'FILE: $'
  745. PMSG:    DB    '                 PAGE $'
  746. PERMSG:    DB    'PARAMETER ERROR',0DH,0AH,'$'
  747. ERMSG:    DB    'ERROR',0DH,0AH,'$'
  748.  
  749. PARMS:    DS    16    ;PARAMETER STORAGE AREA
  750.  
  751. ;**************************************************;
  752. ;
  753. ;        PARAMETER PROCESSING TABLE
  754. ;
  755. ;        ENTRIES ARE 3 BYTES WIDE
  756. ;
  757. ;        BYTE 1 = PARAMETER BYTE
  758. ;
  759. ;        BYTES 2,3 = ROUTINE ADDRESS
  760. ;
  761. ;**************************************************;
  762.  
  763. PTAB:    DB    'N'
  764.     DW    NPARM
  765.     DB    'C'
  766.     DW    CPARM
  767.     DB    '0'
  768.     DW    TENP
  769.     DB    '2'
  770.     DW    TWELVEP
  771. PTABS    EQU    ($-PTAB)/3
  772.  
  773.  
  774.     DS    32
  775. STACK    EQU    $
  776.     END    PRINT
  777.