home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol073 / diablo.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.7 KB  |  262 lines

  1. ;********************************************************
  2. ;*                            *
  3. ;*        BI-DIRECTIONAL PRINTING DRIVER         *
  4. ;*          FOR DIABLO 1620 OR SIMILAR        *
  5. ;*          DAISYWHEEL PRINTER            *
  6. ;*                            *
  7. ;********************************************************
  8. ;
  9. ;    VERSION:    1.00
  10. ;
  11. ;    DATE:        03/Mar/1980
  12. ;
  13. ;    HISTORY:    Modified for CP/M use 
  14. ;            from PTDOS program
  15. ;            originally published by PROTEUS
  16. ;
  17. ;    Modifications by:
  18. ;            Bill Bolton
  19. ;            Software Tools
  20. ;            P.O. Box 80,
  21. ;            Newport Beach,
  22. ;            NSW, 2106,
  23. ;            Australia
  24. ;
  25. NULL    EQU    000H        ;ASCII NULL
  26. DEL    EQU    07FH        ;ASCII DELETE
  27. CR    EQU    00DH        ;ASCII CARRIAGE RETURN
  28. LF    EQU    00AH        ;ASCII LINE FEED
  29. FF    EQU    00CH        ;ASCII FORM FEED
  30. ESC    EQU    01BH        ;ASCII ESCAPE
  31. HTAB    EQU    009H        ;ASCII HORIZONTAL TAB
  32. SPACE    EQU    020H        ;ASCII ' '
  33. BACKSP    EQU    008H        ;ASCII BACKSPACE
  34. ACK    EQU    006H        ;ASCII ACKNOWLEDGE
  35. ETX    EQU    003H        ;ASCII END OF TEXT
  36. STPORT    EQU    003H        ;HORIZON 1ST SERIAL STATUS
  37. DPORT    EQU    STPORT-1    ;HORIZON 1ST SERIAL DATA
  38. OUTMASK    EQU    001H        ;OUTPUT STATUS MASK
  39. INMASK    EQU    002H        ;INPUT STATUS MASK
  40. COUNT    EQU    150        ;DIABLO BUFFER LENGTH
  41. ;
  42.     ORG    0F200H        ;Or wherever suits
  43. ;
  44. PROCESS:
  45.     MOV    A,C
  46.     CPI    CR        ;CARRIAGE RETURN ?
  47.     JZ    PRINT        ;YES, PRINT OUT THE BUFFER
  48.     CPI    LF        ;LINE FEED ?
  49.     JZ    PUTC        ;YES, SEND IT
  50.     CPI    FF        ;FORM FEED ?
  51.     JZ    PUTC        ;YES, SEND IT
  52.     CPI    DEL        ;DELETE ?
  53.     RZ            ;YES, IGNORE IT
  54.     CPI    NULL        ;NULL ?
  55.     RZ            ;IGNORE IT
  56. ;
  57. PRO2:
  58.     LDA    EOLINE        ;INCREMENT END OF LINE
  59.     INR    A
  60.     STA    EOLINE
  61.     LHLD    TXTPT        ;GET TEXT POINTER
  62.     MOV    M,C        ;CHARACTER WAS IN C
  63.     INX    H        ;BUMP POINTER
  64.     MVI    M,0        ;BUFFER END MARK IS 0
  65.     SHLD    TXTPT        ;STORE POINTER
  66.     RET
  67. ;
  68. ;*    This routine strips leading and lagging blanks from
  69. ;*    the buffer before sending the buffer out to the printer.
  70. ;
  71. ;*    Strip the leading blanks
  72. ;
  73. PRINT:
  74.     LXI    H,BUFFER+1    ;POINT TO 1ST CHARACTER POSITION
  75.     MVI    D,0        ;BLANKS COUNTER
  76.     MVI    A,SPACE        ;BLANK FOR COMPARISION
  77. P1:
  78.     CMP    M        ;BLANK ?
  79.     JNZ    P2        ;NO, STOP COUNTING
  80.     INR    D
  81.     INX    H
  82.     JMP    P1
  83. ;
  84. P2:
  85.     DCX    H        ;POINT TO CHAR-1
  86.     MVI    M,0        ;PUT IN A MARKER
  87.     MOV    A,D        ;GET BLANK COUNT
  88.     STA    BOLINE        ;AND SAVE IT
  89. ;
  90. ;*    Strip the lagging blanks
  91. ;
  92.     LHLD    TXTPT        ;POINT TO BUFFER END MARK
  93.     LDA    EOLINE        ;GET CHARACTER COUNT
  94.     MOV    D,A
  95.     MVI    A,SPACE        ;GET A SPACE
  96. ;
  97. P3:
  98.     DCX    H
  99.     DCR    D        ;BLANK COUNTER
  100.     CMP    M        ;IS IT A SPACE ?
  101.     JZ    P3        ;YES, KEEP COUNTING
  102. ;
  103. P4:
  104.     INX    H        ;NO, BACK UP THE POINTER
  105.     MVI    M,0        ;STORE END MARKER
  106.     MOV    A,D
  107.     STA    EOLINE        ;STORE NEW COUNT
  108.     SHLD    TXTPT        ;STORE NEW BUFER END
  109. ;
  110. ;*    Calculate the most efficient direction to print
  111. ;*    (logic seeking).
  112. DRCTN:
  113.     LDA    HDPOS        ;GET PRINT HEAD POSITION
  114.     PUSH    PSW        ;SAVE IT
  115.     LXI    H,BOLINE    ;POINT TO BEGINNING OF LINE
  116.     SUB    M        ;FIND THE DIFFERENCE
  117.     CM    ABSVAL        ;TAKE THE ABSOLUTE VALUE
  118.     MOV    B,A        ;SAVE IT IN B
  119.     INX    H        ;GET THE END OF LINE
  120.     POP    PSW        ;GET HEAD POSITION
  121.     SUB    M        ;FIND THE DIFFERENCE
  122.     CM    ABSVAL        ;TAKE THE ABSOLUTE VALUE
  123.     SUB    B        ;COMPARE DISTANCE TO BOL AND EOL
  124.     JP    MFWRD        ;IF PLUS FORWARD IS FASTER
  125. ;
  126. ;*    Print backwards
  127. ;
  128. MBWRD:
  129.     MVI    D,'6'        ;DIABLO BACKWARD PRINT CODE
  130.     LDA    EOLINE        ;GET END OF LINE
  131.     CALL    ALIGN        ;PROCESS THE DATA
  132.     LDA    BOLINE        ;POSITION OF 1ST BUFFER CHARACTER
  133.     ORA    A        ;IS IT THE ZERO POSITION
  134.     JZ    MB2        ;YES, CANT TAB LEFT OF MARGIN
  135.     DCR    A
  136. ;
  137. MB2:
  138.     STA    HDPOS        ;UPDATE HEAD POSITION
  139.     LXI    D,-1
  140.     LHLD    TXTPT        ;POINT TO END OF BUFFER
  141.     JMP    PRLINE        ;PRINT THE BUFFER
  142. ;
  143. ;*    Print forwards
  144. ;
  145. MFWRD:
  146.     MVI    D,'5'        ;DIABLO FORWARD PRINT CODE
  147.     LDA    BOLINE        ;GET BEGINNING OF LINE
  148.     CALL    ALIGN
  149.     LDA    EOLINE        ;GET LAST CHARACTER POSITION
  150.     INR    A
  151.     STA    HDPOS        ;SAVE NEW HEAD POSITION
  152.     LXI    H,BUFFER    ;POINT TO BUFFER START
  153.     LDA    BOLINE        ;COMPUTE POSITION OF 1ST NON BLANK
  154.     MVI    D,0
  155.     MOV    E,A
  156.     DAD    D
  157.     LXI    D,1        ;SET UP TO READ BUFFER FORWARD
  158. ;
  159. ;*    Print the buffer
  160. ;
  161. PRLINE:
  162.     DAD    D        ;BUMP    HL
  163.     MOV    A,M        ;MOVE CHARACTER IN BUFFER TO A
  164.     ORA    A        ;END OF BUFFER ?
  165.     JZ    CLRBUF        ;YES, GO CLEAN UP
  166.     CALL    PUTC        ;PRINT THE CHARACTER
  167.     JMP    PRLINE
  168. ;
  169. ;*        Align the Print Head to the correct position
  170. ;*        to start printing
  171. ;
  172. ;*        NOTE: The diablo 1610/1620 can only do an
  173. ;*        "absolute tab" to the first 126 character
  174. ;*        positions.
  175. ;
  176. ;*        D = Direction of printing
  177. ;*        A = BOLINE or EOLINE
  178. ;
  179. ALIGN:
  180.     MOV    E,A        ;SAVE BOLINE/EOLINE
  181.     MVI    A,ESC        ;GET "COMMAND" CODE
  182.     CALL    PUTC        ;SEND IT
  183.     MOV    A,D        ;GET THE DIRECTION CODE
  184.     CALL    PUTC        ;SEND IT
  185. ;
  186.     MVI    A,ESC        ;GET "COMMAND" CODE
  187.     CALL    PUTC        ;SEND IT
  188.     MVI    A,HTAB        ;GET ABSOLUTE TAB CODE
  189.     CALL    PUTC        ;SEND IT
  190.     MOV    A,E        ;GET LOCATION TO TAB TO
  191.     ADI    1        ;ADD TO SATISFY DIABLO
  192.     JMP    PUTC        ;SEND IT AND RETURN
  193. ;
  194. CLRBUF:
  195.     LXI    H,BUFFER+1    ;CLEAR BUFFER
  196.     SHLD    TXTPT
  197.     XRA    A
  198.     STA    EOLINE        ;RESET COUNTERS
  199.     STA    BOLINE
  200.     STA    BUFFER+1
  201.     RET
  202. ;
  203. ABSVAL:
  204.     CMA            ;TAKE THE ABSOLUTE VALUE
  205.     INR    A
  206.     RET
  207. ;
  208. PUTC:
  209.     MOV    C,A
  210.     CALL    OUTPUT        ;SEND THE CHARACTER
  211.     CPI    ESC        ;WAS IT AN ESCAPE?
  212.     JZ    ESCSEQ        ;YES, NEEDS SPECIAL TREATMENT
  213.     LDA    OUTCNT        ;CHARS SENT SINCE O/P COUNT RESET
  214.     DCR    A
  215. STORE:
  216.     STA    OUTCNT        ;SAVE UPDATED COUNT
  217.     RNZ            ;NO, RETURN
  218.     MVI    A,COUNT        ;SET COUNT
  219.     STA    OUTCNT
  220.     MVI    C,ETX        ;YES, GET ETX
  221.     CALL    OUTPUT        ;SEND IT
  222. ACKLOOP:
  223.     CALL    INPUT        ;GET CHARACTER FROM PRINTER
  224.     CPI    ACK        ;DIABLO SENDS ACK WHEN IT GETS ETX
  225.                 ;FROM ITS CHARACTER BUFFER
  226.     JNZ    ACKLOOP        ;NOT FOUND, KEEP LOOKING
  227.     RET
  228. ;
  229. ESCSEQ:
  230.     LDA    OUTCNT        ;GET OUTPUT COUNT
  231.     ADI    2        ;MAKE SURE NEXT TWO CHARS,
  232.     JMP    STORE        ;GET SENT BEFORE ETX
  233. ;
  234. OUTPUT:
  235.     IN    STPORT        ;1ST SERIAL PORT
  236.     ANI    OUTMASK
  237.     JZ    OUTPUT
  238.     MOV    A,C
  239.     OUT    DPORT
  240.     RET
  241. ;
  242. INPUT:
  243.     IN    STPORT
  244.     ANI    INMASK
  245.     JZ    INPUT
  246.     IN    DPORT
  247.     ANI    07FH
  248.     RET
  249. ;
  250. ;
  251. HDPOS    DB    0        ;CURRENT HEAD POSITION
  252. BOLINE    DB    0        ;BEGINNING OF LINE POINTER
  253. EOLINE    DB    0        ;END OF LINE POINTER
  254. TXTPT    DW    BUFFER+1    ;BUFFER POINTER
  255. OUTCNT    DB    COUNT        ;CHARACTERS SENT TO PRINTER
  256. ;
  257. BUFFER    DW    0000H
  258.     DS    160        ;CHARACTER BUFFER
  259. ;
  260.     END    PROCESS
  261.