508 lines
6.5 KiB
Plaintext
508 lines
6.5 KiB
Plaintext
; vt100.z - handle vt100 emulation in QTERM
|
|
|
|
.incl "c:vars"
|
|
|
|
.var decom 0x20
|
|
.var ascrl 0x40
|
|
|
|
.extern initv
|
|
initv:
|
|
ld hl,inits
|
|
ld de,inits + 1
|
|
ld bc,{inite - inits}
|
|
ld (hl),b
|
|
ldir
|
|
jp23: ld hl,23 << 8
|
|
jr dochk
|
|
chkxy: ld hl,(x)
|
|
dochk: ld a,l
|
|
ld e,79
|
|
call chk1
|
|
ld l,a
|
|
ld a,h
|
|
ld e,23
|
|
call chk1
|
|
ld h,a
|
|
ld a,(flags)
|
|
and decom
|
|
jr z,savmov
|
|
ld de,(hi)
|
|
ld a,h
|
|
cp e
|
|
jr nc,aok1
|
|
ld h,e
|
|
aok1: ld a,d
|
|
cp h
|
|
jr nc,savmov
|
|
ld h,d
|
|
savmov: ld (x),hl
|
|
lodmov: ld hl,(x)
|
|
jp moveto
|
|
|
|
.extern opchar
|
|
opchar: ld c,a ; save char in c
|
|
ld a,(mode)
|
|
and op_bit
|
|
ret nz ; exit if not doing output
|
|
ld a,(wflg) ; split window mode?
|
|
or a
|
|
jp nz,winrec ; yes - hand to receive portion
|
|
ld a,(vflg) ; vt100 emulation on?
|
|
or a
|
|
jp z,scrout ; no- send to screen
|
|
; otherwise give char to vt100 processor
|
|
|
|
.extern vt100
|
|
vt100:
|
|
ld a,c
|
|
cp '\b'
|
|
ld hl,x
|
|
jr nz,nobs
|
|
ld a,(hl)
|
|
dec a
|
|
ret m
|
|
savho: ld (hl),a
|
|
jpsco: jp scrout
|
|
nobs: xor '\r'
|
|
jr z,savho
|
|
cp '\t' ^ '\r'
|
|
jr nz,notab
|
|
ld a,(hl)
|
|
and ~7
|
|
add a,8
|
|
cp 80
|
|
ret z
|
|
ld (hl),a
|
|
jr lodmov
|
|
notab: cp '\n' ^ '\r'
|
|
jr nz,nonl
|
|
inc hl
|
|
ld a,(lo)
|
|
or a
|
|
jr nz,islo
|
|
ld a,23
|
|
islo: cp (hl)
|
|
jp z,scrlvt
|
|
ld a,(hl)
|
|
cp 23
|
|
jr z,lodmov
|
|
inc (hl)
|
|
lodmv1: jr lodmov
|
|
nonl: cp '\7' ^ '\r'
|
|
jr z,jpsco
|
|
ld hl,nk
|
|
ld a,(hl)
|
|
or a
|
|
jr z,nokil
|
|
dec (hl)
|
|
ret
|
|
nokil: ld a,(state)
|
|
or a
|
|
jr nz,stt1
|
|
ld a,c
|
|
cp '\e'
|
|
jr nz,noesc
|
|
xor a
|
|
ld (fbits),a
|
|
ld (setv),a
|
|
inc a
|
|
savstt: ld (state),a
|
|
ret
|
|
noesc: cp ' '
|
|
ret c ; all other control chars are tossed
|
|
cp 0x7f ; delete?
|
|
ret z ; yes - we throw it away
|
|
jr c,okasc ; less than delete => not a grafix char
|
|
ld c,'+' ; assume all are '+'s
|
|
ld hl,vtxtbl ; except special ones in the table
|
|
.dseg
|
|
vtxtbl: db 205,'='
|
|
db 186,'|'
|
|
db 196,'-'
|
|
db 179,'|'
|
|
db 0
|
|
.cseg
|
|
xtblp: ld e,(hl) ; get char to match
|
|
dec e
|
|
inc e ; is it zero?
|
|
jr z,okasc ; yes, all done so exit
|
|
inc hl
|
|
ld d,(hl) ; get ascii char to use
|
|
inc hl
|
|
cp e ; did we hit it?
|
|
jr nz,xtblp ; nope, back to try again
|
|
ld c,d ; else save character from d
|
|
okasc: ld hl,x
|
|
ld a,(hl)
|
|
cp 79
|
|
jr nc,xge79
|
|
inc (hl)
|
|
jr jpsco
|
|
xge79: inc hl
|
|
ld a,(hl)
|
|
cp 23
|
|
jr nz,yne23
|
|
ld a,(lo)
|
|
or a
|
|
jr z,cka
|
|
cp 23
|
|
ret nz
|
|
cka: ld a,(flags)
|
|
and ascrl
|
|
ret z
|
|
push bc
|
|
call scrlvt
|
|
ld hl,[22 << 8] + 79
|
|
call moveto
|
|
pop bc
|
|
call scrout
|
|
jp jp23
|
|
yne23: call scrout
|
|
ld a,(flags)
|
|
and ascrl
|
|
jr z,lodmv1
|
|
ld hl,y
|
|
ld a,(lo)
|
|
or a
|
|
jr z,nolo
|
|
cp (hl)
|
|
jr nz,nolo
|
|
push hl
|
|
call scrlvt
|
|
pop hl
|
|
dec (hl)
|
|
nolo: inc (hl)
|
|
dec hl
|
|
ld (hl),0
|
|
jr lodmv2
|
|
stt1: dec a
|
|
jr nz,stt2
|
|
ld a,c
|
|
cp '['
|
|
ld a,2
|
|
jr z,savstt
|
|
xor a
|
|
ld (state),a
|
|
ld a,c
|
|
cp '#'
|
|
jr z,k1
|
|
cp '('
|
|
jr z,k1
|
|
cp ')'
|
|
jr nz,tryM
|
|
k1: ld hl,nk
|
|
inc (hl)
|
|
ret
|
|
tryM: ld hl,y
|
|
cp 'M'
|
|
jr nz,tryE
|
|
ld a,(hi)
|
|
cp (hl)
|
|
jr nz,nohi
|
|
call revsvt
|
|
jr lodmv2
|
|
nohi: dec (hl)
|
|
jp p,lodmov
|
|
inc (hl)
|
|
jr lodmv2
|
|
tryE: xor 'E'
|
|
jr nz,tryD
|
|
dec hl
|
|
ld (hl),a
|
|
inc hl
|
|
jr doD
|
|
tryD: dec a
|
|
jr nz,try7
|
|
doD: ld a,(lo)
|
|
or a
|
|
jr z,look
|
|
ld a,23
|
|
look: cp (hl)
|
|
jr nz,nolo1
|
|
call scrlvt
|
|
jr lodmv2
|
|
nolo1: ld a,(hl)
|
|
cp 23
|
|
jr nc,lodmv2
|
|
inc (hl)
|
|
lodmv2: jp lodmov
|
|
try7: cp ['7' ^ 'E'] - 1
|
|
jr nz,try8
|
|
ld hl,(x)
|
|
ld (sx),hl
|
|
ld a,(mm)
|
|
ld (sm),a
|
|
ret
|
|
try8: cp ['8' ^ 'E'] - 1
|
|
ret nz
|
|
ld hl,(sx)
|
|
ld (x),hl
|
|
ld a,(sm)
|
|
call setdb
|
|
jp chkxy
|
|
stt2: dec a
|
|
jr nz,stt3
|
|
ld hl,p1
|
|
ld (pp),hl
|
|
ld hl,0
|
|
ld (p1),hl
|
|
ld a,3
|
|
ld (state),a
|
|
ld a,c
|
|
cp '?'
|
|
jr nz,stt3
|
|
ld (setv),a
|
|
ret
|
|
cs2: call clear
|
|
lodmv3: jr lodmv2
|
|
vclrs: ld a,(de)
|
|
or a
|
|
jp z,cleos
|
|
dec a
|
|
jr nz,cs2
|
|
push hl
|
|
ld hl,0
|
|
call moveto
|
|
pop bc
|
|
push bc
|
|
ld a,b
|
|
or a
|
|
jr z,nolin
|
|
cslp: push bc
|
|
call cleol
|
|
ld c,'\n'
|
|
call scrout
|
|
pop bc
|
|
djnz cslp
|
|
nolin: ld b,c
|
|
inc b
|
|
ld c,' '
|
|
cllp: push bc
|
|
call scrout
|
|
pop bc
|
|
djnz cllp
|
|
ld c,'\b'
|
|
jp scrout
|
|
cl2: ld c,'\r'
|
|
call scrout
|
|
call cleol
|
|
jr lodmv3
|
|
vclrl: ld a,(de)
|
|
or a
|
|
jp z,cleol
|
|
dec a
|
|
jr nz,cl2
|
|
ld c,'\r'
|
|
push hl
|
|
call scrout
|
|
pop bc
|
|
jr nolin
|
|
stt3: ld a,c
|
|
cp ';'
|
|
jr nz,nosc
|
|
ld a,(setv)
|
|
or a
|
|
jr z,nosv
|
|
dofbit: ld hl,p1
|
|
ld a,(hl)
|
|
or a
|
|
ret z
|
|
ld b,a
|
|
xor a
|
|
ld (hl),a
|
|
scf
|
|
fblp: adc a,a
|
|
djnz fblp
|
|
dec hl
|
|
or (hl)
|
|
ld (hl),a
|
|
ret
|
|
nosv: ld hl,(pp)
|
|
ld de,p1
|
|
sbc hl,de
|
|
jr nz,setp3
|
|
add hl,de
|
|
inc hl
|
|
savpp: ld (pp),hl
|
|
ret
|
|
setp3: ld hl,p3
|
|
ld (hl),0
|
|
jr savpp
|
|
nosc: sub '0'
|
|
cp 10
|
|
jr nc,notdig
|
|
ld hl,(pp)
|
|
ld e,a
|
|
ld a,(hl)
|
|
add a,a
|
|
add a,a
|
|
add a,(hl)
|
|
add a,a
|
|
add a,e
|
|
ld (hl),a
|
|
ret
|
|
notdig: ld hl,state
|
|
ld (hl),0
|
|
ld hl,swtab - 1
|
|
.dseg
|
|
.macro table byte,word
|
|
dw word
|
|
db byte - '0'
|
|
.endm
|
|
swtab:
|
|
table 'A',vup
|
|
table 'B',vdown
|
|
table 'C',vright
|
|
table 'D',vleft
|
|
table 'H',vmove
|
|
table 'f',vmove
|
|
table 'J',vclrs
|
|
table 'K',vclrl
|
|
table 'r',vmarg
|
|
table 'm',vmode
|
|
table 'h',vsm
|
|
table 'l',vrm
|
|
endtab:
|
|
.cseg
|
|
ld b,{endtab - swtab} / 3
|
|
switch: inc hl
|
|
ld e,(hl)
|
|
inc hl
|
|
ld d,(hl)
|
|
inc hl
|
|
cp (hl)
|
|
jr z,hitit
|
|
djnz switch
|
|
ret
|
|
hitit: push de
|
|
ld hl,(x)
|
|
ld de,p1
|
|
ret
|
|
vup: call defp1
|
|
neg
|
|
jr addy
|
|
vdown: call defp1
|
|
addy: add a,h
|
|
ld h,a
|
|
dochk1: jp dochk
|
|
vleft: call defp1
|
|
neg
|
|
jr addx
|
|
vright: call defp1
|
|
addx: add a,l
|
|
ld l,a
|
|
jr dochk1
|
|
vmove: call defp1
|
|
ld h,a
|
|
ld a,(flags)
|
|
and decom
|
|
jr z,hok
|
|
ld a,(hi)
|
|
add a,h
|
|
ld h,a
|
|
hok: inc de
|
|
call defp1
|
|
ld l,a
|
|
dec h
|
|
dec l
|
|
jr dochk1
|
|
vmarg: call defp1
|
|
ld c,a
|
|
inc de
|
|
ld a,(de)
|
|
or a
|
|
jr nz,look1
|
|
ld a,24
|
|
look1: ld b,a
|
|
ld hl,[24 << 8] + 1
|
|
sbc hl,bc
|
|
jr nz,chkbc
|
|
ld b,c
|
|
jr setbc
|
|
chkbc: ld a,c
|
|
cp b
|
|
ret nc
|
|
setbc: dec b
|
|
dec c
|
|
ld (hi),bc
|
|
ld hl,0
|
|
jr dochk1
|
|
vmode: ld hl,(pp)
|
|
ld a,(hl)
|
|
setdb: ld (mm),a
|
|
or a
|
|
jp nz,dim
|
|
jp bright
|
|
vsm: call dofbit
|
|
ld a,(fbits)
|
|
ld hl,flags
|
|
or (hl)
|
|
ld (hl),a
|
|
ret
|
|
vrm: call dofbit
|
|
ld a,(fbits)
|
|
cpl
|
|
ld hl,flags
|
|
and (hl)
|
|
ld (hl),a
|
|
ret
|
|
|
|
chk1: or a
|
|
jp p,chkp
|
|
xor a
|
|
ret
|
|
chkp: cp e
|
|
ret c
|
|
ld a,e
|
|
ret
|
|
|
|
defp1: ld a,(de)
|
|
or a
|
|
ret nz
|
|
inc a
|
|
ret
|
|
|
|
scrlvt: ld hl,(hi)
|
|
ld a,l
|
|
cp h
|
|
ld l,23
|
|
jr nz,jproll
|
|
ld h,l
|
|
jproll: jp rollit
|
|
|
|
revsvt: ld a,(lo)
|
|
or a
|
|
jr z,norevd
|
|
cp 23
|
|
jr z,norevd
|
|
ld h,a
|
|
ld l,0
|
|
call moveto
|
|
call dellin
|
|
norevd: ld hl,(hi - 1)
|
|
ld l,0
|
|
call moveto
|
|
jp inslin
|
|
|
|
.useg
|
|
inits:
|
|
state: ds 1
|
|
hi: ds 1
|
|
lo: ds 1
|
|
flags: ds 1
|
|
sx: ds 1
|
|
sy: ds 1
|
|
mm: ds 1
|
|
sm: ds 1
|
|
nk: ds 1
|
|
inite:
|
|
x: ds 1
|
|
y: ds 1
|
|
|
|
setv: ds 1
|
|
fbits: ds 1
|
|
p1: ds 1
|
|
p2: ds 1
|
|
p3: ds 1
|
|
pp: ds 2
|
|
|