4678 lines
		
	
	
	
		
			54 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			4678 lines
		
	
	
	
		
			54 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| .sect .text
 | |
| ! This program is an EM interpreter for the Z80.
 | |
| ! Register pair bc is used to hold lb.
 | |
| ! Register ix is used to hold the EM program counter.
 | |
| ! The interpreter assumes 16-bit words and 16-bit pointers.
 | |
| 
 | |
| ! #define	CPM1	1
 | |
| 
 | |
| ! Definitions:
 | |
|    zone = 8	! size of subroutine call block (address + old lb)
 | |
|    bdos = 5	! standard entry into I/O-routines
 | |
|    boot = 0
 | |
|    fcb = 0x5c	! file descriptor of EM-1 file (5C hex)
 | |
| 
 | |
|    reset=0
 | |
|    delete=19
 | |
|    makefile=22
 | |
|    close=16
 | |
|    readconsole = 10
 | |
|    writeconsole = 2
 | |
|    open = 15
 | |
|    read = 20
 | |
|    write = 21
 | |
|    setdma = 26
 | |
|    printstring = 9
 | |
|    seqread = 20
 | |
|    randomread = 33
 | |
|    seqwrite = 21
 | |
|    randomwrite = 34
 | |
|    consolein = 1
 | |
|    diconio = 6
 | |
|    RAW=0			!0 for cooked,1 for raw io
 | |
| 
 | |
|    timebuf=0xFFDE
 | |
| 
 | |
|    b_lolp = 176
 | |
|    b_loln = 179
 | |
|    b_lof = 161
 | |
|    b_loi = 168
 | |
|    b_lal = 130
 | |
|    b_lil = 146
 | |
|    b_stlm = 227
 | |
|    b_stf = 214
 | |
|    b_sti = 218
 | |
|    b_inl = 112
 | |
|    b_cal = 63
 | |
|    b_asp = 44
 | |
|    b_zrl = 249
 | |
| 
 | |
|    EARRAY = 0
 | |
|    ERANGE = 1
 | |
|    EILLINS=18
 | |
|    EILLSIZE=19
 | |
|    ECASE=20
 | |
|    EMON=25
 | |
| 
 | |
| !--------------------------- Initialization ---------------------------
 | |
| 
 | |
| 	jp init		! 3 byte instruction.
 | |
| 
 | |
| !------------------------- MAIN DISPATCH ------------------------------
 | |
| !
 | |
| ! must be put in a suitable place in memory to reduce memory usage
 | |
| ! must be put on a page boundary
 | |
| 
 | |
| 
 | |
| .data1 0		! fourth byte
 | |
| dispat = . - 4	! base of dispatch table
 | |
| !	.data2	loc.0
 | |
| !	.data2	loc.1
 | |
| 	.data2	loc.2
 | |
| 	.data2	loc.3
 | |
| 	.data2	loc.4
 | |
| 	.data2	loc.5
 | |
| 	.data2	loc.6
 | |
| 	.data2	loc.7
 | |
| 	.data2	loc.8
 | |
| 	.data2	loc.9
 | |
| 	.data2	loc.10
 | |
| 	.data2	loc.11
 | |
| 	.data2	loc.12
 | |
| 	.data2	loc.13
 | |
| 	.data2	loc.14
 | |
| 	.data2	loc.15
 | |
| 	.data2	loc.16
 | |
| 	.data2	loc.17
 | |
| 	.data2	loc.18
 | |
| 	.data2	loc.19
 | |
| 	.data2	loc.20
 | |
| 	.data2	loc.21
 | |
| 	.data2	loc.22
 | |
| 	.data2	loc.23
 | |
| 	.data2	loc.24
 | |
| 	.data2	loc.25
 | |
| 	.data2	loc.26
 | |
| 	.data2	loc.27
 | |
| 	.data2	loc.28
 | |
| 	.data2	loc.29
 | |
| 	.data2	loc.30
 | |
| 	.data2	loc.31
 | |
| 	.data2	loc.32
 | |
| 	.data2	loc.33
 | |
| 	.data2	aar.2
 | |
| 	.data2	adf.s0
 | |
| 	.data2	adi.2
 | |
| 	.data2	adi.4
 | |
| 	.data2	adp.l
 | |
| 	.data2	adp.1
 | |
| 	.data2	adp.2
 | |
| 	.data2	adp.s0
 | |
| 	.data2	adp.sm1
 | |
| 	.data2	ads.2
 | |
| 	.data2	and.2
 | |
| 	.data2	asp.2
 | |
| 	.data2	asp.4
 | |
| 	.data2	asp.6
 | |
| 	.data2	asp.8
 | |
| 	.data2	asp.10
 | |
| 	.data2	asp.w0
 | |
| 	.data2	beq.l
 | |
| 	.data2	beq.s0
 | |
| 	.data2	bge.s0
 | |
| 	.data2	bgt.s0
 | |
| 	.data2	ble.s0
 | |
| 	.data2	blm.s0
 | |
| 	.data2	blt.s0
 | |
| 	.data2	bne.s0
 | |
| 	.data2	bra.l
 | |
| 	.data2	bra.sm1
 | |
| 	.data2	bra.sm2
 | |
| 	.data2	bra.s0
 | |
| 	.data2	bra.s1
 | |
| 	.data2	cal.1
 | |
| 	.data2	cal.2
 | |
| 	.data2	cal.3
 | |
| 	.data2	cal.4
 | |
| 	.data2	cal.5
 | |
| 	.data2	cal.6
 | |
| 	.data2	cal.7
 | |
| 	.data2	cal.8
 | |
| 	.data2	cal.9
 | |
| 	.data2	cal.10
 | |
| 	.data2	cal.11
 | |
| 	.data2	cal.12
 | |
| 	.data2	cal.13
 | |
| 	.data2	cal.14
 | |
| 	.data2	cal.15
 | |
| 	.data2	cal.16
 | |
| 	.data2	cal.17
 | |
| 	.data2	cal.18
 | |
| 	.data2	cal.19
 | |
| 	.data2	cal.20
 | |
| 	.data2	cal.21
 | |
| 	.data2	cal.22
 | |
| 	.data2	cal.23
 | |
| 	.data2	cal.24
 | |
| 	.data2	cal.25
 | |
| 	.data2	cal.26
 | |
| 	.data2	cal.27
 | |
| 	.data2	cal.28
 | |
| 	.data2	cal.s0
 | |
| 	.data2	cff.z
 | |
| 	.data2	cif.z
 | |
| 	.data2	cii.z
 | |
| 	.data2	cmf.s0
 | |
| 	.data2	cmi.2
 | |
| 	.data2	cmi.4
 | |
| 	.data2	cmp.z
 | |
| 	.data2	cms.s0
 | |
| 	.data2	csa.2
 | |
| 	.data2	csb.2
 | |
| 	.data2	dec.z
 | |
| 	.data2	dee.w0
 | |
| 	.data2	del.wm1
 | |
| 	.data2	dup.2
 | |
| 	.data2	dvf.s0
 | |
| 	.data2	dvi.2
 | |
| 	.data2	fil.l
 | |
| 	.data2	inc.z
 | |
| 	.data2	ine.l
 | |
| 	.data2	ine.w0
 | |
| 	.data2	inl.m2
 | |
| 	.data2	inl.m4
 | |
| 	.data2	inl.m6
 | |
| 	.data2	inl.wm1
 | |
| 	.data2	inn.s0
 | |
| 	.data2	ior.2
 | |
| 	.data2	ior.s0
 | |
| 	.data2	lae.l
 | |
| 	.data2	lae.w0
 | |
| 	.data2	lae.w1
 | |
| 	.data2	lae.w2
 | |
| 	.data2	lae.w3
 | |
| 	.data2	lae.w4
 | |
| 	.data2	lae.w5
 | |
| 	.data2	lae.w6
 | |
| 	.data2	lal.p
 | |
| 	.data2	lal.n
 | |
| 	.data2	lal.0
 | |
| 	.data2	lal.m1
 | |
| 	.data2	lal.w0
 | |
| 	.data2	lal.wm1
 | |
| 	.data2	lal.wm2
 | |
| 	.data2	lar.2
 | |
| 	.data2	ldc.0
 | |
| 	.data2	lde.l
 | |
| 	.data2	lde.w0
 | |
| 	.data2	ldl.0
 | |
| 	.data2	ldl.wm1
 | |
| 	.data2	lfr.2
 | |
| 	.data2	lfr.4
 | |
| 	.data2	lfr.s0
 | |
| 	.data2	lil.wm1
 | |
| 	.data2	lil.w0
 | |
| 	.data2	lil.0
 | |
| 	.data2	lil.2
 | |
| 	.data2	lin.l
 | |
| 	.data2	lin.s0
 | |
| 	.data2	lni.z
 | |
| 	.data2	loc.l
 | |
| 	.data2	loc.m1
 | |
| 	.data2	loc.s0
 | |
| 	.data2	loc.sm1
 | |
| 	.data2	loe.l
 | |
| 	.data2	loe.w0
 | |
| 	.data2	loe.w1
 | |
| 	.data2	loe.w2
 | |
| 	.data2	loe.w3
 | |
| 	.data2	loe.w4
 | |
| 	.data2	lof.l
 | |
| 	.data2	lof.2
 | |
| 	.data2	lof.4
 | |
| 	.data2	lof.6
 | |
| 	.data2	lof.8
 | |
| 	.data2	lof.s0
 | |
| 	.data2	loi.l
 | |
| 	.data2	loi.1
 | |
| 	.data2	loi.2
 | |
| 	.data2	loi.4
 | |
| 	.data2	loi.6
 | |
| 	.data2	loi.8
 | |
| 	.data2	loi.s0
 | |
| 	.data2	lol.p
 | |
| 	.data2	lol.n
 | |
| 	.data2	lol.0
 | |
| 	.data2	lol.2
 | |
| 	.data2	lol.4
 | |
| 	.data2	lol.6
 | |
| 	.data2	lol.m2
 | |
| 	.data2	lol.m4
 | |
| 	.data2	lol.m6
 | |
| 	.data2	lol.m8
 | |
| 	.data2	lol.m10
 | |
| 	.data2	lol.m12
 | |
| 	.data2	lol.m14
 | |
| 	.data2	lol.m16
 | |
| 	.data2	lol.w0
 | |
| 	.data2	lol.wm1
 | |
| 	.data2	lxa.1
 | |
| 	.data2	lxl.1
 | |
| 	.data2	lxl.2
 | |
| 	.data2	mlf.s0
 | |
| 	.data2	mli.2
 | |
| 	.data2	mli.4
 | |
| 	.data2	rck.2
 | |
| 	.data2	ret.0
 | |
| 	.data2	ret.2
 | |
| 	.data2	ret.s0
 | |
| 	.data2	rmi.2
 | |
| 	.data2	sar.2
 | |
| 	.data2	sbf.s0
 | |
| 	.data2	sbi.2
 | |
| 	.data2	sbi.4
 | |
| 	.data2	sdl.wm1
 | |
| 	.data2	set.s0
 | |
| 	.data2	sil.wm1
 | |
| 	.data2	sil.w0
 | |
| 	.data2	sli.2
 | |
| 	.data2	ste.l
 | |
| 	.data2	ste.w0
 | |
| 	.data2	ste.w1
 | |
| 	.data2	ste.w2
 | |
| 	.data2	stf.l
 | |
| 	.data2	stf.2
 | |
| 	.data2	stf.4
 | |
| 	.data2	stf.s0
 | |
| 	.data2	sti.1
 | |
| 	.data2	sti.2
 | |
| 	.data2	sti.4
 | |
| 	.data2	sti.6
 | |
| 	.data2	sti.8
 | |
| 	.data2	sti.s0
 | |
| 	.data2	stl.p
 | |
| 	.data2	stl.n
 | |
| 	.data2	stl.p0
 | |
| 	.data2	stl.p2
 | |
| 	.data2	stl.m2
 | |
| 	.data2	stl.m4
 | |
| 	.data2	stl.m6
 | |
| 	.data2	stl.m8
 | |
| 	.data2	stl.m10
 | |
| 	.data2	stl.wm1
 | |
| 	.data2	teq.z
 | |
| 	.data2	tgt.z
 | |
| 	.data2	tlt.z
 | |
| 	.data2	tne.z
 | |
| 	.data2	zeq.l
 | |
| 	.data2	zeq.s0
 | |
| 	.data2	zeq.s1
 | |
| 	.data2	zer.s0
 | |
| 	.data2	zge.s0
 | |
| 	.data2	zgt.s0
 | |
| 	.data2	zle.s0
 | |
| 	.data2	zlt.s0
 | |
| 	.data2	zne.s0
 | |
| 	.data2	zne.sm1
 | |
| 	.data2	zre.l
 | |
| 	.data2	zre.w0
 | |
| 	.data2	zrl.m2
 | |
| 	.data2	zrl.m4
 | |
| 	.data2	zrl.wm1
 | |
| 	.data2	zrl.n
 | |
| 	.data2	loop1
 | |
| 	.data2	loop2
 | |
| 
 | |
| !----------------- END OF MAIN DISPATCH -------------------------------
 | |
| 
 | |
| xxx:
 | |
| 	.data2	loc.0
 | |
| 	.data2	loc.1
 | |
| init:
 | |
| 	ld sp,(bdos+1)	! address of fbase
 | |
| 	ld hl,xxx
 | |
| 	ld de,dispat
 | |
| 	ld bc,4
 | |
| 	ldir
 | |
| 	call uxinit
 | |
| warmstart:
 | |
| 	ld sp,(bdos+1)	! address of fbase
 | |
| 	call makeargv
 | |
| 	ld de,0x80
 | |
| 	ld c,setdma
 | |
| 	call bdos
 | |
| 	ld c,open
 | |
| 	ld de,fcb
 | |
| 	call bdos
 | |
| 	inc a
 | |
| 	jr z,bademfile
 | |
| 	ld c,read
 | |
| 	ld de,fcb
 | |
| 	call bdos
 | |
| 	or a
 | |
| 	jr nz,bademfile	! no file
 | |
| 	ld de,header
 | |
| 	ld hl,0x90	! start of 2nd half of header
 | |
| 	ld bc,10	! we copy only first 5 words
 | |
| 	ldir
 | |
| 	ld de,(ntext)	! size of program text in bytes
 | |
| 	ld hl,0
 | |
| 	sbc hl,de
 | |
| 	add hl,sp
 | |
| 	ld sp,hl	! save space for program
 | |
| 	ld (pb),hl	! set procedure base
 | |
| 	ld a,0xa0
 | |
| 	ld (nextp),a
 | |
| 	ld de,(ntext)
 | |
| 	xor a
 | |
| 	ld h,a
 | |
| 	ld l,a
 | |
| 	sbc hl,de
 | |
| 	ex de,hl
 | |
| 	ld h,a
 | |
| 	ld l,a
 | |
| 	add hl,sp
 | |
| 1:	call getb
 | |
| 	ld (hl),c
 | |
| 	inc hl
 | |
| 	inc e
 | |
| 	jr nz,1b
 | |
| 	inc d
 | |
| 	jr nz,1b
 | |
| 			! now program text has been read,so start read-
 | |
| 	ld iy,0		! ing data descriptors, (nextp) (was hl) is
 | |
| 	ld ix,eb	! pointer into DMA,ix is pointer into global
 | |
| 	! data area,iy is #bytes pushed in last instr (used for repeat)
 | |
| rddata:	ld hl,(ndata)
 | |
| 	ld a,h
 | |
| 	or l
 | |
| 	jr z,prdes	! no data left
 | |
| 	dec hl
 | |
| 	ld (ndata),hl
 | |
| 	call getb	! read 1 byte (here:init type) into register c
 | |
| 	dec c
 | |
| 	jp p,2f
 | |
| 	call getw
 | |
| 	push iy
 | |
| 	pop hl
 | |
| 	ld a,h
 | |
| 	or l
 | |
| 	jr z,5f		! size of block is zero, so no work
 | |
| 	push hl
 | |
| 	push bc
 | |
| 3:	pop hl		! #repeats
 | |
| 	pop bc		! block size
 | |
| 	push bc
 | |
| 	ld a,h
 | |
| 	or l
 | |
| 	jr z,4f		! ready
 | |
| 	dec hl
 | |
| 	push hl
 | |
| 	push ix
 | |
| 	pop hl
 | |
| 	add ix,bc
 | |
| 	dec hl
 | |
| 	ld d,h
 | |
| 	ld e,l
 | |
| 	add hl,bc
 | |
| 	ex de,hl
 | |
| 	lddr
 | |
| 	jr 3b
 | |
| 4:	pop bc
 | |
| 5:	ld iy,0		! now last instruction = repeat = type 0
 | |
| 	jr rddata
 | |
| 2:	ld b,c		! here other types come
 | |
| 	jr nz,2f	! Z-flag was (re-)set when decrementing c
 | |
| 	call getb	! uninitialized words, fetch #words
 | |
| 	sla c
 | |
| 	rl b
 | |
| 	ld iy,0
 | |
| 	add iy,bc
 | |
| 	add ix,bc
 | |
| 4:	jr rddata
 | |
| 2:	call getb	! remaining types, first fetch #bytes/words
 | |
| 	ld a,b
 | |
| 	cp 7
 | |
| 	jr z,rdflt
 | |
| 	jp p,bademfile	! floats are not accepted,nor are illegal types
 | |
| 	ld b,0
 | |
| 	cp 1
 | |
| 	jr z,2f
 | |
| 	cp 5
 | |
| 	jp m,1f
 | |
| 2:	ld iy,0		! initialized bytes, simply copy from EM-1 file
 | |
| 	add iy,bc
 | |
| 	ld b,c		! #bytes
 | |
| 3:
 | |
| 	call getb
 | |
| 	ld (ix),c
 | |
| 	inc ix
 | |
| 	djnz 3b
 | |
| 	jr 4b
 | |
| 1:	cp 2
 | |
| 	jr z,2f
 | |
| 	cp 3
 | |
| 	jr z,3f
 | |
| 	ld hl,(pb)
 | |
| 	jr 4f
 | |
| 3:	ld hl,eb
 | |
| 	jr 4f
 | |
| 2:	ld hl,0
 | |
| 4:	ld (ntext),hl	! ntext is used here to hold base address of
 | |
| 	ld iy,0		! correct type: data,instr or 0 (plain numbers)
 | |
| 	add iy,bc
 | |
| 	add iy,bc
 | |
