誰でもわかるVZエディタ。 main.asm　

祝VZエディタソースコード公開
https://qiita.com/kaizen_nagoya/items/baad23cf4a041ce845a9

祝：ソースコード公開：VZエディタ移植の方法と成果。註釈 coding(123)
https://qiita.com/kaizen_nagoya/items/5551be98dcbed8f41949

オープンソース化されたVZエディタをブラウザ上で動かしてみる
https://qiita.com/Takaraya/items/785ac9319c3934e3070# 
# Github
vcraftjp/VZEditor
https://github.com/vcraftjp/VZEditor/

誰でもわかるVZエディタ。0から始める。
https://qiita.com/kaizen_nagoya/items/afe6c4cdccbfdd94baab

## SRC　　

順次、ソースコードの解説、改良点などを追記予定。

source code
https://github.com/vcraftjp/VZEditor/tree/main/SRC

AC.BAT
ALIAS.ASM
BLOCK.INC
CHAR.ASM
CHKTSR.ASM
CORE.ASM
CTYPE.INC
DISP.ASM
DOS.ASM
EMS.ASM
EXPR.ASM
EZKEY.ASM
FILER.ASM
FROLL.ASM
GETS.ASM
HARDERR.ASM
INST.ASM
KEY.ASM
KEY98.ASM
KEYIBM.ASM
LEDIT.ASM
LK.BAT
MACRO.ASM
MAIN.ASM
MEMO.ASM
MENU.ASM
MISC.ASM
MK.BAT
MSG.ASM
OPEN.ASM
PRINTF.ASM
SCRN.ASM
SCRN98.ASM
SCRNIBM.ASM
SMOOTH.ASM
SPRINTF.INC
STD.INC
STRING.ASM
SWAP.ASM
TEXT.ASM
VIEW.ASM
VMAP.ASM
VZ.INC
VZ.LNK
VZ.MAK
VZ.OMK
VZSEL.ASM
WIND.ASM
XSCR.ASM
ZCOPY.ASM

VZ SRC INC
https://qiita.com/kaizen_nagoya/items/fc7c856991869f72cb90

main.asmではvz.incをincludeしている。
vz.inc ではstd.incをincludeしている。

## main.asm

```c:main.asm
;****************************
;	'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
;****************************
```

## technical comment

### near; far

8086では、プログラムのJumpに、近距離と遠距離で、プログラムの長さと、処理時間の違いがあった。
なるべくner jumpだけで済ませられれば、高速で小さなプログラムが実現する。

これは、プログラムを小さく、高速にするというCの精神とも合致している。

### msdos
std.incで、次のように定義している。ソフトウェア割り込みの設定。
```c:std.inc
msdos	macro	cmd,prm
ifb	<prm>
	mov	ah,cmd
else
	movhl	ax,cmd,prm
endif
	int	21h
	endm
```

### others

8086 assembler tutorial for beginners (part 1)
https://yassinebridi.github.io/asm-docs/asm_tutorial_01.html
https://people.vts.su.ac.rs/~pmiki/ASM_old/ASM%20zbirka/8086%20Assembly.pdf

bttrx 8086-assembler
https://github.com/bttrx/8086-assembler

Online 8086 EMULATOR
https://yjdoc2.github.io/8086-emulator-web/


Learn 8086 (x86) Assembly Programming - Lesson1 : For absolute beginners!
https://www.youtube.com/watch?v=K9eRSsYlt00

ASSEMBLY LANGUAGE BASICS #1 | 8086 PROGRAMMING | EXAMPLES | TASM
https://www.youtube.com/watch?v=FtJwZtb6x6s

8086/8088 Assembly Language: Setting up an assembler
https://www.youtube.com/watch?v=s0ATDk6Rtzc