home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
qterm
/
qtp-xer2.azm
/
QTP-XER2.ASM
Wrap
Assembly Source File
|
1989-04-18
|
10KB
|
329 lines
; QTERM Version 4.x Patch Area
; 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 Kaypro-II and -4 ('83 version without graphics). Kaypro
; (and Xerox BB-I) 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.
; 15-Feb-89, D. Presberg, BCS/BOSKUG.
; D. Goodenough added break, dtr and mode stuff 2-23-89
; Modified for Xerox 820-II, 16/8. Clears screen at start, at end, and re-
; sets alternate video at end; all terminal capabilities supported.
; By Tim Carney 17-Apr-89.
sioc equ 6 ; sio control port
siod equ 4 ; sio data port
yes equ 0ffh ; true value
no equ 0 ; false value
org 110h
modist: in a,(sioc) ;get modem input status (Kaypro status port)
and 01h ; (result to Z: no inp. character available
ret ; is 0 at bit-0 (low order) ===> Z==1 )
org 120h
modin: in a,(siod) ;read modem input character (Kaypro data port)
ret
org 130h
modost: in a,(sioc) ;get modem output status (Kaypro status port)
and 04h ; (result to Z: bit-2 ... see above)
ret
org 140h
modout: out (siod),a ;write modem output char. (Kaypro data port)
ret
org 150h
sbreak: ld a,(setf) ;start "break"
or a ;do we have valid data in r3,r4,r5
ret z ;no - don't do it
jp exmlp ; start break takes a bit extra, see below
org 160h
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
org 170h
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 180h
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 190h
setbd: out (00h),a ;set baud rate (value in A) (Kaypro 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.
; Kaypro-II/4 has advertised values for rates up to 19200. Not all available
; low speeds are used by QTERM, however.
org 1a0h
baudtb:
b38400: defb 0,no ; 38400 baud
b19200: defb 0fh,yes ; 19200
b9600: defb 0eh,yes ; 9600
b4800: defb 0ch,yes ; 4800
b2400: defb 0ah,yes ; 2400
b1200: defb 07h,yes ; 1200
b600: defb 06h,yes ; 600
b300: defb 05h,yes ; 300 baud
; (Kaypro goes down to 150, 134.5, 110, 75, and 50 baud, but QTERM doesn't.)
org 1b0h
setmod: ld (setf),a ; flag we've done a set
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 80h ; mask off the rest
or (hl) ; or in the remainder
jp finmod ; have to finish 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 1c0h
modetb:
n17: defb 10000000b ;080h, 7n1
n18: defb 11000000b ;0c0h, 8n1
n27: defb 10001000b ;088h, 7n2
n28: defb 11001000b ;0c8h, 8n2
e17: defb 10000011b ;083h, 7e1
e18: defb 11000011b ;0c3h, 8e1
e27: defb 10001011b ;08bh, 7e2
e28: defb 11001011b ;0cbh, 8e2
o17: defb 10000001b ;081h, 7o1
o18: defb 11000001b ;0c8h, 8o1
o27: defb 10001001b ;089h, 7o2
o28: defb 11001001b ;0c9h, 8o2
org 1cch
smlbuf: defb no ; set this 'yes' if you run out of ram - this feature
; is not yet implemented, but in time (i.e. V4.1)
; it will be. QTERM is a real memory hog - it needs
; well in excess of 48K TPA. If you have a full blown
; Z-system with oodles of RSX additions, you may
; run out of space. By setting this true, you can get
; QTERM to shrink some buffers and fit itself into
; about 42K, the price paid is somewhat more
; frequent disk access when reading and writing files.
org 1cdh
xfersz: defb 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 1ceh
speed: defb 4 ;cpu speed (Mhz; use 3 for 2.5, 4 for Xerox).
; (5Mhz Assumes Advent speedup kit in Kaypro.)
org 1cfh
escape: defb 1bh ;escape character (1ch=^\ Control-Backslash)
;use 1bh (^[=ESC) for Xerox.
org 1d0h
signon: ;signon message
defb '(Xerox 16/8 1984) '
defb 0
org 1f0h
clrs: defb 1ah ;clear screen string (Control-Z)
defb 0
scrout equ 109h ;(a routine to print to CON: the
; character in C)
decout equ 10ch ;(a routine to print to CON: a decimal value
; in HL. Is available for VT100 and the like.)
org 200h
moveto: push hl ;move cursor to position in HL (Row,Col)
ld c,1bh ; 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.
b_brit equ 00000001b ; 0: bright (1.) -- NOT mandatory
b_dim equ 00000010b ; 1: dim (2.) -- NOT mandatory
b_dlln equ 00000100b ; 2: delete line (4.) -- important
b_inln equ 00001000b ; 3: insert line (8.) -- important
b_dlch equ 00010000b ; 4: delete character (16.)-- unused by QTERM
b_inch equ 00100000b ; 5: insert character (32.)-- NOT mandatory
b_clel equ 01000000b ; 6: clear to end-of-line(64.) -- important
b_cles equ 10000000b ; 7: clear to end-of-screen(128.)-- important
org 22fh
tcbits: defb 0ffh ; capability bits- all functions supported
; by Xerox.
; (Kaypro-II/4, non-graphics version, cannot do in-place insertion or deletion
; of single characters: it can only overwrite characters at the current
; cursor position and move the cursor non-destructively, etc.. It can
; do in-place insertion and deletion of lines, and its clear-to-end-of-
; -screen and -line leaves the cursor as-is. It also has clear-screen-and-
; -home-the-cursor: see clrs, above. It, of course, has no graphical screen
; attributes, such as bright and dim.)
org 230h
brites: defb 27 ;bright string (none for '83 Kaypro)
defb 40 ;Xerox ESC-(, alternate video disable
defb 0 ;code.
org 238h
dims: defb 27 ;dim string (none for '83 Kaypro)
defb 41 ;Xerox ESC-) ESC-8 (enable alternate
defb 27 ;video,set to dim characters).
defb 56
defb 0
org 240h
dlstr: defb 1bh ;delete line
defb 'R'
defb 0
org 248h
ilstr: defb 1bh ;insert line
defb 'E'
defb 0
org 250h
dcstr: defb 27 ;delete character (none for '83 Kaypro)
defb 'W' ;Xerox ESC-W del character string.
defb 0
org 258h
icstr: defb 27 ;insert character (none for '83 Kaypro)
defb 'Q' ;Xerox ESC-Q ins character string.
defb 0
org 260h
ceol: defb 18h ;clear to end of line (Control-X)
defb 0
org 268h
ceos: defb 17 ;clear to end-of-screen (Control-W)
defb 0 ;Xerox uses CTRL-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 270h
entry: jp do_ent ; entry hook (270h .. 272h)
org 273h ; exit hook (273h .. 275h)
exit: jp do_exit ; Exit routine-Xerox 820-II, 16/8.
; Extra patch area if needed. 276h .. 2ffh
org 276h
patcha:
do_ent: ld c,26 ;Send clear screen and home cursor
call scrout ;to console...
jp start
start: ld a,(b1200) ; entry hook (from 270h)
call setbd ; Kaypro-II/4 setup for 1200 baud
ld a,(n18) ; and 8n1 communications mode.
call setmod
ret
exmlp: ld a,1 ; wait till transmitter is really finished
out (siod),a
in a,(siod)
rra
jr nc,exmlp ; loop till buffer empty
ld hl,r5
set 4,(hl) ; now go set the break bit.
sioout: ld hl,siodat
ld bc,6 * 256 + sioc
otir
ret
finmod: ld (hl),a ; and save it back
inc hl
inc hl ; point hl at r4
ld a,(hl)
and 0f4h ; mask out bits we don't want
ld b,a ; save in b
ld a,c ; get set byte back
and 0bh ; 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 40h ; 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
jp sioout ; go send the values
siodat: defb 3
r3: defb 11000001b ; value for wr3 (0c1h)
defb 4
r4: defb 01000100b ; value for wr4 (044h)
defb 5
r5: defb 11101010b ; value for wr5 (0e5h)
setf: defb 0 ; flag if we've done a set mode command
org 02c5h
do_exit:
ld c,26 ; Xerox specific.Clear screen, home cursor
call scrout
ld c,27 ; Change alternate video mode to inverse.
call scrout ; (52 or 54=blink, 53=graphics, 55=inverse
ld c,55 ; 56=dim).
call scrout
ret
end