| 	ld b,c
 | |
| 1:
 | |
| 	push bc
 | |
| 	ex de,hl	! save e into l
 | |
| 	call getw
 | |
| 	ex de,hl
 | |
| 	ld hl,(ntext)
 | |
| 	add hl,bc
 | |
| 	ld (ix),l
 | |
| 	inc ix
 | |
| 	ld (ix),h
 | |
| 	inc ix
 | |
| 	pop bc
 | |
| 	djnz 1b
 | |
| 2:	jr rddata
 | |
| rdflt:
 | |
| 	ld a,c
 | |
| 	cp 4
 | |
| 	jr nz,bademfile
 | |
| 	push ix
 | |
| 	pop hl
 | |
| 1:	call getb
 | |
| 	ld a,c
 | |
| 	ld (hl),a
 | |
| 	inc hl
 | |
| 	or a
 | |
| 	jr nz,1b
 | |
| 	push ix
 | |
| 	pop hl
 | |
| 	call atof
 | |
| 	ld b,4
 | |
| 1:	ld a,(hl)
 | |
| 	ld (ix),a
 | |
| 	inc ix
 | |
| 	inc hl
 | |
| 	djnz 1b
 | |
| 	jr rddata
 | |
| 
 | |
| bademfile:
 | |
| 	ld c,printstring
 | |
| 	ld de,1f
 | |
| 	call bdos
 | |
| 	jp 0
 | |
| 1:	.ascii 'load file error\r\n$'
 | |
| 
 | |
| ! now all data has been read,so on with the procedure descriptors
 | |
| prdes:
 | |
| 	ld (hp),ix	! initialize heap pointer
 | |
| 	ld de,(nproc)
 | |
| 	ld hl,0
 | |
| 	xor a
 | |
| 	sbc hl,de
 | |
| 	add hl,hl
 | |
| 	add hl,hl	! 4 bytes per proc-descriptor
 | |
| 	add hl,sp
 | |
| 	ld sp,hl	! save space for procedure descriptors
 | |
| 	push hl
 | |
| 	pop ix
 | |
| 	ld (pd),hl	! initialize base
 | |
| 	ld hl,(nproc)
 | |
| 1:	ld a,h
 | |
| 	or l
 | |
| 	jr z,2f
 | |
| 	dec hl
 | |
| 	call getb
 | |
| 	ld (ix),c
 | |
| 	inc ix
 | |
| 	call getb
 | |
| 	ld (ix),c
 | |
| 	inc ix
 | |
| 	call getw
 | |
| 	ex de,hl
 | |
| 	ld hl,(pb)
 | |
| 	add hl,bc
 | |
| 	ld (ix),l
 | |
| 	inc ix
 | |
| 	ld (ix),h
 | |
| 	inc ix
 | |
| 	ex de,hl
 | |
| 	jr 1b
 | |
| 2:
 | |
| 	ld de,(entry)	! get ready for start of program
 | |
| 	ld ix,0		! reta, jumping here will stop execution
 | |
| 	push ix
 | |
| 	ld hl,argv
 | |
| 	push hl
 | |
| 	ld hl,(argc)
 | |
| 	push hl
 | |
| 	jr cal		! call EM-1 main program
 | |
| 
 | |
| getw:	call getb
 | |
| 	ld b,c
 | |
| 	call getb
 | |
| 	ld a,b
 | |
| 	ld b,c
 | |
| 	ld c,a
 | |
| 	ret
 | |
| getb:	push hl		! getb reads 1 byte in register c from standard
 | |
| 	push de
 | |
| 	ld a,(nextp)	! DMA buffer and refills if necessary
 | |
| 	or a
 | |
| 	jr nz,1f
 | |
| 	push bc
 | |
| 	ld c,read
 | |
| 	ld de,fcb
 | |
| 	call bdos
 | |
| 	or a
 | |
| 	jr nz,bademfile
 | |
| 	pop bc
 | |
| 	ld a,0x80
 | |
| 1:	ld l,a
 | |
| 	ld h,0
 | |
| 	ld c,(hl)
 | |
| 	inc a
 | |
| 	ld (nextp),a
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	ret
 | |
| 
 | |
| !------------------------- Main loop of the interpreter ---------------
 | |
| 
 | |
| phl:	push hl
 | |
| loop:	ld e,(ix)	! e = opcode byte
 | |
| 	inc ix		! advance EM program counter to next byte
 | |
| 	ld hl,dispat	! hl = address of dispatching table
 | |
| 	xor a
 | |
| 	ld d,a
 | |
| 	add hl,de	! compute address of routine for this opcode
 | |
| 	add hl,de	! hl = address of routine to dispatch to
 | |
| 	ld d,(hl)	! e = low byte of routine address
 | |
| 	inc hl		! hl now points to 2nd byte of routine address
 | |
| 	ld h,(hl)	! h = high byte of routine address
 | |
| 	ld l,d		! hl = address of routine
 | |
| 	ld d,a
 | |
| 	jp (hl)		! go execute the routine
 | |
| 
 | |
| loop1:	ld e,(ix)	! e = opcode byte
 | |
| 	inc ix		! advance EM program counter to next byte
 | |
| 	ld hl,dispat1	! hl = address of dispatching table
 | |
| 	xor a
 | |
| 	ld d,a
 | |
| 	add hl,de	! compute address of routine for this opcode
 | |
| 	add hl,de	! hl = address of routine to dispatch to
 | |
| 	ld d,(hl)	! e = low byte of routine address
 | |
| 	inc hl		! hl now points to 2nd byte of routine address
 | |
| 	ld h,(hl)	! h = high byte of routine address
 | |
| 	ld l,d		! hl = address of routine
 | |
| 	ld d,a
 | |
| 	jp (hl)		! go execute the routine
 | |
| 
 | |
| loop2:	ld e,(ix)	! e = opcode byte
 | |
| 	inc ix		! advance EM program counter to next byte
 | |
| 	ld hl,dispat2	! hl = address of dispatching table
 | |
| 	xor a
 | |
| 	ld d,a
 | |
| 	add hl,de	! compute address of routine for this opcode
 | |
| 	add hl,de	! hl = address of routine to dispatch to
 | |
| 	ld d,(hl)	! e = low byte of routine address
 | |
| 	inc hl		! hl now points to 2nd byte of routine address
 | |
| 	ld h,(hl)	! h = high byte of routine address
 | |
| 	ld l,d		! hl = address of routine
 | |
| 	ld d,a
 | |
| 	jp (hl)		! go execute the routine
 | |
| 
 | |
| ! Note that d and a are both still 0, and the carry bit is cleared.
 | |
| ! The execution routines make heavy use of these properties.
 | |
| ! The reason that the carry bit is cleared is a little subtle, since the
 | |
| ! two instructions add hl,de affect it.  However, since dispat is being
 | |
| ! added twice a number < 256, no carry can occur.
 | |
| 
 | |
| 
 | |
| 
 | |
| !---------------------- Routines to compute addresses of locals -------
 | |
| 
 | |
| ! There are four addressing routines, corresponding to four ways the
 | |
| ! offset can be represented:
 | |
| ! loml: 16-bit offset.  Codes 1-32767 mean offsets -2 to -65534 bytes
 | |
| ! loms:  8-bit offset.  Codes 1-255   mean offsets -2 to   -510 bytes
 | |
| ! lopl: 16-bit offset.  Codes 0-32767 mean offsets  0 to +65534 bytes
 | |
| ! lops:  8-bit offset.  Codes 0-255   mean offsets  0 to   +510 bytes
 | |
| 
 | |
| loml:	ld d,(ix)	! loml is for 16-bit offsets with implied minus
 | |
| 	inc ix
 | |
| 	jr 1f
 | |
| loms:
 | |
| 	dec d
 | |
| 1:	ld e,(ix)	! loms is for 8-bit offsets with implied minus
 | |
| 	inc ix
 | |
| 	ld h,b
 | |
| 	ld l,c		! hl = bc
 | |
| 	add hl,de
 | |
| 	add hl,de	! hl now equals lb - byte offset
 | |
| 	jp (iy)
 | |
| 
 | |
| lopl:	ld d,(ix)	! lopl is for 16-bit offsets >= 0
 | |
| 	inc ix
 | |
| lops:	ld h,d
 | |
| 	ld l,(ix)	! fetch low order byte of offset
 | |
| 	inc ix
 | |
| 	add hl,hl	! convert offset to bytes
 | |
| 	ld de,zone	! to account of return address zone
 | |
| 	add hl,de
 | |
| 	add hl,bc	! hl now equals lb - byte offset
 | |
| 	jp (iy)
 | |
| 
 | |
| 
 | |
| 
 | |
| !---------------------------- LOADS -----------------------------------
 | |
| 
 | |
| ! LOC, LPI
 | |
| loc.l: lpi.l:
 | |
| 	ld d,(ix)	! loc with 16-bit offset
 | |
| 	inc ix
 | |
| loc.s0:	ld e,(ix)	! loc with 8-bit offset
 | |
| 	inc ix
 | |
| loc.0:  loc.1:  loc.2:  loc.3:  loc.4:  loc.5:  loc.6:  loc.7: 
 | |
| loc.8:  loc.9:  loc.10: loc.11: loc.12: loc.13: loc.14: loc.15:
 | |
| loc.16: loc.17: loc.18: loc.19: loc.20: loc.21: loc.22: loc.23:
 | |
| loc.24: loc.25: loc.26: loc.27: loc.28: loc.29: loc.30: loc.31:
 | |
| loc.32: loc.33:
 | |
| 	push de
 | |
| 	jr loop
 | |
| 
 | |
| loc.m1:	ld hl,-1
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| loc.sm1:dec d		! for constants -256...-1
 | |
| 	jr loc.s0
 | |
| 
 | |
| 
 | |
| ! LDC
 | |
| ldc.f:	ld h,(ix)
 | |
| 	inc ix
 | |
| 	ld l,(ix)
 | |
| 	inc ix
 | |
| 	push hl
 | |
| 	ld h,(ix)
 | |
| 	inc ix
 | |
| 	ld l,(ix)
 | |
| 	inc ix
 | |
| 	jr phl
 | |
| ldc.l:	ld h,(ix)
 | |
| 	inc ix
 | |
| 	ld l,(ix)
 | |
| 	inc ix
 | |
| 	ld e,d
 | |
| 	bit 7,h
 | |
| 	jr z,1f
 | |
| 	dec de
 | |
| 1:
 | |
| 	push de
 | |
| 	jr phl
 | |
| 
 | |
| ldc.0:	ld e,d
 | |
| 	push de
 | |
| 	push de
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! LOL
 | |
| 
 | |
| lol.0: lol.1: lol.2: lol.3: lol.4: lol.5: lol.6:
 | |
| 	ld hl,-b_lolp-b_lolp+zone
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
| 	add hl,bc
 | |
| 	jr ipsh
 | |
| 
 | |
| lol.m2: lol.m4: lol.m6: lol.m8: lol.m10: lol.m12: lol.m14: lol.m16:
 | |
| 	ld hl,b_loln+b_loln
 | |
| 	sbc hl,de
 | |
| 	xor a		! clear carry bit
 | |
| 	sbc hl,de
 | |
| 	add hl,bc	! hl = lb - byte offset
 | |
| 
 | |
| ipsh:	ld e,(hl)
 | |
| 	inc hl
 | |
| 	ld d,(hl)
 | |
| 	push de
 | |
| 	jr loop
 | |
| 
 | |
| lol.wm1:ld iy,ipsh
 | |
| 	jr loms
 | |
| lol.n:	ld iy,ipsh
 | |
| 	jr loml
 | |
| lol.w0:	ld iy,ipsh
 | |
| 	jr lops
 | |
| lol.p:	ld iy,ipsh
 | |
| 	jr lopl
 | |
| 
 | |
| 
 | |
| ! LOE
 | |
| 
 | |
| loe.w4:	inc d
 | |
| loe.w3:	inc d
 | |
| loe.w2:	inc d
 | |
| loe.w1:	inc d
 | |
| loe.w0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld hl,eb
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
| 	jr ipsh
 | |
| 
 | |
| loe.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	jr loe.w0
 | |
| 
 | |
| 
 | |
| 
 | |
| ! LOF
 | |
| lof.2: lof.4: lof.6: lof.8:
 | |
| 	ld hl,-b_lof-b_lof	! assume lof 1 means stack +2, not -2
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
|  1:	pop de
 | |
| 	add hl,de
 | |
| 	jr ipsh
 | |
| 
 | |
| lof.s0:	ld h,d
 | |
|  2:	ld l,(ix)
 | |
| 	inc ix
 | |
| 	jr 1b
 | |
| 
 | |
| lof.l:	ld h,(ix)
 | |
| 	inc ix
 | |
| 	jr 2b
 | |
| 
 | |
| 
 | |
| 
 | |
| ! LAL
 | |
| lal.m1:	ld h,b
 | |
| 	ld l,c
 | |
| 	dec hl
 | |
| 	jr phl
 | |
| lal.0:	ld h,b
 | |
| 	ld l,c
 | |
| 	ld de,zone
 | |
| 	add hl,de
 | |
| 	jr phl
 | |
| 
 | |
| lal.wm2:dec d
 | |
| lal.wm1:ld iy,phl
 | |
| 	jr loms
 | |
| lal.w0:	ld iy,phl
 | |
| 	jr lops
 | |
| lal.n:	ld h,(ix)
 | |
| 	inc ix
 | |
| 	ld l,(ix)
 | |
| 	inc ix
 | |
| 	add hl,bc
 | |
| 	jr phl
 | |
| 
 | |
| lal.p:	ld h,(ix)
 | |
| 	inc ix
 | |
| 	ld l,(ix)
 | |
| 	inc ix
 | |
| 	add hl,bc
 | |
| 	ld de,zone
 | |
| 	add hl,de
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| 
 | |
| ! LAE
 | |
| 
 | |
| lae.w8:	inc d
 | |
| lae.w7: inc d
 | |
| lae.w6: inc d
 | |
| lae.w5: inc d
 | |
| lae.w4: inc d
 | |
| lae.w3: inc d
 | |
| lae.w2: inc d
 | |
| lae.w1: inc d
 | |
| lae.w0: ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld hl,eb
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
| 	jr phl
 | |
| 
 | |
| lae.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld hl,eb
 | |
| 	add hl,de
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| 
 | |
| ! LIL
 | |
| lil.0: lil.2:
 | |
| 	ld hl,-b_lil-b_lil+zone
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
| 	add hl,bc
 | |
|  1:	ld e,(hl)
 | |
| 	inc hl
 | |
| 	ld h,(hl)
 | |
| 	ld l,e
 | |
| 	jr ipsh
 | |
| 
 | |
| lil.wm1:ld iy,1b
 | |
| 	jr loms
 | |
| lil.n:	ld iy,1b
 | |
| 	jr loml
 | |
| lil.w0:	ld iy,1b
 | |
| 	jr lops
 | |
| lil.p:	ld iy,1b
 | |
| 	jr lopl
 | |
| 
 | |
| 
 | |
| 
 | |
| ! LXL, LXA
 | |
| lxl.1:
 | |
| 	ld a,1
 | |
| 	jr 7f
 | |
| 
 | |
| lxl.2:
 | |
| 	ld a,2
 | |
| 	jr 7f
 | |
| 
 | |
| lxl.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| lxl.s:	ld a,(ix)
 | |
| 	inc ix
 | |
| 7:	ld iy,phl
 | |
| 5:	ld h,b
 | |
| 	ld l,c
 | |
| 	or a
 | |
| 	jr z,3f
 | |
| 2:	inc hl
 | |
| 	inc hl
 | |
| 	inc hl
 | |
| 	inc hl
 | |
| 	inc hl
 | |
| 	inc hl
 | |
| 	inc hl
 | |
| 	inc hl
 | |
| 	.assert [ .-2b-zone] == 0
 | |
| 	ld e,(hl)
 | |
| 	inc hl
 | |
| 	ld h,(hl)
 | |
| 	ld l,e
 | |
| 	dec a
 | |
| 	jr nz,2b
 | |
| 3:	cp d
 | |
| 	jr z,4f
 | |
| 	dec d
 | |
| 	jr 2b
 | |
| 4:	jp (iy)
 | |
| 
 | |
| lxa.1:
 | |
| 	ld a,1
 | |
| 	jr 7f
 | |
| 
 | |
| lxa.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| lxa.s:	ld a,(ix)
 | |
| 	inc ix
 | |
| 7:	ld iy,1f
 | |
| 	jr 5b
 | |
| 1:	ld de,zone
 | |
| 	add hl,de
 | |
| 	jr phl
 | |
| 
 | |
| lpb.z:
 | |
| 	pop hl
 | |
| 	.assert [ zone/256] == 0
 | |
| 	ld e,zone
 | |
| 	add hl,de
 | |
| 	jr phl
 | |
| 
 | |
| dch.z:
 | |
| 	ld e,2
 | |
| 	jr loi
 | |
| 
 | |
| exg.z:
 | |
| 	pop de
 | |
| 	jr exg
 | |
| exg.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| exg.s0:
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| exg:
 | |
| 	push bc
 | |
| 	pop iy
 | |
| 	ld hl,0
 | |
| 	add hl,sp
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	add hl,de
 | |
| 1:
 | |
| 	ld a,(bc)
 | |
| 	ex af,af2
 | |
| 	ld a,(hl)
 | |
| 	ld (bc),a
 | |
| 	ex af,af2
 | |
| 	ld (hl),a
 | |
| 	inc bc
 | |
| 	inc hl
 | |
| 	dec de
 | |
| 	ld a,d
 | |
| 	or e
 | |
| 	jr nz,1b
 | |
| 	push iy
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! LDL
 | |
| ldl.0:	ld de,zone
 | |
| 	ld h,b
 | |
| 	ld l,c
 | |
| 	add hl,de
 | |
| dipsh:	inc hl
 | |
| 	inc hl
 | |
| 	inc hl
 | |
| 	ld d,(hl)
 | |
| 	dec hl
 | |
| 	ld e,(hl)
 | |
| 	dec hl
 | |
| 	push de
 | |
| 	ld d,(hl)
 | |
| 	dec hl
 | |
| 	ld e,(hl)
 | |
| 	push de
 | |
| 	jr loop
 | |
| 
 | |
| ldl.wm1:ld iy,dipsh
 | |
| 	jr loms
 | |
| ldl.n:	ld iy,dipsh
 | |
