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

2104 lines
36 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.

;****************************
; 'main.asm'
;****************************
include vz.inc
;--- Equations ---
DTASZ equ 128
MAX_CONBFSZ equ 32
PKEYCNT equ 6
STACKSZ equ 256
VARCNT equ 46
TMPPATHSZ equ 32
PFBUFSZ equ 84 ; ##156.95
MIN_MEMORY equ 1800h
MIN_LOGTBL equ 128
refp macro label
extrn label :near
dw offset cgroup:label
endm
;--- External symbols ---
extrn cmdsymtbl :byte
extrn scrnparm :byte
extrn flparm :byte
extrn macroparm :byte
extrn mg_crlf :byte
extrn mg_cstmerr :byte
extrn mg_ems :byte
extrn mg_emspage :byte
extrn mg_xms :byte
extrn mg_xmssize :byte
extrn mg_hardng :byte
extrn mg_install :byte
extrn mg_noent :byte
extrn mg_nospc :byte
extrn mg_opterr :byte
extrn mg_remove :byte
extrn mg_rmerr :byte
extrn mg_synerr :byte
extrn mg_title :byte
; extrn mg_update :byte
extrn mg_verng :byte
extrn mg_ctrl_c :byte
extrn code_end :near
extrn addsep :near
extrn adjustfar :near
extrn bsave :near
extrn checkhard :near
extrn chkint29 :near
extrn clrmsg :near
extrn clrstack :near
extrn clrwstack :near
extrn customize :near
extrn disperr :near
extrn dispstat :near
extrn dspscr :near
extrn ems_salloc :near
extrn ems_check :near
extrn xmem_close :near
extrn ems_map :near
extrn ems_map2 :near
extrn ems_open :near
extrn getcurdir :near
extrn getcurdir1 :near
extrn getdoskey :near
extrn getdosloc :near
extrn getdosscrn :near
extrn getkey :near
extrn histcpy :near
extrn initcbuf :near
; extrn initckey :near
extrn initcon :near
extrn inittmpslot :near
extrn initfar :near
extrn initfp :near
extrn initkeytbl :near
extrn initmacro :near
extrn initscrn :near
extrn initvram :near
extrn initvzkey :near
extrn insertcvt :near
extrn install_vz :near
extrn islower :near
extrn isupper :near
extrn isviewmode :near
extrn ld_wact :near
extrn ledit :near
extrn loadwloc :near
extrn locate :near
extrn memmove :near
extrn memclear :near
extrn movearea :near
extrn offlbuf :near
extrn opencon :near
extrn parsepath :near
extrn putdosscrn :near
extrn quit_tsr :near
extrn remove_vz :near
extrn resetcrt :near
extrn resetfp :near
; extrn resetgbank :near
extrn resetint24 :near
extrn resetint29 :near
extrn resetintstop :near
extrn resetscr :near
extrn savewloc :near
extrn setdoscsr :near
extrn setdoskey :near
extrn setdoswindow :near
extrn setfnckey :near
; extrn setgbank :near
extrn setint24 :near
extrn setintstop :near
extrn setoption :near
extrn setvzkey :near
extrn se_open2 :near
extrn skipchar :near
extrn skipspc :near
extrn skipstr :near
extrn sprintf :near
extrn strcpy :near
extrn strlen :near
extrn strncpy :near
extrn synerr :near
extrn tolower :near
extrn undercsr :near
extrn windcount :near
extrn winit :near
extrn stack_cs :near
extrn xms_open :near
extrn xmem_trunc :near
extrn init_bmp :near
extrn read_logtbl :near
extrn write_logtbl :near
extrn set_insm :near
extrn init_maclink :near
extrn init_module :near
extrn set_opnopt :near
extrn set_blktgt :near
extrn check_vwx :near
extrn ini_open :near
extrn tb_opt_wd :near
extrn tb_opt_atr :near
extrn write_gopt :near
extrn prmac_stop :near
extrn readref :near
extrn set_mhttllen :near
extrn do_evmac :near
extrn run_evmac :near
extrn cmdparm :dword
;--- Segment headers ---
dseg
GDATA parbuf, label, near
db "DSEG"
endds
bseg
GDATA bstop, label, near
GDATA cs_stack,label, near
db "BSEG"
GDATA save_ds, dw, 0
GDATA invz, db, 1 ; in VZ flag
GDATA stopf, db, 0 ; [STOP] flag
GDATA cmdlinef, db, 0 ; #16
endbs
cseg
GDATA cstop, label, near
db "CSEG"
endcs
eseg
GDATA estop, label, near
endes
wseg
assume ds:cgroup
;--- PSP defs. ---
org 02h
maxseg label word
org 16h
parentpsp label word ; ##153.39
org 2Ch
GDATA myenvseg, label, word
org 80h
GDATA cmdln, label, byte
org 100h
entry: jmps entry1
vzversion: db "VZ1.60 ",0,EOF
entry1: jmp init
dw 0
GDATA nm_vz, db, <'VZ',0,0,0,0,0,0,0>
GDATA hardware, db, 0
org 120h
;--- Customizing data ---
GDATA nullptr, dw, 0
GDATA tsrflag, dw, 0 ; Z
GDATA tpafreep, dw, 0 ; ZP
GDATA tbsize, dw, 64 ; Bt
GDATA conbufsz, dw, 32 ; Bo
;GDATA temps, dw, 0 ; Bq ##16 N/A
GDATA logtblsz, dw, 1024 ; Bv log file table size
GDATA frees, dw, 32 ; Bf
GDATA emspages, dw, 1 ; EM
GDATA emsfree, dw, 0 ; EF
;GDATA gvram, dw, 0 ; GV ##16 N/A
GDATA xmssize, dw, 1 ; XM
data_sztop label word
GDATA macrosz, dw, 1024 ; Bm
aliassz dw 0 ; Ba
sbufsz dw 256 ; Hs
fbufsz dw 128 ; Hf
xbufsz dw 128 ; Hx
abufsz dw 64 ; Ha
wbufsz dw 64 ; Hw
nbufsz dw PATHSZ
tsbufsz dw TTLSTRSZ
data_szend label word
cbufsz dw 256 ; Bc
GDATA lbufsz, dw, 1024 ; Bl
GDATA wndc, dw, 10 ; TC
iniopt1 label word
GDATA fldsz, dw, 80 ; WD
GDATA pagec, dw, 0 ; PG
GDATA rolc, dw, 3 ; RS
GDATA ntab, dw, 8 ; Ta
GDATA ctab, dw, 4 ; Tb
GDATA csr_i, dw, 4 ; Ci
GDATA csr_o, dw, 7 ; Co
GDATA pagm, dw, 0 ; mp
GDATA insm, dw, 0 ; mi
GDATA windloc, dw, 0 ; WL
iniopt18 label word
poolcnt dw 256 ; FW
GDATA hfiles, dw, 1 ; FV
GDATA sortopt, dw, 0 ; FS
GDATA dcmpopt, dw, 3 ; FO
GDATA linecnt, dw, 0 ; LC
;GDATA fkeytype,dw, 0 ; FK --> SW_FKEY
GDATA flmode, dw, 0 ; FM
GDATA hidden, dw, 0 ; FH
iniopt19 label word
GDATA swapmode, dw, 1 ; SW
GDATA reallocf, dw, 0 ; RM
GDATA retval, dw, 0 ; return value
GDATA readmac, dw, 0 ; read/run macro No.
GDATA sysmode, dw, 0 ; vz system mode
GDATA sysmode0, dw, 0 ; previous mode
GDATA fptype, dw, 0 ; FEP type
GDATA lastcmd, dw, 0 ; last command
GDATA textc, dw, 0 ; open text count
GDATA seed, dw, 1 ; random seed
GDATA sftkey, dw, 0 ; key shift status
dw offset cgroup:cmdsymtbl
cmdnamep dw offset cgroup:nm_vz
curdrvp dw offset cgroup:curdrv
dw offset cgroup:tmppath
dw offset cgroup:scrnparm
dw offset cgroup:flparm ; fg
dw offset cgroup:macroparm ; mg
GDATA paltblp, dw, 0 ; IBM: palette tabel ptr ##156.91
GDATA videomode,dw, 0 ; IBM: video mode ##156.123
GDATA w_free, dw, 0 ; window record
GDATA w_act, dw, 0 ; active
GDATA w_back, dw, 0 ; back
GDATA w_busy, dw, 0 ; busy top
GDATA w_ext, dw, 0 ; ##16
GDATA code_seg, dw, 0 ; VZ
GDATA cz_val, dw, 0
GDATA data_seg, dw, 0
GDATA farseg, dw, 0 ; far BSS seg
GDATA stack_seg,dw, 0
GDATA stops, dw, 0 ; text stack area top seg
GDATA send, dw, 0 ; text stack end ptr
GDATA basemode, dw, SYS_DOS ; sm
GDATA silent, dw, 0 ; ss
GDATA promode, dw, 0 ; sr
GDATA actwkp, dw, 0 ; fl
GDATA menumsgp, dw, 0 ; pm
GDATA head1st, dw, 0 ; mh first module header ptr
GDATA inpchar, dw, 0 ; ic input char
GDATA vwxor, dw, 0 ; vr for vwx
iniopt2 label word
GDATA atrtbl, dw, <7,5,5,13,15,14,13,6,5,5,7,6,15,6,6,1,6,15,7,1>
GDATA atrpath, dw, 0
GDATA atrucsr, dw, 08h
GDATA atrflag, dw, 0 ; ca
GDATA vsplit, dw, 40 ; V split
GDATA hsplit, dw, 12 ; H split
GDATA as_count, dw, 0 ; QC :auto save count
GDATA as_delay, dw, 0 ; QT :auto save delay
GDATA as_wait, dw, 0 ; QW :auto save wait
GDATA dspsw, dw, DSP_CR+DSP_EOF+DSP_RMGN
GDATA edtsw, dw, EDT_INDENT+EDT_SCROLL+EDT_BACKUP+EDT_EOF+EDT_PGTTL+EDT_WRDSCH
GDATA syssw, dw, SW_CON+SW_SKIPESC+SW_REDRAW+SW_ASKNEW+SW_FP+SW_BEEP
iniopt25 label word
GDATA extsw, dw, 0
GDATA usersw, dw, 0 ; ju
ubufp dw 0 ; pu
ubufsz dw 64 ; Bu
GDATA macsp, dw, 0 ; macro stack ptr
GDATA sysvar, dw, <VARCNT dup(0)> ; system variables
GDATA intregs, dw, <6 dup(0)> ; AX,BX,CX,DX,SI,DI
iniopt29 label word
INIOPTSZ1 equ (offset iniopt19 - offset iniopt1)
INIOPTSZ18 equ (offset iniopt18 - offset iniopt1)
INIOPTSZ2 equ (offset iniopt29 - offset iniopt2)
INIOPTSZ25 equ (offset iniopt25 - offset iniopt2)
;--- Loader work ---
even
GDATA tocs, dd, 0
GDATA loseg, dw, 0 ; loader seg
GDATA nears, dw, 0 ; near end seg
GDATA shseg, dw, 0 ; shell segment
GDATA conseg, dw, 0
GDATA swapss_end,dw, 0
GDATA ss_stack, dw, 0
GDATA ss_end, dw, 0
;GDATA nearsz, dw, 0 ; near seg size
;GDATA csmax, dw, 0 ; CS max
GDATA ssmax, dw, 0 ; SS max
;GDATA tmpnamep,dw, 0 ; temporary file name ptr
GDATA execcmd, dw, 0 ; exec command ptr
GDATA flcmdp, dw, 0 ; filer command ptr
GDATA flret, db, 0 ; filer return code
GDATA tchdir, db, 0 ; touch dir flag
GDATA doswapf, db, 0 ; do swap flag
GDATA macmode, db, 0 ; macro mode (MAC_)
GDATA breakf, db, -1 ; break flag ;##155.83, ##156.129
GDATA dossw, db, 0 ; dos command switch ##16
GDATA doslen, dw, 0 ; dos command box len ##16
GDATA tmppath, db, <TMPPATHSZ dup(?)> ; temporary path
endws
dseg
;--- Customizing data pointers ---
tbl_top label near
GDATA ckeytbl, dw, 0 ; command key table
GDATA fkeytbl, dw, 0 ; function key table
GDATA elsetbl, label, word
GDATA incfile, dw, 0 ; include .def file
;GDATA reffile, dw, 0 ; reference file
GDATA extlist, dw, 0 ; .ext list
GDATA filermnu, dw, 0 ; filer menu bar
GDATA tenkey_g, dw, 0 ; [GRPH]+tenkey
GDATA tenkey_c, dw, 0 ; [CTRL]+tenkey
GDATA cmtchar, dw, 0 ; comment char
GDATA prompt, dw, 0 ; prompt string
GDATA binlist, dw, 0 ; binary .ext list ##1.5
GDATA kanatbl, dw, 0 ; KANA to alpha table ##155.77
GDATA ckeymsg, dw, 0 ; command key message
GDATA tboxtbl, dw, 0 ; text box table
data_top label near
GDATA macrobuf, dw, 0 ; macro key
GDATA aliasbuf, dw, 0 ; alias buffer
GDATA hist_top, label, near
GDATA sbuf, dw, 0 ; string buffer
GDATA fbuf, dw, 0 ; file list buffer
;GDATA save_top,label, near
GDATA xbuf, dw, 0 ; command line buffer
GDATA abuf, dw, 0 ; application line buffer
;cfg_end label near
GDATA wbuf, dw, 0 ; work
GDATA nbuf, dw, 0 ; pathname buffer
GDATA tsbuf, dw, 0 ; title seach string buffer ##16
hist_end label near
GDATA reffile, dw, 0 ; reference file
iniopt39 label near
GDATA sysmnubuf,dw, 0 ; system menu buffer ##16
GDATA compath, dw, 0 ; vz.com path
GDATA defpath, dw, 0 ; vz.def path
GDATA temptop, dw, 0 ; temporary work top
;GDATA ds_shift,label, word
GDATA tempend, dw, 0 ; temporary work end
GDATA custm_end,label, near
INIOPTSZ3 equ (offset iniopt39 - offset hist_top)
;--- Sized buffers ---
GDATA bss_top, label, near
GDATA curdir, dw, PATHSZ ; current directory
GDATA optstr, dw, 16 ; search option string
GDATA vzktbl, dw, 0 ; VZ key table
clr_top label word
GDATA dosktbl, dw, 0 ; DOS key table
GDATA cbuf, dw, 0 ; delete char top
GDATA cbuf_end, label, word
GDATA ubuf, dw, 0 ; grobal user array ptr
GDATA pfbufp, dw, PFBUFSZ ; printf buffer ##156.95
GDATA tmpbuf, dw, TMPSZ ; temporary work
GDATA tmpbuf2, dw, TMPSZ
GDATA tmpbuf3, dw, WD*2 ; DTA,smooth,&?()
GDATA pathbuf, dw, PATHSZ
GDATA pathbuf2, dw, PATHSZ
IFNDEF NOFILER
GDATA flwork, dw, <type _filer> ; 1st filer work
GDATA flwork2, dw, <type _filer> ; 2nd filer work
ENDIF
GDATA inioptbuf,dw, INIOPTSZ1+INIOPTSZ2+INIOPTSZ3
GDATA save_end, label, word
GDATA schstr, dw, STRSZ ; search buffer
GDATA rplstr, dw, STRSZ ; replace buffer
GDATA tmpslot, dw, TMPSLOTCNT*8 ; EMS/XMS temp slot
bss2_top label near
GDATA logtbl, dw, 0 ; log file table
dw 0
clr_end label word ; <-- ss_stack
GDATA windrec, dw, 0
GDATA lbuf, dw, 0 ; line buffer
GDATA lbuf_end, label, word
GDATA tmpbuf4, dw, TMPSZ
bss_end label word
;--- Far segment ---
GDATA farbss_top,label, word
GDATA dosscrn, dw, 0 ; save of DOS screen
IFNDEF NOFILER
GDATA curscrn, dw, 0 ; save of current screen
GDATA pool, dw, 0 ; directory pool
GDATA poolend, label, word
ENDIF
farbss_clr label word
GDATA imgstack, dw, 0 ; image stack
farbsssz dw 0
farbss_end label word
;--- System pointers ---
;GDATA csegsz, dw, 0 ; CS size
;GDATA ssegsz, dw, 0 ; SS size
;GDATA fsegsz, dw, 0 ; far BSS seg size
GDATA gtops, dw, 0 ; text area top seg (texts)
;GDATA rtops, dw, 0 ; temporary area top seg
GDATA rends, dw, 0 ; temporary area end seg ##1.5
;stops
GDATA sends, dw, -1 ; text stack area end seg
GDATA gends, dw, 0 ; global end seg
GDATA gtops0, dw, 0 ; ##152.26
GDATA envseg, dw, 0 ; env seg
;GDATA tbalt, dw, 0 ; temp. block size ##1.5
GDATA tvsize, dw, WD*HIGHT*2 ; size of text vram
GDATA pathp, dw, 0 ; path name ptr
GDATA opnpath, dw, 0 ; open path
;GDATA cs_sp, dw, <offset cgroup:stackbase>
cstfilep dw 0 ; customize file ptr
incfilep dw 0 ; include file ptr
;--- Miscellaneous ---
GDATA strf, db, 0 ; search string flag
GDATA refloc, db, <0,0> ; reference location
GDATA msgon, db, 0
;GDATA altsize, db, 0 ; altered screen size ##156.133
GDATA dirchr, db, '\' ; dir char
GDATA swchr, db, '/' ; switch char
GDATA pkeytbl, db, <PKEYCNT dup(0)>; prefix key table
GDATA drawfunc, dw, 0 ; redraw function ptr
GDATA menubit, dw, 0 ; menu check(*) bit
GDATA optptr, dw, 0 ; option ptr
GDATA curdrv, db, <0,0> ; current drive
GDATA cmdflag, db, 0 ; copy of command flag
GDATA usefar, db, 0
GDATA fkeymode, db, 0 ; function key mode
GDATA dspkeyf, db, 0
GDATA dbcs, db, TRUE ; DBCS flag ##156.132
GDATA w_act0, dw, 0
GDATA w_back0, dw, 0
GDATA wsplit0, db, 0
;--- System label defs. ---
nm_com db 'COM',0
nm_def db 'DEF',0
nm_tmp db 'TMP',0
IFNDEF NOBACKUP
GDATA nm_bak, db, <'BAK',0>
ENDIF
GDATA nm_path, db, <'PATH',0>
GDATA nm_log, db, <'LOG',0> ; ##16
GDATA nm_env, db, <'ENV',0> ; ##16
nm_vztmp db 'VZTEMP.$$$',0
nm_files db "FILES.$$$",0
GDATA comspec, db, <'COMSPEC',0>
GDATA nm_confile,db, <'console',0>
endds
iseg
;****************************
; Initializations
;****************************
init:
cld
mov dx,offset cgroup:mg_title
call cputmg
mov ax,cs
mov loseg,ax
mov code_seg,ax
mov tocs.@seg,ax
push es
msdos F_GETVCT,21h
mov si,offset cgroup:vzversion
mov di,si
cmpsw
jmpl e,resident
pop es
call checkhard
_if c
mov dx,offset cgroup:mg_hardng
call cputmg
mov al,2
jmp term_vz
_endif
mov ax,cs
sub ax,maxseg
neg ax
cmp ax,MIN_MEMORY
jmpl b,memerr
mov cx,ax
mov ax,offset cgroup:code_end
call ofs2seg
mov bx,cs
add bx,ax
sub ax,cx
neg ax
call seg2ofs
mov ss,bx
mov sp,ax
mov stack_seg,bx
mov cz_val,bx
mov save_ds,bx
sub ax,STACKSZ
mov ssmax,ax
mov ax,myenvseg
mov envseg,ax
movseg es,ss
clr si
clr di
mov cx,offset cgroup:bstop
shr cx,1
rep movsw
movseg ds,ss
call config
call getrootenvs
call free_env
call initvram
call initwork
mov sp,ss_stack
call init_maclink
; call initgwork
call initfarwork
call initsize
IFNDEF NOXSCR
call initcon
ELSE
mov conbufsz,0
ENDIF
call read_logtbl
call clrwstack
call initscrn
call initcbuf
call initmacro
call initfp
; call chk_ezkey ; ##153.30
; call getdoskey
call initvzkey
call setintstop
call save_iniopt ; ##16
call set_mhttllen
jmp init2
;--- Remove VZ ---
resident:
mov dx,offset cgroup:mg_verng
cmpsw
jne remov1
cmpsw
jne remov1
call remove_vz
mov dx,offset cgroup:mg_remove
_ifn c
mov dx,offset cgroup:mg_rmerr
_endif
remov1: call cputmg
jmp termok
;--- Configuration ---
; DI: _data end
config proc
push di
mov cx,CMCNT*2
mov al,INVALID
rep stosb
mov di,offset cgroup:pkeytbl
mov cx,PKEYCNT
rep stosb
mov di,offset cgroup:tbl_top
pop ax
mov [di],ax
add ax,CMCNT*2
inc di
inc di
mov cx,(offset custm_end - (offset tbl_top+2))/2
rep stosw
clr ax
mov di,offset cgroup:cstfilep
stosw
stosw
call getcompath
call gettmppath
call getdefpath
call readopt
mov si,cstfilep
tst si
_if z
mov si,offset cgroup:nm_vz
_endif
push ax
call readdef
pop ax
; jc def_x
tst si
jnz icst5
icst3:
mov si,incfile
cmp si,incfile+2
_ifn e
icst4:
call readdef
; jc def_x
tst si
jnz icst4
_endif
jmps icst50
skpdef:
lodsb
cmp al,'+'
je icst4
cmp al,SPC
ja skpdef
icst50:
mov si,incfilep
icst5: tst si
_ifn z
call readdef
jmp icst5
_endif
call readopt
ret
config endp
;--- Read DEF file ---
;--> SI :DEF file name
;<-- CY :file not found
readdef proc
cmp byte ptr [si],SPC
_if be
clr si
ret
_endif
call adddefpath
lodsb
cmp al,'+'
_ifn e
clr si
_endif
push si
call skipstr
msdos F_OPEN,0
_if c
mov si,dx
mov dl,'"'
call cputc
call cputstr
mov dx,offset cgroup:mg_noent
call cputmg
mov dx,offset cgroup:mg_ctrl_c
jmps rdef_x
_endif
mov bx,ax
mov dx,di
mov di,ssmax
mov cx,di
sub cx,dx
msdos F_READ
push ax
msdos F_CLOSE
pop ax
cmp ax,cx
jmpl e,memerr
mov si,dx
mov cx,ax
sub di,cx
call memmove
mov si,di
call customize
_ifn z
mov dx,offset cgroup:mg_cstmerr
rdef_x:
call cputmg
msdos F_CONINE
call cputcrlf
clc
_endif
pop si
ret
readdef endp
;--- Read option ---
;<-- CY :error
readopt proc
mov si,offset cgroup:cmdln +1
ropt1: lodsb
cmp al,CR
je ropt9
cmp al,SPC
jbe ropt1
cmp al,'-'
je ropt2
cmp al,'/'
je ropt5
cmp al,'+'
je ropt4
dec si
mov pathp,si
ropt9: ret
ropt2:
lodsb
push dx
call setoption
pop dx
jnc ropt1
call synerr
jmp termerr
ropt4:
call skipspc
jc ropt9
mov incfilep,si
jmps ropt6
ropt5:
call skipspc
jc ropt9
mov cstfilep,si
ropt6: call skipchar
jmp ropt1
readopt endp
;--- Get command path ---
getcompath proc
clr si
call scanenv1
mov di,temptop
_if c
push ds
push si
mov ds,ax
call parsepath
test dl,PRS_ROOT
_if z
call getcurdir1
call addsep
_endif
pop si
push di
call strcpy
pop si
pop ds
call parsepath
mov si,cx
mov byte ptr [si],0
mov si,bx
mov di,offset cgroup:nm_vz
call strcpy
mov di,bx
_endif
mov bx,offset cgroup:compath
inscvt0:
mov byte ptr [di],0
inscvt:
inc di
mov tempend,di
call insertcvt
ret
getcompath endp
;--- Get DEFfile path ---
getdefpath proc
mov si,offset cgroup:nm_def
mov di,temptop
call setenvvar
push ds
mov dl,0
_if c
mov ds,ax
push si
call parsepath
pop si
_endif
test dl,PRS_ROOT
_ifn z
mov cx,bx
sub cx,si
call strncpy
_else
push ds
movseg ds,ss
mov si,compath
call strcpy
pop ds
_endif
mov si,bx
inc di
mov bx,di
test dl,PRS_NAME
_ifn z
call strcpy
_else
clr al
stosb
_endif
pop ds
tstb [bx]
_ifn z
mov cstfilep,bx
_endif
mov bx,offset cgroup:defpath
jmp inscvt
getdefpath endp
;--- Get TMPfile path ---
gettmppath proc
push es
mov si,offset cgroup:nm_tmp
call scanenv1
mov di,offset cgroup:tmppath
push di
_if c
mov ds,ax
call strcpy
_else
call getcurdir1
_endif
movseg ds,ss
call addsep
mov si,offset cgroup:nm_vztmp
call strcpy
pop di
mov si,di
movseg es,cs
call strcpy
pop es
ret
gettmppath endp
;--- Get FILES.$$$ path ---
public get_refpath
get_refpath proc
push di
mov si,offset cgroup:nm_tmp
call scanenv1
pop di
_if c
mov ds,ax
call strcpy
_endif
movseg ds,ss
call addsep
mov si,offset cgroup:nm_files
call strcpy
ret
get_refpath endp
;--- Init work ---
initwork proc
mov bx,offset cgroup:data_top
mov si,offset cgroup:data_sztop
add word ptr [si+2],2 ; alias buffer
mov cx,(offset data_szend - offset data_sztop)/2
_repeat
push cx
lodsw
add ax,2
push ax
push si
add ax,[bx+2]
call chkmem ; ##154.63
sub ax,[bx]
call movearea
pop si
pop cx
inc bx
inc bx
mov di,[bx]
sub di,cx
call memclear
pop cx
_loop
mov di,offset cgroup:hist_top
mov cx,(offset hist_end - offset hist_top)/2
_repeat
mov si,[di]
mov ax,[di+2]
sub ax,si
sub ax,3
mov [si-2],ax
inc di
inc di
_loop
mov si,offset cgroup:tbl_top
mov cx,(offset custm_end - offset tbl_top)/2
_repeat
lodsw
cmp ax,[si]
_if e
mov word ptr [si-2],offset cgroup:nullptr
_endif
_loop
mov ax,ubufsz
mov ubuf,ax
mov ax,cbufsz
mov cbuf,ax
mov di,offset cgroup:bss2_top
mov ax,logtblsz
cmp ax,MIN_LOGTBL
_if b
mov ax,MIN_LOGTBL
_endif
stosw
mov ax,STACKSZ
stosw
call windcount
mov ax,type _text
mul cx
stosw
mov ax,lbufsz
stosw
mov di,offset cgroup:vzktbl
call initkeytbl
mov di,offset cgroup:bss_top
mov ax,temptop
inc ax
and ax,not 1
mov cx,(offset bss_end - offset bss_top)/2
call setsizep
call ofs2seg
mov cx,ss
add ax,cx
mov nears,ax
mov ax,ubuf
mov ubufp,ax
mov ax,windrec
mov w_free,ax
mov ax,lbuf
mov swapss_end,ax
mov ax,lbuf_end
mov ss_end,ax
mov di,clr_top
mov cx,clr_end
mov ss_stack,cx
sub cx,di
call memclear
ret
initwork endp
initsize proc
mov ax,conbufsz
cmp ax,MAX_CONBFSZ
_if a
mov ax,MAX_CONBFSZ
_endif
mov cl,10
shl ax,cl
mov conbufsz,ax
mov ax,frees
cmp ax,1
_if e
neg ax
_else
mov cl,6
shl ax,cl
_endif
mov frees,ax
ret
initsize endp
;--- Init far work ---
pf_ems db '%4u',0
pf_xms db '%6u',0
initfarwork proc
; call setgbank
call ems_open
_ifn c
mov si,offset cgroup:pf_ems
mov di,offset cgroup:mg_emspage
mov dx,offset cgroup:mg_ems
call put_exmsmsg
_endif
call xms_open
_ifn c
mov si,offset cgroup:pf_xms
mov di,offset cgroup:mg_xmssize
mov dx,offset cgroup:mg_xms
call put_exmsmsg
_endif
call init_bmp
mov di,offset cgroup:farbss_top
push di
mov ax,tvsize
mov cx,WD*HIGHT*2
test hardware,IDN_PC98
_if z
shl ax,1
shl cx,1
_endif
stosw ; dosscrn
IFNDEF NOFILER
stosw ; curscrn
mov ax,type _dir
mul poolcnt
stosw
ENDIF
mov ax,cx
stosw ; imgstack
pop di
mov cx,(offset farbss_end - offset farbss_top)/2
clr ax
call setsizep
dec di
dec di
; cmp [di],8000h
;_if a
; mov [di],8000h
;_endif
mov ax,[di]
call allocfar
mov farseg,ax
call ems_map
push es
mov es,ax
clr di
mov cx,farbss_clr
call memclear
pop es
ret
initfarwork endp
put_exmsmsg proc
movseg ds,cs
movseg es,cs
push ax
mov bx,sp
call sprintf
pop ax
movseg ds,ss
movseg es,ss
call cputmg
ret
put_exmsmsg endp
;--- Allocate far memory ---
;--> AX :size
;<-- AX :BMP handle/segment
public allocfar
allocfar proc
push ax
call ofs2seg
mov cx,ax
pop ax
call ems_salloc
_if c
mov ax,nears
add cx,ax
mov nears,cx
mov usefar,TRUE
_endif
ret
allocfar endp
;--- Set size ptr ---
setsizep proc
_repeat
mov dx,[di]
stosw
add ax,dx
call chkmem
_loop
ret
setsizep endp
;
;
;--- Update VZ.COM ---
;
;--- Free environment ---
free_env proc
push es
mov si,offset cgroup:nm_vz
call strlen
add ax,6
; tstw pathp
;_ifn z
; add pathp,ax
;_endif
movseg ds,cs
movseg es,cs
push si
mov si,offset cgroup:cmdln +1
mov cl,[si-1]
clr ch
inc cx
mov di,si
add di,ax
call memmove
mov di,si
add [di-1],al
pop si
sub ax,6
mov cx,ax
movseg ds,ss
_repeat
lodsb
call tolower
stosb
_loop
mov al,SPC
stosb
movseg ds,cs
mov si,offset cgroup:vzversion+2
mov cx,5
rep movsb
movseg ds,ss
mov ax,envseg
xchg myenvseg,ax
mov es,ax
msdos F_FREE
pop es
ret
free_env endp
;--- Set root env seg ---
getrootenvs proc
push es
; msdos F_GETVCT,2Eh ; ##153.39
mov es,parentpsp ;
nop ;
mov ax,es:myenvseg
tst ax
_if z
mov ax,es
dec ax
mov es,ax
add ax,es:[mcb_size]
inc ax
inc ax
_endif
mov envseg,ax
pop es
ret
getrootenvs endp
endis ;
;
eseg ;
;--- 2nd initialize ---
init2:
tstb tsrflag
jnz resident1
call realloc_cs
call getdoskey
call getdosloc
call enter_vz
jmpl c,memerr
jmp readinitext
;--- Terminate VZ ---
resident1:
mov si,pathp
tst si
_ifn z
call skipspc
_ifn c
cmp al,'@'
_if e
call readref
_endif
_endif
_endif
; call resetgbank
call install_vz
push bx
call stack_cs
call xmem_trunc
IFNDEF NOXSCR
call chkint29
ENDIF
mov cs:invz,FALSE ; ##153.49
mov dx,offset cgroup:mg_install
call cputmg
mov ax,cs
pop dx
sub dx,ax
clr al
msdos F_KEEP
;
; endws
;
; eseg
;****************************
; DOS Subroutines
;****************************
;
;--- Console output ---
public cputc,cputs,cputmg,cputcrlf,cputstr
cputc:
msdos F_DSPCHR
ret
cputcrlf:
mov dx,offset cgroup:mg_crlf
cputmg:
push ds
movseg ds,cs
call cputs
pop ds
ret
cputs:
msdos F_DSPSTR
cputs9: ret
cputstr:
lodsb
tst al
jz cputs9
mov dl,al
call cputc
jmp cputstr
public realloc_cs1
realloc_cs:
mov bx,nears
realloc_cs1:
movseg es,cs
mov ax,cs
sub bx,ax
mov ah,F_REALLOC
_if z
mov ah,F_FREE
_endif
int 21h
ret
;--- Set environment path/name ---
;-->
; SI :env type ptr
; DI :store ptr
;<--
; BX :file name ptr
public setenvvar
setenvvar proc
push di
; push si
; mov si,offset cgroup:nm_vz
; call strcpy
; pop si
mov ax,word ptr vzversion
stosw
call strcpy
pop si
push si
call scanenv1
pop di
ret
setenvvar endp
;--- Scan environment strings ---
;--> DS:SI :string point
;<-- CY :found at ES:DI
public scanenv,scanenv1
scanenv proc
mov es,envseg
tst si
_ifn z
call strlen
mov cx,ax
_endif
clr di
env1: pushm <cx,si>
tst si
jz env2
push di
repe cmpsb
_if e
mov al,'='
scasb
je env_f
_endif
pop di
env2: clr al
mov cx,-1
repnz scasb
inc cx
inc cx
jz env_x
popm <si,cx>
jmp env1
env_f:
pop si
stc
popm <si,cx>
ret
env_x:
popm <si,cx>
tst si
jnz env9
mov ax,1
scasw
clc
jne env9
stc
env9: ret
scanenv endp
scanenv1 proc
call scanenv
mov si,di
mov ax,es
movseg es,ss
ret
scanenv1 endp
;--- Add DEF path ---
;-->
; SI :file name
; BX :default ext
;<--
; DI(DX) :path ptr
public setrefdir,add_defpath
setrefdir:
mov si,dx
clr bx
jmps addpath2
adddefpath proc
mov di,temptop
add_defpath:
mov bx,offset cgroup:nm_def
addpath2:
push di
push bx
push si
call parsepath
test dl,PRS_ROOT
_if z
mov si,defpath
tstb [si] ; ##100.02
_ifn z
call strcpy
call addsep
_endif
_endif
pop si
addp1: lodsb
stosb
cmp al,'+'
je addp2
cmp al,SPC
ja addp1
addp2: dec si
dec di
mov byte ptr [di],0
test dl,PRS_NAME
_if z
mov si,offset cgroup:nm_vz
call strcpy
_endif
pop bx
test dl,PRS_EXT
_if z
tst bx
_ifn z
mov al,'.'
stosb
push si
mov si,bx
call strcpy
pop si
_endif
_endif
pop di
mov dx,di
ret
adddefpath endp
;--- Offset to segment ---
;--> AX :offset
public ofs2seg,ofs2seg1
ofs2seg proc
add ax,15
_ifn c
ofs2seg1:
push cx
mov cl,4
shr ax,cl
pop cx
ret
_endif
mov ax,1000h
ret
ofs2seg endp
;--- Segment to offset ---
;--> AX :segment
public seg2ofs
seg2ofs proc
cmp ax,1000h
_ifn b
mov ax,0FFFFh
ret
_endif
push cx
mov cl,4
shl ax,cl
pop cx
ret
seg2ofs endp
endes
cseg
assume ds:nothing
;****************************
; Screen edit
;****************************
;
;--- Enter the editor ---
;<-- CY :out of memory
public enter_vz
enter_vz proc
movseg ds,ss
movseg es,ss
call check_vwx
call getdosscrn
call setdoswindow
call setint24
call getcurdir
; call setgbank
mov ax,gtops ; ##152.26
tst ax
_if z
call initfar
jc entvz9
call inittmpslot
mov di,windrec
call winit
IFNDEF NOXSCR
call opencon
ENDIF
_else
sub ax,gtops0
_ifn e
call adjustfar
_endif
_endif
mov ax,gtops
mov gtops0,ax
entvz9: ret
enter_vz endp
IF 0
public stack_gs,stack_cs
stack_gs proc
popm <bx,cx,dx,si,di>
cli
mov sp,cs:ss_stack
mov ss,cs:gtops
jmps sppul
stack_cs:
popm <bx,cx,dx,si,di>
cli
mov sp,cs:cs_sp
mov ss,cs:code_seg
sppul: sti
pushm <di,si,dx,cx,bx>
ret
stack_gs endp
ENDIF
;--- Quit editor ---
public quit_vz
quit_vz proc
call ld_wact
_if z
call clrstack ; ##100.09
mov gends,INVALID
test syssw,SW_INIOPT
_ifn z
call load_iniopt
_endif
_endif
movseg ds,ss
call write_logtbl
call putdosscrn
call setfnckey
tstb tsrflag
jmpln z,quit_tsr
call setdoskey
call setdoscsr
call resetfp
IFNDEF NOXSCR
call resetint29
ENDIF
call resetint24
call resetintstop
; call resetgbank
call resetcrt ; ##152.27
movseg ds,cs
call xmem_close
termok: mov al,0
term_vz:
msdos F_TERM
quit_vz endp
public chkmem ; ##155.85
chkmem:
jc memerr
cmp ax,ssmax
jae memerr
ret
memerr:
mov dx,offset cgroup:mg_nospc
cfgerr: call cputmg
termerr:
movseg ds,cs
call xmem_close ; ##155.84
mov al,1
jmp term_vz
;--- Read initial text ---
public to_edit1
to_edit1:
tst al ; FROM4B
_if e
mov retval,0
mov al,EV_START
call do_evmac
_if c
call run_evmac
_endif
lds si,cs:cmdparm
call skipspc
jnc readini1
movseg ds,ss
call ld_wact
jz readini2
todsp1: call dspscr
ret
_endif
toedit0:
call ld_wact
jnz todsp1
mov bp,w_free
call se_open
jmps rini2
readini1:
movseg es,ss
mov di,ss:tmpbuf
push di
_repeat
lodsb
stosb
cmp al,SPC
_until b
pop si
movseg ds,ss
_repeat
scopt1:
lodsb
cmp al,'-' ; vz -sq
_break ne
lodsb
cmp al,SPC
jbe readini2
clr bp
call set_opnopt
_if c
call skipchar
jmp scopt1
_endif
call initmacro
call skipspc
jc toedit0
_until
dec si
rini1: mov bx,fbuf
push si
_repeat
lodsb
cmp al,CR
_until e
dec si
mov cx,si
pop si
sub cx,si
call histcpy
movseg ds,ss
mov bp,w_free ; dummy
call se_open2
jmps rini2
readinitext:
mov al,EV_START
call do_evmac
_if c
call run_evmac
_endif
mov si,pathp
tst si
jz readini2
call skipspc
jnc rini1
readini2:
mov bp,w_free
call ini_open
rini2: call dspscr
;--- Sceen edit main loop ---
public sedit
sedit proc
call ld_wact
jmpl z,quit_vz
call setvzkey
_if c
call maptexts
_endif
; call chksize ; ##156.133
mov ds,[bp].ttops
mov al,msgon
tst al
_ifn z
_if s
call clrmsg
_else
cmp al,2
_if e
tstb macmode
_if z
call clrmsg
_endif
_else
neg msgon
_endif
_endif
_endif
call dispstat
call editloc
call set_blktgt ; ##16
push syssw ; ##16
mov al,byte ptr insm
mov dl,SYS_SEDIT
mov byte ptr basemode,dl ; ##16
call getkey
pop cx
xor cx,syssw
test cx,SW_CLMOVW
_ifn z
tstb insm
_ifn z
push ax
call set_insm
pop ax
_endif
_endif
call ld_wact
mov ds,[bp].ttops
; pushm <ax,dx>
; call chksize
; popm <dx,ax>
call blanch
jmp sedit
;chksize:
; clr al
; xchg altsize,al
; tst al
;_ifn z
; call resetscr
;_endif
; ret
sedit endp
;--- Init text screen ---
public iniscr
iniscr proc
call offlbuf
mov ds,[bp].ttops
clr ax
mov [bp].wy,al
mov [bp].wys,al
mov [bp].lx,al
mov [bp].lxs,al
mov [bp].fofs,al
mov [bp].blkm,al
mov word ptr [bp].tretp,ax
mov word ptr [bp].tretp+2,ax
mov si,[bp].ttop
mov [bp].tnow,si
mov [bp].tcp,si
mov [bp].tfld,si
mov si,TEXTTOP ; ##16
mov word ptr [si-2],CRLF
mov al,byte ptr fldsz
tst al ; ##156.123
_if z
extrn doswd :byte
mov al,doswd
_endif
mov [bp].fsiz,al
mov [bp].fsiz0,al
ret
iniscr endp
public editloc
editloc proc
mov dl,[bp].lx
sub dl,[bp].fofs
add dl,[bp].fskp
mov dh,[bp].wy
add dx,word ptr [bp].tw_px
mov word ptr refloc,dx
call locate
mov dl,[bp].tw_px
mov cl,[bp].tw_sx
call undercsr
ret
editloc endp
;--- Map text segment ---
public maptext,maptexts
maptexts proc
call maptext
push bp
mov bp,w_back
tst bp
_ifn z
mov ax,[bp].tends
test ah,EMSMASK
_if z
tst al
_ifn z
call ems_map2
call maptxt1
_endif
_endif
_endif
pop bp
maptexts endp
maptext proc
mov ax,[bp].tends
test ah,EMSMASK
_if z
tst al
_ifn z
call ems_map
maptxt1:
mov [bp].ttops,ax
tstb [bp].inbuf ; ##155.74
_if z
mov [bp].lbseg,ax
_endif
_endif
_endif
ret
maptext endp
;--- Blach by code ---
blanch proc
clr ah
tst al
_if z
mov al,CM_SEDIT
ledt1: call ledit
jmps blan8
_endif
mov lastcmd,ax
cmp al,CM_LEDIT
_if ae
cmp al,CM_SEDIT
jb ledt1
cmp al,CM_SEDITMAX
ja blan9
sub al,CM_SEDIT-CM_LEDIT
_endif
sub al,CM_ESC
mov bx,ax
shl bx,1
add bx,ax
add bx,offset cgroup:cmdtbl
cmp al,CM_CANCEL-(CM_SEDIT-CM_LEDIT)-CM_ESC
_ifn e
push bx
call bsave
pop bx
_endif
mov al,cs:[bx+2]
mov cmdflag,al
call isviewmode
_if e
test al,CMF_TCH
_ifn z
mov al,EV_VIEW
call do_evmac
_ifn c
mov dl,M_NOTCHG
call disperr
_endif
jmps blan8
_endif
_endif
cmp [bp].blkm,BLK_CHAR
_if e
test al,CMF_VMOVE
_ifn z
mov [bp].blkm,BLK_LINE
_endif
_endif
push bx
call cs:[bx]
pop bx
mov al,cs:[bx+2]
pushf ; ##153.57
push ax
test al,CMF_REMAP
_ifn z
call maptexts
_endif
pop ax
popf
jc blan8
test al,CMF_TCH
_ifn z
call touch
_endif
tst al
js blan9
clc
blan8:
mov ax,0
sbb ax,ax
mov retval,ax
se_dummy:
blan9: ret
blanch endp
public touch
touch proc
push ax
mov al,[bp].tchf
tst al
jz touch1
cmp al,TCH_RO
jne touch9
touch1: xor [bp].tchf,1
touch9: pop ax
ret
touch endp
;--- Command table ---
cmd macro label,tch
extrn label :near
dw offset cgroup:label
db tch
endm
cmdtbl:
cmd se_exit ,0
cmd se_return ,CMF_TCH
cmd se_csrup ,CMF_VMOVE
cmd se_csrdn ,CMF_VMOVE
cmd se_pagemode ,0
cmd se_rolup ,CMF_VMOVE
cmd se_roldn ,CMF_VMOVE
cmd se_rolup2 ,CMF_VMOVE
cmd se_roldn2 ,CMF_VMOVE
cmd se_pageup ,CMF_VMOVE
cmd se_pagedn ,CMF_VMOVE
cmd se_smoothup ,CMF_VMOVE
cmd se_smoothdn ,CMF_VMOVE
cmd se_windtop ,CMF_VMOVE
cmd se_windend ,CMF_VMOVE
cmd se_texttop ,CMF_VMOVE
cmd se_textend ,CMF_VMOVE
cmd se_lastpos ,CMF_VMOVE
cmd se_markpos ,0
cmd se_jumpnum ,CMF_VMOVE
cmd se_markblk ,0
cmd se_pushblk ,CMF_TCH+CMF_VPOS+CMF_REMAP
cmd se_pullblk ,CMF_TCH+CMF_VAL+CMF_VPOS+CMF_REMAP
cmd se_storblk ,CMF_REMAP
cmd se_loadblk ,CMF_TCH+CMF_VAL+CMF_VPOS+CMF_REMAP
cmd se_clrstack ,0
cmd se_jumpblk ,CMF_VPOS
cmd se_blank ,CMF_TCH
cmd se_cancel ,0
cmd se_setstr ,0
cmd se_replace ,CMF_VAL
cmd se_replace1 ,CMF_VAL
cmd se_kakko ,CMF_VPOS
cmd se_getword ,CMF_VAL
cmd se_readtag ,0
cmd se_copystr ,CMF_TCH
cmd se_chgwind ,CMF_REMAP
cmd se_chgtext ,0
cmd se_splitmode ,0
cmd se_splitpos ,0
cmd se_xline ,0
cmd se_readonly ,0
cmd se_chgindent ,CMF_TCH
cmd se_textcomp ,0
cmd se_open ,CMF_VAL
cmd se_open ,0
cmd se_new ,0
cmd se_close ,0
cmd se_load ,0
cmd se_save ,0
cmd se_append ,0
cmd se_quit ,0
cmd se_command ,0
cmd se_console ,0
cmd se_recust ,0
cmd se_printmac ,0
cmd se_rename ,CMF_TCH
cmd se_writeref ,0
cmd se_settsstr ,0
dw offset cgroup:se_dummy
db 0
endcs
eseg
;--- Redraw screen ---
public redraw
redraw proc
push ax
mov ax,drawfunc
tst ax
_ifn z
pushall <ds,es>
call savewloc
call ax
call loadwloc
popall <es,ds>
_endif
pop ax
ret
redraw endp
;----- Initilal option manager -----
assume ds:cgroup
save_iniopt proc
movseg ds,ss
movseg es,ss
mov si,offset cgroup:iniopt1
mov di,inioptbuf
mov cx,INIOPTSZ1/2
rep movsw
mov si,offset cgroup:iniopt2
mov cx,INIOPTSZ2/2
rep movsw
mov si,offset cgroup:hist_top
mov cx,INIOPTSZ3/2
rep movsw
ret
save_iniopt endp
public load_iniopt
load_iniopt proc
push si
movseg ds,ss
movseg es,ss
call prmac_stop
mov si,inioptbuf
mov di,offset cgroup:iniopt1
mov cx,INIOPTSZ18/2
rep movsw
mov ax,INIOPTSZ1 - INIOPTSZ18
add si,ax
mov di,offset cgroup:iniopt2
mov cx,INIOPTSZ2/2
rep movsw
pop si
ret
load_iniopt endp
public write_goption
write_goption proc
mov si,offset cgroup:iniopt1
mov di,inioptbuf
mov cx,INIOPTSZ1/2
mov dx,offset cgroup:tb_opt_wd
call write_gopt
mov si,offset cgroup:iniopt2
mov cx,INIOPTSZ25/2
mov dx,offset cgroup:tb_opt_atr
call write_gopt
ret
write_goption endp
public reset_histp
reset_histp proc
mov si,inioptbuf
mov ax,INIOPTSZ1+INIOPTSZ2
add si,ax
mov di,offset cgroup:hist_top
mov cx,INIOPTSZ3/2
rep movsw
ret
reset_histp endp
endes
end entry
;****************************
; End of 'main.asm'
; Copyright (C) 1989 by c.mos
;****************************