	title	'RES86 DISASSEMBLER'
	page	60,132
;
;	last edit 02/10/85 wde
;	2/10/85 2.3b fix goof in read .ctl funct
;	fix flow indic semic test,repair 8080 sym lookup
;	fix sym type write bug
;	1/17 2.3a add fixes from b kendall

;	3/21/85 3.0 convert to masm format for ms-dos systems by Craig Derouen


code	segment byte public

	extrn	cntenb:byte,opdtyp:byte,quiflg:byte,segflg:byte,segmsk:byte
	extrn	segsho:byte,sdflg:byte,trmflg:byte,typndx:byte,wfiflg:byte
	extrn	wrtflg:byte,xcsw:byte,adb:byte,strcnt:byte,symtyp:byte

	extrn	ascbld:word,cofset:word,ctlbas:word,ctltop:word,curofs:word
	extrn	curpar:word,dmpcnt:word,dmpend:word,dmpstt:word,docend:word
	extrn	doctbl:word,ecnt:word,fndadd:word,fndpc:word,hiload:word
	extrn	insloc:word,lastwd:word,liscnt:word,mcbsiz:word,ofsptr:word
	extrn	nrsegs:word,nxtctl:word,pcntr:word,rplptr:word,segsiz:word
	extrn	stack:word,symtp:word,xcptr:word,cmdbuf:word
	extrn	segnam:word,mcbbas:word,fake_comtbl:word

	extrn	addfn:near,bdos:near,cmentr:near,cmkill:near
	extrn	creatf:near,cstbl:near,crlf:near,dline:near
	extrn	dcrlf:near,fclose:near,fopen:near,gtcmd:near,gtval:near
	extrn	hexl:near,hexr:near,ifasci:near,initbl:near
	extrn	keychk:near,lita86:near,litall:near,litcmd:near,litctl:near
	extrn	litdoc:near,litsym:near,lngth:near,locsym:near,prntde:near
	extrn	prtstr:near,prspc:near,prword:near,pstar:near,pstrg:near
	extrn	rdfchr:near,semic:near,symbas:near,symluk:near
	extrn	tabc:near,typech:near,wtfchr:near,xo:near,xo0:near,flushf:near
	extrn	cmpstr:near,pstg:near

	public	start,hsym,nwln0,delim,cmerr,nxcmd

	public	fcb,tbuf

; dummy publics for symbol file

	public	entry,ardnam,restrt,l01cf,funlp,fndfun,segonl,fcttbl,fctend
	public	deliok,cmhelp,cmtrim,trmof,cmpurg,l02c9,cmprlg,l02df,pfnlp
	public	nofnam,pnmdun,l031d,prlglp,l032c,l033d,l034b,l0362,l0380,l0394
	public	nodisp,sgreqs,updseg,segmch,segmtb,cmqiet,l03b2,cmdump,l0411
	public	l0418,dump0,dump1,dump3,dmphdr,cntdmp,dump4,dmpln,wdspc1
	public	wdspc2,wdspc3,dmpasc,period,chrctr,wdspc4,lcmplt,sducnt,l04e8
	public	l04ef,dusymt,frmbgn,frmsym,agnsym,l051a,spit,spit1,spitcr,spcrlf
	public	spcry,iecnt,prntos,gfnam,l056a,l057d,nodriv,mvnfld
	public	eatfld,l05b6,padfld,cmatmt,cmbld,cmlist,list1,list2,list3
	public	tenl,contl,flagck,builda,loop8,follow,morel,nwln,ncsemi,cntcmt
	public	ntbksl,morel1,morel2,ncmt,cml15,l06fd,ckbmd,ckhmd,ckwmd,badmd,ictl
	public	slicnt,l0762,l0776,l077d,dsmode,wmode,stpln,hmode,bmode,bmode1
	public	nprtc,morinv,ltlf,mvup,trysym,nstpln,l0864,nxinv,conasc,morasc
	public	l08ac,yet,still,lastqt,fnlqt,qtb,cmstts,nodoct,l0984,sgplp
	public	usdseg,sgpen,prwval,cmfind,l09c6,l09d1,prevf,nyet
	public	cmeof,l0a35,cmread,rdaprv,wntall,lodall,chgtyp,ntlall,symffd
	public	l0a8a,wntcmd,lodcmd,cmdlds,modofs,cmhlp,cmhmlp,set_dmablk
	public	mrqok,l0ac4,l0adc,l0aec,doclod,gotdoc,lodsym,comrd_lp
	public	ldsym2,loddoc,lddoc2,ldasfl,skppre,l0b6c,drdsk1,lpasld,ldassp
	public	hexbin,l0ba3,l0ba8,l0baf,l0bb5,erstbl,etlp1,etlp2,cmsave
	public	savok,allsav,nosdoc,nossym,havctl,ntsall,ntssym,ntsctl,symsav
	public	l0bf4,l0bf7,sdskp1,l0c0c,oufend,ntsdoc,outadr,sava86,savdoc
	public	rrqerr,l0d20,cmctl,l0d45,l0d4f,l0d5a,enterc,entrc2,entrc4
	public	l0d84,l0dba,l0dc6,cltrck,ctlck2,cltrrt,l0bf5,entrc5,entrc7
	public	entrc8,l0e34,ctlook,ctlk2,l0e4s,l0e5c,l0e48,ctlk4,l0e65,clist0
	public	clist,clist2,l0e87,l0e99,skclis,savctl,svctl0,l0ebf,l0ee6
	public	lodctl,ctlfnd,l0ef7,l0efd,l0f0b,l0f23,l0f30,cmcmnt,cmnt0,cmnt2
	public	cmnt1,l0f52,l0f5d,l0f71,l0f7d,comchk,l0fa6,l0fb2,l0fc3,l0fce
	public	l0fd4,l0fd8,l0fec,l0ffa,l100b,l1015,l1023,l1041,l104c,cmusec
	public	l10ce,ustok,uaset,l10ef,l111c,l1151,l1152,good_vers,good_mem

	assume cs:code,ds:code

	org	5ch
fcb	db	36 dup (?)
tbuf	db	128 dup(?)	;that takes care of the first page


symmax	equ	9		;max chars in symbol
tab	equ	9
cr	equ	0dh
lf	equ	0ah
initlcnt equ	20

;
	org	100h

	if2
	%out	Compiling in PASS 2 finally!
	endif

start:
	mov	ah,30h
	int	21h
	cmp	al,2
	jae	good_vers
	mov	dx,offset bad_vers
	mov	ah,9
	int	21h
	int	20h			; back to DOS!

bad_vers db	cr,lf,7,'Wrong version of DOS! Must be 2.0 or higher$'

good_vers:
; First thing is to de-allocate memory so we can grab portions at a time.
	mov	bx,offset symbas	; the end of program
	sub	bx,100h			; start of program
	mov	cl,4
	shr	bx,cl			; convert to paras!

; Now add about 10k for symbol table
	add	bx,640			; 10K in paras
	mov	ah,4ah
;	int	21h			; here we go!
;	jnc	good_mem		; we have enough!
;	mov	ah,9
;	mov	dx,offset memory_fail
;	int	21h
;	mov	ax,4cffh
;	int	21h			; exit with a -1
;
;memory_fail db	cr,lf,7,'Not enough memory to run!$'

good_mem:

	call	entry
	db	'RESOURCE by Ward Christensen',cr,lf
	db	'Transl. to 8086 by Larry Etienne',cr,lf
	db	'Converted 8086 MS-DOS Ver. 3.0',cr,lf
	db	'by C.Derouen (3-26-85)',cr,lf
	db	'Copyright 1980$'
;
entry:	pop	dx
	mov	ax,ds
	cli
	mov	ss,ax
	mov	sp,offset stack
	sti
	mov	es,ax			;start = data seg
	push	cs
	pop	ds			;segment for signon msg
	mov	ah,9
	call	bdos
	mov	ax,ss
	mov	ds,ax			;restore normal
	call	initbl
	mov	al,fcb+1
	cmp	al,' '+1
	jb	restrt
	call	prtstr
	db	cr,lf,'Reading All Files for ',0
	mov	bx,offset fcb+1
	mov	ch,8
ardnam:	mov	al,[bx]
	call	typech
	inc	bx
	dec	ch
	jnz	ardnam
	call	lodall
	call	prtstr
	db	cr,lf,'Read Complete',cr,lf,0
	jmp	short fstcmd
;
restrt:	call	initbl
fstcmd:	call	prtstr
	db	cr,lf,'Type H for Help, ? for Stats',cr,lf,0
;
nxcmd:	xor	al,al
	mov	wfiflg,al
	mov	quiflg,al		;not quiet, no output
	mov	segflg,al		;clear segment use
	mov	sp,offset stack
	call	gtcmd