| 	jr loml
 | |
| ldl.w0:	ld iy,dipsh
 | |
| 	jr lops
 | |
| ldl.p:	ld iy,dipsh
 | |
| 	jr lopl
 | |
| 
 | |
| 
 | |
| ! LDE
 | |
| lde.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	jr lde.w0
 | |
| 
 | |
| lde.w3:	inc d
 | |
| lde.w2:	inc d
 | |
| lde.w1:	inc d
 | |
| lde.w0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld hl,eb
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
| 	jr dipsh
 | |
| 
 | |
| 
 | |
| ! LDF
 | |
| ldf.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	pop hl
 | |
| 	add hl,de
 | |
| 	jr dipsh
 | |
| 
 | |
| 
 | |
| ! LOI,LOS
 | |
| los.z:
 | |
| 	ld iy,los.2
 | |
| 	jr pop2
 | |
| los.l:	call long2
 | |
| los.2:	pop de
 | |
| loi:	pop hl
 | |
| 	add hl,de
 | |
| 	dec hl
 | |
| 	srl d
 | |
| 	rr e
 | |
| 	jr nc,1f
 | |
| 	ld a,e
 | |
| 	or d
 | |
| 	jr nz,eilsize
 | |
| 	ld e,(hl)	! here the 1-byte case is caught
 | |
| 	push de
 | |
| 	jr loop
 | |
| 1:	push bc
 | |
| 	pop iy
 | |
| 2:	ld b,(hl)
 | |
| 	dec hl
 | |
| 	ld c,(hl)
 | |
| 	dec hl
 | |
| 	push bc
 | |
| 	dec de
 | |
| 	ld a,d
 | |
| 	or e
 | |
| 	jr nz,2b
 | |
| loiend:	push iy
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| 
 | |
| loi.1: loi.2: loi.4: loi.6: loi.8:
 | |
| 	ld hl,-b_loi-b_loi
 | |
| 	add hl,de
 | |
| 	adc hl,de	! again we use that the carry is cleared
 | |
| 	jr nz,1f
 | |
| 	inc hl		! in case loi.0 object size is 1 byte!
 | |
| 1:	ex de,hl
 | |
| 	jr loi
 | |
| 
 | |
| loi.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| loi.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr loi
 | |
| 
 | |
| 
 | |
| ! ------------------------------ STORES --------------------------------
 | |
| 
 | |
| ! STL
 | |
| stl.p2:	ld hl,2
 | |
| 	jr 4f
 | |
| stl.p0:	ld hl,0
 | |
| 4:	ld de,zone
 | |
| 	add hl,de
 | |
| 	add hl,bc
 | |
| 	jr ipop
 | |
| 
 | |
| stl.m2: stl.m4: stl.m6: stl.m8: stl.m10:
 | |
| 	ld hl,b_stlm+b_stlm
 | |
| stl.zrl:sbc hl,de
 | |
| 	xor a
 | |
| 	sbc hl,de
 | |
| 	add hl,bc
 | |
| ipop:	pop de
 | |
| 	ld (hl),e
 | |
| 	inc hl
 | |
| 	ld (hl),d
 | |
| 	jr loop
 | |
| 
 | |
| stl.wm1:ld iy,ipop
 | |
| 	jr loms
 | |
| stl.n:	ld iy,ipop
 | |
| 	jr loml
 | |
| stl.w0:	ld iy,ipop
 | |
| 	jr lops
 | |
| stl.p:	ld iy,ipop
 | |
| 	jr lopl
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| ! STE
 | |
| 
 | |
| ste.w3:	inc d
 | |
| ste.w2:	inc d
 | |
| ste.w1:	inc d
 | |
| ste.w0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld hl,eb
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
| 	jr ipop
 | |
| 
 | |
| ste.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	jr ste.w0
 | |
| 
 | |
| 
 | |
| 
 | |
| ! STF
 | |
| stf.2: stf.4: stf.6: 
 | |
| 	ld hl,-b_stf-b_stf
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
|  1:	pop de
 | |
| 	add hl,de
 | |
| 	jr ipop
 | |
| 
 | |
| stf.s0:	ld h,d
 | |
|  2:	ld l,(ix)
 | |
| 	inc ix
 | |
| 	jr 1b
 | |
| 
 | |
| stf.l:	ld h,(ix)
 | |
| 	inc ix
 | |
| 	jr 2b
 | |
| 
 | |
| 
 | |
| 
 | |
| ! SIL
 | |
| 1:	ld e,(hl)
 | |
| 	inc hl
 | |
| 	ld h,(hl)
 | |
| 	ld l,e
 | |
| 	jr ipop
 | |
| 
 | |
| sil.wm1:ld iy,1b
 | |
| 	jr loms
 | |
| sil.n:	ld iy,1b
 | |
| 	jr loml
 | |
| sil.w0:	ld iy,1b
 | |
| 	jr lops
 | |
| sil.p:	ld iy,1b
 | |
| 	jr lopl
 | |
| 
 | |
| 
 | |
| ! STI, STS
 | |
| sts.z:
 | |
| 	ld iy,sts.2
 | |
| 	jr pop2
 | |
| sts.l:	call long2
 | |
| sts.2:	pop de
 | |
| sti:	pop hl
 | |
| 	srl d
 | |
| 	rr e
 | |
| 	jr nc,1f
 | |
| 	ld a,e
 | |
| 	or d
 | |
| 	jr nz,eilsize
 | |
| 	pop de		! here the 1-byte case is caught
 | |
| 	ld (hl),e
 | |
| 	jr loop
 | |
| 1:	push bc
 | |
| 	pop iy
 | |
| 2:	pop bc
 | |
| 	ld (hl),c
 | |
| 	inc hl
 | |
| 	ld (hl),b
 | |
| 	inc hl
 | |
| 	dec de
 | |
| 	ld a,e
 | |
| 	or d
 | |
| 	jr nz,2b
 | |
| 	jr loiend
 | |
| 
 | |
| sti.1: sti.2: sti.4: sti.6: sti.8:
 | |
| 	ld hl,-b_sti-b_sti
 | |
| 	add hl,de
 | |
| 	adc hl,de	! again we use that the carry is cleared
 | |
| 	jr nz,1f
 | |
| 	inc hl		! in case sti.0 object size is 1 byte!
 | |
| 1:	ex de,hl
 | |
| 	jr sti
 | |
| 
 | |
| sti.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| sti.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr  sti
 | |
| 
 | |
| 
 | |
| ! SDL
 | |
| sdl.wm1:ld iy,1f
 | |
| 	jr loms
 | |
| sdl.n:	ld iy,1f
 | |
| 	jr loml
 | |
| sdl.w0:	ld iy,1f
 | |
| 	jr lops
 | |
| sdl.p:	ld iy,1f
 | |
| 	jr lopl
 | |
| 
 | |
| 
 | |
| ! SDE
 | |
| sde.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld hl,eb
 | |
| 2:	add hl,de
 | |
| 1:	pop de
 | |
| 	ld (hl),e
 | |
| 	inc hl
 | |
| 	ld (hl),d
 | |
| 	inc hl
 | |
| 	jr ipop
 | |
| 
 | |
| 
 | |
| ! SDF
 | |
| sdf.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	pop hl
 | |
| 	jr 2b
 | |
| 
 | |
| 
 | |
| !------------------------- SINGLE PRECISION ARITHMETIC ---------------
 | |
| 
 | |
| ! ADI, ADP, ADS, ADU
 | |
| 
 | |
| adi.z: adu.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 adi.2,adi.4
 | |
| adi.l: adu.l:
 | |
| 	ld d,(ix)	! I guess a routine chk24.l could do this job
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| ads.z:
 | |
| 	ld iy,adi.2
 | |
| 	jr pop2
 | |
| ads.l:
 | |
| 	call long2
 | |
| ads.2: adi.2: adu.2:
 | |
| 	pop de
 | |
| 1:	pop hl
 | |
| 	add hl,de
 | |
| 	jr phl
 | |
| 
 | |
| adp.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 1b
 | |
| 
 | |
| adp.sm1:dec d
 | |
| adp.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 1b
 | |
| 
 | |
| adp.2:	pop hl
 | |
| 	inc hl
 | |
| 	jr 1f
 | |
| inc.z:
 | |
| adp.1:	pop hl
 | |
| 1:	inc hl
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| ! SBI, SBP, SBS, SBU	(but what is SBP?)
 | |
| 
 | |
| sbi.z: sbu.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 sbi.2,sbi.4
 | |
| sbi.l: sbu.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| sbs.z:
 | |
| 	ld iy,sbi.2
 | |
| 	jr pop2
 | |
| sbs.l:
 | |
| 	call long2
 | |
| sbi.2:
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	sbc hl,de
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| ! NGI
 | |
| ngi.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 ngi.2,ngi.4
 | |
| ngi.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| ngi.2:	ld hl,0
 | |
| 	pop de
 | |
| 	sbc hl,de
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| ! MLI, MLU	Johan version
 | |
| mli.z: mlu.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 mli.2,mli.4
 | |
| mli.l: mlu.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| mli.2: mlu.2:
 | |
| 	ld iy,loop
 | |
| mliint:	pop de
 | |
| 	pop hl
 | |
| 	push bc
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	ld hl,0
 | |
| 	ld a,16
 | |
| 0:
 | |
| 	bit 7,d
 | |
| 	jr z,1f
 | |
| 	add hl,bc
 | |
| 1:
 | |
| 	dec a
 | |
| 	jr z,2f
 | |
| 	ex de,hl
 | |
| 	add hl,hl
 | |
| 	ex de,hl
 | |
| 	add hl,hl
 | |
| 	jr 0b
 | |
| 2:
 | |
| 	pop bc
 | |
| 	push hl
 | |
| 	jp (iy)
 | |
| 
 | |
| 
 | |
| ! DVI, DVU
 | |
| dvi.z:	
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 dvi.2,dvi.4
 | |
| dvi.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| dvi.2:
 | |
| 	pop	hl
 | |
| 	pop	de
 | |
| 	push	bc
 | |
| 	ld	b,h
 | |
| 	ld	c,l
 | |
| 	xor	a
 | |
| 	ld	h,a
 | |
| 	ld	l,a
 | |
| 	sbc	hl,bc
 | |
| 	jp	m,1f
 | |
| 	ld	b,h
 | |
| 	ld	c,l
 | |
| 	cpl
 | |
| 1:
 | |
| 	or	a
 | |
| 	ld	hl,0
 | |
| 	sbc	hl,de
 | |
| 	jp	m,1f
 | |
| 	ex	de,hl
 | |
| 	cpl
 | |
| 1:
 | |
| 	push	af
 | |
| 	ld	hl,0
 | |
| 	ld	a,16
 | |
| 0:
 | |
| 	add	hl,hl
 | |
| 	ex	de,hl
 | |
| 	add	hl,hl
 | |
| 	ex	de,hl
 | |
| 	jr	nc,1f
 | |
| 	inc	hl
 | |
| 	or	a
 | |
| 1:
 | |
| 	sbc	hl,bc
 | |
| 	inc	de
 | |
| 	jp	p,2f
 | |
| 	add	hl,bc
 | |
| 	dec	de
 | |
| 2:
 | |
| 	dec	a
 | |
| 	jr	nz,0b
 | |
| 	pop	af
 | |
| 	or	a
 | |
| 	jr	z,1f
 | |
| 	ld	hl,0
 | |
| 	sbc	hl,de
 | |
| 	ex	de,hl
 | |
| 1:
 | |
| 	pop	bc
 | |
| 	push	de
 | |
| 	jr	loop
 | |
| 
 | |
| 
 | |
| dvu.z:	
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 dvu.2,dvu.4
 | |
| dvu.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| dvu.2:
 | |
| 	pop	hl
 | |
| 	pop	de
 | |
| 	push	bc
 | |
| 	ld	b,h
 | |
| 	ld	c,l
 | |
| 	ld	hl,0
 | |
| 	ld	a,16
 | |
| 0:
 | |
| 	add	hl,hl
 | |
| 	ex	de,hl
 | |
| 	add	hl,hl
 | |
| 	ex	de,hl
 | |
| 	jr	nc,1f
 | |
| 	inc	hl
 | |
| 	or	a
 | |
| 1:
 | |
| 	sbc	hl,bc
 | |
| 	inc	de
 | |
| 	jp	p,2f
 | |
| 	add	hl,bc
 | |
| 	dec	de
 | |
| 2:
 | |
| 	dec	a
 | |
| 	jr	nz,0b
 | |
| 	pop	bc
 | |
| 	push	de
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! RMI, RMU
 | |
| rmi.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 rmi.2,rmi.4
 | |
| rmi.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| rmi.2:
 | |
| 	pop	hl
 | |
| 	pop	de
 | |
| 	push	bc
 | |
| 	ld	b,h
 | |
| 	ld	c,l
 | |
| 	xor	a
 | |
| 	ld	h,a
 | |
| 	ld	l,a
 | |
| 	sbc	hl,bc
 | |
| 	jp	m,1f
 | |
| 	ld	b,h
 | |
| 	ld	c,l
 | |
| 1:
 | |
| 	or	a
 | |
| 	ld	hl,0
 | |
| 	sbc	hl,de
 | |
| 	jp	m,1f
 | |
| 	ex	de,hl
 | |
| 	cpl
 | |
| 1:
 | |
| 	push	af
 | |
| 	ld	hl,0
 | |
| 	ld	a,16
 | |
| 0:
 | |
| 	add	hl,hl
 | |
| 	ex	de,hl
 | |
| 	add	hl,hl
 | |
| 	ex	de,hl
 | |
| 	jr	nc,1f
 | |
| 	inc	hl
 | |
| 	or	a
 | |
| 1:
 | |
| 	sbc	hl,bc
 | |
| 	inc	de
 | |
| 	jp	p,2f
 | |
| 	add	hl,bc
 | |
| 	dec	de
 | |
| 2:
 | |
| 	dec	a
 | |
| 	jr	nz,0b
 | |
| 	ex	de,hl
 | |
| 	pop	af
 | |
| 	or	a
 | |
| 	jr	z,1f
 | |
| 	ld	hl,0
 | |
| 	sbc	hl,de
 | |
| 	ex	de,hl
 | |
| 1:
 | |
| 	pop	bc
 | |
| 	push	de
 | |
| 	jr	loop
 | |
| 
 | |
| 
 | |
| rmu.4:
 | |
| 	ld iy,.dvu4
 | |
| 	jr 1f
 | |
| rmi.4:
 | |
| 	ld iy,.dvi4
 | |
| 1:
 | |
| 	ld (retarea),bc
 | |
| 	ld (retarea+2),ix
 | |
| 	ld hl,1f
 | |
| 	push hl
 | |
| 	push iy
 | |
| 	ret
 | |
| 1:
 | |
| 	pop hl
 | |
| 	pop hl
 | |
| 	push bc
 | |
| 	push de
 | |
| 	ld bc,(retarea)
 | |
| 	ld ix,(retarea+2)
 | |
| 	jr loop
 | |
| rmu.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 rmu.2,rmu.4
 | |
| rmu.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| rmu.2:
 | |
| 	pop	hl
 | |
| 	pop	de
 | |
| 	push	bc
 | |
| 	ld	b,h
 | |
| 	ld	c,l
 | |
| 	ld	hl,0
 | |
| 	ld	a,16
 | |
| 0:
 | |
| 	add	hl,hl
 | |
| 	ex	de,hl
 | |
| 	add	hl,hl
 | |
| 	ex	de,hl
 | |
| 	jr	nc,1f
 | |
| 	inc	hl
 | |
| 	or	a
 | |
| 1:
 | |
| 	sbc	hl,bc
 | |
| 	inc	de
 | |
| 	jp	p,2f
 | |
| 	add	hl,bc
 | |
| 	dec	de
 | |
| 2:
 | |
| 	dec	a
 | |
| 	jr	nz,0b
 | |
| 	pop	bc
 | |
| 	jr	phl
 | |
| 
 | |
| ! SLI, SLU
 | |
| 
 | |
| slu.z: sli.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 sli.2,sli.4
 | |
| slu.l:
 | |
| sli.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| sli.2:
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	ld a,d
 | |
| 	or a
 | |
| 	jr z,1f
 | |
| 	ld e,15
 | |
| 2:	add hl,hl
 | |
| 1:	dec e
 | |
| 	jp m,phl
 | |
| 	jr 2b
 | |
| 
 | |
| sli.4:
 | |
| slu.4:
 | |
| 	pop de
 | |
| 	pop iy
 | |
| 	pop hl
 | |
| 	inc d
 | |
| 	dec d
 | |
| 	jr z,1f
 | |
| 	ld e,31
 | |
| 1:
 | |
| 	dec e
 | |
| 	jp m,2f
 | |
| 	add iy,iy
 | |
| 	adc hl,hl
 | |
| 	jr 1b
 | |
| 2:
 | |
| 	push hl
 | |
| 	push iy
 | |
| 	jr loop
 | |
| 
 | |
| ! SRI, SRU
 | |
| 
 | |
| sri.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 sri.2,sri.4
 | |
| sri.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| sri.2:	pop de
 | |
| 	pop hl
 | |
| 	ld a,d
 | |
| 	or a
 | |
| 	jr z,1f
 | |
| 	ld e,15
 | |
| 2:	sra h
 | |
| 	rr l
 | |
| 1:	dec e
 | |
| 	jp m,phl
 | |
| 	jr 2b
 | |
| 
 | |
| 
 | |
| sri.4:
 | |
| 	pop de
 | |
| 	ld a,e
 | |
| 	inc d
 | |
| 	dec d
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	jr z,1f
 | |
| 	ld a,31
 | |
| 1:
 | |
| 	dec a
 | |
| 	jp m,2f
 | |
| 	sra h
 | |
| 	rr l
 | |
| 	rr d
 | |
| 	rr e
 | |
| 	jr 1b
 | |
| 2:
 | |
| 	push hl
 | |
| 	push de
 | |
| 	jr loop
 | |
| 
 | |
| sru.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 sru.2,sru.4
 | |
| sru.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| sru.2:	pop de
 | |
| 	pop hl
 | |
| 	ld a,d
 | |
| 	or a
 | |
| 	jr z,1f
 | |
| 	ld e,15
 | |
| 2:	srl h
 | |
| 	rr l
 | |
| 1:	dec e
 | |
| 	jp m,phl
 | |
| 	jr 2b
 | |
| 
 | |
