home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol021 / tdiablo.mac < prev    next >
Text File  |  1984-04-29  |  5KB  |  327 lines

  1.     .z80
  2. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;
  4. ;        TDIABLO.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. ;
  16. ;    This version resides in the CP/M file DIABLO.COM that
  17. ;    will load in the diablo driver to a specified location
  18. ;    and modify the jump addresses of the BIOS for LIST and
  19. ;    LISTST pointed to indirectly by the location (0001H).
  20. ;
  21. ;    The driver uses half the diablo buffer (79 bytes) and an
  22. ;    internal buffer (79 bytes) to guarentee no over run.
  23. ;    The driver accepts data from the host and puts it into
  24. ;    its internal buffer. It then checks to see if the diablo
  25. ;    is ready to accept data from the driver's buffer. If not
  26. ;    then it immediately returns to the host. Otherwise, it
  27. ;    sends one byte to the diablo then returns to the host.
  28. ;    When the driver senses that its internal buffer is full
  29. ;    it will take time out and wait until the diablo is ready 
  30. ;    to accept the remainder of the internal buffer (wait for
  31. ;    an ACK to come back) It will then dump the remainder of
  32. ;    the buffer and send a ETX).
  33. ;    At any time the driver encounters a CR or LF it will
  34. ;    also dump the buffer and send a ETX.
  35. ;
  36. ;    DIABLO PRINTER PARAMETERS
  37. ;    (set up for TELETEK FDC-I version 3)
  38. ;
  39. LOADPT    EQU    0DE00H
  40. FDC    EQU    0E000H
  41. BUFFSZ    EQU    79
  42. ;
  43. ;
  44. ;    Loader for the driver
  45. ;
  46.     ENTRY    START
  47. START:    LD    HL,BEGIN
  48.     LD    DE,LOADPT
  49.     LD    BC,BACK-FRONT+1
  50.     LDIR
  51.     LD    HL,(1)
  52.     LD    L,10H
  53.     LD    BC,LOADPT
  54.     LD    (HL),C
  55.     INC    HL
  56.     LD    (HL),B
  57.     LD    L,2EH
  58.     LD    BC,LOADPT+3
  59.     LD    (HL),C
  60.     INC    HL
  61.     LD    (HL),B
  62. ;
  63. ;    Serial port B initialization, set to 1200 baud
  64. ;
  65.     LD    C,0BH
  66.     LD    DE,3
  67.     CALL    FDC+45H
  68. ;
  69. ;    RETURN TO CP/M
  70. ;
  71.     JP     0
  72. ;
  73. ;    DIABLO CODE
  74. ;
  75. BEGIN    EQU    $    
  76.     .PHASE    LOADPT
  77. ;
  78. ;    ENTRY    VECTORS
  79. ;
  80. FRONT:    JP    LIST
  81.     JP    LISTST
  82. ;
  83. ;**************************************************
  84. ;    FDC DEPENDENT CODE
  85. ;
  86. ;        CHECK FOR STATUS OF OUTPUT
  87. ;
  88. ;
  89. OUSTAT:    IN    A,(3)
  90.     AND    4
  91.     RET
  92. ;
  93. ;        OUTPUT A CHARACTER
  94. ;
  95. OUTPUT:    LD    A,C
  96.     OUT    (2),A
  97.     RET
  98. ;
  99. ;        CHECK FOR STATUS OF INPUT
  100. ;
  101. INSTAT:    JP    FDC+1EH
  102. ;
  103. ;        INPUT A CHAR FROM THE PRINTER
  104. ;
  105. INPUT:    CALL    FDC+0CH
  106.     AND    7FH
  107.     RET
  108. ;
  109. ;*******************************************************
  110. ;
  111. ;    DIABLO CODE
  112. ;
  113. ;        DIABLO LIST STATUS
  114. ;
  115. LISTST:    
  116.     LD    A,(WFLAG)
  117.     OR    A
  118.     JR    Z,LB1        ;READY
  119.     PUSH    HL
  120.     LD    HL,(WTIME)
  121.     LD    A,L
  122.     OR    H
  123.     JR    NZ,LB0
  124.     LD    (WFLAG),A
  125.     POP    HL
  126.     JR    LB1        ;READY
  127. LB0:    DEC    HL
  128.     LD    (WTIME),HL
  129.     POP     HL
  130.     CALL    INSTAT
  131.     JR    Z,LB2        ;NOT READY
  132.     CALL    INPUT
  133.     CP    6
  134.     JR    NZ,LB2        ;NOT READY
  135.     XOR    A
  136.     LD    (WFLAG),A
  137.     LD    (WTIME),A
  138.     LD    (WTIME+1),A
  139. ;
  140. ;    READY
  141. ;
  142. LB1:    LD    A,-1
  143.     RET
  144. ;
  145. ;    NOT READY
  146. ;
  147. LB2:    XOR    A
  148.     RET
  149. ;
  150. ;        LIST DEVICE
  151. ;
  152. LIST:
  153. ;
  154. ;    INPUT A BYTE INTO THE BUFFER, CHECK IF ESC OR ETX
  155. ;    SEQUENCE IS SENT
  156. ;
  157.         CALL     LISTST        ;CLEAR WAIT STATE IF TIMED OUT.
  158.         LD    A,C
  159.     LD    HL,(NBYTES)
  160.     INC    HL
  161.     LD    (NBYTES),HL
  162.     EX    DE,HL
  163.     LD    HL,BLOCK-1
  164.     ADD    HL,DE
  165.     LD    (HL),A
  166.     LD    A,(EFLAG2)    ;END OF 3 BYTE ESC SEQ?
  167.     OR    A
  168.     JR    NZ,IB1
  169.     LD    A,(EFLAG1)    ;SECOND BYTE OF ESC SEQ?
  170.     OR    A
  171.     JR    NZ,IB3
  172.     LD    A,27        ;START OF ESC SEQ?
  173.     CP    (HL)
  174.     JR    Z,IB4
  175.     LD    A,3        ;START OF ETX SEQ?
  176.     CP    (HL)
  177.     JR    NZ,IB6
  178.     DEC    DE
  179.     EX    DE,HL
  180.     LD    (NBYTES),HL
  181.     JR    OUTBLK
  182. ;
  183. IB3:    LD    A,9        ;CK FOR THE FOUR 3-B ESC
  184.     CP    (HL)
  185.     JR    Z,IB5
  186.     LD    A,11
  187.     CP    (HL)
  188.     JR    Z,IB5
  189.     LD    A,30
  190.     CP    (HL)
  191.     JR    Z,IB5
  192.     LD    A,31
  193.     CP    (HL)
  194.     JR    Z,IB5
  195.     JR    IB1
  196. ;
  197. IB4:    LD    A,-1
  198.     LD    (EFLAG1),A
  199.     RET
  200. ;
  201. IB5:    LD    A,-1
  202.     LD    (EFLAG2),A
  203.     RET
  204. ;
  205. IB1:    XOR    A
  206.     LD    (EFLAG1),A
  207.     LD    (EFLAG2),A
  208. ;
  209. IB6:    LD    A,0AH        ;CK LN FD
  210.     CP    (HL)
  211.     JR    NZ,IB6A
  212.     LD    (LFCK),A
  213.     JR    OUTBLK
  214. ;
  215. IB6A:    LD    A,0DH
  216.     CP    (HL)
  217.     JR    NZ,IB6B
  218.     LD    A,(LFCK)    ;CK RETURN IF NOT LINE FEED BEFORE
  219.     OR    A
  220.     JR    Z,IB6C
  221.     XOR    A
  222.     LD    (LFCK),A
  223.     JR    OUTBLK
  224. ;
  225. IB6B:    XOR    A
  226.     LD    (LFCK),A
  227. ;
  228. IB6C:    LD    A,BUFFSZ-3
  229.     CP    E
  230.     JR    C,OUTBLK
  231.     LD    A,(WFLAG)
  232.     OR    A
  233.     RET    NZ
  234.     CALL    OUSTAT
  235.     RET    Z
  236.     LD    HL,(JBYTES)
  237.     INC    HL
  238.     LD    (JBYTES),HL
  239.     EX    DE,HL
  240.     LD    HL,BLOCK-1
  241.     ADD    HL,DE
  242.     LD    C,(HL)
  243.     CALL    OUTPUT
  244.     RET
  245. ;
  246. ;    OUTPUT THE BLOCK
  247. ;
  248. OUTBLK:    LD    A,(WFLAG)
  249.     OR    A
  250.     CALL     NZ,WAIT
  251.     LD    HL,(JBYTES)
  252.     EX    DE,HL
  253.     LD    HL,(NBYTES)    ;SETUP TO DUMP THE BLOCK
  254.     XOR    A
  255.     SBC    HL,DE
  256.     LD    A,L
  257.     OR    H
  258.     JR    Z,DONE
  259.     PUSH    HL
  260.     LD    HL,BLOCK
  261.     ADD     HL,DE
  262.     POP    DE
  263. ;
  264. LOOP1:    CALL    OUSTAT
  265.     JR    Z,LOOP1
  266.     LD    C,(HL)
  267.     CALL    OUTPUT
  268.     INC    HL
  269.     DEC    DE
  270.     LD    A,D
  271.     OR    E
  272.     JR    NZ,LOOP1
  273. ;
  274. DONE:    LD    HL,0
  275.     LD    (NBYTES),HL
  276.     LD    (JBYTES),HL
  277.     DEC    HL
  278.     LD    (WTIME),HL
  279.     LD    A,-1
  280.     LD    (WFLAG),A
  281. ;
  282. ;    SEND OUT THE END OF TEXT CODE
  283. ;
  284. LOOPC:    CALL    OUSTAT
  285.     JR    Z,LOOPC
  286.     LD    C,3
  287.     CALL    OUTPUT
  288.     RET
  289. ;
  290. ;    WAIT UNTIL ACKNOWLEDGE COMES BACK
  291. ;
  292. WAIT:    LD    HL,(WTIME)
  293. LOOP2:    LD    A,L
  294.     OR    H
  295.     JR    Z,W1
  296.     DEC    HL
  297.     LD    (WTIME),HL
  298.         CALL    INSTAT
  299.     JR    Z,WAIT
  300.     CALL    INPUT
  301.     CP    6
  302.     JR    NZ,WAIT
  303.     XOR    A
  304. W1:    LD    (WFLAG),A
  305.     LD    (WTIME),A
  306.     LD    (WTIME+1),A
  307.     RET
  308. ;
  309. ;    DIABLO PRINTER PARAMETERS
  310. ;
  311. NBYTES:    DEFW    0000
  312. LFCK:    DEFB    00
  313. EFLAG1:    DEFB    00
  314. EFLAG2:    DEFB    00
  315. WFLAG:    DEFB    00
  316. WTIME:    DEFW    0000
  317. JBYTES:    DEFW    0000
  318. ;
  319. ;    PARAMETER AREA EXTERNAL TO CPM BIOS AREA
  320. ;
  321. ;    BUFFER AREA FOR DIABLO PRINTER
  322. ;
  323. BACK    EQU    $
  324. BLOCK:    DS    BUFFSZ+1
  325.     .DEPHASE
  326.     END START
  327.