home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
qterm
/
qtpat42.lbr
/
QT-MD34.ZY
/
QT-MD34.ZY
Wrap
Text File
|
1991-05-29
|
7KB
|
307 lines
; QT-MD34.Z - QTERM Version 4.2 Patch Area for the Morrow MD34
; This is for the Morrow MD34, created by putting it's port addresses and
; baud rate code into the "generic" SIO patch. Since the MD34 screen is
; ADM-3A compatible, all the standard Televideo Screen codes will work
; as is, so they have been incorporated from the original TVI803 source.
; Created by D. Goodenough, 7-29-89
; Upgraded for QTERM V4.2, 2-13-90
.var yes 0xff ; true value
.var no 0 ; false value
.var sio yes ; set yes to use the SIO, set no to use
; the other half of the DART
.if sio
.var siod 0x70 ; Use RS232 socket at other end from
.var sioc 0x71 ; Terminal
.var ctc 0x50
.var mode 0x3e
.else
.var siod 0x62 ; Use RSs232 socket adjacent to Terminal
.var sioc 0x63
.var ctc 0x51
.var mode 0x7e
.endif
.var rxrdy 1 ; receiver ready
.var txrdy 4 ; transmitter ready
.var ctcsel 0x53 ; ctc select / control port
.org 0x0110
modist: in a,(sioc) ;get modem input status
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
ret
.org 0x0130
modost: in a,(sioc) ;get modem output status
and txrdy ; (result to Z: bit-2 ... see above)
ret
.org 0x0140
modout: out (siod),a ;write modem output char.
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: ld e,a
ld d,0
ld hl,brtab
add hl,de ; index into baud rate table
ld a,mode ; 0x3e or 0x7e
out (ctcsel),a ; select the correct timer and mode
jp finbd ; go finish elsewhere
.org 0x01a0
baudtb:
b38400: db 0,no ; 38400 baud
b19200: db 0,no ; 19200
b9600: db 0,yes ; 9600
b4800: db 2,yes ; 4800
b2400: db 4,yes ; 2400
b1200: db 6,yes ; 1200
b600: db 8,yes ; 600
b300: db 10,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 ; don't need this - we're contiguous
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 3 for 2.5)
.org 0x01cf
escape: db '\\' & 0x1f ;escape character (1ch=^\ Control-Backslash)
.org 0x01d0
signon: ;signon message
db 'Morrow MD34, '
.if sio
db 'SIO'
.else
db 'MODEM'
.endif
db ' port\0'
.org 0x01f0
clrs: db '\e*\0' ;clear screen string (Escape '*')
.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 ; get row,col
ld de,0x2020 ; add offset
add hl,de
push hl ; and save
ld c,h ; send row+offset
call scrout
pop bc ; get col+offset
jp scrout ; send
; these next strings are used to do various screen functions. There are
; eight of them, and immediately preceding them is a flag byte. Each string
; has a bit in the byte, and if a capability is present, its bit should
; be set. This byte is an absolute necessity, as various programs use it
; to tell if various things are present.
.org 0x022f
.extern tcbits
tcbits: db 0b11111111 ; bits are:
; 0: bright b_brite 1
; 1: dim b_dim 2
; 2: delete line b_delln 4
; 3: insert line b_insln 8
; 4: delete character b_delch 16
; 5: insert character b_insch 32
; 6: clear end line b_cleol 64
; 7: clear end screen b_cleos 128
.org 0x0230
.extern brites
brites: db '\e(\0'
.org 0x0238
.extern dims
dims: db '\e)\0'
.org 0x0240
.extern dlstr
dlstr: db '\eR\0'
.org 0x0248
.extern ilstr
ilstr: db '\eE\0'
.org 0x0250
.extern dcstr
dcstr: db '\eW\0'
.org 0x0258
.extern icstr
icstr: db '\eQ\0'
.org 0x0260
.extern ceol
ceol: db '\eT\0'
.org 0x0268
.extern ceos
ceos: db '\eY\0'
; 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: ret ; exit hook (273h .. 275h)
.org 0x0276
user: ret ; user subroutine (276h .. 278h)
.org 0x0279
kbmap: ret ; keyboard map (279h .. 27bh)
.var ilprmt 0x027c ; inline prompt subroutine entry
; Extra patch area if needed. 280h .. 4ffh
.org 0x0280
patcha:
do_ent: ld a,(b1200) ; entry hook (from 270h)
call setbd ; 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
finbd: ld a,(hl)
out (ctc),a
inc hl
ld a,(hl)
out (ctc),a
ret
brtab: dw 26 ; 9600 0
dw 52 ; 4800 2
dw 104 ; 2400 4
dw 208 ; 1200 6
dw 417 ; 600 8
dw 833 ; 300 10