;ADSM1.SR2, source code for ADSM.200/.100 Part 2
;James Yi 73327,1653 -- 07/27/88
;Modified by Mike Audleman 73577,3041 -- 03/17/90
;	Added CLS Command
;	Added LFILES x Command (M200 & M100 w/o DVI do FILES)
;	Added DVI screen compatibility

begin	mvi	a,12
	call	wrlcd
	mvi	a,1
	call	maxfil
	call	setmax
	lxi	h,errtn
	shld	errtrp
	lxi	h,Fnk
	CALL	DefFnk
	lhld	varspc
k42	mov	a,m
	ora	a
	jz	rcsmb
	mvi	c,3
	sub	c
	mov	b,a
k41	inx	h
	mov	a,m
	call	tst2+1
	jnc	mntr
	dcr	b
	jnz	k41
	dad	b
	jmp	k42

jot	push	d
	call	openfl
	pop	d
	call	wrln+3

clob	mvi	a,$1a
	call	wrbyt

	if	m,2
;close option bank file
	lhld	num0
	lxi	b,lcd
	dsub	b
	mov	a,l
	cnz	svlo
	endif

reent	call	bell
	call	uptdir
mntr	call	close
	call	restak
	lhld	varend
rcsmb	call	updvpt
	lxi	h,ifef
	mvi	b,6
	call	zerob
	dcr	a
	mvi	b,4
	call	zerob+1
	lxi	b,mntr
	push	b
	lhld	adrptr
	call	putadt
	call	set
	mvi	a,$FF
	call	mlbl
	mvi	m,':'
	call	put0+1
	call	crlfc
	lxi	h,botrow
	call	setcur
	call	prnbfr
	CALL	InpN
	RST	2
	xchg
	JZ	CR
	sui	'+'
	jz	reljmp
	dcr	a
	jz	list
	dcr	a
	jz	reljmp
	lxi	h,flnmc
	inx	d
	sui	15
	jz	view
	dcr	a
	xchg
	jz	storg
	xchg
	dcr	a
	jz	jot
	CALL	AsmLin
	lhld	fp1
	jmp	updadp

reljmp	call	cnvnum
	mov	b,h
	mov	c,l
	call	incptr+6
	jmp	updadp

List	xchg
	call	getlen
	mvi	d,lcdsiz-1
k5	push	d
	call	prladv
	call	breakp
	pop	d
	dcr	d
	jnz	k5
	dcr	e
	jnz	list+3
	ret

gettrc	ani	15
	sta	trptr
	mov	l,a
	mvi	h,0
	dad	h
	lxi	d,trace
	dad	d
	xchg
	lhlx
	ret

prladv	call	prndsm
	call	incptr
putadt	lda	trptr
	push	h
	call	gettrc
	pop	b
	dsub	b
	push	b
	jz	k24
	inr	a
	call	gettrc
k24	pop	h
	shlx
updadp	shld	adrptr
	ret

cr	lxi	h,botrow-1
	call	setcur
	lda	pkgff
	ani	3
	jz	prladv
	rar
	lda	trptr
	inr	a
	jnc	stepad
	sui	2
stepad	call	gettrc
	shld	adrptr

Prndsm	lhld	adrptr
	call	set
	lxi	b,$ffff
	CALL	DsmLin
Prnbfr	lxi	h,Bufr
printc	call	crlfc
	jmp	print

view	inr	a
	call	openfl+2
vwchr	call	rdbyt
	cpi	26
	jz	reent
	call	wrlcd
	call	breakp
	jmp	vwchr

Asmble	LXI	H,soprmt
	CALL	orgfil
	lxi	h,obprmt+1
	lxi	d,flnmb
	call	secfil
	LXI	H,Wkspc
	shld	top
	shld	exe
	CALL	Inzlbl
	STA	Pass

Asmlp	lxi	h,ifef
	mvi	b,4
	call	zerob
	inr	a
	mov	m,a
	lxi	h,flnma
	call	Openfl+2
	lhld	top
	shld	mp1
