mirror of
https://github.com/NishiOwO/VZEditor.git
synced 2025-04-21 00:34:37 +00:00
1683 lines
22 KiB
NASM
1683 lines
22 KiB
NASM
;****************************
|
|
; 'inst.asm'
|
|
;****************************
|
|
|
|
include vz.inc
|
|
|
|
;--- Equations ---
|
|
|
|
KSYM_SHIFT equ '\'
|
|
KSYM_CTRL equ '^'
|
|
KSYM_ALT equ '@'
|
|
KSYM_L equ '['
|
|
KSYM_R equ ']'
|
|
LOCALMAC equ 80h
|
|
|
|
XKEYCNT equ 15
|
|
PKEYCNT equ 6
|
|
ELSECNT equ 13
|
|
HISTCNT equ 7
|
|
|
|
VZ_DF_IF equ 2
|
|
VZ_DF_IFN equ 3
|
|
VZ_DF_ELSE equ 4
|
|
VZ_DF_ENDIF equ 5
|
|
VZ_DF_ELSEIF equ 6
|
|
VZ_DF_ELSEIFN equ 7
|
|
|
|
;--- External symbols ---
|
|
|
|
wseg
|
|
extrn grctbl :byte
|
|
extrn mg_opterr :byte
|
|
extrn mg_synerr :byte
|
|
extrn pkeytbl :byte
|
|
extrn tb_symbol :byte
|
|
extrn idword :byte
|
|
|
|
extrn readmac :word
|
|
extrn aliasbuf :word
|
|
extrn ckeymsg :word
|
|
extrn ckeytbl :word
|
|
extrn ssmax :word
|
|
extrn custm_end :word
|
|
extrn elsetbl :word
|
|
extrn fkeytbl :word
|
|
extrn hist_top :word
|
|
extrn lbuf :word
|
|
extrn lbuf_end :word ; ##156.117
|
|
extrn macrobuf :word
|
|
extrn macrosz :word ; ##156.118
|
|
extrn optptr :word
|
|
extrn syssw :word
|
|
extrn extsw :word
|
|
extrn tboxtbl :word
|
|
extrn tempend :word
|
|
extrn temptop :word
|
|
extrn paltblp :word
|
|
extrn sysmnubuf :word
|
|
extrn reffile :word
|
|
extrn insheadp :word
|
|
endws
|
|
|
|
extrn cputc :near
|
|
extrn cputcrlf :near
|
|
extrn cputs :near
|
|
extrn cputmg :near
|
|
extrn disperr :near
|
|
extrn dispmsg :near
|
|
extrn dspscr :near
|
|
extrn getnum :near
|
|
extrn ins_macro :near
|
|
extrn del_macro :near
|
|
extrn isalpha :near
|
|
extrn isdigit :near
|
|
extrn isupper :near
|
|
extrn islower :near
|
|
extrn memmove :near
|
|
extrn putnum :near
|
|
extrn scandeciw :near
|
|
extrn scannum :near
|
|
extrn setoption :near
|
|
extrn setoptnum :near
|
|
extrn toupper :near
|
|
extrn wrdicmp :near
|
|
extrn tb_xkey :near
|
|
extrn chkmem :near
|
|
extrn scantbl :near
|
|
extrn flatrtbl :near ; ##16
|
|
extrn init_maclink :near
|
|
extrn skipspc :near
|
|
extrn skipspc1 :near
|
|
extrn skipchar :near
|
|
extrn schsysmenu :near
|
|
extrn set_readmac :near
|
|
extrn strstr :near
|
|
|
|
dseg
|
|
|
|
;--- Local work ---
|
|
|
|
errcnt db 0
|
|
inedit db 0
|
|
enddefp dw 0
|
|
recount dw 0
|
|
storep dw 0
|
|
headerp dw 0
|
|
sysmnu db 0
|
|
insmdl db 0
|
|
lbufovf db 0 ; ##156.117
|
|
mhttllen dw 40
|
|
ifbit dw 0
|
|
|
|
endds
|
|
|
|
cseg
|
|
|
|
;--- Customize class table ---
|
|
|
|
tb_class db 'C'
|
|
dw offset cgroup:df_cmdkey
|
|
db 'F'
|
|
dw offset cgroup:df_fnckey
|
|
db 'T'
|
|
dw offset cgroup:df_tbox
|
|
db 'O'
|
|
dw offset cgroup:df_option
|
|
db 'H'
|
|
dw offset cgroup:df_history
|
|
db 'E'
|
|
dw offset cgroup:df_else
|
|
db 'S'
|
|
dw offset cgroup:df_sysmenu
|
|
tb_class2:
|
|
db 'M'
|
|
dw offset cgroup:df_macro
|
|
db 'P'
|
|
dw offset cgroup:df_menu
|
|
db 'A'
|
|
dw offset cgroup:df_alias
|
|
db 0
|
|
|
|
endcs
|
|
|
|
iseg
|
|
assume ds:cgroup
|
|
|
|
;--- Customize main ---
|
|
;--> SI :referece file ptr
|
|
;<-- NZ :error
|
|
|
|
public customize
|
|
customize proc
|
|
mov byte ptr [si-1],LF
|
|
mov errcnt,0
|
|
test extsw,ESW_DEFTTL
|
|
_ifn z
|
|
cmp byte ptr [si],SPC
|
|
_if a
|
|
push si
|
|
inc si
|
|
call skipline
|
|
call putttl
|
|
pop si
|
|
_endif
|
|
_endif
|
|
lodsb
|
|
cmp al,';'
|
|
_ifn e
|
|
dec si
|
|
_endif
|
|
mov ax,ssmax
|
|
dec ax
|
|
mov enddefp,ax
|
|
mov bx,offset cgroup:tb_class
|
|
mov di,temptop
|
|
call readclass
|
|
tstb errcnt
|
|
VZ_RET
|
|
customize endp
|
|
|
|
;--- Syntax error ---
|
|
|
|
public synerr
|
|
synerr proc
|
|
inc errcnt
|
|
clr bx
|
|
xchg bx,optptr
|
|
tst bx
|
|
jnz opterr
|
|
call skipline
|
|
putttl: push si
|
|
mov byte ptr [si-2],'$'
|
|
_repeat
|
|
dec si
|
|
cmp byte ptr [si-1],LF
|
|
_until e
|
|
tstb errcnt
|
|
_ifn z
|
|
mov dx,offset cgroup:mg_synerr
|
|
call cputmg
|
|
_endif
|
|
mov dx,si
|
|
call cputs
|
|
pop si
|
|
jmps opte8
|
|
opterr:
|
|
mov dx,offset cgroup:mg_opterr
|
|
call cputmg
|
|
dec bx
|
|
_repeat
|
|
mov dl,[bx]
|
|
inc bx
|
|
cmp dl,SPC
|
|
_break be
|
|
call cputc
|
|
_until
|
|
mov si,bx
|
|
opte8: call cputcrlf
|
|
VZ_RET
|
|
synerr endp
|
|
|
|
;--- Insert converted data ---
|
|
;--> BX :pointer offset
|
|
|
|
public insertcvt
|
|
insertcvt proc
|
|
pushm <cx,si,di>
|
|
mov ax,tempend
|
|
sub ax,temptop
|
|
push ax
|
|
mov di,[bx]
|
|
cmp bx,offset cgroup:ckeymsg
|
|
_if ae
|
|
mov di,[bx+2]
|
|
cmp di,[bx]
|
|
_ifn e
|
|
dec di
|
|
_endif
|
|
add ax,di
|
|
sub ax,[bx]
|
|
_endif
|
|
push di
|
|
call movearea
|
|
mov si,temptop
|
|
pop di
|
|
pop cx
|
|
call memmove
|
|
popm <di,si,cx>
|
|
VZ_RET
|
|
insertcvt endp
|
|
|
|
;--- Move customize area ---
|
|
;-->
|
|
; BX :pointer offset
|
|
; AX :area size
|
|
|
|
public movearea
|
|
movearea proc
|
|
push bx
|
|
mov di,[bx]
|
|
mov si,[bx+2]
|
|
cmp si,di
|
|
pushf
|
|
add di,ax
|
|
mov cx,tempend
|
|
sub cx,si
|
|
mov ax,di ; ##154.63
|
|
add ax,cx
|
|
call chkmem
|
|
call memmove
|
|
popf
|
|
_if e
|
|
mov byte ptr [si],0
|
|
_endif
|
|
mov ax,di
|
|
sub ax,si
|
|
_repeat
|
|
inc bx
|
|
inc bx
|
|
add [bx],ax
|
|
cmp bx,offset cgroup:custm_end - 2 ; ##155.70
|
|
_while b
|
|
pop bx
|
|
VZ_RET
|
|
movearea endp
|
|
|
|
;--- Is next class ? ---
|
|
|
|
nextclass1 proc
|
|
tst bx
|
|
_ifn z
|
|
cmp di,temptop ;;
|
|
_if a
|
|
push si
|
|
mov tempend,di
|
|
call insertcvt
|
|
mov di,temptop
|
|
pop si
|
|
_endif
|
|
_endif
|
|
VZ_RET
|
|
nextclass1 endp
|
|
|
|
;--- Command key ---
|
|
|
|
df_cmdkey proc
|
|
ckey1: mov bx,offset cgroup:ckeymsg
|
|
call nextclass
|
|
call scannum
|
|
jc ckey_x
|
|
dec si
|
|
mov bx,dx
|
|
tst bx
|
|
jz ckey2
|
|
dec bx
|
|
shl bx,1
|
|
add bx,ckeytbl
|
|
ckey2:
|
|
call skpsp
|
|
je ckey1
|
|
cmp al,':'
|
|
je ckeymsg1
|
|
cmp al,';'
|
|
je ckey1
|
|
call scankey
|
|
jc ckey_x
|
|
tst dx
|
|
jz pkey1
|
|
call storekey
|
|
jc ckey_x
|
|
jmp ckey2
|
|
pkey1:
|
|
mov ah,al
|
|
mov al,0FFh
|
|
call isprekey
|
|
jnc ckey_x
|
|
mov bx,offset cgroup:pkeytbl
|
|
add bl,al
|
|
adc bh,0
|
|
mov [bx],ah
|
|
jmp ckey2
|
|
ckey_x: stc
|
|
VZ_RET
|
|
ckeymsg1:
|
|
mov al,dl
|
|
ckmsg1: stosb
|
|
lodsb
|
|
cmp al,SPC
|
|
jb ckmsg2
|
|
cmp al,';'
|
|
jne ckmsg1
|
|
ckmsg2: clr al
|
|
stosb
|
|
jmp ckey1
|
|
df_cmdkey endp
|
|
|
|
;--- Function key label ---
|
|
|
|
df_fnckey proc
|
|
fkey1: mov al,-1
|
|
stosb
|
|
mov bx,offset cgroup:fkeytbl
|
|
call nextclass
|
|
dec di
|
|
push di
|
|
_repeat
|
|
call scanstr
|
|
_until c
|
|
mov al,CR
|
|
stosb
|
|
pop ax
|
|
jmp fkey1
|
|
tbox_x:
|
|
fkey_x: pop di
|
|
stc
|
|
VZ_RET
|
|
df_fnckey endp
|
|
|
|
;--- Text box ---
|
|
|
|
df_tbox proc
|
|
clr al
|
|
stosb
|
|
tbox1: mov bx,offset cgroup:tboxtbl
|
|
call nextclass
|
|
push di
|
|
inc di
|
|
call scanstr
|
|
jc tbox_x
|
|
call scannumc ; mn_wd
|
|
jc tbox_x
|
|
pop bx
|
|
mov [bx],al
|
|
jmp tbox1
|
|
df_tbox endp
|
|
|
|
;--- Option ---
|
|
|
|
df_option proc
|
|
opt1:
|
|
clr bx
|
|
call nextclass
|
|
cmp al,'-'
|
|
_if e
|
|
lodsb
|
|
_endif
|
|
opt2: call isalpha
|
|
jnc opt_x
|
|
call setoption
|
|
jc opt_x
|
|
inc recount
|
|
call skpsp
|
|
je opt1
|
|
cmp al,';'
|
|
je opt1
|
|
jmp opt2
|
|
df_option endp
|
|
|
|
;--- History ---
|
|
|
|
tb_histsym db "SFCAWNT"
|
|
|
|
df_history proc
|
|
clr bx
|
|
hist1: call nextclass
|
|
cmp al,':'
|
|
_if e
|
|
cmp di,temptop
|
|
_if a
|
|
call nextclass1
|
|
_endif
|
|
call skpsp
|
|
call get_histsym
|
|
jc hist_x
|
|
hist2: call skipline
|
|
hist3: lodsb
|
|
call if_state
|
|
_endif
|
|
hist4: call skpsp1
|
|
je hist1
|
|
cmp al,'"'
|
|
_if e
|
|
call scanstr1
|
|
hist5: lodsb
|
|
jmp hist4
|
|
_endif
|
|
cmp al,';'
|
|
je hist2
|
|
_repeat
|
|
stosb
|
|
lodsb
|
|
cmp al,SPC
|
|
_until be
|
|
clr al
|
|
stosb
|
|
jmp hist5
|
|
opt_x:
|
|
hist_x:
|
|
else_x: stc
|
|
VZ_RET
|
|
df_history endp
|
|
|
|
public get_histsym
|
|
get_histsym proc
|
|
call toupper
|
|
push di
|
|
mov di,offset cgroup:tb_histsym
|
|
mov cx,HISTCNT
|
|
call scantbl
|
|
pop di
|
|
jne histsym_x
|
|
mov bx,HISTCNT-1
|
|
sub bx,cx
|
|
shl bx,1
|
|
add bx,offset cgroup:hist_top
|
|
clc
|
|
VZ_RET
|
|
histsym_x:
|
|
stc
|
|
VZ_RET
|
|
get_histsym endp
|
|
|
|
;--- Else ---
|
|
|
|
df_else proc
|
|
else1: clr bx
|
|
call nextclass
|
|
call scannum
|
|
jc else_x
|
|
cmp dx,ELSECNT
|
|
ja else_x
|
|
cmp dx,10 ; ##155.77
|
|
je df_grctbl
|
|
cmp dx,12 ; ##156.91
|
|
je df_paltbl
|
|
cmp dx,13
|
|
je df_flatrtbl ; ##16
|
|
cmp dx,11
|
|
_if e
|
|
dec dx
|
|
_endif
|
|
cmp dx,2 ; ##16
|
|
_if e
|
|
mov bx,offset cgroup:reffile
|
|
jmps else2
|
|
_endif
|
|
_if a
|
|
dec dx
|
|
_endif
|
|
dec dx
|
|
js else_x
|
|
shl dx,1
|
|
mov bx,offset cgroup:elsetbl
|
|
add bx,dx
|
|
else2: call skpsp1
|
|
je else1
|
|
mov di,temptop
|
|
call copytoeol
|
|
push si
|
|
mov tempend,di
|
|
call insertcvt
|
|
pop si
|
|
jmp else1
|
|
df_grctbl:
|
|
mov di,offset cgroup:grctbl
|
|
movseg es,cs
|
|
call scanstr
|
|
movseg es,ss
|
|
jmp else1
|
|
|
|
df_paltbl: ; ##156.91
|
|
mov di,paltblp
|
|
tst di
|
|
jz else1
|
|
dftbl1: call scanstr
|
|
jmp else1
|
|
|
|
df_flatrtbl:
|
|
mov di,offset cgroup:flatrtbl
|
|
jmps dftbl1
|
|
|
|
df_else endp
|
|
|
|
endis
|
|
|
|
cseg
|
|
assume ds:nothing
|
|
|
|
;--- Store key code ---
|
|
|
|
storekey proc
|
|
cmp dx,CM_COMMON
|
|
jb stkey1
|
|
cmp dx,CM_FILER
|
|
jae stkey1
|
|
storekey1:
|
|
call isprekey
|
|
_if c
|
|
call scanpkey
|
|
jc stkey9
|
|
cmp al,INVALID
|
|
_if e
|
|
mov al,dl
|
|
jmps stkey1
|
|
_endif
|
|
tst al
|
|
js stkey2
|
|
_endif
|
|
stkey1:
|
|
tst al
|
|
js stkey3
|
|
cmp byte ptr es:[bx],INVALID
|
|
_if e
|
|
stkey2: mov es:[bx],al
|
|
_else
|
|
stkey3: mov es:[bx+1],al
|
|
_endif
|
|
clc
|
|
stkey9: VZ_RET
|
|
storekey endp
|
|
|
|
;--- Macro key ---
|
|
|
|
df_macro proc
|
|
mov readmac,0
|
|
mac1:
|
|
clr al
|
|
stosb
|
|
mov bx,offset cgroup:macrobuf
|
|
call nextclass
|
|
dec di
|
|
push di
|
|
call scannum
|
|
jc mac_x1
|
|
cmp al,':'
|
|
_if e
|
|
or dl,LOCALMAC
|
|
_else
|
|
tstw readmac
|
|
_if z
|
|
mov byte ptr readmac,dl
|
|
_endif
|
|
_endif
|
|
mov es:[di],dl
|
|
inc di
|
|
inc di
|
|
inc di
|
|
mov bx,di
|
|
tst dl
|
|
_ifn s
|
|
mov word ptr es:[bx],INVALID
|
|
_repeat
|
|
call skpsp1
|
|
call scankey
|
|
_break c
|
|
mov dx,ax
|
|
call storekey1
|
|
mac_x1: jc mac_x
|
|
lodsb
|
|
_until
|
|
dec si
|
|
inc di
|
|
inc di
|
|
call scanstr0
|
|
jc mac_x
|
|
_endif
|
|
mac4:
|
|
lodsb
|
|
cmp al,LF
|
|
je mac5
|
|
cmp al,SPC
|
|
jbe mac4
|
|
cmp al,';'
|
|
je mac_rem
|
|
stosb
|
|
ja mac4
|
|
cmp al,'"'
|
|
je mac_str
|
|
cmp al,SYMCHR
|
|
jne mac4
|
|
mac_chr:lodsb
|
|
stosb
|
|
cmp al,SYMCHR
|
|
jne mac_chr
|
|
jmp mac4
|
|
mac_str:call scanstr1
|
|
jmp mac4
|
|
mac_rem:call skipline
|
|
mac5:
|
|
tstb inedit
|
|
_ifn z
|
|
cmp di,lbuf_end
|
|
_if ae
|
|
mov lbufovf,TRUE
|
|
mac_x:
|
|
pop di
|
|
stc
|
|
VZ_RET
|
|
_endif
|
|
_endif
|
|
cmp si,enddefp
|
|
jae mac6
|
|
lodsb
|
|
call if_state
|
|
dec si
|
|
cmp al,'*'
|
|
je mac6
|
|
cmp al,'='
|
|
je mac6
|
|
call isdigit
|
|
jnc mac4
|
|
mac6: clr al
|
|
stosb
|
|
mov ax,di
|
|
sub ax,bx
|
|
mov es:[bx-2],ax
|
|
pop ax
|
|
jmp mac1
|
|
df_macro endp
|
|
|
|
;--- Pop up menu ---
|
|
|
|
df_sysmenu:
|
|
mov sysmnu,TRUE
|
|
df_menu proc
|
|
menu1: clr al
|
|
stosb
|
|
mov bx,offset cgroup:macrobuf
|
|
tstb sysmnu
|
|
_ifn z
|
|
mov bx,offset cgroup:sysmnubuf
|
|
_endif
|
|
call nextclass
|
|
dec di
|
|
call scannum
|
|
jmpl c,menu_x
|
|
or dl,MENUMASK
|
|
mov es:[di],dl
|
|
inc di
|
|
inc di
|
|
inc di
|
|
push di
|
|
pushm <si,di>
|
|
call scanstr
|
|
pop di
|
|
jc menu_x21
|
|
call scannumc ; mn_wd
|
|
jc menu_x21
|
|
stosb
|
|
call scannumc ; mn_c
|
|
menu_x21:jmpl c,menu_x2
|
|
stosb
|
|
mov cx,ax
|
|
push di
|
|
clr ax
|
|
stosw
|
|
stosw
|
|
call scannumc ; mn_valwd
|
|
jc menu2
|
|
pop di
|
|
push di
|
|
stosb
|
|
call scannumc ; mn_sel
|
|
jc menu2
|
|
stosb
|
|
menu2:
|
|
pop di
|
|
add di,4
|
|
clr bx
|
|
tstb sysmnu
|
|
_ifn z
|
|
mov al,[di-(type _menu)-3]
|
|
cmp al,MENUMASK+MNU_FEXEC
|
|
je itemptr
|
|
cmp al,MENUMASK+MNU_FFILE
|
|
jne menu21
|
|
_endif
|
|
itemptr:
|
|
mov bx,di ; BX :item ptr
|
|
push cx
|
|
clr ax
|
|
rep stosw ; DI :message ptr
|
|
pop cx
|
|
menu21:
|
|
mov ax,si
|
|
pop si
|
|
push ax
|
|
lodsb
|
|
call scanstr
|
|
pop si
|
|
; dec si
|
|
tst cx
|
|
jmpl z,menu70
|
|
menu3:
|
|
call skpsp
|
|
je menu4
|
|
cmp al,';' ; ##16
|
|
_if e
|
|
call skipline
|
|
menu4: lodsb
|
|
call if_state
|
|
dec si
|
|
menu31: jmp menu3
|
|
_endif
|
|
call scanstr
|
|
_if c
|
|
push ax
|
|
clr al
|
|
stosb
|
|
pop ax
|
|
_else
|
|
call skpsp
|
|
je menu6
|
|
dec si
|
|
cmp al,','
|
|
jne menu6
|
|
inc si
|
|
call skpsp
|
|
_endif
|
|
cmp al,'A'
|
|
jae menu5
|
|
mov ah,al
|
|
sub al,SPC
|
|
js menu_x1
|
|
push bx
|
|
mov bx,offset cgroup:tb_symbol
|
|
xlat cs:tb_symbol
|
|
pop bx
|
|
xchg ah,al
|
|
tst ah
|
|
js menu6
|
|
and ah,00001111b
|
|
jz menu_x1
|
|
cmp ah,MCHR_CALL
|
|
ja menu_x1
|
|
cmp ah,MCHR_VAR
|
|
_ifn e
|
|
push ax
|
|
lodsb
|
|
call isdigit
|
|
_if c
|
|
dec si
|
|
call scandeciw
|
|
pop ax
|
|
IFDEF NEWEXPR
|
|
mov al,dl
|
|
ENDIF
|
|
_else
|
|
IFDEF NEWEXPR
|
|
inc sp
|
|
inc sp
|
|
ELSE
|
|
mov dl,al
|
|
pop ax
|
|
ENDIF
|
|
mov ah,MCHR_CHR
|
|
_endif
|
|
_else
|
|
lodsb
|
|
menu5: pushm <cx,di>
|
|
call setoptnum
|
|
IFDEF NEWEXPR
|
|
mov ax,cx
|
|
popm <di,cx>
|
|
jc menu_x1
|
|
or ah,MENU_VAR
|
|
ELSE
|
|
mov dl,cl
|
|
popm <di,cx>
|
|
jc menu_x1
|
|
mov ah,MCHR_VAR
|
|
ENDIF
|
|
_endif
|
|
IFNDEF NEWEXPR
|
|
mov al,dl
|
|
ENDIF
|
|
tst bx
|
|
jz menu3
|
|
mov es:[bx],ax
|
|
menu6:
|
|
inc bx
|
|
inc bx
|
|
loop menu31
|
|
menu70:
|
|
pop bx
|
|
mov ax,di
|
|
sub ax,bx
|
|
mov es:[bx-2],ax
|
|
jmp menu1
|
|
menu_x2:inc sp
|
|
inc sp
|
|
menu_x1:pop di
|
|
dec di
|
|
dec di
|
|
dec di
|
|
menu_x: stc
|
|
VZ_RET
|
|
df_menu endp
|
|
|
|
;--- Alias ---
|
|
|
|
df_alias proc
|
|
nop ;;;
|
|
alias1:
|
|
clr al
|
|
stosb
|
|
mov bx,offset cgroup:aliasbuf
|
|
call nextclass
|
|
dec di
|
|
call skpsp1
|
|
je alias1
|
|
call copytoeol
|
|
jmps alias1
|
|
df_alias endp
|
|
|
|
;--- Copy to end of line ---
|
|
|
|
copytoeol proc
|
|
cpeol1: stosb
|
|
cpeol2: lodsb
|
|
cmp al,CR
|
|
je cpeol2
|
|
cmp al,LF
|
|
jne cpeol1
|
|
clr al
|
|
stosb
|
|
VZ_RET
|
|
copytoeol endp
|
|
|
|
;--- Skip space,tab ---
|
|
;<-- ZR :next line
|
|
|
|
skpsp proc
|
|
lodsb
|
|
skpsp1: cmp al,SPC
|
|
ja skps9
|
|
cmp al,LF
|
|
jne skpsp
|
|
skps9: VZ_RET
|
|
skpsp endp
|
|
|
|
;--- Skip to next line ---
|
|
|
|
public skipline
|
|
skipline proc
|
|
pushm <cx,di,es>
|
|
movseg es,ds
|
|
mov di,si
|
|
dec di
|
|
mov al,LF
|
|
mov cx,-1
|
|
repne scasb
|
|
mov si,di
|
|
popm <es,di,cx>
|
|
VZ_RET
|
|
skipline endp
|
|
|
|
;--- Scan connma & numerics ---
|
|
;<--
|
|
; CY :no more data
|
|
; AX :result data
|
|
|
|
scannumc proc
|
|
call skpsp
|
|
cmp al,';'
|
|
_if e
|
|
call skipline
|
|
stc
|
|
VZ_RET
|
|
_endif
|
|
cmp al,','
|
|
_if e
|
|
call skpsp
|
|
call scannum
|
|
mov ax,dx
|
|
dec si
|
|
clc
|
|
VZ_RET
|
|
_endif
|
|
dec si
|
|
stc
|
|
VZ_RET
|
|
scannumc endp
|
|
|
|
;--- Scan string ---
|
|
;-->
|
|
; DI :store string ptr
|
|
;<--
|
|
; CY :error
|
|
; SI :placed on next char
|
|
|
|
scanstr0:
|
|
lodsb
|
|
scanstr proc
|
|
call skpsp1
|
|
je scstr_x
|
|
cmp al,','
|
|
je scanstr0
|
|
cmp al,'"'
|
|
je scanstr1
|
|
scstr_x:stc
|
|
VZ_RET
|
|
scans1:
|
|
stosb
|
|
scanstr1:
|
|
lodsb
|
|
cmp al,LF
|
|
je scans8
|
|
scans2: cmp al,'"'
|
|
je scans8
|
|
cmp al,'$'
|
|
jne scans1
|
|
lodsb
|
|
cmp al,'$' ; ##1.5
|
|
je scans1
|
|
cmp al,'('
|
|
je scancode
|
|
cmp al,'['
|
|
je scandup
|
|
cmp al,'"'
|
|
je scans1
|
|
cmp al,SPC
|
|
jbe scans_cr
|
|
mov ah,al
|
|
mov al,'$'
|
|
stosw
|
|
jmp scanstr1
|
|
scans8: clr al
|
|
stosb
|
|
VZ_RET
|
|
scancode:
|
|
mov al,'$'
|
|
call scannum
|
|
jc scanstr1
|
|
xchg al,dl
|
|
stosb
|
|
cmp dl,','
|
|
je scancode
|
|
jmp scanstr1
|
|
scandup:
|
|
lodsb
|
|
call scannum
|
|
jc scanstr1
|
|
mov cx,dx
|
|
cmp al,','
|
|
mov al,0
|
|
_if e
|
|
lodsb
|
|
call scannum
|
|
mov al,dl
|
|
_endif
|
|
rep stosb
|
|
jmp scanstr1
|
|
|
|
scans_cr:
|
|
lodsb
|
|
cmp al,SPC
|
|
jbe scans_cr
|
|
tstb inedit
|
|
_ifn z
|
|
cmp di,lbuf_end
|
|
_if ae
|
|
mov lbufovf,TRUE
|
|
jmp scstr_x
|
|
_endif
|
|
_endif
|
|
jmp scans2
|
|
scanstr endp
|
|
|
|
;--- Scan key symbol ---
|
|
;-->
|
|
; AL :1st char
|
|
;<--
|
|
; CY :error
|
|
; AL :key code
|
|
; SI :placed on next char
|
|
|
|
scankey proc
|
|
pushm <bx,dx,di>
|
|
clr dl
|
|
cmp al,KSYM_CTRL
|
|
je scank1
|
|
mov dl,10100000b
|
|
cmp al,KSYM_SHIFT
|
|
je scank1
|
|
mov dl,00100000b
|
|
cmp al,KSYM_ALT
|
|
je scank1
|
|
mov dl,10000000b
|
|
cmp al,KSYM_L
|
|
je scank2
|
|
jmp scank_x
|
|
scank1:
|
|
lodsb
|
|
cmp al,KSYM_L
|
|
jne scank11
|
|
cmp byte ptr [si],SPC
|
|
jbe scank11
|
|
cmp byte ptr [si+1],SPC
|
|
ja scank2
|
|
scank11:tst dl
|
|
js scank_x
|
|
call toupper
|
|
sub al,40h
|
|
jb scank_x
|
|
cmp al,1Fh
|
|
ja scank_x
|
|
jmps scank_o
|
|
scank2:
|
|
tst dl
|
|
js scank3
|
|
mov dl,11000000b
|
|
jz scank3
|
|
mov dl,11100000b
|
|
scank3:
|
|
lodsb
|
|
call toupper
|
|
cmp al,'F'
|
|
je scanfk
|
|
dec si
|
|
push es
|
|
movseg es,cs
|
|
mov di,offset cgroup:tb_xkey
|
|
clr cx
|
|
_repeat
|
|
mov bx,di
|
|
add bx,4
|
|
call wrdicmp
|
|
cmp di,bx
|
|
je scanxk5
|
|
cmp byte ptr es:[di],SPC
|
|
je scanxk5
|
|
mov di,bx
|
|
inc cx
|
|
cmp cx,XKEYCNT+4
|
|
_while b
|
|
pop es
|
|
jmps scank_x
|
|
scanxk5:
|
|
pop es
|
|
mov si,ax
|
|
mov al,cl
|
|
cmp al,XKEYCNT
|
|
_if ae
|
|
sub al,XKEYCNT
|
|
cmp al,2
|
|
_if ae
|
|
add al,6
|
|
_endif
|
|
_endif
|
|
add al,10h
|
|
jmps scank_o
|
|
scanfk:
|
|
push dx
|
|
lodsb
|
|
call scannum
|
|
mov ah,al
|
|
mov al,dl
|
|
pop dx
|
|
jc scank_x
|
|
cmp ah,KSYM_R
|
|
jne scank_x
|
|
scank_o:
|
|
or al,dl ; clc
|
|
jmps scank9
|
|
scank_x:
|
|
stc
|
|
scank9: popm <di,dx,bx>
|
|
VZ_RET
|
|
scankey endp
|
|
|
|
;--- Check prefix key ---
|
|
;--> AL :key code
|
|
;<-- CY :prefix key (AL :key No.)
|
|
|
|
isprekey proc
|
|
pushm <cx,di,es>
|
|
movseg es,ss
|
|
mov di,offset cgroup:pkeytbl
|
|
mov cx,PKEYCNT
|
|
repne scasb
|
|
clc
|
|
_if e
|
|
sub cx,PKEYCNT-1
|
|
neg cx
|
|
mov al,cl
|
|
stc
|
|
_endif
|
|
popm <es,di,cx>
|
|
VZ_RET
|
|
isprekey endp
|
|
|
|
;--- Scan follow key ---
|
|
;-->
|
|
; AL :prefix key No.
|
|
; DX :key code
|
|
;<--
|
|
; NC,AX :key code
|
|
; CY :error
|
|
|
|
scanpkey proc
|
|
mov ah,al
|
|
add ah,2
|
|
rorm ah,3
|
|
lodsb
|
|
cmp al,'0' ; [ESC]0
|
|
je pkeyn
|
|
call toupper
|
|
sub al,40h
|
|
jb pkey_x
|
|
cmp al,1Fh
|
|
ja pkey_x
|
|
add al,ah
|
|
clr ah
|
|
clc
|
|
VZ_RET
|
|
pkey_x: stc
|
|
VZ_RET
|
|
pkeyn: mov al,INVALID
|
|
VZ_RET
|
|
scanpkey endp
|
|
|
|
;--- Re-customize ---
|
|
|
|
public se_recust,mc_recust
|
|
se_recust proc
|
|
mov al,INVALID
|
|
mc_recust:
|
|
call re_cust
|
|
_if c
|
|
mov [bp].tcp,si
|
|
call disperr
|
|
call putnum
|
|
stc
|
|
_else
|
|
call init_maclink
|
|
push macrosz ; ##156.118
|
|
push recount
|
|
mov bx,sp
|
|
mov dl,M_RECUST
|
|
call dispmsg
|
|
add sp,4
|
|
clc
|
|
_endif
|
|
pushf
|
|
call dspscr
|
|
popf
|
|
VZ_RET
|
|
se_recust endp
|
|
|
|
public re_cust,re_cust1
|
|
re_cust proc
|
|
mov insmdl,al
|
|
re_cust1:
|
|
clr ax
|
|
mov recount,ax
|
|
mov insheadp,ax
|
|
mov inedit,TRUE
|
|
call getnum
|
|
mov ax,[bp].tend
|
|
dec ax
|
|
mov enddefp,ax
|
|
mov si,[bp].ttop
|
|
mov bx,offset cgroup:tb_class2
|
|
mov di,lbuf
|
|
inc di
|
|
inc di
|
|
movseg es,ss
|
|
call readclass
|
|
_ifn c
|
|
movseg ds,ss
|
|
mov al,insmdl
|
|
cbw
|
|
mov di,insheadp
|
|
call set_readmac
|
|
clc
|
|
_endif
|
|
VZ_RET
|
|
re_cust endp
|
|
|
|
;--- Check next class ---
|
|
|
|
nextclass proc
|
|
nclas1: call skipline
|
|
tstb inedit
|
|
_ifn z
|
|
push si
|
|
call recust
|
|
pop si
|
|
_endif
|
|
nclas2: cmp si,enddefp
|
|
jae nclas3
|
|
lodsb
|
|
call if_state
|
|
call skpsp1
|
|
je nclas2
|
|
cmp al,';'
|
|
je nclas1
|
|
cmp al,'='
|
|
je nclas3
|
|
cmp al,'*'
|
|
jne nclas9
|
|
nclas3:
|
|
dec si
|
|
tstb inedit
|
|
_if z
|
|
call nextclass1
|
|
_else
|
|
dec di
|
|
_endif
|
|
inc sp
|
|
inc sp
|
|
clc
|
|
nclas9: VZ_RET
|
|
nextclass endp
|
|
|
|
;--- Copy to buffer ---
|
|
|
|
recust proc
|
|
mov cx,di
|
|
mov dx,headerp
|
|
mov si,dx
|
|
tst si
|
|
_ifn z
|
|
cmp bx,offset cgroup:macrobuf
|
|
_if e
|
|
tstb es:[si]
|
|
jz recust9
|
|
jmps recust1
|
|
_endif
|
|
_else
|
|
recust1:
|
|
mov si,lbuf
|
|
inc si
|
|
inc si
|
|
inc si
|
|
_endif
|
|
mov headerp,0
|
|
push si
|
|
sub cx,si
|
|
jle recust8
|
|
tst bx
|
|
jz recust8
|
|
inc recount
|
|
dec si
|
|
inc cx
|
|
mov di,storep
|
|
pushm <bx,ds,es>
|
|
movseg ds,ss
|
|
movseg es,ss
|
|
cmp bx,offset cgroup:macrobuf
|
|
_if e
|
|
mov ah,insmdl
|
|
call ins_macro
|
|
_else
|
|
call rec_alias
|
|
_endif
|
|
popm <es,ds,bx>
|
|
jc re_ovflow
|
|
mov storep,ax
|
|
recust8:pop di
|
|
recust9:VZ_RET
|
|
|
|
re_ovflow:
|
|
popm <ax,ax,si,ax,ax,ax,ax> ; !!!
|
|
mov dl,E_NOBUFFER
|
|
stc
|
|
VZ_RET
|
|
recust endp
|
|
|
|
rec_alias proc
|
|
tst di
|
|
_if z
|
|
mov di,[bx]
|
|
_endif
|
|
mov ax,di
|
|
add ax,cx
|
|
cmp ax,[bx+2]
|
|
ja reals_x
|
|
call memmove
|
|
dec ax
|
|
clc
|
|
VZ_RET
|
|
reals_x:stc
|
|
VZ_RET
|
|
rec_alias endp
|
|
|
|
;--- Read class symbol ---
|
|
;-->
|
|
; DX :text end
|
|
; BX :class table
|
|
; DI :store ptr
|
|
;<--
|
|
; CY :error
|
|
|
|
class0:
|
|
call skipline
|
|
readclass proc
|
|
class1:
|
|
cmp si,enddefp
|
|
jae class8
|
|
lodsb
|
|
call if_state
|
|
cmp al,'=' ; ##16
|
|
_if e
|
|
push bx
|
|
call read_mdlhead
|
|
pop bx
|
|
jmp class0
|
|
_endif
|
|
cmp al,'*'
|
|
jne class0
|
|
call skpsp
|
|
je class8
|
|
call toupper
|
|
call isupper
|
|
jnc class0
|
|
mov storep,0
|
|
mov sysmnu,0
|
|
push bx
|
|
class2:
|
|
cmp al,cs:[bx]
|
|
je class3
|
|
inc bx
|
|
inc bx
|
|
inc bx
|
|
tstb cs:[bx]
|
|
jnz class2
|
|
pop bx
|
|
tstb inedit
|
|
jnz class0
|
|
stc
|
|
VZ_RET
|
|
class3:
|
|
push bx
|
|
call cs:[bx+1]
|
|
pop ax
|
|
pop bx
|
|
jnc class0
|
|
tstb inedit
|
|
_if z
|
|
pushm <bx,ax,di>
|
|
call synerr
|
|
popm <di,bx>
|
|
jmp class3
|
|
_endif
|
|
mov dl,E_RECUST
|
|
clr al
|
|
xchg lbufovf,al
|
|
tst al
|
|
_ifn z
|
|
mov dl,E_NOLINE
|
|
_endif
|
|
stc
|
|
VZ_RET
|
|
class8: clc
|
|
class9: VZ_RET
|
|
readclass endp
|
|
|
|
;----- Read Module Header -----
|
|
|
|
read_mdlhead proc
|
|
tstw headerp
|
|
jnz rmdlh9
|
|
_repeat
|
|
lodsb
|
|
cmp al,SPC
|
|
jb rmdlh9
|
|
cmp al,'='
|
|
_while e
|
|
call skipspc1
|
|
jb rmdlh9
|
|
cmp al,'='
|
|
je rmdlh9
|
|
|
|
clr ax
|
|
mov storep,ax
|
|
mov sysmnu,al
|
|
mov readmac,ax
|
|
push si
|
|
_repeat
|
|
lodsb
|
|
cmp al,'='
|
|
je readh1
|
|
cmp al,SPC
|
|
_if a
|
|
mov dx,si
|
|
_endif
|
|
_until b
|
|
readh1: call skipline
|
|
mov bx,si
|
|
pop si
|
|
|
|
push di
|
|
mov al,MDL_HEADER ; 0FFh
|
|
stosb ; mh_num
|
|
inc di ; mh_size
|
|
inc di
|
|
clr al
|
|
tstb inedit
|
|
_ifn z
|
|
or al,MDL_EXT
|
|
_endif
|
|
stosb ; mh_flag
|
|
clr ax
|
|
stosw ; mh_nextmdl
|
|
stosw ; mh_namelen
|
|
call read_mdlttl
|
|
clr ax
|
|
stosw
|
|
dec di
|
|
pop si
|
|
xchg si,bx
|
|
mov es:[bx].mh_namelen,cx
|
|
call read_mdlopt
|
|
mov ax,di
|
|
sub ax,bx
|
|
sub ax,3
|
|
mov es:[bx].mh_size,ax
|
|
mov bx,offset cgroup:macrobuf
|
|
tstb inedit
|
|
_if z
|
|
inc di
|
|
call nextclass1
|
|
_else
|
|
mov headerp,di
|
|
_endif
|
|
rmdlh9: VZ_RET
|
|
read_mdlhead endp
|
|
|
|
read_mdlopt proc
|
|
mov al,[si]
|
|
cmp al,'('
|
|
jne mdlopt9
|
|
inc si
|
|
_repeat
|
|
call skipspc
|
|
_break c
|
|
cmp al,')'
|
|
_break e
|
|
call toupper
|
|
cmp al,'S'
|
|
_if e
|
|
or es:[bx].mh_flag,MDL_SLEEP
|
|
_endif
|
|
cmp al,'R'
|
|
_if e
|
|
or es:[bx].mh_flag,MDL_REMOVE
|
|
_endif
|
|
call skipchar
|
|
_until
|
|
mdlopt9: VZ_RET
|
|
read_mdlopt endp
|
|
|
|
read_mdlttl proc
|
|
push si
|
|
clr cx
|
|
_repeat
|
|
mov al,[si]
|
|
cmp al,'.'
|
|
_break e
|
|
cmp al,SPC
|
|
_break e
|
|
cmp al,'='
|
|
_break e
|
|
inc si
|
|
call toupper
|
|
stosb
|
|
inc cx
|
|
cmp cx,8
|
|
_until e
|
|
clr al
|
|
stosb
|
|
pop si
|
|
push cx
|
|
mov cx,dx
|
|
sub cx,si
|
|
mov ax,mhttllen
|
|
sub ax,11
|
|
cmp cx,ax
|
|
_if a
|
|
mov cx,ax
|
|
_endif
|
|
rep movsb
|
|
pop cx
|
|
VZ_RET
|
|
read_mdlttl endp
|
|
|
|
endcs
|
|
|
|
iseg
|
|
|
|
public set_mhttllen
|
|
set_mhttllen proc
|
|
mov dl,MNU_MODULE
|
|
call schsysmenu
|
|
_ifn c
|
|
mov al,[si].mn_wd
|
|
mov byte ptr mhttllen,al
|
|
_endif
|
|
VZ_RET
|
|
set_mhttllen endp
|
|
|
|
;----- #if .. #else .. #endif -----
|
|
|
|
if_state proc
|
|
cmp al,'#'
|
|
_if e
|
|
pushm <bx,cx,dx,di>
|
|
call if_state1
|
|
popm <di,dx,cx,bx>
|
|
_endif
|
|
VZ_RET
|
|
if_state endp
|
|
|
|
|
|
if_state1 proc
|
|
push ax
|
|
cond1: push si
|
|
clr cx
|
|
_repeat
|
|
lodsb
|
|
call islower
|
|
_break nc
|
|
inc cx
|
|
_until
|
|
cmp al,SPC
|
|
ja cond_x
|
|
sub cx,2
|
|
jb cond_x
|
|
cmp cx,5
|
|
ja cond_x
|
|
mov di,offset cgroup:tb_cond
|
|
shl cx,1
|
|
add di,cx
|
|
mov dx,ifbit
|
|
jmp cs:[di]
|
|
cond_x2: inc sp
|
|
inc sp
|
|
cond_x: pop si
|
|
pop ax
|
|
stc
|
|
VZ_RET
|
|
if_state1 endp
|
|
|
|
tb_cond:
|
|
ofs cond_if
|
|
ofs cond_ifn
|
|
ofs cond_else
|
|
ofs cond_endif
|
|
ofs cond_elseif
|
|
ofs cond_elseifn
|
|
|
|
cond_if:
|
|
shl dx,1
|
|
cond_elseif:
|
|
call cond_comp
|
|
jnc skip_sharp
|
|
condif2: or dx,1
|
|
mov si,bx
|
|
condif8: mov ifbit,dx
|
|
pop ax
|
|
pop ax
|
|
lodsb
|
|
clc
|
|
VZ_RET
|
|
cond_ifn:
|
|
shl dx,1
|
|
cond_elseifn:
|
|
call cond_comp
|
|
jc skip_sharp
|
|
jmp condif2
|
|
|
|
cond_comp:
|
|
cmp al,SPC
|
|
jc cond_x2
|
|
call skipspc
|
|
jc cond_x2
|
|
mov bx,si
|
|
call skipline
|
|
mov cx,si
|
|
sub cx,bx
|
|
xchg si,bx
|
|
mov di,offset cgroup:idword
|
|
movseg es,cs
|
|
call strstr
|
|
movseg es,ss
|
|
VZ_RET
|
|
|
|
cond_else:
|
|
call skipline
|
|
test dx,1
|
|
_ifn z
|
|
and dx,not 1
|
|
jmps skip_sharp
|
|
_endif
|
|
or dx,1
|
|
jmp condif8
|
|
|
|
cond_endif:
|
|
call skipline
|
|
shr dx,1
|
|
jmps condif8
|
|
skip_sharp:
|
|
dec si
|
|
_repeat
|
|
call skipline
|
|
lodsb
|
|
cmp al,'#'
|
|
_until e
|
|
mov ifbit,dx
|
|
pop ax
|
|
jmp cond1
|
|
|
|
endis
|
|
|
|
end
|
|
|
|
;****************************
|
|
; End of 'inst.asm'
|
|
; Copyright (C) 1989 by c.mos
|
|
;****************************
|