| sru.4:
 | |
| 	pop de
 | |
| 	ld a,e
 | |
| 	inc d
 | |
| 	dec d
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	jr z,1f
 | |
| 	ld a,31
 | |
| 1:
 | |
| 	dec a
 | |
| 	jp m,2f
 | |
| 	srl h
 | |
| 	rr l
 | |
| 	rr d
 | |
| 	rr e
 | |
| 	jr 1b
 | |
| 2:
 | |
| 	push hl
 | |
| 	push de
 | |
| 	jr loop
 | |
| 
 | |
| ! ROL, ROR
 | |
| rol.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 rol.2,rol.4
 | |
| rol.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| rol.2:	pop de
 | |
| 	pop hl
 | |
| 	ld a,e
 | |
| 	and 15
 | |
| 	jr z,phl
 | |
| 	ld de,0
 | |
| 1:	add hl,hl
 | |
| 	adc hl,de
 | |
| 	dec a
 | |
| 	jr nz,1b
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| rol.4:
 | |
| 	pop de
 | |
| 	pop iy
 | |
| 	pop hl
 | |
| 	ld a,e
 | |
| 	and 31
 | |
| 	jr z,3f
 | |
| 1:
 | |
| 	add iy,iy
 | |
| 	adc hl,hl
 | |
| 	jr nc,2f
 | |
| 	inc iy
 | |
| 2:
 | |
| 	dec a
 | |
| 	jr nz,1b
 | |
| 3:
 | |
| 	push hl
 | |
| 	push iy
 | |
| 
 | |
| ror.z:
 | |
| 	pop de
 | |
| 9:
 | |
| 	call chk24
 | |
| 	.data2 ror.2,ror.4
 | |
| ror.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 9b
 | |
| ror.2:	pop de
 | |
| 	pop hl
 | |
| 	ld a,e
 | |
| 	and 15
 | |
| 	jr z,phl
 | |
| 1:	srl h
 | |
| 	rr l
 | |
| 	jr nc,2f
 | |
| 	set 7,h
 | |
| 2:	dec a
 | |
| 	jr nz,1b
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| ror.4:
 | |
| 	pop de
 | |
| 	ld a,e
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	and 31
 | |
| 	jr z,0f
 | |
| 1:
 | |
| 	srl h
 | |
| 	rr l
 | |
| 	rr d
 | |
| 	rr e
 | |
| 	jr nc,2f
 | |
| 	set 7,h
 | |
| 2:
 | |
| 	dec a
 | |
| 	jr nz,1b
 | |
| 0:
 | |
| 	push hl
 | |
| 	push de
 | |
| 	jr loop
 | |
| pop2:	ld de,2
 | |
| 	pop hl
 | |
| 	sbc hl,de
 | |
| 	jr nz,eilsize
 | |
| 	xor a
 | |
| 	ld d,a
 | |
| 	jp (iy)
 | |
| 
 | |
| 
 | |
| chk24:
 | |
| 	! this routine is used to call indirectly
 | |
| 	! a routine for either 2 or 4 byte operation
 | |
| 	! ( e.g. mli.2 or mli.4)
 | |
| 	! de contains 2 or 4
 | |
| 	! iy points to a descriptor containing
 | |
| 	! the addresses of both routines
 | |
| 	pop iy		! address of descriptor
 | |
| 	ld a,d		! high byte must be 0
 | |
| 	or a
 | |
| 	jr nz,unimpld
 | |
| 	ld a,e
 | |
| 	cp 2
 | |
| 	jr z,1f
 | |
| 	inc iy
 | |
| 	inc iy		! points to word containing
 | |
| 			! address of 4 byte routine
 | |
| 	cp 4
 | |
| 	jr nz,unimpld
 | |
| 1:
 | |
| 	ld h,(iy+1)
 | |
| 	ld l,(iy)
 | |
| 	xor a
 | |
| 	jp (hl)
 | |
| !--------------------- INCREMENT, DECREMENT, ZERO ----------------------
 | |
| 
 | |
| ! INC
 | |
| inl.m2: inl.m4: inl.m6:
 | |
| 	ld hl, b_inl+b_inl
 | |
| 	sbc hl,de
 | |
| 	xor a
 | |
| 	sbc hl,de
 | |
| 	add hl,bc
 | |
| 1:	inc (hl)
 | |
| 	jr nz,loop
 | |
| 	inc hl
 | |
| 	inc (hl)
 | |
| 	jr loop
 | |
| 
 | |
| inl.wm1:ld iy,1b
 | |
| 	jr loms
 | |
| inl.n:	ld iy,1b
 | |
| 	jr loml
 | |
| inl.p:	ld iy,1b
 | |
| 	jr lopl
 | |
| 
 | |
| 
 | |
| ! INE
 | |
| 
 | |
| ine.w3:	inc d
 | |
| ine.w2:	inc d
 | |
| ine.w1:	inc d
 | |
| ine.w0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld hl,eb
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
| 	jr 1b
 | |
| 
 | |
| ine.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	jr ine.w0
 | |
| 
 | |
| 
 | |
| ! DEC
 | |
| dec.z:	pop hl
 | |
| 	dec hl
 | |
| 	push hl
 | |
| 	jr loop
 | |
| 
 | |
| 1:	ld e,(hl)
 | |
| 	inc hl
 | |
| 	ld d,(hl)
 | |
| 	dec de
 | |
| 	ld (hl),d
 | |
| 	dec hl
 | |
| 	ld (hl),e
 | |
| 	jr loop
 | |
| 
 | |
| del.wm1:ld iy,1b
 | |
| 	jr loms
 | |
| del.n:	ld iy,1b
 | |
| 	jr loml
 | |
| del.p:	ld iy,1b
 | |
| 	jr lopl
 | |
| 
 | |
| 
 | |
| ! DEE
 | |
| 
 | |
| dee.w3:	inc d
 | |
| dee.w2:	inc d
 | |
| dee.w1:	inc d
 | |
| dee.w0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld hl,eb
 | |
| 	add hl,de
 | |
| 	add hl,de
 | |
| 	jr 1b
 | |
| 
 | |
| dee.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	jr dee.w0
 | |
| 
 | |
| 
 | |
| ! ZERO
 | |
| zri2: zru2:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| zrf.z:
 | |
| zer.z:	pop de
 | |
| 2:	ld hl,0
 | |
| 	sra d
 | |
| 	rr e
 | |
| 1:	push hl
 | |
| 	dec de
 | |
| 	ld a,e
 | |
| 	or d
 | |
| 	jr nz,1b
 | |
| 	jr loop
 | |
| 
 | |
| zrf.l:
 | |
| zer.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| zer.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 2b
 | |
| 
 | |
| 
 | |
| zrl.m2: zrl.m4:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	push hl
 | |
| 	ld hl,b_zrl+b_zrl
 | |
| 	jr stl.zrl
 | |
| 
 | |
| zrl.wm1:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	push hl
 | |
| 	jr stl.wm1
 | |
| 
 | |
| zrl.n:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	push hl
 | |
| 	jr stl.n
 | |
| 
 | |
| zrl.w0:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	push hl
 | |
| 	jr stl.w0
 | |
| 
 | |
| zrl.p:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	push hl
 | |
| 	jr stl.p
 | |
| 
 | |
| 
 | |
| 
 | |
| zre.w0:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	push hl
 | |
| 	jr ste.w0
 | |
| 
 | |
| zre.l:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	push hl
 | |
| 	jr ste.l
 | |
| 
 | |
| 
 | |
| ! ------------------------- CONVERT GROUP ------------------------------
 | |
| 
 | |
| ! CII, CIU
 | |
| cii.z: ciu.z:
 | |
| 	pop hl
 | |
| 	pop de
 | |
| 	sbc hl,de	! hl and de can only have values 2 or 4, that's
 | |
| 			! why a single subtract can split the 3 cases
 | |
| 	jr z,loop	! equal, so do nothing
 | |
| 	jp p,2f
 | |
| 3:	pop hl		! smaller, so shrink size from double to single
 | |
| 	pop de
 | |
| 	jr phl
 | |
| 2:	pop hl		! larger, so expand (for cii with sign extend)
 | |
| 	res 1,e
 | |
| 	bit 7,h
 | |
| 	jr z,1f
 | |
| 	dec de
 | |
| 1:	push de
 | |
| 	jr phl
 | |
| 
 | |
| ! CUI, CUU
 | |
| cui.z: cuu.z:
 | |
| 	pop hl
 | |
| 	pop de
 | |
| 	sbc hl,de
 | |
| 	jr z,loop
 | |
| 	jp m,3b
 | |
| 	res 1,e
 | |
| 	pop hl
 | |
| 	jr 1b
 | |
| 
 | |
| 
 | |
| ! ------------------------------ SETS ---------------------------------
 | |
| 
 | |
| ! SET
 | |
| set.z:	pop hl
 | |
| doset:	pop de
 | |
| 	push bc
 | |
| 	pop iy
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	xor a
 | |
| 0:	push af
 | |
| 	inc sp
 | |
| 	dec c
 | |
| 	jr nz,0b
 | |
| 	dec b
 | |
| 	jp p,0b
 | |
| 	push iy
 | |
| 	pop bc
 | |
| 	ex de,hl
 | |
| 	ld a,l
 | |
| 	sra h
 | |
| 	jp m,unimpld
 | |
| 	rr l
 | |
| 	sra h
 | |
| 	rr l
 | |
| 	sra h
 | |
| 	rr l
 | |
| 	push hl
 | |
| 	or a
 | |
| 	sbc hl,de
 | |
| 	pop hl
 | |
| 	jp p,unimpld
 | |
| 	add hl,sp
 | |
| 	ld (hl),1
 | |
| 	and 7
 | |
| 	jr 1f
 | |
| 0:	sla (hl)
 | |
| 	dec a
 | |
| 1:	jr nz,0b
 | |
| 	jr loop
 | |
| 
 | |
| set.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| set.s0: ld e,(ix)
 | |
| 	inc ix
 | |
| 	ex de,hl
 | |
| 	jr doset
 | |
| 
 | |
| 
 | |
| ! INN
 | |
| inn.z:	pop hl
 | |
| 	jr 1f
 | |
| inn.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| inn.s0: ld e,(ix)
 | |
| 	inc ix
 | |
| 	ex de,hl
 | |
| 1:
 | |
| 	pop de
 | |
| 	add hl,sp
 | |
| 	push hl
 | |
| 	pop iy
 | |
| 	ex de,hl
 | |
| 	ld a,l
 | |
| 	sra h
 | |
| 	jp m,0f
 | |
| 	rr l
 | |
| 	sra h
 | |
| 	rr l
 | |
| 	sra h
 | |
| 	rr l
 | |
| 	add hl,sp
 | |
| 	push hl
 | |
| 	or a		! clear carry
 | |
| 	sbc hl,de
 | |
| 	pop hl
 | |
| 	jp m,1f
 | |
| 0:	xor a
 | |
| 	jr 4f
 | |
| 1:	ld e,(hl)
 | |
| 	and 7
 | |
| 	jr 2f
 | |
| 3:	rrc e
 | |
| 	dec a
 | |
| 2:	jr nz,3b
 | |
| 	ld a,e
 | |
| 	and 1
 | |
| 4:	ld l,a
 | |
| 	ld h,0
 | |
| 	ld sp,iy
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| 
 | |
| ! ------------------------- LOGICAL GROUP -----------------------------
 | |
| 
 | |
| ! AND
 | |
| and.z:	pop de
 | |
| doand:	ld h,d
 | |
| 	ld l,e
 | |
| 	add hl,sp
 | |
| 	push bc
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	ex de,hl
 | |
| 	add hl,de
 | |
| 1:	dec hl
 | |
| 	dec de
 | |
| 	ld a,(de)
 | |
| 	and (hl)
 | |
| 	ld (hl),a
 | |
| 	xor a
 | |
| 	sbc hl,bc
 | |
| 	jr z,2f
 | |
| 	add hl,bc
 | |
| 	jr 1b
 | |
| 2:	ld h,b
 | |
| 	ld l,c
 | |
| 	pop bc
 | |
| 	ld sp,hl
 | |
| 	jr loop
 | |
| 
 | |
| and.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| and.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr doand
 | |
| 
 | |
| and.2:	ld e,2
 | |
| 	jr doand
 | |
| 
 | |
| ! IOR
 | |
| ior.z:	pop de
 | |
| ior:	ld h,d
 | |
| 	ld l,e
 | |
| 	add hl,sp
 | |
| 	push bc
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	ex de,hl
 | |
| 	add hl,de
 | |
| 1:	dec hl
 | |
| 	dec de
 | |
| 	ld a,(de)
 | |
| 	or (hl)
 | |
| 	ld (hl),a
 | |
| 	xor a
 | |
| 	sbc hl,bc
 | |
| 	jr z,2f
 | |
| 	add hl,bc
 | |
| 	jr 1b
 | |
| 2:	ld h,b
 | |
| 	ld l,c
 | |
| 	pop bc
 | |
| 	ld sp,hl
 | |
| 	jr loop
 | |
| 
 | |
| ior.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| ior.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr ior
 | |
| 
 | |
| ior.2:	ld e,2
 | |
| 	jr ior
 | |
| 
 | |
| ! XOR
 | |
| xor.z:	pop de
 | |
| exor:	ld h,d
 | |
| 	ld l,e
 | |
| 	add hl,sp
 | |
| 	push bc
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	ex de,hl
 | |
| 	add hl,de
 | |
| 1:	dec hl
 | |
| 	dec de
 | |
| 	ld a,(de)
 | |
| 	xor (hl)
 | |
| 	ld (hl),a
 | |
| 	xor a
 | |
| 	sbc hl,bc
 | |
| 	jr z,2f
 | |
| 	add hl,bc
 | |
| 	jr 1b
 | |
| 2:	ld h,b
 | |
| 	ld l,c
 | |
| 	pop bc
 | |
| 	ld sp,hl
 | |
| 	jr loop
 | |
| 
 | |
| xor.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr exor
 | |
| 
 | |
| ! COM
 | |
| com.z:	pop hl
 | |
| com:	add hl,sp
 | |
| 1:	dec hl
 | |
| 	ld a,(hl)
 | |
| 	cpl
 | |
| 	ld (hl),a
 | |
| 	xor a
 | |
| 	sbc hl,sp
 | |
| 	jr z,loop
 | |
| 	add hl,sp
 | |
| 	jr 1b
 | |
| 
 | |
| com.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ex de,hl
 | |
| 	jr com
 | |
| 
 | |
| 
 | |
| ! ------------------------- COMPARE GROUP ------------------------------
 | |
| 
 | |
| ! CMI
 | |
| 
 | |
| 
 | |
| cmi.2:	pop de
 | |
| 	pop hl
 | |
| 	ld a,h
 | |
| 	xor d		! check sign bit to catch overflow with subtract
 | |
| 	jp m,1f
 | |
| 	sbc hl,de
 | |
| 	jr phl
 | |
| 1:	xor d		! now a equals (original) h again
 | |
| 	jp m,phl
 | |
| 	set 0,l		! to catch case hl=0>de bit 0 is set explicitly
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| 
 | |
| ! CMU, CMP
 | |
| 
 | |
| cmi.4:	inc a
 | |
| 	ld de,4
 | |
| 	jr docmu
 | |
| cmp.z:	ld de,2
 | |
| 	jr docmu
 | |
| cmi.z:	inc a
 | |
| cmu.z:
 | |
| 	pop de
 | |
| 	jr docmu
 | |
| 
 | |
| cmi.l:	inc a
 | |
| cmu.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| docmu:	push bc
 | |
| 	pop iy
 | |
| 	ld b,d
 | |
| 	ld c,e
 | |
| 	ld hl,0
 | |
| 	add hl,sp
 | |
| 	add hl,bc
 | |
| 	dec hl
 | |
| 	ld d,h
 | |
| 	ld e,l
 | |
| 	add hl,bc
 | |
| 	ld (retarea),hl		! save new sp-1
 | |
| 	or a
 | |
| 	jr z,1f
 | |
| 	ld a,(de)
 | |
| 	cp (hl)
 | |
| 	dec hl
 | |
| 	dec de
 | |
| 	dec bc
 | |
| 	jr z,1f
 | |
| 	jp p,4f
 | |
| 	jp pe,5f
 | |
| 	jr 6f
 | |
| 1:
 | |
| 	ld a,(de)
 | |
| 	cp (hl)
 | |
| 	dec de
 | |
| 	dec hl
 | |
| 	dec bc
 | |
| 	jr nz,2f
 | |
| 	ld a,b
 | |
| 	or c
 | |
| 	jr nz,1b
 | |
| 	ld d,a
 | |
| 	ld e,a
 | |
| 	jr 3f
 | |
| 2:
 | |
| 	jr nc,5f
 | |
| 6:
 | |
| 	ld de,1
 | |
| 	jr 3f
 | |
| 4:
 | |
| 	jp pe,6b
 | |
| 5:
 | |
| 	ld de,-1
 | |
| 3:
 | |
| 	ld hl,(retarea)
 | |
| 	inc hl
 | |
| 	ld sp,hl
 | |
| 	push de
 | |
| 	push iy
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| 
 | |
| ! CMS
 | |
| 
 | |
| cms.z:	pop hl
 | |
| 	jr 1f
 | |
| cms.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| cms.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ex de,hl
 | |
| 1:	push bc
 | |
| 	pop iy
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	add hl,sp
 | |
| 0:
 | |
| 	dec sp
 | |
| 	pop af
 | |
| 	cpi
 | |
| 	jr nz,1f
 | |
| 	ld a,b
 | |
| 	or c
 | |
| 	jr nz,0b
 | |
| 	ld de,0
 | |
| 	jr 2f
 | |
| 1:
 | |
| 	add hl,bc
 | |
| 	ld de,1
 | |
| 2:
 | |
| 	ld sp,hl
 | |
| 	push de
 | |
| 	push iy
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! TLT, TLE, TEQ, TNE, TGE, TGT
 | |
| tlt.z:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	pop de
 | |
| 	bit 7,d
 | |
| 	jr z,1f
 | |
| 	inc l
 | |
| 1:
 | |
| 	jr phl
 | |
| 
 | |
| tle.z:	ld hl,1
 | |
| 	pop de
 | |
| 	xor a
 | |
| 	add a,d
 | |
| 	jp m,phl
 | |
| 	jr nz,1f
 | |
| 	xor a
 | |
| 	add a,e
 | |