;Load a line from source
Load	call	Breakp
	LXI	D,Bufr
k2	CALL	Rdln
	STAX	D
	INX	D
	JNZ	k2
	Call	AsmLin
	LDA	Eof
	ora	a
	JnZ	Load

	lxi	h,Pass
	cmp	m
	jnz	reent
	INR	m
	mov	d,a
	mov	e,a
	call	close
	lhld	top
	mov	b,h
	mov	c,l
	lhld	mp1
	dsub	b
	shld	len
	call	prparm
	lxi	h,flnmb-1
	rst	2
	jc	reent
	call	fmtfnm
	call	FindCO
	cnz	Kill
	call	uptdir
	call	SaveCO
	call	FindCO
	lxi	h,6
	dad	d
	shld	fp0
	shld	fp1
	JMP	Asmlp

orgfil	mvi	a,12
	rst	4
	call	files
	lxi	d,flnma
secfil	push	d
	call	inpfnm
	pop	d
storg	mvi	b,15
	jmp	mvhbi

inpfnm	call	printc
	call	inpa
	rst	2
	rnz
	jmp	mntr

fmtfnm
	if	m,2
	mvi	a,$ff
	sta	bnk1
	push	h
	call	caps-1
	cpi	'R'
	jnz	k1
	rst	2
	sui	49
	cpi	3
	jnc	k1
	mov	c,a
	inx	h
	mov	a,m
	cpi	':'
	jnz	k1
	mov	a,c
	rlc
	rlc
	sta	bnk1
	inx	h
	xthl
k1	pop	h
	endif

getfil	call	getlen
	jmp	getfnm

Openfl	mvi	a,2
	push	psw
	mvi	a,1
	call	closei
	call	fmtfnm
	jnz	devok
	mvi	d,$f8
devok	pop	psw
	mov	e,a
	dcr	a
	jz	input
	mov	a,d
	cpi	$f9
	jnc	input
	mvi	e,8
input
	if	m,2
inzlp	lxi	h,lcd
	shld	num0
	db	62
bnk1	db	0
	ora	a
	jp	obfl
	endif

	lxi	h,null
	mvi	a,1
	jmp	open

	if	m,2
;open file in other bank
obfl	push	d
	di
	call	setfr
	in	$d8
	ani	12
	out	$90
	push	psw
	lda	bnk1
	out	$91
	push	psw
	lxi	h,flnm
	mov	d,h
	mov	e,l
	lxi	b,6
	call	datfr
	lxi	d,obcall
	lxi	h,lcd+256
	call	mvdbi
	mvi	b,2
	dsub
	call	endtfr
	pop	psw
	pop	h
	pop	b
	call	lcd+256
	ei
	jc	omerr
	rnz
	jmp	fferr

obcall	out	$d8
	dmov	d,sp+0
	cmp	h
	mov	a,h
	jz	sameb
	lhld	stkval
	sphl
sameb	push	d
	push	psw
	call	obrtn+offset
	pop	h
	mov	a,h
	pop	h
	out	$d8
	sphl
	xchg
updop	shld	xp1
	ret

offset	equ	-obcall+lcd+256

obrtn	dcr	c
	jnz	obsv+offset
	call	uptdir
	jmp	finddo
obsv	jp	obout+offset
	db	33
xp1	dw	0
	db	1
dlen	dw	0
	call	insert
	rc
	lxi	d,lcd
	xchg
	call	mvhci
	ora	d
	ret

obout	lhld	frespc
	desp	0
	dcr	d
	rst	3
	cmc
	rc
	xra	a
	sta	flnm+6
	lxi	h,flnm
	call	opendo
	call	geteof
	xchg
	ora	d
	ret
	endif


Rdln	call	RdByt
	cpi	10
	jz	Rdln
	sui	13
	rz
	adi	13
	cpi	26
	rnz
