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 / ZSYS / ZNODE-12 / I / QT-XEROX.Z < prev    next >
Text File  |  2000-06-30  |  9KB  |  311 lines

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