l01cf:	mov	bx,offset cmdbuf+2	;first chars of command
	cmp	word ptr 1[bx],':S'
	jz	segonl			;just change segment
	mov	al,[bx]			;get the char
	mov	bx,offset fcttbl
	mov	ch,(offset fctend-offset fcttbl)/3	;tbl entries
funlp:	cmp	al,cs:[bx]		;test char match
	jz	fndfun
	inc	bx
	inc	bx
	inc	bx
	dec	ch
	jnz	funlp
	jmp	cmerr
;
fndfun:	inc	bx
	mov	dx,cs:[bx]		;address of function
	jmp	dx
;
segonl:	inc	bx	;pre-adj
	call	updseg
	jmp	short nxcmd
;
fcttbl	db	cr
	dw	offset nxcmd
	db	';'
	dw	offset cmcmnt
	db	'A'
	dw	offset cmatmt
	db	'B'
	dw	offset cmbld
	db	'C'
	dw	offset cmctl
	db	'D'
	dw	offset cmdump
	db	'E'
	dw	offset cmentr
	db	'F'
	dw	offset cmfind
	db	'G'
	dw	offset cmexit
	db	'H'
	dw	offset cmhelp
	db	'K'
	dw	offset cmkill
	db	'L'
	dw	offset cmlist
;	db	'O'
;	dw	offset cmofst
	db	'P'
	dw	offset cmprlg
	db	'Q'
	dw	offset cmqiet
	db	'R'
	dw	offset cmread
	db	'S'
	dw	offset cmsave
	db	'T'
	dw	offset cmtrim
	db	'U'
	dw	offset cmusec
	db	'X'
	dw	offset cmpurg
	db	'Z'
	dw	offset cmeof
	db	'?'
	dw	offset cmstts
fctend	db	0
;
cmerr:	xor	al,al
	mov	wfiflg,al
	mov	quiflg,al		;clear output and silent flags
	pop	bx			;addr called from
	push	bx			;in case stack empty 
	call	prword			;show where for debugging
	call	prtstr
	db	'? Cmd. Error',7,cr,lf,0
	jmp	nxcmd
;
delim:	cmp	al,' '
	jz	deliok
	cmp	al,','
	jz	deliok
	call	cmerr	;expected delimiter missing
deliok:	ret

; Exit resource here
cmexit:
	mov	ax,4c00h	; say no errors
	int	21h

;
;	help function
;
cmhelp:	
; Test to see if extended help is needed.
	mov	al,byte ptr cmdbuf+3
	cmp	al,cr		; nothing there?
	je	full_help
	cmp	al,'X'		; help extended key
	jne	full_help
	jmp	extnd_help	; show extended help
full_help:
	call	prtstr			;lots to put out here!
;line  1
	db	cr,lf,'		     HELP ON RES86 -- COMMAND SUMMARY'
;line  2
	db	cr,lf,';ADDR,@COMMENT	ENTER COMMENT AT ADDR	'
	db	' @={;|*|\|} \=NL, ;=APPND, *=REPL INST'
;line  3
	db	cr,lf,';		LIST COMMENTS TABLE	'
	db	';ADDR,		DELETE COMMENT'
;line  4
	db	cr,lf,"A (SEE L)	ATTEMPT TO FIND DB'",'S	'
	db	'B (SEE L)	BUILD SYMBOL TABLE'
;line  5
	db	cr,lf,'C		DUMP CONTROL TABLE	'
	db	'CNNNN		DUMP CTRL TABLE AT NNNN'
;line  6
	db	cr,lf,'CNNNN,X		 SET CTRL (X=BEHISW)	'
	db	'DNNNN		DUMP FROM NNNN ON'
;line  7
	db	cr,lf,'DAAAA,BBBB	DUMP OVER RANGE		'
	db	'D,BBBB		DUMP THRU BBBB'
;line  8
	db	cr,lf,'D		DUMP A PAGE MORE	'
	db	'D=NN		SET DUMP SIZE DEFAULT'
;line  9
	db	cr,lf,'DS		DUMP THE SYMBOL TABLE	'
	db	'DS.SYMBOL	DUMP STARTING AT SYMBOL'
;line 10
	db	cr,lf,'ENNNN,.SYM[,M] ENTER SYMBOL INTO TABLE	'
	db	'FNNNN,SSSS	FIND NNNN AFTER SSSS'
;line 11
	db	cr,lf,'F OR FNNNN	CONT FIND OR FIND NNNN	'
	db	'SEG PFX OK ON CMDS A,B,C,D,F,L,O,;'
;	db	'ISSSS,OOOO	INC ADDRS>=SSSS BY OOOO'
;line 12
	db	cr,lf,'K.SYMBOL	KILL SYMBOL FROM TABLE	'
	db	'L		LIST NEXT '
	db	(initlcnt/10)+'0',(initlcnt mod 10)+'0'
	db	' LINES'
;line 13
	db	cr,lf,'LSSSS,EEEE	LIST OVER RANGE		'
	db	'L,EEEE		LIST TO EEEE'
;line 14
	db	cr,lf,'LSSSS		LIST '
	db	(initlcnt/10)+'0',(initlcnt mod 10)+'0'
	db	' LINES FROM SSSS	'
	db	'L=NN[,OTHERS]	SET LIST DEFAULT'
;line 15
;	db	cr,lf,'O		PRINT CURRENT OFFSET	'
;	db	'ONNNN		SET NEW OFFSET'
;line 16
	db	cr,lf,'PSSSS,EEEE	GENERATE PROGRAM PROLOG	'
	db	'Q		QUIET PREFIX'
;line 17
	db	cr,lf,'RFILENAME.COM	READ FILE @ OFFSET     	'
	db	'RFILENAME.CTL	READ CONTROL TABLE'
;line 18
	db	cr,lf,'RFILENAME.SMB	READ SYMBOL TABLE	'
	db	'RFILENAME.DOC	READ COMMENTS TABLE'
;line 19
	db	cr,lf,'RFILENAME.ALL	READ CTL, SMB, DOC, COM	'
	db	'SFILENAME.ASM	SAVE ASM FILE'
;line 20
	db	cr,lf,'SFILENAME.CTL	SAVE CTL FILE		'
	db	'SFILENAME.SMB	SAVE SYM FILE'
;line 21
	db	cr,lf,'SFILENAME.DOC	SAVE DOC FILE		'
	db	'SFILENAME.ALL	CTL, SYM, DOC'
;line 22
	db	cr,lf,'UNNNN		SET COMMENT TABLE ADDR	'
	db	'X		RESTART RES86'
;line 23
	db	cr,lf,'Z		WRITE EOF TO ASM FILE	'
	db	'?		PRINT STATISTICS'
;line 24
	db	cr,lf,0			;finished!!
	jmp	nxcmd
extnd_help:
	call	prtstr

	db	cr,lf,'Extended help for Resource-86'
	db	cr,lf,'G	Exit back to MS-DOS'
	db	cr,lf,'Segments may be overrriden with the SEGMENT override'
	db	' key such as DCS:0 for display code at Data Segment,offset 0'
	db	cr,lf,0
	jmp	nxcmd
;
cmtrim:	mov	al,trmflg
	not	al
	mov	trmflg,al
	or	al,al
	jz	trmof
	call	prtstr
	db	'Trim On',cr,lf,0
	jmp	nxcmd
;
trmof:	call	prtstr
	db	'Trim Off',cr,lf,0
	jmp	nxcmd
;
;
;
cmpurg:	call	prtstr
	db	'Y/N purge all symbols & CTL?',0
	call	gtcmd
	mov	al,byte ptr cmdbuf+2
	cmp	al,'Y'	;59h
	jnz	l02c9
	call	erstbl	;empty the segment tables
	jmp	restrt
;
l02c9:	cmp	al,'N'	;4eh
	jnz	cmpurg	;bad answer
	jmp	nxcmd
;
;
;
cmprlg:	mov	bx,offset cmdbuf+3
	mov	al,[bx]
	cmp	al,cr
	jnz	l02df
	call	cmerr
;
l02df:	call	gtval
	call	delim
	inc	bx
	push	dx
	push	bx
	mov	wfiflg,1
	call	pstg
	db	9,'TITLE',9,27h,0
	mov	bx,offset fcb+1
	mov	al,[bx]
	cmp	al,' '
	jz	nofnam
	mov	ch,8
pfnlp:	mov	al,[bx]
	call	typech
	inc	bx
	dec	ch
	jnz	pfnlp
	jmp	short pnmdun
;
nofnam:	call	pstg
	db	'DISASSEMBLY',0