| 	jr z,2f
 | |
| 1:	dec l
 | |
| 2:
 | |
| 	jr phl
 | |
| 
 | |
| teq.z:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	pop de
 | |
| 	ld a,d
 | |
| 	or e
 | |
| 	jr nz,1f
 | |
| 	inc l
 | |
| 1:
 | |
| 	jr phl
 | |
| 
 | |
| tne.z:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	pop de
 | |
| 	ld a,d
 | |
| 	or e
 | |
| 	jr z,1f
 | |
| 	inc l
 | |
| 1:
 | |
| 	jr phl
 | |
| 
 | |
| tge.z:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	pop de
 | |
| 	bit 7,d
 | |
| 	jr nz,1f
 | |
| 	inc l
 | |
| 1:
 | |
| 	jr phl
 | |
| 
 | |
| tgt.z:
 | |
| 	ld h,d
 | |
| 	ld l,d
 | |
| 	pop de
 | |
| 	xor a
 | |
| 	add a,d
 | |
| 	jp m,phl
 | |
| 	jr nz,1f
 | |
| 	xor a
 | |
| 	add a,e
 | |
| 	jr z,2f
 | |
| 1:	inc l
 | |
| 2:
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| ! ------------------------- BRANCH GROUP -------------------------------
 | |
| 
 | |
| ! BLT, BLE, BEQ, BNE, BGE, BGT, BRA
 | |
| 
 | |
| b.pl:	ld d,(ix)
 | |
| 	inc ix
 | |
| b.ps:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	push ix
 | |
| 	pop hl
 | |
| 	add hl,de
 | |
| 	pop de
 | |
| 	ex (sp),hl
 | |
| 	xor a
 | |
| 	jp (iy)
 | |
| 
 | |
| 
 | |
| bra.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	jr bra.s0
 | |
| 
 | |
| bra.sm2:dec d
 | |
| bra.sm1:dec d
 | |
| 	dec d
 | |
| bra.s1:	inc d
 | |
| bra.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	add ix,de
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| bgo:	pop ix		! take branch
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| blt.s0:	ld iy,blt
 | |
| 	jr b.ps
 | |
| blt.l:	ld iy,blt
 | |
| 	jr b.pl
 | |
| blt:	ld a,h
 | |
| 	xor d
 | |
| 	jp m,1f
 | |
| 	sbc hl,de
 | |
| 	jr 2f
 | |
| 1:	xor d
 | |
| 2:	jp m,bgo
 | |
| 	pop de
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ble.s0:	ld iy,ble
 | |
| 	jr b.ps
 | |
| ble.l:	ld iy,ble
 | |
| 	jr b.pl
 | |
| ble:	ex de,hl
 | |
| 	jr bge
 | |
| 
 | |
| 
 | |
| beq.s0:	ld iy,beq
 | |
| 	jr b.ps
 | |
| beq.l:	ld iy,beq
 | |
| 	jr b.pl
 | |
| beq:	sbc hl,de
 | |
| 	jr z,bgo
 | |
| 	pop de		! keep stack clean, so dump unused jump address
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| bne.s0:	ld iy,bne
 | |
| 	jr b.ps
 | |
| bne.l:	ld iy,bne
 | |
| 	jr b.pl
 | |
| bne:	sbc hl,de
 | |
| 	jr nz,bgo
 | |
| 	pop de		! keep stack clean, so dump unused jump address
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| bge.s0:	ld iy,bge
 | |
| 	jr b.ps
 | |
| bge.l:	ld iy,bge
 | |
| 	jr b.pl
 | |
| bge:	ld a,h
 | |
| 	xor d		! check sign bit to catch overflow with subtract
 | |
| 	jp m,1f
 | |
| 	sbc hl,de
 | |
| 	jr 2f
 | |
| 1:	xor d		! now a equals (original) h again
 | |
| 2:	jp p,bgo
 | |
| 	pop de		! keep stack clean, so dump unused jump address
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| bgt.s0:	ld iy,bgt
 | |
| 	jr b.ps
 | |
| bgt.l:	ld iy,bgt
 | |
| 	jr b.pl
 | |
| bgt:	ex de,hl
 | |
| 	jr blt
 | |
| 
 | |
| 
 | |
| 
 | |
| ! ZLT, ZLE, ZEQ, ZNE, ZGE, ZGT
 | |
| 
 | |
| 
 | |
| z.pl:	ld d,(ix)
 | |
| 	inc ix
 | |
| z.ps:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	push ix
 | |
| 	pop hl
 | |
| 	add hl,de
 | |
| 	ex de,hl
 | |
| 	pop hl
 | |
| 	xor a
 | |
| 	add a,h
 | |
| 	jp (iy)
 | |
| 
 | |
| 
 | |
| 
 | |
| zlt.l:	ld iy,zlt
 | |
| 	jr z.pl
 | |
| zlt.s0:	ld iy,zlt
 | |
| 	jr z.ps
 | |
| zlt:	jp m,zgo
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| zle.l:	ld iy,zle
 | |
| 	jr z.pl
 | |
| zle.s0:	ld iy,zle
 | |
| 	jr z.ps
 | |
| zle:	jp m,zgo
 | |
| 	jr nz,loop
 | |
| 	xor a
 | |
| 	add a,l
 | |
| 	jr z,zgo
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| zeq.l:	ld iy,zeq
 | |
| 	jr z.pl
 | |
| zeq.s1: inc d
 | |
| zeq.s0:	ld iy,zeq
 | |
| 	jr z.ps
 | |
| zeq:	ld a,l
 | |
| 	or h
 | |
| 	jr nz,loop
 | |
| zgo:	push de
 | |
| 	pop ix
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| zne.sm1:dec d
 | |
| 	jr zne.s0
 | |
| zne.l:	ld iy,zne
 | |
| 	jr z.pl
 | |
| zne.s0:	ld iy,zne
 | |
| 	jr z.ps
 | |
| zne:	ld a,l
 | |
| 	or h
 | |
| 	jr nz,zgo
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| zge.l:	ld iy,zge
 | |
| 	jr z.pl
 | |
| zge.s0:	ld iy,zge
 | |
| 	jr z.ps
 | |
| zge:	jp m,loop
 | |
| 	jr zgo
 | |
| 
 | |
| 
 | |
| zgt.l:	ld iy,zgt
 | |
| 	jr z.pl
 | |
| zgt.s0:	ld iy,zgt
 | |
| 	jr z.ps
 | |
| zgt:	jp m,loop
 | |
| 	jr nz,zgo
 | |
| 	xor a
 | |
| 	add a,l
 | |
| 	jr z,loop
 | |
| 	jr zgo
 | |
| 
 | |
| 
 | |
| ! ------------------- ARRAY REFERENCE GROUP ---------------------------
 | |
| 
 | |
| ! AAR
 | |
| aar.z:
 | |
| 	ld iy,aar.2
 | |
| 	jr pop2
 | |
| aar.l:	call long2
 | |
| aar.2:	ld hl,loop
 | |
| aarint:	pop iy		! descriptor
 | |
| 	ex (sp),hl	! save return address and hl:=index
 | |
| 	ld e,(iy+0)
 | |
| 	ld d,(iy+1)	! de := lwb
 | |
| 	ld a,h
 | |
| 	xor d
 | |
| 	jp m,1f
 | |
| 	sbc hl,de
 | |
| 	jr 2f
 | |
| 1:	sbc hl,de
 | |
| 	xor d
 | |
| 2:	call m,e.array
 | |
| 	ld e,(iy+2)
 | |
| 	ld d,(iy+3)	! de := upb - lwb
 | |
| 	push hl
 | |
| 	ex de,hl
 | |
| 	ld a,h
 | |
| 	xor d
 | |
| 	jp m,1f
 | |
| 	sbc hl,de
 | |
| 	jr 2f
 | |
| 1:	xor d
 | |
| 2:	ex de,hl
 | |
| 	pop hl
 | |
| 	call m,e.array
 | |
| 1:	ld e,(iy+4)
 | |
| 	ld d,(iy+5)
 | |
| 	pop iy
 | |
| 	ex (sp),iy
 | |
| 	push iy		! exchange base address and return address
 | |
| 	push de
 | |
| 	push de
 | |
| 	push hl
 | |
| 	ld iy,1f
 | |
| 	jr mliint
 | |
| 1:	pop de
 | |
| 	pop iy
 | |
| 	pop hl
 | |
| 	push iy
 | |
| 	add hl,de
 | |
| 	pop de
 | |
| 	ex (sp),hl
 | |
| 	jp (hl)
 | |
| 
 | |
| lar.l:	call long2
 | |
| lar.2:	ld hl,loi
 | |
| 	jr aarint
 | |
| lar.z:
 | |
| 	ld iy,lar.2
 | |
| 	jr pop2
 | |
| 
 | |
| 
 | |
| sar.l:	call long2
 | |
| sar.2:	ld hl,sti
 | |
| 	jr aarint
 | |
| sar.z:
 | |
| 	ld iy,sar.2
 | |
| 	jr pop2
 | |
| 
 | |
| 
 | |
| ! --------------------- PROCEDURE CALL/RETURN --------------------------
 | |
| 
 | |
| ! CAL
 | |
| 
 | |
| cal.1: cal.2: cal.3: cal.4: cal.5: cal.6: cal.7: cal.8:
 | |
| cal.9: cal.10: cal.11: cal.12: cal.13: cal.14: cal.15: cal.16:
 | |
| cal.17: cal.18: cal.19: cal.20: cal.21: cal.22: cal.23: cal.24:
 | |
| cal.25: cal.26: cal.27: cal.28:
 | |
| 	ld hl,-b_cal
 | |
| 	add hl,de
 | |
| 	ex de,hl
 | |
| 	jr cal
 | |
| 
 | |
| cal.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| cal.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| cal:	push ix		! entry point for main program of interpreter
 | |
| 	push bc
 | |
| 	ld hl,(eb)
 | |
| 	push hl
 | |
| 	ld hl,(ebp4)
 | |
| 	push hl
 | |
| ! temporary tracing facility
 | |
| ! NOP it if you don't want it
 | |
| 	push de
 | |
| 	ld de,(ebp4)
 | |
| 	ld hl,(eb)
 | |
| 	call prline
 | |
| 	pop de
 | |
| ! end of temporary tracing
 | |
| 	ld hl,0
 | |
| 	add hl,sp
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	ld hl,(pd)
 | |
| 	ex de,hl
 | |
| 	add hl,hl
 | |
| 	add hl,hl
 | |
| 	add hl,de
 | |
| 	push hl
 | |
| 	pop iy
 | |
| 	ld e,(iy+0)
 | |
| 	ld d,(iy+1)
 | |
| 	ld l,c
 | |
| 	ld h,b
 | |
| 	xor a
 | |
| 	sbc hl,de
 | |
| 	ld sp,hl
 | |
| 	ld e,(iy+2)
 | |
| 	ld d,(iy+3)
 | |
| 	ld ix,0
 | |
| 	add ix,de
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! CAI
 | |
| 
 | |
| cai.z:	pop de
 | |
| 	jr cal
 | |
| 
 | |
| 
 | |
| ! LFR
 | |
| lfr.z:	pop de
 | |
| 2:	ld a,e
 | |
| 	rr a
 | |
| 	cp 5
 | |
| 	jp p,eilsize	! only result sizes <= 8 are allowed
 | |
| 	ld hl,retarea
 | |
| 	add hl,de
 | |
| 1:	dec hl
 | |
| 	ld d,(hl)
 | |
| 	dec hl
 | |
| 	ld e,(hl)
 | |
| 	push de
 | |
| 	dec a
 | |
| 	jr nz,1b
 | |
| 	jr loop
 | |
| 
 | |
| lfr.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| lfr.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 2b
 | |
| 
 | |
| lfr.2:	ld hl,(retarea)
 | |
| 	jr phl
 | |
| 
 | |
| lfr.4:	ld de,4
 | |
| 	jr 2b
 | |
| 
 | |
| 
 | |
| ! RET
 | |
| ret.2:	ld a,1
 | |
| 	jr 3f
 | |
| 
 | |
| ret.z:	pop de
 | |
| 2:	ld a,d
 | |
| 	or e
 | |
| 	jr z,ret.0
 | |
| 	rr a
 | |
| 	cp 5
 | |
| 	jp p,eilsize	! only result sizes <= 8 bytes are allowed
 | |
| 3:	ld hl,retarea
 | |
| 1:	pop de
 | |
| 	ld (hl),e
 | |
| 	inc hl
 | |
| 	ld (hl),d
 | |
| 	inc hl
 | |
| 	dec a
 | |
| 	jr nz,1b
 | |
| ret.0:
 | |
| 	ld h,b
 | |
| 	ld l,c
 | |
| 	ld sp,hl
 | |
| 	pop hl
 | |
| 	ld (ebp4),hl
 | |
| 	pop hl
 | |
| 	ld (eb),hl
 | |
| 	pop bc		! old LB
 | |
| 	pop ix		! reta
 | |
| 	push ix		! check to see if reta = boot (= 0)
 | |
| 	pop hl
 | |
| 	ld a,l
 | |
| 	or h
 | |
| 	jr nz,loop	! not done yet
 | |
| 	call uxfinish
 | |
| 	jr boot
 | |
| 
 | |
| ret.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| ret.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	jr 2b
 | |
| 
 | |
| 
 | |
| ! ------------------------- MISCELLANEOUS -----------------------------
 | |
| 
 | |
| ! SIG, TRP, RTT
 | |
| 
 | |
| sig.z:
 | |
| 	ld hl,(trapproc)
 | |
| 	ex (sp),hl
 | |
| 	ld (trapproc),hl
 | |
| 	jr loop
 | |
| 
 | |
| trp.z:
 | |
| 	ex (sp),hl
 | |
| 	push de
 | |
| 	push af
 | |
| 	push ix
 | |
| 	push iy
 | |
| 	push bc
 | |
| !	ld iy,trapproc
 | |
| !	ld a,(iy)
 | |
| !	or (iy+1)
 | |
| !	jr nz,1f
 | |
| 	ld iy,2f+13
 | |
| 	call octnr
 | |
| 	ld c,printstring
 | |
| 	ld de,2f
 | |
| 	call bdos
 | |
| 	ld de,(ebp4)
 | |
| 	ld hl,(eb)
 | |
| 	call prline
 | |
| 0:
 | |
| 	pop iy		! LB
 | |
| 	ld a,(iy+6)
 | |
| 	or (iy+7)	! reta
 | |
| 	jr nz,3f
 | |
| 	call uxfinish
 | |
| 	jp boot
 | |
| 3:
 | |
| 	ld c,(iy+4)
 | |
| 	ld b,(iy+5)
 | |
| 	push bc		! next LB
 | |
| 	ld e,(iy)
 | |
| 	ld d,(iy+1)	! file name
 | |
| 	ld l,(iy+2)
 | |
| 	ld h,(iy+3)	! lineno
 | |
| 	call prline
 | |
| 	jr 0b
 | |
| !1:
 | |
| !	ld ix,0
 | |
| !	push hl
 | |
| !	ld hl,(trapproc)
 | |
| !	push hl
 | |
| !	ld hl,0
 | |
| !	ld (trapproc),hl
 | |
| !	jr cai.z
 | |
| 2:	.ascii 'error 0xxxxxx\r\n$'
 | |
| 
 | |
| prline:
 | |
| ! prints lineno (hl) and filename (de)
 | |
| 	push de
 | |
| 	ld iy,2f+12
 | |
| 	call octnr
 | |
| 	ld c,printstring
 | |
| 	ld de,2f
 | |
| 	call bdos
 | |
| 	pop de
 | |
| 	ld hl,4f
 | |
| 0:
 | |
| 	ld a,(de)
 | |
| 	or a
 | |
| 	jr z,1f
 | |
| 	ld (hl),a
 | |
| 	inc de
 | |
| 	inc hl
 | |
| 	jr 0b
 | |
| 1:
 | |
| 	ld (hl),36	! '$'
 | |
| 	ld de,4f
 | |
| 	ld c,printstring
 | |
| 	call bdos
 | |
| 	ld de,3f
 | |
| 	ld c,printstring
 | |
| 	call bdos
 | |
| 	ret
 | |
| 2:	.ascii 'line 0xxxxxx in $'
 | |
| 3:	.ascii '\r\n$'
 | |
| 4:	.space 12
 | |
| 
 | |
| rtt.z=ret.0
 | |
| 
 | |
| 
 | |
| 
 | |
| ! NOP
 | |
| ! changed into output routine to print linenumber
 | |
| ! in octal (6 digits)
 | |
| 
 | |
| nop.z:	push bc
 | |
| 	ld iy,1f+12
 | |
| 	ld hl,(eb)
 | |
| 	call octnr
 | |
| 	ld iy,1f+20
 | |
| 	ld hl,0
 | |
| 	add hl,sp
 | |
| 	call octnr
 | |
| 	ld c,printstring
 | |
| 	ld de,1f
 | |
| 	call bdos
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| 1:	.ascii 'test 0xxxxxx 0xxxxxx\r\n$'
 | |
| 
 | |
| octnr:
 | |
| 	ld b,6
 | |
| 1:	ld a,7
 | |
| 	and l
 | |
| 	add a,'0'
 | |
| 	dec iy
 | |
| 	ld (iy+0),a
 | |
| 	srl h
 | |
| 	rr l
 | |
| 	srl h
 | |
| 	rr l
 | |
| 	srl h
 | |
| 	rr l
 | |
| 	djnz 1b
 | |
| 	ret
 | |
| 
 | |
| 
 | |
| ! DUP
 | |
| 
 | |
| dup.2:	pop hl
 | |
| 	push hl
 | |
| 	jr phl
 | |
| 
 | |
| dus.z:
 | |
| 	ld iy,1f
 | |
| 	jr pop2
 | |
| dus.l:	call long2
 | |
| 1:	push bc
 | |
| 	pop iy
 | |
| 	pop bc
 | |
| 	jr dodup
 | |
| dup.l:
 | |
| 	push bc
 | |
| 	pop iy
 | |
| 	ld b,(ix)
 | |
| 	inc ix
 | |
| 	ld c,(ix)
 | |
| 	inc ix
 | |
| dodup:	ld h,d
 | |
| 	ld l,d		! ld hl,0
 | |
| 	add hl,sp
 | |
| 	ld d,h
 | |
| 	ld e,l
 | |
| 	xor a
 | |
| 	sbc hl,bc
 | |
