home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol021 / diablo.z80 < prev    next >
Encoding:
Text File  |  1984-04-29  |  4.3 KB  |  282 lines

  1.  
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;
  4. ;        DIABLO DRIVER
  5. ;
  6. ;  This driver was donated by RICH LERSETH of
  7. ;    LEPAC SERVICES
  8. ;    8245 MEDITERRANEAN WAY
  9. ;    Sacramento,Ca
  10. ;    95826
  11. ;    916-381-1717        August 1980
  12. ;
  13. ;    This DIABLO driver is a 1200 baud buffered package
  14. ;    that allows the host to spool with minimum quequing.
  15. ;    It uses half the diablo buffer (79 bytes) and an
  16. ;    internal buffer (79 bytes) to guarentee no over run.
  17. ;    The driver accepts data from the host and puts it into
  18. ;    its internal buffer. It then checks to see if the diablo
  19. ;    is ready to accept data from the driver's buffer. If not
  20. ;    then it immediately returns to the host. Otherwise, it
  21. ;    sends one byte to the diablo then returns to the host.
  22. ;    When the driver senses that its internal buffer is full
  23. ;    it will take time out and wait until the diablo is ready 
  24. ;    to accept the remainder of the internal buffer (wait for
  25. ;    an ACK to come back) It will then dump the remainder of
  26. ;    the buffer and send a ETX).
  27. ;    At any time the driver encounters a CR or LF it will
  28. ;    also dump the buffer and send a ETX.
  29. ;
  30. ;    DIABLO PRINTER PARAMETERS
  31. ;    (set up for SD SYSTEMS 100)
  32.     ORG    0DF00H
  33. ;
  34. SIPORT    EQU    7DH
  35. SOPORT    EQU    7DH
  36. DIPORT    EQU    7CH
  37. DOPORT    EQU    7CH
  38. SIMASK    EQU    01H
  39. SOMASK    EQU    02H
  40. BUFFSZ    EQU    79
  41. ;
  42. ;
  43. ;    DIABLO LIST STATUS
  44. ;
  45. LISTST:    CALL WAITST
  46.     JR    Z,LB1        ;READY
  47.     CALL    INSTAT
  48.     JR    Z,LB2        ;NOT READY
  49.     CALL    INPUT
  50.     CP    6
  51.     JR    NZ,LB2        ;NOT READY
  52.     XOR    A
  53.     LD    (WFLAG),A
  54. ;
  55. ;    READY
  56. ;
  57. LB1:    LD    A,-1
  58.     RET
  59. ;
  60. ;    NOT READY
  61. ;
  62. LB2:    XOR    A
  63.     RET
  64. ;
  65. ;    LIST DEVICE
  66. ;
  67. LIST:
  68. ;
  69. ;    INPUT A BYTE INTO THE BUFFER, CHECK IF ESC OR ETX
  70. ;    SEQUENCE IS SENT
  71. ;
  72.         CALL     LISTST        ;CLEAR WAIT STATE IF TIME OUT.
  73.         LD    A,C
  74.     LD    HL,(NBYTES)
  75.     INC    HL
  76.     LD    (NBYTES),HL
  77.     EX    DE,HL
  78.     LD    HL,BLOCK-1
  79.     ADD    HL,DE
  80.     LD    (HL),A
  81.     LD    A,(EFLAG2)    ;END OF 3 BYTE ESC SEQ?
  82.     OR    A
  83.     JR    NZ,IB1
  84.     LD    A,(EFLAG1)    ;SECOND BYTE OF ESC SEQ?
  85.     OR    A
  86.     JR    NZ,IB3
  87.     LD    A,27        ;START OF ESC SEQ?
  88.     CP    (HL)
  89.     JR    Z,IB4
  90.     LD    A,3        ;START OF ETX SEQ?
  91.     CP    (HL)
  92.     JR    NZ,IB6
  93.     DEC    DE
  94.     EX    DE,HL
  95.     LD    (NBYTES),HL
  96.     JR    OUTBLK
  97. ;
  98. IB3:    LD    A,9        ;CK FOR THE FOUR 3-B ESC
  99.     CP    (HL)
  100.     JR    Z,IB5
  101.     LD    A,11
  102.     CP    (HL)
  103.     JR    Z,IB5
  104.     LD    A,30
  105.     CP    (HL)
  106.     JR    Z,IB5
  107.     LD    A,31
  108.     CP    (HL)
  109.     JR    Z,IB5
  110.     JR    IB1
  111. ;
  112. IB4:    LD    A,-1
  113.     LD    (EFLAG1),A
  114.     RET
  115. ;
  116. IB5:    LD    A,-1
  117.     LD    (EFLAG2),A
  118.     RET
  119. ;
  120. IB1:    XOR    A
  121.     LD    (EFLAG1),A
  122.     LD    (EFLAG2),A
  123. ;
  124. IB6:    LD    A,0AH        ;CK LN FD
  125.     CP    (HL)
  126.     JR    NZ,IB6A
  127.     LD    (LFCK),A
  128.     JR    OUTBLK
  129. ;
  130. IB6A:    LD    A,0DH
  131.     CP    (HL)
  132.     JR    NZ,IB6B
  133.     LD    A,(LFCK)    ;CK RETURN IF NOT LINE FEED BEFORE
  134.     OR    A
  135.     JR    Z,IB6C
  136.     XOR    A
  137.     LD    (LFCK),A
  138.     JR    OUTBLK
  139. ;
  140. IB6B:    XOR    A
  141.     LD    (LFCK),A
  142. IB6C:    LD    A,BUFFSZ-3
  143.     CP    E
  144.     JR    C,OUTBLK
  145.     LD    A,(WFLAG)
  146.     OR    A
  147.     RET    NZ
  148.     CALL    OUSTAT
  149.     RET    Z
  150.     LD    HL,(JBYTES)
  151.     INC    HL
  152.     LD    (JBYTES),HL
  153.     EX    DE,HL
  154.     LD    HL,BLOCK-1
  155.     ADD    HL,DE
  156.     LD    C,(HL)
  157.     CALL    OUTPUT
  158.     RET
  159. ;
  160. ;    OUTPUT THE BLOCK
  161. ;
  162. OUTBLK:    LD    A,(WFLAG)
  163.     OR    A
  164.     JR    Z,OB1
  165.     CALL    WAIT
  166. OB1:    LD    HL,(JBYTES)
  167.     EX    DE,HL
  168.     LD    HL,(NBYTES)    ;SETUP TO DUMP THE BLOCK
  169.     XOR    A
  170.     SBC    HL,DE
  171.     LD    A,L
  172.     OR    H
  173.     JR    Z,DONE
  174.     PUSH    HL
  175.     LD    HL,BLOCK
  176.     ADD     HL,DE
  177.     POP    DE
  178. ;
  179. LOOP1:    CALL    OUSTAT
  180.     JR    Z,LOOP1
  181.     LD    C,(HL)
  182.     CALL    OUTPUT
  183.     INC    HL
  184.     DEC    DE
  185.     LD    A,D
  186.     OR    E
  187.     JR    NZ,LOOP1
  188. ;
  189. DONE:    LD    HL,0
  190.     LD    (NBYTES),HL
  191.     LD    (JBYTES),HL
  192.     DEC    HL
  193.     LD    (WTIME),HL
  194.     LD    A,-1
  195.     LD    (WFLAG),A
  196. ;
  197. ;    SEND OUT THE END OF TEXT CODE
  198. ;
  199. LOOPC:    CALL    INPUT
  200.     CALL    OUSTAT
  201.     JR    Z,LOOPC
  202.     LD    C,3
  203.     CALL    OUTPUT
  204.     RET
  205. ;
  206. ;    WAIT STATUS CHECK
  207. ;
  208. WAITST:    LD    A,(WFLAG)
  209.     OR    A
  210.     RET    Z
  211.     PUSH    HL
  212.     LD    HL,(WTIME)
  213.     LD    A,L
  214.     OR    H
  215.     JR    Z,WS1
  216.     DEC    HL
  217.     LD    (WTIME),HL
  218.     XOR    A
  219.     INC    A
  220.     RET
  221. WS1:    LD    (WFLAG),A
  222.     RET
  223. ;
  224. ;    WAIT UNTIL ACKNOWLEDGE COMES BACK
  225. ;
  226. WAIT:    LD    HL,0
  227. LOOP2:    DEC    HL
  228.     LD    A,L
  229.     OR    H
  230.     JR    Z,W1
  231.         CALL    INSTAT
  232.     JR    Z,LOOP2
  233.     CALL    INPUT
  234.     CP    6
  235.     JR    NZ,LOOP2
  236. W1:    XOR    A
  237.     LD    (WFLAG),A
  238.     RET
  239. ;
  240. ;    CHECK FOR STATUS OF OUTPUT
  241. ;
  242. ;
  243. OUSTAT:    IN    A,(SOPORT)
  244.     NOP            ;RES FOR COMPLEMENT
  245.     AND    SOMASK
  246.     RET
  247. ;
  248. ;    OUTPUT A CHARACTER
  249. ;
  250. OUTPUT:    LD    A,C
  251.     OUT    (DOPORT),A
  252.     RET
  253. ;
  254. ;    CHECK FOR STATUS OF INPUT
  255. ;
  256. INSTAT:    IN    A,(SIPORT)
  257.     NOP            ;RES FOR COMPLEMENT
  258.     AND    SIMASK
  259.     RET
  260. ;
  261. ;    INPUT A CHAR FROM THE PRINTER
  262. ;
  263. INPUT:    IN    A,(DIPORT)
  264.         AND     127
  265.     RET
  266. ;
  267. ;    DIABLO PRINTER PARAMETERS
  268. ;
  269. NBYTES:    DEFW    0000
  270. LFCK:    DEFB    00
  271. EFLAG1:    DEFB    00
  272. EFLAG2:    DEFB    00
  273. WFLAG:    DEFB    00
  274. WTIME:    DEFW    0000
  275. JBYTES:    DEFW    0000
  276. ;
  277. ;    PARAMETER AREA EXTERNAL TO CPM BIOS AREA
  278. ;
  279. ;    BUFFER AREA FOR DIABLO PRINTER
  280. ;
  281. BLOCK:    DS    80
  282.     END