;
pnmdun:	call	pstg
	db	27h,cr,lf,9,'ORG',9,0
	pop	bx
	pop	dx
	mov	al,dh
	call	xo0
	mov	al,dl
	call	xo
	mov	al,'H'	;48h
	call	typech
	call	crlf
	push	dx
	call	gtval
	cmp	al,cr
	jz	l031d
	call	cmerr
;
l031d:	pop	cx
	mov	bx,offset symbas
prlglp:	inc	bx
	inc	bx
	inc	bx
	mov	al,[bx]
	or	al,al
	jnz	l032c			;not table end
	jmp	nxcmd
;
l032c:	dec	bx
	dec	bx
	dec	bx
	mov	ax,[bx]
	sub	ax,cx
	jb	l033d
	mov	ax,[bx]
	sub	ax,dx
	jb	l0394
l033d:	inc	bx
	push	bx
	push	cx
	inc	bx
	inc	bx
	mov	ch,[bx]
	push	bx
	inc	bx
	mov	al,[bx]
	dec	bx
	cmp	al,'A'	;41h
	jb	nodisp
l034b:	inc	bx
	mov	al,[bx]
	cmp	al,'+'	;2bh
	jz	nodisp
	cmp	al,'-'	;2dh
	jz	nodisp
	dec	ch
	jnz	l034b
	pop	bx
	mov	ch,[bx]
	mov	wfiflg,1
l0362:	inc	bx
	mov	al,[bx]
	call	typech
	dec	ch
	jnz	l0362
	call	pstg
	db	9,'EQU',9,'.',0
	pop	cx
	pop	bx
	mov	al,[bx]
	or	al,al
	jz	l0380
	call	xo0
l0380:	dec	bx
	mov	al,[bx]
	call	xo
	mov	al,'H'	;48h
	call	typech
	call	crlf
	mov	wfiflg,0
l0394:	inc	bx
	inc	bx
	inc	bx
	mov	al,[bx]
	call	addfn
	inc	bx
	call	keychk
	jmp	prlglp
;
nodisp:	pop	bx
	pop	cx
	pop	bx
	jmp	l0394
;
sgreqs:	mov	bx,offset cmdbuf+4	;process segment request
	mov	ax,[bx]
	cmp	ax,':S'			; is xs: in place?
	jz	updseg			;yes, find which and set
	ret				;else do nothing
updseg:	dec	bx
	mov	al,[bx]	;first seg char
	sub	ah,ah			;start at 0
	cmp	al,'C'
	jz	segmch
	inc	ah
	cmp	al,'D'
	jz	segmch
	inc	ah
	cmp	al,'E'
	jz	segmch
	inc	ah
	cmp	al,'S'
	jz	segmch
	ret				;ignore any others
;
segmch:	mov	segsho,al		;for cmd. prompt display
	mov	segflg,al		;seg req given
	mov	al,ah			;count value
	sub	ah,ah
	mov	bx,ax			;in a base reg
	mov	cl,cs:byte ptr segmtb[bx]	;get bit patt.
	mov	opdtyp,cl		;init symb select
	mov	segmsk,cl		;for testing symbols
	mov	bl,12			;size of segment record
	mul	bl			;index segment records
	mov	bx,offset cofset 	;segment para word base
	add	bx,ax			;index to right seg.
	mov	ofsptr,bx		;save pntr for future use
	mov	ax,[bx]			;get this para value
	mov	curpar,ax		;to active para holder
	mov	ax,-8[bx]		;get segment length
	mov	cl,4
	shl	ax,cl			;convt to bytes
	mov	segsiz,ax		;for ctl tbl limits
	mov	dx,offset cmdbuf+3 	;dest
	mov	bx,offset cmdbuf+6 	;srce
	call	l03b2			;squeeze out segment chars
	ret
;
segmtb	db	0ch,04h,08h,00h
;
;
;
cmqiet:	mov	al,1
	mov	quiflg,al		;no screen output for now
	mov	dx,offset cmdbuf+2
	mov	bx,offset cmdbuf+3
	call	l03b2
	jmp	l01cf
;
l03b2:	mov	al,[bx]	;move cmd line
	xchg	bx,dx
	mov	[bx],al	;down a notch
	xchg	bx,dx
	inc	bx
	inc	dx
	cmp	al,cr
	jnz	l03b2
	ret
;
;
;
cmdump:	call	sgreqs
	mov	dx,dmpstt
	mov	bx,dmpcnt
	add	bx,dx
	mov	dmpend,bx
	mov	bx,offset cmdbuf+3
	mov	al,[bx]			;2nd cmd char
	cmp	al,cr
	jz	dmphdr			;continue last dump
	cmp	al,'S'	;53h
	jnz	l0411
	mov	al,1[bx]		;next char
	cmp	al,':'			;segment req coming? 
	jz	l0411			;looks like it
	jmp	dusymt
;
l0411:	cmp	al,'='	;3dh
	jnz	l0418
	jmp	sducnt
;
l0418:	cmp	al,','	;2ch
	jz	dump1
dump0:	call	gtval
	push	bx
	mov	bx,dmpcnt
	add	bx,dx
	mov	dmpend,bx
	pop	bx
dump1:	cmp	al,cr
	jz	dump3
	call	delim
	inc	bx
	push	dx
	call	gtval
	xchg	bx,dx
	mov	dmpend,bx
	pop	dx
dump3:	mov	bx,curofs
	push	bx
	add	bx,dx
	mov	dmpstt,bx
	mov	bx,dmpend
	pop	dx
	add	bx,dx
	mov	dmpend,bx
	cmp	al,cr
	jz	dmphdr
	call	cmerr
;
dmphdr:	call	prtstr	;give header 
	db	'Addr  +0   +2    +4   +6     +8   +A    +C   +E'
	db	'     ASCII',cr,lf,0
cntdmp:	mov	bx,dmpstt
	mov	es,curpar
dump4:	call	keychk
	push	bx
	sub	bx,curofs		;remove offset for addr print
	call	prword
	pop	bx
	push	bx
	call	prspc
dmpln:	mov	es,curpar
	mov	al,es:[bx]
	call	xo
	inc	bx
	mov	al,bl
	and	al,1
	jnz	wdspc1
	call	prspc
wdspc1:	mov	al,bl
	and	al,3
	jnz	wdspc2
	call	prspc
wdspc2:	mov	al,bl
	and	al,7
	jnz	wdspc3
	call	prspc
wdspc3:	mov	al,bl
	and	al,0fh
	jnz	dmpln
	call	pstar
	pop	bx
dmpasc:	mov	es,curpar
	mov	al,es:[bx]
	cmp	al,' '	;20h
	jb	period
	cmp	al,7fh
	jb	chrctr
period:	mov	al,'.'	;2eh
chrctr:	call	typech
	inc	bx
	mov	al,bl
	and	al,0fh
	jz	lcmplt
	and	al,7
	jnz	wdspc4
	call	prspc
wdspc4:	jmp	dmpasc
;
lcmplt:	call	pstar
	call	crlf
	mov	dmpstt,bx
	mov	ax,dmpend
	sub	ax,bx
	jnb	dump4
	jmp	nxcmd
;
sducnt:	inc	bx
	call	gtval
	inc	bx
	dec	dx
	xchg	bx,dx
	mov	dmpcnt,bx
	xchg	bx,dx
l04e8:	cmp	al,cr
	jnz	l04ef
	jmp	nxcmd
;
l04ef:	call	delim
	jmp	dump0
;
dusymt:	call	iecnt			;init items per line
	mov	bx,offset cmdbuf+4
	mov	al,[bx]
	cmp	al,'.'	;2eh
	jnz	frmbgn			;no start given
	call	lngth
	call	locsym
	jnb	frmsym
	mov	bx,insloc		;best approx
	jmp	frmsym
;
frmbgn:	mov	bx,offset symbas
frmsym:	call	prtstr
	db	'KEY: @-C=SS, D-G=DS, H-K=ES, L-O=CS, '
	db	'@DHL=UNDF, AEIM=BYTE, BFJN=WORD, CGKO=DWRD',cr,lf,0
agnsym:	mov	dx,[bx]			;symbol value
	inc	bx
	inc	bx
	inc	bx
	mov	al,[bx]			;string size
	or	al,al
	jz	spitcr			;end of table reached
l051a:	xchg	bx,dx
	call	prword			;output value
	xchg	bx,dx
	dec	bx
	mov	al,[bx]			;oprnd type byte
	inc	bx
	or	al,'@'			;make printable
	call	typech
	mov	al,' '
	call	typech
	mov	ch,[bx]
	mov	al,symmax+1
	sub	al,ch
	mov	cl,al			;pad spaces needed
	inc	bx