End	xra	a
	sta	eof
	ret

	if	m,2
;Get one byte from source file
RdByt	lda	bnk1
	ora	a
	jm	readio
	lhld	xp1
	MOV	B,A
	di
	push	d
	CALL	PkBnk+1
	ei
	MOV	A,D
	pop	d
	inx	h
	jmp	updop
	endif


;Assemble one line
AsmLin	lxi	h,opcd
	shld	comove
	call	asmins
Stout	lda	oplen
	mov	c,a
	mvi	b,0
	inr	a
	jnz	itn
	lhld	num0
	mov	b,h
	mov	c,l
itn	LDA	Pass
	ora	A
	JZ	IncPtr+6
	MOV	A,b
	ORA	c
	rz
	call	incptr+6
	dsub
	xchg
	lhld	comove
	lda	oplen
	inr	a
	jnz	mvhbci
	xchg
	jmp	zerobc

incptr	lda	oplen
	mov	c,a
	mvi	b,0
	lxi	d,mp1
	lhlx
	dad	b
	shlx
	inx	d
	inx	d
	lhlx
	dad	b
	shlx
	ret


asmins	LXI	D,Bufr
	XRA	A
	STA	OpLen
	lda	ifef
	ora	a
	jz	noif
	call	sep

	cpi	'I'
	jnz	findef
	inx	d
	ldax	d
	ani	$df
	cpi	'F'
	jz	incif
	dcx	d
findef	lxi	h,eistr
	mvi	c,5
cmpe	ldax	d
	ani	$df	;caps
	cmp	m
	rnz
	inx	d
	inx	h
	dcr	c
	jnz	cmpe
endif	lxi	h,ifcnt
	xra	a
	cmp	m
	jz	nferr
	dcr	m
	rnz
	dcx	h
	mov	m,a
	ret

noif	CALL	Tst1
	RM
	JC	LA
	CALL	Tst2
	JNC	L7
	lda	pass
	ora	a
	jz	dderr
	CALL	Cnvnum
	call	set
	JMP	L8

LA	PUSH	D
	CALL	Sep
	CPI	'E'
	JNZ	L6
	INX	D
	ldax	d
	ani	$df
	CPI	'Q'
	JZ	defequ

L6	LHLD	mp1
	POP	D
	CALL	DefLbl
L7	CALL	Sep
L8	RM

alpopc	LXI	H,InDat
LE	MOV	A,M
	ORA	A
	JZ	snerr
	PUSH	D
	CPI	32
	JNZ	LB
	INX	H
	MOV	C,M
	INX	H
	MOV	B,M
	INX	H
LB	LDAX	D
	CALL	Caps
	CMP	M
	INX	H
	INX	D
	JZ	LB
	DCX	H
	CALL	tst2+1
	JC	LC
	MOV	A,M
	CPI	5
	JC	Lf
LC	MOV	A,M
	INX	H
	CPI	5
	JNC	LC
	INX	H
	MOV	A,M
	CPI	$20
	POP	d
	JC	LD
	CPI	$60
	JC	LE
LD	INX	H
	JMP	LE

LF	POP	D
	PUSH	B
	INX	H
	MOV	C,M
	INX	H
	MOV	B,M
	MOV	H,A
	MVI	L,0
Sep	CALL	Tst1
	RM
	JZ	L04
	INX	D
	JMP	Sep
L04	INX	D
	CALL	Tst1
	JZ	L04
	RET

Com	lda	pass
	ora	a
	mov	a,h
	jnz	ok
	cpi	3
	jnc	iderr
ok	rar
	PUSH	B
	JC	Cnvnum
	RET


db	call	read
	dsub
	shld	comove
	mov	a,c
setopl	sta	oplen
	ret

ds	mvi	a,$ff
	jmp	setopl

DW	shld	opcd
	mvi	a,2
	jmp	setopl