| 	ld sp,hl
 | |
| 	ex de,hl
 | |
| 	ldir
 | |
| 	push iy
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! BLM, BLS
 | |
| bls.z:
 | |
| 	ld iy,blm
 | |
| 	jr pop2
 | |
| bls.l:	call long2
 | |
| blm:
 | |
| 	push bc
 | |
| 	pop iy
 | |
| 	pop bc
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	ldir
 | |
| 	push iy
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| 
 | |
| blm.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| blm.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	push de
 | |
| 	jr blm
 | |
| 
 | |
| 
 | |
| ! ASP, ASS
 | |
| ass.z:
 | |
| 	ld iy,1f
 | |
| 	jr pop2
 | |
| ass.l:	call long2
 | |
| 1:	pop hl
 | |
| 	jr 1f
 | |
| asp.l:
 | |
| 	ld h,(ix)
 | |
| 	inc ix
 | |
| 	ld l,(ix)
 | |
| 	inc ix
 | |
| asp:	add hl,hl
 | |
| 1:	add hl,sp
 | |
| 	ld sp,hl
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| asp.2: asp.4: asp.6: asp.8: asp.10:
 | |
| 	ld hl,-b_asp
 | |
| 	add hl,de
 | |
| 	jr asp
 | |
| 
 | |
| asp.w0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ex de,hl
 | |
| 	jr asp
 | |
| 
 | |
| 
 | |
| ! CSA
 | |
| 
 | |
| csa.z:
 | |
| 	ld iy,csa.2
 | |
| 	jr pop2
 | |
| csa.l:	call long2
 | |
| csa.2:
 | |
| !! temporary version while bug in cem remains
 | |
| !	pop iy
 | |
| !	pop de
 | |
| !	push bc
 | |
| !	ld c,(iy)
 | |
| !	ld b,(iy+1)
 | |
| !	ld l,(iy+4)
 | |
| !	ld h,(iy+5)
 | |
| !	xor a
 | |
| !	sbc hl,de
 | |
| !	jp m,1f
 | |
| !	ex de,hl
 | |
| !	ld e,(iy+2)
 | |
| !	ld d,(iy+3)
 | |
| !	xor a
 | |
| !	sbc hl,de
 | |
| !	jp m,1f
 | |
| ! end of temporary piece
 | |
| 	pop iy
 | |
| 	pop hl
 | |
| 	push bc
 | |
| 	ld c,(iy)
 | |
| 	ld b,(iy+1)
 | |
| 	ld e,(iy+2)
 | |
| 	ld d,(iy+3)
 | |
| 	xor a
 | |
| 	sbc hl,de
 | |
| 	jp m,1f
 | |
| 	ex de,hl
 | |
| 	ld l,(iy+4)
 | |
| 	ld h,(iy+5)
 | |
| 	xor a
 | |
| 	sbc hl,de
 | |
| 	jp m,1f
 | |
| 	ex de,hl
 | |
| 	add hl,hl
 | |
| 	ld de,6
 | |
| 	add hl,de
 | |
| 	ex de,hl
 | |
| 	add iy,de
 | |
| 	ld l,(iy)
 | |
| 	ld h,(iy+1)
 | |
| 	ld a,h
 | |
| 	or l
 | |
| 	jr nz,2f
 | |
| 1:	ld a,b
 | |
| 	or c
 | |
| 	jr z,e.case
 | |
| 	ld l,c
 | |
| 	ld h,b
 | |
| 2:	pop bc
 | |
| 	push hl
 | |
| 	pop ix
 | |
| 	jr loop
 | |
| ! CSB
 | |
| 
 | |
| csb.z:
 | |
| 	ld iy,csb.2
 | |
| 	jr pop2
 | |
| csb.l:	call long2
 | |
| csb.2:
 | |
| 	pop ix
 | |
| 	pop iy
 | |
| 	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	push de
 | |
| 	ex (sp),iy
 | |
| 	pop de
 | |
| 	push bc
 | |
| 	ld c,(ix)
 | |
| 	inc ix
 | |
| 	ld b,(ix)
 | |
| 	inc ix
 | |
| 1:
 | |
| 	ld a,b
 | |
| 	or c
 | |
| 	jr z,noteq
 | |
| 	ld a,(ix+0)
 | |
| 	cp e
 | |
| 	jr nz,2f
 | |
| 	ld a,(ix+1)
 | |
| 	cp d
 | |
| 	jr nz,2f
 | |
| 	ld l,(ix+2)
 | |
| 	ld h,(ix+3)
 | |
| 	jr 3f
 | |
| 2:	inc ix
 | |
| 	inc ix
 | |
| 	inc ix
 | |
| 	inc ix
 | |
| 	dec bc
 | |
| 	jr 1b
 | |
| noteq:	push iy
 | |
| 	pop hl
 | |
| 3:	ld a,l
 | |
| 	or h
 | |
| 	jr z,e.case
 | |
| 2:
 | |
| 	pop bc
 | |
| 	push hl
 | |
| 	pop ix
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! LIN
 | |
| lin.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| lin.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld (eb),de
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! FIL
 | |
| fil.z:	pop hl
 | |
| 1:
 | |
| 	ld (ebp4),hl
 | |
| 	jr loop
 | |
| 
 | |
| fil.l:	ld h,(ix)
 | |
| 	inc ix
 | |
| 	ld l,(ix)
 | |
| 	inc ix
 | |
| 	ld de,eb
 | |
| 	add hl,de
 | |
| 	jr 1b
 | |
| 
 | |
| 
 | |
| ! LNI
 | |
| lni.z:	ld hl,(eb)
 | |
| 	inc hl
 | |
| 	ld (eb),hl
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! RCK
 | |
| rck.z:
 | |
| 	ld iy,rck.2
 | |
| 	jr pop2
 | |
| rck.l:	call long2
 | |
| rck.2:
 | |
| 	pop iy
 | |
| 3:	pop hl
 | |
| 	push hl
 | |
| 	ld e,(iy)
 | |
| 	ld d,(iy+1)
 | |
| 	ld a,h
 | |
| 	xor d		! check sign bit to catch overflow with subtract
 | |
| 	jp m,1f
 | |
| 	sbc hl,de
 | |
| 	jr 2f
 | |
| 1:	xor d		! now a equals (original) h again
 | |
| 2:	call m,e.rck
 | |
| 	pop de
 | |
| 	push de
 | |
| 	ld l,(iy+2)
 | |
| 	ld h,(iy+3)
 | |
| 	ld a,h
 | |
| 	xor d		! check sign bit to catch overflow with subtract
 | |
| 	jp m,1f
 | |
| 	sbc hl,de
 | |
| 	jr 2f
 | |
| 1:	xor d		! now a equals (original) h again
 | |
| 2:	call m,e.rck
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! LIM
 | |
| lim.z:	ld hl,(ignmask)
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| ! SIM
 | |
| sim.z:	pop de
 | |
| 	ld (ignmask),de
 | |
| 	jr loop
 | |
| 
 | |
| 
 | |
| ! LOR
 | |
| 
 | |
| lor.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld a,d
 | |
| 	or e
 | |
| 	jr nz,1f
 | |
| 	push bc
 | |
| 	jr loop
 | |
| 1:	ld hl,-1
 | |
| 	adc hl,de
 | |
| 	jr nz,1f
 | |
| 	add hl,sp
 | |
| 	jr phl
 | |
| 1:	ld hl,(hp)
 | |
| 	jr phl
 | |
| 
 | |
| 
 | |
| ! STR
 | |
| 
 | |
| str.s0:	ld e,(ix)
 | |
| 	inc ix
 | |
| 	ld a,d
 | |
| 	or e
 | |
| 	jr nz,1f
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| 1:	pop hl
 | |
| 	dec de
 | |
| 	ld a,d
 | |
| 	or e
 | |
| 	jr nz,1f
 | |
| 	ld sp,hl
 | |
| 	jr loop
 | |
| 1:	ld (hp),hl
 | |
| 	jr loop
 | |
| 
 | |
| ! Floating point calling routines
 | |
| 
 | |
| loadfregs:
 | |
| 	pop hl
 | |
| 	pop de
 | |
| 	ld (fpac),de
 | |
| 	pop de
 | |
| 	ld (fpac+2),de
 | |
| 	pop de
 | |
| 	ld (fpop),de
 | |
| 	pop de
 | |
| 	ld (fpop+2),de
 | |
| 	jp (hl)
 | |
| 
 | |
| dofltop:
 | |
| 	call loadfregs
 | |
| 	push bc
 | |
| 	push ix
 | |
| 	ld hl,1f
 | |
| 	push hl
 | |
| 	push iy
 | |
| 	ret		! really a call
 | |
| 1:
 | |
| 	pop ix
 | |
| 	pop bc
 | |
| 	ld hl,(fpac+2)
 | |
| 	push hl
 | |
| 	ld hl,(fpac)
 | |
| 	jr phl
 | |
| 
 | |
| pop4:
 | |
| 	pop hl
 | |
| 	or h
 | |
| 	jr nz,9f
 | |
| 	ld a,l
 | |
| 	cp 4
 | |
| 	jr nz,9f
 | |
| 	jp (iy)
 | |
| arg4:
 | |
| 	or d
 | |
| 	jr nz,9f
 | |
| 	ld a,(ix)
 | |
| 	inc ix
 | |
| 	cp 4
 | |
| 	jr nz,9f
 | |
| 	jp (iy)
 | |
| 9:	jr unimpld
 | |
| 
 | |
| adf.z:	ld iy,doadf
 | |
| 	jr pop4
 | |
| adf.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| adf.s0:	ld iy,doadf
 | |
| 	jr arg4
 | |
| doadf:
 | |
| 	ld iy,fpadd	! routine to call
 | |
| 	jr dofltop
 | |
| 
 | |
| sbf.z:	ld iy,dosbf
 | |
| 	jr pop4
 | |
| sbf.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| sbf.s0:	ld iy,dosbf
 | |
| 	jr arg4
 | |
| dosbf:
 | |
| 	ld iy,fpsub	! routine to call
 | |
| 	jr dofltop
 | |
| 
 | |
| mlf.z:	ld iy,domlf
 | |
| 	jr pop4
 | |
| mlf.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| mlf.s0:	ld iy,domlf
 | |
| 	jr arg4
 | |
| domlf:
 | |
| 	ld iy,fpmult	! routine to call
 | |
| 	jr dofltop
 | |
| 
 | |
| dvf.z:	ld iy,dodvf
 | |
| 	jr pop4
 | |
| dvf.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| dvf.s0:	ld iy,dodvf
 | |
| 	jr arg4
 | |
| dodvf:
 | |
| 	ld iy,fpdiv	! routine to call
 | |
| 	jr dofltop
 | |
| 
 | |
| cmf.z:	ld iy,docmf
 | |
| 	jr pop4
 | |
| cmf.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| cmf.s0:	ld iy,docmf
 | |
| 	jr arg4
 | |
| docmf:
 | |
| 	call loadfregs
 | |
| 	push bc
 | |
| 	push ix
 | |
| 	call fpcmf
 | |
| 	pop ix
 | |
| 	pop bc
 | |
| 	ld hl,(fpac)
 | |
| 	jr phl
 | |
| cfi.z:
 | |
| 	pop de
 | |
| 	call chk24
 | |
| 	.data2 1f,0f
 | |
| 1:	ld iy,1f
 | |
| 	jr pop4
 | |
| 1:	pop hl
 | |
| 	ld (fpac),hl
 | |
| 	pop hl
 | |
| 	ld (fpac+2),hl
 | |
| 	push bc
 | |
| 	push ix
 | |
| 	call fpcfi
 | |
| 	pop ix
 | |
| 	pop bc
 | |
| 	ld hl,(fpac)
 | |
| 	jr phl
 | |
| 0:	ld iy,1f
 | |
| 	jr pop4
 | |
| 1:	pop hl
 | |
| 	ld (fpac),hl
 | |
| 	pop hl
 | |
| ld (fpac+2),hl!
 | |
| 	push bc
 | |
| 	push ix
 | |
| 	call fpcfd
 | |
| 	jr 8f
 | |
| cif.z:
 | |
| 	ld iy,1f
 | |
| 	jr pop4
 | |
| 1:
 | |
| 	pop de
 | |
| 	call chk24
 | |
| 	.data2 1f,0f
 | |
| 1:	pop hl
 | |
| 	ld (fpac),hl
 | |
| 	push bc
 | |
| 	push ix
 | |
| 	call fpcif
 | |
| 8:	pop ix
 | |
| 	pop bc
 | |
| 	ld hl,(fpac+2)
 | |
| 	push hl
 | |
| 	ld hl,(fpac)
 | |
| 	jr phl
 | |
| 0:	pop hl
 | |
| 	ld (fpac),hl
 | |
| 	pop hl
 | |
| 	ld (fpac+2),hl
 | |
| 	push bc
 | |
| 	push ix
 | |
| 	call fpcdf
 | |
| 	jr 8b
 | |
| 
 | |
| ngf.l:	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld iy,1f
 | |
| 	jr arg4
 | |
| ngf.z:
 | |
| 	ld iy,1f
 | |
| 	jr pop4
 | |
| 1:	pop hl
 | |
| 	ld (fpac),hl
 | |
| 	pop hl
 | |
| 	ld (fpac+2),hl
 | |
| 	push bc
 | |
| 	push ix
 | |
| 	call fpcomp
 | |
| 	jr 8b
 | |
| 
 | |
| fif.z:
 | |
| 	ld iy,1f
 | |
| 	jr pop4
 | |
| fif.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld iy,1f
 | |
| 	jr arg4
 | |
| 1:	call loadfregs
 | |
| 	push bc
 | |
| 	push ix
 | |
| 	call fpfif
 | |
| 	pop ix
 | |
| 	pop bc
 | |
| 	ld hl,(fpac+2)
 | |
| 	push hl
 | |
| 	ld hl,(fpac)
 | |
| 	push hl
 | |
| 	ld hl,(fpop+2)
 | |
| 	push hl
 | |
| 	ld hl,(fpop)
 | |
| 	jr phl
 | |
| 
 | |
| fef.z:
 | |
| 	ld iy,1f
 | |
| 	jr pop4
 | |
| fef.l:
 | |
| 	ld d,(ix)
 | |
| 	inc ix
 | |
| 	ld iy,1f
 | |
| 	jr arg4
 | |
| 1:	pop hl
 | |
| 	ld (fpop),hl
 | |
| 	pop hl
 | |
| 	ld (fpop+2),hl
 | |
| 	push bc
 | |
| 	push ix
 | |
| 	call fpfef
 | |
| 	pop ix
 | |
| 	pop bc
 | |
| 	ld hl,(fpop+2)
 | |
| 	push hl
 | |
| 	ld hl,(fpop)
 | |
| 	push hl
 | |
| 	ld hl,(fpac)
 | |
| 	jr phl
 | |
| 
 | |
| ! double aritmetic
 | |
| 
 | |
| adi.4:
 | |
| 	push bc
 | |
| 	pop iy
 | |
| 	pop hl
 | |
| 	pop de
 | |
| 	pop bc
 | |
| 	add hl,bc
 | |
| 	ex de,hl
 | |
| 	pop bc
 | |
| 	adc hl,bc
 | |
| 	push hl
 | |
| 	push de
 | |
| 	push iy
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| sbi.4:
 | |
| 	push bc
 | |
| 	pop iy
 | |
| 	pop bc
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	sbc hl,bc
 | |
| 	ex de,hl
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	pop hl
 | |
| 9:
 | |
| 	sbc hl,bc
 | |
| 	push hl
 | |
| 	push de
 | |
| 	push iy
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| ngi.4:
 | |
| 	push bc
 | |
| 	pop iy
 | |
| 	ld hl,0
 | |
| 	pop de
 | |
| 	sbc hl,de
 | |
| 	ex de,hl
 | |
| 	ld hl,0
 | |
| 	pop bc
 | |
| 	jr 9b
 | |
| mli.4:
 | |
| 	ld iy,.mli4
 | |
| 0:
 | |
| 	ld (retarea),bc
 | |
| 	ld (retarea+2),ix
 | |
| 	ld hl,1f
 | |
| 	push hl
 | |
| 	push iy
 | |
| 	ret
 | |
| 1:
 | |
| 	ld bc,(retarea)
 | |
| 	ld ix,(retarea+2)
 | |
| 	jr loop
 | |
| dvu.4:
 | |
| 	ld iy,.dvu4
 | |
| 	jr 0b
 | |
| 	
 | |
| dvi.4:
 | |
| 	ld iy,.dvi4
 | |
| 	jr 0b
 | |
| 	
 | |
| ! list of not yet implemented instructions
 | |
| cuf.z:
 | |
| cff.z:
 | |
| cfu.z:
 | |
| unimpld:		! used in dispatch table to
 | |
| 			! catch unimplemented instructions
 | |
| 	ld hl,EILLINS
 | |
| 9:	push hl
 | |
| 	jr trp.z
 | |
| 
 | |
| eilsize:
 | |
| 	ld hl,EILLSIZE
 | |
| 	jr 9b
 | |
| 
 | |
| e.case:
 | |
| 	ld hl,ECASE
 | |
| 	jr 9b
 | |
| e.mon:
 | |
| 	ld hl,EMON
 | |
| 	jr 9b
 | |
| e.array:
 | |
| 	push af
 | |
| 	ld a,(ignmask)
 | |
| 	bit 0,a
 | |
| 	jr nz,8f
 | |
| 	ld hl,EARRAY
 | |
| 	jr 9b
 | |
| e.rck:
 | |
| 	push af
 | |
| 	ld a,(ignmask)
 | |
| 	bit 1,a
 | |
| 	jr nz,8f
 | |
| 	ld hl,ERANGE
 | |
| 	jr 9b
 | |
| 8:
 | |
| 	pop af
 | |
| 	ret
 | |
| 
 | |
| long2:	ld a,(ix)
 | |
| 	inc ix
 | |
| 	or a
 | |
| 	jr nz,unimpld
 | |
| 	ld a,(ix)
 | |
| 	inc ix
 | |
| 	cp 2
 | |
| 	jr nz,unimpld
 | |
| 	xor a		! clear carry
 | |
| 	ret
 | |
| 
 | |
| ! monitor instruction
 | |
| ! a small collection of UNIX system calls implemented under CP/M
 | |
| 
 | |
| 	ux_indir=e.mon
 | |
| 	ux_fork=e.mon
 | |