spit:	mov	al,[bx]
	call	typech
	inc	bx
	dec	ch
	jnz	spit
	mov	ch,cl
spit1:	call	prspc
	dec	ch
	jnz	spit1
	call	spcrlf
	call	keychk
	jmp	agnsym
;
spitcr:	call	crlf
	jmp	nxcmd
;
spcrlf:	dec	ecnt
	jz	spcry
	ret
;
spcry:	call	crlf
;
iecnt:	mov	ecnt,4
	ret
;
prntos:;	call	prtstr
;	db	'Offset = ',0
;	mov	bx,curofs
;	call	prword
	call	crlf
	jmp	nxcmd
;
;cmofst:	call	sgreqs		;any segment data?
;	mov	bx,offset cmdbuf+3
;	mov	al,[bx]
;	cmp	al,cr
;	jz	prntos			;just show curr value
;	call	gtval			;get new from user
;	cmp	al,cr
;	jz	l0557			;that must be all
;	call	cmerr
;
;l0557:	mov	curofs,dx		;active value in curofs
;	mov	bx,ofsptr		;where seg rcrd keeps it
;	mov	[bx],dx			;active segment update
;	jmp	nxcmd
;
gfnam:	mov	al,wrtflg
	or	al,al
	jz	l056a
	jmp	rrqerr
;
l056a:	mov	byte ptr fcb,al
	mov	byte ptr fcb+12,al
	mov	bx,offset cmdbuf+3
	mov	al,byte ptr cmdbuf+4
	cmp	al,' '			;20h
	jnz	l057d
	call	cmerr
;
l057d:	cmp	al,':'			;3ah
	jnz	nodriv
	mov	al,byte ptr cmdbuf+3
	sub	al,'@'			;40h
	mov	byte ptr fcb,al
	inc	bx
	inc	bx
nodriv:	mov	dx,offset fcb+1
	mov	ch,8
	call	mvnfld
	mov	ch,3
	call	mvnfld
	ret
;
mvnfld:	mov	al,[bx]
	cmp	al,cr
	jz	padfld
	inc	bx
	cmp	al,'.'			;2eh
	jz	padfld
	xchg	bx,dx
	mov	[bx],al
	xchg	bx,dx
	inc	dx
	dec	ch
	jnz	mvnfld
eatfld:	mov	al,[bx]
	cmp	al,cr
	jnz	l05b6
	ret
;
l05b6:	inc	bx
	cmp	al,'.'			;2eh
	jnz	eatfld
	ret
;
padfld:	mov	al,' '			;20h
	xchg	bx,dx
	mov	[bx],al
	xchg	bx,dx
	inc	dx
	dec	ch
	jnz	padfld
	ret
;
;
;
cmatmt:	mov	bx,0001h
	jmp	short list1
;
cmbld:	mov	bx,0100h
	jmp	short list1
;
;
cmlist:	mov	bx,0000h
list1:	mov	word ptr ascbld,bx	;set two flags
	xor	al,al
	mov	wfiflg,al
	mov	al,byte ptr liscnt
	mov	byte ptr liscnt+1,al
	mov	cntenb,al		;assume line count range
	call	sgreqs			;check for segment spec.
	mov	bx,offset cmdbuf+3
	mov	al,[bx]
	cmp	al,cr
	jz	tenl			;do default amount
	cmp	al,','	;2ch
	jz	list3
	cmp	al,' '	;20h
	jz	list3			;first param null
	cmp	al,'='	;3dh
	jnz	list2
	jmp	slicnt			;change list amount
;
list2:	call	gtval			;get first parm
	mov	pcntr,dx		;where to start
	cmp	al,cr
	jz	tenl			;only start given
	call	delim
list3:	inc	bx			;pass delimiter
	call	gtval			;get 2nd parm
	mov	lastwd,dx		;addr to stop at
	mov	cntenb,0		;not specific line count
;
tenl:	call	keychk
	test	cntenb,0ffh
	jz	contl
	mov	al,byte ptr liscnt+1
	dec	al
	jns	flagck
	jmp	nxcmd
;
contl:	mov	es,curpar		;set to wanted segment
	mov	ax,pcntr
	sub	ax,lastwd
	jb	flagck			;not at end
	jmp	nxcmd
;
flagck:	test	ascbld,0ffh
	jz	morel			;not in 'A' mode
builda:	mov	bx,pcntr		;logical pointer
	add	bx,curofs
	mov	ch,8			;count to believe string
loop8:	mov	es,curpar
	mov	al,es:[bx]
	call	ifasci			;test for db prospects
	jb	morel			;doesnt look like it
	inc	bx
	dec	ch
	jnz	loop8			;if need more for faith
follow:	mov	es,curpar
	mov	al,es:[bx]
	inc	bx
	call	ifasci			;test how many more
	jnb	follow
	dec	bx			;to last ascii byte +1
	sub	bx,curofs		;get logical addr
	push	bx			;save for a bit
	mov	dx,pcntr		;start addr of string
	mov	al,'B'
	call	enterc			;make byte entry in ctl tbl
	pop	dx			;recover end addr
	mov	al,'I'			;back to 'I' at end
	call	enterc
morel:	mov	bx,doctbl
	or	bx,bx
	jz	ncmt			;nothing in comment table
	mov	bx,pcntr
	xchg	bx,dx
	call	comchk			;test for poss. comment
	jb	ncmt			;if none
	inc	bx
	inc	bx			;skip addr field
	mov	ch,[bx]			;byte count of comment
	mov	al,1[bx]		;first comment character
	cmp	al,';'			;append it?
	jnz	morel1
	mov	xcptr,bx		;save for append comment
	jmp	ncmt			; dont need it now
;
;this routine prints comment like this on separate line(s)
;
nwln:	stc				;semic to start
nwln0:	mov	wfiflg,1
	jnb	ncsemi
	call	semic			;start with semicolon
ncsemi:	or	ch,ch
	jnz	cntcmt			;if non zero count
	ret
;
cntcmt:	inc	bx			;update pntr
	mov	al,[bx]
	cmp	al,'\'			;'\' for multi-line comment
	jnz	ntbksl
	call	crlf			;break comment here
	dec	ch
	jmp	nwln0
;
ntbksl:	call	typech
	dec	ch
	jnz	cntcmt
	ret
;
morel1:	cmp	al,'*'			;substitute comment?
	jnz	morel2
	mov	rplptr,bx		;comment replaces instr
	jmp	ncmt			;but not right now
;
morel2:	call	nwln			;put out the comment
	call	crlf
;
ncmt:	mov	dx,pcntr
	call	ctlook			;find ctrl entry for this addr
	pushf
	dec	bx			;back to prev mode for default
	popf
	jb	cml15			;not matched addr, use prev mode
	add	bx,4			;use matched addr mode
cml15:	mov	al,[bx]			;mode char
	cmp	al,'I'			;49h
	jz	ictl			;do instruction list
	cmp	al,'E'			;45h
	jnz	l06fd
	jmp	cmeof			;show end & stop
;
l06fd:	push	ax
	inc	bx			;to next ctl rec base
	mov	dx,1[bx]		;addr value
	push	dx
	mov	bx,pcntr
	xchg	bx,dx
	call	hsym			;check for any label
	pop	bx
	mov	nxtctl,bx		;save addr to recheck ctrl
	xchg	bx,dx
	mov	wfiflg,0
	pop	ax
	cmp	al,'S' 			;space (rs) mode?
	jnz	ckbmd
	jmp	dsmode
;
ckbmd:	cmp	al,'B'			;byte mode?
	jnz	ckhmd
	jmp	bmode
;
ckhmd:	cmp	al,'H'			;force hex bytes?
	jnz	ckwmd
	jmp	hmode
;
ckwmd:	cmp	al,'W'			;word mode?
	jnz	badmd
	jmp	wmode
;
badmd:	call	typech
	call	prtstr
	db	': INVALID CTL ENTRY',cr,lf,0
	jmp	nxcmd
;
ictl:	call	dline			;disasm one instruction
	mov	wfiflg,0
	jmp	tenl
;
slicnt:	inc	bx
	call	gtval
	mov	al,dl			;one byte value
	or	al,al			;test if legal
	jnz	l0762
	call	cmerr
;
l0762:	mov	byte ptr liscnt,al	;save line count
	mov	byte ptr liscnt+1,al	;for curr use
	mov	al,[bx]			;what ended value
	inc	bx
l0776:	cmp	al,cr			;only define?
	jnz	l077d
	jmp	nxcmd
;
l077d:	call	delim
	jmp	list2
