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 / ENTERPRS / CPM / TERMS / QTPATCH.ARC / QT-KPRO.Z < prev    next >
Text File  |  1989-09-08  |  8KB  |  280 lines

  1. ; QTERM Version 4.x Patch Area
  2.  
  3. ; This is a ZSM version of the more generic QTERMPAT.AZM generated by
  4. ; D. Presberg & D. Goodenough
  5.  
  6. ; Code as adapted from QTERM.COM from QTERM33A.LBR posted by David Goodenough
  7. ;  to BOSKUG RCP/M circa 12/27/88, and QTERM Vers. 4.x patch listing 8-Feb-89.
  8.  
  9. ; D. Presberg dissasembled this with Z8E, 21-Jan-89.  Code labels taken from
  10. ;  D. Goodenough "qterm.z" example circa 8-Feb-89.
  11.  
  12. ; This edit is for Kaypro-II and -4 ('83 version without graphics).  Kaypro
  13. ;  (and Xerox BB-I) use an SIO chip, port A, with a separate baud rate
  14. ;  generator:  status port at 04, data port at 06, baud rate port at 0.
  15. ;  15-Feb-89, D. Presberg, BCS/BOSKUG.
  16.  
  17. ; D. Goodenough added break, dtr and mode stuff  2-23-89
  18.  
  19. .var    sioc    6        ; sio control port
  20. .var    siod    4        ; sio data port
  21.  
  22. .var    rxrdy    1        ; receiver ready
  23. .var    txrdy    4        ; transmitter ready
  24.  
  25. .var    baud    0        ; baud rate port
  26.  
  27. .var    yes    0xff        ; true value
  28. .var    no    0        ; false value
  29.  
  30.  
  31. .org    0x0110
  32. modist:    in    a,(sioc)    ;get modem input status  (Kaypro status port)
  33.     and    rxrdy        ; (result to Z:   no inp. character available
  34.     ret            ;   is 0 at bit-0 (low order) ===>   Z==1    )
  35.  
  36. .org    0x0120
  37. modin:    in    a,(siod)    ;read modem input character (Kaypro data port)
  38.     ret
  39.  
  40. .org    0x0130
  41. modost:    in    a,(sioc)    ;get modem output status  (Kaypro status port)
  42.     and    txrdy        ; (result to Z:  bit-2 ... see above)
  43.     ret
  44.  
  45. .org    0x0140
  46. modout:    out    (siod),a    ;write modem output char. (Kaypro data port)
  47.     ret
  48.  
  49. .org    0x0150
  50. sbreak:    ld    a,(setf)    ;start "break"
  51.     or    a        ;do we have valid data in r3,r4,r5
  52.     ret    z        ;no - don't do it
  53.     ld    hl,r5
  54.     set    4,(hl)        ; set the bit
  55.     jp    sioout        ; and go do it
  56.     
  57. .org    0x0160
  58. ebreak:    ld    a,(setf)    ;end "break"
  59.     or    a
  60.     ret    z        ; don't do it unless r3, r4, r5 are valid
  61.     ld    hl,r5
  62.     res    4,(hl)
  63.     jp    sioout        ; go clear the bit
  64.  
  65. .org    0x0170
  66. dtroff:    ld    a,(setf)    ;drop DTR
  67.     or    a
  68.     ret    z        ; don't do it unless r3, r4, r5 are valid
  69.     ld    hl,r5
  70.     res    7,(hl)
  71.     jp    sioout
  72.  
  73. .org    0x0180
  74. dtron:    ld    a,(setf)    ;raise DTR
  75.     or    a
  76.     ret    z        ; don't do it unless r3, r4, r5 are valid
  77.     ld    hl,r5
  78.     set    7,(hl)
  79.     jp    sioout
  80.  
  81. .org    0x0190
  82. setbd:    out    (baud),a    ;set baud rate (value in A) (Kaypro baud
  83.     ret            ;                rate port)
  84.  
  85. ; The Baud Rate Table has entries from 38400 baud down to 300 baud.
  86. ;   There are 2 bytes per entry.  The second byte determines if the entry is
  87. ;   enabled or disabled (ffh=enabled; 00=disabled).  The first byte is passed
  88. ;   as the A value to the setbd subroutine.
  89.  
  90. ; Kaypro-II/4 has advertised values for rates up to 19200.  Not all available
  91. ;   low speeds are used by QTERM, however.
  92.  
  93. .org    0x01a0
  94.  
  95. baudtb:
  96. b38400:    db    0,no        ;  38400 baud
  97. b19200:    db    0xf,yes        ;  19200
  98. b9600:    db    0xe,yes        ;   9600
  99. b4800:    db    0xc,yes        ;   4800
  100. b2400:    db    0xa,yes        ;   2400
  101. b1200:    db    7,yes        ;   1200
  102. b600:    db    6,yes        ;    600
  103. b300:    db    5,yes        ;    300 baud
  104.  
  105. ; (Kaypro goes down to 150, 134.5, 110, 75, and 50 baud, but QTERM doesn't.)
  106.  
  107. ;.org    0x01b0            ; don't need this - table above is 16 bytes
  108. setmod:    ld    (setf),a    ; flag we've done a set
  109.     jp    domod        ; have to do this elsewhere
  110.  
  111. ; Communication Mode Table.  Single byte values for 12 combinations of
  112. ;    number-of-bits(7/8), parity(none/even/odd), number-of-stop-bits(1/2).
  113.  
  114. .org    0x1c0
  115.  
  116. modetb:
  117. n17:    db    0b10000000    ;0x80, 7n1
  118. n18:    db    0b11000000    ;0xc0, 8n1
  119. n27:    db    0b10001000    ;0x88, 7n2
  120. n28:    db    0b11001000    ;0xc8, 8n2
  121. e17:    db    0b10000011    ;0x83, 7e1
  122. e18:    db    0b11000011    ;0xc3, 8e1
  123. e27:    db    0b10001011    ;0x8b, 7e2
  124. e28:    db    0b11001011    ;0xcb, 8e2
  125. o17:    db    0b10000001    ;0x81, 7o1
  126. o18:    db    0b11000001    ;0xc8, 8o1
  127. o27:    db    0b10001001    ;0x89, 7o2
  128. o28:    db    0b11001001    ;0xc9, 8o2
  129.  
  130. ;.org    0x01cc        ; don't need this - we're contiguous
  131. resrvd:    db    0    ; reserved for future use
  132.  
  133. ;.org    0x01cd
  134. xfersz:    db    8    ;number of K to read/write during file xfers
  135.             ;Must be 1 / 2 / 4 / 8.  Best left as 8 unless
  136.             ;  disk is verrrrry slow.  Drop to smaller value
  137.             ;  if too many timeouts occur during "protocol"
  138.             ;  file transfers (xmodem or kermit).
  139.  
  140. ;.org    0x01ce
  141. speed:    db    5    ;cpu speed (Mhz; use 3 for 2.5)
  142.             ; (5Mhz Assumes Advent speedup kit in Kaypro.)
  143.  
  144. ;.org    0x01cf
  145. escape:    db    '\\' & 0x1f    ;escape character (1ch=^\  Control-Backslash)
  146.  
  147. ;.org    0x01d0
  148. signon:            ;signon message
  149.     db    'Kaypro-II/4 1983\0'
  150.  
  151. .org    0x01f0
  152. clrs:    db    'z' & 0x1f, 0    ;clear screen string (Control-Z)
  153.  
  154. .var    scrout    0x0109    ;(a routine to print to CON: the
  155.             ;   character in C)
  156. .var    decout    0x010c    ;(a routine to print to CON: a decimal value
  157.             ;   in HL.  Is available for VT100 and the like.)
  158.  
  159. .org    0x0200
  160. moveto:    push    hl    ;move cursor to position in HL (Row,Col)
  161.     ld    c,'\e'    ; lead-in with Esc (the ASCII one; not QTERM's)
  162.     call    scrout
  163.     ld    c,'='    ; 2nd lead-in is '='
  164.     call    scrout
  165.     pop    hl
  166.     push    hl
  167.     ld    a,h    ; row value (top row is 0.)
  168.     call    poff    ; add offset and send it to screen
  169.     pop    hl
  170.     ld    a,l    ; col value (leftmost col is 0.)
  171. poff:    add    a,' '    ; (adds 20h)
  172.     ld    c,a
  173.     jp    scrout    ; (scrout returns from 'moveto's call)
  174.  
  175. ; Terminal Capability Bits.  The eight bits stand for each of the following
  176. ;   strings.   They count from 01h=bright to 80h=clear-to-end-of-screen.
  177.  
  178. .var    b_brit    0b00000001    ; 0: bright (1.)    -- NOT mandatory
  179. .var    b_dim    0b00000010    ; 1: dim    (2.)    -- NOT mandatory
  180. .var    b_dlln    0b00000100    ; 2: delete line (4.)    -- important
  181. .var    b_inln    0b00001000    ; 3: insert line (8.)    -- important
  182. .var    b_dlch    0b00010000    ; 4: delete character (16.)-- unused by QTERM
  183. .var    b_inch    0b00100000    ; 5: insert character (32.)-- NOT mandatory
  184. .var    b_clel    0b01000000    ; 6: clear to end-of-line(64.) -- important
  185. .var    b_cles    0b10000000    ; 7: clear to end-of-screen(128.)-- important
  186.  
  187. .org    0x022f
  188. tcbits:    db    b_dlln + b_inln + b_clel + b_cles    ; capability bits
  189.  
  190. ; (Kaypro-II/4, non-graphics version, cannot do in-place insertion or deletion
  191. ;   of single characters:  it can only overwrite characters at the current
  192. ;   cursor position and move the cursor non-destructively, etc..  It can
  193. ;   do in-place insertion and deletion of lines, and its clear-to-end-of-
  194. ;   -screen and -line leaves the cursor as-is.  It also has clear-screen-and-
  195. ;   -home-the-cursor: see clrs, above.  It, of course, has no graphical screen
  196. ;   attributes, such as bright and dim.)
  197.  
  198. ;.org    0x0230
  199. brites:    db    0    ;bright string (none for '83 Kaypro)
  200.  
  201. .org    0x0238
  202. dims:    db    0    ;dim string    (none for '83 Kaypro)
  203.  
  204. .org    0x0240
  205. dlstr:    db    '\eR\0'    ;delete line
  206.  
  207. .org    0x0248
  208. ilstr:    db    '\eE\0'    ;insert line
  209.  
  210. .org    0x0250
  211. dcstr:    db    0    ;delete character (none for '83 Kaypro)
  212.  
  213. .org    0x0258
  214. icstr:    db    0    ;insert character (none for '83 Kaypro)
  215.  
  216. .org    0x0260
  217. ceol:    db    'x' & 0x1f, 0    ;clear to end of line (Control-X)
  218.  
  219. .org    0x0268
  220. ceos:    db    'w' & 0x1f, 0    ;clear to end-of-screen (Control-W)
  221.  
  222. ; Entry and Exit hooks.  These are provided to perform custom initialisation
  223. ; on startup and on exit from QTERM.  They are invoked before any use is made
  224. ; of the screen or the port hardware.
  225.  
  226. .org    0x0270
  227. entry:    jp    do_ent        ; entry hook (270h .. 272h)
  228.  
  229. ;.org    0x0273            ; exit hook  (273h .. 275h)    
  230. exit:    ret            ;   Kaypro-II/4 doesn't need anything.
  231.  
  232. ; Extra patch area if needed.  276h .. 2ffh
  233.  
  234. .org    0x0276
  235. patcha: 
  236.  
  237. do_ent:    ld    a,(b1200)    ; entry hook (from 270h)
  238.     call    setbd        ;   Kaypro-II/4 setup for 1200 baud
  239.     ld    a,(n18)        ; and 8n1 communications mode.
  240.     call    setmod
  241.     ret
  242.  
  243. domod:    ld    c,a        ; save byte in c
  244.     ld    hl,r3        ; look at byte for wr3
  245.     res    7,(hl)        ; turn off ms bit (Rx # bits / char)
  246.     add    a,a        ; move bit from 6 to 7 in a
  247.     and    0x80        ; mask off the rest
  248.     or    (hl)        ; or in the remainder
  249.     ld    (hl),a        ; and save it back
  250.     inc    hl
  251.     inc    hl        ; point hl at r4
  252.     ld    a,(hl)
  253.     and    0xf4        ; mask out bits we don't want
  254.     ld    b,a        ; save in b
  255.     ld    a,c        ; get set byte back
  256.     and    0x0b        ; get bits out of set byte that we want
  257.     or    b        ; or in the other bits
  258.     ld    (hl),a        ; and save it back
  259.     inc    hl
  260.     inc    hl        ; point hl at r5
  261.     ld    a,c
  262.     and    0x40        ; get the bit we want from c
  263.     res    6,(hl)        ; clear the bit in r5
  264.     or    (hl)
  265.     ld    (hl),a        ; put new composite value back
  266.  
  267. sioout:    ld    hl,siodat
  268.     ld    bc,6 * 256 + sioc
  269.     otir
  270.     ret
  271.  
  272. siodat:    db    3
  273. r3:    db    0b11000001    ; value for wr3 (0xc1)
  274.     db    4
  275. r4:    db    0b01000100    ; value for wr4 (0x44)
  276.     db    5
  277. r5:    db    0b11101010    ; value for wr5 (0xe5)
  278.  
  279. setf:    db    0        ; flag if we've done a set mode command
  280.