DM	xchg
	shld	comove
	CALL	GetLen
	mov	c,e
	jmp	setopl-1

ORG	shld	mp1
	shld	top
	push	h
	lhld	fp0
	shld	fp1
	lxi	h,ocnt
	mov	a,m
	ora	a
	jnz	bserr
	inr	m
	pop	h

ent	shld	exe
	ret

set	shld	mp1
	jmp	set2

Dmov	CALL	Sep
	PUSH	PSW
	CALL	NxMk
	inx	d
	POP	PSW
	CPI	'H'
	JZ	opr+3
	MVI	C,$38
	JMP	opr+3

RST	SUI	48
	ani	7
	push	psw
	call	sep
	cp	inrh
	pop	psw
	Jmp	opr+2

Mov	CALL	RegInc
	PUSH	PSW
	CALL	Sep
	LXI	B,$100
	INR	H
	CALL	RegInc
	POP	B
	ADD	B
	STA	OpCd
	RET

Lxi	PUSH	PSW
	CALL	Sep
	POP	PSW
Xeg	push	h
	lxi	h,dbldat-1
	jmp	L107

Mvi	PUSH	PSW
	CALL	Sep
	POP	PSW

RegInc	PUSH	H
	LXI	H,Regdat-1
L107	inx	h
	cmp	m
	jc	snerr
	inx	h
	jnz	L107
opr	mov	a,m
	pop	h
	mov	l,a
	MOV	A,H
	STA	OpLen
	MOV	A,C
	sub	b
Lj	add	b
	DCR	L
	Jp	Lj
	STA	OpCd
	DCR	H
	RZ
	LDA	Pass
	ora	a
	Rz

CnvNum	CALL	Tst1
	JM	moerr
	lxi	h,0

LL	SHLD	Num1
	CALL	Tst1
	RM
	JZ	Sep

	ldax	d
	cpi	'('
	jz	k86
	cpi	')'
	jnz	k85
	inx	d
	push	h
	lxi	h,prvsgn
	mov	a,m
	mvi	m,0
	lhld	num2
	shld	num1
	pop	h
	jmp	calc

k85	CALL	Tst2+1
	CNC	InxD
k86	PUSH	PSW
	CALL	Val
	POP	PSW
	JC	LL

calc	PUSH	D
	call	on
	SHLD	Num0
	POP	D
	JMP	LL

on	MOV	B,H
	MOV	C,L
	xchg
	LHLD	Num1
	sui	'!'
	jz	eor
	dcr	a
	jz	or
	sui	8
	jz	mult
	DAD	B
	dcr	a
	rz
	DSUB	B
	DSUB	B
	sui	2
	rz
	DAD	B
	dcr	a
	jz	and
	dcr	a
	xchg
	rnz

div	xchg
	MOV	A,B
	ORA	C
	JZ	d0err
	LXI	D,$FFFF
Lv	DSUB	B
	INX	D
	JNC	Lv
	xchg
	ret

mult	xchg
	mov	h,a
	mov	l,a
Lt	MOV	A,B
	ORA	C
	rZ
	DCX	B
	DAD	D
	JMP	Lt

eor	mov	a,l
	xra	e
	mov	l,a
	ret

or	mov	a,l
	ora	e
	mov	l,a
	ret

and	mov	a,l
	ana	e
	mov	l,a
	ret

