mirror of
https://github.com/NishiOwO/VZEditor.git
synced 2025-04-21 00:34:37 +00:00
2111 lines
36 KiB
NASM
2111 lines
36 KiB
NASM
;****************************
|
|
; '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
|
|
IFDEF WASM
|
|
nm_vz db <'VZ',0,0,0,0,0,0,0>
|
|
ELSE
|
|
GDATA nm_vz, db, <'VZ',0,0,0,0,0,0,0>
|
|
ENDIF
|
|
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
|
|
IFDEF WASM
|
|
flwork dw <type _filer> ; 1st filer work
|
|
flwork2 dw <type _filer> ; 2nd filer work
|
|
ELSE
|
|
GDATA flwork, dw, <type _filer> ; 1st filer work
|
|
GDATA flwork2, dw, <type _filer> ; 2nd filer work
|
|
ENDIF
|
|
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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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: VZ_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,VZ_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
|
|
VZ_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,VZ_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,VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_RET
|
|
allocfar endp
|
|
|
|
;--- Set size ptr ---
|
|
|
|
setsizep proc
|
|
_repeat
|
|
mov dx,[di]
|
|
stosw
|
|
add ax,dx
|
|
call chkmem
|
|
_loop
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_RET
|
|
cputcrlf:
|
|
mov dx,offset cgroup:mg_crlf
|
|
cputmg:
|
|
push ds
|
|
movseg ds,cs
|
|
call cputs
|
|
pop ds
|
|
VZ_RET
|
|
cputs:
|
|
msdos F_DSPSTR
|
|
cputs9: VZ_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
|
|
VZ_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
|
|
VZ_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>
|
|
VZ_RET
|
|
env_x:
|
|
popm <si,cx>
|
|
tst si
|
|
jnz env9
|
|
mov ax,1
|
|
scasw
|
|
clc
|
|
jne env9
|
|
stc
|
|
env9: VZ_RET
|
|
scanenv endp
|
|
|
|
scanenv1 proc
|
|
call scanenv
|
|
mov si,di
|
|
mov ax,es
|
|
movseg es,ss
|
|
VZ_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,VZ_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,VZ_PRS_NAME
|
|
_if z
|
|
mov si,offset cgroup:nm_vz
|
|
call strcpy
|
|
_endif
|
|
pop bx
|
|
test dl,VZ_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
|
|
VZ_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
|
|
VZ_RET
|
|
_endif
|
|
mov ax,1000h
|
|
VZ_RET
|
|
ofs2seg endp
|
|
|
|
;--- Segment to offset ---
|
|
;--> AX :segment
|
|
|
|
public seg2ofs
|
|
seg2ofs proc
|
|
cmp ax,1000h
|
|
_ifn b
|
|
mov ax,0FFFFh
|
|
VZ_RET
|
|
_endif
|
|
push cx
|
|
mov cl,4
|
|
shl ax,cl
|
|
pop cx
|
|
VZ_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,ss: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: VZ_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>
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
; VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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: VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_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
|
|
VZ_RET
|
|
reset_histp endp
|
|
|
|
endes
|
|
|
|
end entry
|
|
|
|
;****************************
|
|
; End of 'main.asm'
|
|
; Copyright (C) 1989 by c.mos
|
|
;****************************
|