;
dsmode:	push	dx
	mov	bx,pcntr
	neg	bx
	add	bx,dx
	mov	wfiflg,1
	call	pstg
	db	'RS',9,0
	mov	al,bh
	call	xo0
	mov	al,bl
	call	xo
	mov	al,'H'			;48h
	call	typech
	call	dcrlf
	pop	bx
	mov	pcntr,bx
	jmp	tenl
;
wmode:	mov	al,1
	mov	wfiflg,al
	call	pstg
	db	'DW',9,0
	mov	bx,pcntr
	add	bx,curofs
	mov	es,curpar
	mov	dx,es:[bx]
	call	prntde
	call	crlf
	mov	bx,pcntr
	inc	bx
	inc	bx
	mov	pcntr,bx
	jmp	tenl
;
stpln:	call	dcrlf
	jmp	tenl
;
hmode:	xor	al,al
	jmp	short bmode1
;
bmode:	mov	al,0ffh
bmode1:	mov	adb,al			;set subtype flag
	mov	strcnt,0
	mov	wfiflg,1
	mov	bx,pcntr
	add	bx,curofs
	test	adb,0ffh
	mov	es,curpar
	mov	al,es:[bx]
	jz	nprtc
	cmp	al,' '			;20h
	jb	nprtc			;cant print ctrl codes
	cmp	al,7fh
	jnb	nprtc			;also unprintable
	jmp	conasc
;
nprtc:	call	pstg
	db	'DB',9,0
	xor	al,al
	mov	strcnt,al
morinv:	mov	es,curpar
	mov	al,es:[bx]
	cmp	al,lf
	jb	ltlf
	call	xo0
	mov	al,'H'			;48h
	call	typech
	mov	al,strcnt
	add	al,2
	mov	strcnt,al
	jmp	mvup
;
ltlf:	or	al,'0'			;30h
	call	typech
mvup:	inc	bx
	mov	dx,pcntr
	inc	dx
	mov	pcntr,dx
	cmp	dx,nxtctl
	jnz	trysym
	jmp	qtb
;
trysym:	mov	bx,pcntr
	xchg	bx,dx
	call	symluk
	jb	nstpln
	jmp	stpln
nstpln:	mov	al,strcnt
	add	al,2
	mov	strcnt,al
	cmp	al,25
	jb	l0864
	jmp	stpln
;
l0864:	mov	bx,pcntr
	add	bx,curofs
	test	adb,0ffh
	jz	nxinv
	mov	es,curpar
	mov	al,es:[bx]
	cmp	al,' '			;20h			
	jb	nxinv
	cmp	al,7fh
	jnb	nxinv
	jmp	stpln
;
nxinv:	mov	al,','			;2ch
	call	typech
	jmp	morinv
;
conasc:	call	pstg
	db	'DB',9,0
	mov	strcnt,0
	mov	al,''''			;27h
	call	typech
	add	strcnt,1
	mov	es,curpar
	mov	al,es:[bx]
morasc:	call	typech
	mov	es,curpar
	mov	al,es:[bx]
	cmp	al,''''			;27h
	jnz	l08ac
	call	typech
l08ac:	inc	bx
	mov	dx,pcntr
	inc	dx
	mov	pcntr,dx
	cmp	dx,nxtctl
	jz	fnlqt
yet:	push	bx
	mov	bx,pcntr
	xchg	bx,dx
	call	symluk
	pop	bx
	jnb	fnlqt
	mov	al,strcnt
	inc	al
	mov	strcnt,al
	cmp	al,35			;23h
	jnb	lastqt
	cmp	al,25
	jb	still
	dec	bx
	mov	es,curpar
	mov	al,es:[bx]
	inc	bx
	cmp	al,' '			;20h
	jz	fnlqt
still:	mov	es,curpar
	mov	al,es:[bx]
	cmp	al,' '			;20h
	jb	lastqt
	cmp	al,7fh
	jb	morasc
lastqt:	mov	al,''''			;27h
	call	typech
	jmp	stpln
;
fnlqt:	mov	al,''''			;27h
	call	typech
qtb:	call	dcrlf
	jmp	tenl
;
;
;
cmstts:	call	prtstr
	db	'SYMTBL='
	db	0
	mov	bx,offset symbas
	call	prword
	mov	bx,symtp
	call	prword
	call	crlf
	call	prtstr
	db	'PC    =',0
	mov	bx,pcntr
	call	prword
	mov	bx,hiload
	call	prword
	call	crlf
	call	prtstr
	db	'PARA  =',0
	mov	bx,curpar
	call	prword
	call	crlf
	mov	bx,doctbl
	or	bx,bx
	jz	nodoct
	call	prtstr
	db	'COMNTS='
	db	0
	mov	bx,doctbl
	call	prword
	mov	bx,docend
	call	prword
	call	crlf
nodoct:	call	prtstr
	db	'CTLTBL='
	db	0
	mov	bx,offset ctlbas
	call	prword
l0984:	mov	ax,1[bx]
	and	al,ah
	add	bx,4
	inc	al
	jnz	l0984
	sub	bx,4
	call	prword
	call	crlf
;
	call	prtstr
	db	'SEG. LGTH BASE SMIN SMAX PARA',cr,lf,0
	mov	bx,offset cstbl
sgplp:	mov	al,[bx]
	or	al,al
	jz	sgpen			;found end flag
	cmp	al,' '			;used entry?
	jnz	usdseg
	add	bx,12
	jmp	short sgplp
usdseg:	mov	ch,2
	call	pstrg			;segment label & order nr
	call	prtstr
	db	':  ',0
	call	prwval
	call	prwval
	call	prwval
	call	prwval
	call	prwval
	call	crlf
	jmp	short sgplp
;
sgpen:	jmp	nxcmd
;
prwval:	mov	dx,[bx]
	xchg	bx,dx
	call	prword
	xchg	bx,dx
	inc	bx
	inc	bx
	ret
;
;
;
cmfind:	call	sgreqs
	mov	bx,offset cmdbuf+3
	mov	al,[bx]
	cmp	al,cr
	jz	prevf
	call	gtval
	xchg	bx,dx
	mov	fndadd,bx
	mov	bx,curofs
	mov	fndpc,bx
	xchg	bx,dx
	cmp	al,cr
	jz	prevf
	call	delim
l09c6:	inc	bx
	call	gtval
	cmp	al,cr
	jz	l09d1
	call	cmerr
;
l09d1:	mov	es,curpar
	mov	bx,curofs
	add	bx,dx
	mov	fndpc,bx
prevf:	mov	bx,fndadd
	xchg	bx,dx
nyet:	call	keychk
;add topchk here
	mov	bx,fndpc
	mov	es,curpar
	mov	al,es:[bx]
	inc	bx
	mov	fndpc,bx
	cmp	al,dl
	jnz	nyet
	mov	es,curpar
	mov	al,es:[bx]
	cmp	al,dh
	jnz	nyet
	push	bx
	push	dx
	sub	bx,curofs
	dec	bx
	call	prword
	pop	dx
	pop	bx
	call	prspc
	jmp	nyet
;topchk can be put here
;
;
cmeof:	call	hsym
	mov	wfiflg,1
	call	pstg
	db	'END',cr,lf,0
	xor	al,al
	mov	wfiflg,al
	mov	al,wrtflg
	or	al,al
	jnz	l0a35
	jmp	nxcmd
;
l0a35:	mov	al,1ah
	call	wtfchr
	call	flushf
	xor	al,al
	mov	wrtflg,al
	call	prtstr
	db	'++ASM FILE CLOSED++',cr,lf,0
	jmp	nxcmd
;
;
;
cmread:
	call	gfnam
	mov	al,wrtflg
	or	al,al
	jz	rdaprv			; ok to read, now write current
	jmp	rrqerr
;
rdaprv:	mov	bx,offset fcb+9
	mov	dx,offset litall
	mov	cl,3
	call	cmpstr
	jz	wntall			;not rqst to load all
	jmp	ntlall
wntall:	call	lodall			;callable due to cmd line use
	jmp	cmstts
;
lodall:	mov	bx,offset litcmd
	call	chgtyp
	call	prtstr
	db	cr,lf,'Reading .COM file..',cr,lf,0
	call	lodcmd
;
	mov	bx,offset litdoc
	call	chgtyp
	call	prtstr
	db	cr,lf,'Reading .DOC file..',cr,lf,0
	call	loddoc
;
	mov	bx,offset litctl
	call	chgtyp
	call	prtstr
	db	cr,lf,'Reading .CTL file..',cr,lf,0
	call	lodctl
;
	mov	bx,offset litsym
	call	chgtyp
	call	prtstr
	db	cr,lf,'Reading .SMB file..',cr,lf,0
	call	lodsym
	ret
