VZEditor/VZ157/SRC/KEY.ASM
Yoshihiko Hyodo 6f06b9514a first commit
2024-11-18 22:21:26 +09:00

842 lines
12 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;****************************
; 'key.asm'
;****************************
include vz.inc
IFNDEF US
CVTKANA equ TRUE ; ##153.32
ENDIF
;--- Equations ---
KSYM_SHIFT equ '\'
KSYM_CTRL equ '^'
KSYM_ALT equ '@'
KSYM_L equ '['
KSYM_R equ ']'
KEY_DOS equ 0
KEY_FNC equ 1
KEY_VZ equ 2
PKEYCNT equ 6
FP_MSK equ -1
FP_DEVICE equ 1
FP_MSKANJI equ 2
cseg
;--- External symbols ---
extrn fkeytype :byte
extrn fptype :byte
extrn pkeytbl :byte
extrn stopf :byte
extrn sysmode :byte
extrn sysmode0 :byte
extrn usersw :byte
extrn macmode :byte
extrn breakf :byte
extrn ckeytbl :word
extrn dosktbl :word
extrn retval :word
extrn syssw :word
extrn vzktbl :word
extrn kanatbl :word
extrn addmacro :near
extrn clrkeymode :near
extrn csroff2 :near
extrn csron :near
extrn dispkeymode :near
extrn domacro :near
extrn ismacro :near
extrn offkeymode :near
extrn postmacro :near
extrn premacro :near
extrn puts :near
extrn setgbank :near
extrn toupper :near
endcs
eseg
;--- Local work ---
keysym db 16 dup(0)
;breakf db 0 ; ##155.83
keymode db 0
fkeycnt db 0
tblsize dw 0
tblmode dw 0
kmg_ctrl db " ^ "
IFNDEF US
KKfunc dd 0 ; ##156.90
Func dw 5 ;5=function call mode
Func0 dw 0
dd 3 dup (0)
ENDIF
endes
bseg
GDATA fpmode, db, 0 ; ##156.109
lastkey dw 0FFFEh
endbs
iseg
assume ds:cgroup
;--- Init FEP ---
public initfp
initfp proc
IFNDEF US
push es
mov ch,fptype
mov si,offset cgroup:fptbl
clr cl
_repeat
inc cl
inifp1:
clr ax
mov es,ax
mov bl,[si].fp_int
tst bl
jz inifp_x
cmp bl,FP_MSKANJI
_if e ; ##156.90
push cx
call ismskanji
pop ax
jnc inifp8
mov cx,ax
inc si
jmp inifp1
_endif
cmp bl,FP_DEVICE ; ##156.90
_if e
push cx
mov dx,[si].fp_idoff
clr cx
msdos F_OPEN,0
pop cx
_ifn c
mov bx,ax
msdos F_CLOSE
jmps inifp8
_endif
_else
clr bh
shlm bx,2
mov ax,es:[bx].@off ; ##155.78
cmp ax,es:[bx-4].@off
je inifp2
cmp cl,ch
je inifp8
tst ch ; ##156.90
jnz inifp2
mov es,es:[bx].@seg
clr bx
tstb [si].fp_absoff
_ifn z
mov bx,ax
_endif
add bx,[si].fp_idoff
mov ax,es:[bx]
cmp ax,[si].fp_id
je inifp8
_endif
inifp2: add si,type _fep
_until
inifp_x:
clr cl
inifp8: mov fptype,cl
mov al,sysmode0
mov fpmode,al
pop es
ENDIF
ret
initfp endp
;--- Check MS-KANJI API --- ; ##156.90
IFNDEF US
mskID db "@:MS$KANJI",0
ismskanji proc
mov dx,offset cgroup:mskID
clr cx
msdos F_OPEN,0
_ifn c
mov bx,ax
mov cx,4
mov dx,offset cgroup:KKfunc
msdos F_IOCTRL,2
msdos F_CLOSE
mov cl,FP_MSK
clc
_endif
ret
ismskanji endp
ENDIF
endis
eseg
;--- Get/Set key table ---
public getdoskey
getdoskey proc
tstb breakf ; ##156.129
_if s
msdos F_CTRL_C,0
mov breakf,dl
mov dl,FALSE
msdos F_CTRL_C,1
call on_ezkey
mov dx,dosktbl
call getkeytbl
_endif
ret
getdoskey endp
public setdoskey
setdoskey proc
mov dl,-1
xchg dl,breakf
msdos F_CTRL_C,1
call off_ezkey
mov dx,dosktbl
mov al,KEY_DOS
call setkey
ret
setdoskey endp
public setvzkey
setvzkey proc
push ds
movseg ds,cs
cmp keymode,KEY_VZ
clc
_ifn e
mov dx,vzktbl
mov al,KEY_VZ
call setkey
stc
_endif
pop ds
ret
setvzkey endp
on_ezkey proc
mov al,TRUE
jmps ctrezkey
off_ezkey:
mov al,FALSE
ctrezkey:
push es
push ax
msdos F_GETVCT,INT_EZKEY
pop ax
cmp word ptr es:[bx-2],'ZE'
_if e
or usersw,ESW_EZKEY
mov ah,2 ; EZKEY set status
int INT_EZKEY
_else
and usersw,not ESW_EZKEY
_endif
pop es
ret
on_ezkey endp
;****************************
; Get key
;****************************
;-->
; AL :cursor type (0=insert, 1=overwrite, -1=off)
; DL :system mode
;<--
; AL : + command code, - macro code(NOT)
; DX :input data (AL=0)
; ZR : tst al
public getkey
getkey proc
pushm <bx,cx,si,di,ds>
movseg ds,cs
movseg es,cs
mov ah,dl
gkey00:
mov sysmode,ah
push ax
gkey0:
call premacro
jmpl c,gkey8
pop ax
mov sysmode,ah
push ax
call csron
gkey1:
call getkeycode
jc gkey1
tst ah
jmpl z,gkey7
cbw
test usersw,ESW_ESCKEY
_if z
cmp sysmode,SYS_SEDIT
je gpfix2
_endif
cmp ax,0FF9Ah ; [ESC]
je gcmd11
gpfix2: call cvtpfix
jc gkey1
gcmd1:
tstb macmode ; ##154.69
_if z
push ax
call chkstopkey
pop ax
jc gkey1
_endif
cmp sysmode,SYS_SEDIT
_if e
push ax
call ismacro
pop ax
_if c
mov lastkey,ax
jmp gkey0
_endif
_endif
gcmd11:
mov di,ckeytbl
mov dx,di
call scankey1
_if c
mov ax,lastkey
jmp gcmd1
_endif
mov bl,sysmode
tst bl
_if z
mov lastkey,ax
_endif
call scankey1
jc gmacro
mov cx,CM_FILER-CM_ESC
tst bl
jz gcmd3
mov cx,CM_SEDIT-CM_ESC
cmp bl,SYS_FILER
jb gcmd3
mov cx,CM_COMMON-CM_ESC
je gcmd3
mov cx,CM_FILER-CM_ESC
gcmd3:
call scankey
jc gcmd4
cmp bl,SYS_DOS
jb gcmd5
je g_dos
cmp bl,SYS_FILER
jne gcmd5
g_filer:
add di,(CM_FILER-CM_COMMON)*2
mov cx,CM_DOS-CM_FILER
call scankey
jc gcmd32
add di,(CM_FILER1-CM_DOS)*2
mov cx,CM_FILER2-CM_FILER1
jmps gcmd31
g_dos: add di,(CM_DOS-CM_SEDIT)*2
mov cx,CMCNT-CM_DOS
gcmd31:
call scankey
jnc gcmd5
gcmd32: mov lastkey,ax
gcmd4:
mov ax,di
sub ax,dx
shr ax,1
cmp al,CM_CTRL
je gctrlchr
jmps gkey7
gcmd5:
cmp ax,0FFDCh ; ##151.10 [CTRL]+[BS]
_if e
mov al,14 ; Backspace
jmps gkey81
_endif
cmp sysmode,SYS_SEDIT ; ##152.14
_ifn e
call ismacro
_if c
cmp sysmode,SYS_GETC
_if e
mov al,dl
jmps gkey7
_endif
_endif
_endif
call addmacro
jmp gkey0
gmacro:
call domacro
gkey1b: jmp gkey1
gctrlchr:
mov si,offset cgroup:kmg_ctrl
call getalpha
jc gkey1b
cmp al,LF
je gkey1b
cbw
mov dx,ax
clr al
gkey7:
pushm <ax,dx>
call postmacro
jnc gkey80
popm <dx,ax> ; ##154.69
pop ax
jmp gkey00
gkey80:
call offkeymode
popm <dx,ax>
gkey8:
cmp sysmode,SYS_DOS
_ifn e
tst al
_ifn z
call flush_key
_endif
_endif
gkey81:
call setgbank
push ax
call csroff2
pop ax
pop bx
popm <ds,di,si,cx,bx>
tst al
ret
getkey endp
;--- Scan key table ---
;-->
; AX :key code
; DI :key table ptr
;<--
; CY :found
public scankey1
scankey1:
mov cx,1
scankey proc
shl cx,1
sckey1:
jcxz sckey_x
repnz scasb
jne sckey_x
tst al
_if s
test cl,1
_ifn z
tst ah
jnz sckey1
_else
tst ah
jz sckey1
_endif
_endif
inc di
and di,not 1
stc
ret
sckey_x:
clc
ret
scankey endp
;--- Check STOP key ---
;<-- CY :stop key
public chkstopkey
chkstopkey proc
clr al
xchg cs:stopf,al
tst al
_ifn z
mov dl,0FFh
msdos F_CONIO
stc
_endif
ret
chkstopkey endp
;--- Convert prefix key ---
;--> AX :key code
;<--
; AX :2 stroke key code
; CY :error
; ZR :[ESC]0
cvtpfix proc
mov di,offset cgroup:pkeytbl
mov cx,PKEYCNT
repne scasb
jne cvpf9
push ax
mov dl,al
mov al,PKEYCNT-1
sub al,cl
push ax
clr dh
mov di,offset cgroup:keysym
push di
call setpkeysym
pop si
call getalpha
pop dx
pop cx
_if c
sub al,30h
jb cvpf_x
cmp al,0Fh
ja cvpf_x
clr ah ; stz
mov retval,ax
mov ax,cx
ret
_endif
add dl,2
rorm dl,3
or al,dl
clr ah
cvpf9: or dl,1 ; clz
ret
cvpf_x: stc
ret
cvtpfix endp
;--- Get A,^A key ---
;<--
; CY :error
; NC,AL :char code
getalpha proc
test usersw,ESW_FPQUIT ; ##156.109
_ifn z
call resetfp
_endif
call dispkeymode
call wait_key
call clrkeymode
tst al
_if z
cmp ah,1Ah ; ^@
jne getal_x
_endif
cmp al,20h
jb getal8
call toupper
cmp al,40h
jb cvpf_x
cmp al,5Fh
ja cvpf_x
and al,1Fh
getal8: clc
ret
getal_x:stc
ret
getalpha endp
;--- KANA to aplha ---
IFDEF CVTKANA
cvtkanakey proc
cmp al,SPC
_if a
pushm <cx,di>
mov di,kanatbl ; ##155.77
tstb [di]
_ifn z
mov cx,42 ; ##156.111
repne scasb
_if e
mov al,'@'+42-1
sub al,cl
cmp al,'@'+32
_if ae
sub al,'@'+32-'0'
_endif
_endif
_endif
popm <di,cx>
_endif
ret
cvtkanakey endp
ENDIF
;--- Store decimal word ---
;--> AL :store data
public storedeciw
storedeciw proc
aam
xchg al,ah
add ax,3030h
stosw
ret
storedeciw endp
;--- Display key symbol ---
;--> AX :pare of key code
public dispkeysym ; ##1.5
dispkeysym proc
pushm <cx,si,di>
mov di,offset cgroup:keysym
push di
call setkeysym
pop si
call puts
popm <di,si,cx>
ret
dispkeysym endp
;--- Set key symbol ---
;-->
; AX :pare of key code
; DI :store ptr
public setkeysym
setkeysym proc
mov byte ptr [di],0
cmp al,INVALID
_ifn e
push ax
mov ah,0
call setkeysym1
pop ax
cmp ah,INVALID
_ifn e
mov byte ptr [di-1],SPC
_endif
_endif
cmp ah,INVALID
_ifn e
mov al,ah
cbw
call setkeysym1
_endif
ret
setkeysym1:
cmp ax,0040h
jl setpkeysym1
pushm <ax,bx>
mov bx,offset cgroup:pkeytbl-2
rolm al,3
and al,00000111b
xlat
call setpkeysym1
popm <bx,ax>
and al,1Fh
add al,40h
dec di
stosb
clr al
stosb
ret
setkeysym endp
;--- Set prefix key symbol ---
;-->
; DL :key code
; DH :0=ESC, 1=[ESC]
; DI :store ptr
;<--
; DI :next store ptr
setpkeysym1:
mov dl,al
mov dh,1
setpkeysym proc
tst dl
js dsppk2
mov al,KSYM_CTRL
test dl,00100000b
jz dsppk1
mov al,KSYM_ALT
dsppk1: mov ah,dl
and ah,1Fh
add ah,40h
stosw
jmps dsppk8
dsppk2: tst dh
jz dsppk4
mov ah,dl
and ah,01100000b
jz dsppk31
mov al,KSYM_SHIFT
cmp ah,01000000b
jb dsppk3
mov al,KSYM_CTRL
je dsppk3
mov al,KSYM_ALT
dsppk3: stosb
dsppk31:mov al,KSYM_L
stosb
dsppk4: mov al,dl
and al,1Fh
cmp al,10h
jb dsppk6
and al,0Fh
shlm al,2
cbw
mov si,offset cgroup:xkeytbl
add si,ax
mov cx,4
dsppk5: lodsb
cmp al,SPC
je dsppk7
stosb
loop dsppk5
jmps dsppk7
dsppk6: push ax
mov al,'F'
stosb
pop ax
call storedeciw
dsppk7: tst dh
jz dsppk8
mov al,KSYM_R
stosb
dsppk8: clr al
stosb
ret
setpkeysym endp
;--- Get one char ---
;--> AL :cursor type (0=insert, 1=overwrite, -1=off)
;<-- AL 01h-08h :command code
; 20h-5Fh :char(toupper)
; 00h :other key(AH)
; CY :escape
public getc
getc proc
getc1: mov dl,SYS_GETC
call getkey
jz getc2
js getc_x
cmp al,CM_COMMON
jae getc_x
cmp al,CM_ESC
jne getc8
stc
ret
getc2: mov al,dl
call toupper
getc8: clc
ret
getc_x:
mov ah,al
clr al
ret
getc endp
;--- Check FEP ---
;--> AH :sysmode
public resetfp,ctrlfp ; ##156.110
resetfp:
IFDEF US
checkfp:
ctrlfp:
ret
ELSE
mov ah,SYS_DOS
checkfp proc
call isDBCS ; ##156.132
push ax
test syssw,SW_FP
jz chkfp9
mov al,fptype
tst al
jz chkfp9
cmp ah,sysmode0
je chkfp9
tst ah
_if z
call ctrlfp
_else
tstb sysmode0
_if z
mov ah,FEP_OFF
call ctrlfp
mov fpmode,al ; ##151.11
_endif
_endif
chkfp9: pop ax
mov sysmode0,ah
ret
checkfp endp
;--- Control FEP ---
;-->
; AH :FEP control code
ctrlfp proc
call isDBCS ; ##156.132
pushm <bx,cx,dx,ds,es>
movseg ds,cs
test syssw,SW_FP
_ifn z
mov al,fptype
tst al
_ifn z
mov bl,al ; ##156.90
cmp al,FP_MSK
_if e
clr bl
_endif
clr bh
shlm bx,2
add bl,ah
adc bh,0
shl bx,1
add bx,offset cgroup:fpjmp
mov al,fpmode
call [bx]
; mov fpmode,al ; ##151.11
_endif
_endif
popm <es,ds,dx,cx,bx>
ret
ctrlfp endp
ENDIF
endes
IFDEF PC98
include key98.asm
ELSE
include keyibm.asm
ENDIF
end
;****************************
; End of 'key.asm'
; Copyright (C) 1989 by c.mos
;****************************