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 >
Wrap
Text File
|
2000-06-30
|
9KB
|
311 lines
; QTERM Version 4.2 Patch Area.
; This is an example of the Xerox patch code. It is included because
; it uses a SIO for serial communications, and can be changed to work
; with any other SIO / DART system with very little work. All that is
; needed is to disable the baud rate code, modify the terminal depen-
; dancy stuff, and alter siod and sioc to match the port addresses of
; the SIO (data and control) as needed, and it should work.
; This should be assembled with ZSM (available on all fashionable BBS's)
; like this:
; A>ZSM QT-XEROX
; and installed with ZPATCH:
; A>ZPATCH QTERM QT-XEROX
;======================================================================
; This is a ZSM version of the more generic QTERMPAT.AZM generated by
; D. Presberg & D. Goodenough
; Code as adapted from QTERM.COM from QTERM33A.LBR posted by David Goodenough
; to BOSKUG RCP/M circa 12/27/88, and QTERM Vers. 4.x patch listing 8-Feb-89.
; D. Presberg dissasembled this with Z8E, 21-Jan-89. Code labels taken from
; D. Goodenough "qterm.z" example circa 8-Feb-89.
; This edit is for Xerox 820-II and 16/8. These use an SIO chip, port A, with a
;separate baud rate generator: status port at 04, data port at 06, baud rate
;port at 0.
; 19-Feb-90, T. Carney, BCS/BOSKUG.
; D. Goodenough added break, dtr and mode stuff 2-23-89
; D. Goodenough upgraded to V4.2 (larger patch area, and more functions)
.var sioc 6 ; sio control port
.var siod 4 ; sio data port
.var rxrdy 1 ; receiver ready
.var txrdy 4 ; transmitter ready
.var baud 0 ; baud rate port
.var yes 0xff ; true value
.var no 0 ; false value
.org 0x0110
modist: in a,(sioc) ;get modem input status (Xerox status port)
and rxrdy ; (result to Z: no inp. character available
ret ; is 0 at bit-0 (low order) ===> Z==1 )
.org 0x0120
modin: in a,(siod) ;read modem input character (Xerox data port)
ret
.org 0x0130
modost: in a,(sioc) ;get modem output status (Xerox status port)
and txrdy ; (result to Z: bit-2 ... see above)
ret
.org 0x0140
modout: out (siod),a ;write modem output char. (Xerox data port)
ret
.org 0x0150
sbreak: ld a,(setf) ;start "break"
or a ;do we have valid data in r3,r4,r5
ret z ;no - don't do it
ld hl,r5
set 4,(hl) ; set the bit
jp sioout ; and go do it
.org 0x0160
ebreak: ld a,(setf) ;end "break"
or a
ret z ; don't do it unless r3, r4, r5 are valid
ld hl,r5
res 4,(hl)
jp sioout ; go clear the bit
.org 0x0170
dtroff: ld a,(setf) ;drop DTR
or a
ret z ; don't do it unless r3, r4, r5 are valid
ld hl,r5
res 7,(hl)
jp sioout
.org 0x0180
dtron: ld a,(setf) ;raise DTR
or a
ret z ; don't do it unless r3, r4, r5 are valid
ld hl,r5
set 7,(hl)
jp sioout
.org 0x0190
setbd: out (baud),a ;set baud rate (value in A) (Xerox baud
ret ;rate port)
; The Baud Rate Table has entries from 38400 baud down to 300 baud.
; There are 2 bytes per entry. The second byte determines if the entry is
; enabled or disabled (ffh=enabled; 00=disabled). The first byte is passed
; as the A value to the setbd subroutine.
; Xerox 820-II, 16/8 have advertised values for rates up to 19200. Not all
; available low speeds are used by QTERM, however.
.org 0x01a0
baudtb:
b38400: db 0,no ; 38400 baud
b19200: db 0xf,yes ; 19200
b9600: db 0xe,yes ; 9600
b4800: db 0xc,yes ; 4800
b2400: db 0xa,yes ; 2400
b1200: db 7,yes ; 1200
b600: db 6,yes ; 600
b300: db 5,yes ; 300 baud
.org 0x01b0
setmod: ld (setf),a ; flag we've done a set
jp domod ; have to do this elsewhere
; Communication Mode Table. Single byte values for 12 combinations of
; number-of-bits(7/8), parity(none/even/odd), number-of-stop-bits(1/2).
.org 0x1c0
modetb:
n17: db 0b10000000 ;0x80, 7n1
n18: db 0b11000000 ;0xc0, 8n1
n27: db 0b10001000 ;0x88, 7n2
n28: db 0b11001000 ;0xc8, 8n2
e17: db 0b10000011 ;0x83, 7e1
e18: db 0b11000011 ;0xc3, 8e1
e27: db 0b10001011 ;0x8b, 7e2
e28: db 0b11001011 ;0xcb, 8e2
o17: db 0b10000001 ;0x81, 7o1
o18: db 0b11000001 ;0xc8, 8o1
o27: db 0b10001001 ;0x89, 7o2
o28: db 0b11001001 ;0xc9, 8o2
.org 0x01cc
resrvd: db 0 ; reserved for future use
.org 0x01cd
xfersz: db 8 ;number of K to read/write during file xfers
;Must be 1 / 2 / 4 / 8. Best left as 8 unless
; disk is verrrrry slow. Drop to smaller value
; if too many timeouts occur during "protocol"
; file transfers (xmodem or kermit).
.org 0x01ce
speed: db 4 ;cpu speed (Mhz; use 4 for Xerox)
.org 0x01cf
escape: db '\e' ;escape character (1bh=^[ Escape)
.org 0x01d0
signon: ;signon message
db '\e(Xerox 16/8 1984\e)\0' ;Puts message in normal video.
.org 0x01f0
clrs: db 'z' & 0x1f, 0 ;clear screen string (Control-Z)
.var scrout 0x0109 ;(a routine to print to CON: the
; character in C)
.var decout 0x010c ;(a routine to print to CON: a decimal value
; in HL. Is available for VT100 and the like.)
.org 0x0200
moveto: push hl ;move cursor to position in HL (Row,Col)
ld c,'\e' ; lead-in with Esc (the ASCII one; not QTERM's)
call scrout
ld c,'=' ; 2nd lead-in is '='
call scrout
pop hl
push hl
ld a,h ; row value (top row is 0.)
call poff ; add offset and send it to screen
pop hl
ld a,l ; col value (leftmost col is 0.)
poff: add a,' ' ; (adds 20h)
ld c,a
jp scrout ; (scrout returns from 'moveto's call)
; Terminal Capability Bits. The eight bits stand for each of the following
; strings. They count from 01h=bright to 80h=clear-to-end-of-screen.
.var b_brit 0b00000001 ; 0: bright (1.) -- NOT mandatory
.var b_dim 0b00000010 ; 1: dim (2.) -- NOT mandatory
.var b_dlln 0b00000100 ; 2: delete line (4.) -- important
.var b_inln 0b00001000 ; 3: insert line (8.) -- important
.var b_dlch 0b00010000 ; 4: delete character (16.)-- unused by QTERM
.var b_inch 0b00100000 ; 5: insert character (32.)-- NOT mandatory
.var b_clel 0b01000000 ; 6: clear to end-of-line(64.) -- important
.var b_cles 0b10000000 ; 7: clear to end-of-screen(128.)-- important
.org 0x022f
tcbits: db 0xff ; capability bits: full support
.org 0x0230
brites: db '\e(\0' ;bright string (disable alternate video)
.org 0x0238
dims: db '\e)\0' ;dim string (enable alternate video)
.org 0x0240
dlstr: db '\eR\0' ;delete line (Esc-R)
.org 0x0248
ilstr: db '\eE\0' ;insert line (Esc-E)
.org 0x0250
dcstr: db '\eW\0' ;delete character (Esc-W))
.org 0x0258
icstr: db '\eQ\0' ;insert character (Esc-Q)
.org 0x0260
ceol: db 'x' & 0x1f, 0 ;clear to end of line (Control-X)
.org 0x0268
ceos: db 'q' & 0x1f, 0 ;clear to end-of-screen (Control-Q)
; Entry and Exit hooks. These are provided to perform custom initialisation
; on startup and on exit from QTERM. They are invoked before any use is made
; of the screen or the port hardware.
.org 0x0270
entry: jp do_ent ; entry hook (270h .. 272h)
.org 0x0273 ; exit hook (273h .. 275h)
exit: jp do_exit
.org 0x0276
user: ret ; user subroutine (276h .. 278h)
.org 0x0279 ; keyboard map routine (279h .. 27bh)
kbmap: ret
.var ilprmt 0x027c ; inline prompt routine lives at 27ch
; Extra patch area if needed. 280h .. 4ffh
.org 0x0280
patcha:
do_ent: ld c,'z' & 0x1f ; Clear screen and home cursor.
call scrout
ld c,'\e' ; Send 'Esc'...
call scrout
ld c,'8' ; '8' to screen (set dim video mode)
call scrout ; (blink=4 or 6, graphics=5, inverse=7,
; dim=8.
ld a,(b1200) ; entry hook (from 270h)
call setbd ; Xerox setup for 1200 baud
ld a,(n18) ; and 8n1 communications mode.
call setmod
ret
domod: ld c,a ; save byte in c
ld hl,r3 ; look at byte for wr3
res 7,(hl) ; turn off ms bit (Rx # bits / char)
add a,a ; move bit from 6 to 7 in a
and 0x80 ; mask off the rest
or (hl) ; or in the remainder
ld (hl),a ; and save it back
inc hl
inc hl ; point hl at r4
ld a,(hl)
and 0xf4 ; mask out bits we don't want
ld b,a ; save in b
ld a,c ; get set byte back
and 0x0b ; get bits out of set byte that we want
or b ; or in the other bits
ld (hl),a ; and save it back
inc hl
inc hl ; point hl at r5
ld a,c
and 0x40 ; get the bit we want from c
res 6,(hl) ; clear the bit in r5
or (hl)
ld (hl),a ; put new composite value back
sioout: ld hl,siodat
ld bc,6 * 256 + sioc
otir
ret
siodat: db 3
r3: db 0b11000001 ; value for wr3 (0xc1)
db 4
r4: db 0b01000100 ; value for wr4 (0x44)
db 5
r5: db 0b11101010 ; value for wr5 (0xe5)
setf: db 0 ; flag if we've done a set mode command
do_exit:
ld c,'z' & 0x1f ; Clear screen and home cursor...
call scrout
ld c,'f' & 0x1f ; and restore original video mode
call scrout
ret
; MUST end by 4ffh