;
chgtyp:	mov	dx,offset fcb+9
	mov	ch,3
	mov	fcb+12,0		;clear extent
	jmp	mvnfld
;
ntlall:	mov	bx,offset fcb+9
	mov	dx,offset litsym
	mov	cl,3
	call	cmpstr
	jnz	l0a8a
	mov	bx,offset symbas
	call	ldasfl
	jnc	symffd
	jmp	nxcmd
symffd:	call	ldsym2
	jmp	cmstts
;
l0a8a:	mov	bx,offset fcb+9
	mov	dx,offset litcmd
	mov	cl,3
	call	cmpstr
	jz	wntcmd
	jmp	l0adc
wntcmd:	call	lodcmd
	jmp	nxcmd
;
lodcmd:	call	fopen			; locate the prog image
	jnc	cmdlds			; found one to load
	ret
;
cmdlds:	call	erstbl			; start clean
	mov	ax,mcbbas
	or	ax,ax
	jz	modofs
;	push	es
;	mov	es,ax
;	mov	ah,49h			; release memory
;	call	bdos
;	pop	es
modofs:	
	xor	dx,dx
	mov	ax,word ptr fcb+10h     ; the small part of file (com file)
	mov	cx,16
	div	cx			; convert to paras
	adc	ax,0			; any carry
	mov	mcbsiz,ax		;how much we want
	mov	bx,ax
;	mov	ah,48h			;memory request
;	call	bdos
;	jnc	mrqok			;if granted
;	call	prtstr
;	db	'Memory Allocation Error',7,0dh,0ah,0
;	jmp	nxcmd

	mov	bx,offset symbas
	sub	bx,100h			; size of program
	mov	cl,4
	shr	bx,cl
	add	bx,640			; size of pgm in paras + 10K sym area
	mov	ax,cs
	add	ax,bx			; convert to segment
mrqok: 
	mov	mcbbas,ax		; save segment
	mov	curpar,ax

; Now have to build a FAKE segment table for the com file

	mov	bx,offset fake_comtbl
	mov	dx,offset cstbl
	mov	ax,mcbsiz
	mov	[bx+1],ax
	mov	[bx+10],ax
	mov	[bx+19],ax
	mov	[bx+28],ax
	mov	ax,mcbbas
	mov	[bx+3],ax
	mov	[bx+12],ax
	mov	[bx+21],ax
	mov	[bx+30],ax
cmhlp:
	mov	al,[bx]			; segment type byte
	inc	bx
	add	al,al
	jz	set_dmablk
	inc	nrsegs
	push	bx			; save hdr ptr around move
	sub	ah,ah
	mov	bx,offset segnam-2	; no type 0
	add	bx,ax
	mov	cx,bx
	xchg	bx,dx
	mov	[bx],cx			; seg name in place
	xchg	bx,dx
	inc	dx
	inc	dx
	pop	bx			; hdr ptr back
	mov	ch,4			; words to move
cmhmlp:
	mov	ax,[bx]			; move seg data
	xchg	bx,dx
	mov	[bx],ax			; into table area
	xchg	bx,dx
	add	bx,2
	add	dx,2
	dec	ch
	jnz	cmhmlp
	add	dx,2			; skip over para in table
	jmp	short cmhlp

set_dmablk:
	sub	dx,dx			;cheap 0
	mov	cofset,dx
comrd_lp:
	mov	ax,mcbbas
	push	ds
	mov	ds,ax			; segment will be here
	mov	ah,26
	call	bdos			;dma offset = 0
	pop	ds
	mov	dx,offset fcb
	mov	ah,14h			;read data to mem
	call	bdos
	or	al,al
	jnz	l0ac4			;end or trbl
	mov	dx,cofset
	add	dx,128			; + 128 bytes
	mov	cofset,dx
	jmp	short comrd_lp
	
l0ac4:
	mov	word ptr cofset,0	; restore offset
	mov	bx,mcbsiz
	call	prword			;total file size in para
	call	crlf
	call	fclose
	mov	dx,offset tbuf
	mov	ah,1ah
	call	bdos			;restore dma offset
	mov	word ptr pcntr,0h	; set program counter
	ret
;
;
l0adc:	mov	bx,offset fcb+9
	mov	dx,offset litctl
	mov	cl,3
	call	cmpstr
	jnz	l0aec
	call	lodctl
	jmp	nxcmd
;
l0aec:	mov	bx,offset fcb+9
	mov	dx,offset litdoc
	mov	cl,3
	call	cmpstr
	jz	doclod
	call	cmerr
;
doclod:	call	l1041			;check for space assigned
	mov	bx,doctbl
	mov	sdflg,1			;flag no type byte
	call	ldasfl
	jnb	gotdoc			;if good read
	jmp	nxcmd
gotdoc:	call	lddoc2
	jmp	cmstts
;
lodsym:	mov	bx,offset symbas	;table start
	mov	sdflg,0			;flag for symb type
	call	ldasfl			;file data to memory
ldsym2:	mov	symtp,bx
	mov	byte ptr 3[bx],0 	;zero count = end flag
	ret
;
loddoc:	call	l1041
	mov	sdflg,1
	call	ldasfl
	jnb	lddoc2
	ret
;
lddoc2:	mov	docend,bx
	mov	word ptr [bx],0ffffh
	ret
;
;
ldasfl:	call	fopen
	jnc	skppre
	ret
skppre:	call	rdfchr
	cmp	al,1ah
	jnz	l0b6c
	push	bx
	call	fclose
	pop	bx
	ret
l0b6c:	cmp	al,' '
	jb	skppre			;ignore ctrl chars
	call	hexbin
	mov	[bx],dx			;value word
	inc	bx
	inc	bx
	test	sdflg,1
	jnz	drdsk1			;if no type byte
	call	rdfchr
	mov	[bx],al			;type byte
	inc	bx
	call	rdfchr			;eat delim space
drdsk1:	push	bx			;save locn for count
	inc	bx
	mov	ch,0
lpasld:	call	rdfchr
	cmp	al,9
	jz	ldassp
	cmp	al,cr			;found delim
	jz	ldassp
	mov	[bx],al
	inc	bx
	inc	ch			;char count
	jmp	lpasld
;
ldassp:	pop	si
	xchg	bx,si
	push	si
	mov	[bx],ch			;store byte count
	pop	bx
	jmp	skppre			;for another
;
hexbin:	mov	dx,0
l0ba3:	cmp	al,' '			;20h
	jnz	l0ba8
	ret
;
l0ba8:	cmp	al,1ah
	jnz	l0baf
	jmp	l0d20
;
l0baf:	cmp	al,'9'+1
	jb	l0bb5
	sub	al,7
l0bb5:	sub	al,'0'			;30h
	xchg	bx,dx
	add	bx,bx
	add	bx,bx
	add	bx,bx
	add	bx,bx
	add	al,bl
	mov	bl,al
	xchg	bx,dx
	call	rdfchr
	cmp	al,1ah
	jnz	l0ba3
	jmp	l0d20
;
erstbl:	mov	bx,offset cstbl
	mov	nrsegs,0
	mov	ch,8
etlp1:	mov	cl,5
	mov	ax,'  '
etlp2:	mov	[bx],ax
	xor	ax,ax
	inc	bx
	inc	bx
	dec	cl
	jnz	etlp2
	inc	bx
	inc	bx
	dec	ch
	jnz	etlp1
	ret
;
;
;
cmsave:	call	gfnam
	mov	al,wrtflg
	or	al,al
	jz	savok
	jmp	rrqerr
;
savok:	mov	bx,offset fcb+9
	mov	dx,offset litall
	mov	cl,3
	call	cmpstr
	jz	allsav
	jmp	ntsall
;
allsav:	mov	dx,docend
	mov	bx,doctbl
	cmp	bx,dx
	jz	nosdoc
	mov	bx,offset litdoc
	call	chgtyp
	call	prtstr
	db	cr,lf,'Saving .DOC file..',cr,lf,0
	call	savdoc
nosdoc:	mov	dx,symtp
	mov	bx,offset symbas
	cmp	bx,dx
	jz	nossym
	mov	bx,offset litsym
	call	chgtyp
	call	prtstr
	db	cr,lf,'Saving .SMB file..',cr,lf,0
	call	symsav
nossym:	mov	dx,ctltop
	mov	bx,offset ctlbas
	cmp	bx,dx
	jnz	havctl
	jmp	nxcmd
havctl:	mov	bx,offset litctl
	call	chgtyp
	call	prtstr
	db	cr,lf,'Saving .CTL file..',cr,lf,0
	jmp	savctl
;
ntsall:	mov	bx,offset fcb+9
	mov	dx,offset litsym
	mov	cl,3
	call	cmpstr
	jnz	ntssym
	call	symsav
	jmp	nxcmd
