VZEditor/PATCHED/macro.asm
2025-04-02 08:44:47 +09:00

3037 lines
42 KiB
NASM

;****************************
; 'macro.asm'
;****************************
include vz.inc
;--- Equations ---
MNESTLEVEL equ 16 ; ##16
OPE_GET equ 0
CMD_HIGH equ 01h
LOCALMAC equ 80h
MSYM_ESC equ '$'
KEYMAC equ 90
KEYMACID equ 'BK'
UNKMACID equ 'UN'
PRINTPARM equ 16
VZ_MAC_GET equ 00000001b
VZ_MAC_CHR equ 00000010b
VZ_MAC_STR equ 00000100b
VZ_MAC_PAUSE equ 00001000b
VZ_MAC_MENU equ 00010000b
VZ_MAC_TBOX equ 00100000b
VZ_MAC_SEDIT equ 10000000b
SKPSYMCNT equ 8
MCONST equ 899
ACONST equ 3
mcmd macro cmdnum,label
extrn label :near
db cmdnum
ofs label
endm
ofse macro label
extrn label :near
ofs label
endm
;--- Macro slot record ---
_mget struc
mgettop dw 0 ; get macro top
mgetp dw 0 ; get macro current
mrootp dw 0 ; root macro top
mheadp dw 0 ; module header
_mget ends
;--- External symbols ---
wseg
extrn fpmode :byte
extrn insm :byte
extrn macmode :byte
extrn sftkey :byte
extrn tb_symbol :byte
extrn syssw :byte
extrn extsw :byte
extrn basemode :byte
extrn silent :byte
extrn readmac :word
extrn stack_seg :word
extrn data_seg :word
extrn intregs :word
extrn lbuf :word
extrn macrobuf :word
extrn macsp :word
extrn macrosz :word
extrn retval :word
extrn seed :word
extrn sysmode :word
extrn sysvar :word
extrn tmpbuf3 :word
extrn ubuf :word
extrn wbuf :word
extrn menumsgp :word
extrn sysmnubuf :word
extrn head1st :word
endws
extrn beep_off :near
extrn beep_on :near
extrn bload :near
extrn bsave :near
extrn chkstopkey :near
extrn clrkeymode :near
extrn offkeymode :near
extrn cmdmenu :near
extrn csroff :near
extrn csron :near
extrn ctrlfp :near
extrn dispkeymode :near
extrn dispmacmsg :near
extrn dispstat :near
extrn editloc :near
extrn ins_crlf :near
extrn iskanji :near
extrn memmove :near
extrn readexpr :near
extrn read_key :near
extrn redraw :near
extrn scandecial :near
extrn scandeciw :near
extrn scankey1 :near
extrn scannum :near
extrn scan_chr :near
extrn scan_str :near
extrn scrout_cp :near
extrn setkeysym :near
extrn setoptnum :near
extrn shift_key :near
extrn sprintf :near
extrn storedeciw :near
extrn strcpy :near
extrn strskip :near
extrn textloc_x :near
extrn textloc_y :near
extrn tolower :near
extrn toupper :near
extrn isupper :near
extrn waitcrtv :near
extrn wait_key :near
extrn windgetval :near
extrn scantbl :near
extrn dispmsg :near
extrn scan_flcmd :near
; extrn flsyscall :near
extrn load_iniopt :near
extrn reset_histp :near
extrn open_ext :near
extrn close_ext :near
extrn re_cust :near
extrn re_cust1 :near
dseg ; bseg
;--- Local work ---
GDATA macroparm,label, word
macreg dw 0 ; result registor
runmhp dw 0 ; running macro header ptr
mnestp dw 0 ; get macro ptrs ptr
mnestbase dw 0 ; ##16 for event macro
loopcnt dw 0
looptop dw 0
startmac db 0 ; startup macro
premenu db 0
stepf db 0
dataf db 0 ; input data flag
mnest db MNESTLEVEL*type _mget dup(0) ; get macro ptrs
mnest9 label dword
macreg0 dw 0 ; ##16 save of macreg
macendp dw 0
GDATA insheadp, dw, 0
GDATA mputtop, dw, 0 ; put macro top
mputp dw 0 ; put macro ptr
merrp dw 0 ; error dump ptr
from_intp dw offset cgroup:from_int
intretp dw offset cgroup:intret
intret db 0CBh ; retf
unthead _mdlhead <MDL_HEADER,0,0,0,3>
nm_untmac db "$UN",0,"<Untitled Macro>",0
unthead9 label byte
kbdhead _mdlhead <MDL_HEADER,0,MDL_KEYMAC+MDL_REMOVE,0,3>
nm_kbdmac db "$KB",0,"<Keyboard Macro>",0
kbdhead9 label byte
endds ; endbs
eseg
;--- Constants ---
tb_skipsym db "!#(&>{"
db SYMCHR,'"'
endes
dseg
kmg_mac db " m "
kmg_ok db "OK! "
kmg_ng db "NG! "
;--- Command symbol table ---
public cmdsymtbl
cmdsymtbl db 11 ; <
db 0 ; =
db 12 ; >
db 29 ; ?
db 30 ; @
db 76 ; A
db 52 ; B
db 73 ; C
db 0 ; D
db 78 ; E
db 55 ; F
db 59 ; G
db 18 ; H ##16
db 24 ; I
db 45 ; J
db 80 ; K ##16
db 74 ; L
db 44 ; M
db 72 ; N
db 70 ; O
db 25 ; P
db 77 ; Q
db 71 ; R
db 75 ; S
db 63 ; T
db 43 ; U
db 68 ; V ##16
db 62 ; W
db 79 ; X
db 64 ; Y
db 0 ; Z
db 03 ; [
db 0 ; \
db CM_SEDITMAX ; ]
db 41 ; ^
db 42 ; _
db 0 ; `
db 09 ; a
db 46 ; b
db 36 ; c
db 08 ; d
db 05 ; e
db 10 ; f
db 15 ; g
db 14 ; h
db 48 ; i
db 0 ; j
db 49 ; k
db 19 ; l
db 04 ; m
db 53 ; n
db 0 ; o
db 50 ; p
db 0 ; q
db 35 ; r
db 07 ; s
db 17 ; t
db 20 ; u
db 13 ; v
db 31 ; w
db 06 ; x
db 47 ; y
db 32 ; z
cmdsymend label byte
endds
eseg
;--- System macro vector ---
tb_sysmacjmp:
ofs smac_print ; &?(ptr,arg1,...)
ofs smac_nop ; &@
ofs smac_ask ; &a
ofs smac_beep ; &b(time)
ofs smac_char ; &c
ofs smac_redraw ; &d
ofs smac_ext ; &e(ptr)
ofs smac_find ; &f(n,ptr)
ofs smac_tbox ; &g(ptr[,size])
ofs smac_gethexa ; &h
ofs smac_int ; &i(number) / &i(ptr)
ofs smac_fep ; &j(mode) ; ##156.110
ofs smac_inkey ; &k
ofs smac_line ; &l
ofs smac_msg ; &m(ptr,arg1,...)
ofs smac_getdeci ; &n
ofs smac_output ; &o(data)
ofs smac_pause ; &p
ofs smac_quit ; &q
ofs smac_rnd ; &r
ofs smac_silent ; &s
ofs smac_trace ; &t
ofs smac_upper ; &u(c)
ofs smac_video ; &v(mode)
ofs smac_wait ; &w(time)
ofs smac_locx ; &x(x)
ofs smac_locy ; &y(y)
ofs smac_macload ; &z(deffile)
ofs smac_nop ; &[
ofs smac_nop ; &\
ofs smac_nop ; &]
ofs load_iniopt ; &^
ofs smac_nop ; &_
;--- Macro command vector ---
tb_maccmdjmp:
mcmd 35,mc_pageup
mcmd 36,mc_pagedn
mcmd 42,se_textend
mcmd 43,mc_lastpos
mcmd 44,mc_markpos
mcmd 45,mc_jumpnum
mcmd 51,mc_clrstack
mcmd 63,mc_chgtext
mcmd 64,mc_splitmode
mcmd 68,mc_chgindent
mcmd 80,mc_recust
db 0
;----- Filer macro command -----
tb_e2macsym:
db "CrFiFnSpBm"
db "SmScSaSXSxSFSfSOSoSuSlSnSwSsShSeSy"
db "JkJa"
db "LeLaLsLcIaIsImId"
db "FlFmFg"
db "ZsZd"
db "EaEfEm"
tb_e2macjmp:
ofs emac_sedit
ofse fx_initpool
ofse fx_nextpool
ofs sx_sprintf
ofse get_blkm
tb_e2mac1:
ofs sx_memcpy
ofs sx_strcpy
ofs sx_strcat
ofs sx_strcmp
ofs sx_stricmp
ofs sx_strchr
ofs sx_strichr
ofs sx_strstr
ofs sx_stristr
ofse strupr
ofse strlwr
ofs sx_strlen
ofs sx_wrdlen
ofs sx_skipspc
ofs sx_histcpy
ofs sx_getenv
ofs sx_parsepath
ofs jx_iskanji
ofs jx_cvtkana
ofs lx_mov
ofs lx_addl
ofs lx_subl
ofs lx_cmpl
ofs lx_addlw
ofs lx_sublw
ofs lx_mullw
ofs lx_divlw
ofse fx_filer
ofse fx_mbar
ofse fx_getpool
ofs zx_schmodule
ofs zx_delmacro
ofse ex_emsalloc
ofse xmem_free
ofse ex_emsmap
assume ds:cgroup
iseg
;--- Startup macro ---
public initmacro
initmacro proc
mov ax,retval
tst ax
jz inimac9
cmp al,1
_if e
mov ax,readmac
_endif
mov startmac,al
inimac9:VZ_RET
initmacro endp
endis
;----- Search macro/menu by No. -----
;-->
; SI :data ptr
; DL :data No.
;<--
; CY :not found
public schmacro
schmacro proc
mov si,macrobuf
schmacro1: push ax
_repeat
lodsb
cmp al,dl
je schmac3
tst al
_break z
schmac2: lodsw
add si,ax
_until
stc
schmac3: inc si ; skip length word
inc si
pop ax
schmac9: VZ_RET
schmacro endp
public schsysmenu
schsysmenu proc
pushm <ax,bx>
or dl,MENUMASK
mov si,sysmnubuf
clr bx
_repeat
lodsb
cmp al,dl
_if e
mov bx,si
_endif
tst al
jz schmnu1
lodsw
add si,ax
_until
schmnu1: mov si,bx
tst bx
_if z
stc
_endif
popm <bx,ax>
inc si
inc si
VZ_RET
schsysmenu endp
public schmdlmac
schmdlmac: mov si,runmhp
jmps schloc1
schlocal proc
mov si,[bx].mrootp
mov dh,not byte ptr LOCALMAC
tst dl
jns schloc2
schloc1: mov dh,0FFh
schloc2: lodsb
_repeat
lodsw
add si,ax
lodsb
tst al
jz schloc3
cmp al,MDL_HEADER
je schloc3
and al,dh
cmp al,dl
_until e
inc si
inc si
VZ_RET
schloc3: and dl,not byte ptr LOCALMAC
jmp schmacro
schlocal endp
sch_last proc
clr bx
_repeat
lodsb
tst al
_break z
tst bx
_if z
cmp al,MDL_HEADER
_if e
test [si].mh_flag-1,MDL_KEYMAC
_ifn z
mov bx,si
dec bx
_endif
_endif
_endif
lodsw
add si,ax
_until
VZ_RET
sch_last endp
;----- Search module -----
;--> DI :module name ptr
;<-- CY :not found
sch_module proc
mov si,head1st
_repeat
tst si
stc
_break z
push si
add si,type _mdlhead
call stricmp
pop si
clc
_break e
mov si,[si].mh_nextmdl
_until
schid9: VZ_RET
sch_module endp
zx_schmodule proc
push dx
mov di,ax
call sch_module
_if c
clr si
_endif
mov retval,si
pop ax
mov di,si
call set_readmac
VZ_RET
zx_schmodule endp
;----- Count module -----
;--> CX :#
public cnt_module
cnt_module proc
mov si,head1st
_repeat
tst si
_break z
jcxz cntmdl9
mov si,[si].mh_nextmdl
dec cx
_until
not cx
cntmdl9: VZ_RET
cnt_module endp
;----- Get module header -----
;--> SI :macro ptr
;<-- DI :module header
get_module proc
push ax
mov di,head1st
tst di
_ifn z
_repeat
mov ax,[di].mh_nextmdl
tst ax
_break z
cmp si,ax
_break b
mov di,ax
_until
_endif
pop ax
VZ_RET
get_module endp
;----- Is it macro key? -----
;--> AX :key code
;<-- NC :not macro
public ismacro
ismacro proc
test extsw,ESW_MAC
_ifn z
VZ_RET
_endif
mov dx,ax
mov si,macrobuf
clr cl
clr bx
_repeat
lodsb
tst al
_break z
_if s
lodsw
jmps ismac1
_endif
cmp al,cl
_if g
mov cl,al
_endif
lodsw
push cx
xchg ax,dx
mov di,si
call scankey1 ; ##1.5
xchg ax,dx
pop cx
_if c
call get_module
test [di].mh_flag,MDL_SLEEP
jz ismac_o
cmp di,runmhp
je ismac_o
call scan_gmac
add di,3
cmp si,di
_if e
ismac_o: mov bx,si
_endif
_endif
ismac1: add si,ax
_until
tst bx
_ifn z
mov si,bx
IF 0
tstb macmode
_ifn z
tstb [si-3]
_ifn s
inc si
inc si
call strskip
cmp byte ptr [si],'<'
je notmac
mov si,bx
_endif
_endif
ENDIF
jmps ismac2
_endif
notmac:
mov di,mputp
tst di
_ifn z
call dataend
mov mputp,di
inc cl
cmp cl,KEYMAC
_if b
mov cl,KEYMAC
_endif
mov al,cl
stosb
clr al
stosb
mov ax,di
sub ax,si
sub ax,3
mov [si],ax
push dx
tst dh
_if z
mov dh,0FFh
_else
xchg dl,dh
_endif
mov [si+2],dx
pop dx
_endif
clc
VZ_RET
ismac2:
mov di,mputp
mov al,[si-3] ; macro number
cmp sysmode,SYS_GETC
_if e
not al
mov dl,al
stc
VZ_RET
_endif
tst di
_ifn z
cmp al,KEYMAC
jmpl ge,update_mac
call chkmacbuf
call dataend
push ax
mov al,'&'
stosb
pop ax
call storedeciw
mov mputp,di
_endif
mac_start:
mov al,macmode
tst al
_if z
mac_on:
mov bx,offset cgroup:mnest
mov ax,ubuf+2
mov macsp,ax
call csroff
_else
mov bx,mnestp
cmp al,VZ_MAC_PAUSE
_if e
dec [bx].mgetp
dec [bx].mgetp
_endif
add bx,type _mget
cmp bx,offset cgroup:mnest9
je ismac9
_endif
call set_mnestp
call to_macget
mov ax,stack_seg
mov data_seg,ax
mov dataf,FALSE
jmps setroot1
set_mrootp:
tstb [si-3]
_ifn s
setroot1:
mov ax,sysmode
mov macreg,ax
mov ax,si
sub ax,3
_endif
mov [bx].mrootp,ax
mov [bx].mgettop,si
call get_module
mov [bx].mheadp,di
mseektop:
tstb [si-3]
_ifn s
inc si
inc si
call strskip
_endif
; cmp byte ptr [si],'<'
;_if e
; inc si
;_endif
mov [bx].mgetp,si
ismac9: stc
VZ_RET
ismacro endp
chkmacbuf:
push di
add di,4
cmp di,macrobuf+2
pop di
_if ae
inc sp
inc sp
mac_putoff:
call clrkeymode
macoff: mov mputp,NULL
_endif
stc ; for postmacro
VZ_RET
scan_gmac proc
_repeat
add di,[di].mh_size
add di,3
tstb [di]
_while s
VZ_RET
scan_gmac endp
;--- Off macro ---
public disperr
disperr proc
push ds
movseg ds,ss
mov al,EV_ABORT
call do_evmac
_if c
clr dh
mov retval,dx
call run_evmac
_else
call dispmsg
call prmac_stop
_endif
stc
pop ds
VZ_RET
disperr endp
;--- Do macro ---
public domacro
domacro proc
tstb macmode
_ifn z
mov si,offset cgroup:kmg_ng
call dispkeymode
stc
VZ_RET
_endif
tstw mputp
jnz mac_putoff
clr dl
call schmacro
mov di,si
inc di
inc di
mov mputtop,di
clr al
stosb
mov mputp,di
mov dataf,FALSE
mov si,offset cgroup:kmg_mac
call dispkeymode
stc
VZ_RET
domacro endp
;--- Post-macro ---
public postmacro
postmacro proc
mov ah,macmode
tst ah
jz post1
cmp ah,VZ_MAC_PAUSE
je post_pause
cmp ah,VZ_MAC_CHR
je to_macget
cmp ah,VZ_MAC_STR
je post_str
post9: clc
VZ_RET
post_str:
cmp al,CM_CR
je to_macget
cmp al,CM_ESC
jne post9
to_macget:
mov macmode,VZ_MAC_GET
VZ_RET
post_pause:
call to_macget
mov ah,CMD_HIGH
tst al
_if z
mov ax,dx
_endif
stc
jmp set_retval
post1:
mov di,mputp
tst di
jz post9
call chkmacbuf
tst al
jnz post_cmd
post2:
mov al,TRUE
xchg dataf,al
tst al
_if z
mov al,'"'
stosb
_endif
mov ax,dx
tst ah
_ifn z
xchg al,ah ; JIS
stosw
jmps inc_mputp
_endif
stosb
jmps inc_mputp
post_cmd:
; mov dx,TAB ; ##153.42
; cmp al,CM_TAB
; je post2
call dataend
mov byte ptr [di],'#'
inc di
call schcmdsym
_if c
call storedeciw
_else
stosb
_endif
inc_mputp:
mov mputp,di
jmp post9
postmacro endp
dataend proc
push ax
mov al,FALSE
xchg dataf,al
tst al
_ifn z
clr al
stosb
_endif
pop ax
VZ_RET
dataend endp
public schcmdsym
schcmdsym proc
push di
mov di,offset cgroup:cmdsymtbl
mov cx,offset cmdsymend - offset cmdsymtbl
repne scasb
pop di
stc
_if e
mov al,'<' + offset cmdsymend - offset cmdsymtbl - 1
sub al,cl
clc
_endif
VZ_RET
schcmdsym endp
;--- Update kbd macro ---
;-->
; AL :macro No.
; SI :destin macro ptr + 3
; DI :mputp
update_mac proc
call dataend
mov dx,di
sub dx,mputtop
sub dx,[si-2]
add dx,3 ; DX :new len - old len
mov cx,di
add di,dx
call chkmacbuf
push si
add si,[si-2]
dec si ; term byte
mov di,si
add di,dx
push cx
sub cx,si
call memmove
pop cx
pop di
add [di-2],dx
inc di
inc di
mov si,mputtop
sub cx,si
add si,dx
call memmove
mac_ok: mov si,offset cgroup:kmg_ok
call dispkeymode
jmp macoff
update_mac endp
;--- Add kbd macro ---
public addmacro
addmacro proc
mov di,mputp
tst di
_ifn z
clr al
xchg al,[di]
mov si,mputtop
mov [si-5],al
clr al
stosb
push si
push di
mov di,offset cgroup:nm_kbdmac
call sch_module
pop di
pop si
_if c
sub si,5
mov cx,di
inc cx
sub cx,si
mov di,offset kbdhead9 - offset kbdhead
add di,si
call memmove
mov di,si
mov si,offset cgroup:kbdhead
mov cx,offset kbdhead9 - offset kbdhead
call memmove
sub cx,3
mov [di].mh_size,cx
call init_maclink
_endif
jmp mac_ok
_endif
VZ_RET
addmacro endp
;--- Pre-macro ---
;--> AL :cursor type
;<-- CY :return key code
tb_macopjmp:
ofs mac_menu
ofs mac_cmd
ofs mac_var
ofs mac_call
ofs mac_rem
ofs mac_label
ofs mac_jump
ofs mac_if
ofs prmac_end
ofs prmac_stop
ofs mac_chr
ofs mac_str
public premacro
premacro proc
tstw mputp
_ifn z
mov si,offset cgroup:kmg_mac
call dispkeymode
_endif
test macmode,VZ_MAC_GET
_if z
mov dl,startmac
tst dl
_ifn z
tstb sysmode
_if z
mov startmac,0
call schmacro
_ifn c
call mac_on
jmps prmac1
_endif
_endif
_endif
clc
VZ_RET
_endif
tstb stepf
_ifn z
call csron
_endif
prmac1:
mov bx,mnestp
mov si,[bx].mgetp
prmac2:
call chkstopkey
_if c
call smac_trace
_endif
prmac3:
movseg es,ss
mov ax,[bx].mheadp
mov runmhp,ax
call shift_key
mov sftkey,al
tstb stepf
_ifn z
push si
call dispkeymode
pop si
_repeat
call wait_key
cmp al,SPC
je prmac22
cmp al,ESCP
jmpl e,prmac_stop
cmp al,CR
_until e
mov stepf,FALSE
call csroff
_endif
prmac22:
mov merrp,si
lodsb
clr ah
tstb dataf
jnz prmac_data
tst al
jmpl z,prmac_end
cmp al,'A'
jae prmac_a
cmp al,','
je prmac22
cmp al,SPC
jbe prmac22
push bx
mov dx,ax
sub ax,SPC
mov bx,offset cgroup:tb_symbol
xlat cs:tb_symbol
pop bx
and al,00001111b
jz mac_num
cbw
dec ax
shl ax,1
mov di,offset cgroup:tb_macopjmp
add di,ax
jmp cs:[di]
mac_num:
dec si
jmp mac_var
mac_str:
mov dataf,TRUE
lodsb
prmac_data:
tst al
_if z
mov dataf,FALSE
jmp prmac22
_endif
call iskanji
jnc prdata1
mov ah,al
lodsb
prdata1:mov dx,ax
prdata2:clr al
mov [bx].mgetp,si
stc
VZ_RET
mac_chr:
call scan_chr1
jmp prdata2
prmac_a:
cmp al,'{'
je loop_top
cmp al,'}'
je loop_end
call setoptnum
jmpl c,prmac_err
jmp macvar0
loop_top:
mov ax,macreg
mov looptop,si
jmps loop1
loop_end:
mov ax,loopcnt
tst ax
_ifn z
cmp ax,-1
je endless
dec ax
_ifn z
endless:mov si,looptop
mov [bx].mgetp,si
_endif
_endif
loop1: mov loopcnt,ax
jmp prmac2
prmac_end:
cmp bx,offset cgroup:mnest
jne prmac_pop
public prmac_stop
prmac_stop:
tstw mputp
_if z
call offkeymode ;;
_endif
prstop1:clr ax
mov macmode,al
mov stepf,al
mov runmhp,ax
call reset_histp
and extsw,not(ESW_MAC+ESW_ESCKEY+ESW_TRUSH)
clr ax
public off_silent
off_silent:
mov ss:silent,0
prmac9: clc
VZ_RET
prmac_pop:
mov si,[bx].mgettop
tstb [si-3]
js prpop1
cmp byte ptr [si+2],'!'
_if e
mov ax,macreg0
mov macreg,ax
_else
prpop1: mov ax,macreg
mov retval,ax
_endif
sub bx,type _mget
call set_mnestp
clr ax
cmp bx,mnestbase ; ##16
je prmac9
jmp prmac1
prmac_err:
mov si,merrp
call dispkeymode
jmps prstop1
;--- Menu (!nn) ---
mac_menu:
call scandeciw
jc prmac_err
call set_mgetp
mov si,[bx].mgettop
tstb [si-3]
js nottl
inc si
inc si
tstb [si]
_if z
nottl: clr si
_endif
clr al
macmnu0:mov premenu,al
macmnu1:
clr ax
cmp dl,MENU_MODULE
_if ge
mov al,dl
mov dl,MNU_MACRO
_if e
mov dl,MNU_MODULE
_endif
pushm <ax,si>
call schsysmenu
popm <bx,ax>
jc prmac_err
jmps macmnu2
_endif
cmp dl,MNU_HELP
_if e
mov ax,retval
mov ah,MCHR_CMD
tst al
_if s
not al
mov ah,MCHR_CALL
_endif
_endif
push si
mov si,[bx].mrootp
push dx
or dl,MENUMASK
call schmacro1
pop dx
pop bx
jc prmac_err
tst ax
_ifn z
mov [si+type _menu],ax
_endif
clr al
macmnu2:
mov macmode,VZ_MAC_MENU
xchg bx,si
push dx
push sysmode
call cmdmenu
pop sysmode
pop dx
mov bx,mnestp
mov retval,ax
call to_macget
_if c
tst al
_if z
mov dl,premenu
tst dl
jnz macmnu1
_endif
prmac1a:jmp prmac1
_endif
macmnu3:
mov menumsgp,si
xchg al,dl
cmp ah,MCHR_MENU
jmpl e,macmnu0
mov al,dl
cmp ah,MCHR_CMD
je macmnu9
cmp ah,MCHR_CALL
jne prmac1a
call schmdlmac
jmps maccal1
macmnu9:stc
VZ_RET
;--- Command (#nn,#a) ---
mac_cmd:
call scancmd
jmpl c,prmac_err
call set_mgetp
stc
VZ_RET
;--- Variables (a) ---
mac_var:
clr cx
macvar0:
call readexpr1
jmpl c,prmac_err
cmp al,','
_ifn e
mov macreg,dx
tst al
_if z
dec si
_endif
call set_mgetp
mov si,[bx].mgetp
_endif
jmps prmac2a
readexpr0:
clr cx
readexpr1 proc
push bx
mov dl,OPE_GET
call readexpr
pop bx
lodsb
VZ_RET
readexpr1 endp
;--- Call macro (&nn,&a,&#) ---
mac_call:
lodsb
cmp al,'#'
je maccmd
dec si
call getmacnum
jc cal_err
call set_mgetp
tst al
jnz maccal4
call schlocal
maccal1:
jc cal_err
maccal2:mov ax,[bx].mrootp
add bx,type _mget
cmp bx,offset cgroup:mnest9
je cal_err
call set_mrootp
call set_mnestp
prmac2a:jmp prmac2
maccal4:
call specialjmp
jc maccal2
tst al
jz prmac2a
call isupper
jc call_ext
call toupper
sub al,'?'
jb cal_err
cmp al,'_'-'?'
ja cal_err
cbw
shl ax,1
mov di,offset cgroup:tb_sysmacjmp
add di,ax
call cs:[di]
jmp prmac2a
cal_err1:
pop ax
cal_err:
jmp prmac_err
maccmd:
call scancmd
jc cal_err
push ax
lodsb
cmp al,'('
jne cal_err1
call readexpr0
jc cal_err1
pop ax
mov di,offset cgroup:tb_maccmdjmp
maccmd1:tstb cs:[di]
jz cal_err
cmp al,cs:[di]
je maccmd2
add di,3
jmp maccmd1
maccmd2:
mov di,cs:[di+1]
call call_edit
jmp prmac2a
;----- Call Ext. system macro -----
call_ext:
mov ah,al
lodsb
xchg al,ah
mov di,offset cgroup:tb_e2macsym
mov cx,(offset tb_e2macjmp - offset tb_e2macsym) / 2
push cx
push es
movseg es,cs
repne scasw
pop es
pop ax
jne cal_err
inc cx
sub ax,cx
shl ax,1
mov di,offset cgroup:tb_e2macjmp
add di,ax
cmp di,offset cgroup:tb_e2mac1
_if b
call cs:[di]
jmp prmac2
_endif
lodsb
cmp al,'('
jne cal_err
call readexpr0
pushm <bx,dx>
clr dx
pushm <dx,dx>
mov bx,sp
call readnext
_ifn c
mov [bx+2],dx
call readnext
_ifn c
mov [bx],dx
_endif
_endif
popm <cx,dx,ax,bx>
call set_mgetp
pushm <bx,si>
mov bx,di
mov si,ax
mov di,dx
call cs:[bx]
popm <si,bx>
jmp prmac2
;--- Comment (*...*) ---
mac_rem:
mov al,'*'
call scansym1
jmp prmac2
scansym1:
mov dl,al
mov dh,-1
scansym:
clr cx
scsym1: lodsb
scsym2: tst al
jz scsym8
cmp al,SYMCHR
je scsym_chr
cmp al,'"'
je scsym_str
cmp al,dh
je scsym3
cmp al,dl
jne scsym1
jcxz scsym9
dec cx
jmp scsym1
scsym3: inc cx
jmp scsym1
scsym_chr:
push dx
call scan_chr
jmps scsym4
scsym_str:
push dx
call scan_str
scsym4: pop dx
jmp scsym2
scsym8: dec si
scsym9: VZ_RET
;--- Label/jump (:A,>A,>nn) ---
mac_label:
inc si
jmps prmac2b
mac_jump:
call getmacnum
jc jmp_err
tst al
jnz macjmp2
call schlocal
jc jmp_err
macjmp1:mov ax,[bx].mrootp
call set_mrootp
jmps prmac2b
macjmp2:
call specialjmp
jc macjmp1
tst al
jmpl z,prmac_end
mov di,[bx].mgettop
cmp al,'^'
je macjmp_top
cmp al,'?'
je ongoto
cmp al,'!' ; >! ##16
je onkeygoto
mov ah,al
; mov cx,[di-4] ; !!!
; dec cx
mov cx,macrobuf+2
sub cx,di
macjmp3:dec cx
mov al,':'
repne scasb
jne jmp_err
mov al,ah
scasb
jne macjmp3
mov si,di
macjmp8:mov [bx].mgetp,si
prmac2b:jmp prmac2
macjmp_top:
mov si,di
call mseektop
jmps macjmp8
jmp_err:
jmp prmac_err
ongoto:
lodsb
cmp al,'{'
jne jmp_err
push si
call skp_blk
mov [bx].mgetp,si
pop si
mov cx,macreg
ongoto1:jcxz prmac2b
lodsb
cmp al,'}'
je prmac2b
cmp al,'|'
_if e
mov [bx].mgetp,si
jmps prmac2b
_endif
push cx
call mac_skip
pop cx
dec cx
jmp ongoto1
set_mgetp:
cmp si,[bx].mgetp
_if a
mov [bx].mgetp,si
_endif
VZ_RET
;----- On Key goto -----
onkeygoto proc
lodsb
cmp al,'{'
jne jmp_err
push si
call skp_blk
mov [bx].mgetp,si
pop si
mov dx,macreg
_repeat
lodsb
cmp al,'}'
je onkey8
cmp al,'|'
_if e
mov [bx].mgetp,si
jmps onkey8
_endif
cmp al,'('
_if e
push dx
call readexpr0
mov ax,dx
pop dx
jmps onkey1
_endif
clr ah
call iskanji
_if c
mov ah,al
lodsb
_endif
onkey1: cmp ax,dx
je onkey8
lodsb
push dx
call mac_skip
pop dx
_until
onkey8: jmp prmac2
onkeygoto endp
;--- If (?) ---
mac_if:
tstw macreg
mov ax,FALSE
_if z
lodsb
call mac_skip
mov ax,TRUE
_endif
mov macreg,ax
jmp prmac2b
mac_skip:
mov di,offset cgroup:tb_skipsym
mov cx,SKPSYMCNT
call scantbl
_if e
mov di,offset cgroup:tb_skipjmp
sub cx,SKPSYMCNT-1
neg cx
shl cx,1
add di,cx
jmp cs:[di]
_endif
cmp al,'A'
_if ae
mov al,','
jmp scansym1
_endif
VZ_RET
tb_skipjmp:
ofs scandeciw
ofs scandecial
ofs skp_var
ofs skp_call
ofs getmacnum
ofs skp_blk
ofs scan_chr1
ofs scan_str1
skp_call:
lodsb
cmp al,'#'
jne gmacn0
call scandecial
lodsb
skp_var:
movhl dx,'(',')'
jmp scansym
skp_blk:
movhl dx,'{','}'
jmp scansym
scan_chr1:
call scan_chr
dec si
VZ_RET
scan_str1:
call scan_str
dec si
VZ_RET
gmacn0: call isupper ;; &S?
_ifn c
dec si
_endif
getmacnum:
call scandecial
jc gmacn9
cmp al,'+'
je gmacn1
cmp al,'-'
jne gmacn8
gmacn1: mov dl,[si]
sub dl,'0'
cmp dl,'A'-'0'
_if ae
sub dl,'A'-'9'-1
_endif
inc si
clr dh
cmp al,'-'
_if e
neg dl
_endif
mov di,[bx].mgettop
add dl,[di-3]
clr al
gmacn8: clc
gmacn9: VZ_RET
specialjmp:
cmp al,'>'
je jmp_next
cmp al,'*'
je jmp_ref
spjmp_x:clc
VZ_RET
jmp_next:
mov si,[bx].mgettop
add si,[si-2]
add si,3
stc
VZ_RET
jmp_ref:
mov dx,readmac
tst dx
jz jmp_abort
tst dh
_if z
call schmacro
jc spjmp_x
_else
mov si,dx
add si,3
_endif
stc
VZ_RET
jmp_abort:
mov si,eventvct
tst si
_ifn z
inc si
inc si
stc
VZ_RET
_endif
inc sp
inc sp
jmp prmac_stop
premacro endp
;--- Scan command #xx ---
;<-- NC,AL :command No.
public scancmd,cvt_cmdsym
scancmd proc
call scandecial
jc sccmd_x
tst al
_if z
mov al,dl
_else
cvt_cmdsym:
cmp sysmode,SYS_FILER
_if ae
cmp basemode,SYS_FILER
_if e
call scan_flcmd
jc scancm9
_endif
_endif
sub al,'<'
jb sccmd_x
cmp al,offset cmdsymend - offset cmdsymtbl
ja sccmd_x
push bx
mov bx,offset cgroup:cmdsymtbl
xlat
pop bx
_endif
scancm9:clc
VZ_RET
sccmd_x:stc
VZ_RET
scancmd endp
;--- Read parameter ---
readparm proc
lodsb
cmp al,'('
jne parm_x4
call readexpr0
jc parm_x4
clc
VZ_RET
parm_x4:
inc sp
inc sp
smac_err:
inc sp
inc sp
jmp prmac_err
readparm endp
readnext proc
cmp al,','
jne parm_x
call readexpr0
VZ_RET
parm_x:
stc
VZ_RET
readnext endp
;--- System macro ---
smac_quit:
cmp bx,offset cgroup:mnest
je sbrk9
ldl [bx]
sub bx,type _mget
stl [bx]
set_mnestp:
mov mnestp,bx
sbrk9: VZ_RET
smac_trace:
mov stepf,TRUE
smac_nop:
VZ_RET
smac_upper:
call readparm
mov ax,dx
tst ah
_if z
call toupper
_endif
jmps set_retval
smac_silent:
mov silent,1
VZ_RET
smac_redraw:
call off_silent
tstb sysmode ; ##100.15
_if z
call redraw
_endif
VZ_RET
smac_char:
mov al,VZ_MAC_CHR
jmps smac8
smac_line:
mov al,VZ_MAC_STR
jmps smac8
smac_inkey:
call read_key
_if z
clr ax
_else
tst al
_ifn z
clr ah
_endif
push ax
_repeat
call read_key
_until z
pop ax
_endif
set_retval:
mov retval,ax
VZ_RET
smac_pause:
mov al,VZ_MAC_PAUSE
smac8: mov macmode,al
inc sp
inc sp
clc
VZ_RET
public smac_output ;;;
smac_output:
call readparm
clr al
cmp dh,CMD_HIGH
_if e
mov al,dl
_endif
call set_mgetp ; ##16
inc sp
inc sp
stc
VZ_RET
sx_sprintf:
call readparm
mov di,dx
call readnext
jmps smsg1
smac_ask:
mov di,1
jmps smsg0
smac_print:
mov di,tmpbuf3
jmps smsg0
smac_msg:
clr di
smsg0: call readparm
smsg1: push bx
sub sp,PRINTPARM*2
mov bx,sp
pushm <dx,di>
clr di
_repeat
cmp al,','
_break ne
call readexpr0
jc smsg_x
mov ss:[bx+di],dx
inc di
inc di
cmp di,PRINTPARM*2
_until e
popm <di,dx>
pushm <si,di>
mov si,dx
cmp di,1 ;;
_if be
call dispmacmsg
_else
call sprintf
; clr al ; ##100.06
; stosb
_endif
popm <ax,si>
add sp,PRINTPARM*2
pop bx
cmp ax,tmpbuf3 ;;
je prntcall
VZ_RET
prntcall:
mov [bx].mgetp,si
mov si,ax
clr al
stosb
mov dataf,TRUE
jmp smaccall
smsg_x:
add sp,PRINTPARM*2 + 4 ; ##16
pop bx
jmp smac_err
smac_tbox: ; ##16
push bx
call readparm ; title
push dx
call readnext ; wsize
_if c
clr dx
mov al,GETS_INIT
_else
neg dx
push dx
call readnext ; inistr
mov al,GETS_INIT
_ifn c
push si
mov si,dx
mov di,wbuf
call strcpy
inc di
clr al
stosb
pop si
mov al,GETS_COPY
_endif
pop dx
_endif
pop bx
push si
mov macmode,VZ_MAC_TBOX
push sysmode
call windgetval
pop sysmode
pop si
call to_macget
mov retval,dx
pop bx
VZ_RET
smac_beep:
test word ptr syssw,SW_BEEP
jz smac_wait
call beep_on
call smac_wait
call beep_off
VZ_RET
smac_wait:
call readparm
mov cx,dx
tst cx ; ##16
_ifn z
_repeat
call waitcrtv
_loop
_endif
VZ_RET
smac_rnd:
mov ax,seed
xchg al,ah
mov dx,MCONST
mul dx
add ax,ACONST
and ah,7Fh
mov seed,ax
jmp set_retval
smac_int:
call readparm
pushm <bx,si,bp>
mov di,offset cgroup:intregs
mov ax,dx
tst ah
_if z
mov ah,al
mov al,0CDh
_else
mov bp,ax
mov ax,22EBh ; jmp to_int
_endif
mov cs:opcode,ax
jmpw ; ##156.136
mov ax,[di]
mov bx,[di+2]
mov cx,[di+4]
mov dx,[di+6]
mov si,[di+8]
mov di,[di+10]
pushm <ds,es>
opcode dw 0
from_int:
popm <es,ds>
push di ; ##16
mov di,offset cgroup:intregs
mov [di],ax
mov [di+2],bx
mov [di+4],cx
mov [di+6],dx
mov [di+8],si
pop [di+10] ; ##16
popm <bp,si,bx>
set_ret0:
mov ax,0
rcl ax,1
jmp set_retval
to_int:
push cs
push from_intp
push intretp
push ss
push bp
retf
smac_locx:
mov di,offset cgroup:textloc_x
jmps sloc1
smac_locy:
mov di,offset cgroup:textloc_y
sloc1: call readparm
call_edit:
cmp sysmode,SYS_SEDIT
_if e
pushm <bx,si,ds>
mov ds,[bp].ttops
pushm <dx,di>
cmp di,offset cgroup:textloc_x
_ifn e
call bsave
_endif
popm <di,dx>
mov ax,dx
call di
mov ax,0
sbb ax,ax
mov ss:retval,ax
call dispstat
call editloc
popm <ds,si,bx>
_endif
VZ_RET
smac_getdeci:
clr al
jmps sdeci1
smac_gethexa:
mov al,'$'
sdeci1: pushm <si,ds>
mov ds,[bp].lbseg
mov si,[bp].tcp
push si ; ##154.59
tst al
_if z
lodsb
_endif
call scannum
pop ax
jc sget_x
dec si ; ##153.34
cmp si,ax
_if e
sget_x: mov dx,INVALID
_endif
popm <ds,si>
mov ax,dx
jmp set_retval
smac_ext:
mov [bx].mgetp,si
call readparm
mov si,dx
smaccall:
mov ax,[bx].mrootp
add bx,type _mget
cmp bx,offset cgroup:mnest9
je smac_err1
mov [bx].mrootp,ax
mov [bx].mgettop,si
mov [bx].mgetp,si
call set_mnestp
VZ_RET
smac_err1:
jmp smac_err
smac_find:
call readparm
push dx
call readnext
pop ax
jc smac_err1
push si
mov si,dx
mov dx,ax
call strchr
_ifn c
mov cx,INVALID
_endif
mov retval,cx
pop si ; ##156.144
VZ_RET
smac_video proc
call readparm
tst dx
_if z
call csroff
_else
mov al,insm
call csron
_endif
VZ_RET
smac_video endp
smac_fep proc ; ##156.110
call readparm
mov ah,FEP_OFF
tst dx
_ifn z
mov ah,FEP_ON
_ifn s
mov fpmode,dl
_endif
_endif
call ctrlfp
mov fpmode,al
VZ_RET
smac_fep endp
;----- &z() macro loader -----
smac_macload proc
call readparm
push dx
call readnext
_if c
clr dx
_endif
pop ax
xchg ax,dx
pushm <bx,si,bp>
push ax
cmp sysmode,SYS_SEDIT
_if e
mov ds,[bp].ttops
call bsave
_endif
call open_ext
pop ax
_ifn c
call re_cust
_if c
cmp dl,E_NOBUFFER
stc
_if e
call retry_recust
_endif
_endif
pushf
call close_ext
popf
_endif
_if c
mov readmac,0
_else
clr dl
_endif
clr dh
movseg ds,ss
mov retval,dx
popm <bp,si,bx>
VZ_RET
smac_macload endp
retry_recust proc
mov si,ss:insheadp
tst si
_ifn z
mov ax,INVALID
call del_macro
_endif
mov si,ss:head1st
_repeat
test ss:[si].mh_flag,MDL_EXT
_ifn z
push si
mov ax,INVALID
call del_macro
pop si
_ifn c
call re_cust1
jc retry_recust
VZ_RET
_endif
_endif
mov si,ss:[si].mh_nextmdl
tst si
_until z
retry_x: stc
mov dl,E_NOBUFFER
VZ_RET
retry_recust endp
;----- String operations -----
extrn strncpy :near
extrn strcmp :near
extrn stricmp :near
extrn strchr :near
extrn strichr :near
extrn strstr :near
extrn stristr :near
extrn strlen :near
extrn skipstr :near
extrn skipspc :near
extrn histcpy1 :near
extrn scanenv1 :near
extrn parsepath :near
extrn cvtkanakey :near
sx_memcpy proc
xchg si,di
jmp memmove
sx_memcpy endp
sx_strcpy proc
xchg si,di
strcpy1: tst cx
_if z
dec cx
_endif
call strncpy
mov ss:retval,di
VZ_RET
sx_strcpy endp
sx_strcat proc
xchg si,di
call skipstr
dec di
jmps strcpy1
sx_strcat endp
sx_strcmp proc
call strcmp
stcmp1: mov ax,0
_ifn e
inc ax
_endif
strret1: mov ss:retval,ax
VZ_RET
sx_strcmp endp
sx_stricmp proc
call stricmp
jmp stcmp1
sx_stricmp endp
sx_strchr proc
call strchr
strchr1: mov ax,0
_if c
mov ax,si
_endif
jmp strret1
sx_strchr endp
sx_strichr proc
call strichr
jmp strchr1
sx_strichr endp
sx_strstr proc
call strstr
jmp strchr1
sx_strstr endp
sx_stristr proc
call stristr
jmp strchr1
sx_stristr endp
sx_strlen proc
call strlen
jmp strret1
sx_strlen endp
sx_wrdlen proc
push si
_repeat
lodsb
cmp al,SPC
_until be
dec si
mov ax,si
pop si
sub ax,si
jmp strret1
sx_wrdlen endp
sx_skipspc proc
call skipspc
mov ax,si
jmp strret1
sx_skipspc endp
sx_histcpy proc
push cx
mov bx,si
mov si,di
call skipstr
dec di
clr cx
pop ax
call histcpy1
VZ_RET
sx_histcpy endp
sx_getenv proc
pushm <cx,si>
mov si,di
call scanenv1
popm <di,cx>
mov ss:retval,0
_if c
mov ds,ax
call strcpy1
_endif
movseg ds,ss
VZ_RET
sx_getenv endp
sx_parsepath proc
call parsepath
mov ss:retval,dx
mov di,offset cgroup:intregs
mov [di+2],bx
mov [di+4],cx
mov [di+8],si
VZ_RET
sx_parsepath endp
jx_iskanji proc
call iskanji
jmp set_ret0
jx_iskanji endp
jx_cvtkana proc
tst ah
_if z
call cvtkanakey
_endif
mov retval,ax
VZ_RET
jx_cvtkana endp
;----- Long int operations -----
lx_mov proc
xchg si,di
movsw
movsw
VZ_RET
lx_mov endp
lx_addl proc
ldl [di]
add [si],ax
adc [si+2],dx
VZ_RET
lx_addl endp
lx_subl proc
ldl [di]
sub [si],ax
sbb [si+2],dx
VZ_RET
lx_subl endp
lx_cmpl proc
ldl [si]
cmpl [di]
mov ax,0
_ifn e
_if g
inc ax
_else
dec ax
_endif
_endif
mov retval,ax
VZ_RET
lx_cmpl endp
lx_addlw proc
addlw [si],dx
VZ_RET
lx_addlw endp
lx_sublw proc
sublw [si],dx
VZ_RET
lx_sublw endp
lx_mullw proc
mov ax,[si]
mul di
pushm <ax,dx>
mov ax,[si+2]
mul di
mov cx,ax
popm <dx,ax>
add dx,cx
stl [si]
VZ_RET
lx_mullw endp
lx_divlw proc
ldl [si]
idiv di
mov retval,dx
clr dx
stl [si]
VZ_RET
lx_divlw endp
;----- Misc. functions -----
emac_sedit proc
cmp sysmode,SYS_SEDIT
_ifn e
sub si,3
mov [bx].mgetp,si
inc sp
inc sp
clc
VZ_RET
_endif
VZ_RET
emac_sedit endp
;----- Insert macro -----
;-->
; SI :source ptr
; DI :store ptr (NULL=init)
; CX :source size
; DX :header skip ptr
; AH :-1=#80, else insert module
;<--
; CY :overflow
; AX :next store ptr
public ins_macro
ins_macro proc
mov bx,di
tst di
_if z
mov al,[si]
tst dx ; headerp
_ifn z
mov di,dx
mov al,[di]
_endif
mov dl,al
pushm <si,cx>
call set_storep
popm <cx,si>
_endif
dec cx ;;
mov ax,macrosz
cmp ax,cx
jb insmac_x
mov ax,macendp
push ax
tst ax
_ifn z
pushm <cx,si,di>
xchg ax,cx
sub cx,bx
mov si,bx
add di,ax
call memmove
sub di,si
add macendp,di
popm <di,si,cx>
_endif
call memmove
cmp [di].mh_num,MDL_HEADER
_if e
mov insheadp,di
_endif
add di,cx
pop ax
tst ax
_if z
mov byte ptr [di],0
_endif
push di
call init_maclink
pop ax
clc
insmac_x: VZ_RET
ins_macro endp
;----- Set store ptr -----
set_storep proc
mov macendp,0
tst ah
_ifn s
cmp [si].mh_num,MDL_HEADER
_if e
lea di,[si+type _mdlhead]
call sch_module
_ifn c
; push si
mov ax,INVALID
call del_macro
; pop di
; clr dl
; call schmacro
; dec si
; dec si
; mov macendp,si
; mov bx,di
; VZ_RET
_endif
_endif
clr dl
_endif
tst dl
_if s
clr dl
_endif
mov si,macrobuf
clr bx ; kbd macro ptr
clr cx ; previous macro
clr di ; found ptr
_repeat
lodsb
tst al
_break z
cmp al,dl
_if e
tst di
_if z
mov di,si
dec di
_endif
_endif
cmp al,MDL_HEADER
_if e
test [si].mh_flag-1,MDL_KEYMAC
_ifn z
tst bx
_if z
mov bx,si
dec bx
_endif
_endif
_endif
tst di
_if z
mov cx,si
_endif
lodsw
add si,ax
_until
dec si
tst di
_if z
mov di,si
_else
tst cx
_ifn z
push si
mov si,cx
dec si
cmp byte ptr [si],MDL_HEADER
_if e
mov di,si
_endif
pop si
_endif
_endif
tst bx
_ifn z
inc si
mov macendp,si
dec si
cmp si,di
_if e
mov di,bx
_endif
_endif
VZ_RET
set_storep endp
;---- Set readmac -----
;-->
; AX :index
; DI :header ptr
public set_readmac
set_readmac proc
tst di
jz stread9
mov cx,ax
tst cx
js stread9
inc cx
_repeat
call scan_gmac
jz stread9
_loop
mov readmac,di
stread9: VZ_RET
set_readmac endp
;----- Delete macro -----
;--> AX :name ptr or #
;<-- CY :cannot delete
public del_macro
del_macro proc
pushm <ds,es>
movseg ds,ss
movseg es,ss
cmp ax,INVALID
_ifn e
tst ah
_ifn z
mov di,ax
call sch_module
jc delmac9
_else
mov cx,ax
call cnt_module
tst si
stc
jz delmac9
_endif
test [si].mh_flag,MDL_EXT+MDL_REMOVE
stc
jz delmac9
_endif
call onrun
jc delmac9
mov di,si
mov ax,[si].mh_nextmdl
tst ax
_if z
mov [si].mh_num,0
_else
mov si,ax
push si
call sch_last
mov cx,si
pop si
sub cx,si
call memmove
_endif
mov readmac,0
call init_maclink
clc
delmac9: popm <es,ds>
VZ_RET
del_macro endp
zx_delmacro proc
call del_macro
jmp set_ret0
zx_delmacro endp
onrun proc
push bx
mov bx,offset cgroup:mnest
_repeat
cmp si,[bx].mheadp
jbe onrun_x
add bx,type _mget
cmp bx,mnestp
_until a
clc
skip1
onrun_x: stc
pop bx
VZ_RET
onrun endp
public isrun
isrun proc
push bx
mov bx,offset cgroup:mnest
_repeat
cmp si,[bx].mheadp
stc
je isrun9
add bx,type _mget
cmp bx,mnestp
_until a
clc
isrun9: pop bx
VZ_RET
isrun endp
;--- Print keyboard macro ---
dummy label byte
dummyw label word
public se_printmac
se_printmac proc
push [bp].tnow
mov si,ss:macrobuf
_repeat
lods ss:dummy
tst al
_break z
cmp al,KEYMAC
jge wmac3
wmac2: lods ss:dummyw
add si,ax
_until
pop si
call scrout_cp
VZ_RET
wmac3:
pushm <ax,si>
mov di,[bp].tnow
call ins_crlf
call bload
popm <si,ax>
push si
push ds
movseg ds,ss
movseg es,ss
mov di,lbuf
inc di
inc di
call storedeciw
mov al,SPC
stosb
inc si
inc si
lodsw
inc si
push si
call setkeysym
pop si
dec di
mov al,SPC
stosb
mov ax,'""'
stosw
mov al,SPC
stosb
mov cx,[si-5]
sub cx,4
_ifn z ; ##100.03
clr dl
_repeat
lodsb
cmp al,'$'
_if e
stosb
_endif
cmp al,'"'
_if e
tst dl
_ifn z
mov al,'$'
stosb
mov al,'"'
_endif
mov dl,TRUE
_endif
tst al
_if z
mov dl,FALSE
mov al,'"'
_endif
stosb
_loop
_endif
mov [bp].bend,di
mov al,LF
stosb
pop ds
call bsave
mov ax,[bp].tnxt
mov [bp].tnow,ax
pop si
jmp wmac2
se_printmac endp
endes
;------------------------------------------------
; Event Macro
;------------------------------------------------
dseg
eventvct dw EVENTCNT dup (0)
endds
eseg
tb_event db "ASOCEVTF"
;----- Init macro buffer -----
public init_maclink
init_maclink proc
pushm <ds,es>
movseg ds,ss
movseg es,ss
mov di,offset cgroup:eventvct
mov cx,EVENTCNT
clr ax
rep stosw
mov head1st,ax
mov si,macrobuf
clr bx
_repeat
lodsb
tst al
_break z
_if s
cmp al,MDL_HEADER
_if e
dec si
tst bx
_if z
mov head1st,si
_else
mov [bx].mh_nextmdl,si
_endif
mov bx,si
mov [si].mh_nextmdl,0
inc si
_endif
jmps iniev1
_endif
cmp byte ptr [si+4],'!'
_if e
push bx
call initevmac
pop bx
_endif
iniev1:
lodsw
add si,ax
_until
mov ax,macrobuf+2
sub ax,si
mov macrosz,ax
popm <es,ds>
VZ_RET
init_maclink endp
;----- Init Event macro -----
initevmac proc
mov al,[si+5]
call toupper
mov di,offset cgroup:tb_event
mov cx,EVENTCNT
call scantbl
_if e
inc si
inc si
sub cx,EVENTCNT-1
neg cx
shl cx,1
mov di,offset cgroup:eventvct
add di,cx
;_repeat
; mov ax,[di]
; tst ax
; _break z
; mov di,ax
;_until
mov [di],si
; mov word ptr [si],0
dec si
dec si
_endif
VZ_RET
initevmac endp
;----- Do Event macro -----
;--> AL :event type (EV_)
;<-- CY :start evmac (BX :mnestp)
public do_evmac
do_evmac proc
pushm <cx,dx,si,ds>
movseg ds,ss
test extsw,ESW_MAC
jnz doevmac8
cbw
mov bx,ax
dec bx
shl bx,1
add bx,offset cgroup:eventvct
mov si,[bx]
tst si
jz doevmac8
clr bx
tstb macmode
_ifn z
mov bx,mnestp
cmp si,[bx].mgettop
je doevmac8
_endif
pushm <ax,bx>
mov ax,macreg
mov macreg0,ax
call mac_start
popm <bx,ax>
stc
skip2
doevmac8: clr ax
popm <ds,si,dx,cx>
VZ_RET
do_evmac endp
;----- Do Event macro -----
;--> BX :mnestp
;<-- CY,AX :command code
public run_evmac
run_evmac proc
push ds
movseg ds,ss
mov mnestbase,bx
mov bx,mnestp
mov si,[bx].mgetp
call prmac3
_if c
push ax
call prmac_end
pop ax
stc
_endif
mov mnestbase,0
pop ds
VZ_RET
run_evmac endp
endes
end
;****************************
; End of 'macro.asm'
; Copyright (C) 1989 by c.mos
;****************************