| 	ux_wait=e.mon
 | |
| 	ux_link=e.mon
 | |
| 	ux_exec=e.mon
 | |
| 	ux_chdir=e.mon
 | |
| 	ux_mknod=e.mon
 | |
| 	ux_chmod=e.mon
 | |
| 	ux_chown=e.mon
 | |
| 	ux_break=e.mon
 | |
| 	ux_stat=e.mon
 | |
| 	ux_seek=e.mon
 | |
| 	ux_mount=e.mon
 | |
| 	ux_umount=e.mon
 | |
| 	ux_setuid=e.mon
 | |
| 	ux_getuid=e.mon
 | |
| 	ux_stime=e.mon
 | |
| 	ux_ptrace=e.mon
 | |
| 	ux_alarm=e.mon
 | |
| 	ux_fstat=e.mon
 | |
| 	ux_pause=e.mon
 | |
| 	ux_utime=e.mon
 | |
| 	ux_stty=e.mon
 | |
| 	ux_gtty=e.mon
 | |
| 	ux_access=e.mon
 | |
| 	ux_nice=e.mon
 | |
| 	ux_sync=e.mon
 | |
| 	ux_kill=e.mon
 | |
| 	ux_dup=e.mon
 | |
| 	ux_pipe=e.mon
 | |
| 	ux_times=e.mon
 | |
| 	ux_prof=e.mon
 | |
| 	ux_unused=e.mon
 | |
| 	ux_setgid=e.mon
 | |
| 	ux_getgid=e.mon
 | |
| 	ux_sig=e.mon
 | |
| 	ux_umask=e.mon
 | |
| 	ux_chroot=e.mon
 | |
| 
 | |
| 	EPERM	= 1
 | |
| 	ENOENT	= 2
 | |
| 	ESRCH	= 3
 | |
| 	EINTR	= 4
 | |
| 	EIO	= 5
 | |
| 	ENXIO	= 6
 | |
| 	E2BIG	= 7
 | |
| 	ENOEXEC	= 8
 | |
| 	EBADF	= 9
 | |
| 	ECHILD	= 10
 | |
| 	EAGAIN	= 11
 | |
| 	ENOMEM	= 12
 | |
| 	EACCES	= 13
 | |
| 	EFAULT	= 14
 | |
| 	ENOTBLK	= 15
 | |
| 	EBUSY	= 16
 | |
| 	EEXIST	= 17
 | |
| 	EXDEV	= 18
 | |
| 	ENODEV	= 19
 | |
| 	ENOTDIR	= 20
 | |
| 	EISDIR	= 21
 | |
| 	EINVAL	= 22
 | |
| 	ENFILE	= 23
 | |
| 	EMFILE	= 24
 | |
| 	ENOTTY	= 25
 | |
| 	ETXTBSY	= 26
 | |
| 	EFBIG	= 27
 | |
| 	ENOSPC	= 28
 | |
| 	ESPIPE	= 29
 | |
| 	EROFS	= 30
 | |
| 	EMLINK	= 31
 | |
| 	EPIPE	= 32
 | |
| 	EDOM	= 33
 | |
| ! Structure of filearea maintained by this implementation
 | |
| ! First iobuffer of 128 bytes
 | |
| ! Then the fcb area of 36 bytes
 | |
| ! The number of bytes left in the buffer, 1 byte
 | |
| ! The iopointer into the buffer, 2 bytes
 | |
| ! The openflag 0 unused, 1 reading, 2 writing, 1 byte
 | |
| ! The filedescriptor starting at 3, 1 byte
 | |
| ! The number of CTRL-Zs that have been absorbed, 1 byte
 | |
| ! The byte read after a sequence of CTRL-Zs, 1 byte
 | |
| 
 | |
| 	maxfiles=8
 | |
| 	filesize=128+36+1+2+1+1+1+1
 | |
| 
 | |
| 	filefcb=0	! pointers point to fcb
 | |
| 	position=33
 | |
| 	nleft=36
 | |
| 	iopointer=37
 | |
| 	openflag=39
 | |
| 	fildes=40
 | |
| 	zcount=41
 | |
| 	zsave=42
 | |
| 
 | |
| 	.assert [ filefcb] == 0
 | |
| 
 | |
| 0:	.space maxfiles*filesize
 | |
| 	filearea = 0b+128
 | |
| sibuf:
 | |
| 	.data2 0
 | |
| 	.space 82
 | |
| siptr:	.space 2
 | |
| saveargs:
 | |
| 	.space 128
 | |
| argv:	.space 40		! not more than 20 args
 | |
| argc:	.space 2
 | |
| ttymode:.data1 9,9,8,21;.data2 06310+RAW*040	! raw = 040
 | |
| 
 | |
| uxinit:
 | |
| 	xor a
 | |
| 	ld c,maxfiles
 | |
| 	ld hl,0b
 | |
| 1:	ld b,filesize
 | |
| 2:	ld (hl),a
 | |
| 	inc hl
 | |
| 	djnz 2b
 | |
| 	dec c
 | |
| 	jr nz,1b
 | |
| 	ret
 | |
| 
 | |
| uxfinish:
 | |
| 	ld a,maxfiles-1
 | |
| 1:	push af
 | |
| 	call closefil
 | |
| 	pop af
 | |
| 	dec a
 | |
| 	cp 0377
 | |
| 	jr nz,1b
 | |
| 	ret
 | |
| 
 | |
| makeargv:
 | |
| 	ld hl,0x80
 | |
| 	ld de,saveargs
 | |
| 	ld bc,128
 | |
| 	ldir
 | |
| 	ld hl,saveargs
 | |
| 	ld e,(hl)
 | |
| 	inc hl
 | |
| 	ld d,0
 | |
| 	add hl,de
 | |
| 	ld (hl),0
 | |
| 	ld hl,saveargs+1
 | |
| 	ld ix,argv
 | |
| 1:	ld a,(hl)
 | |
| 	or a
 | |
| 	jr z,9f
 | |
| 	cp ' '
 | |
| 	jr nz,2f
 | |
| 4:	ld (hl),0
 | |
| 	inc hl
 | |
| 	jr 1b
 | |
| 2:	ld (ix),l
 | |
| 	inc ix
 | |
| 	ld (ix),h
 | |
| 	inc ix
 | |
| 3:	inc hl
 | |
| 	ld a,(hl)
 | |
| 	or a
 | |
| 	jr z,9f
 | |
| 	cp ' '
 | |
| 	jr nz,3b
 | |
| 	jr 4b
 | |
| 9:	push ix
 | |
| 	pop hl
 | |
| 	ld de,argv
 | |
| 	or a
 | |
| 	sbc hl,de
 | |
| 	srl h;rr l
 | |
| 	ld (argc),hl
 | |
| 	ld (ix+0),0
 | |
| 	ld (ix+1),0
 | |
| 	ret
 | |
| 
 | |
| mon.z:
 | |
| 	pop de		! system call number
 | |
| 	xor a
 | |
| 	or d
 | |
| 	jr nz,unimpld	! too big
 | |
| 	ld a,e
 | |
| 	and 0300	! only 64 system calls
 | |
| 	jr nz,unimpld
 | |
| 	sla e
 | |
| 	ld hl,systab
 | |
| 	add hl,de
 | |
| 	ld e,(hl)
 | |
| 	inc hl
 | |
| 	ld d,(hl)
 | |
| 	ex de,hl
 | |
| 	jp (hl)
 | |
| 
 | |
| systab:	
 | |
| 	.data2 ux_indir
 | |
| 	.data2 ux_exit
 | |
| 	.data2 ux_fork
 | |
| 	.data2 ux_read
 | |
| 	.data2 ux_write
 | |
| 	.data2 ux_open
 | |
| 	.data2 ux_close
 | |
| 	.data2 ux_wait
 | |
| 	.data2 ux_creat
 | |
| 	.data2 ux_link
 | |
| 	.data2 ux_unlink
 | |
| 	.data2 ux_exec
 | |
| 	.data2 ux_chdir
 | |
| 	.data2 ux_time
 | |
| 	.data2 ux_mknod
 | |
| 	.data2 ux_chmod
 | |
| 	.data2 ux_chown
 | |
| 	.data2 ux_break
 | |
| 	.data2 ux_stat
 | |
| 	.data2 ux_seek
 | |
| 	.data2 ux_getpid
 | |
| 	.data2 ux_mount
 | |
| 	.data2 ux_umount
 | |
| 	.data2 ux_setuid
 | |
| 	.data2 ux_getuid
 | |
| 	.data2 ux_stime
 | |
| 	.data2 ux_ptrace
 | |
| 	.data2 ux_alarm
 | |
| 	.data2 ux_fstat
 | |
| 	.data2 ux_pause
 | |
| 	.data2 ux_utime
 | |
| 	.data2 ux_stty
 | |
| 	.data2 ux_gtty
 | |
| 	.data2 ux_access
 | |
| 	.data2 ux_nice
 | |
| 	.data2 ux_ftime
 | |
| 	.data2 ux_sync
 | |
| 	.data2 ux_kill
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 	.data2 ux_dup
 | |
| 	.data2 ux_pipe
 | |
| 	.data2 ux_times
 | |
| 	.data2 ux_prof
 | |
| 	.data2 ux_unused
 | |
| 	.data2 ux_setgid
 | |
| 	.data2 ux_getgid
 | |
| 	.data2 ux_sig
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 	.data2 ux_ioctl
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 	.data2 ux_exece
 | |
| 	.data2 ux_umask
 | |
| 	.data2 ux_chroot
 | |
| 	.data2 unimpld
 | |
| 	.data2 unimpld
 | |
| 
 | |
| emptyfile:
 | |
| 	! searches for a free filestructure
 | |
| 	! returns pointer in iy, 0 if not found
 | |
| 	ld iy,filearea
 | |
| 	ld l,maxfiles
 | |
| 1:
 | |
| 	xor a
 | |
| 	or (iy+openflag)
 | |
| 	jr nz,3f
 | |
| 	ld a,maxfiles+3
 | |
| 	sub l
 | |
| 	ld (iy+fildes),a
 | |
| #ifdef	CPM1
 | |
| 	push bc
 | |
| 	push iy
 | |
| 	ld de,-128
 | |
| 	add iy,de
 | |
| 	push iy
 | |
| 	pop de
 | |
| 	ld c,setdma
 | |
| 	call bdos
 | |
| 	pop iy
 | |
| 	pop bc
 | |
| 	or a		! to clear C
 | |
| #endif
 | |
| 	ret
 | |
| 3:
 | |
| 	ld de,filesize
 | |
| 	add iy,de
 | |
| 	dec l
 | |
| 	jr nz,1b
 | |
| 	scf
 | |
| 	ret
 | |
| 
 | |
| findfile:
 | |
| 	ld iy,filearea
 | |
| 	ld de,filesize
 | |
| 0:
 | |
| 	dec a
 | |
| 	ret m
 | |
| 	add iy,de
 | |
| 	jr 0b
 | |
| 
 | |
| getchar:
 | |
| 	push bc
 | |
| 	push de
 | |
| 	push hl
 | |
| 	dec (iy+nleft)
 | |
| 	jp p,0f
 | |
| 	push iy
 | |
| 	pop hl
 | |
| 	ld de,-128
 | |
| 	add hl,de
 | |
| 	ld (iy+iopointer),l
 | |
| 	ld (iy+iopointer+1),h
 | |
| 	ex de,hl
 | |
| 	push iy
 | |
| 	ld c,setdma
 | |
| 	call bdos
 | |
| #ifdef	CPM1
 | |
| 	ld c,seqread
 | |
| #else
 | |
| 	ld c,randomread
 | |
| #endif
 | |
| 	pop de
 | |
| 	call bdos
 | |
| 	or a
 | |
| 	jr z,1f
 | |
| 	ld (iy+zcount),0
 | |
| 	pop hl
 | |
| 	pop de
 | |
| 	pop bc
 | |
| 	scf
 | |
| 	ret
 | |
| 1:
 | |
| 	inc (iy+position)
 | |
| 	jr nz,2f
 | |
| 	inc (iy+position+1)
 | |
| 2:
 | |
| 	ld a,127
 | |
| 	ld (iy+nleft),a
 | |
| 0:
 | |
| 	ld h,(iy+iopointer+1)
 | |
| 	ld l,(iy+iopointer)
 | |
| 	ld a,(hl)
 | |
| 	inc hl
 | |
| 	ld (iy+iopointer),l
 | |
| 	ld (iy+iopointer+1),h
 | |
| 	pop hl
 | |
| 	pop de
 | |
| 	pop bc
 | |
| 	ret
 | |
| 	or a
 | |
| 
 | |
| putchar:
 | |
| 	push hl
 | |
| 	ld h,(iy+iopointer+1)
 | |
| 	ld l,(iy+iopointer)
 | |
| 	ld (hl),a
 | |
| 	dec (iy+nleft)
 | |
| 	jr z,0f
 | |
| 	inc hl
 | |
| 	ld (iy+iopointer+1),h
 | |
| 	ld (iy+iopointer),l
 | |
| 	pop hl
 | |
| 	ret
 | |
| 0:
 | |
| 	pop hl
 | |
| flsbuf:
 | |
| 	push hl
 | |
| 	push de
 | |
| 	push bc
 | |
| 	push iy
 | |
| 	pop hl
 | |
| 	ld de,-128
 | |
| 	add hl,de
 | |
| 	ld (iy+iopointer+1),h
 | |
| 	ld (iy+iopointer),l
 | |
| 	ex de,hl
 | |
| 	push iy
 | |
| 	ld c,setdma
 | |
| 	call bdos
 | |
| 	pop de
 | |
| #ifdef	CPM1
 | |
| 	ld c,seqwrite
 | |
| #else
 | |
| 	ld c,randomwrite
 | |
| #endif
 | |
| 	call bdos
 | |
| 	or a
 | |
| 	jr z,1f
 | |
| 	pop bc
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	scf
 | |
| 	ret
 | |
| 1:
 | |
| 	inc (iy+position)
 | |
| 	jr nz,2f
 | |
| 	inc (iy+position+1)
 | |
| 2:
 | |
| 	ld a,128
 | |
| 	ld (iy+nleft),a
 | |
| 	ld b,a
 | |
| 	push iy
 | |
| 	pop hl
 | |
| 	ld de,-128
 | |
| 	add hl,de
 | |
| 	ld a,26			! ctrl z
 | |
| 1:	ld (hl),a
 | |
| 	inc hl
 | |
| 	djnz 1b
 | |
| 	pop bc
 | |
| 	pop de
 | |
| 	pop hl
 | |
| 	or a
 | |
| 	ret
 | |
| 
 | |
| parsename:
 | |
| 	! parses file name pointed to by hl and fills in fcb
 | |
| 	! of the file pointed to by iy.
 | |
| 	! recognizes filenames as complicated as 'b:file.zot'
 | |
| 	! and as simple as 'x'
 | |
| 
 | |
| 	push bc
 | |
| 	push iy
 | |
| 	pop de
 | |
| 	xor a
 | |
| 	push de
 | |
| 	ld b,36		! sizeof fcb
 | |
| 0:	ld (de),a
 | |
| 	inc de
 | |
| 	djnz 0b
 | |
| 	pop de
 | |
| 	inc hl
 | |
| 	ld a,(hl)
 | |
| 	dec hl
 | |
| 	cp ':'		! drive specified ?
 | |
| 	jr nz,1f
 | |
| 	ld a,(hl)
 | |
| 	inc hl
 | |
| 	inc hl
 | |
| 	dec a
 | |
| 	and 15
 | |
| 	inc a		! now 1<= a <= 16
 | |
| 	ld (de),a
 | |
| 1:	inc de
 | |
| 	ld b,8		! filename maximum of 8 characters
 | |
| 1:	ld a,(hl)
 | |
| 	or a
 | |
| 	jr nz,8f
 | |
| 	dec hl
 | |
| 	ld a,'.'
 | |
| 8:
 | |
| 	inc hl
 | |
| 	cp '.'
 | |
| 	jr z,2f
 | |
| 	and 0177	! no parity
 | |
| 	bit 6,a
 | |
| 	jr z,9f
 | |
| 	and 0337	! UPPER case
 | |
| 9:
 | |
| 	ld (de),a
 | |
| 	inc de
 | |
| 	djnz 1b
 | |
| 	ld a,(hl)
 | |
| 	inc hl
 | |
| 	cp '.'
 | |
| 	jr z,3f
 | |
| 	ld a,' '
 | |
| 	ld (de),a
 | |
| 	inc de
 | |
| 	ld (de),a
 | |
| 	inc de
 | |
| 	ld (de),a
 | |
| 	pop bc
 | |
| 	ret		! filenames longer than 8 are truncated
 | |
| 2:	ld a,' '	! fill with spaces
 | |
| 0:	ld (de),a
 | |
| 	inc de
 | |
| 	djnz 0b
 | |
| 3:	ld b,3		! length of extension
 | |
| 1:	ld a,(hl)
 | |
| 	inc hl
 | |
| 	or a
 | |
| 	jr z,4f
 | |
| 	cp 0100
 | |
| 	jp m,2f
 | |
| 	and 0137
 | |
| 2:	ld (de),a
 | |
| 	inc de
 | |
| 	djnz 1b
 | |
| 	pop bc
 | |
| 	ret
 | |
| 4:	ld a,' '
 | |
| 0:	ld (de),a
 | |
| 	inc de
 | |
| 	djnz 0b
 | |
| 	pop bc
 | |
| 	ret
 | |
| 
 | |
| ! various routines
 | |
| ux_close:
 | |
| 	pop hl
 | |
| 	ld a,l
 | |
| 	sub 3
 | |
| 	jp m,1f
 | |
| 	cp maxfiles
 | |
| 	call m,closefil
 | |
| 1:	ld hl,0
 | |
| 	jr phl
 | |
| 
 | |
| closefil:
 | |
| 	call findfile
 | |
| 	ld a,(iy+openflag)
 | |
| 	or a
 | |
| 	jr z,3f
 | |
| 	ld (iy+openflag),0
 | |
| 	cp 1
 | |
| 	jr z,2f
 | |
| 	ld a,(iy+nleft)
 | |
| 	cp 128
 | |
| 	jr z,2f
 | |
| 	call flsbuf
 | |
| 2:
 | |
| 	push bc
 | |
| 	push iy
 | |
| 	pop de
 | |
| 	ld c,close
 | |
| 	call bdos
 | |