;
ntssym:	mov	bx,offset fcb+9
	mov	dx,offset litctl
	mov	cl,3
	call	cmpstr
	jnz	ntsctl
	jmp	svctl0
;
ntsctl:	mov	bx,offset fcb+9
	mov	dx,offset litdoc
	mov	cl,3
	call	cmpstr
	jnz	ntsdoc
	call	savdoc
	jmp	nxcmd
;
symsav:	mov	bx,offset symbas
	mov	sdflg,0			;symbol mode, not .doc
l0bf4:	call	creatf
l0bf7:	mov	dx,[bx]			;address value
	inc	bx
	test	sdflg,1
	jnz	sdskp1			;if .doc, no type byte
	inc	bx
	mov	ah,[bx]			;symbol type byte
sdskp1:	inc	bx
	mov	al,[bx]	;string length
	inc	bx
	mov	ch,al
	or	al,al
	jz	oufend	;end of table found
	push	ax			;protect type byte
	call	outadr
	mov	al,' '	;20h
	call	wtfchr
	pop	ax
	test	sdflg,1
	jnz	l0c0c			;if .doc mode
	mov	al,ah
	or	al,'@'			;make type printable
	call	wtfchr
	mov	al,' '
	call	wtfchr
l0c0c:	mov	al,[bx]
	call	wtfchr			;output string char
	inc	bx
	dec	ch
	jnz	l0c0c
	mov	al,cr
	call	wtfchr			;end of line
	mov	al,lf
	call	wtfchr
	jmp	l0bf7
;
oufend:	mov	al,1ah
	call	wtfchr			;end of file
	call	flushf
	ret
;
ntsdoc:	mov	bx,offset fcb+9
	mov	dx,offset lita86
	mov	cl,3
	call	cmpstr
	jz	sava86
	call	cmerr
;
outadr:	mov	al,dh
	call	hexl
	call	wtfchr
	mov	al,dh
	call	hexr
	call	wtfchr
	mov	al,dl
	call	hexl
	call	wtfchr
	mov	al,dl
	call	hexr
	jmp	wtfchr
;
sava86:	mov	al,1
	mov	wrtflg,al
	xor	al,al
	mov	wfiflg,al
	call	creatf
	call	prtstr
	db	'++WRITING .ASM ENABLED',cr,lf
	db	'USE Z COMMAND OR E CONTROL TO CLOSE FILE++',cr,lf,0
	jmp	nxcmd
;
savdoc:	call	l1041
	mov	bx,docend
	mov	sdflg,1
	inc	bx
	inc	bx
	inc	bx
	mov	byte ptr [bx],0
	mov	bx,doctbl
	jmp	l0bf4
;
rrqerr:	call	prtstr
	db	'++NO FILE ACCESSES PERMITTED '
	db	'UNTIL .ASM CLOSED'
	db	cr,lf,0
	jmp	nxcmd
;
l0d20:	call	prtstr
	db	'++UNEXPECTED EOF'
	db	cr,lf,0
	jmp	nxcmd
;
;
;
;	control table structure as of 12/25/84
;	4 byte entries, 1 byte segment char,
;	2 byte binary address, 1 byte mode char
;	table terminated by 0ffffh in address bytes
;
cmctl:	call	sgreqs
	mov	bx,offset cmdbuf+3
	mov	al,[bx]
	cmp	al,cr
	jnz	l0d45			;have more info
	jmp	clist0			;just list them all
;
l0d45:	call	gtval
	cmp	al,cr
	jnz	l0d4f			;more than one item
	jmp	l0e65			;partial list
;
l0d4f:	call	delim
l0d5a:	inc	bx
	mov	al,[bx]			;letter to use comes next
	call	entrc4			;make a manual entry
	jmp	nxcmd
;
enterc:	push	bx			;make entry from 'A' function
	push	dx			;pcntr to locate
	push	ax			;mode char in al
	call	ctlook			;search ctl table
	pushf
	dec	bx			;back to prev mode char
	popf				;flags restored
	jb	entrc2			;if table end or past right addr
	add	bx,4			;pnt to curr mode char
entrc2:	pop	ax			;char wanted
	pop	dx			;and pcntr value
	cmp	al,[bx]			;cmpar to current entry
	pop	bx			;stack in order
	jnz	entrc4			;is a needed entry
	ret			;nothing to do
;
entrc4:	mov	typndx,al	;save ctrl char
	call	ctlook		;find place for it
	jnb	l0d84		;matches an existing entry
	jmp	entrc5		;go make a new entry
;
l0d84:	mov	al,typndx	;recover the char
	call	cltrck		;test all legal values
	cmp	al,'K'
	jz	l0dba		;want kill
	jmp	l0e34		;modify existing entry
l0dba:	mov	ax,1[bx]	;addr field of rec
	and	al,ah
	inc	al
	jz	l0bf5		;if at table end
	mov	ch,4		;record size
l0dc6:	mov	al,4[bx]		;move from higher rec
	mov	[bx],al		;down to lower rec
	inc	bx
	dec	ch		;until record moved
	jnz	l0dc6
	jmp	l0dba		;repeat for rest of recs
;
cltrck:	cmp	al,'K'
	jz	cltrrt
ctlck2:	cmp	al,'E'
	jz	cltrrt
	cmp	al,'B'
	jz	cltrrt
	cmp	al,'H'
	jz	cltrrt
	cmp	al,'W'
	jz	cltrrt
	cmp	al,'I'
	jz	cltrrt
	cmp	al,'S'
	jz	cltrrt
	call	cmerr
;
cltrrt:	ret
;
l0bf5:	sub	bx,4		;base of last valid entry
	jmp	nodoct
;
entrc5:	mov	al,typndx	; want to add a record
	call	ctlck2		;test for legal to store
	push	dx		; addr val to store
	push	bx		; where to put new record
	mov	bx,offset ctlbas ;first field table end
entrc7:	mov	ax,1[bx]	; addr value this entry
	add	bx,4		; to start next rcrd
	and	al,ah		;combine bytes
	inc	al		;test for end flag
	jnz	entrc7		;not at end, srch more
	mov	dx,bx		;copy it
	add	dx,4		;space for new record
	pop	cx		;table insert location
entrc8:	dec	bx
	dec	dx
	mov	al,[bx]		;old entry byte
	xchg	bx,dx
	mov	[bx],al		; to new place higher
	xchg	bx,dx
	cmp	dx,cx		;at insert location yet?
	jnz	entrc8		; till there
	mov	bx,cx		;restore tbl pntr
	pop	dx		; pcntr value to place
	mov	ch,segsho	;segment char
	mov	[bx],ch
	mov	1[bx],dx	;store address value
	mov	al,typndx
	mov	3[bx],al	;store mode letter
	add	bx,4
	ret
;
l0e34:	mov	ah,segsho	;segment char
	mov	[bx],ah		;groups entry
	mov	3[bx],al	;modify existing entry
	ret
;
ctlook:	mov	bx,offset ctlbas ;table start
	mov	ch,segsho
ctlk2:	mov	ax,1[bx]	;addr value
	and	al,ah		;addr hi byte
	inc	al		;test for ffff
	stc			;to show end of tbl
	jnz	l0e4s		;wasnt the end flag
	ret
;
l0e4s:	cmp	ch,[bx]
	jz	l0e48		; in right segment
l0e5c:	jnb	ctlk4		;still too low in tbl
	ret			;too far, stop
;
l0e48:	cmp	dx,1[bx]
	jnz	l0e5c
	ret			;found exact match
;
ctlk4:	add	bx,4		;step an entry worth
	jmp	short ctlk2		;try another entry
;
;
l0e65:	call	iecnt
	call	ctlook		;find starting entry
	jmp	clist
;
clist0:	call	iecnt
	mov	bx,offset ctlbas ;start with first
clist:	call	keychk		;test for user break
	mov	dx,1[bx] ;addr from table entry
	add	bx,3
	mov	al,dh
	and	al,dl
	inc	al
	jnz	clist2		;not at table end
	call	crlf
	jmp	nodoct
;
clist2:	mov	al,-3[bx]
	cmp	al,segsho
	jnz	skclis		;ignore this one
	push	dx
	push	bx
	call	symluk		;symbol at this address?
	jb	l0e99		;no
	call	iecnt		;bump line count
	call	crlf		;and fresh start
l0e87:	mov	al,[bx]		;ctl mode char
	call	typech		;put out symb char
	inc	bx
	dec	ch		;till done
	jnz	l0e87
	mov	al,':'		;delimit it
	call	typech
	call	crlf