Val	LXI	H,0
	SHLD	Num0
	CALL	Tst1
	rm
	cpi	'''
	jz	k84
	cpi	'('
	jnz	lw
	inx	d
	pop	h
	pop	psw
	stc
	push	psw
	push	h
	sta	prvsgn
	lhld	num1
	shld	num2
	lxi	h,0
	ret

k84	INX	D
	ldax	d
	Mov	l,a
	SHLD	Num0
	inx	d
	JMP	nxmk

Lw	MOV	H,A
	push	d
	CALL	Nxmk
	DCX	D
	MVI	C,16
	ldax	d
	ani	223
	cpi	'H'
	jz	lx
	MOV	A,H
	CPI	'$'
	JZ	lx+1

	MVI	C,$A
	CALL	Tst1
	JNC	Lx+1
	LXI	H,NumDat
Ly	MOV	C,M
	DCR	C
	JM	eqlbl+1
	INX	H
	CMP	M
	INX	H
	JNZ	Ly
lx	DCX	D
	MOV	A,C
	PUSH	PSW
	sui	16
	jz	hxb
	db	62
	stc
hxb	sta	ck16

	LXI	B,1
Lz	LHLD	Num0
	CALL	Tst2
	DCX	D
	JNC	Done
	cpi	'$'
	jz	done
	sui	48
	cpi	10
	JC	L02
ck16	db	0
	jc	eqlbl
	SUI	7
	cpi	10
	jc	eqlbl
	cpi	16
	jnc	eqlbl
L02	DAD	B
	DCR	A
	JP	L02
	DSUB	B
	SHLD	Num0
	LXI	H,0
	POP	PSW
	PUSH	PSW
L03	DAD	B
	DCR	A
	JNZ	L03
	MOV	B,H
	MOV	C,L
	JMP	Lz

EqLbl	pop	psw
	pop	d
	CALL	GetLbl
	jc	lbld
	lda	ifnum
	mov	h,a
	LDA	Pass
	ora	h
	ldax	d
	Jnz	ulerr
lbld	lhld	num0
	db	1
Done	pop	psw
	pop	d
NxMk	INX	D
	CALL	Tst2
	JC	NxMk
	RET

errtn	push	d
	mov	l,e
	call	close
	mov	a,l
	cpi	52
	jnz	notff
	lxi	h,flnma
	call	printc
notff	Cnz	PrnBfr
	call	Beep
	lxi	h,ermsg
	call	printc
	pop	h
	mvi	h,0
	call	prnhl
	jmp	mntr

defequ	CALL	Sep
	CALL	Cnvnum
	POP	D

DefLbl	PUSH	H
	CALL	Getlbl
	pop	b
	JNC	L06
	LDA	pass
	ORA	A
	JZ	bserr
	mov	m,c
	inx	h
	mov	m,b
	RET
L06	push	d
	push	h
	push	b
	push	d
	dmov	d,sp+0
	dcr	d
	rst	3
	jnc	OMerr
	pop	d
	mvi	c,3
	inx	h
l08	CALL	tst2
	JNC	L07
	mov	m,a
	INX	h
	INX	D
	inr	c
	JMP	L08
L07	pop	d
	mov	m,e
	inx	h
	mov	m,d
	inx	h
	call	updvpt
	pop	h
	mov	m,c
	pop	d
	ret

del	ldax	d
	cpi	'*'
	jz	inzlbl
	call	getlbl
	jz	ulerr
	inx	h
	inx	h
	mov	d,b
	mov	e,c
	mov	b,h
	mov	c,l
	push	h
	lhld	frespc
	dsub	b
	mov	b,h
	mov	c,l
	pop	h
	inx	b
	call	mvhbci
	xchg
	dcx	h
	jmp	updvpt

;Clear label space
InzLbl	LHLD	Varspc
updvpt	shld	varend
	xra	a
	mov	m,a
	inx	h
	shld	frespc
	ret

getlbl	lhld	varspc
cmpnxt	mov	a,m
	ora	a
	rz
	push	d
	push	h
	mov	c,m
	mov	b,c
	inx	h
k40	ldax	d
	call	caps
	cmp	m
	inx	d
	inx	h
	jnz	nextlb
	dcr	b
	mov	a,b
	cpi	4
	jnc	k40
	call	tst2
	jc	nextlb
	xchg
	lhlx
	shld	num0
	xchg
	pop	b
	pop	d
	stc
	ret
nextlb	pop	h
	mvi	b,0
	dad	b
	pop	d
	jmp	cmpnxt

Tst1	LDAX	D
	ORA	A
	JZ	L13
	CPI	';'
	JNZ	L14
L13	ORI	$80
	RET
L14	CPI	9
	RZ
	CPI	','
	RZ
	CPI	' '
	RZ
	cpi	'='
	rz
L15	cpi	'a'
	jc	k80
	cpi	'z'+1
	jnc	k80
	ani	223
k80	CPI	'?'
	cmc
	Jnc	L16
	CPI	'_'+1
L16	INR	A
	DCR	A
	RET

Tst2	LDAX	D
	CALL	L15
	RC
	CPI	'$'
	STC
	RZ
	CPI	'''
	STC
	RZ
	CPI	'0'
	CMC
	RNC
	CPI	'9'+1
	RET

	call	respp