| 	pop bc
 | |
| 3:	ret
 | |
| 
 | |
| ux_ioctl:
 | |
| 	pop hl
 | |
| 	ld a,l
 | |
| 	sub 3
 | |
| 	jp p,1f
 | |
| 	pop hl
 | |
| 	ld a,h
 | |
| 	cp 't'
 | |
| 	jr nz,e.mon
 | |
| 	ld a,l
 | |
| 	cp 8
 | |
| 	jr z,tiocgetp
 | |
| 	cp 9
 | |
| 	jr z,tiocsetp
 | |
| 	jr e.mon
 | |
| 1:	pop hl
 | |
| 	pop hl
 | |
| 	ld hl,-1
 | |
| 	jr phl
 | |
| tiocgetp:
 | |
| 	pop de
 | |
| 	ld hl,ttymode
 | |
| 2:	push bc
 | |
| 	ld bc,6
 | |
| 	ldir
 | |
| 	ld h,b
 | |
| 	ld l,c
 | |
| 	pop bc
 | |
| 	jr phl
 | |
| tiocsetp:
 | |
| 	pop hl
 | |
| 	ld de,ttymode
 | |
| 	jr 2b
 | |
| 
 | |
| ux_time:
 | |
| 	call time4
 | |
| 	jr loop
 | |
| 
 | |
| ux_ftime:
 | |
| 	pop hl
 | |
| 	ld (retarea+6),hl
 | |
| 	call time4
 | |
| 	ld hl,(retarea+6)
 | |
| 	pop de
 | |
| 	ld (hl),e
 | |
| 	inc hl
 | |
| 	ld (hl),d
 | |
| 	inc hl
 | |
| 	pop de
 | |
| 	ld (hl),e
 | |
| 	inc hl
 | |
| 	ld (hl),d
 | |
| 	inc hl
 | |
| 	xor a
 | |
| 	ld (hl),a
 | |
| 	inc hl
 | |
| 	ld (hl),a
 | |
| 	inc hl
 | |
| 	ld (hl),a
 | |
| 	inc hl
 | |
| 	ld (hl),a
 | |
| 	inc hl
 | |
| 	ld (hl),a
 | |
| 	inc hl
 | |
| 	ld (hl),a
 | |
| 	jr loop
 | |
| 
 | |
| time4:
 | |
| 	pop hl
 | |
| 	ld (retarea),bc
 | |
| 	ld (retarea+2),ix
 | |
| 	ld (retarea+4),hl
 | |
| 	ld hl,(timebuf+2)
 | |
| 	push hl
 | |
| 	ld hl,(timebuf)
 | |
| 	push hl
 | |
| 	ld hl,0
 | |
| 	push hl
 | |
| 	ld hl,50
 | |
| 	push hl
 | |
| 	call .dvu4
 | |
| 	ld bc,(retarea)
 | |
| 	ld ix,(retarea+2)
 | |
| 	ld hl,(retarea+4)
 | |
| 	jp (hl)
 | |
| ux_exit:
 | |
| 	call uxfinish
 | |
| 	ld c,reset
 | |
| 	call bdos
 | |
| 	! no return
 | |
| 
 | |
| ux_creat:
 | |
| 	call emptyfile
 | |
| 	jr c,openfailed
 | |
| 	pop hl
 | |
| 	call parsename
 | |
| 	pop hl			! file mode, not used under CP/M
 | |
| 	push bc
 | |
| 	push iy
 | |
| 	push iy
 | |
| 	pop de
 | |
| 	ld c,delete
 | |
| 	call bdos
 | |
| 	pop de
 | |
| 	ld c,makefile
 | |
| 	call bdos
 | |
| 	pop bc
 | |
| 	ld l,1
 | |
| 	jr afteropen
 | |
| ux_open:
 | |
| 	call emptyfile
 | |
| 	jr nc,1f
 | |
| openfailed:
 | |
| 	pop hl
 | |
| 	pop hl		! remove params
 | |
| 	ld hl,EMFILE
 | |
| 	push hl
 | |
| 	jr phl
 | |
| 1:
 | |
| 	pop hl		! filename
 | |
| 	call parsename
 | |
| 	push bc
 | |
| 	ld c,open
 | |
| 	push iy
 | |
| 	pop de
 | |
| 	call bdos
 | |
| 	pop bc
 | |
| 	pop hl
 | |
| afteropen:
 | |
| 	inc a
 | |
| 	jr nz,1f
 | |
| 	ld hl,ENOENT
 | |
| 	push hl
 | |
| 	jr phl
 | |
| 1:
 | |
| 	inc l
 | |
| 	ld (iy+openflag),l
 | |
| 	xor a
 | |
| 	ld (iy+nleft),a
 | |
| 	ld (iy+zcount),a
 | |
| 	ld (iy+zsave),26
 | |
| 	bit 1,l
 | |
| 	jr z,2f
 | |
| 	ld (iy+nleft),128
 | |
| 2:
 | |
| 	ld (iy+position),a
 | |
| 	ld (iy+position+1),a
 | |
| 	push iy
 | |
| 	pop hl
 | |
| 	push bc
 | |
| 	ld b,128
 | |
| 3:	dec hl
 | |
| 	ld (hl),26
 | |
| 	djnz 3b
 | |
| 	pop bc
 | |
| 	ld (iy+iopointer+1),h
 | |
| 	ld (iy+iopointer),l
 | |
| 	ld h,a
 | |
| 	ld l,(iy+fildes)
 | |
| 	push hl
 | |
| 	ld l,a
 | |
| 	jr phl
 | |
| 
 | |
| ux_read:
 | |
| 	pop hl
 | |
| 	ld a,l
 | |
| 	sub 3
 | |
| 	jp p,readfile
 | |
| 	ld a,(ttymode+4)
 | |
| 	bit 5,a
 | |
| 	jr z,1f			! not raw
 | |
| 	push bc
 | |
| #ifdef	CPM1
 | |
| !raw echo interface
 | |
| 	ld c,consolein
 | |
| 	call bdos
 | |
| #else
 | |
| !no echo interface
 | |
| 4:
 | |
| 	ld c,diconio
 | |
| 	ld e,0xff
 | |
| 	call bdos
 | |
| 	or a
 | |
| 	jr z,4b
 | |
| !end of no echo interface
 | |
| #endif
 | |
| 	pop bc
 | |
| 	pop hl
 | |
| 	ld (hl),a
 | |
| 	pop hl
 | |
| 	ld hl,1
 | |
| 	push hl
 | |
| 	ld hl,0
 | |
| 	jr phl
 | |
| 1:
 | |
| 	ld hl,sibuf+1		! read from console assumed
 | |
| 	dec (hl)
 | |
| 	jp p,2f
 | |
| 	dec hl			! go read console line
 | |
| 	ld (hl),80		! max line length
 | |
| 	push bc
 | |
| 	push hl
 | |
| 	ld c,readconsole
 | |
| 	ex de,hl
 | |
| 	call bdos
 | |
| 	ld c,writeconsole
 | |
| 	ld e,'\n'
 | |
| 	call bdos
 | |
| 	pop hl
 | |
| 	pop bc
 | |
| 	inc hl
 | |
| 	inc (hl)
 | |
| 	ld (siptr),hl		! ready for transfer
 | |
| 	push hl
 | |
| 	ld e,(hl)
 | |
| 	ld d,0
 | |
| 	add hl,de
 | |
| 	ld (hl),'\r'
 | |
| 	inc hl
 | |
| 	ld (hl),'\n'
 | |
| 	pop hl
 | |
| 2:
 | |
| 	push bc
 | |
| 	pop iy
 | |
| 	ld b,(hl)
 | |
| 	inc b			! bytes remaining
 | |
| 	pop hl			! copy to
 | |
| 	pop de			! bytes wanted (probably 512)
 | |
| 	push iy
 | |
| 	ld iy,(siptr)		! copy from
 | |
| 	xor a			! find out minimum of ramaining and wanted
 | |
| 	or d
 | |
| 	jr nz,3f		! more than 255 wanted (forget that)
 | |
| 	ld a,b
 | |
| 	cp e
 | |
| 	jp m,3f			! not enough remaining
 | |
| 	ld b,e
 | |
| 3:
 | |
| 	ld c,b			! keep copy
 | |
| 0:
 | |
| 	inc iy
 | |
| 	ld a,(iy)
 | |
| 	ld (hl),a
 | |
| 	inc hl
 | |
| 	djnz 0b
 | |
| 	ld a,(sibuf+1)
 | |
| 	sub c
 | |
| 	inc a
 | |
| 	ld (sibuf+1),a
 | |
| 	ld (siptr),iy
 | |
| 	pop hl
 | |
| 	push bc
 | |
| 	ld c,b
 | |
| 	push bc			! load 0
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	jr loop
 | |
| readfile:
 | |
| 	call findfile
 | |
| 	pop de
 | |
| 	pop hl			! count
 | |
| 	push bc
 | |
| 	ld bc,0
 | |
| 0:
 | |
| 	xor a
 | |
| 	or l
 | |
| 	jr z,1f
 | |
| 	dec l
 | |
| 3:
 | |
| ! warning: this may not work if zcount overflows
 | |
| 	ld a,(iy+zcount)
 | |
| 	or a
 | |
| 	jr nz,5f
 | |
| 	ld a,(iy+zsave)
 | |
| 	cp 26
 | |
| 	jr z,4f
 | |
| 	ld (iy+zsave),26
 | |
| 	jr 8f
 | |
| 4:
 | |
| 	call getchar
 | |
| 	jr c,2f
 | |
| 	ld (de),a
 | |
| 	sub 26		! CTRL-Z
 | |
| 	jr z,7f
 | |
| 	ld a,(iy+zcount)
 | |
| 	or a
 | |
| 	jr z,6f
 | |
| 	ld a,(de)
 | |
| 	ld (iy+zsave),a
 | |
| 5:
 | |
| 	ld a,26
 | |
| 	dec (iy+zcount)
 | |
| 8:
 | |
| 	ld (de),a
 | |
| 6:
 | |
| 	inc de
 | |
| 	inc bc
 | |
| 	jr 0b
 | |
| 1:
 | |
| 	dec l
 | |
| 	dec h
 | |
| 	jp p,3b
 | |
| 2:
 | |
| 	pop hl
 | |
| 	push bc
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	ld hl,0
 | |
| 	jr phl
 | |
| 7:
 | |
| 	inc (iy+zcount)
 | |
| 	jr 4b
 | |
| 
 | |
| ux_write:
 | |
| 	pop hl
 | |
| 	ld a,l
 | |
| 	sub 3
 | |
| 	jp p,writefile
 | |
| 	pop hl			! buffer address
 | |
| 	pop de			! count
 | |
| 	push de
 | |
| 	ld iy,0
 | |
| 	push iy
 | |
| 	push bc
 | |
| 	ld b,e			! count now in 'db'
 | |
| 0:
 | |
| 	ld a,b
 | |
| 	or a
 | |
| 	jr nz,1f
 | |
| 	ld a,d
 | |
| 	or a
 | |
| 	jr nz,2f
 | |
| 	pop bc
 | |
| 	jr loop
 | |
| 2:
 | |
| 	dec d
 | |
| 1:
 | |
| 	dec b
 | |
| 	ld e,(hl)
 | |
| 	inc hl
 | |
| 	push bc
 | |
| 	push de
 | |
| 	push hl
 | |
| 	ld c,writeconsole
 | |
| 	call bdos
 | |
| 	pop hl
 | |
| 	pop de
 | |
| 	pop bc
 | |
| 	jr 0b
 | |
| writefile:
 | |
| 	call findfile
 | |
| 	pop de
 | |
| 	pop hl			! count
 | |
| 	push bc
 | |
| 	ld bc,0
 | |
| 0:
 | |
| 	xor a
 | |
| 	or l
 | |
| 	jr z,1f
 | |
| 	dec l
 | |
| 3:
 | |
| 	ld a,(de)
 | |
| 	inc de
 | |
| 	call putchar
 | |
| 	jr c,4f
 | |
| 	inc bc
 | |
| 	jr 0b
 | |
| 1:
 | |
| 	dec l
 | |
| 	dec h
 | |
| 	jp p,3b
 | |
| 	ld iy,0
 | |
| 2:
 | |
| 	pop hl
 | |
| 	push bc
 | |
| 	ld b,h
 | |
| 	ld c,l
 | |
| 	push iy
 | |
| 	jr loop
 | |
| 4:
 | |
| 	ld iy,ENOSPC
 | |
| 	jr 2b
 | |
| 
 | |
| ux_unlink:
 | |
| 	pop hl
 | |
| 	ld iy,fcb
 | |
| 	call parsename
 | |
| 	push bc
 | |
| 	ld c,delete
 | |
| 	ld de,fcb
 | |
| 	call bdos
 | |
| 	pop bc
 | |
| 	inc a
 | |
| 	jr nz,1f
 | |
| 	ld hl,ENOENT
 | |
| 	jr phl
 | |
| 1:
 | |
| 	ld hl,0
 | |
| 	jr phl
 | |
| 
 | |
| ux_getpid:
 | |
| 	ld hl,12345		! nice number
 | |
| 	jr phl
 | |
| 
 | |
| ux_exece:
 | |
| 	ld iy,fcb
 | |
| 	pop hl
 | |
| 	call parsename
 | |
| 	pop hl
 | |
| 	ld b,h;ld c,l
 | |
| 	pop iy
 | |
| 	ld ix,0x82
 | |
| 	ld (ix-1),' '
 | |
| 4:	ld h,b;ld l,c
 | |
| 3:	ld e,(hl)
 | |
| 	inc hl
 | |
| 	ld d,(hl)
 | |
| 	inc hl
 | |
| 	ld b,h;ld c,l
 | |
| 	ex de,hl
 | |
| 	ld a,h
 | |
| 	or l
 | |
| 	jr z,1f
 | |
| 2:
 | |
| 	ld a,(hl)
 | |
| 	inc hl
 | |
| 	ld (ix),a
 | |
| 	inc ix
 | |
| 	or a
 | |
| 	jr nz,2b
 | |
| 	ld (ix-1),' '
 | |
| 	jr 4b
 | |
| 1:
 | |
| 	ld (ix),'X'
 | |
| 	ld (ix+1),'\r'
 | |
| 	ld (ix+2),'\n'
 | |
| 	ld (ix+3),'$'
 | |
| 	ld de,0x81
 | |
| 	push ix
 | |
| 	ld c,printstring
 | |
| 	call bdos
 | |
| 	pop hl
 | |
| 	ld de,-129
 | |
| 	add hl,de
 | |
| 	ld a,l
 | |
| 	ld (0x80),a
 | |
| 	jr warmstart
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| dispat1:	! base for escaped opcodes
 | |
| .data2	aar.l,	aar.z,	adf.l,	adf.z,	adi.l,	adi.z,	ads.l,	ads.z
 | |
| .data2	adu.l,	adu.z,	and.l,	and.z,	asp.l,	ass.l,	ass.z,	bge.l
 | |
| .data2	bgt.l,	ble.l,	blm.l,	bls.l,	bls.z,	blt.l,	bne.l,	cai.z
 | |
| .data2	cal.l,	cfi.z,	cfu.z,	ciu.z,	cmf.l,	cmf.z,	cmi.l,	cmi.z
 | |
| .data2	cms.l,	cms.z,	cmu.l,	cmu.z,	com.l,	com.z,	csa.l,	csa.z
 | |
| .data2	csb.l,	csb.z,	cuf.z,	cui.z,	cuu.z,	dee.l,	del.p,	del.n
 | |
| .data2	dup.l,	dus.l,	dus.z,	dvf.l,	dvf.z,	dvi.l,	dvi.z,	dvu.l
 | |
| .data2	dvu.z,	fef.l,	fef.z,	fif.l,	fif.z,	inl.p,	inl.n,	inn.l
 | |
| .data2	inn.z,	ior.l,	ior.z,	lar.l,	lar.z,	ldc.l,	ldf.l,	ldl.p
 | |
| .data2	ldl.n,	lfr.l,	lil.p,	lil.n,	lim.z,	los.l,	los.z,	lor.s0
 | |
| .data2	lpi.l,	lxa.l,	lxl.l,	mlf.l,	mlf.z,	mli.l,	mli.z,	mlu.l
 | |
| .data2	mlu.z,	mon.z,	ngf.l,	ngf.z,	ngi.l,	ngi.z,	nop.z,	rck.l
 | |
| .data2	rck.z,	ret.l,	rmi.l,	rmi.z,	rmu.l,	rmu.z,	rol.l,	rol.z
 | |
| .data2	ror.l,	ror.z,	rtt.z,	sar.l,	sar.z,	sbf.l,	sbf.z,	sbi.l
 | |
| .data2	sbi.z,	sbs.l,	sbs.z,	sbu.l,	sbu.z,	sde.l,	sdf.l,	sdl.p
 | |
| .data2	sdl.n,	set.l,	set.z,	sig.z,	sil.p,	sil.n,	sim.z,	sli.l
 | |
| .data2	sli.z,	slu.l,	slu.z,	sri.l,	sri.z,	sru.l,	sru.z,	sti.l
 | |
| .data2	sts.l,	sts.z,	str.s0,	tge.z,	tle.z,	trp.z,	xor.l,	xor.z
 | |
| .data2	zer.l,	zer.z,	zge.l,	zgt.l,	zle.l,	zlt.l,	zne.l,	zrf.l
 | |
| .data2	zrf.z,	zrl.p,	dch.z,	exg.s0,	exg.l,	exg.z,	lpb.z
 | |
| 
 | |
| dispat2:	! base for 4 byte offsets
 | |
| .data2	ldc.f
 | |
| 
 | |
| 
 | |
| ignmask: .data2 0	! ignore mask (variable)
 | |
| retarea: .data2 0	! base of buffer for result values (max 8 bytes)
 | |
| 	 .data2 0
 | |
| 	 .data2 0
 | |
| 	 .data2 0
 | |
| 
 | |
| trapproc:
 | |
| 	.data2 0
 | |
| 
 | |
| nextp:	.data1 0
 | |
| 
 | |
| header:
 | |
| ntext:	.data2 0
 | |
| ndata:	.data2 0
 | |
| nproc:	.data2 0
 | |
| entry:	.data2 0
 | |
| nline:	.data2 0
 | |
| 
 | |
| hp:	.data2 0
 | |
| pb:	.data2 0
 | |
| pd:	.data2 0
 |