l0e99:	pop	bx
	pop	dx
	call	prspc
	call	prspc
	xchg	bx,dx
	call	prword		;output ctl tbl value
	mov	al,'='	;2ch
	call	typech		;delimiter
	mov	al,' '
	call	typech		;and space
	xchg	bx,dx
	mov	al,[bx]
	call	typech		;char from table
	call	prspc
	call	prspc
	call	spcrlf
skclis:	inc	bx
	jmp	clist
;
savctl:	call	svctl0
	jmp	nxcmd
;
svctl0:	call	creatf		;make a new file
	mov	bx,offset ctlbas ;table start
l0ebf:	mov	dx,1[bx]	;address value
	mov	al,dh
	and	al,dl
	inc	al
	jz	l0ee6		;if table end flag ffff
	mov	al,[bx]		;seg char
	call	wtfchr
	call	outadr
	mov	al,','	;2ch
	call	wtfchr
	mov	al,3[bx]
	call	wtfchr
	mov	al,cr
	call	wtfchr
	mov	al,lf
	call	wtfchr
	add	bx,4
	jmp	l0ebf
;
l0ee6:	mov	al,1ah
	call	wtfchr
	call	flushf
	jmp	nxcmd
;
lodctl:	call	fopen
	jnb	ctlfnd		;have one
	ret
ctlfnd:	mov	bx,offset ctlbas
l0ef7:	call	rdfchr
	cmp	al,1ah
	jz	l0f30		;if eof
	cmp	al,' '+1
	jb	l0ef7		;eat space and ctrl chars
	mov	[bx],al		;segment char
	call	rdfchr
	mov	dx,0		;clear addr accum
l0efd:	cmp	al,1ah
	jz	l0f30		;if eof
	cmp	al,','	;2ch
	jz	l0f23		;if delim
	cmp	al,'9'+1
	jb	l0f0b		;if can be dec digit
	sub	al,7		;alpha to hex
l0f0b:	sub	al,'0'	;30h	;to bin
	add	dx,dx
	add	dx,dx
	add	dx,dx
	add	dx,dx
	add	dl,al
	call	rdfchr		;whats next
	jmp	l0efd
;
l0f23:	mov	1[bx],dx
	call	rdfchr
	mov	3[bx],al
	add	bx,4
	jmp	l0ef7
;
l0f30:	mov	word ptr 1[bx],0ffffh
	add	bx,4
	call	fclose
	ret
;
;
;
;	comment table structure, variable lgth records
;	2 byte address, 1 byte string count, n byte string
;	table terminated by 0ffffh in address field
;	no table exists if doctbl = 0
;	if char 1 = ; comment appended to instruction
;	if char 1 = * comment replaces instruction
;	else comment on separate line before instruction
;
cmcmnt:	call	l1041
	call	sgreqs
	mov	bx,offset cmdbuf+3
	mov	al,byte ptr [bx]
	cmp	al,cr
	jnz	cmnt0
	jmp	l0fd4
;
cmnt0:	cmp	al,'0'
	jnz	cmnt1
	inc	bx
	mov	al,[bx]
	sub	al,'F'
	jz	cmnt2
	cmp	al,'N'-'F'
	jz	cmnt2
	call	cmerr
;
cmnt2:	mov	xcsw,al
	jmp	nxcmd
;
cmnt1:	call	gtval
	inc	bx
	cmp	al,cr
	jnz	l0f52
	jmp	l0fce
;
l0f52:	call	delim
l0f5d:	push	bx
	call	comchk
	jb	l0f71
	call	l100b
	pop	bx
	push	bx
	mov	al,[bx]
	cmp	al,cr
	jnz	l0f71
	jmp	nxcmd
;
l0f71:	mov	bx,docend
	mov	[bx],dx
	inc	bx
	inc	bx
	pop	dx
	mov	ch,0
	push	bx
l0f7d:	inc	bx
	xchg	bx,dx
	mov	al,[bx]
	xchg	bx,dx
	mov	[bx],al
	inc	dx
	inc	ch
	xchg	bx,dx
	mov	al,[bx]
	xchg	bx,dx
	cmp	al,cr
	jnz	l0f7d
	inc	bx
	mov	docend,bx
	mov	word ptr [bx],0ffffh
	pop	bx
	mov	[bx],ch
	jmp	nxcmd
;
comchk:	mov	bx,doctbl
l0fa6:	mov	al,[bx]
	inc	bx
	and	al,[bx]
	dec	bx
	inc	al
	stc
	jnz	l0fb2
	ret
;
l0fb2:	inc	bx
	mov	al,dh
	cmp	al,[bx]
	pushf
	dec	bx
	popf
	jnz	l0fc3
	mov	al,dl
	cmp	al,[bx]
	jnz	l0fc3
	ret
;
l0fc3:	inc	bx
	inc	bx
	mov	al,[bx]
	call	addfn
	inc	bx
	jmp	l0fa6
;
l0fce:	call	comchk
	jmp	l0fd8
;
l0fd4:	mov	bx,doctbl
l0fd8:	call	keychk
	mov	dl,[bx]
	inc	bx
	mov	dh,[bx]
	inc	bx
	mov	al,dh
	and	al,dl
	inc	al
	jnz	l0fec
	jmp	nxcmd
;
l0fec:	xchg	bx,dx
	call	prword
	xchg	bx,dx
	mov	al,';'	;3bh
	call	typech
	mov	ch,[bx]
l0ffa:	inc	bx
	mov	al,[bx]
	call	typech
	dec	ch
	jnz	l0ffa
	call	crlf
	inc	bx
	jmp	l0fd8
;
l100b:	mov	al,[bx]
	inc	bx
	and	al,[bx]
	inc	al
	jnz	l1015
	ret
;
l1015:	dec	bx
	push	dx
	mov	dx,bx
	inc	bx
	inc	bx
	mov	al,[bx]
	call	addfn
	inc	bx
	mov	ch,0
l1023:	mov	al,[bx]
	xchg	bx,dx
	mov	[bx],al
	xchg	bx,dx
	inc	bx
	inc	dx
	mov	cl,al
	and	al,ch
	inc	al
	mov	ch,cl
	jnz	l1023
	xchg	bx,dx
	dec	bx
	dec	bx
	mov	docend,bx
	pop	dx
	ret
;
l1041:	mov	bx,doctbl
	mov	al,bh
	or	al,bl
	jz	l104c
	ret
;
l104c:	call	prtstr
	db	'++COMMAND IGNORED++',cr,lf
	db	'++ISSUE ','UNNNN',' TO TELL '
	db	'RESOURCE TO USE ADDRESS NNNN',cr,lf
	db	'AS THE START OF THE COMMENTS TABLE',cr,lf,0
	jmp	nxcmd
;
;
;
cmusec:	mov	bx,offset cmdbuf+3
	mov	al,[bx]
	cmp	al,cr
	jnz	l10ce
	call	cmerr
;
l10ce:	cmp	al,'.'	;2eh
	jnz	ustok
	call	cmerr
;
ustok:	call	gtval
	push	dx
	mov	bx,hiload
	mov	dx,curofs
	add	bx,dx
	inc	bh
	mov	dx,bx
	pop	bx
	cmp	bx,dx
	jb	l10ef
	call	uaset
	jmp	nxcmd
;
uaset:	mov	doctbl,bx
	mov	docend,bx
	mov	word ptr [bx],0ffffh
	jmp	nxcmd
;
l10ef:	call	prtstr
	db	'++NO!! <=',0
	mov	bx,offset symbas
	call	prword
	call	prtstr
	db	'!',cr,lf,0
	jmp	nxcmd
;
hsym:	push	dx
	push	bx
	mov	wfiflg,1
	mov	bx,pcntr
	xchg	bx,dx
	call	symluk
	jb	l1152		;no symbol/label here
	mov	cl,ch
	push	bx
l111c:	mov	al,[bx]
	cmp	al,'+'	;2bh
	jz	l1151
	cmp	al,'-'	;2dh
	jz	l1151
	inc	bx
	dec	cl
	jnz	l111c
	pop	bx
	call	pstrg
	mov	al,symtyp
	and	al,0fh
	cmp	al,0ch
	jnz	l1152 
	mov	al,':'	;3ah
	call	typech
	mov	al,trmflg
	or	al,al
	jnz	l1152
	call	tabc
	call	tabc
	call	semic
	mov	bx,pcntr
	call	prword
	call	crlf
	jmp	l1152
;
l1151:	pop	bx
l1152:	mov	wfiflg,0
	call	prspc
	call	prspc
	mov	bx,pcntr
	call	prword
	mov	wfiflg,1
	call	tabc
	pop	bx
	pop	dx
	ret
;

code	ends
	end