GetMnc	MOV	B,A
	CPI	$76
	JZ	Getopc+1
	ANI	$C7
	CPI	6
	JNZ	L17
GetHIC	CALL	GetOHR
InsC	MVI	M,','
	JMP	Put0+1
L17	CPI	$C7
	JNZ	L18
	CALL	Getopc+1
	MOV	A,B
	RRC
	RRC
	RRC
	ANI	7
	adi	48
	mov	m,a
	inx	h
	lxi	b,rfix-48
	add	c
	mov	c,a
	cc	inrb
	ldax	b
	sta	oplen
	dcr	a
	jz	put0+2
	mvi	m,','
	jmp	put0+1

L18	CPI	5
	JZ	GetOHR
	CPI	4
	JNZ	L19
GetOHR	CALL	Getopc+1
	MOV	A,B
GetHR	RRC
	RRC
	RRC
	JMP	GetLR+1
L19	MOV	A,B
	ANI	$CF
	CPI	$C1
	JZ	L20
	CPI	$C5
	JNZ	L21
L20	CALL	GetOXR
	MVI	M,'P'
	INX	H
	MVI	M,'S'
	INX	H
	MVI	M,'W'
	JMP	Put0+1
L21	CPI	$A
	JZ	L22
	CPI	2
	JNZ	L23
L22	MOV	C,A
	MOV	A,B
	ANI	32
	JNZ	Getopc
	MOV	A,C
	CALL	Getopc+1
	MOV	A,B
	ANI	16
	JMP	GetHR

	if	m,2
	LINK	R2:adsm2
	endif

	if	m,1

SAVECO	CALL	$2089
	CNZ	$1FD9
	CALL	$20E4
	PUSH	H
	LHLD	$FBB0
	PUSH	H
	LHLD	$FAD0
	MOV	A,H
	ORA	L
	JZ	$3F17
	PUSH	H
	LXI	B,6
	DAD	B
	MOV	B,H
	MOV	C,L
	LHLD	$FBB2
	SHLD	$FB99
	CNC	$6B6D
	JC	$3F17
	XCHG
	LXI	H,$FACE
	CALL	$2540
	LHLD	$FACE
	POP	B
	CALL	$6BDB
	POP	H
	SHLD	$FBB0
	POP	H
	MVI	A,$A0
	XCHG
	LHLD	$FB99
	XCHG
	CALL	$2239
	CALL	$2146
	LHLD	$FB8E
	RET

TICK	EQU	7676h
BELL:	DI
	MVI	D,0
S2	MVI	E,$28
S1	DCR	E
	JNZ	S1
	CALL	TICK
	DCR	D
	JNZ	S2
	EI
	RET

InrB	inr	b
	ret

InrA	inr	a
	ret

exit	jmp	menu

Killc0	equ	$1FBF
Kill80	equ	$2017
Kill00	equ	$1FD9

Kill	mov	a,m
	inx	h
	mov	e,m
	inx	h
	mov	d,m
	dcx	h
	dcx	h
	cpi	$c0
	jz	killc0
	cpi	$80
	jz	kill80
	jmp	kill00

	endif

	link	1:adsm1.sr3
