diff options
| author | fishsoupisgood <github@madingley.org> | 2019-05-27 02:41:51 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 02:41:51 +0100 | 
| commit | 333b605b2afd472b823aeda0adf0e8b1ea9843c0 (patch) | |
| tree | bc8f581317897e2e53f278f1716b4471fcdccd4f /tests | |
| download | asl-master.tar.gz asl-master.tar.bz2 asl-master.zip  | |
Diffstat (limited to 'tests')
320 files changed, 52799 insertions, 0 deletions
diff --git a/tests/t_166/asflags b/tests/t_166/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_166/asflags diff --git a/tests/t_166/t_166.asm b/tests/t_166/t_166.asm new file mode 100644 index 0000000..d23a52b --- /dev/null +++ b/tests/t_166/t_166.asm @@ -0,0 +1,232 @@ +        cpu     80c167 +	page	0 +        include reg166 + +	diswdt +	einit +	idle +	nop +	pwrdn +	ret +	reti +	rets +	srst +	srvwdt + +targ:	jmpr	targ +	jmpr	nz,targ +	jmpr	ult,targ +	jmpr	sgt,targ +	jmpr	nv,targ +	jmpr	net,targ +	callr	targ + +	jmpa	targ +	jmpa	nz,targ +	jmpa	ult,targ +	jmpa	sgt,targ +	jmpa	nv,targ +	jmpa	net,targ +	calla	1234h + +	jmps	targ +	jmps	1,2345h +	calls	targ + +	jmpi	[r3] +	jmpi	z,[r12] +	calli	nc,[r4] + +	jmp	10000h +	jmp	3ffffh +	jmp	12345h +	jmp	80h +	jmp	2000h +	jmp	[r14] + +	call	10000h +	call	3ffffh +	call	12345h +	call	z,80h +	call	sle,2000h +	call	nn,[r14] + +	add	1234h,r10 +	addb	2345h,0fe00h +	addc	r7,1234h +	addcb	0fe02h,2345h +	sub	r12,#4 +	subb	r5,#200 +	subc	0fe04h,#4 +	subcb	0fe06h,#200 +	cmp	r5,r3 +	cmpb	rh0,rl0 +	and	r1,[r2] +	andb	r5,[r1] +	or	r3,[r3+] +	xorb	r15,[r0+] + +	ashr	r2,r4 +	rol	r5,#4 +	ror	r10,r1 +	shl	r3,#12 +	shr	r15,r0 + +	band	r2.5,r7.14 +	bmov	r3.7,0fd08h.5 +	bmovn	r7.10,0ff10h.12 +	bcmp	r7.14,r2.5 +	bor	0fd08h.5,r3.7 +	bxor	0ff10h.12,r7.10 +	bset	r5.2 +	bclr	0ff80h.13 +	bfldl	r5,#0c3h,#3ch +	bfldh	0fd02h,#0c3h,#3ch + +	cmpd1	r5,#10 +	cmpd2	r12,#200 +	cmpi1	r9,Targ +	cmpi2	r14,#(5*4)-7 + +	cpl	r5 +	cplb	rh1 +	neg	r12 +	negb	r10 + +	div	r3 +	divl	r7 +	divu	r10 +	divlu	r0 + +targ2:  jb      r5.2,targ2 +        jbc     0fd30h.12,targ2 +        jnb     r7.14,targ2 +        jnbs    0ff58h.2,targ2 + +	mov	r2,r5 +	movb	r0,rh5 +	mov	r4,#2 +	movb	r6,#10 +	mov	r12,#1234 +	movb	r0,#23h +	mov	r0,[r2] +	movb	rl4,[r10] +	mov	r3,[r4+] +	movb	r10,[r7+] +	mov	r1,[r1+300] +	movb	r10,[30+r4-40] +	mov	r12,Targ +        movb    rl2,targ2 + +	mov	0fe00h,#10 +	movb	0fe02h,#100 +	mov	0fe04h,[r2] +	movb	0fe06h,[r7] +	mov	0fe08h,Targ +        movb    0fe0ah,targ2 +	mov	[r4],r3 +	movb	[r7],rl5 +	mov	[r10],[r2] +	movb	[r14],[r0] +	mov	[r13],[r6+] +	movb	[r14],[r2+] +        mov     [r11],targ2 +	movb	[r15],Targ +	mov	[-r4],r2 +	movb	[-r15],rh7 +	mov	[r6+],[r13] +	movb	[r2+],[r14] +	mov	[r15+20],r4 +	movb	[r0-7],rh1 +        mov     targ2,[r7] +	movb	Targ,[r4] +	mov	Targ,0fe10h +        movb    targ2,0ff10h + +	movbs	r10,rh1 +        movbs   0fe04h,targ2 +        movbs   targ2,0fe04h +	movbz	r11,rl1 +        movbz   0fe08h,targ2 +        movbz   targ2,0fe40h + +	mul	r12,r15 +	mulu	r0,r7 +	prior	r2,r4 + +        pcall   r10,targ2 +	pcall	0fe02h,8000h + +	push	r2 +	pop	0ff20h +	retp	r14 + +	scxt	0fe20h,#1234h +        scxt    r5,targ2 + +	trap	#10 +	trap	#127 + +;------------------------------- +; Pipeline-Tests + +	mov	dpp0,#4 +	assume	dpp0:4 +	mov	r0,12345h    	; DPP0 noch nicht ver„nert +	mov	r0,12345h    	; ab hier wieder gut +	mov	dpp0,#0 +	assume	dpp0:0 + +	mov	cp,0fc00h +	mov	r5,r3           ; gleich doppelt +	movb	r3,r1 + +	mov	sp,0fd00h	; SP noch in der Pipe +	pop	r4 +	ret + +;------------------------------- +; Bit-Tests + +	bset	123h +tbit	bit	0ff80h.4 + +;------------------------------- + +Str	equ	"PSW+5" +tmp	equ	Val(Str) + +;------------------------------- +; Adressierungs-Tests + +	atomic	#2 + +	extr	#1 +	mov	0f000h,#1234h +	mov	0fe00h,#1234h + +ebit	bit	0f100h.4 +sbit	bit	0ff00h.4 + +	extr	#1 +	bclr	ebit +	bclr	sbit + +	extr	#1 +	bset	0f1deh.12 +	bset	0ffdeh.12 + +	extp	r5,#1 +	mov	r0,0abcdh +	mov	r0,0abcdh + +	extpr	#4,#1 +	extp	#4,#1 +	mov	r0,12345h +	mov	r0,12345h + +	extsr	#1,#1 +	exts	#1,#1 +	mov	r0,12345h +	mov	r0,12345h + diff --git a/tests/t_166/t_166.doc b/tests/t_166/t_166.doc new file mode 100644 index 0000000..a21d1c6 --- /dev/null +++ b/tests/t_166/t_166.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application 166 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the 80C166 instruction set              | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_166/t_166.ori b/tests/t_166/t_166.ori Binary files differnew file mode 100644 index 0000000..0fbb6db --- /dev/null +++ b/tests/t_166/t_166.ori diff --git a/tests/t_16c5x/asflags b/tests/t_16c5x/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_16c5x/asflags diff --git a/tests/t_16c5x/t_16c5x.asm b/tests/t_16c5x/t_16c5x.asm new file mode 100755 index 0000000..805013f --- /dev/null +++ b/tests/t_16c5x/t_16c5x.asm @@ -0,0 +1,45 @@ +        cpu     16c57 +        page    0 +        relaxed on + +        clrw +        nop +        option +        sleep + +        andlw   12h +        iorlw   12h +        movlw   12h +        retlw   12h +        xorlw   12h + +        addwf   12h +        andwf   12h,0 +        comf    12h,1 +        decf    12h,w +        decfsz  12h,f +        incf    12h +        incfsz  12h,0 +        iorwf   12h,1 +        movf    12h,w +        rlf     12h,f +        rrf     12h +        subwf   12h,0 +        swapf   12h,1 +        xorwf   12h,w + +        bcf     10h,3 +        bsf     17h,5 +        btfsc   12h,7 +        btfss   08h,1 + +        clrf    12h +        movwf   12h + +        tris    5 +        tris    6 +        tris    7 + +        call    234h +        goto    123h + diff --git a/tests/t_16c5x/t_16c5x.doc b/tests/t_16c5x/t_16c5x.doc new file mode 100644 index 0000000..e75d915 --- /dev/null +++ b/tests/t_16c5x/t_16c5x.doc @@ -0,0 +1,5 @@ ++-----------------------  Test Application 16C5x ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the PIC 16C5x code generator            | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_16c5x/t_16c5x.ori b/tests/t_16c5x/t_16c5x.ori Binary files differnew file mode 100755 index 0000000..03a128c --- /dev/null +++ b/tests/t_16c5x/t_16c5x.ori diff --git a/tests/t_16c84/asflags b/tests/t_16c84/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_16c84/asflags diff --git a/tests/t_16c84/t_16c84.asm b/tests/t_16c84/t_16c84.asm new file mode 100644 index 0000000..e5b2ed4 --- /dev/null +++ b/tests/t_16c84/t_16c84.asm @@ -0,0 +1,53 @@ +	cpu	16c84 + +	clrw +	nop +	clrwdt +	retfie +	return +	sleep +	option + +	addlw	1 +	andlw	100 +	iorlw	$55 +	movlw	%10101010 +	retlw	0 +	sublw	300-400 +	xorlw	186 + +	addwf	3,f +	addwf	4,w +	addwf	5 +	addwf	6,0 +	addwf	7,1 +	andwf	8 +	comf	9,f +	comf	10,w +	comf	11 +	comf	12,0 +	comf	13,1 +	decf	14 +	decfsz	15 +	incf	16 +	incfsz	17 +	iorwf	18 +	movf	19 +	rlf	20 +	rrf	21 +	subwf	22 +	swapf	23 +	xorwf	24 + +	bcf	17,4 +	bsf	500,6 +	btfsc	23,3 +	btfss	20,0 + +	clrf	20 +	movwf	33 + +	tris	6 + +	call	$200 +	goto	$300 diff --git a/tests/t_16c84/t_16c84.doc b/tests/t_16c84/t_16c84.doc new file mode 100644 index 0000000..999b8bd --- /dev/null +++ b/tests/t_16c84/t_16c84.doc @@ -0,0 +1,5 @@ ++-----------------------  Test Application 16C84 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the PIC 16C8x code generator            | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_16c84/t_16c84.ori b/tests/t_16c84/t_16c84.ori Binary files differnew file mode 100644 index 0000000..1c6741a --- /dev/null +++ b/tests/t_16c84/t_16c84.ori diff --git a/tests/t_17c42/asflags b/tests/t_17c42/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_17c42/asflags diff --git a/tests/t_17c42/t_17c42.asm b/tests/t_17c42/t_17c42.asm new file mode 100644 index 0000000..a74fb9c --- /dev/null +++ b/tests/t_17c42/t_17c42.asm @@ -0,0 +1,66 @@ +                cpu     17c42 +                relaxed on + +                retfie +                return +                clrwdt +                nop +                sleep + +                movlb   12h +                addlw   12h +                andlw   12h +                iorlw   12h +                movlw   12h +                sublw   12h +                xorlw   12h +                retlw   12h + +                addwf   12h,0 +                addwfc  12h,1 +                andwf   12h,w +                clrf    12h,f +                comf    12h +                daw     12h,0 +                decf    12h,1 +                incf    12h,w +                iorwf   12h,f +                negw    12h +                rlcf    12h,0 +                rlncf   12h,1 +                rrcf    12h,w +                rrncf   12h,f +                setf    12h +                subwf   12h,0 +                subwfb  12h,1 +                swapf   12h,w +                xorwf   12h,f +                decfsz  12h +                dcfsnz  12h,0 +                incfsz  12h,1 +                infsnz  12h,w + +                bcf     12h,1 +                bsf     12h,3 +                btfsc   12h,5 +                btfss   12h,7 +                btg     12h,1 + +                movwf   12h +                cpfseq  12h +                cpfsgt  12h +                tstfsz  12h + +                movfp   34h,12h +                movpf   12h,34h + +                tablrd  1,1,12h +                tablwt  1,1,12h + +                tlrd    1,12h +                tlwt    1,12h + +                call    1234h +                goto    1234h +                lcall   0fedch + diff --git a/tests/t_17c42/t_17c42.doc b/tests/t_17c42/t_17c42.doc new file mode 100644 index 0000000..22221cc --- /dev/null +++ b/tests/t_17c42/t_17c42.doc @@ -0,0 +1,5 @@ ++-----------------------  Test Application 17C42 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the PIC 17C42 code generator            | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_17c42/t_17c42.ori b/tests/t_17c42/t_17c42.ori Binary files differnew file mode 100644 index 0000000..1db73f8 --- /dev/null +++ b/tests/t_17c42/t_17c42.ori diff --git a/tests/t_251/asflags b/tests/t_251/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_251/asflags diff --git a/tests/t_251/t_251.asm b/tests/t_251/t_251.asm new file mode 100644 index 0000000..2002ac9 --- /dev/null +++ b/tests/t_251/t_251.asm @@ -0,0 +1,399 @@ +	cpu	80c251 +        include reg251 + +        page	0 + +        org	0ff0000h + +data	equ	30h +;acc     equ     0eeh +Bit1	bit	21h.7 +Bit2	bit	s:90h.4 +Bit3	bit	data.5 +Bit4	bit	acc.3 +Bit5	bit	Bit3 + +        acall	Targ +        ajmp	Targ + +        lcall	Targ +        lcall	@wr4 +        ljmp	Targ +        ljmp	@wr2 + +        ecall	Targ +        ecall	@dpx +        ejmp	Targ +        ejmp	@dr16 + +        sjmp	Targ +        jc	Targ +        jnc	Targ +        jnz	Targ +        jz	Targ +        je	Targ +        jsle	Targ +        jle	Targ +        jne	Targ +        jsg	Targ +        jsge	Targ +        jsl	Targ +        jsle	Targ + +        jmp	@a+dptr +        jmp	@wr2 +        jmp	@dr16 +        jmp	Targ +        jmp	Targ+4000h +        jmp	4000h +        call	@wr4 +        call	@dpx +        call	Targ +        call	Targ+4000h + +        jb      Bit1,Targ +        jbc	Bit2,Targ +        jnb     Bit4,Targ +        jb	Bit3,Targ +        jnb	s:91h.4,Targ +        jbc	44h.5,Targ + +        djnz	r5,Targ +        djnz	acc,Targ +        djnz    data,Targ + +        cjne	a,data,Targ +        cjne	a,#'A',Targ +        cjne	r6,#50,Targ +        cjne	@r1,#40h,Targ + +Targ: + +	add	a,#12h +        add	a,data +        add	a,1234h +        add	a,@r1 +        add	a,@wr2 +        add	a,@dr8 +        add	a,r4 +        add	a,a +        add	a,r13 +	add	r3,r12 +	add	wr8,wr12 +        add	dr20,dpx +        add	r4,#23h +        add	r11,#23h +        add	wr4,#1234h +        add	dr4,#1234h +        add	r8,data +        add	r11,data +        add	wr8,data +        add     r8,1234h +        add	wr8,55ah +        add	r11,@r1 +        add	r2,@wr6 +        add	r6,@dr12 + +        sub	a,r7 +        sub	wr4,wr10 +        sub	dr12,dr28 +        sub	r4,#10 +        sub	wr6,#1000 +        sub	dr16,#05aa5h +        sub	a,data +        sub	wr8,data +        sub	r12,1243h +        sub	wr10,1342h +        sub	r3,@wr14 +        sub	a,@spx + +        cmp	a,r7 +        cmp	wr4,wr10 +        cmp	dr12,dr28 +        cmp	r4,#10 +        cmp	wr6,#1000 +        cmp	dr16,#05aa5h +        cmp	dr16,#-3 +        cmp	a,data +        cmp	wr8,data +        cmp	r12,1243h +        cmp	wr10,1342h +        cmp	r3,@wr14 +        cmp	a,@spx + +        addc	a,r6 +        addc	r11,@r0 +        addc	a,data +        addc	a,#20h +        subb	a,r6 +        subb	r11,@r0 +        subb	a,data +        subb	a,#20h + +        anl	c,Bit1 +        anl	cy,Bit3 +        anl	c,/Bit1 +        anl	cy,/Bit3 +        orl	c,Bit1 +        orl	cy,Bit3 +        orl	c,/Bit1 +        orl	cy,/Bit3 + +        anl	data,a +        anl	data,r11 +        anl	data,#10001111b +	anl	a,#20h +        anl	a,acc +        anl	a,90h +        anl	a,s:90h +        anl	a,@r1 +        anl	a,@wr10 +        anl	a,@dr12 +        anl	a,r4 +        anl	a,r10 +        anl	a,a +        anl	r10,r4 +        anl	wr10,wr6 +        anl	r10,#55h +        anl	r11,#0aah +        anl	wr14,#1000100010001001b +        anl	r1,data +        anl	r11,data +        anl	wr4,data +        anl	r10,1234h +        anl	wr2,1234h +        anl	r11,@r1 +        anl	r6,@wr14 +        anl	r7,@dr16 + +        orl	data,a +        orl	data,r11 +        orl	data,#10001111b +	orl	a,#20h +        orl	a,acc +        orl	a,90h +        orl	a,s:90h +        orl	a,@r1 +        orl	a,@wr10 +        orl	a,@dr12 +        orl	a,r4 +        orl	a,r10 +        orl	a,a +        orl	r10,r4 +        orl	wr10,wr6 +        orl	r10,#55h +        orl	r11,#0aah +        orl	wr14,#1000100010001001b +        orl	r1,data +        orl	r11,data +        orl	wr4,data +        orl	r10,1234h +        orl	wr2,1234h +        orl	r11,@r1 +        orl	r6,@wr14 +        orl	r7,@dr16 + +        xrl	data,a +        xrl	data,r11 +        xrl	data,#10001111b +	xrl	a,#20h +        xrl	a,acc +        xrl	a,90h +        xrl	a,s:90h +        xrl	a,@r1 +        xrl	a,@wr10 +        xrl	a,@dr12 +        xrl	a,r4 +        xrl	a,r10 +        xrl	a,a +        xrl	r10,r4 +        xrl	wr10,wr6 +        xrl	r10,#55h +        xrl	r11,#0aah +        xrl	wr14,#1000100010001001b +        xrl	r1,data +        xrl	r11,data +        xrl	wr4,data +        xrl	r10,1234h +        xrl	wr2,1234h +        xrl	r11,@r1 +        xrl	r6,@wr14 +        xrl	r7,@dr16 + + +        clr	a +        clr	c +        clr	Bit1 +        clr	s:92h.6 + +        cpl	a +        cpl	c +        cpl	Bit1 +        cpl	s:92h.6 + +        setb	c +        setb	Bit1 +        setb	s:92h.6 + +	dec	a +        dec	data +        dec	@r1 +        dec	r5,#1 +        dec     r10 +        dec	r11,#1 +        dec	a,#2 +        dec	r11,#4 +        dec	wr2,#2 +        dec	spx,#4 + +	inc	a +        inc	data +        inc	@r1 +        inc	r5,#1 +        inc     r10 +        inc	r11,#1 +        inc	a,#2 +        inc	r11,#4 +        inc	wr2,#2 +        inc	spx,#4 +        inc	dptr + +        mul	ab +        mul	r5,r7 +        mul	wr10,wr14 + +        div	ab +        div	r5,r7 +        div	wr10,wr14 + +	mov	a,#10 +        mov	acc,#20 +        mov	@r1,#30 +        mov	r4,#40 +        mov	data,acc +        mov	s:90h,@r1 +        mov	70h,r6 +        mov	@r1,data +        mov	r5,data +        mov	a,acc +        mov	a,@r1 +        mov	a,r2 +        mov	acc,a +        mov	@r1,a +        mov	r4,a +        mov	a,r12 +        mov	r12,a +        mov	r11,r5 +        mov	r5,r11 +        mov	r10,r6 +        mov	wr4,wr10 +        mov	dr12,dpx +        mov	r11,#50 +        mov	r7,#60 +        mov	r14,#70 +        mov	wr12,#8090 +        mov	dr12,#8090 +        mov	dr12,#-100 +        mov	r11,data +        mov	r4,data +        mov	r15,data +        mov	wr10,acc +        mov	dr16,s:0a0h +        mov	a,1234h +        mov	r10,1234h +        mov	wr14,1234h +        mov	dr20,1243h +        mov	a,@wr10 +        mov	r2,@wr10 +        mov	a,@dr12 +        mov	r4,@dr12 +        mov	wr10,@wr12 +        mov	wr10,@dr12 +        mov	data,r11 +        mov	data,r5 +        mov	data,r8 +        mov	data,wr2 +        mov	data,spx +        mov	1234h,a +        mov	1234h,r5 +        mov	1234h,wr8 +        mov	1234h,dr16 +        mov	@wr14,a +        mov	@wr14,r9 +        mov	@dr12,a +        mov	@dr12,r8 +        mov	@wr14,wr18 +        mov	@dr8,wr18 +        mov	a,@wr2+10 +        mov	r4,@wr2-20 +        mov	wr10,@wr2+30 +        mov	a,@dpx-40 +        mov	r8,@dpx+50 +        mov	wr10,@dpx-60 +        mov	@wr2+10,a +        mov	@wr2-20,r4 +        mov	@wr2+30,wr10 +        mov	@dpx-40,a +        mov	@dpx+50,r8 +        mov	@dpx-60,wr10 +        mov	dptr,#1234h + +        movc	a,@a+dptr +        movc	a,@a+pc + +        movh	dr12,#55aah + +        movs	wr10,a +        movz	wr12,r12 + +        movx	a,@dptr +        movx	a,@r1 +        movx	@dptr,a +        movx	@r0,r11 + +        pop	data +        pop	acc +        pop	a +        pop	r5 +        pop	wr8 +        pop	dr20 +        push	data +        push	acc +        push	a +        push	r5 +        push	wr8 +        push	dr20 +        push	#20 +        pushw	#55aah + +        xch	a,r5 +        xch	a,data +        xch	a,@r1 +        xch	r5,r11 +        xch	data,a +        xch	@r1,a +        xchd	a,@r1 +        xchd	@r1,r11 + +        nop +        ret +        reti +        eret +        trap + +        da	a +        rl	a +        rlc	a +        rr	a +        rrc	a +        swap	r11 + +        sll	a +        sll	r6 +        sll	wr12 +        sra	a +        sra	r6 +        sra	wr12 +        srl	a +        srl	r6 +        srl	wr12 diff --git a/tests/t_251/t_251.doc b/tests/t_251/t_251.doc new file mode 100644 index 0000000..e2b4505 --- /dev/null +++ b/tests/t_251/t_251.doc @@ -0,0 +1,5 @@ ++-----------------------  Test Application 251   ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the MCS-251 code generator              | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_251/t_251.ori b/tests/t_251/t_251.ori Binary files differnew file mode 100644 index 0000000..ecd8c4c --- /dev/null +++ b/tests/t_251/t_251.ori diff --git a/tests/t_296/asflags b/tests/t_296/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_296/asflags diff --git a/tests/t_296/t_296.asm b/tests/t_296/t_296.asm new file mode 100644 index 0000000..27cdb60 --- /dev/null +++ b/tests/t_296/t_296.asm @@ -0,0 +1,132 @@ +	cpu	80296 + +ax	equ	40 +al	equ	ax +ah	equ	al+1 +bx	equ	42 +cx	equ	44 +dx	equ	46 + +        reti + +        eld	ax,[bx] +        eld	ax,0[bx] +        eld	ax,100[bx]   	; nur 24-Bit-Displacement +        eld	ax,1000[bx] +        eld	ax,100000[bx] +        eld	ax,-100[bx] +        eld	ax,-1000[bx] +        eld	ax,-100000[bx] +	eld	ax,123456h + +        eldb	al,[bx] +        eldb	al,0[bx] +        eldb	al,100[bx]   	; nur 24-Bit-Displacement +        eldb	al,1000[bx] +        eldb	al,100000[bx] +        eldb	al,-100[bx] +        eldb	al,-1000[bx] +        eldb	al,-100000[bx] +	eldb	al,123456h + +        est	ax,[bx] +        est	ax,0[bx] +        est	ax,100[bx]   	; nur 24-Bit-Displacement +        est	ax,1000[bx] +        est	ax,100000[bx] +        est	ax,-100[bx] +        est	ax,-1000[bx] +        est	ax,-100000[bx] +	est	ax,123456h + +        estb	al,[bx] +        estb	al,0[bx] +        estb	al,100[bx]   	; nur 24-Bit-Displacement +        estb	al,1000[bx] +        estb	al,100000[bx] +        estb	al,-100[bx] +        estb	al,-1000[bx] +        estb	al,-100000[bx] +	estb	al,123456h + +	ecall	$+123456h +	ejmp	$-10h +        ebr	[bx] + +        ebmovi	cx,ax + +        mac     #12h +        mac     ax,#12h + +        macr    bx +        macr    ax,bx + +        macrz   10[bx] +        macrz   ax,10[bx] + +        macz    -1000[bx] +        macz    ax,-1000[bx] + +        smac    [cx] +        smac    ax,[cx] + +        smacr   [cx]+ +        smacr   ax,[cx]+ + +        smacrz  1000h +        smacrz  ax,1000h + +        smacz   0ffc0h +        smacz   ax,0ffc0h + +        msac	ax,#20 + +        mvac	cx,al + +        rpt	ax +        rptnst	#10 +        rptnh	[cx] +        rptgt	[cx]+ +        rptnc	ax +        rptnvt	#10 +        rptnv	[cx] +        rptge	[cx]+ +        rptne	ax +        rptst	#10 +        rpth	[cx] +        rptle	[cx]+ +        rptc	ax +        rptvt	#10 +        rptv	[cx] +        rptlt	[cx]+ +        rpte	ax +        rpti	#10 +        rptinst	[cx] +        rptinh	[cx]+ +        rptigt	ax +        rptinc	#10 +        rptinvt	[cx] +        rptinv	[cx]+ +        rptige	ax +        rptine	#10 +        rptist	[cx] +        rptih	[cx]+ +        rptile	ax +        rptic	#10 +        rptivt	[cx] +        rptiv	[cx]+ +        rptilt	ax +        rptie	#10 + +        assume	wsr:3eh		; 1f80h...1fbfh --> 0c0h...0ffh +        assume	wsr1:9eh	; 0f780h...0f7bfh --> 40h..7fh + +        ld	ax,3eh		; normal +        ld	ax,44h		; muß absolut werden +        ld	ax,92h		; wieder normal +        ld	ax,0d0h		; muß wieder absolut werden +        ld	ax,1000h	; muß absolut bleiben +        ld	ax,1f90h	; mit WSR +        ld	ax,2000h	; muß wieder absolut bleiben +        ld      ax,0f7a0h	; mit WSR1 +        ld	ax,0fffeh	; muß wieder absolut bleiben diff --git a/tests/t_296/t_296.doc b/tests/t_296/t_296.doc new file mode 100644 index 0000000..da5b3ba --- /dev/null +++ b/tests/t_296/t_296.doc @@ -0,0 +1,6 @@ ++------------------------- Test Application 296 -----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the 80196Nx/80296's instruction set     | +|      extensions                                                            | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_296/t_296.ori b/tests/t_296/t_296.ori Binary files differnew file mode 100755 index 0000000..b4fe458 --- /dev/null +++ b/tests/t_296/t_296.ori diff --git a/tests/t_29k/asflags b/tests/t_29k/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_29k/asflags diff --git a/tests/t_29k/t_29k.asm b/tests/t_29k/t_29k.asm new file mode 100644 index 0000000..303a6af --- /dev/null +++ b/tests/t_29k/t_29k.asm @@ -0,0 +1,80 @@ +                cpu     AM29240 +                emulated class,convert,sqrt +                supmode on + +                page	0 +                relaxed	on + +                include reg29k + +                add	r128,r129,r130 +                add	r129,r130,131 +                add	r130,r131 +                add	r131,132 +                ; andere Op's dito... + +                dadd	r132,r133,r134 +                dadd	r133,r134 +                ; andere Op's dito + +                aseq	134,r135,r136 +                aseq	135,r136,137 + +                call	r136,$+0x048d0 +                call	r137,0x30000 +                call	r138,r139 +                calli	r139,r140 +                jmp	$ +                jmpi	r141 +                jmpf	r142,$ +                jmpfi	r143,r144 +                jmpfdec r144,$ +                jmpt	r145,$ +                jmpti	r146,r147 + +                load    0,27,r160,r161 +                loadl	27,r161,r162 +                loadm	27,r162,163 +                loadset 13,r163,r164 +                store	13,r164,165 +                storel	13,r165,r166 +                storem  7,r166,167 + +                class   r147,r148,2 +                sqrt	r147,r148,2 +                sqrt	r149,2 + +                clz	r148,r149 +                clz	r149,150 + +                const	r150,151 +                const	r151,-152 +                const	r152,0x153154 +                consth	r153,500 +                constn	r154,0xffff1234 +                constn	r155,-5 +                constn	r156,0123 + +                convert r157,r158,1,2,2,1 +                exhws	r158,r159 + +                halt +                iret + +                inv +                iretinv	2 + +                emulate 20,lr10,lr11 + +                mfsr	r148,lru +                mtsr	ipc,r148 +                mtsrim	lru,0xa55a +                mftlb	r159,r160 +                mttlb	r160,r161 + +                add	lr122,lr110,0 +                addc	gr10,gr30 + +                add	gr20,gr40,gr60 +                assume	rbp:0b0000000000000010 +		add	gr20,gr40,gr60 diff --git a/tests/t_29k/t_29k.doc b/tests/t_29k/t_29k.doc new file mode 100644 index 0000000..a0ccad8 --- /dev/null +++ b/tests/t_29k/t_29k.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 29K -----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the AM29K instruction set               | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_29k/t_29k.ori b/tests/t_29k/t_29k.ori Binary files differnew file mode 100644 index 0000000..c878f69 --- /dev/null +++ b/tests/t_29k/t_29k.ori diff --git a/tests/t_32/asflags b/tests/t_32/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_32/asflags diff --git a/tests/t_32/t_32.asm b/tests/t_32/t_32.asm new file mode 100644 index 0000000..d7738e5 --- /dev/null +++ b/tests/t_32/t_32.asm @@ -0,0 +1,39 @@ +        cpu     68340 +        supmode	on +        include reg683xx.inc +        page    0 + +        lpstop	#$55aa + +        link	a6,#10 +        link.l	a6,#10 + +        bgnd + +Test1   tbls.b  (a4),d5 +Test2:  tbls.w  30(a6),d1 + Test3: tbls.l  20(a4,d5*1),d6 +  Test4: tblsn.b (a4),d5 +        tblsn.w 30(a6),d1 +        tblsn.l	20(a4,d5*1),d6 +        tblu.b	(a4),d5 +        tblu.w	30(a6),d1 +        tblu.l	20(a4,d5*1),d6 +        tblun.b	(a4),d5 +        tblun.w	30(a6),d1 +        tblun.l	20(a4,d5*1),d6 + +        tbls.b	d1:d2,d3 +        tbls.w	d2:d3,d4 +        tbls.l	d3:d4,d5 +        tblsn.b	d1:d2,d3 +        tblsn.w	d2:d3,d4 +        tblsn.l	d3:d4,d5 +        tblu.b	d1:d2,d3 +        tblu.w	d2:d3,d4 +        tblu.l	d3:d4,d5 +        tblun.b	d1:d2,d3 +        tblun.w	d2:d3,d4 +        tblun.l	d3:d4,d5 + +        move.l	(d0.l),d0 diff --git a/tests/t_32/t_32.doc b/tests/t_32/t_32.doc new file mode 100644 index 0000000..e069ffe --- /dev/null +++ b/tests/t_32/t_32.doc @@ -0,0 +1,6 @@ ++-------------------------- Test Application 32 -----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the CPU32's extensions to the 680x0     | +|      basic instruction set.                                                | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_32/t_32.ori b/tests/t_32/t_32.ori Binary files differnew file mode 100644 index 0000000..1413840 --- /dev/null +++ b/tests/t_32/t_32.ori diff --git a/tests/t_3201x/asflags b/tests/t_3201x/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_3201x/asflags diff --git a/tests/t_3201x/t_3201x.asm b/tests/t_3201x/t_3201x.asm new file mode 100644 index 0000000..f07148f --- /dev/null +++ b/tests/t_3201x/t_3201x.asm @@ -0,0 +1,74 @@ +                cpu     32015 + +                abs +                apac +                cala +                dint +                eint +                nop +                pac +                pop +                push +                ret +                rovm +                sovm +                spac +                zac + +                b       345h +                banz    345h +                bgez    345h +                bgz     345h +                bioz    345h +                blez    345h +                blz     345h +                bnz     345h +                bv      345h +                bz      345h +                call    345h + +                addh    *,ar1 +                adds    *-,ar0 +                and     *+,ar1 +                dmov    *,1 +                ldp     *-,0 +                lst     *+,1 +                lt      dat123 +                lta     dat45 +                ltd     12h +                mar     *,ar1 +                mpy     *-,ar0 +                or      *+,ar1 +                sst     *,1 +                subc    *-,0 +                subh    *+,1 +                subs    dat123 +                tblr    dat45 +                tblw    12h +                xor     *,ar1 +                zalh    *-,ar0 +                zals    *+,ar1 + +                add     *+,4,ar0 +                lac     *+,ar0 +                sach    12h,4 +                sacl    12h +                sub     12h,6 + +                lack    12h +                ldpk    1 +                mpyk    123h + +                in      *,2,ar1 +                in      45h,4 +                out     *,2,ar1 +                out     45h,4 + +                larp    ar1 +                larp    1 + +                lar     ar1,12h +                sar     1,*,ar0 + +                lark    ar1,12h + diff --git a/tests/t_3201x/t_3201x.doc b/tests/t_3201x/t_3201x.doc new file mode 100644 index 0000000..6fc74f1 --- /dev/null +++ b/tests/t_3201x/t_3201x.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 3201x ---------------------------+ +|                                                                            | +|       This is a (synthetic) test of the TMS3201x instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_3201x/t_3201x.ori b/tests/t_3201x/t_3201x.ori Binary files differnew file mode 100644 index 0000000..4b0cfb6 --- /dev/null +++ b/tests/t_3201x/t_3201x.ori diff --git a/tests/t_3203x/asflags b/tests/t_3203x/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_3203x/asflags diff --git a/tests/t_3203x/t_3203x.asm b/tests/t_3203x/t_3203x.asm new file mode 100644 index 0000000..d6b35ef --- /dev/null +++ b/tests/t_3203x/t_3203x.asm @@ -0,0 +1,271 @@ +                cpu     320C30 +		relaxed	on +		page	0 + +		org	$123456 + +targ:		br	targ +		brd	targ +		call	targ + +		bu	r0 +		bud	r0 +		bu	targ +		bud	targ +		blo	ar1 +		blsd	targ +		bhi	ir0 +		bhs	targ +		beqd	ar4 +		bne	targ +		blt	targ +		ble	r10 +		bgtd	targ +		bge	r6 +		bzd	targ +		bnz	ar5 +		bpd	targ +		bn	targ +		bnnd	ar3 +		bnv	targ +		bv	ar7 +		bnufd	ir1 +		buf	targ +		bnc	ar2 +		bcd	iof +		bnlv	targ +		blv	targ +		bnluf	targ +		bluf	targ +		bzuf	targ +		b	targ + +		callne	r4 +		callnluf targ + +		dbne	ar1,r5 +		dbn	ar5,targ +		dbud	ar2,ar7 +		dbzufd	ar6,targ +		db	ar7,targ + +		retine +		retsnc +		retsu +		rets + +		trapu	7 +		trapuf	2 + +		swi +		sigi +		idle + +		rol	r4 +		rolc	ar2 +		ror	sp +		rorc	r20 + +		rptb	targ + +		nop	ar2 +		nop	*+ar3(2) +		nop	*-ar4(200) +		nop	*++ar5(30) +		nop	*--ar6 +		nop	*ar5++(20) +		nop	*ar1--(12h) +		nop	*ar7++($56)% +		nop	*ar0--(0x10)% +		nop	*+ar6(ir0) +		nop	*-ar4(ir0) +		nop	*++ar2(ir0) +		nop	*--ar2(ir0) +		nop	*ar2++(ir0) +		nop	*ar2--(ir0) +		nop	*ar2++(ir0)% +		nop	*ar2--(ir0)% +		nop	*+ar6(ir1) +		nop	*-ar4(ir1) +		nop	*++ar2(ir1) +		nop	*--ar2(ir1) +		nop	*ar2++(ir1) +		nop	*ar2--(ir1) +		nop	*ar2++(ir1)% +		nop	*ar2--(ir1)% +		nop	*ar4 +		nop	*ar3(100-$64) +		nop	*ar1++(ir0)B +		iack	*ar5 +		rpts	ar5 + +		absf	r4 +		absf	ar2,r5 +		absf	@$1300,r7 +		absf    *ar4++,r3 +		absf	200,r5 + +		absi	r4 +		absi	ar2,r5 +		absi	@$1300,r7 +		absi    *ar4++,r3 +		absi	200,r5 +		; +		addc	ar2,r5 +		addc	@$1300,r7 +		addc    *ar4++,r3 +		addc	200,r5 + +                addc3	*ar1++(1),*ar2,r5 +                addc3	*-ar3,r5,r2 +                addc3	r6,*ar4++,r3 +                addc3	r1,r2,r3 + +                stf	r4,@2000h +                stf	r6,*ar5 + +                tstb3	r5,*ar3++ + +                absf	*ar4++,r6 +||		stf	r6,*ar5++ + +		sti	r5,*ar3 +||		absi	*ar4++%,r1 + +		addf3	*ar4++,r5,r7 +||		stf	r3,*ar5++ + +		sti	r3,*ar5++ +||		addi3	*ar4++,r5,r7 + +		mpyi3	*ar4,*ar5,r1 +||		subi3	r6,r7,r3 + +		subi3	*ar4,r6,r3 +||		mpyi3	*ar5,r7,r1 + +		mpyi3	r7,*ar5,r1 +||		subi3	*ar4,r6,r3 + +		mpyi3	*ar5,r7,r1 +||		subi3	r6,*ar4,r3 + +		mpyi3	r7,*ar5,r1 +||		subi3	r6,*ar4,r3 + +		mpyi3	r6,r7,r1 +||		subi3	*ar5,*ar4,r3 + +		absf	*++ar3(ir1) ,r4 +||		stf	r4,*-ar7(1) + +		absi	*-ar5(1),r5 +||		sti	r1,*ar2--(ir1) + +		addf3	*+ar3(ir1),r2,r5 +||		stf	r4,*ar2 + +		addi3	*ar0--(ir0),r5,r0 +||		sti	r3,*ar7 + +		and3	*+ar1(ir0),r4,r7 +||		sti	r3,*ar2 + +		ash3	r1,*ar6++(ir1),r0 +||		sti	r5,*ar2 + +		fix	*++ar4(1),r1 +||		sti	r0,*ar2 + +		float	*+ar2(ir0),r6 +||		stf	r7,*ar1 + +		ldf	*--ar1(ir0),r7 +||		ldf	*ar7++(1),r3 + +		ldf	*ar2--(1),r1 +||		stf	r3,*ar4++(ir1) + +		ldi	*-ar1(1),r7 +||		ldi	*ar7++(ir0),r1 + +		ldi	*-ar1(1),r2 +||		sti	r7,*ar5++(ir0) + +		lsh3	r7,*ar2--(1),r2 +||		sti	r0,*+ar0(1) + +		mpyf3	*ar5++(1),*--ar1(ir0),r0 +||		addf3	r5,r7,r3 + +		mpyf3	*-ar2(1),r7,r0 +||		stf	r3,*ar0--(ir0) + +		mpyf3	r5,*++ar7(ir1),r0 +||		subf3	r7,*ar3--(1),r2 + +		mpyi3	r7,r4,r0 +||		addi3	*-ar3,*ar5--(1),r3 + +		mpyi3	*++ar0(1),r5,r7 +||		sti	r2,*-ar3(1) + +		mpyi3	r2,*++ar0(1),r0 +||		subi3	*ar5--(ir1),r4,r2 + +		negf	*ar4--(1),r7 +||		stf	r2,*++ar5(1) + +		negi	*-ar3,r2 +||		sti	r2,*ar1++ + +		not	*+ar2,r3 +||		sti	r7,*--ar4(ir1) + +		or3	*++ar2,r5,r2 +||		sti	r6,*ar1-- + +		stf	r4,*ar3-- +||		stf	r3,*++ar5 + +		sti	r0,*++ar2(ir0) +||		sti	r5,*ar0 + +		subf3	r1,*-ar4(ir1),r0 +||		stf	r7,*+ar5(ir0) + +		subi3	r7,*+ar2(ir0),r1 +||		sti	r3,*++ar7 + +		xor3	*ar1++,r3,r3 +||		sti	r6,*-ar2(ir0) + +		xor3	*ar1++,r3,r3 +		||sti	r6,*-ar2(ir0) + +		ldfz	r3,r5 +		ldfzuf	20h,r6 +		ldiz	r4,r6 +		ldp	@123456h,dp + +		pop	r3 +		popf	r4 +		push	r6 +		pushf	r2 + +		ldfz	1.27578125e+01,r4 + +		ldi	*ar5,r6 +		||ldi	*ar5++,r6 + +		addf3	*ar5++,*ar5++,r3 + +		single	 1.79750e+02 +		single	-6.281250e+01 +		single	-9.90337307e+27 +		single   9.90337307e+27 +		single	-6.118750e+01, 1.79750e+02 +		extended 9.90337307e+27 +		bss	20h +		word	20,55,'ABCD' +		data	12345h,-1.2345e6,"Hello world" diff --git a/tests/t_3203x/t_3203x.doc b/tests/t_3203x/t_3203x.doc new file mode 100644 index 0000000..618d68b --- /dev/null +++ b/tests/t_3203x/t_3203x.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 3203x ---------------------------+ +|                                                                            | +|      This is a (synthetic) test of the TMS320C3x instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_3203x/t_3203x.ori b/tests/t_3203x/t_3203x.ori Binary files differnew file mode 100755 index 0000000..7874442 --- /dev/null +++ b/tests/t_3203x/t_3203x.ori diff --git a/tests/t_3205x/asflags b/tests/t_3205x/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_3205x/asflags diff --git a/tests/t_3205x/t_3205x.asm b/tests/t_3205x/t_3205x.asm new file mode 100644 index 0000000..7ae84a6 --- /dev/null +++ b/tests/t_3205x/t_3205x.asm @@ -0,0 +1,499 @@ +;------------------------------------ +; C20x subset + +	cpu	320c203 +	page	0 + +	abs + +	add	#25 +	add	#2255 +	add	#25,0 +	add	#25,1 +	add	#2255,1 +	add	123 +	add	123,3 +	add	123,16 +	add	* +	add	*,3 +	add	*,16 +	add	*,0,AR2 +	add	*,3,AR2 +	add	*,16,AR2 + +	addc	123 +	addc	* +	addc	*,ar2 + +	adds	123 +	adds	* +	adds	*,ar2 + +	addt	123 +	addt	* +	addt	*,ar2 + +	adrk	#30 + +	and	123 +	and	* +	and	*,ar2 +	and	#255 +	and	#255, 3 +	and	#255,16 + +	apac + +	b	1234h +	b	1234h, * +	b       1234h, *, ar2 + +	bacc + +	banz	1234h +	banz	1234h, * +	banz    1234h, *, ar2 + +	bcnd	1234h, eq, c + +	bit	123, 3 +	bit	*, 3 +	bit	*, 3, ar2 + +	bitt	123 +	bitt	* +	bitt	*,ar2 + +	bldd	#10, 123 +	bldd	#10, * +	bldd	#10, *, ar2 +	bldd	123, #10 +	bldd	*, #10 +	bldd	*, #10, ar2 + +	blpd	#1234h, 123 +	blpd	#1233h, *, ar2 + +	cala + +	call	1234h +	call	1234h, * +	call	1234h, *, ar2 + +	cc	1234h, eq, c + +	clrc	c +	clrc	cnf +	clrc	intm +	clrc	ovm +	clrc	sxm +	clrc	tc +	clrc	xf + +	cmpl + +	cmpr	2 + +	dmov	123 +	dmov	* +	dmov	*,ar2 + +	idle + +	in	123, 1234h +	in	*, 1234h +	in	*, 1234h, ar2 + +	intr	4 + +	lacc	123 +	lacc	123, 16 +	lacc	* +	lacc	*, 16 +	lacc	*, 0, ar2 +	lacc	*, 16, ar2 +	lacc	#2 +	lacc	#2, 10 + +	lacl	123 +	lacl	* +	lacl	*, ar2 +	lacl	#23 + +	lact	123 +	lact	* +	lact	*, ar2 + +	lar	ar2, 123 +	lar	ar2, * +	lar	ar2, *, ar2 +	lar	ar2, #10 +	lar	ar2, #1000 + +	ldp	123 +	ldp	*   +	ldp	*, ar2 +	ldp	#40 + +	lph	123 +	lph	* +	lph	*, ar2 + +	lst	#0, 123 +	lst	#0, * +	lst	#0, *, ar2 + +	lst	#1, 123 +	lst	#1, * +	lst	#1, *, ar2 + +        lt	123 +        lt	* +        lt	*, ar2 + +        lta     123 +        lta     * +        lta     *, ar2 + +        ltd     123 +        ltd     * +        ltd     *, ar2 + +        ltp     123 +        ltp     * +        ltp     *, ar2 + +        lts     123 +        lts     * +        lts     *, ar2 + +	mac	1234h, 123 +	mac	1234h, * +	mac	1234h, *, ar2 + +	macd	1234h, 123 +	macd	1234h, *   +	macd	1234h, *, ar2 + +	mar	123 +	mar	* +	mar	*, ar2 + +	mpy	123 +	mpy	* +	mpy	*, ar2 +	mpy	#300 +	mpy	#-300 + +        mpya    123 +        mpya    *   +        mpya    *, ar2 + +        mpys    123 +        mpys    *   +        mpys    *, ar2 + +        mpyu    123 +        mpyu    * +        mpyu    *, ar2 + +	neg + +	nmi + +	nop + +	norm	* +	norm	*, ar2 + +	or 	123 +	or 	* +	or 	*,ar2 +	or 	#255 +	or 	#255, 3 +	or 	#255,16 + +	out	123, 1234h +	out	*, 1234h +	out	*, 1234h, ar2 + +	pac + +	pop + +	popd	123 +	popd	* +	popd	*, ar2 + +        pshd    123 +        pshd    * +        pshd    *, ar2 +	 +	push + +	ret + +	retc	eq + +	rol + +	ror + +	rpt	#30 +	rpt	123 +	rpt	*   +	rpt	*, ar2 + +	sach	123 +	sach	*, 0 +	sach	*, 2 +	sach	*, 0, ar2 +	sach    *, 2, ar2 + +	sacl	123 +	sacl	*, 0 +	sacl	*, 2 +	sacl	*, 0, ar2 +	sacl    *, 2, ar2 + +	sar	ar3, 123 +	sar	ar3, * +	sar	ar3, *, ar2 + +	sbrk	#10 + +	setc	c +	setc	cnf +	setc	intm +	setc	ovm +	setc	sxm +	setc	tc +	setc	xf + +	sfl + +	sfr + +	spac + +        spl     123 +        spl     *   +        spl     *, ar2   + +        sph     123 +        sph     *   +        sph     *, ar2   + +	splk	#1234, 123 +	splk	#1234, * +	splk	#1234, *, ar2 + +	spm	2 + +	sqra	123 +	sqra	* +	sqra	*, ar2 + +        sqrs    123 +        sqrs    *   +        sqrs    *, ar2 + +	sst	#0, 123 +	sst	#0, * +	sst	#0, *, ar2 + +	sst	#1, 123 +	sst	#1, * +	sst	#1, *, ar2 + +	sub	#25 +	sub	#2255 +	sub	#25,0 +	sub	#25,1 +	sub	#2255,1 +	sub	123 +	sub	123,3 +	sub	123,16 +	sub	* +	sub	*,3 +	sub	*,16 +	sub	*,0,AR2 +	sub	*,3,AR2 +	sub	*,16,AR2 + +        subb    123    +        subb    *      +        subb    *, ar2 + +        subc    123 +        subc    * +        subc    *, ar2 + +        subs    123 +        subs    * +        subs    *, ar2 + +        subt    123 +        subt    * +        subt    *, ar2 + +        tblr    123 +        tblr    * +        tblr    *, ar2 + +        tblw    123 +        tblw    * +        tblw    *, ar2 + +	trap + +	xor 	123 +	xor 	* +	xor 	*,ar2 +	xor 	#255 +	xor 	#255, 3 +	xor 	#255,16 + +	zalr	123 +	zalr	* +	zalr	*, ar2 + +;------------------------------------ +; C5x additions + +	cpu	320c50 + +	adcb + +	addb + +	andb + +	apl	#10, 123 +	apl	#10, * +	apl	#10, *, ar2 +	apl	123 +	apl	* +	apl	*, ar2 + +	bd	1234h +	bd	1234h, * +	bd      1234h, *, ar2 + +	baccd + +	banzd	1234h +	banzd	1234h, * +	banzd   1234h, *, ar2 + +	bcndd	1234h, eq, c + +	bldd	bmar, 123 +	bldd	bmar, * +	bldd	bmar, *, ar2 +	bldd	123, bmar +	bldd	*, bmar +	bldd	*, bmar, ar2 + +	bldp	123 +	bldp	* +	bldp	*, ar2 + +	blpd	bmar, 123 +	blpd	bmar, * +	blpd	bmar, *, ar2 + +	bsar	7 + +	calad + +	calld	1234h +	calld	1234h, * +	calld	1234h, *, ar2 + +	ccd	1234h, eq, c + +	cpl	#10, 123 +	cpl	#10, * +	cpl	#10, *, ar2 +	cpl	123 +	cpl	* +	cpl	*, ar2 + +	crgt + +	crlt + +	exar + +	idle2 + +	lacb + +	lamm	123 +	lamm	* +	lamm	*, ar2 + +	lmmr	123, #1234 +	lmmr	*, #1234 +	lmmr    *, #1234, ar2 + +	madd	123 +	madd	* +	madd	*, ar2 + +	mads	123 +	mads	* +	mads	*, ar2 + +	opl	#10, 123 +	opl	#10, * +	opl	#10, *, ar2 +	opl	123 +	opl	* +	opl	*, ar2 + +	orb + +	retd + +	retcd	eq + +	rete + +	reti + +	rolb + +	rorb + +	rptb	123 + +	rptz	#10 + +	sacb + +        samm    123 +        samm    * +        samm    *, ar2 + +	sath + +	satl + +	sbb + +	sbbb + +	sflb + +	sfrb + +; haven't found encoding of the C5x SHM instruction so far :-( +;	shm + +        smmr    123, #1234 +        smmr    *, #1234 +        smmr    *, #1234, ar2 + +	xc	2, eq diff --git a/tests/t_3205x/t_3205x.doc b/tests/t_3205x/t_3205x.doc new file mode 100644 index 0000000..1f2b721 --- /dev/null +++ b/tests/t_3205x/t_3205x.doc @@ -0,0 +1,7 @@ ++------------------------- Test Application 3205x ---------------------------+ +|                                                                            | +|      This is a (synthetic) test of the TMS320C5x instruction set           | +|      It includes moreover a clear separation between the C20x subset and   | +|      the full C5x instruction set.                                         | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_3205x/t_3205x.ori b/tests/t_3205x/t_3205x.ori Binary files differnew file mode 100644 index 0000000..e0089cb --- /dev/null +++ b/tests/t_3205x/t_3205x.ori diff --git a/tests/t_3206x/asflags b/tests/t_3206x/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_3206x/asflags diff --git a/tests/t_3206x/t_3206x.asm b/tests/t_3206x/t_3206x.asm new file mode 100644 index 0000000..5c5804d --- /dev/null +++ b/tests/t_3206x/t_3206x.asm @@ -0,0 +1,241 @@ +		cpu	32060 + +                page	0 + +mv		macro	src,dest +		add.ATTRIBUTE 0,src,dest +                endm + +neg		macro	src,dest +		sub.ATTRIBUTE 0,src,dest +                endm + +not		macro	src,dest +		xor.ATTRIBUTE -1,src,dest +                endm + +                not	a0,a1 + +zero		macro	dest +                xor.ATTRIBUTE dst,dst,dst +                endm + +                mv	a1,a3 +                mv.l2	a1,b3 + +        	nop +||      	nop +||      	nop +        	nop +                nop + +	[b0]    nop +|| 	[!b0]	nop + +		idle + +                nop +                nop	7 + +	abs	a4,a7 +        abs.l1	a4,a7 +        abs	b4,a7 +        abs.l1	b4,a7 +	abs.l1x b4,a7 +        abs	b3:b2,b11:b10 +        abs	a7:a6,b11:b10 + +        add	a1,a3,a7:a6 +        add	a1,b3,a7:a6 +        add	b1,a3,a7:a6 +	add	a7,a5:a4,a13:a12 +        add     b7,a5:a4,a13:a12 +	add	a5:a4,a7,a13:a12 +        add     a5:a4,b7,a13:a12 +        add	b9:b8,-3,b15:b14 +        add	-3,b9:b8,b15:b14 + +	addab.d1  a4,a2,a4 +        addah.d1  a4,a2,a4 +        addaw.d2  b4,2,b4 +	subab.d1  a4,a2,a4 +        subah.d1  a4,a2,a4 +        subaw.d2  b4,2,b4 + +        addk	15401,a1 +        addk.s1 15401,a1 + +        add2	a1,b1,a2 +        sub2	b1,a0,b2 + +        clr	a1,4,19,a2 +        clr	b1,b3,b2 + +        cmpeq.l2 a1,b1,b2 +        cmpeq.l1 -9,a1,a2 +        cmpeq.l2 a1,b3:b2,b1 +        cmpgt.l1 a1,b2,a2 +        cmpgt.l1 a1,b1,a2 +        cmpgt.l1 8,a1,a2 +        cmpgt.l1 a1,b1,a2 +        cmpgtu.l1 a1,a2,a3 +        cmpgtu.l1 0ah,a1,a2 +        cmpgtu.l1 0eh,a3:a2,a4 +        cmplt.l1 a1,a2,a3 +        cmplt.l1 9,a1,a2 +        cmpltu.l1 a1,a2,a3 +        cmpltu.l1 14,a1,a2 +        cmpltu.l1 a1,a5:a4,a2 + +        ext.s1	a1,10,19,a2 +        ext.s1	a1,a2,a3 +        extu.s1	a1,10,19,a2 +        extu.s1 a1,a2,a3 + +        ldw.d1	*a10,a1 +        ldb.d1	*-a5[4],a7 +        ldh.d1	*++a4[a1],a8 +        ldw.d1	*a4++[1],a6 +        ldw.d1	*++a4(4),a6 +        ldb.d2	*+b14[36],b1 + +        lmbd	a1,a2,a3 + +        mpy.m1	a1,a2,a3 +        mpyu.m1 a1,a2,a3 +        mpyus.m1 a1,a2,a3 +        mpy.m1 13,a1,a2 +        mpysu.m1 13,a1,a2 +        mpyh.m1 a1,a2,a3 +        mpyhu.m1 a1,a2,a3 +        mpyhsu.m1 a1,a2,a3 +	mpyhl.m1 a1,a2,a3 +        mpylh.m1 a1,a2,a3 + +	mvc.s2	a1,amr +        mvc	istp,b4 + +        mvk.s1	293,a1 +        mvk.s2	125h,b1 +        mvk.s1	0ff12h,a1 +        mvkh.s1	0a329123h,a1 +        mvklh	7a8h,a1 + +        norm	a1,a2 +        norm	a1:a0,a2 + +        sadd.l1	a1,a2,a3 +        sadd.l1 b2,a5:a4,a7:a6 + +        sat.l1	a1:a0,a2 +        sat.l2	b1:b0,b5 + +        set.s1	a0,7,21,a1 +        set.s2	b0,b1,b2 + +        shl.s1	a0,4,a1 +        shl.s2	b0,b1,b2 +        shl.s2	b1:b0,b2,b3:b2 + +        shr.s1	a0,8,a1 +        shr.s2	b0,b1,b2 +        shr.s2	b1:b0,b2,b3:b2 + +        shru.s1	a0,8,a1 + +        smpy.m1	a1,a2,a3 +        smpyhl.m1 a1,a2,a3 +        smpylh.m1 a1,a2,a3 + +        sshl.s1	a0,2,a1 +        sshl.s1	a0,a1,a2 + +        ssub.l2	b1,b2,b3 +        ssub.l1	a0,a1,a2 + +        stb.d1	a1,*a10 +        sth.d1	a1,*+a10(4) +        stw.d1	a1,*++a10[1] +        sth.d1	a1,*a10--[a11] +        stb.d2	b1,*+b14[40] + +        align   32 +        mvk.s1	2c80h,a0 +||      mvk.s2	0200h,b0 +	mvkh.s1 01880000h,a0 +||	mvkh.s2 00000000h,b0 +	mvc.s2	a0,pdata_o +        stp.s2	b0 +        nop	4 +        mpy.m1	a1,a2,a3 + +        sub.l1	a1,a2,a3 +        subu.l1	a1,a2,a5:a4 +        subc.l1	a0,a1,a0 + +        align   32 +        ifdef error +        add.s1  a0,a1,a2 +||      shr.s1  a3,15,a4 +        endif +        add.l1  a0,a1,a2 +||      shr.s1  a3,15,a4 + +        align   32 +        ifdef   error +        add.l1x a0,b1,a1 +||      mpy.m1x a4,b4,a5 +        endif +        add.l1x a0,b1,a1 +||      mpy.m2x a4,b4,b2 + +        align   32 +        ifdef   error +        ldw.d1  *a0,a1 +||      ldw.d1  *a2,b2 +        endif +        ldw.d1  *a0,a1 +||      ldw.d2  *b0,b2 + +        align   32 +        ifdef   error +        ldw.d1  *a4,a5 +||      stw.d2  a6,*b4 +        endif +        ldw.d1  *a4,b4 +||      stw.d2  a6,*b4 + +        align   32 +        ifdef   error +        add.l1  a5:a4,a1,a3:a2 +||      shl.s1  a8,a9,a7:a6 +        endif +        add.l1  a5:a4,a1,a3:a2 +||      shl.s2  b8,b9,b7:b6 + +        align   32 +        ifdef   error +        add.l1  a5:a4,a1,a3:a2 +||      stw.d1  a8,*a9 +        endif +        add.l1  a4,a1,a3:a2 +||      stw.d1  a8,*a9 + +        align   32 +        ifdef   error +        mpy.m1  a1,a1,a4 +||      add.l1  a1,a1,a5 +||      sub.d1  a1,a2,a3 +        endif +        mpy.m1  a1,a1,a4 +|| [a1] add.l1  a0,a1,a5 +||      sub.d1  a1,a2,a3 + +        align   32 +        ifdef   error +        add.l2  b5,b6,b7 +||      sub.s2  b8,b9,b7 +        endif +[!b0]   add.l2  b5,b6,b7 +|| [b0] sub.s2  b8,b9,b7 + diff --git a/tests/t_3206x/t_3206x.doc b/tests/t_3206x/t_3206x.doc new file mode 100644 index 0000000..ddfa640 --- /dev/null +++ b/tests/t_3206x/t_3206x.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 3206x ---------------------------+ +|                                                                            | +|      This is a (synthetic) test of the TMS320C6x instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_3206x/t_3206x.ori b/tests/t_3206x/t_3206x.ori Binary files differnew file mode 100644 index 0000000..d8cf606 --- /dev/null +++ b/tests/t_3206x/t_3206x.ori diff --git a/tests/t_370/asflags b/tests/t_370/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_370/asflags diff --git a/tests/t_370/t_370.asm b/tests/t_370/t_370.asm new file mode 100644 index 0000000..120f985 --- /dev/null +++ b/tests/t_370/t_370.asm @@ -0,0 +1,163 @@ +		page	0 + +		cpu	370c010 + +cat		equ	r16 +dog		equ	r011 +mouse		equ	p055 +rat		equ	p127 + +		clrc +		setc +		dint +		eint +		eintl +		einth +		idle +		ldsp +		stsp +		nop +		rti +		rts + +Targ:		jmp	Targ +		jc	Targ +		jeq	Targ +		jg	Targ +		jge	Targ +		jhs	Targ +		jl	Targ +		jle	Targ +		jlo	Targ +		jn	Targ +		jnc	Targ +		jne	Targ +		jnv	Targ +		jnz	Targ +		jp	Targ +		jpz	Targ +		jv	Targ +		jz	Targ + +		adc	b,a +		add	dog,a +		dac	cat,b +		dsb	dog,cat +		sbb	#55h,a +		sub	#0aah,b +		mpy	#' ',dog + +		and	a,p050 +		btjo	b,a,Targ +		btjz	b,p10,Targ +		or	cat,a +		xor	dog,b +		and	r020,r10 +		btjo	#55,a,Targ +		btjz	#66,b,Targ +		or	#77,r10 +		xor	#88,rat + +		br	Targ +		br	@dog +		br	Targ(b) +		br	10(cat) +		call	Targ +		call	@dog +		call	Targ(b) +		call	10(cat) +		callr	Targ +		callr	@dog +		callr	Targ(b) +		callr	10(cat) +		jmpl	Targ +		jmpl	@dog +		jmpl	Targ(b) +		jmpl	10(cat) + +		clr	a +		compl	b +		dec	cat +		inc	a +		inv	b +		pop	dog +		push	a +		pop	st +		push	st +		rl	b +		rlc	r020 +		rr	a +		rrc	b +		swap	dog +		xchb	a +		djnz	b,$ + +		cmp	2000h,a +		cmp	@dog,a +		cmp	targ(b),a +		cmp	10(cat),a +		cmp	-5(sp),a +		cmp	b,a +		cmp	dog,a +		cmp	cat,b +		cmp	cat,dog +		cmp	#55h,a +		cmp	#66h,b +		cmp	#77h,r0ff + +bit1		dbit	1,r12 +bit2		dbit	4,p033 +bit3		dbit	5,b + +		cmpbit	bit1 +		cmpbit	bit2 +		jbit0	bit1,$ +		jbit0	bit2,$ +		jbit1	bit1,$ +		jbit1	bit2,$ +		sbit0	bit1 +		sbit0	bit2 +		sbit1	bit1 +		sbit1	bit2 + +		div	r45,a +		incw	#56h,dog +		ldst	#12 + +		mov	a,b +		mov	a,cat +		mov	a,mouse +		mov	a,1234h +		mov	a,@r33 +		mov	a,Targ(b) +		mov	a,15(r015) +		mov	a,-2(sp) +		mov	dog,a +		mov	cat,b +		mov	1234h,a +		mov	@dog,a +		mov	Targ(b),a +		mov	-33(cat),a +		mov	15(sp),a +		mov	b,a +		mov	b,dog +		mov	b,rat +		mov	cat,dog +		mov	dog,mouse +		mov	rat,a +		mov	p15,b +		mov	p15,r015 +		mov	#11h,a +		mov	#-1,b +		mov	#0110110b,r10 +		mov	#10h,rat + +		movw	cat,dog +		movw	#12345,r010 +		movw	#Targ(b),cat +		movw	#(cat),cat + +		trap	7 + +		tst	a +		tst	b diff --git a/tests/t_370/t_370.doc b/tests/t_370/t_370.doc new file mode 100644 index 0000000..da6bdb5 --- /dev/null +++ b/tests/t_370/t_370.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application 370 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the TMS370 instruction set              | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_370/t_370.ori b/tests/t_370/t_370.ori Binary files differnew file mode 100644 index 0000000..75db2ab --- /dev/null +++ b/tests/t_370/t_370.ori diff --git a/tests/t_4004/asflags b/tests/t_4004/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_4004/asflags diff --git a/tests/t_4004/t_4004.asm b/tests/t_4004/t_4004.asm new file mode 100644 index 0000000..fc6d55f --- /dev/null +++ b/tests/t_4004/t_4004.asm @@ -0,0 +1,205 @@ +	cpu	4004 + +	nop + +	jcn	z, Next +	jcn	nz, Next +	jcn	c, Next +	jcn	nc, Next +	jcn	t, Next +	jcn	nt, Next +	jcm	z, Next +	jcm	nz, Next +	jcm	c, Next +	jcm	nc, Next +	jcm	t, Next +	jcm	nt, Next +Next: +	fim	r0r1, 12h +	fim	r2r3, 23h +	fim	r4r5, 34h +	fim	r6r7, 45h +	fim	r8r9, 56h +	fim	rarb, 67h +	fim	rcrd, 78h +	fim	rerf, 89h + +	src	r0r1 +	src	r2r3 +	src	r4r5 +	src	r6r7 +	src	r8r9 +	src	rarb +	src	rcrd +	src	rerf + +	fin	r0r1 +	fin	r2r3 +	fin	r4r5 +	fin	r6r7 +	fin	r8r9 +	fin	rarb +	fin	rcrd +	fin	rerf + +	jin	r0r1 +	jin	r2r3 +	jin	r4r5 +	jin	r6r7 +	jin	r8r9 +	jin	rarb +	jin	rcrd +	jin	rerf + +	jun	123h +	jms	456h + +	inc	r0 +	inc	r1 +	inc	r2 +	inc	r3 +	inc	r4 +	inc	r5 +	inc	r6 +	inc	r7 +	inc	r8 +	inc	r9 +	inc	ra +	inc	rb +	inc	rc +	inc	rd +	inc	re +	inc	rf + +loop: +	isz	r0, loop +	isz	r1, loop +	isz	r2, loop +	isz	r3, loop +	isz	r4, loop +	isz	r5, loop +	isz	r6, loop +	isz	r7, loop +	isz	r8, loop +	isz	r9, loop +	isz	ra, loop +	isz	rb, loop +	isz	rc, loop +	isz	rd, loop +	isz	re, loop +	isz	rf, loop + +	add	a, r0 +	add	a, r1 +	add	a, r2 +	add	a, r3 +	add	a, r4 +	add	a, r5 +	add	a, r6 +	add	a, r7 +	add	a, r8 +	add	a, r9 +	add	a, ra +	add	a, rb +	add	a, rc +	add	a, rd +	add	a, re +	add	a, rf + +	sub	a, r0 +	sub	a, r1 +	sub	a, r2 +	sub	a, r3 +	sub	a, r4 +	sub	a, r5 +	sub	a, r6 +	sub	a, r7 +	sub	a, r8 +	sub	a, r9 +	sub	a, ra +	sub	a, rb +	sub	a, rc +	sub	a, rd +	sub	a, re +	sub	a, rf + +	ld	a, r0 +	ld	a, r1 +	ld	a, r2 +	ld	a, r3 +	ld	a, r4 +	ld	a, r5 +	ld	a, r6 +	ld	a, r7 +	ld	a, r8 +	ld	a, r9 +	ld	a, ra +	ld	a, rb +	ld	a, rc +	ld	a, rd +	ld	a, re +	ld	a, rf + +        xch	r0 +        xch	r1 +        xch	r2 +        xch	r3 +        xch	r4 +        xch	r5 +        xch	r6 +        xch	r7 +        xch	r8 +        xch	r9 +        xch	ra +        xch	rb +        xch	rc +        xch	rd +        xch	re +        xch	rf + +	bbl	1 +	bbl	3 +	bbl	0dh + +	ldm	1 +	ldm	3 +	ldm	0dh + +	wrm +	wmp +	wrr +	wpm +	wr0 +	wr1 +	wr2 +	wr3 +	sbm +	rdm +	rdr +	adm +	ad0 +	ad1 +	ad2 +	ad3 +	rd0 +	rd1 +	rd2 +	rd3 + +	clb +	clc +	iac +	cmc +	cma +	ral +	rar +	tcc +	dac +	tcs +	stc +	daa +	kbp +	dcl + +	data	1,2,3,4,5 +	data	"This is a test" diff --git a/tests/t_4004/t_4004.doc b/tests/t_4004/t_4004.doc new file mode 100644 index 0000000..a5f66e1 --- /dev/null +++ b/tests/t_4004/t_4004.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 4004 ----------------------------+ +|                                                                            | +|            This is a (synthetic) test of the 4004 instruction set          | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_4004/t_4004.ori b/tests/t_4004/t_4004.ori Binary files differnew file mode 100644 index 0000000..e508c0c --- /dev/null +++ b/tests/t_4004/t_4004.ori diff --git a/tests/t_403/asflags b/tests/t_403/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_403/asflags diff --git a/tests/t_403/t_403.asm b/tests/t_403/t_403.asm new file mode 100644 index 0000000..0ee143a --- /dev/null +++ b/tests/t_403/t_403.asm @@ -0,0 +1,27 @@ +        cpu     ppc403 +        page    0 +        include stddef60 + +	org	0x1000 + + +        mtdcr   10,r5 +        mtbear  r5 +        mfdcr   r5,10 +        mfbesr  r5 +        wrtee   r10 +        wrteei  1 + +        bdnzl   0x10 +        bdztla  7,0x10 +        beq     0x10 +        beq     2,0x10 +        beq	cr2,0x10 + +        cmpw    r1,r2 +        clrlwi  r1,r2,5 + +        mtspr	pit,r5 + +        mcrf	cr4,cr5 +        mcrf	4,5 diff --git a/tests/t_403/t_403.doc b/tests/t_403/t_403.doc new file mode 100644 index 0000000..893ca08 --- /dev/null +++ b/tests/t_403/t_403.doc @@ -0,0 +1,6 @@ ++------------------------- Test Application 403 -----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the PPC403's extensions to the PowerPC  | +|      basic instruction set.                                                | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_403/t_403.ori b/tests/t_403/t_403.ori Binary files differnew file mode 100644 index 0000000..8bae53a --- /dev/null +++ b/tests/t_403/t_403.ori diff --git a/tests/t_4500/asflags b/tests/t_4500/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_4500/asflags diff --git a/tests/t_4500/t_4500.asm b/tests/t_4500/t_4500.asm new file mode 100644 index 0000000..5e9f028 --- /dev/null +++ b/tests/t_4500/t_4500.asm @@ -0,0 +1,109 @@ +	cpu     melps4500 + +        a       10 +        am +        amc +        and +        b       $20 +        bl      $20,$20 +        bl      $1234 +        bla     7 +        bm      $110 +        bml     $20,$20 +        bml     $1234 +        bmla    7 +        cld +        cma +        dey +        di +        ei +        iap0 +        iap1 +        iap2 +        iap3 +        iap4 +        iny +        la      $c +        lxy     2,3 +        lxy     $ac +        lz      %10 +        nop +        or +        op0a +        op1a +        pof +        pof2 +        rar +        rb      2 +        rc +        rc3 +        rc4 +        rd +        rt +        rti +        rts +        sb      1 +        sc +        sc3 +        sc4 +        sd +        sea     3 +        seam +        snz0 +        snzp +        snzt1 +        snzt2 +        snzt3 +        spcr +        stcr +        szb     3 +        szc +        szd +        t1r1 +        t3ab +        tab +        tab3 +        tabe +        tabp    1 +        tad +        tai1 +        tal1 +        tam     7 +        tamr +        tasp +        tav1 +        taw1 +        taw2 +        taw3 +        tax +        tay +        taz +        tba +        tc1a +        tc2a +        tda +        teab +        ti1a +        tl1a +        tl2a +        tl3a +        tlca +        tma     12 +        tmra +        tpta +        tpaa +        tr1a +        tr1ab +        tv1a +        tw1a +        tw2a +        tw3a +        tya +        wrst +        xam     2 +        xamd    12 +        xami    6 + +	res	5 +	data	10,1000,-13,'A' +	data	"ABC" diff --git a/tests/t_4500/t_4500.doc b/tests/t_4500/t_4500.doc new file mode 100644 index 0000000..7cb1aec --- /dev/null +++ b/tests/t_4500/t_4500.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 4500 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the MELPS/45xx instruction set          | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_4500/t_4500.ori b/tests/t_4500/t_4500.ori Binary files differnew file mode 100644 index 0000000..727e60d --- /dev/null +++ b/tests/t_4500/t_4500.ori diff --git a/tests/t_47c00/asflags b/tests/t_47c00/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_47c00/asflags diff --git a/tests/t_47c00/t_47c00.asm b/tests/t_47c00/t_47c00.asm new file mode 100644 index 0000000..30ab5d9 --- /dev/null +++ b/tests/t_47c00/t_47c00.asm @@ -0,0 +1,255 @@ +	cpu	470ac00 +	include	stddef47.inc + +	page 	0 + + +	segment	data + +nvar1	db	? +nvar2	db	? +	align	4 +bvar	db	2 dup (?) + + +	segment	io + +port1	db	? +port2	db	? +port3	port	7 + +	segment	code + +targ:	db	? + +	ret +	nop +	reti + +	inc	@hl +	dec	@hl +	inc	a +	dec	a +	inc	l +	dec	l + +	and	a,@hl +	and	@hl,#3 +	and	a,#5 +	or	a,@hl +	or	@hl,#3 +	or	a,#5 +	xor	a,@hl + +	ld	a,@hl +	ld	a,123 +	ld	hl,bvar +	ld	a,#4 +	ld	h,#-3 +	ld	l,#7 +	ld	hl,#0a5h +	ld	dmb,#2 +	ld	dmb,@hl + +	ldl	a,@dc +	ldh	a,@dc+ + +	st	a,@hl +	st	a,@hl+ +	st	a,@hl- +	st	a,123 +	st	#3,@hl+ +	st	#5,nvar1 +	st      dmb,@hl + +	mov	h,a +	mov	l,a +	mov	a,dmb +	mov	dmb,a +	mov	a,spw13 +	mov	stk13,a + +	xch	a,@hl +	xch	nvar2,a +	xch	hl,bvar +	xch	a,l +	xch	h,a +	xch	eir,a + +	in	%port1,a +	in	%15h,a +	in	%port2,@hl +	in	%1ah,@hl + +	out	a,%port1 +	out	@hl,%port2 +	out	#-3,%port2 + +	outb	@hl + +	cmpr	a,@hl +	cmpr	a,nvar2 +	cmpr	nvar2,#3 +	cmpr	a,#4 +	cmpr	h,#5 +	cmpr	l,#6 + +	add	a,@hl +	add	@hl,#4 +	add	nvar2,#5 +	add	a,#6 +	add	h,#7 +	add	l,#7 + +	addc	a,@hl +	subrc	a,@hl + +	subr	a,#7 +	subr	@hl,#0ah + +	rolc	a +	rolc	a,3 +	rorc	a +	rorc	a,2 + +	clr	@l +	set	@l +	test	@l + +	test	cf +	testp	cf + +	testp	zf + +;	clr	gf +;	set	gf +;	testp	gf + +;	clr	dmb +;	set	dmb +;	test	dmb +;	testp	dmb + +	clr	dmb0 +	set	dmb0 +	test	dmb0 +	testp	dmb0 + +	clr	dmb1 +	set	dmb1 +	test	dmb1 +	testp	dmb1 + +	clr	stk13 +	set	stk13 + +	clr	il,8h + +	test	a,2 + +	clr	@hl,1 +	set	@hl,3 +	test	@hl,2 + +	clr	%5,1 +	set	%6,3 +	test	%7,2 +	testp	%8,0 + +	clr	nvar2,1 +	set	nvar2,3 +	test	nvar2,2 +	testp	nvar2,0 + +	bss	($&3fc0h)+20h +	bs	123h +	bsl	0123h +	bsl	1123h +	bsl	2123h +	bsl     3123h + +	calls	002eh + +	call	123h + +	eiclr	il,3 +	diclr	il,5 + +	b	($&3fc0h)+20h +	b	123h +	b	0123h +	b	1123h +	b	2123h +	b	3123h + +	bz	targ +	bnz	targ +	bc	targ +	bnc	targ +	be	a,@hl,targ +	be	a,nvar2,targ +	be	a,#3,targ +	be      h,#4,targ +	be	l,#5,targ +	be	nvar1,#6,targ +	bne	a,@hl,targ +	bne	a,nvar2,targ +	bne	a,#3,targ +	bne     h,#4,targ +	bne	l,#5,targ +	bne	nvar1,#6,targ +	bge	a,@hl,targ +	bge	a,nvar2,targ +	bge	a,#3,targ +	bge     h,#4,targ +	bge	l,#5,targ +	bge	nvar1,#6,targ +	bgt	a,@hl,targ +	bgt	a,nvar2,targ +	bgt	a,#3,targ +	bgt     h,#4,targ +	bgt	l,#5,targ +	bgt	nvar1,#6,targ +	ble	a,@hl,targ +	ble	a,nvar2,targ +	ble	a,#3,targ +	ble     h,#4,targ +	ble	l,#5,targ +	ble	nvar1,#6,targ +	blt	a,@hl,targ +	blt	a,nvar2,targ +	blt	a,#3,targ +	blt     h,#4,targ +	blt	l,#5,targ +	blt	nvar1,#6,targ + +	callss	0 +	callss	5 + +	callz	targ +	callnz	targ +	callc	targ +	callnc	targ + +	retz +	retnz +	retc +	retnc +	retiz +	retinz +	retic +	retinc + +	shl	a,2 +	shl     h,2 +	shl	l,2 +	shl	@hl,2 +	shl	nvar1,2 +	shr	a,2 +	shr     h,2 +	shr	l,2 +	shr	@hl,2 +	shr	nvar1,2 + +	ei +	di
\ No newline at end of file diff --git a/tests/t_47c00/t_47c00.doc b/tests/t_47c00/t_47c00.doc new file mode 100644 index 0000000..23953b5 --- /dev/null +++ b/tests/t_47c00/t_47c00.doc @@ -0,0 +1,5 @@ ++------------------------ Test Application 47C00 ----------------------------+ +|                                                                            | +|     This is a (synthetic) test of the TLCS-47(0(A)) instruction set        | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_47c00/t_47c00.ori b/tests/t_47c00/t_47c00.ori Binary files differnew file mode 100644 index 0000000..122b6d9 --- /dev/null +++ b/tests/t_47c00/t_47c00.ori diff --git a/tests/t_48/asflags b/tests/t_48/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_48/asflags diff --git a/tests/t_48/t_48.asm b/tests/t_48/t_48.asm new file mode 100644 index 0000000..fc50424 --- /dev/null +++ b/tests/t_48/t_48.asm @@ -0,0 +1,178 @@ +        cpu     8048 + +        add     a,r2 +        add     a,@r1 +        add     a,#21h + +        addc    a,r3 +        addc    a,@r1 +        addc    a,#21h + +        anl     a,r4 +        anl     a,@r1 +        anl     a,#21h +        anl     bus,#12h + +        anld    p5,a + +        call    345h + +        clr     a +        clr     c +        clr     f0 +        clr     f1 + +        cpl     a +        cpl     c +        cpl     f0 +        cpl     f1 + +        da      a + +        dec     a +        dec     r1 + +        dis     i +        dis     tcnti + +        djnz    r2,$ + +        en      i +        en      tcnti + +        ent0    clk + +        in      a,p1 +        in      a,p2 + +        inc     a +        inc     r7 +        inc     @r1 + +        ins     a,bus + +        jb3     $ + +        jc      $ + +        jf0     $ +        jf1     $ + +        jmp     123h + +        jnc     $ + +        jni     $ + +        jnt0    $ +        jnt1    $ + +        jnz     $ + +        jt0     $ +        jt1     $ + +        jtf     $ + +        jz      $ + +        jmpp    @a + +        mov     a,r2 +        mov     a,@r1 +        mov     a,#21h +        mov     r3,a +        mov     @r1,a +        mov     r4,#21h +        mov     @r1,#21h +        mov     a,psw +        mov     psw,a +        mov     a,t +        mov     t,a + +        movd    a,p5 +        movd    p6,a + +        movx    a,@r1 +        movx    @r1,a + +        movp    a,@a +        movp3   a,@a + +        nop + +        orl     a,r5 +        orl     a,@r1 +        orl     a,#21h +        orl     bus,#12h + +        orld    p5,a + +        outl    p1,a +        outl    p2,a +        outl    bus,a + +        ret + +        retr + +        rl      a + +        rlc     a + +        rr      a + +        rrc     a + +        sel     mb0 +        sel     mb1 +        sel     rb0 +        sel     rb1 + +        strt    cnt +        strt    t + +        stop    tcnt + +        swap    a + +        xch     a,r5 +        xch     a,@r1 + +        xchd    a,@r1 + +        xrl     a,r6 +        xrl     a,@r1 +        xrl     a,#21h + + +        cpu     8041 + +        en      dma +        en      flags + +        in      a,dbb + +        jnibf   $ + +        jobf    $ + +        mov     sts,a + +        out     dbb,a + + +        cpu     80c39 + +        idl + + +        cpu     8022 + +        in      a,p0 +        outl    p0,a + +        sel     an0 +        sel     an1 +        rad + diff --git a/tests/t_48/t_48.doc b/tests/t_48/t_48.doc new file mode 100644 index 0000000..1ca6179 --- /dev/null +++ b/tests/t_48/t_48.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application 48 -----------------------------+ +|                                                                            | +|          This is a (synthetic) test of the MCS-48 instruction set          | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_48/t_48.ori b/tests/t_48/t_48.ori Binary files differnew file mode 100644 index 0000000..15d3a3b --- /dev/null +++ b/tests/t_48/t_48.ori diff --git a/tests/t_56000/asflags b/tests/t_56000/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_56000/asflags diff --git a/tests/t_56000/t_56000.asm b/tests/t_56000/t_56000.asm new file mode 100644 index 0000000..acf594f --- /dev/null +++ b/tests/t_56000/t_56000.asm @@ -0,0 +1,244 @@ +		page	0 + +		cpu	56000 + +                include stddef56k.inc + +		segment	code +		org	$300 + +		nop +		enddo +		illegal +		reset +		rti +		rts +		stop +		swi +		wait + +		jmp	$214 +		jsr	$889 +		jmp	$3567 +		jsr	$2340 +		jmp	(r3) +		jsr	(r5) +		jmp	(r6)+ +		jsr	(r1)+ +		jmp	(r4)- +		jsr	(r2)- +		jmp	-(r5) +		jsr	-(r0) +		jmp	(r3+n3) +		jsr	(r7+n7) +		jmp	(r2)+n2 +		jsr	(r6)+n6 +		jmp	(r5)-n5 +		jsr	(r3)-n3 + +		jcc	$123 +		jge	$2345 +		jne	(r7) +		jpl	(r6)- +		jnn	(r5)+ +		jec	-(r4) +		jlc	(r3+n3) +		jgt	(r2)+n2 +		jcs	(r1)-n1 +		jlt	$123 +		jeq	$2345 +		jmi	(r0) +		jnr	(r1)- +		jes	(r2)+ +		jls	-(r3) +		jle	(r4+n4) +		jhs	(r5)+n5 +		jlo	(r6)-n6 + +		jsnn	$768 +		jsle	(r0) + + +		move	(r3)+n3 +		move	(r4)-n4 +		move	(r2)- +		move	(r6)+ + +		move	n5,a2 +		move	r4,b1 +		move	a0,b2 +		move	a,r4 + +		move	#$30,n5 +		move	#$ff,r3 + +		move	x:#$123456,a0 +		move	y:#$234567,y1 +		move	  #$345678,r5 +		move	y:#$456789,n1 + +		move	x:$12,b2 +		move	y:$34,n6 +		move	x:$1234,a +		move	y:$2345,b2 +		move	b2,x:$12 +		move	n6,y:$34 +		move	a,x:$1234 +		move	b2,y:$2345 + +		move	x:(r3),a0 +		move	y:(r4)+n4,x1 +		move	a0,x:(r3) +		move	x1,y:(r4)+n4 + +		move	l:$12,ab +		move	$3456,y +		move	ab,l:$12 +		move	y,$3456 + +		move	b,x:(r1)+ x0,b +		move	y0,b b,y:(r1)+ + +		move	x1,x:(r2)+ a,y:(r5)+n5 +		move	x:(r2)+,x1 a,y:(r5)+n5 +		move	x:(r2)+,x1 y:(r5)+n5,a + +		move	x:(r5),x1    a,y1 +		move	a,x:-(r1)    b,y0 +		move	b,x:$1234    a,y0 +		move	#$234567,x0  b,y1 + +		move	b,x1 y:(r6)-n6,b + +		abs	a #$123456,x0 a,y0 +		asl	a (r3)- +		asr	b x:-(r3),r3 +		clr	a #$7f,n0 +		lsl	b #$7f,r0 +		lsr	a a1,n4 +		neg	b x1,x:(r3)+ y:(r6)-,a +		not	a ab,l:(r2)+ +		rnd	a #$123456,x1 b,y1 +		rol	a #$314,n2 +		ror	b #$1234,r2 +		tst	a #$345678,b +		adc	y,b a10,l:$4 +		sbc	y,b a10,l:$4 +		add	x0,a a,x1 a,y:(r1)+ +		cmp	y0,b x0,x:(r6)+n6 y1,y:(r0)- +		cmpm	x1,a ba,l:-(r4) +		sub	x1,a x:(r2)+n2,r0 +		addl	a,b #$0,r0 +		addr	b,a x0,x:(r1)+n1 y0,y:(r4)- +		subl	a,b y:(r5+n5),r7 +		subr	b,a n5,y:-(r5) +		and	x0,a (r5)-n5 +		eor	y1,b (r2)+ +		or	y1,b ba,l:$1234 +		mac	x0,x0,a x:(r2)+n2,y1 +		macr	x0,y0,b y:(r4)+n4,y0 +		mpy	-x1,y1,a #$543210,y0 +		mpyr	-y0,y0,b (r3)-n3 + +		bchg	#$7,x:$ffe2 +		bclr	#$e,x:$ffe4 +		bset	#$0,x:$ffe5 +		btst	#$1,x:$ffee +		bclr    #$4,y:$ffe0 +		bclr	#$5,x:$0020 +		bclr	#$6,y:$0012 +		bclr	#$7,x:$1234 +		bclr	#$8,y:(r3)+ +		bclr	#$9,r5 +		bclr    #$a,m6 +		bclr	#$b,omr + +		div	x1,b + +		do	x:(r3),$1234 +		do	y:(r5+n5),$2345 +		do	x:$12,$3456 +		do	y:$23,$4567 +		do	#$123,$5678 +		do	n7,$6789 + +		jclr	#$5,x:$fff1,$1234 +		jsclr	#$1,y:$ffe3,$1357 +		jset	#12,x:$fff2,$4321 +		jsset	#$17,y:$3f,$100 +		jclr	#21,x:(r5),$6789 +		jclr	#22,ssh,$5678 + +		lua	(r0)+n0,r1 + +		movec	m0,m2 +		movec	m4,r2 +		movec	n5,ssl +		movec	#0,omr +		movec	#123456,ssh +		movec	x:$12,m2 +		movec	m2,x:$12 +		movec	y:$23,m2 +		movec	m2,y:$23 +		movec	x:(r4),m5 +		movec	m5,y:(r4) +		movec	y:(r4),m5 +		movec	m5,x:(r4) + +		movem	m4,$12 +		movem	$12,m4 +		movem	$123,m4 +		movem	m4,$123 + +		andi	#2,ccr +		ori	#5,omr + +		norm	r5,a +		norm	r2,b + +		rep	r4 +		rep	#$987 +		rep	x:$12 +		rep	y:$23 +		rep	x:(r3) +		rep	y:$12 + +		movep	x:(r3),x:$ffe0 +		movep	y:(r3),x:$ffe1 +		movep	#$123456,x:$ffe2 +		movep	x:$ffe3,x:(r3) +		movep	x:$ffe4,y:(r3) +		movep	x:(r3),y:$ffe5 +		movep	y:(r3),y:$ffe6 +		movep	#$123456,y:$ffe7 +		movep	y:$ffe8,x:(r3) +		movep	y:$ffe9,y:(r3) +		movep	p:(r3),x:$ffea +		movep	x:$ffeb,p:(r3) +		movep	p:(r3),y:$ffec +		movep	y:$ffed,p:(r3) +		movep	a1,x:$ffef +		movep	x:$fff0,r3 +		movep	n5,y:$fff1 +		movep	y:$fff2,m1 + +		tfr	a,b a,x1 y:(r4+n4),y0 +		tfr	y0,a + +		tgt	x0,a r0,r1 +		tne	y1,a + +		dc	"Hallo" +		dc	'123' +		dc	$123456 +		dc	"Dies ist ein Test, Leute" 0 + +		segment	xdata + +		org	$123 +var1:   	ds	1 + +		segment	ydata + +		org	$234 +var2:		ds	1 diff --git a/tests/t_56000/t_56000.doc b/tests/t_56000/t_56000.doc new file mode 100644 index 0000000..326f888 --- /dev/null +++ b/tests/t_56000/t_56000.doc @@ -0,0 +1,5 @@ ++----------------------  Test Application 56000  ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the DSP56K code generator               | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_56000/t_56000.ori b/tests/t_56000/t_56000.ori Binary files differnew file mode 100644 index 0000000..e661401 --- /dev/null +++ b/tests/t_56000/t_56000.ori diff --git a/tests/t_56300/asflags b/tests/t_56300/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_56300/asflags diff --git a/tests/t_56300/t_56300.asm b/tests/t_56300/t_56300.asm new file mode 100644 index 0000000..d392a11 --- /dev/null +++ b/tests/t_56300/t_56300.asm @@ -0,0 +1,1462 @@ +        cpu     56300 +        page    0 + +        org     $8000 + +        abs     a		; >=56000 +        abs     b + +        adc	x,a		; >=56000 +        adc	y,a +        adc	x,b +        adc	y,b + +        add	x0,a		; >=56000 +        add	x1,a +        add	y0,a +        add	y1,a +        add	x,a +        add	y,a +        add	b,a +        add	x0,b		; >=56000 +        add	x1,b +        add	y0,b +        add	y1,b +        add	x,b +        add	y,b +        add	a,b + +	add	#31,a		; >=56300 +        add	#1234,a +        add	#31,b +        add	#1234,b + +	addl	b,a		; >=56000 +        addl	a,b + +        addr	b,a +        addr	a,b + +        and	x0,a		; >=56000 +	and	x1,a +        and	y0,a +        and	y1,a +        and	x0,b +        and	x1,b +        and	y0,b +        and	y1,b + +        and	#31,a		; >=56000 +        and	#1234,a +        and	#31,b +        and	#1234,b + +        andi    #$12,mr         ; >=56000 +        andi    #$12,ccr +        andi    #$12,com +        andi    #$12,eom + +        asl     a               ; >=56000 +        asl     b +        asl     #$23,a,a        ; >=56300 +        asl     #$23,a,b +        asl     #$23,b,a +        asl     #$23,b,b +        asl     a1,a,a          ; >=56300 +        asl     b1,a,a +        asl     x0,a,a +        asl     y0,a,a +        asl     x1,a,a +        asl     y1,a,a +        asl     a1,a,b +        asl     b1,a,b +        asl     x0,a,b +        asl     y0,a,b +        asl     x1,a,b +        asl     y1,a,b +        asl     a1,b,a +        asl     b1,b,a +        asl     x0,b,a +        asl     y0,b,a +        asl     x1,b,a +        asl     y1,b,a +        asl     a1,b,b +        asl     b1,b,b +        asl     x0,b,b +        asl     y0,b,b +        asl     x1,b,b +        asl     y1,b,b + +        asr     a               ; >=56000 +        asr     b +        asr     #$23,a,a        ; >=56300 +        asr     #$23,a,b +        asr     #$23,b,a +        asr     #$23,b,b +        asr     a1,a,a          ; >=56300 +        asr     b1,a,a +        asr     x0,a,a +        asr     y0,a,a +        asr     x1,a,a +        asr     y1,a,a +        asr     a1,a,b +        asr     b1,a,b +        asr     x0,a,b +        asr     y0,a,b +        asr     x1,a,b +        asr     y1,a,b +        asr     a1,b,a +        asr     b1,b,a +        asr     x0,b,a +        asr     y0,b,a +        asr     x1,b,a +        asr     y1,b,a +        asr     a1,b,b +        asr     b1,b,b +        asr     x0,b,b +        asr     y0,b,b +        asr     x1,b,b +        asr     y1,b,b + +        bcc     *+$2000 +        bge     *+$20 +        bne     r3 +        bpl     *-$2000 +        bnn     *-$20 +        bec     r4 +        blc     >*+$20 +        bgt     <*-$20 +        bcs     *+$2000 +        blt     *+$20 +        beq     r5 +        bmi     *-$2000 +        bnr     *-$20 +        bes     r6 +        bls     >*+$20 +        ble     <*-$20 +        bhs     *+$2000 +        blo     *+$20 + +        bchg    #2,x:(r1)-n1    ; >=56000 +        bchg    #2,y:(r1)-n1 +        bchg    #3,x:(r2)+n2 +        bchg    #3,y:(r2)+n2 +        bchg    #4,x:(r3)- +        bchg    #4,y:(r3)- +        bchg    #5,x:(r4)+ +        bchg    #5,y:(r4)+ +        bchg    #6,x:(r5) +        bchg    #6,y:(r5) +        bchg    #7,x:(r6+n6) +        bchg    #7,y:(r6+n6) +        bchg    #8,x:-(r7) +        bchg    #8,y:-(r7) +        bchg    #9,x:$1234 +        bchg    #9,y:$1234 +        bchg    #11,x:$20 +        bchg    #11,y:$20 +        bchg    #13,x:$ffffca +        bchg    #13,y:$ffffca +        bchg    #7,x:$ffff95    ; >=56300 +        bchg    #7,y:$ffff95 +        bchg    #10,r6          ; >=56000 +        bchg    #10,b + +        bclr    #2,x:(r1)-n1    ; >=56000 +        bclr    #2,y:(r1)-n1 +        bclr    #3,x:(r2)+n2 +        bclr    #3,y:(r2)+n2 +        bclr    #4,x:(r3)- +        bclr    #4,y:(r3)- +        bclr    #5,x:(r4)+ +        bclr    #5,y:(r4)+ +        bclr    #6,x:(r5) +        bclr    #6,y:(r5) +        bclr    #7,x:(r6+n6) +        bclr    #7,y:(r6+n6) +        bclr    #8,x:-(r7) +        bclr    #8,y:-(r7) +        bclr    #9,x:$1234 +        bclr    #9,y:$1234 +        bclr    #11,x:$20 +        bclr    #11,y:$20 +        bclr    #13,x:$ffffca +        bclr    #13,y:$ffffca +        bclr    #7,x:$ffff95    ; >=56300 +        bclr    #7,y:$ffff95 +        bclr    #10,r6          ; >=56000 +        bclr    #10,b + +        bra     *+$2000 +        bra     *+$20 +        bra     *-$2000 +        bra     *-$20 +        bra     >*+$20 +        bra     >*-$20 +        bra     r5 + +        brclr   #2,x:(r1)-n1,*  ; >=56300 +        brclr   #2,y:(r1)-n1,* +        brclr   #3,x:(r2)+n2,* +        brclr   #3,y:(r2)+n2,* +        brclr   #4,x:(r3)-,* +        brclr   #4,y:(r3)-,* +        brclr   #5,x:(r4)+,* +        brclr   #5,y:(r4)+,* +        brclr   #6,x:(r5),* +        brclr   #6,y:(r5),* +        brclr   #7,x:(r6+n6),* +        brclr   #7,y:(r6+n6),* +        brclr   #8,x:-(r7),* +        brclr   #8,y:-(r7),* +        brclr   #11,x:$20,* +        brclr   #11,y:$20,* +        brclr   #13,x:$ffffca,* +        brclr   #13,y:$ffffca,* +        brclr   #7,x:$ffff95,* +        brclr   #7,y:$ffff95,* +        brclr   #10,r6,* +        brclr   #10,b,* + +        brkcc +        brkge +        brkne +        brkpl +        brknn +        brkec +        brklc +        brkgt +        brkcs +        brklt +        brkeq +        brkmi +        brknr +        brkes +        brkls +        brkle +        brkhs +        brklo + +        brset   #2,x:(r1)-n1,*  ; >=56300 +        brset   #2,y:(r1)-n1,* +        brset   #3,x:(r2)+n2,* +        brset   #3,y:(r2)+n2,* +        brset   #4,x:(r3)-,* +        brset   #4,y:(r3)-,* +        brset   #5,x:(r4)+,* +        brset   #5,y:(r4)+,* +        brset   #6,x:(r5),* +        brset   #6,y:(r5),* +        brset   #7,x:(r6+n6),* +        brset   #7,y:(r6+n6),* +        brset   #8,x:-(r7),* +        brset   #8,y:-(r7),* +        brset   #11,x:$20,* +        brset   #11,y:$20,* +        brset   #13,x:$ffffca,* +        brset   #13,y:$ffffca,* +        brset   #7,x:$ffff95,* +        brset   #7,y:$ffff95,* +        brset   #10,r6,* +        brset   #10,b,* + +        bscc    *+$2000 +        bsge    *+$20 +        bsne    r3 +        bspl    *-$2000 +        bsnn    *-$20 +        bsec    r4 +        bslc    >*+$20 +        bsgt    <*-$20 +        bscs    *+$2000 +        bslt    *+$20 +        bseq    r5 +        bsmi    *-$2000 +        bsnr    *-$20 +        bses    r6 +        bsls    >*+$20 +        bsle    <*-$20 +        bshs    *+$2000 +        bslo    *+$20 + +        bsclr   #2,x:(r1)-n1,*  ; >=56300 +        bsclr   #2,y:(r1)-n1,* +        bsclr   #3,x:(r2)+n2,* +        bsclr   #3,y:(r2)+n2,* +        bsclr   #4,x:(r3)-,* +        bsclr   #4,y:(r3)-,* +        bsclr   #5,x:(r4)+,* +        bsclr   #5,y:(r4)+,* +        bsclr   #6,x:(r5),* +        bsclr   #6,y:(r5),* +        bsclr   #7,x:(r6+n6),* +        bsclr   #7,y:(r6+n6),* +        bsclr   #8,x:-(r7),* +        bsclr   #8,y:-(r7),* +        bsclr   #11,x:$20,* +        bsclr   #11,y:$20,* +        bsclr   #13,x:$ffffca,* +        bsclr   #13,y:$ffffca,* +        bsclr   #7,x:$ffff95,* +        bsclr   #7,y:$ffff95,* +        bsclr   #10,r6,* +        bsclr   #10,b,* + +        bset    #2,x:(r1)-n1    ; >=56000 +        bset    #2,y:(r1)-n1 +        bset    #3,x:(r2)+n2 +        bset    #3,y:(r2)+n2 +        bset    #4,x:(r3)- +        bset    #4,y:(r3)- +        bset    #5,x:(r4)+ +        bset    #5,y:(r4)+ +        bset    #6,x:(r5) +        bset    #6,y:(r5) +        bset    #7,x:(r6+n6) +        bset    #7,y:(r6+n6) +        bset    #8,x:-(r7) +        bset    #8,y:-(r7) +        bset    #9,x:$1234 +        bset    #9,y:$1234 +        bset    #11,x:$20 +        bset    #11,y:$20 +        bset    #13,x:$ffffca +        bset    #13,y:$ffffca +        bset    #7,x:$ffff95    ; >=56300 +        bset    #7,y:$ffff95 +        bset    #10,r6          ; >=56000 +        bset    #10,b + +        bsr     *+$2000 +        bsr     *+$20 +        bsr     *-$2000 +        bsr     *-$20 +        bsr     >*+$20 +        bsr     >*-$20 +        bsr     r5 + +        bsset   #2,x:(r1)-n1,*  ; >=56300 +        bsset   #2,y:(r1)-n1,* +        bsset   #3,x:(r2)+n2,* +        bsset   #3,y:(r2)+n2,* +        bsset   #4,x:(r3)-,* +        bsset   #4,y:(r3)-,* +        bsset   #5,x:(r4)+,* +        bsset   #5,y:(r4)+,* +        bsset   #6,x:(r5),* +        bsset   #6,y:(r5),* +        bsset   #7,x:(r6+n6),* +        bsset   #7,y:(r6+n6),* +        bsset   #8,x:-(r7),* +        bsset   #8,y:-(r7),* +        bsset   #11,x:$20,* +        bsset   #11,y:$20,* +        bsset   #13,x:$ffffca,* +        bsset   #13,y:$ffffca,* +        bsset   #7,x:$ffff95,* +        bsset   #7,y:$ffff95,* +        bsset   #10,r6,* +        bsset   #10,b,* + +        btst    #2,x:(r1)-n1    ; >=56000 +        btst    #2,y:(r1)-n1 +        btst    #3,x:(r2)+n2 +        btst    #3,y:(r2)+n2 +        btst    #4,x:(r3)- +        btst    #4,y:(r3)- +        btst    #5,x:(r4)+ +        btst    #5,y:(r4)+ +        btst    #6,x:(r5) +        btst    #6,y:(r5) +        btst    #7,x:(r6+n6) +        btst    #7,y:(r6+n6) +        btst    #8,x:-(r7) +        btst    #8,y:-(r7) +        btst    #9,x:$1234 +        btst    #9,y:$1234 +        btst    #11,x:$20 +        btst    #11,y:$20 +        btst    #13,x:$ffffca +        btst    #13,y:$ffffca +        btst    #7,x:$ffff95    ; >=56300 +        btst    #7,y:$ffff95 +        btst    #10,r6          ; >=56000 +        btst    #10,b + +        clb     a,a             ; >=56300 +        clb     a,b +        clb     b,a +        clb     b,b + +        clr     a               ; >=56000 +        clr     b + +        cmp     x0,a            ; >=56000 +        cmp     x1,a +        cmp     y0,a +        cmp     y1,a +        cmp     x,a +        cmp     y,a +        cmp     b,a +        cmp     x0,b            ; >=56000 +        cmp     x1,b +        cmp     y0,b +        cmp     y1,b +        cmp     x,b +        cmp     y,b +        cmp     a,b + +        cmp     #31,a           ; >=56300 +        cmp     #1234,a +        cmp     #31,b +        cmp     #1234,b + +        cmpm    x0,a            ; >=56000 +        cmpm    x1,a +        cmpm    y0,a +        cmpm    y1,a +        cmpm    b,a +        cmpm    x0,b +        cmpm    x1,b +        cmpm    y0,b +        cmpm    y1,b +        cmpm    a,b + +        cmpu    x0,a            ; >=56300 +        cmpu    x1,a +        cmpu    y0,a +        cmpu    y1,a +        cmpu    b,a +        cmpu    x0,b +        cmpu    x1,b +        cmpu    y0,b +        cmpu    y1,b +        cmpu    a,b + +        debug                   ; >=56300 +        debugcc +        debugge +        debugne +        debugpl +        debugnn +        debugec +        debuglc +        debuggt +        debugcs +        debuglt +        debugeq +        debugmi +        debugnr +        debuges +        debugls +        debugle +        debughs +        debuglo + +        dec     a               ; >=56002 +        dec     b + +        div     x0,a            ; >=56000 +        div     x1,a +        div     y0,a +        div     y1,a +        div     x0,b +        div     x1,b +        div     y0,b +        div     y1,b + +        dmacss  +x0,x0,a        ; >=56300 +        dmacss  -y0,y0,a +        dmacss  +x1,x0,b +        dmacss  -y1,y0,b +        dmacss  +x1,x1,a +        dmacss  -y1,y1,a +        dmacss  +x0,x1,b +        dmacss  -y0,y1,b +        dmacss  +x0,y1,a +        dmacss  -y0,x0,a +        dmacss  +x1,y0,b +        dmacss  -y1,x1,b +        dmacss  +y1,x0,a +        dmacss  -x0,y0,a +        dmacss  +y0,x1,b +        dmacss  -x1,y1,b + +        dmacsu  +x0,x0,a        ; >=56300 +        dmacsu  -y0,y0,a +        dmacsu  +x1,x0,b +        dmacsu  -y1,y0,b +        dmacsu  +x1,x1,a +        dmacsu  -y1,y1,a +        dmacsu  +x0,x1,b +        dmacsu  -y0,y1,b +        dmacsu  +x0,y1,a +        dmacsu  -y0,x0,a +        dmacsu  +x1,y0,b +        dmacsu  -y1,x1,b +        dmacsu  +y1,x0,a +        dmacsu  -x0,y0,a +        dmacsu  +y0,x1,b +        dmacsu  -x1,y1,b + +        dmacuu  +x0,x0,a        ; >=56300 +        dmacuu  -y0,y0,a +        dmacuu  +x1,x0,b +        dmacuu  -y1,y0,b +        dmacuu  +x1,x1,a +        dmacuu  -y1,y1,a +        dmacuu  +x0,x1,b +        dmacuu  -y0,y1,b +        dmacuu  +x0,y1,a +        dmacuu  -y0,x0,a +        dmacuu  +x1,y0,b +        dmacuu  -y1,x1,b +        dmacuu  +y1,x0,a +        dmacuu  -x0,y0,a +        dmacuu  +y0,x1,b +        dmacuu  -x1,y1,b + +        do      x:(r1)-n1,*+2   ; >=56000 +        do      y:(r1)-n1,*+2 +        do      x:(r2)+n2,*+2 +        do      y:(r2)+n2,*+2 +        do      x:(r3)-,*+2 +        do      y:(r3)-,*+2 +        do      x:(r4)+,*+2 +        do      y:(r4)+,*+2 +        do      x:(r5),*+2 +        do      y:(r5),*+2 +        do      x:(r6+n6),*+2 +        do      y:(r6+n6),*+2 +        do      x:-(r7),*+2 +        do      y:-(r7),*+2 +        do      x:$12,*+2 +        do      y:$12,*+2 +        do      #$78,*+2 +        do      #$678,*+2 +        do      r4,*+2 +        do      forever,*+2     ; >=56300 + +        dor     x:(r1)-n1,*+3   ; >=56300 +        dor     y:(r1)-n1,*+3 +        dor     x:(r2)+n2,*+3 +        dor     y:(r2)+n2,*+3 +        dor     x:(r3)-,*+3 +        dor     y:(r3)-,*+3 +        dor     x:(r4)+,*+3 +        dor     y:(r4)+,*+3 +        dor     x:(r5),*+3 +        dor     y:(r5),*+3 +        dor     x:(r6+n6),*+3 +        dor     y:(r6+n6),*+3 +        dor     x:-(r7),*+3 +        dor     y:-(r7),*+3 +        dor     x:$12,*+3 +        dor     y:$12,*+3 +        dor     #$78,*+3 +        dor     #$678,*+3 +        dor     r4,*+3 +        dor     forever,*+3 + +        enddo                   ; >=56000 + +        eor     x0,a            ; >=56000 +        eor     y0,a +        eor     x1,a +        eor     y1,a +        eor     x0,b +        eor     y0,b +        eor     x1,b +        eor     y1,b + +        eor     #$34,a          ; >=56300 +        eor     #$34,b +        eor     #$123456,a +        eor     #$123456,b + +        extract a1,a,a          ; >=56300 +        extract b1,a,a +        extract x0,a,a +        extract x1,a,a +        extract y0,a,a +        extract y1,a,a +        extract a1,b,a +        extract a1,a,b +        extract #$234567,a,a +        extract #$234567,a,b +        extract #$234567,b,a +        extract #$234567,b,b + +        extractu a1,a,a         ; >=56300 +        extractu b1,a,a +        extractu x0,a,a +        extractu x1,a,a +        extractu y0,a,a +        extractu y1,a,a +        extractu a1,b,a +        extractu a1,a,b +        extractu #$234567,a,a +        extractu #$234567,a,b +        extractu #$234567,b,a +        extractu #$234567,b,b + +        abs     a       ifcc    ; >=56300 +        abs     a       ifge +        abs     a       ifne +        abs     a       ifpl +        abs     a       ifnn +        abs     a       ifec +        abs     a       iflc +        abs     a       ifgt +        abs     a       ifcs +        abs     a       iflt +        abs     a       ifeq +        abs     a       ifmi +        abs     a       ifnr +        abs     a       ifes +        abs     a       ifls +        abs     a       ifle +        abs     a       ifhs +        abs     a       iflo + +        abs     a       ifcc.u  ; >=56300 +        abs     a       ifge.u +        abs     a       ifne.u +        abs     a       ifpl.u +        abs     a       ifnn.u +        abs     a       ifec.u +        abs     a       iflc.u +        abs     a       ifgt.u +        abs     a       ifcs.u +        abs     a       iflt.u +        abs     a       ifeq.u +        abs     a       ifmi.u +        abs     a       ifnr.u +        abs     a       ifes.u +        abs     a       ifls.u +        abs     a       ifle.u +        abs     a       ifhs.u +        abs     a       iflo.u + +        illegal                 ; >=56000 + +        inc     a               ; >=56002 +        inc     b + +        insert  a1,a0,a         ; >=56300 +        insert  b1,a0,a +        insert  x0,a0,a +        insert  y0,a0,a +        insert  x1,a0,a +        insert  y1,a0,a +        insert  a1,b0,a +        insert  a1,x0,a +        insert  a1,y0,a +        insert  a1,x1,a +        insert  a1,y1,a +        insert  a1,a0,b +        insert  #345678,a0,a +        insert  #345678,b0,a +        insert  #345678,x0,a +        insert  #345678,y0,a +        insert  #345678,x1,a +        insert  #345678,y1,a +        insert  #345678,a0,b + +        jcc     $123 +        jge     $123456 +        jne     (r1)-n1 +        jpl     (r2)+n2 +        jnn     (r3)- +        jec     (r4)+ +        jlc     (r5) +        jgt     (r6+n6) +        jcs     -(r7) +        jlt     $123 +        jeq     $123456 +        jmi     (r1)-n1 +        jnr     (r2)+n2 +        jes     (r3)- +        jls     (r4)+ +        jle     (r5) +        jhs     (r6+n6) +        jlo     -(r7) + +        jclr    #2,x:(r1)-n1,*  ; >=56000 +        jclr    #2,y:(r1)-n1,* +        jclr    #3,x:(r2)+n2,* +        jclr    #3,y:(r2)+n2,* +        jclr    #4,x:(r3)-,* +        jclr    #4,y:(r3)-,* +        jclr    #5,x:(r4)+,* +        jclr    #5,y:(r4)+,* +        jclr    #6,x:(r5),* +        jclr    #6,y:(r5),* +        jclr    #7,x:(r6+n6),* +        jclr    #7,y:(r6+n6),* +        jclr    #8,x:-(r7),* +        jclr    #8,y:-(r7),* +        jclr    #11,x:$20,* +        jclr    #11,y:$20,* +        jclr    #13,x:$ffffca,* +        jclr    #13,y:$ffffca,* +        jclr    #7,x:$ffff95,*  ; >=56300 +        jclr    #7,y:$ffff95,* +        jclr    #10,r6,*        ; >=56000 +        jclr    #10,b,* + +        jmp     $123            ; >=56000 +        jmp     $123456 +        jmp     (r1)-n1 +        jmp     (r2)+n2 +        jmp     (r3)- +        jmp     (r4)+ +        jmp     (r5) +        jmp     (r6+n6) +        jmp     -(r7) + +        jscc    $123            ; >=56000 +        jsge    $123456 +        jsne    (r1)-n1 +        jspl    (r2)+n2 +        jsnn    (r3)- +        jsec    (r4)+ +        jslc    (r5) +        jsgt    (r6+n6) +        jscs    -(r7) +        jslt    $123 +        jseq    $123456 +        jsmi    (r1)-n1 +        jsnr    (r2)+n2 +        jses    (r3)- +        jsls    (r4)+ +        jsle    (r5) +        jshs    (r6+n6) +        jslo    -(r7) + +        jsclr   #2,x:(r1)-n1,*  ; >=56000 +        jsclr   #2,y:(r1)-n1,* +        jsclr   #3,x:(r2)+n2,* +        jsclr   #3,y:(r2)+n2,* +        jsclr   #4,x:(r3)-,* +        jsclr   #4,y:(r3)-,* +        jsclr   #5,x:(r4)+,* +        jsclr   #5,y:(r4)+,* +        jsclr   #6,x:(r5),* +        jsclr   #6,y:(r5),* +        jsclr   #7,x:(r6+n6),* +        jsclr   #7,y:(r6+n6),* +        jsclr   #8,x:-(r7),* +        jsclr   #8,y:-(r7),* +        jsclr   #11,x:$20,* +        jsclr   #11,y:$20,* +        jsclr   #13,x:$ffffca,* +        jsclr   #13,y:$ffffca,* +        jsclr   #7,x:$ffff95,*  ; >=56300 +        jsclr   #7,y:$ffff95,* +        jsclr   #10,r6,*        ; >=56000 +        jsclr   #10,b,* + +        jset    #2,x:(r1)-n1,*  ; >=56000 +        jset    #2,y:(r1)-n1,* +        jset    #3,x:(r2)+n2,* +        jset    #3,y:(r2)+n2,* +        jset    #4,x:(r3)-,* +        jset    #4,y:(r3)-,* +        jset    #5,x:(r4)+,* +        jset    #5,y:(r4)+,* +        jset    #6,x:(r5),* +        jset    #6,y:(r5),* +        jset    #7,x:(r6+n6),* +        jset    #7,y:(r6+n6),* +        jset    #8,x:-(r7),* +        jset    #8,y:-(r7),* +        jset    #11,x:$20,* +        jset    #11,y:$20,* +        jset    #13,x:$ffffca,* +        jset    #13,y:$ffffca,* +        jset    #7,x:$ffff95,*  ; >=56300 +        jset    #7,y:$ffff95,* +        jset    #10,r6,*        ; >=56000 +        jset    #10,b,* + +        jsr     $123            ; >=56000 +        jsr     $123456 +        jsr     (r1)-n1 +        jsr     (r2)+n2 +        jsr     (r3)- +        jsr     (r4)+ +        jsr     (r5) +        jsr     (r6+n6) +        jsr     -(r7) + +        jsset   #2,x:(r1)-n1,*  ; >=56000 +        jsset   #2,y:(r1)-n1,* +        jsset   #3,x:(r2)+n2,* +        jsset   #3,y:(r2)+n2,* +        jsset   #4,x:(r3)-,* +        jsset   #4,y:(r3)-,* +        jsset   #5,x:(r4)+,* +        jsset   #5,y:(r4)+,* +        jsset   #6,x:(r5),* +        jsset   #6,y:(r5),* +        jsset   #7,x:(r6+n6),* +        jsset   #7,y:(r6+n6),* +        jsset   #8,x:-(r7),* +        jsset   #8,y:-(r7),* +        jsset   #11,x:$20,* +        jsset   #11,y:$20,* +        jsset   #13,x:$ffffca,* +        jsset   #13,y:$ffffca,* +        jsset   #7,x:$ffff95,*  ; >=56300 +        jsset   #7,y:$ffff95,* +        jsset   #10,r6,*        ; >=56000 +        jsset   #10,b,* + +        lra     r3,x0           ; >=56000 +        lra     r3,x1 +        lra     r3,y0 +        lra     r3,y1 +        lra     r3,a0 +        lra     r3,b0 +        lra     r3,a2 +        lra     r3,b2 +        lra     r3,a1 +        lra     r3,b1 +        lra     r3,a +        lra     r3,b +        lra     r3,r5 +        lra     r3,n5 + +        lra     *+2,x0          ; >=56000 +        lra     *+2,x1 +        lra     *+2,y0 +        lra     *+2,y1 +        lra     *+2,a0 +        lra     *+2,b0 +        lra     *+2,a2 +        lra     *+2,b2 +        lra     *+2,a1 +        lra     *+2,b1 +        lra     *+2,a +        lra     *+2,b +        lra     *+2,r5 +        lra     *+2,n5 + +        lsl     a               ; >=56000 +        lsl     b +        lsl     #$13,a          ; >=56300 +        lsl     #$13,b +        lsl     a1,a +        lsl     b1,a +        lsl     x0,a +        lsl     y0,a +        lsl     x1,a +        lsl     y1,a +        lsl     a1,b +        lsl     b1,b +        lsl     x0,b +        lsl     y0,b +        lsl     x1,b +        lsl     y1,b + +        lsr     a               ; >=56000 +        lsr     b +        lsr     #$13,a          ; >=56300 +        lsr     #$13,b +        lsr     a1,a +        lsr     b1,a +        lsr     x0,a +        lsr     y0,a +        lsr     x1,a +        lsr     y1,a +        lsr     a1,b +        lsr     b1,b +        lsr     x0,b +        lsr     y0,b +        lsr     x1,b +        lsr     y1,b + +        lua     (r1)-n1,x0      ; >=56000 +        lua     (r2)+n2,x1 +        lua     (r3)-,y0 +        lua     (r4)+,y1 +        lua     (r5)-n5,a0 +        lua     (r6)+n6,b0 +        lua     (r7)-,a2 +        lua     (r1)+,b2 +        lua     (r2)-n2,a1 +        lua     (r3)+n3,b1 +        lua     (r4)-,a +        lua     (r5)+,b +        lua     (r6)-n6,r4 +        lua     (r7)+n7,n6 +        lua     (r2+20),r5      ; >=56300 +        lua     (r3-20),n7 + +        mac     +x0,x0,a        ; >=56000 +        mac     -y0,y0,a +        mac     +x1,x0,b +        mac     -y1,y0,b +        mac     +x0,y1,a +        mac     -y0,x0,a +        mac     +x1,y0,b +        mac     -y1,x1,b +        mac     +y1,#8,a        ; >=56300 +        mac     -x0,#32,a +        mac     +y0,#128,b +        mac     -x1,#(1<<22),b + +        maci    +#$123456,x0,a  ; >=56300 +        maci    -#$234567,y0,a +        maci    +#$345678,x1,b +        maci    -#$456789,y1,b + +        macsu   +x0,x0,a        ; >=56300 +        macsu   -y0,y0,a +        macsu   +x1,x0,b +        macsu   -y1,y0,b +        macsu   +x1,x1,a +        macsu   -y1,y1,a +        macsu   +x0,x1,b +        macsu   -y0,y1,b +        macsu   +x0,y1,a +        macsu   -y0,x0,a +        macsu   +x1,y0,b +        macsu   -y1,x1,b +        macsu   +y1,x0,a +        macsu   -x0,y0,a +        macsu   +y0,x1,b +        macsu   -x1,y1,b + +        macuu   +x0,x0,a        ; >=56300 +        macuu   -y0,y0,a +        macuu   +x1,x0,b +        macuu   -y1,y0,b +        macuu   +x1,x1,a +        macuu   -y1,y1,a +        macuu   +x0,x1,b +        macuu   -y0,y1,b +        macuu   +x0,y1,a +        macuu   -y0,x0,a +        macuu   +x1,y0,b +        macuu   -y1,x1,b +        macuu   +y1,x0,a +        macuu   -x0,y0,a +        macuu   +y0,x1,b +        macuu   -x1,y1,b + +        macr    +x0,x0,a        ; >=56000 +        macr    -y0,y0,a +        macr    +x1,x0,b +        macr    -y1,y0,b +        macr    +x0,y1,a +        macr    -y0,x0,a +        macr    +x1,y0,b +        macr    -y1,x1,b +        macr    +y1,#8,a        ; >=56300 +        macr    -x0,#32,a +        macr    +y0,#128,b +        macr    -x1,#(1<<22),b + +        macri   +#$123456,x0,a  ; >=56300 +        macri   -#$234567,y0,a +        macri   +#$345678,x1,b +        macri   -#$456789,y1,b + +        max     a,b ifne        ; >=56300 +        maxm    a,b + +        merge   a1,a            ; >=56300 +        merge   b1,a +        merge   x0,a +        merge   y0,a +        merge   x1,a +        merge   y1,a +        merge   a1,b +        merge   b1,b +        merge   x0,b +        merge   y0,b +        merge   x1,b +        merge   y1,b + +        move                    ; >=56000 + +        move    #30,x0          ; >=56000 +        move    #31,x1 +        move    #32,y0 +        move    #33,y1 +        move    #34,a0 +        move    #35,b0 +        move    #36,a2 +        move    #37,b2 +        move    #38,a1 +        move    #39,b1 +        move    #40,a +        move    #41,b +        move    #42,r2 +        move    #43,n4 + +        move    n4,x0           ; >=56000 +        move    x0,x1 +        move    x1,y0 +        move    y0,y1 +        move    y1,a0 +        move    a0,b0 +        move    b0,a2 +        move    a2,b2 +        move    b2,a1 +        move    a1,b1 +        move    b1,a +        move    a,b +        move    b,r2 +        move    r2,n4 + +        move    (r1)-n1         ; >=56000 +        move    (r2)+n2 +        move    (r3)- +        move    (r4)+ + +        move    x:(r1)-n1,x0    ; >=56000 +        move    x:(r2)+n2,x1 +        move    x:(r3)-,y0 +        move    x:(r4)+,y1 +        move    x:(r5),a0 +        move    x:(r6+n6),b0 +        move    x:-(r7),a2 +        move    x:$123456,b2 +        move    x:#$123456,a1 +        move    x:$12,b1 +        move    a,x:(r1)-n1 +        move    b,x:(r2)+n2 +        move    r0,x:(r3)- +        move    r1,x:(r4)+ +        move    r2,x:(r5) +        move    r3,x:(r6+n6) +        move    r4,x:-(r7) +        move    r5,x:$123456 +        move    r6,x:$12 +        move    n0,x:$12 + +        move    x:(r1+30),x0    ; >=56300 +        move    x:(r2-30),x1 +        move    x:(r3+300),y0 +        move    x:(r4-300),y1 +        move    x:(r5+30),n2 +        move    x:(r6-30),n2 +        move    x0,x:(r1+30)    ; >=56300 +        move    x1,x:(r2-30) +        move    y0,x:(r3+300) +        move    y1,x:(r4-300) +        move    n2,x:(r5+30) +        move    n2,x:(r6-30) + +        move    x0,x:(r1)-n1 a,y0 ; >=56000 +        move    x1,x:(r2)+n2 a,y1 +        move    a,x:(r3)-    b,y0 +        move    b,x:(r4)+    b,y1 +        move    x:(r5),x0    a,y0 +        move    x:(r6+n6),x1 a,y1 +        move    x:-(r7),a    b,y0 +        move    x:$123,b     b,y1 +        move    #$1234,a     a,y0 + +        move    a,x:(r1)-n1  x0,a ; >=56000 +        move    b,x:(r2)+n2  x0,b + +        move    y:(r1)-n1,x0    ; >=56000 +        move    y:(r2)+n2,x1 +        move    y:(r3)-,y0 +        move    y:(r4)+,y1 +        move    y:(r5),a0 +        move    y:(r6+n6),b0 +        move    y:-(r7),a2 +        move    y:$123456,b2 +        move    y:#$123456,a1 +        move    y:$12,b1 +        move    a,y:(r1)-n1 +        move    b,y:(r2)+n2 +        move    r0,y:(r3)- +        move    r1,y:(r4)+ +        move    r2,y:(r5) +        move    r3,y:(r6+n6) +        move    r4,y:-(r7) +        move    r5,y:$123456 +        move    r6,y:$12 +        move    n0,y:$12 + +        move    y:(r1+30),x0    ; >=56300 +        move    y:(r2-30),x1 +        move    y:(r3+300),y0 +        move    y:(r4-300),y1 +        move    y:(r5+30),n2 +        move    y:(r6-30),n2 +        move    x0,y:(r1+30)    ; >=56300 +        move    x1,y:(r2-30) +        move    y0,y:(r3+300) +        move    y1,y:(r4-300) +        move    n2,y:(r5+30) +        move    n2,y:(r6-30) + +        move    a,x0 y0,y:(r1)-n1 ; >=56000 +        move    a,x1 y1,y:(r2)+n2 +        move    b,x0 a,y:(r3)- +        move    b,x1 b,y:(r4)+ +        move    a,x0 y:(r5),y0 +        move    a,x1 y:(r6+n6),y1 +        move    b,x0 y:-(r7),a +        move    b,x1 y:$123,b +        move    a,x0 #$1234,a + +        move    y0,a a,y:(r1)-n1 ; >=56000 +        move    y0,b b,y:(r2)+n2 + +        move    l:(r1)-n1,a10 ; >=56000 +        move    l:(r2)+n2,b10 +        move    l:(r3)-,x +        move    l:(r4)+,y +        move    l:(r5),a +        move    l:(r6+n6),b +        move    l:-(r7),ab +        move    l:$123456,ba +        move    l:$12,ba + +        move    a10,l:(r1)-n1 ; >=56000 +        move    b10,l:(r2)+n2 +        move    x,l:(r3)- +        move    y,l:(r4)+ +        move    a,l:(r5) +        move    b,l:(r6+n6) +        move    ab,l:-(r7) +        move    ba,l:$123456 +        move    ba,l:$12 + +        move    x:(r0)+n0,x0 y:(r4)+n4,y0 ; >=56000 +        move    x:(r1)-,x1   y:(r5)-,y1 +        move    x:(r2)+,a    y:(r6)+,b +        move    x:(r3),b     y:(r7),a +        move    x0,x:(r0)+n0 y0,y:(r4)+n4 +        move    x1,x:(r1)-   y1,y:(r5)- +        move    a,x:(r2)+    b,y:(r6)+ +        move    b,x:(r3)     a,y:(r7) + +        movec   x:(r1)-n1,m0    ; >=56000 +        movec   x:(r2)+n2,m1 +        movec   x:(r3)-,m2 +        movec   x:(r4)+,m3 +        movec   x:(r5),m4 +        movec   x:(r6+n6),m5 +        movec   x:-(r7),m6 +        movec   x:$123456,m7 +        movec   x:$12,ep +        movec   r4,vba +        movec   #$123456,sc +        movec   #$12,sz +        movec   y:(r1)-n1,sr +        movec   y:(r2)+n2,omr +        movec   y:(r3)-,sp +        movec   y:(r4)+,ssh +        movec   y:(r5),ssl +        movec   y:(r6+n6),la +        movec   y:-(r7),lc + +        movec   m0,x:(r1)-n1    ; >=56000 +        movec   m1,x:(r2)+n2 +        movec   m2,x:(r3)- +        movec   m3,x:(r4)+ +        movec   m4,x:(r5) +        movec   m5,x:(r6+n6) +        movec   m6,x:-(r7) +        movec   m7,x:$123456 +        movec   ep,x:$12 +        movec   vba,r4 +        movec   sr,y:(r1)-n1 +        movec   omr,y:(r2)+n2 +        movec   sp,y:(r3)- +        movec   ssh,y:(r4)+ +        movec   ssl,y:(r5) +        movec   la,y:(r6+n6) +        movec   lc,y:-(r7) + +        movem   r4,p:$123456    ; >=56000 +        movem   p:$123456,r4 +        movem   r4,p:$12 +        movem   p:$12,r4 + +        movep   x:$ffffd2,x:$123456 ; >=56000 +        movep   y:$ffffd2,x:$123456 +        movep   x:$ffffd2,y:$123456 +        movep   y:$ffffd2,y:$123456 +        movep   x:$123456,x:$ffffd2 +        movep   x:$123456,y:$ffffd2 +        movep   y:$123456,x:$ffffd2 +        movep   y:$123456,y:$ffffd2 + +        movep   x:$ffff92,x:$123456 +        movep   x:$ffff92,y:$123456 +        movep   x:$123456,x:$ffff92 +        movep   y:$123456,x:$ffff92 + +        movep   y:$ffff92,x:$123456 +        movep   y:$ffff92,y:$123456 +        movep   x:$123456,y:$ffff92 +        movep   y:$123456,y:$ffff92 + +        movep   x:$ffffd2,p:$123456 +        movep   y:$ffffd2,p:$123456 +        movep   p:$123456,x:$ffffd2 +        movep   p:$123456,y:$ffffd2 + +        movep   x:$ffff92,p:$123456 +        movep   y:$ffff92,p:$123456 +        movep   p:$123456,x:$ffff92 +        movep   p:$123456,y:$ffff92 + +        movep   x:$ffffd2,r4 +        movep   y:$ffffd2,r4 +        movep   r4,x:$ffffd2 +        movep   r4,y:$ffffd2 + +        movep   x:$ffff92,r4 +        movep   y:$ffff92,r4 +        movep   r4,x:$ffff92 +        movep   r4,y:$ffff92 + +        mpy     +x0,x0,a        ; >=56000 +        mpy     -y0,y0,a +        mpy     +x1,x0,b +        mpy     -y1,y0,b +        mpy     +x0,y1,a +        mpy     -y0,x0,a +        mpy     +x1,y0,b +        mpy     -y1,x1,b +        mpy     +y1,#8,a        ; >=56300 +        mpy     -x0,#32,a +        mpy     +y0,#128,b +        mpy     -x1,#(1<<22),b + +        mpysu   +x0,x0,a        ; >=56300 +        mpysu   -y0,y0,a +        mpysu   +x1,x0,b +        mpysu   -y1,y0,b +        mpysu   +x1,x1,a +        mpysu   -y1,y1,a +        mpysu   +x0,x1,b +        mpysu   -y0,y1,b +        mpysu   +x0,y1,a +        mpysu   -y0,x0,a +        mpysu   +x1,y0,b +        mpysu   -y1,x1,b +        mpysu   +y1,x0,a +        mpysu   -x0,y0,a +        mpysu   +y0,x1,b +        mpysu   -x1,y1,b + +        mpyuu   +x0,x0,a        ; >=56300 +        mpyuu   -y0,y0,a +        mpyuu   +x1,x0,b +        mpyuu   -y1,y0,b +        mpyuu   +x1,x1,a +        mpyuu   -y1,y1,a +        mpyuu   +x0,x1,b +        mpyuu   -y0,y1,b +        mpyuu   +x0,y1,a +        mpyuu   -y0,x0,a +        mpyuu   +x1,y0,b +        mpyuu   -y1,x1,b +        mpyuu   +y1,x0,a +        mpyuu   -x0,y0,a +        mpyuu   +y0,x1,b +        mpyuu   -x1,y1,b + +        mpyi    +#$123456,x0,a  ; >=56300 +        mpyi    -#$234567,y0,a +        mpyi    +#$345678,x1,b +        mpyi    -#$456789,y1,b + +        mpyr    +x0,x0,a        ; >=56000 +        mpyr    -y0,y0,a +        mpyr    +x1,x0,b +        mpyr    -y1,y0,b +        mpyr    +x0,y1,a +        mpyr    -y0,x0,a +        mpyr    +x1,y0,b +        mpyr    -y1,x1,b +        mpyr    +y1,#8,a        ; >=56300 +        mpyr    -x0,#32,a +        mpyr    +y0,#128,b +        mpyr    -x1,#(1<<22),b + +        mpyri   +#$123456,x0,a  ; >=56300 +        mpyri   -#$234567,y0,a +        mpyri   +#$345678,x1,b +        mpyri   -#$456789,y1,b + +        neg     a               ; >=56000 +        neg     b + +        nop + +        norm    r2,a            ; >=56000 +        norm    r4,b + +        normf   a1,a            ; >=56300 +        normf   b1,a +        normf   x0,a +        normf   y0,a +        normf   x1,a +        normf   y1,a +        normf   a1,b +        normf   b1,b +        normf   x0,b +        normf   y0,b +        normf   x1,b +        normf   y1,b + +        not     a               ; >=56000 +        not     b + +        or      x0,a            ; >=56000 +        or      x1,a +        or      y0,a +        or      y1,a +        or      x0,b +        or      x1,b +        or      y0,b +        or      y1,b + +        or      #31,a           ; >=56000 +        or      #1234,a +        or      #31,b +        or      #1234,b + +        ori     #$12,mr         ; >=56000 +        ori     #$12,ccr +        ori     #$12,com +        ori     #$12,eom + +        pflush                  ; >=56300 +        pflushun +        pfree +        plock   $123456 +        plockr  * +        punlockr * + +        rep     x:(r1)-n1       ; >=56000 +        rep     x:(r2)+n2 +        rep     x:(r3)- +        rep     x:(r4)+ +        rep     x:(r5) +        rep     x:(r6+n6) +        rep     x:-(r7) +        rep     x:$12 +        rep     y:(r1)-n1 +        rep     y:(r2)+n2 +        rep     y:(r3)- +        rep     y:(r4)+ +        rep     y:(r5) +        rep     y:(r6+n6) +        rep     y:-(r7) +        rep     y:$12 +        rep     r4 +        rep     #$234 + +        reset                   ; >=56000 + +        rnd     a               ; >=56000 +        rnd     b + +        rol     a               ; >=56000 +        rol     b + +        ror     a               ; >=56000 +        ror     b + +        rti                     ; >=56000 +        rts + +        sbc     x,a             ; >=56000 +        sbc     y,a +        sbc     x,b +        sbc     y,b + +        stop                    ; >=56000 + +        sub     x0,a            ; >=56000 +        sub     x1,a +        sub     y0,a +        sub     y1,a +        sub     x,a +        sub     y,a +        sub     b,a +        sub     x0,b            ; >=56000 +        sub     x1,b +        sub     y0,b +        sub     y1,b +        sub     x,b +        sub     y,b +        sub     a,b + +        sub     #31,a           ; >=56300 +        sub     #1234,a +        sub     #31,b +        sub     #1234,b + +        subl    b,a             ; >=56000 +        subl    a,b + +        subr    b,a             ; >=56000 +        subr    a,b + +        tne     b,a             ; >=56000 +        tne     x0,a +        tne     y0,a +        tne     x1,a +        tne     y1,a +        tne     a,b +        tne     x0,b +        tne     y0,b +        tne     x1,b +        tne     y1,b + +        tne     r2,r3           ; >=56000 + +        tne     y1,b r2,r3      ; >=56000 + +        tfr     b,a             ; >=56000 +        tfr     x0,a +        tfr     y0,a +        tfr     x1,a +        tfr     y1,a +        tfr     a,b +        tfr     x0,b +        tfr     y0,b +        tfr     x1,b +        tfr     y1,b + +        trap                    ; >=56300 + +        trapcc                  ; >=56300 +        trapge +        trapne +        trappl +        trapnn +        trapec +        traplc +        trapgt +        trapcs +        traplt +        trapeq +        trapmi +        trapnr +        trapes +        trapls +        traple +        traphs +        traplo + +        tst     a               ; >=56000 +        tst     b + +        wait + diff --git a/tests/t_56300/t_56300.doc b/tests/t_56300/t_56300.doc new file mode 100644 index 0000000..9798c65 --- /dev/null +++ b/tests/t_56300/t_56300.doc @@ -0,0 +1,6 @@ ++----------------------  Test Application 56300  ----------------------------+ +|                                                                            | +|      This is a (synthetic but halfway complete) test of the DSP563xx's     | +|                               instruction set                              | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_56300/t_56300.ori b/tests/t_56300/t_56300.ori Binary files differnew file mode 100644 index 0000000..2418ca4 --- /dev/null +++ b/tests/t_56300/t_56300.ori diff --git a/tests/t_65/asflags b/tests/t_65/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_65/asflags diff --git a/tests/t_65/t_65.asm b/tests/t_65/t_65.asm new file mode 100755 index 0000000..0b9d3bc --- /dev/null +++ b/tests/t_65/t_65.asm @@ -0,0 +1,283 @@ +	cpu	melps740 + +	adc	#$12 +	adc	$12 +	adc	$12,x +	adc	$12,y +	adc	$1234 +	adc	$1234,x +	adc	$1234,y +	adc	($12,x) +	adc	($12),y + +	and	#$12 +	and	$12 +	and	$12,x +	and	$12,y +	and	$1234 +	and	$1234,x +	and	$1234,y +	and	($12,x) +	and	($12),y + +	asl +	asl	a +	asl	$12 +	asl	$12,x +	asl	$1234 +	asl	$1234,x + +	bbc	3,a,* +	bbc	4,$12,* + +	bbs	5,a,* +	bbs	6,$12,*+1 + +	bcc	*+2 +	bcs	*+3 +	beq	*+4 + +	bit	$12 +	bit	$1234 + +	bmi	*+5 +	bne	*+6 +	bpl	*+7 +	bra	*+8 + +	brk + +	bvc	*+9 +	bvs	*+10 +	 +	clb	2,a +	clb	3,$12 +	 +	clc +	cld +	cli +	clt +	clv + +	cmp	#$12 +	cmp	$12 +	cmp	$12,x +	cmp	$12,y +	cmp	$1234 +	cmp	$1234,x +	cmp	$1234,y +	cmp	($12,x) +	cmp	($12),y + +	com	$12 + +	cpx	#$12 +	cpx	$12 +	cpx	$1234 + +	cpy	#$12 +	cpy	$12 +	cpy	$1234 + +	dec +	dec	a +	dec	$12 +	dec	$12,x +	dec	$1234 +	dec	$1234,x + +	dex +	dey + +	div	$12,x + +	eor	#$12 +	eor	$12 +	eor	$12,x +	eor	$12,y +	eor	$1234 +	eor	$1234,x +	eor	$1234,y +	eor	($12,x) +	eor	($12),y + +	fst + +	inc +	inc	a +	inc	$12 +	inc	$12,x +	inc	$1234 +	inc	$1234,x + +	inx +	iny +	 +	jmp	$1234 +	jmp	($1234) +	jmp	($12) + +	assume	sp:$12 +	jsr	$1234 +	jsr	\$1234 +	jsr	($12) + +	lda	#$12 +	lda	$12 +	lda	$12,x +	lda	$12,y +	lda	$1234 +	lda	$1234,x +	lda	$1234,y +	lda	($12,x) +	lda	($12),y +	 +	ldm	#$12,$34 + +	ldx	#$12 +	ldx	$12 +	ldx	$12,y +	ldx	$1234 +	ldx	$1234,y + +	ldy	#$12 +	ldy	$12 +	ldy	$12,x +	ldy	$1234 +	ldy	$1234,x + +	lsr +	lsr	a +	lsr	$12 +	lsr	$12,x +	lsr	$1234 +	lsr	$1234,x + +	mul	$12,x + +	nop + +	ora	#$12 +	ora	$12 +	ora	$12,x +	ora	$12,y +	ora	$1234 +	ora	$1234,x +	ora	$1234,y +	ora	($12,x) +	ora	($12),y + +	pha +	php +	pla +	plp + +	rol +	rol	a +	rol	$12 +	rol	$12,x +	rol	$1234 +	rol	$1234,x + +	ror +	ror	a +	ror	$12 +	ror	$12,x +	ror	$1234 +	ror	$1234,x +	 +	rrf	$12 + +	rti +	rts + +	sbc	#$12 +	sbc	$12 +	sbc	$12,x +	sbc	$12,y +	sbc	$1234 +	sbc	$1234,x +	sbc	$1234,y +	sbc	($12,x) +	sbc	($12),y +	 +	seb	2,a +	seb	3,$12 +	 +	sec +	sed +	sei +	set + +	slw + +	sta	$12 +	sta	$12,x +	sta	$12,y +	sta	$1234 +	sta	$1234,x +	sta	$1234,y +	sta	($12,x) +	sta	($12),y + +	stp + +	stx	$12 +	stx	$12,y +	stx	$1234	 + +	sty	$12 +	sty	$12,x +	sty	$1234	 + +	tax +	tay +	 +	tst	$12 + +	tsx +	txa +	txs +	tya + +	wit + +        cpu     65c02 + +        dec     a +        inc     a +        plx +        ply +        phx +        phy + +        tsb     $12 +        trb     $12 +        tsb     $1234 +        trb     $1234 + +        stz     $12 +        stz     $1234 +        stz     $12,x +        stz     $1234,x + +        bit     $12,x +        bit     $1234,x +        bit     #$12 + +        lda     ($12) +        sta     ($12) +        adc     ($12) +        sbc     ($12) +        and     ($12) +        ora     ($12) +        eor     ($12) +        cmp     ($12) + +        jmp     ($12,x) + +        bbr2    $12,* +        bbs4    $12,* + +        rmb3    $12 +        smb5    $12 diff --git a/tests/t_65/t_65.doc b/tests/t_65/t_65.doc new file mode 100644 index 0000000..6d7cba0 --- /dev/null +++ b/tests/t_65/t_65.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application 65 -----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the 65xx/MELPS-740 instruction set      | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_65/t_65.ori b/tests/t_65/t_65.ori Binary files differnew file mode 100755 index 0000000..2ff599b --- /dev/null +++ b/tests/t_65/t_65.ori diff --git a/tests/t_6502u/asflags b/tests/t_6502u/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_6502u/asflags diff --git a/tests/t_6502u/t_6502u.asm b/tests/t_6502u/t_6502u.asm new file mode 100644 index 0000000..337b5d1 --- /dev/null +++ b/tests/t_6502u/t_6502u.asm @@ -0,0 +1,110 @@ +        cpu     6502undoc + +        nop +        nop     #$12 +	nop	$12 +        nop	$12,x +        nop	$1234 +        nop	$1234,x + +	jam +        crs +        kil + +        slo	$12 +        slo	$12,x +        slo	$1234 +        slo	$1234,x +        slo	$12,y +        slo	$1234,y +        slo	($12,x) +        slo	($12),y + +	anc	#$12 + +        rla	$12 +        rla	$12,x +        rla	$1234 +        rla	$1234,x +        rla	$12,y +        rla	$1234,y +        rla	($12,x) +        rla	($12),y + +        sre	$12 +        sre	$12,x +        sre	$1234 +        sre	$1234,x +        sre	$12,y +        sre	$1234,y +        sre	($12,x) +        sre	($12),y + +	asr	#$12 + +        rra	$12 +        rra	$12,x +        rra	$1234 +        rra	$1234,x +        rra	$12,y +        rra	$1234,y +        rra	($12,x) +        rra	($12),y + +	arr	#$12 + +        sax	$12 +        sax	$12,y +        sax	$1234 +        sax	($12,x) + +        ane	#$12 + +        sha	$12,x +        sha	$1234,x +        sha	$12,y +        sha	$1234,y + +        shs	$12,y +        shs	$1234,y + +        shy	$12,y +        shy	$1234,y + +        shx	$12,x +        shx	$1234,x + +        lax	$12 +        lax	$12,y +        lax	$1234 +        lax	$1234,y +        lax	($12,x) +        lax	($12),y + +	lxa	#$12 + +        lae	$12,y +        lae	$1234,y + +        dcp	$12 +        dcp	$12,x +        dcp	$1234 +        dcp	$1234,x +        dcp	$12,y +        dcp	$1234,y +        dcp	($12,x) +        dcp	($12),y + +        sbx	#$12 + +        isb	$12 +        isb	$12,x +        isb	$1234 +        isb	$1234,x +        isb	$12,y +        isb	$1234,y +        isb	($12,x) +        isb	($12),y + +        end     * + diff --git a/tests/t_6502u/t_6502u.doc b/tests/t_6502u/t_6502u.doc new file mode 100644 index 0000000..62849cc --- /dev/null +++ b/tests/t_6502u/t_6502u.doc @@ -0,0 +1,7 @@ ++------------------------ Test Application 6502U ----------------------------+ +|                                                                            | +|  Hacker's corner: This tests the 'undocumented' instructions of the 6502/  | +|  6510 processor, i.e. the things the processor does when yuo use undocu-   | +|  mented opcode bytes.  I do not recommend that, but it's your program...   | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_6502u/t_6502u.ori b/tests/t_6502u/t_6502u.ori Binary files differnew file mode 100644 index 0000000..1e4282a --- /dev/null +++ b/tests/t_6502u/t_6502u.ori diff --git a/tests/t_6804/asflags b/tests/t_6804/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_6804/asflags diff --git a/tests/t_6804/t_6804.asm b/tests/t_6804/t_6804.asm new file mode 100644 index 0000000..78da533 --- /dev/null +++ b/tests/t_6804/t_6804.asm @@ -0,0 +1,72 @@ +		cpu	6804 + +		include	stddef04.inc + +		clra +		clrx +		clry +		coma +		rola +		asla +		inca +		incx +		incy +		deca +		decx +		decy +		tax +		tay +		txa +		tya +		rts +		rti +		nop + +targ:		beq	targ +		bne	targ +		blo	targ +		bcs	targ +		bhs	targ +		bcc	targ + +		jmp	$123 +		jsr	$456 + +		add	(x) +		add	(y) +		add	$30 +		add	#$40 +		sub	(x) +		sub	(y) +		sub	$50 +		sub	#$60 +		cmp	(x) +		cmp	(y) +		cmp	$70 +		cmp	#$80 +		and	(x) +		and	(y) +		and	$90 +		and	#$a0 + +		lda	(x) +		sta	(y) +		lda	$82 +		sta	$40 +		lda	#55 + +		ldxi	#0 +		ldyi	#-1 + +		mvi	$12,#$45 + +		dec	$82 +		inc	$40 +		dec	(y) +		inc	(x) + +		bset	1,$12 +		bclr    3,$34 + +		brset	5,$56,targ +		brclr	7,$78,targ diff --git a/tests/t_6804/t_6804.doc b/tests/t_6804/t_6804.doc new file mode 100644 index 0000000..3fc32a7 --- /dev/null +++ b/tests/t_6804/t_6804.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 6804 ----------------------------+ +|                                                                            | +|         This is a (synthetic) test of the 6804's instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_6804/t_6804.ori b/tests/t_6804/t_6804.ori Binary files differnew file mode 100644 index 0000000..ecaff8c --- /dev/null +++ b/tests/t_6804/t_6804.ori diff --git a/tests/t_68040/asflags b/tests/t_68040/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_68040/asflags diff --git a/tests/t_68040/t_68040.asm b/tests/t_68040/t_68040.asm new file mode 100644 index 0000000..b356a56 --- /dev/null +++ b/tests/t_68040/t_68040.asm @@ -0,0 +1,29 @@ +        cpu     68040 +        supmode on +        pmmu    on + +        move16  (a1)+,(a3)+ +        move16  (a4)+,$1234 +        move16  $12345,(a5)+ +        move16  (a6),$12345 +        move16  $1234,(a7) + +        cinva   dc +        cinva   ic +        cinva   dc/ic +        cinvl   dc/ic,(a1) +        cinvp   dc/ic,(a2) +        cpusha  dc +        cpusha  ic +        cpusha  ic/dc +        cpushl  dc/ic,(a3) +        cpushp  dc/ic,(a4) + +        pflushn (a2) +        pflush  (a3) +        pflushan +        pflusha + +        ptestw  (a2) +        ptestr  (a4) + diff --git a/tests/t_68040/t_68040.doc b/tests/t_68040/t_68040.doc new file mode 100644 index 0000000..29ec852 --- /dev/null +++ b/tests/t_68040/t_68040.doc @@ -0,0 +1,6 @@ ++------------------------ Test Application 68040 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the 68040's extensions to the 680x0     | +|      instruction set.                                                      | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_68040/t_68040.ori b/tests/t_68040/t_68040.ori Binary files differnew file mode 100644 index 0000000..3b5f3ac --- /dev/null +++ b/tests/t_68040/t_68040.ori diff --git a/tests/t_6805/asflags b/tests/t_6805/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_6805/asflags diff --git a/tests/t_6805/t_6805.asm b/tests/t_6805/t_6805.asm new file mode 100755 index 0000000..cbd5697 --- /dev/null +++ b/tests/t_6805/t_6805.asm @@ -0,0 +1,244 @@ +        cpu     6805 +        page    0 + +        brset0  $12,* +        brset1  $12,*+1 +        brset2  $12,*+2 +        brset3  $12,*+3 +        brset4  $12,*+4 +        brset5  $12,*+5 +        brset6  $12,*+6 +        brset7  $12,*+7 +        brclr0  $12,*+8 +        brclr1  $12,*+9 +        brclr2  $12,*+10 +        brclr3  $12,*+11 +        brclr4  $12,*+12 +        brclr5  $12,*+13 +        brclr6  $12,*+14 +        brclr7  $12,*+15 + +        bset0   $12 +        bset1   $12 +        bset2   $12 +        bset3   $12 +        bset4   $12 +        bset5   $12 +        bset6   $12 +        bset7   $12 +        bclr0   $12 +        bclr1   $12 +        bclr2   $12 +        bclr3   $12 +        bclr4   $12 +        bclr5   $12 +        bclr6   $12 +        bclr7   $12 + +        bra     *-1 +        brn     *-2 +        bhi     *-3 +        bls     *-4 +        bcc     *-5 +        bcs     *-6 +        bne     *-7 +        beq     *-8 +        bhcc    *-9 +        bhcs    *-10 +        bpl     *-11 +        bmi     *-12 +        bmc     *-13 +        bms     *-14 +        bil     *-15 +        bih     *-16 + +        neg     $12 +        nega +        negx +        neg     $12,x +        neg     x + +        com     $12 +        coma +        comx +        com     $12,x +        com     x + +        lsr     $12 +        lsra +        lsrx +        lsr     $12,x +        lsr     x + +        ror     $12 +        rora +        rorx +        ror     $12,x +        ror     x + +        asr     $12 +        asra +        asrx +        asr     $12,x +        asr     x + +        lsl     $12 +        lsla +        lslx +        lsl     $12,x +        lsl     x + +        rol     $12 +        rola +        rolx +        rol     $12,x +        rol     x + +        dec     $12 +        deca +        decx +        dec     $12,x +        dec     x + +        inc     $12 +        inca +        incx +        inc     $12,x +        inc     x + +        tst     $12 +        tsta +        tstx +        tst     $12,x +        tst     x + +        clr     $12 +        clra +        clrx +        clr     $12,x +        clr     x + +        mul +        rti +        rts +        swi +        tax +        clc +        sec +        cli +        sei +        rsp +        nop +        stop +        wait +        txa + +        sub     #$12 +        sub     $12 +        sub     $1234 +        sub     $1234,x +        sub     $12,x +        sub     x + +        cmp     #$12 +        cmp     $12 +        cmp     $1234 +        cmp     $1234,x +        cmp     $12,x +        cmp     x + +        cpx     #$12 +        cpx     $12 +        cpx     $1234 +        cpx     $1234,x +        cpx     $12,x +        cpx     x + +        sbc     #$12 +        sbc     $12 +        sbc     $1234 +        sbc     $1234,x +        sbc     $12,x +        sbc     x + +        and     #$12 +        and     $12 +        and     $1234 +        and     $1234,x +        and     $12,x +        and     x + +        bit     #$12 +        bit     $12 +        bit     $1234 +        bit     $1234,x +        bit     $12,x +        bit     x + +        lda     #$12 +        lda     $12 +        lda     $1234 +        lda     $1234,x +        lda     $12,x +        lda     x + +        sta     $12 +        sta     $1234 +        sta     $1234,x +        sta     $12,x +        sta     x + +        eor     #$12 +        eor     $12 +        eor     $1234 +        eor     $1234,x +        eor     $12,x +        eor     x + +        adc     #$12 +        adc     $12 +        adc     $1234 +        adc     $1234,x +        adc     $12,x +        adc     x + +        ora     #$12 +        ora     $12 +        ora     $1234 +        ora     $1234,x +        ora     $12,x +        ora     x + +        add     #$12 +        add     $12 +        add     $1234 +        add     $1234,x +        add     $12,x +        add     x + +        jmp     $12 +        jmp     $1234 +        jmp     $1234,x +        jmp     $12,x +        jmp     x + +        bsr     * +        jsr     $12 +        jsr     $1234 +        jsr     $1234,x +        jsr     $12,x +        jsr     x + +        ldx     #$12 +        ldx     $12 +        ldx     $1234 +        ldx     $1234,x +        ldx     $12,x +        ldx     x + +        stx     $12 +        stx     $1234 +        stx     $1234,x +        stx     $12,x +        stx     x + diff --git a/tests/t_6805/t_6805.doc b/tests/t_6805/t_6805.doc new file mode 100644 index 0000000..dd38f44 --- /dev/null +++ b/tests/t_6805/t_6805.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 6805 ----------------------------+ +|                                                                            | +|       This is a (synthetic) test of the 6805 instruction set               | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_6805/t_6805.ori b/tests/t_6805/t_6805.ori Binary files differnew file mode 100755 index 0000000..b60907f --- /dev/null +++ b/tests/t_6805/t_6805.ori diff --git a/tests/t_6808/asflags b/tests/t_6808/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_6808/asflags diff --git a/tests/t_6808/t_6808.asm b/tests/t_6808/t_6808.asm new file mode 100644 index 0000000..0143d90 --- /dev/null +++ b/tests/t_6808/t_6808.asm @@ -0,0 +1,406 @@ +        cpu     68HC08 +        page    0 + +        adc     #$55 +        adc     $20 +        adc     <$20 +        adc     >$20 +        adc     $2030 +        adc     >$2030 +        adc     ,x +        adc     0,x +        adc     <0,x +        adc     $40,x +        adc     <$40,x +        adc     >$40,x +        adc     $4050,x +        adc     >$4050,x +        adc     ,sp +        adc     0,sp +        adc     <0,sp +        adc     $40,sp +        adc     <$40,sp +        adc     >$40,sp +        adc     $4050,sp +        adc     >$4050,sp + +        add     #$55 +        add     $20 +        add     $2030 +        add     ,x +        add     $40,x +        add     $4050,x +        add     $40,sp +        add     $4050,sp + +        aix     #34 + +        ais     #-16 + +        and     #$55 +        and     $20 +        and     $2030 +        and     ,x +        and     $40,x +        and     $4050,x +        and     $40,sp +        and     $4050,sp + +        asla +        aslx +        asl     $20 +        asl     ,x +        asl     $40,x +        asl     $40,sp + +        asra +        asrx +        asr     $20 +        asr     ,x +        asr     $40,x +        asr     $40,sp + +        bcc     * + +        bclr    0,$20 +        bclr    1,$20 +        bclr    2,$20 +        bclr    3,$20 +        bclr    4,$20 +        bclr    5,$20 +        bclr    6,$20 +        bclr    7,$20 + +        bcs     * + +        beq     * + +        bge     * + +        bgt     * + +        bhcc    * + +        bhcs    * + +        bhi     * + +        bhs     * + +        bih     * + +        bil     * + +        bit     #$55 +        bit     $20 +        bit     $2030 +        bit     ,x +        bit     $40,x +        bit     $4050,x +        bit     $40,sp +        bit     $4050,sp + +        ble     * + +        blo     * + +        bls     * + +        blt     * + +        bmc     * + +        bmi     * + +        bms     * + +        bne     * + +        bpl     * + +        bra     * + +        brclr   0,$20,* +        brclr   1,$20,* +        brclr   2,$20,* +        brclr   3,$20,* +        brclr   4,$20,* +        brclr   5,$20,* +        brclr   6,$20,* +        brclr   7,$20,* + +        brn     * + +        brset   0,$20,* +        brset   1,$20,* +        brset   2,$20,* +        brset   3,$20,* +        brset   4,$20,* +        brset   5,$20,* +        brset   6,$20,* +        brset   7,$20,* + +        bset    0,$20 +        bset    1,$20 +        bset    2,$20 +        bset    3,$20 +        bset    4,$20 +        bset    5,$20 +        bset    6,$20 +        bset    7,$20 + +        bsr     * + +        cbeq    $20,* +        cbeq    x+,* +        cbeq    $40,x+,* +        cbeq    $40,sp,* + +        cbeqa   #$55,* +        cbeqx   #$66,* + +        clc + +        cli + +        clra +        clrx +        clrh +        clr     $20 +        clr     ,x +        clr     $40,x +        clr     $40,sp + +        cmp     #$55 +        cmp     $20 +        cmp     $2030 +        cmp     ,x +        cmp     $40,x +        cmp     $4050,x +        cmp     $40,sp +        cmp     $4050,sp + +        coma +        comx +        com     $20 +        com     ,x +        com     $40,x +        com     $40,sp + +        cphx    #$55aa +        cphx    $20 + +        cpx     #$55 +        cpx     $20 +        cpx     $2030 +        cpx     ,x +        cpx     $40,x +        cpx     $4050,x +        cpx     $40,sp +        cpx     $4050,sp + +        daa + +        dbnza   * +        dbnzx   * + +        dbnz    $20,* +        dbnz    x,* +        dbnz    $40,x,* +        dbnz    $40,sp,* + +        deca +        decx +        dec     $20 +        dec     ,x +        dec     $40,x +        dec     $40,sp + +        div + +        eor     #$55 +        eor     $20 +        eor     $2030 +        eor     ,x +        eor     $40,x +        eor     $4050,x +        eor     $40,sp +        eor     $4050,sp + +        inca +        incx +        inc     $20 +        inc     ,x +        inc     $40,x +        inc     $40,sp + +        jmp     $20 +        jmp     $2030 +        jmp     ,x +        jmp     $40,x +        jmp     $4050,x + +        jsr     $20 +        jsr     $2030 +        jsr     ,x +        jsr     $40,x +        jsr     $4050,x + +        lda     #$55 +        lda     $20 +        lda     $2030 +        lda     ,x +        lda     $40,x +        lda     $4050,x +        lda     $40,sp +        lda     $4050,sp + +        ldhx    #$55aa +        ldhx    $20 + +        ldx     #$55 +        ldx     $20 +        ldx     $2030 +        ldx     ,x +        ldx     $40,x +        ldx     $4050,x +        ldx     $40,sp +        ldx     $4050,sp + +        lsla +        lslx +        lsl     $20 +        lsl     ,x +        lsl     $40,x +        lsl     $40,sp + +        lsra +        lsrx +        lsr     $20 +        lsr     ,x +        lsr     $40,x +        lsr     $40,sp + +        mov     #$55,$20 +        mov     $20,$40 +        mov     x+,$20 +        mov     $40,x+ + +        mul + +        nega +        negx +        neg     $20 +        neg     ,x +        neg     $40,x +        neg     $40,sp + +        nop + +        nsa + +        ora     #$55 +        ora     $20 +        ora     $2030 +        ora     ,x +        ora     $40,x +        ora     $4050,x +        ora     $40,sp +        ora     $4050,sp + +        psha + +        pshh + +        pshx + +        pula + +        pulh + +        pulx + +        rola +        rolx +        rol     $20 +        rol     ,x +        rol     $40,x +        rol     $40,sp + +        rora +        rorx +        ror     $20 +        ror     ,x +        ror     $40,x +        ror     $40,sp + +        rsp + +        rti + +        rts + +        sbc     #$55 +        sbc     $20 +        sbc     $2030 +        sbc     ,x +        sbc     $40,x +        sbc     $4050,x +        sbc     $40,sp +        sbc     $4050,sp + +        sec + +        sei + +        sta     $20 +        sta     $2030 +        sta     ,x +        sta     $40,x +        sta     $4050,x +        sta     $40,sp +        sta     $4050,sp + +        sthx    $20 + +        stop + +        stx     $20 +        stx     $2030 +        stx     ,x +        stx     $40,x +        stx     $4050,x +        stx     $40,sp +        stx     $4050,sp + +        sub     #$55 +        sub     $20 +        sub     $2030 +        sub     ,x +        sub     $40,x +        sub     $4050,x +        sub     $40,sp +        sub     $4050,sp + +        swi + +        tap + +        tax + +        tpa + +        tsta +        tstx +        tst     $20 +        tst     ,x +        tst     $40,x +        tst     $40,sp + +        tsx + +        txa + +        txs + +        wait diff --git a/tests/t_6808/t_6808.doc b/tests/t_6808/t_6808.doc new file mode 100644 index 0000000..714175b --- /dev/null +++ b/tests/t_6808/t_6808.doc @@ -0,0 +1,6 @@ ++------------------------- Test Application 6808 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the 68HC08's extensions to the 6805     | +|      basic instruction set.                                                | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_6808/t_6808.ori b/tests/t_6808/t_6808.ori Binary files differnew file mode 100644 index 0000000..ca94eea --- /dev/null +++ b/tests/t_6808/t_6808.ori diff --git a/tests/t_6812/asflags b/tests/t_6812/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_6812/asflags diff --git a/tests/t_6812/t_6812.asm b/tests/t_6812/t_6812.asm new file mode 100644 index 0000000..35c547e --- /dev/null +++ b/tests/t_6812/t_6812.asm @@ -0,0 +1,644 @@ +	cpu	68hc12 +	page	0 + +	aba + +	abx + +	aby + +	adca	#45 +        adca	$45 +        adca	$1234 +        adca	>$45 +        adca	,y +        adca	5,x +        adca	-5,sp +        adca	*,pc +        adca	*+10,pc +        adca	*+17,pc +        adca	a,y +        adca	b,sp +        adca	d,pc +        adca	55,y +        adca	-55,sp +        adca	<5,y +        adca	<-5,sp +        adca	*+18,pc +        adca	*+258,pc +        adca	555,y +        adca	-555,sp +	adca	>55,y +        adca	>-55,sp +        adca	*+259,pc +        adca	[d,sp] +        adca	[d,x] +	adca	[-5,y] +        adca	[500,y] +        adca	4,+y +        adca	4,y+ +        adca	4,-y +        adca	4,y- + +        adcb	#55 +        adcb	$55 +        adcb	,x +        adcb	$1234 + +        adda	#55 +        adda	$55 +        adda	,x +        adda	$1234 + +        addb	#55 +        addb	$55 +        addb	,x +        addb	$1234 + +        addd	#55 +        addd	$55 +        addd	,x +        addd	$1234 + +        anda	#55 +        anda	$55 +        anda	,x +        anda	$1234 + +        andb	#55 +        andb	$55 +        andb	,x +        andb	$1234 + +        andcc	#$fe + +        asl	$55 +        asl	,x +        asl	$1234 + +        asla + +        aslb + +        asld + +        asr	$55 +        asr	,x +        asr	$1234 + +        asra + +        asrb + +        bcc	* + +        bclr	$20 #$40 +	bclr	$20,#$40 +	bclr	$1234 #$40 +	bclr	$1234,#$40 +	bclr	,x $40 +	bclr	$20,y,$40 +        bclr	*,pc,$40 + +        bcs	* + +        beq	* + +        bge	* + +        bgnd + +        bgt	* + +        bhi	* + +        bhs	* + +        bita	#$55 +        bita	$55 +        bita	,x +        bita	$1234 + +        bitb	#$55 +        bitb	$55 +        bitb	,x +        bitb	$1234 + +        ble	* + +        blo	* + +        bls	* + +        blt	* + +        bmi	* + +        bne	* + +        bpl	* + +        bra	* + +        brclr	$20 #$40 * +        brclr	$2000,#$40,* +        brclr	,x,#$40,* +        brclr	*,pc,#$40,* + +        brn	* + +        brset	$20 #$40 * +        brset	$2000,#$40,* +        brset	,x,#$40,* +        brset	*,pc,#$40,* + +        bset	$20 #$40 +	bset	$20,#$40 +	bset	$1234 #$40 +	bset	$1234,#$40 +	bset	,x $40 +	bset	$20,y,$40 + +        bsr	* + +        bvc	* + +        bvs	* + +        call	$2000,5 +        call	5,y,6 +        call	200,y,7 +        call	20000,y,8 +        call	[d,y] +        call	[20,y] + +        cba + +        clc +        andcc	#$fe + +        cli +        andcc	#$ef + +        clr	$55 +        clr	,x +        clr	$1234 + +        clra + +        clrb + +        clv +        andcc	#$fd + +        cmpa	#55 +        cmpa	$55 +        cmpa	,x +        cmpa	$1234 + +        cmpb	#55 +        cmpb	$55 +        cmpb	,x +        cmpb	$1234 + +        com	$55 +        com	,x +        com	$1234 + +        coma + +        comb + +        cpd	#55 +        cpd	$55 +        cpd	,x +        cpd	$1234 + +        cps	#55 +        cps	$55 +        cps	,x +        cps	$1234 + +        cpx	#55 +        cpx	$55 +        cpx	,x +        cpx	$1234 + +        cpy	#55 +        cpy	$55 +        cpy	,x +        cpy	$1234 + +        daa + +        dbeq	x,* + +        dbne	x,* + +        dec	$55 +        dec	,x +        dec	$1234 + +        deca + +        decb + +        des +        leas	-1,sp + +        dex + +        dey + +        ediv + +        edivs + +        emacs	$1234 + +        emaxd	,x + +        emaxm	,x + +        emind	,x + +        eminm	,x + +        emul + +        emuls + +        eora	#55 +        eora	$55 +        eora	,x +        eora	$1234 + +        eorb	#55 +        eorb	$55 +        eorb	,x +        eorb	$1234 + +        etbl	5,y + +        exg	ccr,sp + +        fdiv + +        ibeq	a,* + +        ibne	a,* + +        idiv + +        idivs + +        inc	$55 +        inc	,x +        inc	$1234 + +        inca + +        incb + +        ins +        leas	1,sp + +        inx + +        iny + +	jmp	$2000 +	jmp	$20 +        jmp	[d,x] + +	jsr	$2000 +	jsr	$20 +        jsr	[d,x] + +        lbcc	* + +        lbcs	* + +        lbeq	* + +        lbge	* + +        lbgt	* + +        lbhi	* + +        lbhs	* + +        lble	* + +        lblo	* + +        lbls	* + +        lblt	* + +        lbmi	* + +        lbne	* + +        lbpl	* + +        lbra	* + +        lbrn	* + +        lbvc	* + +        lbvs	* + +        ldaa	#55 +        ldaa	$55 +        ldaa	,x +        ldaa	$1234 + +        ldab	#55 +        ldab	$55 +        ldab	,x +        ldab	$1234 + +        ldd	#55 +        ldd	$55 +        ldd	,x +        ldd	$1234 + +        lds	#55 +        lds	$55 +        lds	,x +        lds	$1234 + +        ldx	#55 +        ldx	$55 +        ldx	,x +        ldx	$1234 + +        ldy	#55 +        ldy	$55 +        ldy	,x +        ldy	$1234 + +        leas	2000,sp + +        leax	,y + +        leay	,x + +        lsl	$55 +        lsl	,x +        lsl	$1234 + +        lsla + +        lslb + +        lsld + +        lsr	$55 +        lsr	,x +        lsr	$1234 + +        lsra + +        lsrb + +        lsrd + +        maxa	,x + +        maxm	,x + +        mem + +        mina	,x + +        minm	,x + +        movb	#$55 $1234 +        movb	#$55,$1234 +        movb	#$55 2,y +        movb	#$55,2,y +        movb	#$55,next_a,pc +next_a: movb	$1234 $3456 +	movb	$1234,$3456 +        movb	$1234 2,y +        movb	$1234,2,y +        movb	$1234,next_b,pc +next_b: movb	2,y $1234 +	movb	2,y,$1234 +        movb	next_c,pc,$1234 +next_c: movb	2,y 2,y +	movb	2,y,2,y +        movb	next_d,pc next_d,pc +next_d: +        movw	#$55 $1234 +        movw	#$55,$1234 +        movw	#$55 2,y +        movw	#$55,2,y +        movw	#$55,next_e,pc +next_e: movw	$1234 $3456 +	movw	$1234,$3456 +        movw	$1234 2,y +        movw	$1234,2,y +        movw	$1234,next_f,pc +next_f: movw	2,y $1234 +	movw	2,y,$1234 +        movw	next_g,pc,$1234 +next_g: movw	2,y 2,y +	movw	2,y,2,y +        movw	next_h,pc next_h,pc +next_h: + +	mul + +        neg	$55 +        neg	,x +        neg	$1234 + +        nega + +        negb + +        nop + +        oraa	#55 +        oraa	$55 +        oraa	,x +        oraa	$1234 + +        orab	#55 +        orab	$55 +        orab	,x +        orab	$1234 + +        orcc    #$10 + +        psha + +        pshb + +        pshc + +        pshd + +        pshx + +        pshy + +        pula + +        pulb + +        pulc + +        puld + +        pulx + +        puly + +        rev + +        revw + +        rol	$55 +        rol	,x +        rol	$1234 + +        rola + +        rolb + +        ror	$55 +        ror	,x +        ror	$1234 + +        rora + +        rorb + +        rtc + +        rti + +        rts + +        sba + +        sbca	#55 +        sbca	$55 +        sbca	,x +        sbca	$1234 + +        sbcb	#55 +        sbcb	$55 +        sbcb	,x +        sbcb	$1234 + +        sec +        orcc	#$01 + +        sei +        orcc	#$10 + +        sev +        orcc	#$02 + +	sex	a,d + +        staa	$55 +        staa	,x +        staa	$1234 + +        stab	$55 +        stab	,x +        stab	$1234 + +        std	$55 +        std	,x +        std	$1234 + +        sts	$55 +        sts	,x +        sts	$1234 + +        stx	$55 +        stx	,x +        stx	$1234 + +        sty	$55 +        sty	,x +        sty	$1234 + +        stop + +        suba	#55 +        suba	$55 +        suba	,x +        suba	$1234 + +        subb	#55 +        subb	$55 +        subb	,x +        subb	$1234 + +        subd	#55 +        subd	$55 +        subd	,x +        subd	$1234 + +        swi + +        tab + +        tap +        tfr	a,ccr + +        tba + +        tbeq	d,* + +        tbl	a,x + +        tbne	d,* + +        tfr	a,b +        tfr	x,y + +        tpa +        tfr	ccr,a + +        trap	#$42 + +        tst	$55 +        tst	,x +        tst	$1234 + +        tsta + +        tstb + +	tsx +        tfr	sp,x + +        tsy +        tfr	sp,y + +        txs +        tfr	x,sp + +        tys +        tfr	y,sp + +        wai + +        wav + +        xgdx +        exg	d,x + +        xgdy +        exg	d,y diff --git a/tests/t_6812/t_6812.doc b/tests/t_6812/t_6812.doc new file mode 100644 index 0000000..ed4a23a --- /dev/null +++ b/tests/t_6812/t_6812.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 6812 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the 68HC12 instruction set              | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_6812/t_6812.ori b/tests/t_6812/t_6812.ori Binary files differnew file mode 100644 index 0000000..b57d4cd --- /dev/null +++ b/tests/t_6812/t_6812.ori diff --git a/tests/t_6816/asflags b/tests/t_6816/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_6816/asflags diff --git a/tests/t_6816/t_6816.asm b/tests/t_6816/t_6816.asm new file mode 100644 index 0000000..70299d2 --- /dev/null +++ b/tests/t_6816/t_6816.asm @@ -0,0 +1,1037 @@ +	cpu	68hc16 +        page	0 +        assume  ek:0 + +        aba   		;$370b +	abx   		;$374f +        aby   		;$375f +	abz   		;$376f +        ace   		;$3722 +	aced  		;$3723 +        ade   		;$2778 +	adx   		;$37cd +        ady   		;$37dd +	adz   		;$37ed +        aex   		;$374d +	aey   		;$375d +        aez   		;$376d +	asla  		;$3704 +        aslb  		;$3714 +	asld  		;$27f4 +        asle  		;$2774 +	aslm  		;$27b6 +        asra  		;$370d +	asrb  		;$371d +        asrd  		;$27fd +	asre  		;$277d +        asrm  		;$27ba +	bgnd  		;$37a6 +        cba   		;$371b +	clra  		;$3705 +        clrb  		;$3715 +	clrd  		;$27f5 +        clre  		;$2775 +	clrm  		;$27b7 +        coma  		;$3700 +	comb  		;$3710 +        comd  		;$27f0 +	come  		;$2770 +        daa   		;$3721 +	deca  		;$3701 +        decb  		;$3711 +	ediv  		;$3728 +        edivs 		;$3729 +	emul  		;$3725 +        emuls 		;$3726 +	fdiv  		;$372b +        fmuls 		;$3727 +	idiv  		;$372a +        inca  		;$3703 +	incb  		;$3713 +        lpstop		;$27f1 +	lsla  		;$3704 +        lslb  		;$3714 +	lsld  		;$27f4 +        lsle  		;$2774 +	lsra  		;$370f +        lsrb  		;$371f +	lsrd  		;$27ff +        lsre  		;$277f +	mul   		;$3724 +        nega  		;$3702 +	negb  		;$3712 +        negd  		;$27f2 +	nege  		;$2772 +        nop   		;$274c +	psha  		;$3708 +        pshb  		;$3718 +	pshmac		;$27b8 +        pula  		;$3709 +	pulb  		;$3719 +        pulmac		;$27b9 +	rola  		;$370c +        rolb  		;$371c +	rold  		;$27fc +        role  		;$277c +	rora  		;$370e +        rorb  		;$371e +	rord  		;$27fe +        rore  		;$277e +	rti   		;$2777 +        rts   		;$27f7 +	sba   		;$370a +        sde   		;$2779 +	swi   		;$3720 +        sxt   		;$27f8 +	tab   		;$3717 +        tap   		;$37fd +	tba   		;$3707 +        tbek  		;$27fa +	tbsk  		;$379f +        tbxk  		;$379c +	tbyk  		;$379d +        tbzk  		;$379e +	tde   		;$277b +        tdmsk 		;$372f +	tdp   		;$372d +        ted   		;$27fb +	tedm  		;$27b1 +        tekb  		;$27bb +	tem   		;$27b2 +        tmer  		;$27b4 +	tmet  		;$27b5 +        tmxed 		;$27b3 +	tpa   		;$37fc +        tpd   		;$372c +	tskb  		;$37af +        tsta  		;$3706 +	tstb  		;$3716 +        tstd  		;$27f6 +	tste  		;$2776 +        tsx   		;$274f +	tsy   		;$275f +        tsz   		;$276f +	txkb  		;$37ac +        txs   		;$374e +	txy   		;$275c +        txz   		;$276c +	tykb  		;$37ad +        tys   		;$375e +	tyx   		;$274d +        tyz   		;$276d +	tzkb  		;$37ae +        tzs   		;$376e +	tzx   		;$274e +        tzy   		;$275e +	wai   		;$27f3 +        xgab  		;$371a +	xgde  		;$277a +        xgdx  		;$37cc +	xgdy  		;$37dc +        xgdz  		;$37ec +	xgex  		;$374c +        xgey  		;$375c +	xgez  		;$376c + +targ:	bra	targ +	brn	targ +        bcc	targ +        bcs	targ +        bhs	targ +        blo	targ +        bmi	targ +        bne	targ +        bpl	targ +        bvc	targ +        bvs	targ +        bhi	targ +        bls	targ +        beq	targ +        bge	targ +        bgt	targ +        ble	targ +        blt	targ +	lbra	targ +	lbrn	targ +        lbcc	targ +        lbcs	targ +        lbhs	targ +        lblo	targ +        lbmi	targ +        lbne	targ +        lbpl	targ +        lbvc	targ +        lbvs	targ +        lbhi	targ +        lbls	targ +        lbeq	targ +        lbge	targ +        lbgt	targ +        lble	targ +        lblt	targ +        bsr	targ +        lbev	targ +        lbmv	targ +        lbsr	targ + +        adca	$55,x +        adca	$55,y +        adca	$55,z +        adca	#$aa +        adca	$5aa5,x +        adca	$5aa5,y +        adca	$5aa5,z +        adca	$1234 +        adca	e,x +        adca	e,y +        adca	e,z + +        adcb	$55,x +        adcb	$55,y +        adcb	$55,z +        adcb	#$aa +        adcb	$5aa5,x +        adcb	$5aa5,y +        adcb	$5aa5,z +        adcb	$1234 +        adcb	e,x +        adcb	e,y +        adcb	e,z + +        adcd	$55,x +        adcd	$55,y +        adcd	$55,z +        adcd	#$aa +        adcd	$5aa5,x +        adcd	$5aa5,y +        adcd	$5aa5,z +        adcd	$1234 +        adcd	e,x +        adcd	e,y +        adcd	e,z + +        adce	$55,x +        adce	$55,y +        adce	$55,z +        adce	#$aa +        adce	$5aa5,x +        adce	$5aa5,y +        adce	$5aa5,z +        adce	$1234 + +        adda	$55,x +        adda	$55,y +        adda	$55,z +        adda	#$aa +        adda	$5aa5,x +        adda	$5aa5,y +        adda	$5aa5,z +        adda	$1234 +        adda	e,x +        adda	e,y +        adda	e,z + +        addb	$55,x +        addb	$55,y +        addb	$55,z +        addb	#$aa +        addb	$5aa5,x +        addb	$5aa5,y +        addb	$5aa5,z +        addb	$1234 +        addb	e,x +        addb	e,y +        addb	e,z + +        addd	$55,x +        addd	$55,y +        addd	$55,z +        addd	#$55 +        addd	#$aa +        addd	$5aa5,x +        addd	$5aa5,y +        addd	$5aa5,z +        addd	$1234 +        addd	e,x +        addd	e,y +        addd	e,z + +        adde	$55,x +        adde	$55,y +        adde	$55,z +        adde	#$55 +        adde	#$aa +        adde	$5aa5,x +        adde	$5aa5,y +        adde	$5aa5,z +        adde	$1234 + +        anda	$55,x +        anda	$55,y +        anda	$55,z +        anda	#$aa +        anda	$5aa5,x +        anda	$5aa5,y +        anda	$5aa5,z +        anda	$1234 +        anda	e,x +        anda	e,y +        anda	e,z + +        andb	$55,x +        andb	$55,y +        andb	$55,z +        andb	#$aa +        andb	$5aa5,x +        andb	$5aa5,y +        andb	$5aa5,z +        andb	$1234 +        andb	e,x +        andb	e,y +        andb	e,z + +        andd	$55,x +        andd	$55,y +        andd	$55,z +        andd	#$aa +        andd	$5aa5,x +        andd	$5aa5,y +        andd	$5aa5,z +        andd	$1234 +        andd	e,x +        andd	e,y +        andd	e,z + +        ande	$55,x +        ande	$55,y +        ande	$55,z +        ande	#$aa +        ande	$5aa5,x +        ande	$5aa5,y +        ande	$5aa5,z +        ande	$1234 + +        asl	$55,x +        asl	$55,y +        asl	$55,z +        asl	$5aa5,x +        asl	$5aa5,y +        asl	$5aa5,z +        asl	$1234 + +        aslw	$5aa5,x +        aslw	$5aa5,y +        aslw	$5aa5,z +        aslw	$1234 + +        asr	$55,x +        asr	$55,y +        asr	$55,z +        asr	$5aa5,x +        asr	$5aa5,y +        asr	$5aa5,z +        asr	$1234 + +        asrw	$5aa5,x +        asrw	$5aa5,y +        asrw	$5aa5,z +        asrw	$1234 + +        bita	$55,x +        bita	$55,y +        bita	$55,z +        bita	#$aa +        bita	$5aa5,x +        bita	$5aa5,y +        bita	$5aa5,z +        bita	$1234 +        bita	e,x +        bita	e,y +        bita	e,z + +        bitb	$55,x +        bitb	$55,y +        bitb	$55,z +        bitb	#$aa +        bitb	$5aa5,x +        bitb	$5aa5,y +        bitb	$5aa5,z +        bitb	$1234 +        bitb	e,x +        bitb	e,y +        bitb	e,z + +        clr	$55,x +        clr	$55,y +        clr	$55,z +        clr	$5aa5,x +        clr	$5aa5,y +        clr	$5aa5,z +        clr	$1234 + +        clrw	$5aa5,x +        clrw	$5aa5,y +        clrw	$5aa5,z +        clrw	$1234 + +        cmpa	$55,x +        cmpa	$55,y +        cmpa	$55,z +        cmpa	#$aa +        cmpa	$5aa5,x +        cmpa	$5aa5,y +        cmpa	$5aa5,z +        cmpa	$1234 +        cmpa	e,x +        cmpa	e,y +        cmpa	e,z + +        cmpb	$55,x +        cmpb	$55,y +        cmpb	$55,z +        cmpb	#$aa +        cmpb	$5aa5,x +        cmpb	$5aa5,y +        cmpb	$5aa5,z +        cmpb	$1234 +        cmpb	e,x +        cmpb	e,y +        cmpb	e,z + +        com	$55,x +        com	$55,y +        com	$55,z +        com	$5aa5,x +        com	$5aa5,y +        com	$5aa5,z +        com	$1234 + +        comw	$5aa5,x +        comw	$5aa5,y +        comw	$5aa5,z +        comw	$1234 + +        cpd	$55,x +        cpd	$55,y +        cpd	$55,z +        cpd	#$aa +        cpd	$5aa5,x +        cpd	$5aa5,y +        cpd	$5aa5,z +        cpd	$1234 +        cpd	e,x +        cpd	e,y +        cpd	e,z + +        cpe	$55,x +        cpe	$55,y +        cpe	$55,z +        cpe	#$aa +        cpe	$5aa5,x +        cpe	$5aa5,y +        cpe	$5aa5,z +        cpe	$1234 + +        dec	$55,x +        dec	$55,y +        dec	$55,z +        dec	$5aa5,x +        dec	$5aa5,y +        dec	$5aa5,z +        dec	$1234 + +        decw	$5aa5,x +        decw	$5aa5,y +        decw	$5aa5,z +        decw	$1234 + +        eora	$55,x +        eora	$55,y +        eora	$55,z +        eora	#$aa +        eora	$5aa5,x +        eora	$5aa5,y +        eora	$5aa5,z +        eora	$1234 +        eora	e,x +        eora	e,y +        eora	e,z + +        eorb	$55,x +        eorb	$55,y +        eorb	$55,z +        eorb	#$aa +        eorb	$5aa5,x +        eorb	$5aa5,y +        eorb	$5aa5,z +        eorb	$1234 +        eorb	e,x +        eorb	e,y +        eorb	e,z + +        eord	$55,x +        eord	$55,y +        eord	$55,z +        eord	#$aa +        eord	$5aa5,x +        eord	$5aa5,y +        eord	$5aa5,z +        eord	$1234 +        eord	e,x +        eord	e,y +        eord	e,z + +        eore	$55,x +        eore	$55,y +        eore	$55,z +        eore	#$aa +        eore	$5aa5,x +        eore	$5aa5,y +        eore	$5aa5,z +        eore	$1234 + +        inc	$55,x +        inc	$55,y +        inc	$55,z +        inc	$5aa5,x +        inc	$5aa5,y +        inc	$5aa5,z +        inc	$1234 + +        incw	$5aa5,x +        incw	$5aa5,y +        incw	$5aa5,z +        incw	$1234 + +        ldaa	$55,x +        ldaa	$55,y +        ldaa	$55,z +        ldaa	#$aa +        ldaa	$5aa5,x +        ldaa	$5aa5,y +        ldaa	$5aa5,z +        ldaa	$1234 +        ldaa	e,x +        ldaa	e,y +        ldaa	e,z + +        ldab	$55,x +        ldab	$55,y +        ldab	$55,z +        ldab	#$aa +        ldab	$5aa5,x +        ldab	$5aa5,y +        ldab	$5aa5,z +        ldab	$1234 +        ldab	e,x +        ldab	e,y +        ldab	e,z + +        ldd	$55,x +        ldd	$55,y +        ldd	$55,z +        ldd	#$aa +        ldd	$5aa5,x +        ldd	$5aa5,y +        ldd	$5aa5,z +        ldd	$1234 +        ldd	e,x +        ldd	e,y +        ldd	e,z + +        lde	$55,x +        lde	$55,y +        lde	$55,z +        lde	#$aa +        lde	$5aa5,x +        lde	$5aa5,y +        lde	$5aa5,z +        lde	$1234 + +        lsl	$55,x +        lsl	$55,y +        lsl	$55,z +        lsl	$5aa5,x +        lsl	$5aa5,y +        lsl	$5aa5,z +        lsl	$1234 + +        lslw	$5aa5,x +        lslw	$5aa5,y +        lslw	$5aa5,z +        lslw	$1234 + +        lsr	$55,x +        lsr	$55,y +        lsr	$55,z +        lsr	$5aa5,x +        lsr	$5aa5,y +        lsr	$5aa5,z +        lsr	$1234 + +        lsrw	$5aa5,x +        lsrw	$5aa5,y +        lsrw	$5aa5,z +        lsrw	$1234 + +        neg	$55,x +        neg	$55,y +        neg	$55,z +        neg	$5aa5,x +        neg	$5aa5,y +        neg	$5aa5,z +        neg	$1234 + +        negw	$5aa5,x +        negw	$5aa5,y +        negw	$5aa5,z +        negw	$1234 + +        oraa	$55,x +        oraa	$55,y +        oraa	$55,z +        oraa	#$aa +        oraa	$5aa5,x +        oraa	$5aa5,y +        oraa	$5aa5,z +        oraa	$1234 +        oraa	e,x +        oraa	e,y +        oraa	e,z + +        orab	$55,x +        orab	$55,y +        orab	$55,z +        orab	#$aa +        orab	$5aa5,x +        orab	$5aa5,y +        orab	$5aa5,z +        orab	$1234 +        orab	e,x +        orab	e,y +        orab	e,z + +        ord	$55,x +        ord	$55,y +        ord	$55,z +        ord	#$aa +        ord	$5aa5,x +        ord	$5aa5,y +        ord	$5aa5,z +        ord	$1234 +        ord	e,x +        ord	e,y +        ord	e,z + +        ore	$55,x +        ore	$55,y +        ore	$55,z +        ore	#$aa +        ore	$5aa5,x +        ore	$5aa5,y +        ore	$5aa5,z +        ore	$1234 + +        rol	$55,x +        rol	$55,y +        rol	$55,z +        rol	$5aa5,x +        rol	$5aa5,y +        rol	$5aa5,z +        rol	$1234 + +        rolw	$5aa5,x +        rolw	$5aa5,y +        rolw	$5aa5,z +        rolw	$1234 + +        ror	$55,x +        ror	$55,y +        ror	$55,z +        ror	$5aa5,x +        ror	$5aa5,y +        ror	$5aa5,z +        ror	$1234 + +        rorw	$5aa5,x +        rorw	$5aa5,y +        rorw	$5aa5,z +        rorw	$1234 + +        sbca	$55,x +        sbca	$55,y +        sbca	$55,z +        sbca	#$aa +        sbca	$5aa5,x +        sbca	$5aa5,y +        sbca	$5aa5,z +        sbca	$1234 +        sbca	e,x +        sbca	e,y +        sbca	e,z + +        sbcb	$55,x +        sbcb	$55,y +        sbcb	$55,z +        sbcb	#$aa +        sbcb	$5aa5,x +        sbcb	$5aa5,y +        sbcb	$5aa5,z +        sbcb	$1234 +        sbcb	e,x +        sbcb	e,y +        sbcb	e,z + +        sbcd	$55,x +        sbcd	$55,y +        sbcd	$55,z +        sbcd	#$aa +        sbcd	$5aa5,x +        sbcd	$5aa5,y +        sbcd	$5aa5,z +        sbcd	$1234 +        sbcd	e,x +        sbcd	e,y +        sbcd	e,z + +        sbce	$55,x +        sbce	$55,y +        sbce	$55,z +        sbce	#$aa +        sbce	$5aa5,x +        sbce	$5aa5,y +        sbce	$5aa5,z +        sbce	$1234 + +        staa	$55,x +        staa	$55,y +        staa	$55,z +        staa	$5aa5,x +        staa	$5aa5,y +        staa	$5aa5,z +        staa	$1234 +        staa	e,x +        staa	e,y +        staa	e,z + +        stab	$55,x +        stab	$55,y +        stab	$55,z +        stab	$5aa5,x +        stab	$5aa5,y +        stab	$5aa5,z +        stab	$1234 +        stab	e,x +        stab	e,y +        stab	e,z + +        std	$55,x +        std	$55,y +        std	$55,z +        std	$5aa5,x +        std	$5aa5,y +        std	$5aa5,z +        std	$1234 +        std	e,x +        std	e,y +        std	e,z + +        ste	$55,x +        ste	$55,y +        ste	$55,z +        ste	$5aa5,x +        ste	$5aa5,y +        ste	$5aa5,z +        ste	$1234 + +        suba	$55,x +        suba	$55,y +        suba	$55,z +        suba	#$aa +        suba	$5aa5,x +        suba	$5aa5,y +        suba	$5aa5,z +        suba	$1234 +        suba	e,x +        suba	e,y +        suba	e,z + +        subb	$55,x +        subb	$55,y +        subb	$55,z +        subb	#$aa +        subb	$5aa5,x +        subb	$5aa5,y +        subb	$5aa5,z +        subb	$1234 +        subb	e,x +        subb	e,y +        subb	e,z + +        subd	$55,x +        subd	$55,y +        subd	$55,z +        subd	#$aa +        subd	$5aa5,x +        subd	$5aa5,y +        subd	$5aa5,z +        subd	$1234 +        subd	e,x +        subd	e,y +        subd	e,z + +        sube	$55,x +        sube	$55,y +        sube	$55,z +        sube	#$aa +        sube	$5aa5,x +        sube	$5aa5,y +        sube	$5aa5,z +        sube	$1234 + +        tst	$55,x +        tst	$55,y +        tst	$55,z +        tst	$5aa5,x +        tst	$5aa5,y +        tst	$5aa5,z +        tst	$1234 + +        tstw	$5aa5,x +        tstw	$5aa5,y +        tstw	$5aa5,z +        tstw	$1234 + +        cps	$55,x +        cps	$55,y +        cps	$55,z +        cps	#$aa +        cps	$5aa5,x +        cps	$5aa5,y +        cps	$5aa5,z +        cps	$1234 + +        cpx	$55,x +        cpx	$55,y +        cpx	$55,z +        cpx	#$aa +        cpx	$5aa5,x +        cpx	$5aa5,y +        cpx	$5aa5,z +        cpx	$1234 + +        cpy	$55,x +        cpy	$55,y +        cpy	$55,z +        cpy	#$aa +        cpy	$5aa5,x +        cpy	$5aa5,y +        cpy	$5aa5,z +        cpy	$1234 + +        cpz	$55,x +        cpz	$55,y +        cpz	$55,z +        cpz	#$aa +        cpz	$5aa5,x +        cpz	$5aa5,y +        cpz	$5aa5,z +        cpz	$1234 + +        lds	$55,x +        lds	$55,y +        lds	$55,z +        lds	#$aa +        lds	$5aa5,x +        lds	$5aa5,y +        lds	$5aa5,z +        lds	$1234 + +        ldx	$55,x +        ldx	$55,y +        ldx	$55,z +        ldx	#$aa +        ldx	$5aa5,x +        ldx	$5aa5,y +        ldx	$5aa5,z +        ldx	$1234 + +        ldy	$55,x +        ldy	$55,y +        ldy	$55,z +        ldy	#$aa +        ldy	$5aa5,x +        ldy	$5aa5,y +        ldy	$5aa5,z +        ldy	$1234 + +        ldz	$55,x +        ldz	$55,y +        ldz	$55,z +        ldz	#$aa +        ldz	$5aa5,x +        ldz	$5aa5,y +        ldz	$5aa5,z +        ldz	$1234 + +        sts	$55,x +        sts	$55,y +        sts	$55,z +        sts	$5aa5,x +        sts	$5aa5,y +        sts	$5aa5,z +        sts	$1234 + +        stx	$55,x +        stx	$55,y +        stx	$55,z +        stx	$5aa5,x +        stx	$5aa5,y +        stx	$5aa5,z +        stx	$1234 + +        sty	$55,x +        sty	$55,y +        sty	$55,z +        sty	$5aa5,x +        sty	$5aa5,y +        sty	$5aa5,z +        sty	$1234 + +        stz	$55,x +        stz	$55,y +        stz	$55,z +        stz	$5aa5,x +        stz	$5aa5,y +        stz	$5aa5,z +        stz	$1234 + +        jmp	$12345 +        jmp	$23456,x +        jmp	$23456,y +        jmp	$23456,z + +        jsr	$12345 +        jsr	$23456,x +        jsr	$23456,y +        jsr	$23456,z + +        ais	#-2 +        ais	#1000 + +        aix	#-2 +        aix	#1000 + +        aiy	#-2 +        aiy	#1000 + +        aiz	#-2 +        aiz	#1000 + +        andp	#$feff +        orp	#$0100 + +        lded	$a55a +        ldhi	$a55a +        sted	$5aa5 + +	mac	3,5 +        rmac	5,3 + +        pshm	d,x,z,ccr +        pulm	e,y,k + +        bclr    $55,x,#2 +        bclr	$55,y,#2 +        bclr	$55,z,#2 +        bclr    $5aa5,x,#2 +        bclr	$5aa5,y,#2 +        bclr	$5aa5,z,#2 +	bclr	$1234,#2 + +        bset    $55,x,#2 +        bset	$55,y,#2 +        bset	$55,z,#2 +        bset    $5aa5,x,#2 +        bset	$5aa5,y,#2 +        bset	$5aa5,z,#2 +	bset	$1234,#2 + +        bclrw   $55,x,#2 +        bclrw	$55,y,#2 +        bclrw	$55,z,#2 +        bclrw   $5aa5,x,#2 +        bclrw	$5aa5,y,#2 +        bclrw	$5aa5,z,#2 +	bclrw	$1234,#2 + +        bsetw   $55,x,#2 +        bsetw	$55,y,#2 +        bsetw	$55,z,#2 +        bsetw   $5aa5,x,#2 +        bsetw	$5aa5,y,#2 +        bsetw	$5aa5,z,#2 +	bsetw	$1234,#2 + +        movb	$1234,$5678 +        movb	$1234,5,x +        movb	-5,x,$5678 + +        movw	$1234,$5678 +        movw	$1234,5,x +        movw	-5,x,$5678 + +        brclr	$55,x,#2,*+$30 +        brclr	$55,y,#2,*+$30 +        brclr	$55,z,#2,*+$30 +        brclr	$55,x,#2,*+$300 +        brclr	$55,y,#2,*+$300 +        brclr	$55,z,#2,*+$300 +        brclr	$5aa5,x,#2,*+$300 +        brclr	$5aa5,y,#2,*+$300 +        brclr	$5aa5,z,#2,*+$300 +        brclr	$1234,#2,*+$300 + +        brset	$55,x,#2,*+$30 +        brset	$55,y,#2,*+$30 +        brset	$55,z,#2,*+$30 +        brset	$55,x,#2,*+$300 +        brset	$55,y,#2,*+$300 +        brset	$55,z,#2,*+$300 +        brset	$5aa5,x,#2,*+$300 +        brset	$5aa5,y,#2,*+$300 +        brset	$5aa5,z,#2,*+$300 +        brset	$1234,#2,*+$300 + +        clc +        andp	#$feff +        cli +        andp	#$ff1f +        clv +        andp	#$fdff +        des +        ais	#-1 +        dex +        aix	#-1 +        dey +        aiy	#-1 +        ins +        ais	#1 +        inx +        aix	#1 +        iny +        aiy	#1 +        pshx +        pshm	x +        pshy +        pshm	y +        pulx +        pulm	x +        puly +        pulm	y +        sec +        orp	#$0100 +        sei +        orp	#$00e0 +        sev +        orp	#$0200 diff --git a/tests/t_6816/t_6816.doc b/tests/t_6816/t_6816.doc new file mode 100644 index 0000000..ad1fc09 --- /dev/null +++ b/tests/t_6816/t_6816.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 6816 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the 68HC16 instruction set              | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_6816/t_6816.ori b/tests/t_6816/t_6816.ori Binary files differnew file mode 100644 index 0000000..1642194 --- /dev/null +++ b/tests/t_6816/t_6816.ori diff --git a/tests/t_7000/asflags b/tests/t_7000/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_7000/asflags diff --git a/tests/t_7000/t_7000.asm b/tests/t_7000/t_7000.asm new file mode 100644 index 0000000..ed60212 --- /dev/null +++ b/tests/t_7000/t_7000.asm @@ -0,0 +1,249 @@ +	cpu	sh7600 +	page 	0 +	supmode	on + +	rts +	rte +	rtb +	clrt +	sett +	clrmac +	nop +	sleep +	div0u +	brk + +	movt	r4 +	cmp/pz	r6 +	cmp/pl	r12 +	rotl	r5 +	rotr	sp +	rotcl	r8 +	rotcr	r2 +	shal	r1 +	shar	r13 +	shll	r9 +	shlr	r11 +	shll2	r4 +	shlr2	r10 +	shll8	r15 +	shlr8	r3 +	shll16	r5 +	shlr16	r7 +	stbr	r5 +	ldbr	sp +        dt	r6 + +	tas	@sp + +	xtrct	r0,r1 +	addc	r1,r2 +	addv	r2,r3 +	cmp/hs	r3,r4 +	cmp/ge	r4,r5 +	cmp/hi	r5,r6 +	cmp/gt	r6,r7 +	cmp/str	r7,r8 +	div1	r8,r9 +	div0s	r9,r10 +	muls.w	r10,r11 +	mulu.w	r11,r12 +	neg	r12,r13 +	negc	r13,r14 +	sub	r14,r15 +	subc	r15,r0 +	subv	r0,r1 +	not	r1,r2 +        dmuls.l	r2,r3 +        dmulu.l	r3,r4 +        mul	r4,r5 + +	swap.b	r5,r10 +	swap.w	r6,r11 +	exts.b	r7,r12 +	exts.w	r8,r13 +	extu.b	r9,r14 +	extu.w	r10,r15 + +	add	r3,r5 +	add	#-30,r4 +	cmp/eq	r3,r5 +	cmp/eq	#-30,r0 +	mac	@r5+,@r7+ +        mac.l	@r5+,@r7+ + +	and	r5,r9 +	and	#30,r0 +	and.b	#$55,@(r0,gbr) + +	or	r7,sp +	or	#%10111011,r0 +	or	#123,@(gbr,r0,3-5+2) + +	tst	r4,r12 +	tst.l	#20,r0 +	tst.b	#33,@(r0,gbr) + +	xor	r5,r3 +	xor.l	#45,r0 +	xor	#%10,@(gbr,r0) + + +	bt	targ +targ:	bf	targ +	bt/s	targ +        bf/s	targ +	bra	targ +	bsr	targ +	jmp	@r5 +	jsr	@r10 + +	ldc	r5,sr +	ldc	r10,gbr +	ldc	r7,vbr +	ldc	@r6+,sr +	ldc	@r9+,gbr +	ldc	@r13+,vbr +	stc	sr,r4 +	stc	gbr,r3 +	stc	vbr,r7 +	stc	sr,@-r6 +	stc	gbr,@-r4 +	stc	vbr,@-r14 +	lds	r5,mach +	lds	r10,macl +	lds	r7,pr +	lds	@r6+,mach +	lds	@r9+,macl +	lds	@r13+,pr +	sts	mach,r4 +	sts	macl,r3 +	sts	pr,r7 +	sts	mach,@-r6 +	sts	macl,@-r4 +	sts	pr,@-r14 + +        mova    ldata,r0 + +	mov.l	r5,r13 + +	mov.b	r1,@-r2 +	mov.b	@r2+,r1 +	mov.w	r3,@-r4 +	mov.w	@r4+,r3 +	mov.l	r6,@-r5 +	mov.l	@r5+,r6 + +	mov.b	r12,@r5 +	mov.b	@r5,r12 +	mov.w	r5,@r14 +	mov.w	@r14,r5 +	mov.l	r7,@r7 +	mov.l	@r7,r7 + +	mov.b	r0,@(r6,3) +	mov.b	@(r6,1+2),r0 +	mov.w	r0,@(10,r12) +	mov.w	@(10,r12),r0 +	mov.l	r7,@(60,r3) +	mov.l	@(2*30,r3),r7 + +	mov.b	r4,@(r0,r5) +	mov.b	@(r5,r0),r4 +	mov.w	r6,@(r0,r10) +	mov.w	@(r10,r0),r6 +	mov.l	r7,@(r0,r6) +	mov.l	@(r6,r0),r7 + +	mov.b	r0,@(gbr,30) +	mov.b	@(30,gbr),r0 +	mov.w	r0,@(gbr,60) +	mov.w	@(10,5*5*2,gbr),r0 +	mov.l	r0,@(gbr,120) +	mov.l	@(120,gbr),r0 + +	mov	#120,r4 +	mov.w	wdata,r3 +	mov.l	ldata,r12 + +	trapa	#$21 + +	mov	#$1234,r3 +	mov	#$8000,r3 +	mov	#$11223344,r3 +	mov	#$0000,r3 +	mov	#$1122,r3 +	mov	#$3344,r3 + +        bra	next +        mov	#$1234,r3 +        bra	next +        mov	#$11223344,r3 +        nop +next:	nop +	nop + +	section test +	mov	#$1234,r5 +        nop +        ltorg +	endsection + +	align	4 +ldata:	dc.l	$12345678 +wdata:	dc.w	$1234 + +	ltorg + +        cpu	sh7700 + +        clrs +        sets +        ldtlb + +        ldc	r4,ssr +        ldc	r4,spc +        ldc	r4,r0_bank +        ldc	r4,r1_bank +        ldc	r4,r2_bank +        ldc	r4,r3_bank +        ldc	r4,r4_bank +        ldc	r4,r5_bank +        ldc	r4,r6_bank +        ldc	r4,r7_bank +        ldc.l	@r4+,ssr +        ldc.l	@r4+,spc +        ldc.l	@r4+,r0_bank +        ldc.l	@r4+,r1_bank +        ldc.l	@r4+,r2_bank +        ldc.l	@r4+,r3_bank +        ldc.l	@r4+,r4_bank +        ldc.l	@r4+,r5_bank +        ldc.l	@r4+,r6_bank +        ldc.l	@r4+,r7_bank +        stc	ssr,r4 +        stc	spc,r4 +        stc	r0_bank,r4 +        stc	r1_bank,r4 +        stc	r2_bank,r4 +        stc	r3_bank,r4 +        stc	r4_bank,r4 +        stc	r5_bank,r4 +        stc	r6_bank,r4 +        stc	r7_bank,r4 +        stc.l	ssr,@-r4 +        stc.l	spc,@-r4 +        stc.l	r0_bank,@-r4 +        stc.l	r1_bank,@-r4 +        stc.l	r2_bank,@-r4 +        stc.l	r3_bank,@-r4 +        stc.l	r4_bank,@-r4 +        stc.l	r5_bank,@-r4 +        stc.l	r6_bank,@-r4 +        stc.l	r7_bank,@-r4 + +        pref	@r5 + +        shad	r3,r7 +        shld	r12,sp + diff --git a/tests/t_7000/t_7000.doc b/tests/t_7000/t_7000.doc new file mode 100644 index 0000000..9be3f47 --- /dev/null +++ b/tests/t_7000/t_7000.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 7000 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the SH7x00 instruction set              | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_7000/t_7000.ori b/tests/t_7000/t_7000.ori Binary files differnew file mode 100644 index 0000000..560ff72 --- /dev/null +++ b/tests/t_7000/t_7000.ori diff --git a/tests/t_75k0/asflags b/tests/t_75k0/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_75k0/asflags diff --git a/tests/t_75k0/t_75k0.asm b/tests/t_75k0/t_75k0.asm new file mode 100644 index 0000000..9925e87 --- /dev/null +++ b/tests/t_75k0/t_75k0.asm @@ -0,0 +1,191 @@ +        cpu     75104 +        page    0 +        include stddef75 + +        ret +        reti +        rets +        halt +        stop +        nop + +        br	pc+5 +        br	pc-5 +        br	pc+200h +        br	pc+2000h +	br	$pc+5 +        brcb	pc+5 +        br	!pc+5 +        br	$pc-5 +        brcb	pc-5 +        br	!pc-5 +        brcb	pc+200h +        br	!pc+200h +        br	!pc+2000h +        br	pcde +        br	pcxa + +        call	!200h +        call	!2000h +        call	200h +        call	2000h +        callf	200h +        callf	!200h + +        adds	a,#5 +        adds	xa,#30 +        adds	a,@hl +        adds	xa,hl +        adds	xa,de +        adds	xa,bc +        adds	xa,xa' +        adds	xa,hl' +        adds	xa,de` +        adds	xa,bc` +        adds	de,xa + +        addc	a,@hl +        addc	xa,bc +        addc	de`,xa + +        subs	a,@hl +        subs	xa,bc +        subs	de`,xa + +        subc	a,@hl +        subc	xa,bc +        subc	de`,xa + +        and	a,#13 +        and	a,@hl +        and	xa,bc +        and	de`,xa + +        or	a,#13 +        or	a,@hl +        or	xa,bc +        or	de`,xa + +        xor	a,#13 +        xor	a,@hl +        xor	xa,bc +        xor	de`,xa + +	incs	d +        incs	de +        incs	@hl +        incs	20h + +        decs	d +        decs	de' + +        ske	b,#5 +        ske	@hl,#6 +        ske	a,@hl +        ske	@hl,a +        ske	xa,@hl +        ske	@hl,xa +        ske	a,c +        ske	c,a +        ske	xa,hl' +        ske	hl`,xa + +        mov	a,#5 +        mov	b,#5 +        mov	de,#55h +        mov	a,@hl +        mov	a,@hl+ +        mov	a,@hl- +        mov	a,@de +        mov	a,@dl +        mov	xa,@hl +        mov	@hl,a +        mov	@hl,xa +        mov	a,12h +        mov	xa,34h +        mov	56h,a +        mov	78h,xa +        mov	a,c +	mov	xa,bc' +        mov	d,a +        mov	hl`,xa + +        xch	a,@hl+ +        xch	@hl+,a +        xch	xa,@hl +        xch	@hl,xa +        xch	a,12h +        xch	12h,a +        xch	xa,34h +        xch	34h,xa +        xch	a,d +        xch	d,a +        xch	xa,de +        xch	de,xa + +        movt	xa,@pcde +        movt	xa,@pcxa + +        mov1	cy,0fb2h.2 +        mov1	0ff4h.1,cy +        mov1	cy,0fe4h.@l +        mov1	@h+13.3,cy + +        set1	cy +	set1	40h.2 +        set1	0ff2h.3 + +        clr1	cy +	clr1	40h.2 +        clr1	0ff2h.3 + +        skt 	cy +	skt 	40h.2 +        skt 	0ff2h.3 + +	skf 	40h.2 +        skf 	0ff2h.3 + +	not1	cy +        sktclr	0ff2h.3 + +        and1	cy,0ff2h.3 +        or1	cy,0ff2h.3 +        xor1	cy,0ff2h.3 + +        rorc	a +        not	a + +        push	bs +        pop	bs +        push	hl +        pop	bc + +        in	a,port3 +        in	xa,port12 +        out	port10,a +        out	port7,xa + +        ei +        di +        ei	ieks +        di	iew + +        sel	rb2 +        sel	mb10 + +        geti	15 + +bit1	bit	0ff0h.@l +bit2	bit	0fb0h.2 +bit3	bit	0ff0h.1 +bit4	bit	0430h.3 +bit5    bit     @h+5+3.2 + +	set1	bit1 +        clr1    bit4 +        sel     mb4 +        set1	mbe +        assume  mbs:4,mbe:1 +        clr1    bit4 + diff --git a/tests/t_75k0/t_75k0.doc b/tests/t_75k0/t_75k0.doc new file mode 100644 index 0000000..68b87c8 --- /dev/null +++ b/tests/t_75k0/t_75k0.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 75K0 ----------------------------+ +|                                                                            | +|       This is a (synthetic) test of the 75K0 instruction set               | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_75k0/t_75k0.ori b/tests/t_75k0/t_75k0.ori Binary files differnew file mode 100644 index 0000000..09c49c4 --- /dev/null +++ b/tests/t_75k0/t_75k0.ori diff --git a/tests/t_7700/asflags b/tests/t_7700/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_7700/asflags diff --git a/tests/t_7700/t_7700.asm b/tests/t_7700/t_7700.asm new file mode 100644 index 0000000..f4537d9 --- /dev/null +++ b/tests/t_7700/t_7700.asm @@ -0,0 +1,356 @@ +        cpu     melps7751 +	page	0 + + +	ldt	#0 +	assume	pg:0,dt:0,dpr:0 + +accmode macro   size +	 switch	size +	  case   8 +	   sep    #$20 +	   assume m:1 +	  case	16 +	   clp    #$20 +	   assume m:0 +	  elsecase +	   fatal  "accmode: ungltige Operandengr”áe: $\{SIZE}" +	 endcase +	endm + +idxmode macro	size +	 switch	size +	  case   8 +	   sep    #$10 +	   assume x:1 +	  case	16 +	   clp    #$10 +	   assume x:0 +	  elsecase +	   fatal  "idxmode: ungltige Operandengr”áe: $\{SIZE}" +	 endcase +	endm + +	xab +	wit +	tyx +	tyb +	tya +	txy +	txs +	txb +	txa +	tsx +	tsb +	tsa +	tdb +	tda +	tby +	tbx +	tbs +	tbd +	tay +	tax +	tas +	tad +	stp +	sem +	sei +	sec +	rts +	rtl +	rti +	ply +	plx +	plt +	plp +	pld +	plb +	pla +	phy +	phx +	pht +	php +	phg +	phd +	phb +	pha +	nop +	iny +	inx +	dey +	dex +	clv +	clm +	cli +	clc + +	rla	#7 + +targ: +	bcc	targ +	bcs	targ +	beq	targ +	bmi	targ +	bne	targ +	bpl	targ +	bvc	targ +	bvs	targ +	bra	targ +	per	targ +	org	*+$100 +	bra	targ +	per	targ + +	accmode	8 +	idxmode	8 + +	adc	#20 +	and	a,#-1 +	cmp	b,#-$a + +targ2: +	bbc	#$80,$20,targ2 +	bbs	#$40,$2000,targ2 +	clb	#$20,$20 +	seb	#$10,$2000 + +	cpx	#$aa +	cpy     #$aa +	ldx	#$bb +	ldy	#$bb + +	ldm	#$aa,$20 +	ldm	#$aa,$2000 +	ldm	#$aa,$20,x +	ldm	#$aa,$2000,x + +	accmode	16 +	idxmode	16 + +	eor	#%0000111111110000 +	lda	a,#'AB' +	ora	b,#3000 + +	sbc	$20 +	sta	a,$2000 +	adc	b,$200000 + +	and	$30,x +	cmp	a,$3000,x +	eor	b,$300000,x + +	lda	$40,y +	ora	a,$4000,y +;	sbc	b,$400000,y + +	sta	($50) +;	adc	a,($5000) +;	and	b,($500000) + +	cmpl	($60) +;	eorl	a,($6000) +;	ldal	b,($600000) + +	ora	($70,x) +;	sbc	($7000,x) +;	sta	($700000,x) + +	adc	($80),y +;	and	($8000),y +;	cmp	($800000),y + +	eorl	($80),y +;	ldal	($8000),y +;	oral	($800000),y + +	sbc	b,3,s +	sta	a,(5,s),y + +	asl +	dec	a +	inc	b +	lsr	$20 +	rol	$2000 +	ror	$20,x +	asl	$2000,x + +targ3: +	bbs	#$80,$20,targ3 +	bbc	#$40,$2000,targ3 +	clb	#$20,$20 +	seb	#$10,$2000 + +	cpx	#$aa +	cpy     #$aa +	ldx	#$bb +	ldy	#$bb +	cpx	$20 +	cpy	$20 +	ldx	$20 +	ldy	$20 +	stx	$20 +	sty	$20 +	cpx	$2000 +	cpy	$2000 +	ldx	$2000 +	ldy	$2000 +	stx	$2000 +	sty	$2000 +	ldx	$30,y +	ldy	$30,x +	stx	$30,y +	sty	$30,x +	ldx	$3000,y +	ldy	$3000,x + +        mpy     #55 +        accmode 8 +        mpy     #55 +        accmode 16 +        mpy     $12 +        mpy     $12,x +        mpy     ($12) +        mpy     ($12,x) +        mpy     ($12),y +        mpyl    ($12) +        mpyl    ($12),y +        mpy     $1234 +        mpy     $1234,x +        mpy     $1234,y +        mpy     $123456 +        mpy     $123456,x +        mpy     $12,s +        mpy     ($12,s),y + +        div     #55 +        accmode 8 +        div     #55 +        accmode 16 +        div     $12 +        div     $12,x +        div     ($12) +        div     ($12,x) +        div     ($12),y +        divl    ($12) +        divl    ($12),y +        div     $1234 +        div     $1234,x +        div     $1234,y +        div     $123456 +        div     $123456,x +        div     $12,s +        div     ($12,s),y + +        jmp     $20 +	jmp	$2000 +	jmp	$200000 +	jmp	($3000) +	jmpl	($3000) +	jmp	($4000,x) +	jsr	$20 +	jsr	$2000 +	jsr	$200000 +	jsr	($4000,x) + +	ldm	#$aa,$20 +	ldm	#$aa,$2000 +	ldm	#$aa,$20,x +	ldm	#$aa,$2000,x + +	mvn	$200000,$300000 +	mvp	$200000,$300000 + +;- - - - - - - - - - - - - - - - - - - - - - - - - - - - + +	cpu     65816 + +	cop +	jml     $2000 +	jsl     $4000 +	brl     * +	rep     #$55 +	tsb     $33 +	trb     $66 +        tsb     $9999 +        trb     $cccc +        bit     $00 +	bit     $11,x +        bit     $2222 +        bit     $3333,x +        bit     #$44 +        stz     $55 +        stz     $6666 +        stz     $77,x +        stz     $8888,x +        cld +        sed +	tcs +	tsc +	phk +	tcd +	tdc +	phb +	plb +	wai +	xba +	xce + +;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +        cpu     melps7750 + +        asr +        asr     a +        asr     b +        asr     $aa +        asr     $1234 +        asr     $aa,x +        asr     $1234,x + +        extz +        extz    a +        extz    b +        exts +        exts    a +        exts    b + +        mpys     #55 +        accmode 8 +        mpys     #55 +        accmode 16 +        mpys     $12 +        mpys     $12,x +        mpys     ($12) +        mpys     ($12,x) +        mpys     ($12),y +        mpysl    ($12) +        mpysl    ($12),y +        mpys     $1234 +        mpys     $1234,x +        mpys     $1234,y +        mpys     $123456 +        mpys     $123456,x +        mpys     $12,s +        mpys     ($12,s),y + +        divs     #55 +        accmode 8 +        divs     #55 +        accmode 16 +        divs     $12 +        divs     $12,x +        divs     ($12) +        divs     ($12,x) +        divs     ($12),y +        divsl    ($12) +        divsl    ($12),y +        divs     $1234 +        divs     $1234,x +        divs     $1234,y +        divs     $123456 +        divs     $123456,x +        divs     $12,s +        divs     ($12,s),y + + diff --git a/tests/t_7700/t_7700.doc b/tests/t_7700/t_7700.doc new file mode 100644 index 0000000..d7186e0 --- /dev/null +++ b/tests/t_7700/t_7700.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 7700 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the MELPS/77xx instruction set          | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_7700/t_7700.ori b/tests/t_7700/t_7700.ori Binary files differnew file mode 100644 index 0000000..df9af4e --- /dev/null +++ b/tests/t_7700/t_7700.ori diff --git a/tests/t_7720/asflags b/tests/t_7720/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_7720/asflags diff --git a/tests/t_7720/t_7720.asm b/tests/t_7720/t_7720.asm new file mode 100644 index 0000000..d25c058 --- /dev/null +++ b/tests/t_7720/t_7720.asm @@ -0,0 +1,141 @@ +	cpu	7720 + +	jmp	lab +	call	lab +	jnca	lab +	jncb	lab +        jcb	lab +        jnza    lab +	jza     lab +   	jnzb    lab +        jzb     lab +   	jnova0  lab +        jova0   lab +   	jnovb0  lab +        jovb0   lab +   	jnova1  lab +        jova1   lab +   	jnovb1  lab +        jovb1   lab +   	jnsa0   lab +        jsa0    lab +   	jnsb0   lab +        jsb0    lab +   	jnsa1   lab +        jsa1    lab +   	jnsb1   lab +        jsb1    lab +   	jdpl0   lab +        jdplf   lab +   	jnsiak  lab +        jsiak   lab +   	jnsoak  lab +        jsoak   lab +   	jnrqm   lab +        jrqm    lab +lab: + +	ldi	@non,1234h +	ldi	@a,1234h +	ldi	@b,1234h +	ldi	@tr,1234h +	ldi	@dp,1234h +	ldi	@rp,1234h +	ldi	@dr,1234h +	ldi	@sr,1234h +	ldi	@sol,1234h +	ldi	@som,1234h +	ldi	@k,1234h +	ldi	@klr,1234h +	ldi	@klm,1234h +	ldi	@l,1234h +	ldi	@mem,1234h + +	op	mov	@a,non +	op	mov	@a,a +	op	mov	@a,b +	op	mov	@a,tr +	op	mov	@a,dp +	op	mov	@a,rp +	op	mov	@a,ro +	op	mov	@a,sgn +	op	mov	@a,dr +	op	mov	@a,drnf +	op	mov	@a,sr +	op	mov	@a,sim +	op	mov	@a,sil +	op	mov	@a,k +	op	mov	@a,l +	op	mov	@a,mem + +	op	mov	@a,non +		or	acca,ram +	op	mov	@a,non +		or	accb,ram +	op      mov     @a,non +		or	acca,idb +	op      mov     @a,non +		or      acca,m +	op      mov     @a,non +		or      acca,n +	op	mov     @a,non +		and	acca,ram +	op      mov     @a,non +		xor	acca,ram +	op      mov     @a,non +		sub	acca,ram +	op      mov     @a,non +		add	acca,ram +	op      mov     @a,non +		sbb	acca,ram +	op      mov     @a,non +		adc	acca,ram +	op      mov     @a,non +		cmp	acca,ram +	op	mov     @a,non +		inc	accb +	op	mov	@a,non +		dec	acca +	op      mov     @a,non +		shr1	accb +	op	mov	@a,non +		shl1	acca +	op	mov	@a,non +		shl2	accb +	op	mov	@a,non +		shl4	acca +	op	mov	@a,non +		xchg	accb +	op	mov	@a,non +		nop + +        op      mov     @a,non +		dpnop +        op      mov     @a,non +		dpinc +        op      mov     @a,non +		dpdec +        op      mov     @a,non +		dpclr + +	op	mov	@a,non +		m0 +	op	mov	@a,non +		m1 +	op	mov	@a,non +		m2 +	op	mov	@a,non +		m3 +	op	mov	@a,non +		m4 +	op	mov	@a,non +		m5 +	op	mov	@a,non +		m6 +	op	mov	@a,non +		m7 + +	op	mov	@a,non +		rpnop +	op	mov	@a,non +		rpdec diff --git a/tests/t_7720/t_7720.doc b/tests/t_7720/t_7720.doc new file mode 100644 index 0000000..cdf17c8 --- /dev/null +++ b/tests/t_7720/t_7720.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application 7720 ---------------------------+ +|                                                                            | +|       This is a (synthetic) test of the uPD7720 instruction set            | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_7720/t_7720.ori b/tests/t_7720/t_7720.ori Binary files differnew file mode 100644 index 0000000..bb3ef05 --- /dev/null +++ b/tests/t_7720/t_7720.ori diff --git a/tests/t_77230/asflags b/tests/t_77230/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_77230/asflags diff --git a/tests/t_77230/t_77230.asm b/tests/t_77230/t_77230.asm new file mode 100644 index 0000000..494b9c3 --- /dev/null +++ b/tests/t_77230/t_77230.asm @@ -0,0 +1,245 @@ +	cpu	77230 +	page	0 + +	; Test Case 1 (nur LDI) und DestReg-Kodierungen + +	ldi	rp,123456h +	ldi	psw0,123456h +	ldi	psw1,123456h +	ldi	svr,123456h +	ldi	sr,123456h +	ldi	lc,123456h +	ldi	stk,123456h +	ldi	lkr0,123456h +	ldi	klr1,123456h +	ldi	tre,123456h +	ldi	tr,123456h +	ldi	ar,123456h +	ldi	so,123456h +	ldi	dr,123456h +	ldi	drs,123456h +	ldi	wr0,123456h +	ldi	wr1,123456h +	ldi	wr2,123456h +	ldi	wr3,123456h +	ldi	wr4,123456h +	ldi	wr5,123456h +	ldi	wr6,123456h +	ldi	wr7,123456h +	ldi	ram0,123456h +	ldi	ram1,123456h +	ldi	bp0,123456h +	ldi	bp1,123456h +	ldi	ix0,123456h +	ldi	ix1,123456h +	ldi	k,123456h +	ldi	l,123456h + +	; Sprünge wahlweise mit oder ohne MOV, Test SrcReg-Kodierungen +	jmp	target +	call	target 		mov 	wr0,rp +	ret +	ret			mov 	wr0,psw0 +        mov	wr0,psw1	jnzrp	target +	jz0	target		mov	wr0,svr +	mov	wr0,sr		jnz0	target +	jz1	target		mov	wr0,lc +	mov	wr0,stx		jnz1	target +	jc0	target		mov	wr0,m +	mov	wr0,ml		jnc0	target +	jc1	target		mov	wr0,rom +	mov	wr0,tr		jnc1	target +	js0	target		mov	wr0,ar +	mov	wr0,si		jns0	target +	js1	target		mov	wr0,dr +	mov	wr0,drs		jns1	target +	jv0	target		mov	wr0,wr0 +	mov	wr0,wr1		jnv0	target +	jv1	target		mov	wr0,wr2 +	mov	wr0,wr3		jnv1	target +	jev0	target		mov	wr0,wr4 +	mov	wr0,wr5		jev1	target +	jnfsi	target		mov	wr0,wr6 +	mov	wr0,wr7		jneso	target +	jip0	target		mov	wr0,ram0 +	mov	wr0,ram1	jip1	target +	jnzix0	target		mov	wr0,bp0 +	mov	wr0,bp1		jnzix1	target +	jnzbp0	target		mov	wr0,ix0 +	mov	wr0,ix1		jnzbp1	target +	jrdy	target		mov	wr0,k +	mov	wr0,l		jrqm	target +target: + +	; ALU + +	nop +	inc	wr1 +	dec	wr2 +	abs	wr3 +	not	wr4 +	neg	wr5 +	shlc	wr6 +	shrc	wr7 +	rol	wr1 +	ror	wr2 +	shlm	wr3 +	shrm	wr4 +	shram	wr5 +	clr	wr6 +	norm	wr7 +	cvt	wr1 +	add	wr1,ib +	sub	wr1,m +	addc	wr1,ram0 +	subc	wr1,ram1 +	cmp	wr1,ib +	and	wr1,m +	or	wr1,ram0 +	xor	wr1,ram1 +	addf	wr1,ib +	subf	wr1,m + +	; Mx-Felder + +	spcbp0  spcbi1 +	spcix0	spcix1 +	spcbi0	spcbp1 + +	; DPx-Felder + +	incbp0	clrix1 +	decbp0	decix1 +	clrbp0	incix1 +	stix0	stix1 +	incix0	clrbp1 +	decix0	decbp1 +	clrix0	incbp1 + +	; EA-Feld + +	incar +	decar + +	; FC-Feld + +	xchpsw + +	; RP-Feld +	 +	incrp +	decrp +	incbrp + +	; L-Feld + +	declc + +	; BASE-Felder + +	mcnbp0 0	mcnbp1 7 +	mcnbp0 1	mcnbp1 6 +	mcnbp0 2	mcnbp1 5 +	mcnbp0 3	mcnbp1 4 +	mcnbp0 4	mcnbp1 3 +	mcnbp0 5	mcnbp1 2 +	mcnbp0 6	mcnbp1 1 +	mcnbp0 7	mcnbp1 0 + +	; RPC-Feld + +	bitrp	0 +	bitrp   1 +        bitrp   2 +        bitrp   3 +        bitrp   4 +        bitrp   5 +        bitrp   6 +        bitrp   7 +        bitrp   8 +        bitrp   9 + +	; Ports nur im Paket + +	clrp2	clrp3 +	setp2	clrp3 +	clrp2	setp3 +	setp2	setp3 + +	; Interrupts nur mit Ports + +	clrp2   clrp3		clrbm +	clrp2   clrp3		setbm +	clrp2   clrp3	di +	clrp2   clrp3	ei +	clrp2   clrp3	ei	clrbm +	clrp2   clrp3	ei	setbm + +	; RW-Feld + +	rd +	wr + +	; WT-Feld + +	wrbord +	wrbl24 +	wrbl23 +	wrbel8 +	wrbl8e +	wrbxch +	wrbbrv + +	; NF-Feld + +	trnorm +	rdnorm +	fltfix +	fixma + +	; WI-Feld + +	bwrl24 +	bwrord + +	; FIS-Feld + +	spcpsw0 +	spcpsw1 +	clrpsw0 +	clrpsw1 +	clrpsw + +	; FD-Feld + +	spie +	iesp + +	; SHV-Feld + +	setsvl 7 +	setsvr 17 + +	; RPS-Feld + +	spcra 123 + +	; NAL-Feld + +	jblk $+5 + +	; Datenablage + +	dw 12345678h +	dw 32.0,-32.0 +	dw 1.0,-1.0 +;	dw 3.6e-46		; these do not work on machines that +;	dw 3.6e-45		; do not support denormalized values, +;	dw 3.6e-44		; so we better leave them out for portable +;	dw 3.6e-43		; tests... +;	dw 3.6e-42 +;	dw 3.6e-41 +;	dw 3.6e-40 +;	dw 3.6e-39 +	dw 3.6e-38 + diff --git a/tests/t_77230/t_77230.doc b/tests/t_77230/t_77230.doc new file mode 100644 index 0000000..a891a66 --- /dev/null +++ b/tests/t_77230/t_77230.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 77230 ---------------------------+ +|                                                                            | +|       This is a (synthetic) test of the uPD77230 instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_77230/t_77230.ori b/tests/t_77230/t_77230.ori Binary files differnew file mode 100644 index 0000000..d121bd3 --- /dev/null +++ b/tests/t_77230/t_77230.ori diff --git a/tests/t_7725/asflags b/tests/t_7725/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_7725/asflags diff --git a/tests/t_7725/t_7725.asm b/tests/t_7725/t_7725.asm new file mode 100644 index 0000000..2611a7d --- /dev/null +++ b/tests/t_7725/t_7725.asm @@ -0,0 +1,171 @@ +	cpu	7725 + +	jmp	lab +	call	lab +	jnca	lab +	jncb	lab +        jcb	lab +        jnza    lab +	jza     lab +   	jnzb    lab +        jzb     lab +   	jnova0  lab +        jova0   lab +   	jnovb0  lab +        jovb0   lab +   	jnova1  lab +        jova1   lab +   	jnovb1  lab +        jovb1   lab +   	jnsa0   lab +        jsa0    lab +   	jnsb0   lab +        jsb0    lab +   	jnsa1   lab +        jsa1    lab +   	jnsb1   lab +        jsb1    lab +   	jdpl0   lab +        jdplf   lab +   	jnsiak  lab +        jsiak   lab +   	jnsoak  lab +        jsoak   lab +   	jnrqm   lab +        jrqm    lab +	jdpln0	lab +	jdplnf	lab +lab: + +	ldi	@non,1234h +	ldi	@a,1234h +	ldi	@b,1234h +	ldi	@tr,1234h +	ldi	@dp,1234h +	ldi	@rp,1234h +	ldi	@dr,1234h +	ldi	@sr,1234h +	ldi	@sol,1234h +	ldi	@som,1234h +	ldi	@k,1234h +	ldi	@klr,1234h +	ldi	@klm,1234h +	ldi	@l,1234h +	ldi	@mem,1234h +	ldi	@trb,1234h + +	op	mov	@a,non +	op	mov	@a,a +	op	mov	@a,b +	op	mov	@a,tr +	op	mov	@a,dp +	op	mov	@a,rp +	op	mov	@a,ro +	op	mov	@a,sgn +	op	mov	@a,dr +	op	mov	@a,drnf +	op	mov	@a,sr +	op	mov	@a,sim +	op	mov	@a,sil +	op	mov	@a,k +	op	mov	@a,l +	op	mov	@a,mem + +	op	mov	@a,non +		or	acca,ram +	op	mov	@a,non +		or	accb,ram +	op      mov     @a,non +		or	acca,idb +	op      mov     @a,non +		or      acca,m +	op      mov     @a,non +		or      acca,n +	op	mov     @a,non +		and	acca,ram +	op      mov     @a,non +		xor	acca,ram +	op      mov     @a,non +		sub	acca,ram +	op      mov     @a,non +		add	acca,ram +	op      mov     @a,non +		sbb	acca,ram +	op      mov     @a,non +		adc	acca,ram +	op      mov     @a,non +		cmp	acca,ram +	op	mov     @a,non +		inc	accb +	op	mov	@a,non +		dec	acca +	op      mov     @a,non +		shr1	accb +	op	mov	@a,non +		shl1	acca +	op	mov	@a,non +		shl2	accb +	op	mov	@a,non +		shl4	acca +	op	mov	@a,non +		xchg	accb +	op	mov	@a,non +		nop + +        op      mov     @a,non +		dpnop +        op      mov     @a,non +		dpinc +        op      mov     @a,non +		dpdec +        op      mov     @a,non +		dpclr + +	op	mov	@a,non +		m0 +	op	mov	@a,non +		m1 +	op	mov	@a,non +		m2 +	op	mov	@a,non +		m3 +	op	mov	@a,non +		m4 +	op	mov	@a,non +		m5 +	op	mov	@a,non +		m6 +	op	mov	@a,non +		m7 +	op	mov	@a,non +		m8 +	op	mov	@a,non +		m9 +	op	mov	@a,non +		ma +	op	mov	@a,non +		mb +	op	mov	@a,non +		mc +	op	mov	@a,non +		md +	op	mov	@a,non +		me +	op	mov	@a,non +		mf + +	op	mov	@a,non +		rpnop +	op	mov	@a,non +		rpdec + +	data	1,2,3 +	data	"a" +	data	"ab" +	data	"abc" +	data	"abcd" +	data	"abcde" +	data	"abcdef" +	data	"abcdefg" +	data	"abcdefgh" + diff --git a/tests/t_7725/t_7725.doc b/tests/t_7725/t_7725.doc new file mode 100644 index 0000000..c8d6a1a --- /dev/null +++ b/tests/t_7725/t_7725.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application 7725 ---------------------------+ +|                                                                            | +|       This is a (synthetic) test of the uPD7725 instruction set            | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_7725/t_7725.ori b/tests/t_7725/t_7725.ori Binary files differnew file mode 100644 index 0000000..667ba6d --- /dev/null +++ b/tests/t_7725/t_7725.ori diff --git a/tests/t_78c1x/asflags b/tests/t_78c1x/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_78c1x/asflags diff --git a/tests/t_78c1x/t_78c1x.asm b/tests/t_78c1x/t_78c1x.asm new file mode 100644 index 0000000..4b9b143 --- /dev/null +++ b/tests/t_78c1x/t_78c1x.asm @@ -0,0 +1,258 @@ +	cpu	78c10 + +	block +	calb +	clc +	daa +	di +	ei +	exa +	exh +	exx +	hlt +	jb +	jea +	nega +	nop +	ret +	reti +	rets +	rld +	rrd +	softi +	stc +	stop +	table + +	aci	a,0 +	aci	h,10 +	aci	pc,55h + +	adi	a,40 +	adi	b,33o +	adi	eom,6 + +	adinc	a,56 +	ani	l,33h +	eqi	mkh,34 +	gti	a,20 +	lti	c,34 +	nei	mkl,10 +	offi	a,0ffh +	oni	d,0 +	ori	anm,47 +	sbi	a,41h +	sui	v,7 +	suinb	smh,98 + +	xri	a,055h +	xri	v,1010b +	xri	pb,40h + +	adc	a,v +	adc     v,a +	addnc	a,b +	addnc	b,a +	sub	a,c +	sub	c,a +	sbb	a,d +	sbb	d,a +	subnb	a,e +	subnb	e,a +	ana	a,h +	ana	h,a +	ora	a,l +	ora	l,a +	xra	a,v +	xra	v,a +	gta	a,b +	gta	b,a +	lta	a,c +	lta	c,a +	nea	a,d +	nea	d,a +	eqa	a,e +	eqa	e,a +	ona	a,h +	ona	h,a +	offa	a,l +	offa	l,a + +	assume	v:0 + +	adcw	10h +	addncw	20h +	addw	30h +	subw	40h +	sbbw	50h +	subnbw	60h +	anaw	70h +	oraw	80h +	xraw	90h +	gtaw	0a0h +	ltaw	0b0h +	neaw	0c0h +	eqaw	0d0h +	onaw	0e0h +	offaw	0f0h + +	adcx	b +	addncx	d +	addx	h +	subx	d+ +	sbbx	h+ +	subnbx	d- +	anax	h- +	orax	b +	xrax	d +	gtax	h +	ltax	d+ +	neax	h+ +	eqax	d- +	onax	h- +	offax	b + +	dadc	ea,b +	daddnc	ea,d +	dadd	ea,h +	dsub	ea,b +	dsbb	ea,d +	dsubnb	ea,h +	dan	ea,b +	dor	ea,d +	dxr	ea,h +	dgt	ea,b +	dlt	ea,d +	dne	ea,h +	deq	ea,b +	don	ea,d +	doff	ea,h + +	aniw	10h,'A' +	eqiw	20h,'B' +	gtiw	30h,'C' +	ltiw	40h,'D' +	neiw	50h,'E' +	oniw	60h,'F' +	offiw	70h,'G' +	oriw	80h,'H' + +	call	1234h +	jmp	5678h +	lbcd	1234h +	sbcd	5678h +	lded	1234h +	sded	5678h +	lhld	1234h +	shld	5678h +	lspd	1234h +	sspd	5678h + +	calf	0c08h +	calt	150 + +	bit	5,20h +	bit	2,0ffh + +	dcr	a +	inr	b +	mul	c +	div	a +	sll	b +	slr	c +	sllc	a +	slrc	b +	rll	c +	rlr	a + +	dcrw	20h +	inrw	30h +	ldaw	40h +	staw	50h + +	inx	ea +	dcx	ea +	inx	h +	dcx	b + +        dmov    ea,b +        dmov    h,ea +        dmov    ea,ecpt +        dmov    etm0,ea + +	drll	ea +	dsll	ea +	drlr	ea +	dslr	ea + +	eadd	ea,b +	esub	ea,c + +back:	nop +	jr	back +        jre     $-100 +	jr	forw +        jre     $+100 +forw:	nop + +	ldax	b +	ldax	d +	ldax	h +	ldax	d+ +	ldax	h+ +	ldax	d- +	ldax	h- +	ldax	d+20 +	ldax	d-30 +	ldax	h+a +	ldax	h+b +	ldax	h+ea +	ldax	h+40 +	ldax	h-50 +	stax	b +	stax	d +	stax	h +	stax	d+ +	stax	h+ +	stax	d- +	stax	h- +	stax	d+20 +	stax	d-30 +	stax	h+a +	stax	h+b +	stax	h+ea +	stax	h+40 +	stax	h-50 + +	ldeax	h++ +	steax	d++ +	ldeax	h+ea +	steax	h-5 + +	lxi	sp,2000h +	lxi	h,101010101010b +	lxi	ea,1001 + +	mov	a,eal +	mov	h,a +	mov	a,pa +	mov	pa,a +	mov	c,1000h +	mov	1234h,d + +	mvi	d,55h +	mvi	eom,0 + +	mviw	20h,01101001b +	mvix	d,22o + +	push	va +	push	b +	pop	h +	pop	ea + +	sk	z +	skn	hc + +	skit	fsr +	skint	an6 diff --git a/tests/t_78c1x/t_78c1x.doc b/tests/t_78c1x/t_78c1x.doc new file mode 100644 index 0000000..61460db --- /dev/null +++ b/tests/t_78c1x/t_78c1x.doc @@ -0,0 +1,5 @@ ++------------------------ Test Application 78C1x ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the uPD78C1x instruction set            | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_78c1x/t_78c1x.ori b/tests/t_78c1x/t_78c1x.ori Binary files differnew file mode 100644 index 0000000..e1c44ea --- /dev/null +++ b/tests/t_78c1x/t_78c1x.ori diff --git a/tests/t_78k0/asflags b/tests/t_78k0/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_78k0/asflags diff --git a/tests/t_78k0/t_78k0.asm b/tests/t_78k0/t_78k0.asm new file mode 100644 index 0000000..8dd0a33 --- /dev/null +++ b/tests/t_78k0/t_78k0.asm @@ -0,0 +1,291 @@ +        cpu     78070 +        page	0 +        relaxed	on + +        include reg78k0.inc + +saddr	equ	0fe80h +sfr	equ	0ff90h + +        brk +        ret +        retb +        reti +        nop +        ei +        di +        halt +        stop +        adjba +        adjbs + +        mov	d,#20 +        mov	saddr,#30 +        mov	sfr,#40 +        mov	a,c +        mov	e,a +        mov	a,saddr +        mov	saddr,a +        mov	a,sfr +        mov	sfr,a +        mov	a,!saddr +        mov	!saddr,r1 +        mov	psw,#40h +        mov	a,psw +        mov	psw,a +        mov	a,[de] +        mov	[de],a +        mov	a,[hl] +        mov	[hl],a +        mov	a,[hl+10] +        mov	[hl+10],a +        mov	a,[hl+b] +        mov	[hl+b],a +        mov	a,[hl+c] +        mov	[hl+c],a + +        xch	a,d +        xch	l,a +        xch	a,saddr +        xch	a,sfr +        xch	a,!saddr +        xch	a,[de] +        xch	a,[hl] +        xch	a,[hl+10] +        xch	a,[hl+b] +        xch	a,[hl+c] + +        movw	de,#1000 +        movw	saddr,#2000 +        movw	sfr,#3000 +        movw	ax,saddr +        movw	saddr,ax +        movw	ax,sfr +        movw	sfr,ax +        movw	ax,de +        movw	hl,ax +        movw	ax,!saddr +        movw	!saddr,ax + +        xchw	ax,de +        xchw	hl,ax + +        add	a,#10 +        add	saddr,#20 +        add	a,c +        add	h,a +        add	a,saddr +        add	a,!saddr +        add	a,[hl] +        add	a,[hl+10] +        add	a,[hl+b] +        add	a,[hl+c] + +        addc	a,#10 +        addc	saddr,#20 +        addc	a,c +        addc	h,a +        addc	a,saddr +        addc	a,!saddr +        addc	a,[hl] +        addc	a,[hl+10] +        addc	a,[hl+b] +        addc	a,[hl+c] + +        sub	a,#10 +        sub	saddr,#20 +        sub	a,c +        sub	h,a +        sub	a,saddr +        sub	a,!saddr +        sub	a,[hl] +        sub	a,[hl+10] +        sub	a,[hl+b] +        sub	a,[hl+c] + +        subc	a,#10 +        subc	saddr,#20 +        subc	a,c +        subc	h,a +        subc	a,saddr +        subc	a,!saddr +        subc	a,[hl] +        subc	a,[hl+10] +        subc	a,[hl+b] +        subc	a,[hl+c] + +        and	a,#10 +        and	saddr,#20 +        and	a,c +        and	h,a +        and	a,saddr +        and	a,!saddr +        and	a,[hl] +        and	a,[hl+10] +        and	a,[hl+b] +        and	a,[hl+c] + +        or	a,#10 +        or	saddr,#20 +        or	a,c +        or	h,a +        or	a,saddr +        or	a,!saddr +        or	a,[hl] +        or	a,[hl+10] +        or	a,[hl+b] +        or	a,[hl+c] + +        xor	a,#10 +        xor	saddr,#20 +        xor	a,c +        xor	h,a +        xor	a,saddr +        xor	a,!saddr +        xor	a,[hl] +        xor	a,[hl+10] +        xor	a,[hl+b] +        xor	a,[hl+c] + +        cmp	a,#10 +        cmp	saddr,#20 +        cmp	a,c +        cmp	h,a +        cmp	a,saddr +        cmp	a,!saddr +        cmp	a,[hl] +        cmp	a,[hl+10] +        cmp	a,[hl+b] +        cmp	a,[hl+c] + +        addw	ax,#1234h +        subw	rp0,#2345h +        cmpw	ax,#3456h + +        mulu	x +        divuw	c + +        inc	d +        inc	saddr +        dec	e +        dec	saddr + +        incw	hl +        decw	de + +        ror	a,1 +        rol	a,1 +        rorc	a,1 +        rolc	a,1 + +        ror4	[hl] +        rol4	[hl] + +	mov1	cy,saddr.3 +        mov1	cy,sfr.4 +        mov1	cy,a.5 +        mov1	cy,psw.6 +        mov1	cy,[hl].7 +	mov1	saddr.3,cy +        mov1	sfr.4,cy +        mov1	a.5,cy +        mov1	psw.6,cy +        mov1	[hl].7,cy + +	and1	cy,saddr.3 +        and1	cy,sfr.4 +        and1	cy,a.5 +        and1	cy,psw.6 +        and1	cy,[hl].7 + +	or1	cy,saddr.3 +        or1	cy,sfr.4 +        or1	cy,a.5 +        or1	cy,psw.6 +        or1	cy,[hl].7 + +	xor1	cy,saddr.3 +        xor1	cy,sfr.4 +        xor1	cy,a.5 +        xor1	cy,psw.6 +        xor1	cy,[hl].7 + +	set1	saddr.3 +        set1	sfr.4 +        set1	a.5 +        set1	psw.6 +        set1	[hl].7 + +	clr1	saddr.3 +        clr1	sfr.4 +        clr1	a.5 +        clr1	psw.6 +        clr1	[hl].7 + +        set1	cy +        clr1	cy +        not1	cy + +        call	1234h +        callf	 234h +	callt	[12h] + +        push	psw +        push	de +        pop	psw +        pop	hl + +	movw	sp,#1234h +	movw	sp,ax +	movw	ax,sp + +        br	ax +        br	rp0 +        br	1234h +        br	pc +        br	$pc +        br	!pc + +        bc	pc +        bnc	pc +        bz	pc +        bnz	pc + +        bt	saddr.3,pc +        bt	sfr.4,pc +        bt	a.5,pc +        bt	psw.6,pc +        bt	[hl].7,pc + +        bf	saddr.3,pc +        bf	sfr.4,pc +        bf	a.5,pc +        bf	psw.6,pc +        bf	[hl].7,pc + +        btclr	saddr.3,pc +        btclr	sfr.4,pc +        btclr	a.5,pc +        btclr	psw.6,pc +        btclr	[hl].7,pc + +        dbnz	b,pc +        dbnz	c,pc +        dbnz	saddr,pc + +        sel	rb0 +        sel	rb1 +        sel	rb2 +        sel	rb3 + +        db      1,2,3 +        dw      1,2,3 +        dd      1,2,3 +        dd      1.0,2.0,3.0 +        dq      1.0,2.0,3.0 +        dt      1.0,2.0,3.0 +        db      10 dup (?) +        db      0 + +        end + diff --git a/tests/t_78k0/t_78k0.doc b/tests/t_78k0/t_78k0.doc new file mode 100644 index 0000000..3d02b67 --- /dev/null +++ b/tests/t_78k0/t_78k0.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 78K0 ----------------------------+ +|                                                                            | +|       This is a (synthetic) test of the 78K0 instruction set               | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_78k0/t_78k0.ori b/tests/t_78k0/t_78k0.ori Binary files differnew file mode 100644 index 0000000..5b6fc6a --- /dev/null +++ b/tests/t_78k0/t_78k0.ori diff --git a/tests/t_85/asflags b/tests/t_85/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_85/asflags diff --git a/tests/t_85/t_85.asm b/tests/t_85/t_85.asm new file mode 100644 index 0000000..3243692 --- /dev/null +++ b/tests/t_85/t_85.asm @@ -0,0 +1,134 @@ +        cpu     8085 +        page    0 + +        mov     d,h +        mov     m,a +        mov     c,m +        mvi     d,12h +        mvi     m,12h +        lxi     b,1234h +        lxi     d,1234h +        lxi     h,1234h +        stax    b +        stax    d +        stax    h +        ldax    b +        ldax    d +        ldax    d +        ldax    h +        sta     1234h +        lda     1234h +        shld    1234h +        lhld    1234h +        xchg + +        push    b +        push    d +        push    h +        push    psw +        pop     b +        pop     d +        pop     h +        pop     psw +        xthl +        sphl +        lxi     sp,1234h +        inx     sp +        dcx     sp + +        jmp     1234h +        jc      1234h +        jnc     1234h +        jz      1234h +        jnz     1234h +        jp      1234h +        jm      1234h +        jpe     1234h +        jpo     1234h +        pchl + +        call    1234h +        cc      1234h +        cnc     1234h +        cz      1234h +        cnz     1234h +        cp      1234h +        cm      1234h +        cpe     1234h +        cpo     1234h + +        ret +        rc +        rnc +        rz +        rnz +        rp +        rm +        rpe +        rpo + +        rst     2 + +        in      12h +        out     12h + +        inr     d +        dcr     h +        inr     m +        dcr     m +        inx     b +        inx     d +        inx     h +        dcx     b +        dcx     d +        dcx     h + +        add     c +        adc     d +        add     m +        adc     m +        adi     12h +        aci     12h +        dad     b +        dad     d +        dad     h +        dad     sp + +        sub     c +        sbb     d +        sub     m +        sbb     m +        sui     12h +        sbi     12h + +        ana     c +        xra     c +        ora     c +        cmp     c +        ana     m +        xra     m +        ora     m +        cmp     m +        ani     12h +        xri     12h +        ori     12h +        cpi     12h + +        rlc +        rrc +        ral +        rar + +        cma +        stc +        cmc +        daa + +        ei +        di +        nop +        hlt + +        rim +        sim + diff --git a/tests/t_85/t_85.doc b/tests/t_85/t_85.doc new file mode 100644 index 0000000..244e635 --- /dev/null +++ b/tests/t_85/t_85.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application 85 -----------------------------+ +|                                                                            | +|         This is a (synthetic) test of the 8080/8085 instruction set        | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_85/t_85.ori b/tests/t_85/t_85.ori Binary files differnew file mode 100644 index 0000000..0bbef41 --- /dev/null +++ b/tests/t_85/t_85.ori diff --git a/tests/t_87c800/asflags b/tests/t_87c800/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_87c800/asflags diff --git a/tests/t_87c800/t_87c800.asm b/tests/t_87c800/t_87c800.asm new file mode 100644 index 0000000..c8e1276 --- /dev/null +++ b/tests/t_87c800/t_87c800.asm @@ -0,0 +1,310 @@ +	cpu	87c70 +	include	stddef87.inc +	page	0 + +	ei +	di +	swi +	nop +	ret +	reti +	retn + +targ:	jrs	t,targ +	jrs	f,targ + +	jr	t,targ +	jr	f,targ +	jr	eq,targ +	jr	z,targ +	jr	ne,targ +	jr	nz,targ +	jr	cs,targ +	jr	lt,targ +	jr	cc,targ +	jr	ge,targ +	jr	le,targ +	jr	gt,targ +	jr	targ + +	daa	a +	daa	b +	das	a +	das	c +	shlc	a +	shlc	d +	shrc	a +	shrc	e +	rolc	a +	rolc	h +	rorc	a +	rorc	l +	swap	a +	swap	b + +	add	a,c +	addc	l,a +	sub	wa,de +	subb	a,(12h) +	and	a,(hl) +	or	a,(de) +	xor	a,(hl+) +	cmp	a,(-hl) +	add	a,(hl+10) +	addc	a,(hl-125) +	sub	a,(hl+c) +	subb	a,(c+hl) +	and	a,(pc+a) +	or	a,(a+pc) +	cmp	(12h),(hl) +	add	(de),(hl) +	addc	(hl+5),(hl) +	sub	(hl+c),(hl) +	subb	(pc+a),(hl) +	and	a,55h +	or	c,55h +	xor	hl,5678h +	cmp     (12h),55h +	add	(hl),55h +	addc	(hl+),55h +	sub	(-hl),55h +	subb	(hl-32),55h +	and	(hl+c),55h +	or	(pc+a),55h + +	mcmp	(12h),55h +	mcmp	(de),55h +	mcmp	(hl+),55h +	mcmp	(-hl),55h +	mcmp	(hl+3),55h +	mcmp	(c+hl),55h +	mcmp	(pc+a),55h + +	inc	c +	inc	bc +	inc	(12h) +	inc	(hl) +	inc	(de) +	inc	(hl+) +	inc	(-hl) +	inc	(hl+4) +	inc	(hl+c) +	inc	(a+pc) +	dec	e +	dec	hl +	dec	(12h) +	dec	(hl) +	dec	(de) +	dec	(hl+) +	dec	(-hl) +	dec	(hl-7) +	dec	(hl+c) +	dec	(pc+a) + +	mul	w,a +	mul	c,b +	mul	d,e +	mul	l,h + +	div	wa,c +	div	de,c +	div	hl,c + +	rold	a,(12h) +	rold	a,(hl) +	rold	a,(hl+) +	rold	a,(-hl) +	rold	a,(hl+16) +	rold	a,(c+hl) +	rord	a,(12h) +	rord	a,(hl) +	rord	a,(hl+) +	rord	a,(-hl) +	rord	a,(hl-16) +	rord	a,(hl+c) + +	xch	a,d +	xch	d,w +	xch	hl,de +	xch	bc,wa +	xch	b,(12h) +	xch	(12h),c +	xch	d,(hl) +	xch	(de),e +	xch	l,(hl+) +	xch	(hl+),h +	xch	a,(-hl) +	xch	(-hl),w +	xch	b,(hl+5) +	xch	(hl-3),c +	xch	d,(hl+c) +	xch	(c+hl),e +	xch	h,(pc+a) +	xch	(a+pc),l + +	clr	b +	clr	de +	clr	(12h) +	clr	(hl) +	clr	(de) +	clr	(hl+) +	clr	(-hl) +	clr	(hl+5) + +	ldw	hl,1234h +	ldw	(12h),1234h +	ldw	(hl),1234h + +	ld	a,l +	ld	d,a +	ld	w,h +	ld	a,(12h) +	ld	c,(12h) +	ld	a,(hl) +	ld	d,(hl) +	ld	c,(de) +	ld	b,(-hl) +	ld	h,(hl+) +	ld	c,(hl-122) +	ld	w,(hl+c) +	ld      d,(a+pc) +	ld	h,20 + +	ld	hl,bc +	ld	de,(12h) +	ld	bc,(de) +	ld	wa,(hl+1) +	ld	hl,(hl+c) +	ld	de,(pc+a) +	ld	bc,1234 + +	ld	(12h),a +	ld	(12h),c +	ld	(12h),de +	ld	(12h),(23h) +	ld	(12h),(de) +	ld	(12h),(hl-42) +	ld	(12h),(hl+c) +	ld	(12h),(pc+a) +	ld	(12h),23h + +	ld	(hl),a +	ld	(de),d +	ld	(hl+),c +	ld	(-hl),e +	ld      (hl+4),h +	ld	(hl),de +	ld	(hl+5),bc +	ld	(hl),(12h) +	ld	(hl),(de) +	ld	(hl),(hl+1) +	ld	(hl),(hl+c) +	ld	(hl),(pc+a) +	ld	(hl),23h +	ld	(de),23h +	ld	(hl+),23h +	ld	(-hl),23h +	ld	(hl-77),23h + +	ld	sp,1234h +	ld	sp,de +	ld	hl,sp +	ld	rbs,7 + +	jp	2000h +	call	1234h +	call	0ff54h +	jp	hl +	call	de +	jp	(hl) +	jp	(de) +	jp	(12h) +	call	(12h) +	jp	(hl+5) +	call	(hl-100) +	jp	(hl+c) +	call	(a+pc) +	jp	(c+hl) +	call	(pc+a) + +	callv	3 + +	callp	76h +	callp	0ff12h + +	push	psw +	push	de +	pop	wa +	pop	psw + +	ld	cf,a.5 +	ld	cf,(12h).4 +	ld	cf,(hl).3 +	ld	cf,(hl+).2 +	ld	cf,(-hl).1 +	ld	cf,(hl+3).0 +	ld	cf,(hl+c).7 +	ld	cf,(pc+a).3 +	ld	cf,(de).c + +	ld	a.5,cf +	ld	(12h).4,cf +	ld	(hl).3,cf +	ld	(hl+).2,cf +	ld	(-hl).1,cf +	ld	(hl+3).0,cf +	ld	(hl+c).7,cf +	ld	(pc+a).3,cf +	ld	(de).c,cf + +	xor	cf,d.3 +	xor	cf,(12h).4 +	xor	cf,(de).5 +	xor	cf,(hl+).6 +	xor	cf,(-hl).7 +	xor	cf,(hl+3).0 +	xor	cf,(hl+c).1 +	xor	cf,(pc+a).2 + +	clr	cf +	clr	d.3 +	clr	(12h).4 +	clr	(de).5 +	clr	(hl+).6 +	clr	(-hl).7 +	clr	(hl+3).0 +	clr	(hl+c).1 +	clr	(pc+a).2 +	clr	(de).c + +	set	cf +	set	d.3 +	set	(12h).4 +	set	(de).5 +	set	(hl+).6 +	set	(-hl).7 +	set	(hl+3).0 +	set	(hl+c).1 +	set	(pc+a).2 +	set	(de).c + +	cpl	cf +	cpl	d.3 +	cpl	(12h).4 +	cpl	(de).5 +	cpl	(hl+).6 +	cpl	(-hl).7 +	cpl	(hl+3).0 +	cpl	(hl+c).1 +	cpl	(pc+a).2 +	cpl	(de).c + +	test	d.3 +	test	(12h).4 +	test	(de).5 +	test	(hl+).6 +	test	(-hl).7 +	test	(hl+3).0 +	test	(hl+c).1 +	test	(pc+a).2 +	test	(de).c
\ No newline at end of file diff --git a/tests/t_87c800/t_87c800.doc b/tests/t_87c800/t_87c800.doc new file mode 100644 index 0000000..3a5a505 --- /dev/null +++ b/tests/t_87c800/t_87c800.doc @@ -0,0 +1,5 @@ ++------------------------ Test Application 87C800 ---------------------------+ +|                                                                            | +|      This is a (synthetic) test of the TLCS-870 instruction set            | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_87c800/t_87c800.ori b/tests/t_87c800/t_87c800.ori Binary files differnew file mode 100644 index 0000000..662b119 --- /dev/null +++ b/tests/t_87c800/t_87c800.ori diff --git a/tests/t_8x30x/asflags b/tests/t_8x30x/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_8x30x/asflags diff --git a/tests/t_8x30x/t_8x30x.asm b/tests/t_8x30x/t_8x30x.asm new file mode 100644 index 0000000..9062243 --- /dev/null +++ b/tests/t_8x30x/t_8x30x.asm @@ -0,0 +1,57 @@ +        cpu     8x305 + +leftobj liv     $12,3,4 +left2obj liv	$12,5,6 +rightobj riv    $34,5,6 +right2obj riv	$34,3,4 + +	move	r3,ivl		; Register-->Register: ohne Rotation +        add	r11(3),r5	;                      mit Rotation +        and	liv1,r1		; I/O     -->Register: direkt, ohne L„nge +        xor	riv3,6,r4	;                      direkt, mit L„nge +        move	leftobj,r5	;                      symbolisch, ohne L„nge +	add	leftobj,4,r5	;                      symbolisch, mit L„nge (redundant) +        and	r2,liv6		; Register-->I/O       direkt, ohne L„nge +        xor	r3,3,riv4	;                      direkt, mit L„nge +        move	r11,rightobj	;                      symbolisch, ohne L„nge +        add	r11,6,rightobj	;                      symbolisch, mit L„nge (redundant) +	and	liv2,riv4	; Register-->Register: direkt-->direkt, ohne L„nge +        xor	liv2,5,riv4	;                      direkt-->direkt, mit L„nge +	move	riv1,leftobj	;                      direkt-->symbolisch, ohne L„nge +	add	riv1,4,leftobj	;                      direkt-->symbolisch, mit L„nge(redundant) +        and	rightobj,liv5	;                      symbolisch-->direkt, ohne L„nge +        xor	rightobj,6,liv5	;                      symbolisch-->direkt, mit L„nge(redundant) +	move	leftobj,right2obj ;                    symbolisch-->symbolisch, ohne L„ange +        add	leftobj,4,right2obj ;                  symbolisch-->symbolisch, mit L„nge(redundant) + +        xec	$55(r5) +        xec	$12(liv3) +        xec	$12(liv3),6 +        xec	$12(leftobj) +        xec	$12(leftobj),4 + +        nzt	r5,* +        nzt	liv3,* +        nzt	liv3,6,* +        nzt	leftobj,* +        nzt	leftobj,4,* + +        xmit	$34,r5 +        xmit	$12,liv3 +        xmit	$12,liv3,6 +        xmit	$12,leftobj +        xmit	$12,leftobj,4 + +        sel	leftobj +        sel	rightobj + +        nop + +        halt + +        xml     2 +        xmr     $0f + +temp1   riv     @200,7,8 +        sel     temp1 + diff --git a/tests/t_8x30x/t_8x30x.doc b/tests/t_8x30x/t_8x30x.doc new file mode 100644 index 0000000..06e7536 --- /dev/null +++ b/tests/t_8x30x/t_8x30x.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 8X30x ---------------------------+ +|                                                                            | +|        This is a (synthetic) test of the 8X30x instruction set             | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_8x30x/t_8x30x.ori b/tests/t_8x30x/t_8x30x.ori Binary files differnew file mode 100644 index 0000000..0370a9e --- /dev/null +++ b/tests/t_8x30x/t_8x30x.ori diff --git a/tests/t_96/asflags b/tests/t_96/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_96/asflags diff --git a/tests/t_96/t_96.asm b/tests/t_96/t_96.asm new file mode 100644 index 0000000..a98eef5 --- /dev/null +++ b/tests/t_96/t_96.asm @@ -0,0 +1,217 @@ +		cpu	80196 + +                include reg96 + +ax		equ	20h +al		equ	ax +ah		equ	ax+1 +eax		equ	ax +bx		equ	24h +bl		equ	bx +bh		equ	bx+1 +ebx		equ	bx +cx		equ	28h +cl		equ	cx +ch		equ	cx+1 +ecx		equ	cx +dx		equ	2ch +dl		equ	dx +dh		equ	dx+1 +edx		equ	dx + +		CLRC +		CLRVT +		DI +		EI +		NOP +		POPF +		PUSHF +		RET +		RSC +		SETC +		TRAP +                PUSHA +                POPA +                EPTS +                DPTS + +targ: +		JC 	targ +		JE	targ +		JGE	targ +		JGT	targ +		JH	targ +		JLE	targ +		JLT	targ +		JNC	targ +		JNE	targ +		JNH	targ +		JNST	targ +		JNV	targ +		JNVT	targ +		JST	targ +		JV	targ +		JVT	targ + +                bmov	eax,cx +                bmovi	eax,cx + +		add	ax,bx +		add	ax,2000h +		add	ax,[bx] +		add	ax,[bx]+ +		add	ax,2[bx] +		add	ax,-15[bx] +		add	ax,700[bx] +		add	ax,-300[bx] +		add	ax,#1234h + +		add	ax,cx,bx +		add	ax,cx,2000h +		add	ax,cx,[bx] +		add	ax,cx,[bx]+ +		add	ax,cx,2[bx] +		add	ax,cx,-15[bx] +		add	ax,cx,700[bx] +		add	ax,cx,-300[bx] +		add	ax,cx,#1234h + +		addb	al,bl +		addb	al,2000h +		addb	al,[bx] +		addb	al,[bx]+ +		addb	al,2[bx] +		addb	al,-15[bx] +		addb	al,700[bx] +		addb	al,-300[bx] +		addb	al,#12h + +		addb	al,cl,bl +		addb	al,cl,2000h +		addb	al,cl,[bx] +		addb	al,cl,[bx]+ +		addb	al,cl,2[bx] +		addb	al,cl,-15[bx] +		addb	al,cl,700[bx] +		addb	al,cl,-300[bx] +		addb	al,cl,#12h + +		and	dx,300h +		mulu	eax,bx,cx +		mulb	ax,cl,ch +		subb	cl,#5 + +		addc	ax,bx +		addcb	al,[bx] +		cmp	ax,[bx]+ +		cmpb	al,2[bx] +                cmpl	ecx,edx +		div	eax,-15[bx] +		divb	ax,200[bx] +		divu	eax,-300[bx] +		divub	ax,200 +		ld	ax,#2345h +		ldb	al,#16 +		st	ax,bx +		stb	al,[bx] +		subc	ax,[bx]+ +		subcb	al,2[bx] +		xor	ax,-15[bx] +		xorb	al,200[bx] + +		push	ax +		push	[bx] +		push	#1234h +		pop	2000h +		pop	10[cx] + +                xch	ax,bx +                xch	ax,[bx] +                xch	ax,10[bx] +                xch	ax,-150[bx] +                xch	ax,[bx]+ +                xch	ax,2000h +                xchb	bl,al +                xchb	[bx],al +                xchb	10[bx],al +                xchb	-150[bx],al +                xchb	[bx]+,al +                xchb	2000h,al + +		clr	ax +		clrb	al +		dec	bx +		decb	bh +		ext	eax +		extb	ax +		inc	cx +		incb	cl +		neg	dx +		negb	dh +		not	ax +		notb	al + +		scall	targ +		lcall	targ +		call	targ + +		sjmp	targ +		ljmp	targ +		br	targ +		br	[dx] + +		djnz	cl,$ +                djnzw	cx,$ + +		jbc	dh,3,$ +		jbs	al,1,$ + +                tijmp	bx,ax,#127 + +		ldbse	ax,#-1 +		ldbze	cx,[bx]+ + +		norml	eax,cl + +		shl	ax,#5 +		shl	ax,cl +		shlb	al,#6 +		shlb	al,cl +		shll	eax,#7 +		shll	eax,cl +		shr	ax,#5 +		shr	ax,cl +		shrb	al,#6 +		shrb	al,cl +		shrl	eax,#7 +		shrl	eax,cl +		shra	ax,#5 +		shra	ax,cl +		shrab	al,#6 +		shrab	al,cl +		shral	eax,#7 +		shral	eax,cl + +		skip	dl + +                idlpd	#2 + + +                ldb	al,100h		; lang +                ldb	al,0c0h		; kurz +                ldb	al,000h		; kurz +                ldb	al,140h		; lang +                ldb     al,[0c0h] +                ldb     al,[000h] + +                assume	wsr:24h		; =100h..13fh auf 0c0h..0ffh + +                ldb	al,100h		; jetzt kurz +                ldb	al,0c0h		; jetzt lang +                ldb	al,000h		; immmer noch kurz +                ldb	al,140h		; immer noch lang +                ldb     al,[100h] +                ldb     al,[000h] + +                bne     2000h +                bc      2000h diff --git a/tests/t_96/t_96.doc b/tests/t_96/t_96.doc new file mode 100644 index 0000000..6e89bc7 --- /dev/null +++ b/tests/t_96/t_96.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application 96 -----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the MCS-96 instruction set              | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_96/t_96.ori b/tests/t_96/t_96.ori Binary files differnew file mode 100644 index 0000000..d8d17cd --- /dev/null +++ b/tests/t_96/t_96.ori diff --git a/tests/t_960/asflags b/tests/t_960/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_960/asflags diff --git a/tests/t_960/t_960.asm b/tests/t_960/t_960.asm new file mode 100644 index 0000000..df58c12 --- /dev/null +++ b/tests/t_960/t_960.asm @@ -0,0 +1,101 @@ +	cpu	80960 +	org	0 + +	fpu	on +	supmode on + +start: +	flushreg +	fmark +	mark +	ret +	syncf +	faultno +	faultg +	faulte +	faultge +	faultl +	faultne +	faultle +	faulto + +	addc	r3,r4,r5	; lokale Register +	addc	g3,g4,g5	; globale Register +	addc	g3,g5		; impl. src2=dest +	addc	10,r4,g10	; src1 immediate +	addc	g2,20,g4	; src2 immediate + +	addr	r3,r4,r5	; Float: normale Register +	addr	fp2,r4,r5	; Float-Register +	addr	r3,fp1,r5 +	addr	r3,r4,fp3 +	addr	0,r4,r5		; Float-Konstanten +	addr	r3,1,r5 + +	addc	sp,fp,rip	; Sonderregister + +	addi	r3,r4,r5	; nur noch mal zum Testen der Opcodes...  +	addo	r3,r4,r5	 + +	calls	g2		; nur ein Operand: +	calls	4 + +	chkbit	7,r5		; kein Ziel + +	classr	fp1		; ein Float-Operand +	classrl	g4 + +	cosr	fp1		; dito mit Ziel +	cosr	g4,fp2 + +	modpc	r3,r4,r5	; nur im Supervisor-Mode erlaubt + +	bbc	r4,g5,$+32	; COBR-Anweisungen +	bbs	10,r10,$+32 +	cmpobge 10,r4,$+32 +	testne	r5 + +	b	$-32		; CTRL-Anweisungen +	call	$+32 +	bal	$+64 +	ble	$-64 + +	bx	(r5)		; MEMA ohne disp +	bx	2345(r5)	; MEMA mit disp +        bx	2345		; MEMA ohne base +	bx	-30(r5)		; MEMB base+disp +	bx	5000(r5)	; dito positiv +	bx	$(ip)		; PC-relativ +	bx	[r4]		; nur Index +	bx	[r4*1]		; Scaling +	bx      [r4*2] +        bx      [r4*4] +        bx      [r4*8] +	bx	[r4*16] +	bx	0(r5)[r4]	; base+index +	bx	12345678h	; nur disp +	bx	450[r6*4]	; disp+index +	bx	123(r5)[r6*4]	; volles Programm + +	st	r7,123(r5)[r6*4]; mit 2 Ops +	ld	123(r5)[r6*4],r7 + +	db	1 +	align	4 +	db	1,2 +	align	4 +	db	1,2,3 +	align	4 +	db	1,2,3,4 +	dw	1 +	align	4 +	dw	1,2 +	dd	1 +	dd	1.0 +	dq	1.0 +	dt	1.0 +	dw	0 + +	space	32 + +	word	1,2,3,4,5 diff --git a/tests/t_960/t_960.doc b/tests/t_960/t_960.doc new file mode 100644 index 0000000..177a972 --- /dev/null +++ b/tests/t_960/t_960.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 960 -----------------------------+ +|                                                                            | +|      This is a (very incomplete) test of the i960 instruction set          | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_960/t_960.ori b/tests/t_960/t_960.ori Binary files differnew file mode 100644 index 0000000..26b7924 --- /dev/null +++ b/tests/t_960/t_960.ori diff --git a/tests/t_97c241/asflags b/tests/t_97c241/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_97c241/asflags diff --git a/tests/t_97c241/t_97c241.asm b/tests/t_97c241/t_97c241.asm new file mode 100644 index 0000000..3c117fb --- /dev/null +++ b/tests/t_97c241/t_97c241.asm @@ -0,0 +1,336 @@ +		page	0 + +		cpu	97c241 + +		unlk +		szf +		svf +		ssf +		scf +		rzf +		rvf +		rsf +		rets +		reti +		ret +		rcf +		nop +		halt +		ei +		di +		czf +		cvf +		csf +		ccf + +Targ:		jr	Targ +		calr	Targ +		jr	$+1002h + +		jrc	z,Targ +		jrc	ult,Targ +		jrc	ge,Targ + +		jrbc	5,1234h,$+108h +		jrbs	1,345h,Targ + +		djnz	rw5,Targ +		djnz.d	(123456h),$+100ah +		djnzc	rw6,nov,Targ +		djnzc.d	(rd2+123456h),eq,$+100ah + +		link	20h +		link	3334h +		retd	-122 +		retd	-1234 + +		swi	7 + +		cpl	rb2 +		cpl	rw12 +		cpl	rd14 + +		cpl.b	rb5 +		cpl.w	rw15 +		cpl.d	rd4 + +		cpl.b	(123h) +		cpl.w	(123h) +		cpl.d	(123h) + +		cpl.b	(123456h) +		cpl.w	(123456h) +		cpl.d	(123456h) + +		cpl.b	(rw2) +		cpl.w	(rw5) +		cpl.d	(rw0) + +		cpl.b	(rd10) +		cpl.w	(rd6 ) +		cpl.d	(rd12) + +		cpl.b	(rw4++) +		cpl.w	(rw6++) +		cpl.d	(rw9++) + +		cpl.b	(--rw8) +		cpl.w	(--rw7) +		cpl.d	(--rw5) + +		cpl.b	(rd2++) +		cpl.w	(rd10++) +		cpl.d	(rd14++) + +		cpl.b	(--rd4) +		cpl.w	(--rd8) +		cpl.d	(--rd12) + +		cpl.b	(rw3+123h) +		cpl.w	(rw7+123h) +		cpl.d	(rw1+123h) + +		cpl.b	(rd2-123h) +		cpl.w	(rd8-123h) +		cpl.d	(rd4-123h) + +		cpl.b	(rw4 +123456h) +		cpl.w	(rw7 +123456h) +		cpl.d	(rw14+123456h) + +		cpl.b	(rd6 -123456h) +		cpl.w	(rd12-123456h) +		cpl.d	(rd10-123456h) + +		cpl.b	(rw0+12h) +		cpl.w	(rw0+12h) +		cpl.d	(rw0+12h) + +		cpl.b	(rd0-12h) +		cpl.w	(rd0-12h) +		cpl.d	(rd0-12h) + +		cpl.b	(rw0+12345h) +		cpl.w	(rw0+12345h) +		cpl.d	(rw0+12345h) + +		cpl.b	(rd0-12345h) +		cpl.w	(rd0-12345h) +		cpl.d	(rd0-12345h) + +		cpl.b	(sp+12h) +		cpl.w	(sp+12h) +		cpl.d	(sp+12h) + +		cpl.b	(sp+89h) +		cpl.w	(sp+89h) +		cpl.d	(sp+89h) + +		cpl.b	(sp+12345h) +		cpl.w	(sp+12345h) +		cpl.d	(sp+12345h) + +		cpl.b	(pc-89h) +		cpl.w	(pc-89h) +		cpl.d	(pc-89h) + +		cpl.b	(pc-12345h) +		cpl.w	(pc-12345h) +		cpl.d	(pc-12345h) + +		cpl.b	(rw2 *4) +		cpl.w	(rw5 *4) +		cpl.d	(rw10*4) + +		cpl.b	(13h+rd10*8) +		cpl.w	(rd14*8+12h) +		cpl.d	(rd4 *8+12h) + +		cpl.b	(rw7*2-12345h) +		cpl.w	(rw9*2-12345h) +		cpl.d	(rw1*2-12345h) + +		cpl.b	(rd10*2+12345h) +		cpl.w	(rd4 *2+12345h) +		cpl.d	(rd6 *2+12345h) + +		cpl.b	(rw4  + rw6  *8 + 12h) +		cpl.w	(rw5  + rd8  *4 + 12h) +		cpl.d	(rd4  + rw9  *2 + 12h) +		cpl.b	(rd10 + rd14 *1 + 12h) +		cpl.w	(sp   + rw5  *2 + 12h) +		cpl.d	(sp   + rd2  *4 + 12h) +		cpl.b   (pc   + rw11 *8 + 12h) +		cpl.w   (pc   + rd4  *4 + 12h) + +		cpl	sp +		cpl	isp +		cpl	esp +		cpl	pbp +		cpl	cbp +		cpl	psw +		cpl	imc +		cpl	cc + +		call	targ +		call	(rw2) +		call.w	123456h +		clr	rb5 +		clr.w	(rw3-4) +		clr.d	(--rd2) +		exts	rw1 +		exts.d  (sp+20) +		extz.w	(pc-7) +		extz.d	rd12 +		jp	Targ +		jp.w	(rd4++) +		jp.d	(--rw5) +		mirr	rb1 +		mirr.w	(Targ) +		mirr.d	(sp+1234h) +		neg.d	rd8 +		pop.b	(rd10++) +		push.d	12345678h +		pusha	Targ +		rvby.w	(sp+rw4*4+0aah) +		tjp.d	(rd6) +		tst.w	rw13 + +		lda	rd6,(rd4+12345h) + +		add3	rw4,(rd4),(rw2) +		sub3	rw4,(rd4),1000 +		add3	rw4,(rd4),100 +		sub3	rd2,rd10,(123456h) +		add3	rd8,(rw2*4+12345h),10 +		sub3	rb5,rb3,rb15 + +		mac	rw4,rb3,rb1 +		macs	rd14,(rw4-2),(rd2+4) + +		cpsz	(rd6++),rb2,rw15 +		cpsn.w	(--rd4),(--rd10),rw14 +		lds.d	(rd8++),10,rw13 +		lds.w	(--rd10),1000,rw12 + +		rrm.b	rb5,rw3,4 +		rlm.d   (123456h),rw4,(123456h) + +		bfex	rw7,rd10,2,12 +		bfexs.b	rw9,(rd4),4,6 +		bfin.w	(sp+5),rw3,10,3 +		bfex	rw10,rd12,20,5 +		bfexs.d	rw12,(rd4),30,2 + +		abcd	rb5,(rw2*4) +		abcd	rw4,(1234h) +		abcd	(1234h),rd4 +		adc.w	(rd4+2),(rd2*8+5) +		adc.b	(Targ),4 +		cbcd.b	(Targ),99h +		cpc	rb5,(rw4+rw4) +		cpc	rb5,(2) +		max	rb5,rb2 +		maxs	rw5,(Targ) +		min.d	(Targ),(rw2) +		mins.d	(rd4+3),(rd6-3) +		sbc.w	(rd4),(rd2) +		sbc.d	(Targ),1 +		sbcd	rw4,(Targ) +		sbcd	(rd2),rd0 + +		andcf	rw10,15 +		andcf.b	(rd2),(rw4) +		andcf.d	(rw10),(Targ) +		andcf.w	(Targ),1 +		ldcf	rw10,15 +		ldcf.b	(rd2),(rw4) +		ldcf.d	(rw10),(Targ) +		ldcf.w	(Targ),1 +		orcf	rw10,15 +		orcf.b	(rd2),(rw4) +		orcf.d	(rw10),(Targ) +		orcf.w	(Targ),1 +		stcf	rw10,15 +		stcf.b	(rd2),(rw4) +		stcf.d	(rw10),(Targ) +		stcf.w	(Targ),1 +		tset	rw10,15 +		tset.b	(rd2),(rw4) +		tset.d	(rw10),(Targ) +		tset.w	(Targ),1 +		xorcf	rw10,15 +		xorcf.b	(rd2),(rw4) +		xorcf.d	(rw10),(Targ) +		xorcf.w	(Targ),1 + +		bs0b	rb10,rd12 +		bs0f	(Targ),rw3 +		bs1b.w	rb10,(Targ) +		bs1f.b	(Targ),(rw10+2) + +		chk.d:g	(Targ),rd8 +		chk.d	(Targ),rd8 +		chks.w	(rd6),(rd4) +		chks.w	(rw2),(Targ) + +		mul	rd2,rw1 +		muls.w	(rw2),(Targ) +		div.d	(Targ),(rw2) +		divs	rw4,rb8 + +		add	rw11,2 +		add	(rw4),rd8 +		add.w	(rd4+2),(rd6+rd8*4+100) +		add.b	rb2,150 +		add.w	rw2,150 +		add.d	rd2,150 +		add.d	(Targ),2 +		add.w:a	rw14,(Targ)   ; !!! automatische Wahl sonst S + +		ld	rd10,2000 +		cp	rd8,(Targ) +		sub.w	(rd4++),(rd6++) + +		and	rw4,rw3 +		and.d	rd10,rd12 +		or	rd10,(rd8) +		or.w	(Targ),(rd4+rw2*4-5) +		xor.d	(Targ),12345678h +		xor	rd2,1000h +		or	rb2,rb7 +		and.w	(Targ),rw4 +		xor.d	(rw2),(Targ) + +		bres	rb4,1 +		bset	rw7,5 +		bchg	rw12,10 +		btst	rd4,8 +		bres	rd12,20 +		bset.w	(rd4),10 +		bchg.d	(rw2),15 +		btst.b	(Targ),rb1 +		bres	rb1,(Targ) + +		ex	rb1,rb7 +		ex	rw5,(rd4) +		ex.d	(Targ),(rw1) +		ex.b	(rw1),(Targ) + +		rl	rw4,1 +		rlc.w	(rd6*2),1 +		rr	rd0,5 +		rrc	rw1,(rd4) +		sla	rw7,(Targ) +		sll.d	(Targ),3 +		sra.w	(rd4),(rw4) +		srl.b	(rw4),(rd4) + +		add.w	(rw4+0eah),rw7 +		add.w	(sp+rw4*4+1234h),(sp+28h) +		add.w:g	(rw4+12345h),(10028h) +		add.w	(rw4+12345h),(10028h) +		add.w:g	(rw4+56h),3579h +		add.w	(rw4+56h),3579h +		jrc	nz,$-1234h + diff --git a/tests/t_97c241/t_97c241.doc b/tests/t_97c241/t_97c241.doc new file mode 100644 index 0000000..08358f7 --- /dev/null +++ b/tests/t_97c241/t_97c241.doc @@ -0,0 +1,5 @@ ++------------------------ Test Application 97C241 ---------------------------+ +|                                                                            | +|      This is a (synthetic) test of the TLCS-9000 instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_97c241/t_97c241.ori b/tests/t_97c241/t_97c241.ori Binary files differnew file mode 100644 index 0000000..6b72195 --- /dev/null +++ b/tests/t_97c241/t_97c241.ori diff --git a/tests/t_9900/asflags b/tests/t_9900/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_9900/asflags diff --git a/tests/t_9900/t_9900.asm b/tests/t_9900/t_9900.asm new file mode 100644 index 0000000..1c15261 --- /dev/null +++ b/tests/t_9900/t_9900.asm @@ -0,0 +1,222 @@ +        cpu     tms9900 +        page    0 +	supmode on + +        a       r5,r3 + +        a       wr5,wr3 +        ab      wr6,*wr10 +        c       wr7,*wr2+ +        cb      wr8,@1234h +        s       wr9,@1234h(wr6) + +        sb      *wr10,wr9 +        soc     *wr11,*wr6 +        socb    *wr12,*wr1+ +        szc     *wr13,@1234h +        szcb    *wr14,@1234h(wr14) + +        mov     *wr15+,wr10 +        movb    *wr0+,*wr6 +        a       *wr1+,*wr6+ +        ab      *wr2+,@1234h +        c       *wr3+,@1234h(wr7) + +        cb      *wr4+,wr5 +        s       *wr5+,*wr13 +        sb      *wr6+,*wr13+ +        soc     *wr7+,@1234h +        socb    *wr8+,@1234h(wr12) + +        szc     @1234h,wr10 +        szcb    @1234h,*wr2 +        mov     @1234h,*wr3+ +        movb    @1234h,@2345h +        a       @1234h,@2345h(wr8) + +        ab      @1234h(wr9),wr5 +        c       @1234h(wr10),*wr1 +        cb      @1234h(wr11),*wr14+ +        s       @1234h(wr12),@2345h +        sb      @1234h(wr13),@2345h(wr5) + + +        coc	wr12,wr5 +        czc	*wr4,wr10 +        xor	*wr12+,wr7 +        mpy	@1234h,wr4 +        div	@200(wr4),wr6 +        xop	@2345h,wr5 + +        mpys	wr5 +        divs	*wr9+ + +        b	@1234h +        bl	*wr5 +        blwp	*wr7+ +        clr	wr4 +        seto	@1234h(wr8) +        inv	wr7 +        neg	*wr15 +        abs	wr3 +        swpb	wr9 +        inc	*wr12+ +        inct	*wr12+ +        dec	*wr12+ +        dect	*wr12+ +        x	*wr6 + +        ldcr	wr5,10 +        stcr	wr6,16 + +        sbo	10 +        sbz	-33 +        tb	34h + +        jeq	lab +        jgt	lab +        jh	lab +        jhe	lab +        jl	lab +        jle	lab +lab:	jlt	lab +	jmp	lab +        jnc	lab +        jne	lab +        jno	lab +        joc	lab +        jop	lab + +        sla	wr1,1 +        sra	wr5,wr0 +        src	wr6,10 +        srl	wr10,15 + +        ai	wr5,1234h +        andi	wr10,2345h +        ci	wr15,3456h +        li	wr5,4567h +        ori	wr10,5678h + +        lwpi	1234h +        limi	2345h + +        stst	wr2 +        lst	wr4 +        stwp	wr6 +        lwp	wr8 + +        rtwp +        idle +        rset +        ckof +        ckon +        lrex + +        padding on + +        byte    1,2,3,4,5 +        byte    "Hello World" +        byte    1,2,3,4,5,6 +        byte    "Hello World!" +        word    1,2,3,4,5 + +        padding off + +        byte    1,2,3,4,5 +        byte    "Hello World" +        byte    1,2,3,4,5,6 +        byte    "Hello World!" +        word    1,2,3,4,5 + + +table	equ	1234h +oldval	equ	2345h +newval	equ	3456h +new	equ	4567h +loc	equ	5678h +count	equ	6789h +list	equ	789ah +tran	equ	89abh +testbits equ	9abch +testbit equ	0abcdh +ones	equ	0bcdeh +temp	equ	0cdefh +change	equ	0def0h +bits	equ	0ef01h +testva	equ	0f012h +prt	equ	r3 + +        a	r5,@table +        ab	3,*2+ +	ai	6,0ch +        s	@oldval,@newval +	sb	*6+,1 +        mpy	@new,5 +        div	@loc,2 +        inc	@count +        inct	5 +        dec	@count +        dect	prt +	abs	@list(7) +        neg	5 +        b	*3 +        bl	@tran +        blwp	@tran +        rtwp +        jmp	$ +        jh	$ +        jl	$ +        jhe	$ +        jle	$ +        jgt	$ +        jlt	$ +        jeq	$ +        jne	$ +        joc	$ +        jnc	$ +        jno	$ +        jop	$ +        x       @tran +        c	r5,@table +        cb	3,*2+ +	ci	9,0f330h +	coc	@testbits,8 +        czc	@testbit,8 +        rset +        idle +        ckof +        ckon +        lrex +        sbo	20 +        sbz	30 +        tb	40 +        ldcr	@1234h,7 +        stcr	@1234h,7 +        li	7,5 +        limi	3 +        lwpi	12h +        lmf	r5,0 +        mov	7,7 +        mov	@ones,9 +        movb	@temp,3 +        swpb	*0+ +        stst	7 +        stwp	r5 +        andi	0,6d03h +        ori	5,60d3h +        xor	@change,2 +        inv	11 +        clr	*0bh +        seto	3 +        soc	3,@new +        socb	5,8 +        szc	5,7 +        SZCB	@bits,@testva +        sra	5,0 +        sla	10,5 +        srl	0,3 +        src	2,7 +        xop	*4,wr4 +        lds	@bits +        ldd	@bits diff --git a/tests/t_9900/t_9900.doc b/tests/t_9900/t_9900.doc new file mode 100644 index 0000000..b0dc9c4 --- /dev/null +++ b/tests/t_9900/t_9900.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application 9900 ----------------------------+ +|                                                                            | +|        This is a (synthetic) test of the TMS99xx instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_9900/t_9900.ori b/tests/t_9900/t_9900.ori Binary files differnew file mode 100644 index 0000000..b50ef4a --- /dev/null +++ b/tests/t_9900/t_9900.ori diff --git a/tests/t_ace/asflags b/tests/t_ace/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_ace/asflags diff --git a/tests/t_ace/t_ace.asm b/tests/t_ace/t_ace.asm new file mode 100644 index 0000000..cf4389b --- /dev/null +++ b/tests/t_ace/t_ace.asm @@ -0,0 +1,132 @@ +	cpu	ace1202 +	page	0 + +	adc	a, #055h +	adc	a, 030h +	adc	a, [x] +	adc	a, [#33h, x] + +	add	a, #055h +	add	a, 030h +	add	a, [x] +	add	a, [#33h, x] + +	and	a, #055h +	and	a, 030h +	and	a, [x] +	and	a, [#33h, x] + +	clr	a +	clr	x +	clr	030h + +	dec	a +	dec	x +	dec	030h + +	ifbit	7, a +	ifbit	7, 033h +	ifbit	7, [x] + +	ifc + +	ifeq	a, #033h +	ifeq	a, 033h +	ifeq	a, [x] +	ifeq	a, [#044h, x] +	ifeq	x, #00344h +	ifeq	033h, #044h +	 +	ifgt	a, #033h +	ifgt	a, 033h +	ifgt	a, [x] +	ifgt	a, [#044h, x] +	ifgt	x, #00344h + +	iflt	x, #00344h +	 +	ifnc + +	ifne	a, #055h +	ifne	a, 030h +	ifne	a, [x] +	ifne	a, [#33h, x] + +	inc	a +	inc	x +	inc	030h + +	intr + +	invc + +	jmp	070eh +	jmp	[#01h, x] + +	jp	$-30 +	jp      $-15 +	jp	$-1 +	jp	$ +	jp	$+1 +	jp	$+15 +	jp	$+31 +	jp	$+32 + +	jsr	070eh +	jsr	[#01h, x] + +	ld	a, #033h +	ld	a, 033h +	ld	a, [x] +	ld	a, [#044h, x] +	ld	x, #00344h +	ld	033h, #044h +	ld	033h, 034h + +	ldc	2, 033h + +	nop + +        or      a, #055h +        or      a, 030h +        or      a, [x] +        or      a, [#33h, x] + +	rbit	2, 033h +	rbit	2, [x] +	rbit	2, a		; Makro + +	rc + +	ret + +	reti + +	rlc	a +	rlc	030h + +	rrc	a +	rrc	030h + +	sbit	2, 033h +	sbit	2, [x] +	sbit	2, a		; Makro + +	sc + +	st	a, 033h +	st	a, [x] +	st	a, [#044h, x] + +	stc	2, 033h + +        subc    a, #055h +        subc    a, 030h +        subc    a, [x] +        subc    a, [#33h, x] + +        xor     a, #055h +        xor     a, 030h +        xor     a, [x] +        xor     a, [#33h, x] + diff --git a/tests/t_ace/t_ace.doc b/tests/t_ace/t_ace.doc new file mode 100644 index 0000000..5f86dbf --- /dev/null +++ b/tests/t_ace/t_ace.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application ACE -----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the ACE code generator                  | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_ace/t_ace.ori b/tests/t_ace/t_ace.ori Binary files differnew file mode 100644 index 0000000..6db9f2e --- /dev/null +++ b/tests/t_ace/t_ace.ori diff --git a/tests/t_avr/asflags b/tests/t_avr/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_avr/asflags diff --git a/tests/t_avr/t_avr.asm b/tests/t_avr/t_avr.asm new file mode 100644 index 0000000..e84e084 --- /dev/null +++ b/tests/t_avr/t_avr.asm @@ -0,0 +1,229 @@ + +	cpu     at90s8515 +	page    0 +	include regavr.inc + +	adc     r3,r1 + +	add     r28,r28 + +	and     r2,r16 + +	andi    r19,$aa + +	adiw    r26,14 + +	asr     r17 + +	bclr    7 + +	bld     r0,4 + +	brbc    1,* + +	brbs    6,* + +	brcc    next    ; 1   = 01 + +	brcs    next    ; 0   = 00 +next: +	breq    next    ; -1  = 7F + +	brge    next    ; -2  = 7E + +	brsh    next    ; -3  = 7D + +	brid    next    ; -4  = 7C + +	brie    next    ; -5  = 7B + +	brlo    next    ; -6  = 7A + +	brlt    next    ; -7  = 79 + +	brmi    next    ; -8  = 78 + +	brne    next    ; -9  = 77 + +	brhc    next    ; -10 = 76 + +	brhs    next    ; -11 = 75 + +	brpl    next    ; -12 = 74 + +	brtc    next    ; -13 = 73 + +	brts    next    ; -14 = 72 + +	brvc    next    ; -15 = 71 + +	brvs    next    ; -16 = 70 + +	bset    6 + +	bst     r1,2 + +;	call    $123456 + +	cbr     r16,$f0 + +	cbi     $12,7 + +	clc + +	cli + +	cln + +	clh + +	clr     r18 + +	cls + +	clt + +	clv + +	clz + +	com     r4 + +	cp      r4,r19 + +	cpc     r3,r1 + +	cpi     r19,3 + +	cpse    r4,r0 + +	dec     r17 + +	eor     r0,r22 + +	icall + +	ijmp + +	in      r23,$34 + +	inc     r22 + +;	jmp     $123456 + +	ld      r2,x +	ld      r0,x+ +	ld      r3,-x + +	ld      r1,y +	ld      r0,y+ +	ld      r3,-y +	ldd     r4,y+$33 + +	ld      r1,z +	ld      r0,z+ +	ld      r3,-z +	ldd     r4,z+$33 + +	ldi     r30,$f0 + +	lds     r2,$ff00 + +	lpm + +	lsl     r0 + +	lsr     r0 + +	mov     r16,r0 + +;        mul     r6,r5 + +	neg     r11 + +	nop + +	or      r15,r16 + +	ori     r16,$f0 + +	out     $18,r16 + +	pop     r13 + +	push    r14 + +	rcall   * + +	ret + +	reti + +	rjmp    * + +	rol     r15 + +	ror     r15 + +	sbc     r3,r1 + +	sbci    r17,$4f + +	sbi     $1c,3 + +	sbic    $1c,1 + +	sbis    $10,3 + +	sbr     r16,3 + +	sbrc    r0,7 + +	sbrs    r0,7 + +	sec + +	sei + +	sen + +	seh + +	ser     r17 + +	ses + +	set + +	sev + +	sez + +	sleep + +	st      x,r1 +	st      x+,r0 +	st      -x,r3 + +	st      y,r1 +	st      y+,r0 +	st      -y,r3 +	std     y+2,r4 + +	st      z,r1 +	st      z+,r0 +	st      -z,r3 +	std     z+2,r4 + +	sts     $ff00,r2 + +	sub     r13,r12 + +	subi    r22,$11 + +	swap    r1 + +	tst     r3 + +	wdr + diff --git a/tests/t_avr/t_avr.doc b/tests/t_avr/t_avr.doc new file mode 100644 index 0000000..71f3709 --- /dev/null +++ b/tests/t_avr/t_avr.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application AVR ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the Atmel AVR instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_avr/t_avr.ori b/tests/t_avr/t_avr.ori Binary files differnew file mode 100644 index 0000000..9a74d6f --- /dev/null +++ b/tests/t_avr/t_avr.ori diff --git a/tests/t_bas52/asflags b/tests/t_bas52/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_bas52/asflags diff --git a/tests/t_bas52/bas52.clk b/tests/t_bas52/bas52.clk new file mode 100644 index 0000000..d019e11 --- /dev/null +++ b/tests/t_bas52/bas52.clk @@ -0,0 +1,18 @@ +	;************************************************************** +	; +	; The statement action routine - CLOCK +	; +	;************************************************************** +	; +SCLOCK:	ACALL	OTST		;GET CHARACTER AFTER CLOCK TOKEN +	CLR	ET0 +	CLR	C_BIT +	JNC	SC_R		;EXIT IF A ZERO +	ANL	TMOD,#0F0H	;SET UP THE MODE +	SETB	C_BIT		;USER INTERRUPTS +	ORL	IE,#82H		;ENABLE ET0 AND EA +	SETB	TR0		;TURN ON THE TIMER +	; +SC_R:	RET +	; + diff --git a/tests/t_bas52/bas52.fp b/tests/t_bas52/bas52.fp new file mode 100644 index 0000000..c8a137c --- /dev/null +++ b/tests/t_bas52/bas52.fp @@ -0,0 +1,1616 @@ +;************************************************************ +; +; This is a complete BCD floating point package for the 8051 micro- +; controller. It provides 8 digits of accuracy with exponents that +; range from +127 to -127. The mantissa is in packed BCD, while the +; exponent is expressed in pseudo-twos complement. A ZERO exponent +; is used to express the number ZERO. An exponent value of 80H or +; greater than means the exponent is positive, i.e. 80H = E 0, +; 81H = E+1, 82H = E+2 and so on. If the exponent is 7FH or less, +; the exponent is negative, 7FH = E-1, 7EH = E-2, and so on. +; ALL NUMBERS ARE ASSUMED TO BE NORMALIZED and all results are +; normalized after calculation. A normalized mantissa is >=.10 and +; <=.99999999. +; +; The numbers in memory assumed to be stored as follows: +; +; EXPONENT OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE +; SIGN OF ARGUMENT 2       =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-1 +; DIGIT 78 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-2 +; DIGIT 56 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-3 +; DIGIT 34 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-4 +; DIGIT 12 OF ARGUMENT 2   =   VALUE OF ARG_STACK+FP_NUMBER_SIZE-5 +; +; EXPONENT OF ARGUMENT 1   =   VALUE OF ARG_STACK +; SIGN OF ARGUMENT 1       =   VALUE OF ARG_STACK-1 +; DIGIT 78 OF ARGUMENT 1   =   VALUE OF ARG_STACK-2 +; DIGIT 56 OF ARGUMENT 1   =   VALUE OF ARG_STACK-3 +; DIGIT 34 OF ARGUMENT 1   =   VALUE OF ARG_STACK-4 +; DIGIT 12 OF ARGUMENT 1   =   VALUE OF ARG_STACK-5 +; +; The operations are performed thusly: +; +; ARG_STACK+FP_NUMBER_SIZE = ARG_STACK+FP_NUMBER_SIZE # ARG_STACK +; +; Which is ARGUMENT 2 = ARGUMENT 2 # ARGUMENT 1 +; +; Where # can be ADD, SUBTRACT, MULTIPLY OR DIVIDE. +; +; Note that the stack gets popped after an operation. +; +; The FP_COMP instruction POPS the ARG_STACK TWICE and returns status. +; +;********************************************************************** +; + +	segment	code +	newpage +	section	float		; protect symbols +;********************************************************************** +; +; STATUS ON RETURN - After performing an operation (+, -, *, /) +;                    the accumulator contains the following status +; +; ACCUMULATOR - BIT 0 - FLOATING POINT UNDERFLOW OCCURED +; +;             - BIT 1 - FLOATING POINT OVERFLOW OCCURED +; +;             - BIT 2 - RESULT WAS ZER0 +; +;             - BIT 3 - DIVIDE BY ZERO ATTEMPTED +; +;             - BIT 4 - NOT USED, 0 RETURNED +; +;             - BIT 5 - NOT USED, 0 RETURNED +; +;             - BIT 6 - NOT USED, 0 RETURNED +; +;             - BIT 7 - NOT USED, 0 RETURNED +; +; NOTE: When underflow occures, a ZERO result is returned. +;       When overflow or divide by zero occures, a result of +;       .99999999 E+127 is returned and it is up to the user +;       to handle these conditions as needed in the program. +; +; NOTE: The Compare instruction returns F0 = 0 if ARG 1 = ARG 2 +;       and returns a CARRY FLAG = 1 if ARG 1 is > ARG 2 +; +;*********************************************************************** +; +	newpage +;*********************************************************************** +; +; The following values MUST be provided by the user +; +;*********************************************************************** +; +ARG_STACK	EQU	9	;ARGUMENT STACK POINTER +ARG_STACK_PAGE	EQU	1 +FORMAT		EQU	23	;LOCATION OF OUTPUT FORMAT BYTE +OUTPUT		EQU	1990H	;CALL LOCATION TO OUTPUT A CHARACTER +CONVT		EQU	58H	;LOCATION TO CONVERT NUMBERS +INTGRC		BIT	25	;BIT SET IF INTGER ERROR +ZSURP		BIT	54	;ZERO SUPRESSION FOR HEX PRINT +; +;*********************************************************************** +; +; The following equates are used internally +; +;*********************************************************************** +; +FP_NUMBER_SIZE	EQU	6 +DIGIT		EQU	FP_NUMBER_SIZE-2 +R0B0		EQU	0 +R1B0		EQU	1 +UNDERFLOW	EQU	0 +ACC_UNDERFLOW   BIT     ACC.0           ; ******AA added +OVERFLOW	EQU	1 +ACC_OVERFLOW    BIT     ACC.1           ; ******AA added +ZERO		EQU	2 +ACC_ZERO        BIT     ACC.2           ; ******AA added +ZERO_DIVIDE	EQU	3 +ACC_ZERO_DIVIDE BIT	ACC.3		; ******AA added +; +;*********************************************************************** +	newpage +	;************************************************************** +	; +	; The following internal locations are used by the math pack +	; ordering is important and the FP_DIGITS must be bit +	; addressable +	; +	;*************************************************************** +	; +FP_STATUS	EQU	28H		;NOT USED +FP_TEMP		EQU	FP_STATUS+1	;NOT USED +FP_CARRY	SFRB	FP_STATUS+2	;USED FOR BITS ******AA EQU-->SFRB +ADD_IN		BIT	35		;DCMPXZ IN BASIC BACKAGE +XSIGN		BIT	FP_CARRY.0 +FOUND_RADIX	BIT	FP_CARRY.1 +FIRST_RADIX	BIT	FP_CARRY.2 +DONE_LOAD	BIT	FP_CARRY.3 +FP_DIG12	EQU	FP_CARRY+1 +FP_DIG34	EQU	FP_CARRY+2 +FP_DIG56	EQU	FP_CARRY+3 +FP_DIG78	EQU	FP_CARRY+4 +FP_SIGN		SFRB	FP_CARRY+5	; ******AA EQU-->SFRB +MSIGN		BIT	FP_SIGN.0 +FP_EXP		EQU	FP_CARRY+6 +FP_NIB1		EQU	FP_DIG12 +FP_NIB2		EQU	FP_NIB1+1 +FP_NIB3		EQU	FP_NIB1+2 +FP_NIB4		EQU	FP_NIB1+3 +FP_NIB5		EQU	FP_NIB1+4 +FP_NIB6		EQU	FP_NIB1+5 +FP_NIB7		EQU	FP_NIB1+6 +FP_NIB8		EQU	FP_NIB1+7 +FP_ACCX		EQU	FP_NIB1+8 +FP_ACCC		EQU	FP_NIB1+9 +FP_ACC1		EQU	FP_NIB1+10 +FP_ACC2		EQU	FP_NIB1+11 +FP_ACC3		EQU	FP_NIB1+12 +FP_ACC4		EQU	FP_NIB1+13 +FP_ACC5		EQU	FP_NIB1+14 +FP_ACC6		EQU	FP_NIB1+15 +FP_ACC7		EQU	FP_NIB1+16 +FP_ACC8		EQU	FP_NIB1+17 +FP_ACCS		EQU	FP_NIB1+18 +	; +	newpage +	ORG	1993H +	; +	;************************************************************** +	; +	; The floating point entry points and jump table +	; +	;************************************************************** +	; +	AJMP	FLOATING_ADD +	AJMP	FLOATING_SUB +	AJMP	FLOATING_COMP +	AJMP	FLOATING_MUL +	AJMP	FLOATING_DIV +	AJMP	HEXSCAN +	AJMP	FLOATING_POINT_INPUT +	AJMP	FLOATING_POINT_OUTPUT +	AJMP	CONVERT_BINARY_TO_ASCII_STRING +	AJMP	CONVERT_ASCII_STRING_TO_BINARY +	AJMP	MULNUM10 +	AJMP	HEXOUT +	AJMP	PUSHR2R0 +	; +	newpage +	; +FLOATING_SUB: +	; +	MOV	P2,#ARG_STACK_PAGE +	MOV	R0,ARG_STACK +	DEC	R0		;POINT TO SIGN +	MOVX	A,@R0		;READ SIGN +	CPL	ACC.0 +	MOVX	@R0,A +	; +	;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +	; +FLOATING_ADD: +	; +	;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +	; +	; +	ACALL 	MDES1		;R7=TOS EXP, R6=TOS-1 EXP, R4=TOS SIGN +				;R3=TOS-1 SIGN, OPERATION IS R1 # R0 +	; +	MOV	A,R7		;GET TOS EXPONENT  +	JZ	POP_AND_EXIT	;IF TOS=0 THEN POP AND EXIT +	CJNE	R6,#0,LOAD1	;CLEAR CARRY EXIT IF ZERO +	; +	;************************************************************** +	; +SWAP_AND_EXIT:	; Swap external args and return +	; +	;************************************************************** +	; +	ACALL	LOAD_POINTERS +	MOV	R7,#FP_NUMBER_SIZE +	; +SE1:	MOVX	A,@R0		;SWAP THE ARGUMENTS +	MOVX	@R1,A +	DEC	R0 +	DEC	R1 +	DJNZ	R7,SE1 +	; +POP_AND_EXIT: +	; +	MOV	A,ARG_STACK	;POP THE STACK +	ADD	A,#FP_NUMBER_SIZE +	MOV	ARG_STACK,A +	CLR	A +	RET +	; +	; +LOAD1:	SUBB	A,R6		;A = ARG 1 EXP - ARG 2 EXP +	MOV	FP_EXP,R7	;SAVE EXPONENT AND SIGN +	MOV	FP_SIGN,R4 +	JNC	LOAD2		;ARG1 EXPONENT IS LARGER OR SAME +	MOV	FP_EXP,R6 +	MOV	FP_SIGN,R3 +	CPL	A +	INC	A		;COMPENSATE FOR EXP DELTA +	XCH	A,R0		;FORCE R0 TO POINT AT THE LARGEST +	XCH	A,R1		;EXPONENT +	XCH	A,R0 +	; +LOAD2:	MOV	R7,A		;SAVE THE EXPONENT DELTA IN R7 +	CLR	ADD_IN +	CJNE	R5,#0,$+5 +	SETB	ADD_IN +	; +	newpage +	; Load the R1 mantissa +	; +	ACALL	LOADR1_MANTISSA	;LOAD THE SMALLEST NUMBER +	; +	; Now align the number to the delta exponent +	; R4 points to the string of the last digits lost +	; +	CJNE	R7,#DIGIT+DIGIT+3,$+3 +	JC	$+4 +	MOV	R7,#DIGIT+DIGIT+2 +	; +	MOV	FP_CARRY,#00	;CLEAR THE CARRY +	ACALL	RIGHT		;SHIFT THE NUMBER +	; +	; Set up for addition and subtraction +	; +	MOV	R7,#DIGIT	;LOOP COUNT +	MOV	R1,#FP_DIG78 +	MOV	A,#9EH +	CLR	C +	SUBB	A,R4 +	DA	A +	XCH	A,R4 +	JNZ	$+3 +	MOV	R4,A +	CJNE	A,#50H,$+3	;TEST FOR SUBTRACTION +	JNB	ADD_IN,SUBLP	;DO SUBTRACTION IF NO ADD_IN +	CPL	C		;FLIP CARRY FOR ADDITION +	ACALL	ADDLP		;DO ADDITION +	; +	JNC	ADD_R +	INC	FP_CARRY +	MOV	R7,#1 +	ACALL	RIGHT +	ACALL	INC_FP_EXP	;SHIFT AND BUMP EXPONENT +	; +ADD_R:	AJMP	STORE_ALIGN_TEST_AND_EXIT +	; +ADDLP:	MOVX	A,@R0 +	ADDC	A,@R1 +	DA	A +	MOV	@R1,A +	DEC	R0 +	DEC	R1 +	DJNZ	R7,ADDLP	;LOOP UNTIL DONE +	RET +	; +	newpage +	; +SUBLP:	MOVX	A,@R0		;NOW DO SUBTRACTION +	MOV	R6,A +	CLR	A +	ADDC	A,#99H +	SUBB	A,@R1 +	ADD	A,R6 +	DA	A +	MOV	@R1,A +	DEC	R0 +	DEC	R1 +	DJNZ	R7,SUBLP +	JC	FSUB6 +	; +	newpage +	; +	; Need to complement the result and sign because the floating +	; point accumulator mantissa was larger than the external +	; memory and their signs were equal. +	; +	CPL	FP_SIGN.0 +	MOV	R1,#FP_DIG78 +	MOV	R7,#DIGIT	;LOOP COUNT +	; +FSUB5:	MOV	A,#9AH +	SUBB	A,@R1 +	ADD	A,#0 +	DA	A +	MOV	@R1,A +	DEC	R1 +	CPL	C +	DJNZ	R7,FSUB5	;LOOP +	; +	; Now see how many zeros their are +	; +FSUB6:	MOV	R0,#FP_DIG12 +	MOV	R7,#0 +	; +FSUB7:	MOV	A,@R0 +	JNZ	FSUB8 +	INC	R7 +	INC	R7 +	INC	R0 +	CJNE	R0,#FP_SIGN,FSUB7 +	AJMP	ZERO_AND_EXIT +	; +FSUB8:	CJNE	A,#10H,$+3 +	JNC	FSUB9 +	INC	R7 +	; +	; Now R7 has the number of leading zeros in the FP ACC +	; +FSUB9:	MOV	A,FP_EXP	;GET THE OLD EXPONENT +	CLR	C +	SUBB	A,R7		;SUBTRACT FROM THE NUMBER OF ZEROS +	JZ	FSUB10 +	JC	FSUB10 +	; +	MOV	FP_EXP,A	;SAVE THE NEW EXPONENT +	; +	ACALL	LEFT1		;SHIFT THE FP ACC +	MOV	FP_CARRY,#0 +	AJMP	STORE_ALIGN_TEST_AND_EXIT +	; +FSUB10:	AJMP	UNDERFLOW_AND_EXIT +	; +	newpage +	;*************************************************************** +	; +FLOATING_COMP:	; Compare two floating point numbers +		; used for relational operations and is faster +		; than subtraction. ON RETURN, The carry is set +		; if ARG1 is > ARG2, else carry is not set +		; if ARG1 = ARG2, F0 gets set +	; +	;*************************************************************** +	; +	ACALL	MDES1		;SET UP THE REGISTERS +	MOV	A,ARG_STACK +	ADD	A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE +	MOV	ARG_STACK,A	;POP THE STACK TWICE, CLEAR THE CARRY +	MOV	A,R6		;CHECK OUT EXPONENTS +	CLR	F0 +	SUBB	A,R7 +	JZ	EXPONENTS_EQUAL +	JC	ARG1_EXP_IS_LARGER +	; +	; Now the ARG2 EXPONENT is > ARG1 EXPONENT +	; +SIGNS_DIFFERENT: +	; +	MOV	A,R3		;SEE IF SIGN OF ARG2 IS POSITIVE +	SJMP	$+3 +	; +ARG1_EXP_IS_LARGER: +	; +	MOV	A,R4		;GET THE SIGN OF ARG1 EXPONENT +	JZ	$+3 +	CPL	C +	RET +	; +EXPONENTS_EQUAL: +	; +	; First, test the sign, then the mantissa +	; +	CJNE	R5,#0,SIGNS_DIFFERENT +	; +BOTH_PLUS: +	; +	MOV	R7,#DIGIT	;POINT AT MS DIGIT +	DEC	R0 +	DEC	R0 +	DEC	R0 +	DEC	R1 +	DEC	R1 +	DEC	R1 +	; +	; Now do the compare +	; +CLOOP:	MOVX	A,@R0 +	MOV	R6,A +	MOVX	A,@R1 +	SUBB	A,R6 +	JNZ	ARG1_EXP_IS_LARGER +	INC	R0 +	INC	R1 +	DJNZ	R7,CLOOP +	; +	; If here, the numbers are the same, the carry is cleared +	; +	SETB	F0 +	RET			;EXIT WITH EQUAL +	; +	newpage +;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +; +FLOATING_MUL:	; Floating point multiply +; +;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +; +	ACALL	MUL_DIV_EXP_AND_SIGN +	; +	; check for zero exponents +	; +	CJNE	R6,#00,$+5	;ARG 2 EXP ZERO? +	AJMP	ZERO_AND_EXIT +	; +	; calculate the exponent +	; +FMUL1:	MOV	FP_SIGN,R5	;SAVE THE SIGN, IN CASE OF FAILURE +	; +	MOV	A,R7 +	JZ	FMUL1-2 +	ADD	A,R6		;ADD THE EXPONENTS +	JB	ACC.7,FMUL_OVER +	JBC	CY,FMUL2	;SEE IF CARRY IS SET +	; +	AJMP	UNDERFLOW_AND_EXIT +	; +FMUL_OVER: +	; +	JNC	FMUL2		;OK IF SET +	; +FOV:	AJMP	OVERFLOW_AND_EXIT +	; +FMUL2:	SUBB	A,#129		;SUBTRACT THE EXPONENT BIAS +	MOV	R6,A		;SAVE IT FOR LATER +	; +	; Unpack and load R0 +	; +	ACALL	UNPACK_R0 +	; +	; Now set up for loop multiply +	; +	MOV	R3,#DIGIT +	MOV	R4,R1B0 +	; +	newpage +	; +	; Now, do the multiply and accumulate the product +	; +FMUL3:	MOV	R1B0,R4 +	MOVX	A,@R1 +	MOV	R2,A +	ACALL	MUL_NIBBLE +	; +	MOV	A,R2 +	SWAP	A +	ACALL	MUL_NIBBLE +	DEC	R4 +	DJNZ	R3,FMUL3 +	; +	; Now, pack and restore the sign +	; +	MOV	FP_EXP,R6 +	MOV	FP_SIGN,R5 +	AJMP	PACK		;FINISH IT OFF +	; +	newpage +	;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD +	; +FLOATING_DIV: +	; +	;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD +	; +	ACALL	MDES1 +	; +	; Check the exponents +	; +	MOV	FP_SIGN,R5	;SAVE THE SIGN +	CJNE	R7,#0,DIV0	;CLEARS THE CARRY +	ACALL	OVERFLOW_AND_EXIT +	CLR	A +	SETB	ACC_ZERO_DIVIDE +	RET +	; +DIV0:	MOV	A,R6		;GET EXPONENT +	JZ	FMUL1-2		;EXIT IF ZERO +	SUBB	A,R7		;DELTA EXPONENT +	JB	ACC.7,D_UNDER +	JNC	DIV3 +	AJMP	UNDERFLOW_AND_EXIT +	; +D_UNDER:JNC	FOV +	; +DIV3:	ADD	A,#129		;CORRECTLY BIAS THE EXPONENT +	MOV	FP_EXP,A	;SAVE THE EXPONENT +	ACALL	LOADR1_MANTISSA	;LOAD THE DIVIDED +	; +	MOV	R2,#FP_ACCC	;SAVE LOCATION +	MOV	R3,R0B0		;SAVE POINTER IN R3 +	MOV	FP_CARRY,#0	;ZERO CARRY BYTE +	; +DIV4:	MOV	R5,#0FFH	;LOOP COUNT +	SETB	C +	; +DIV5:	MOV	R0B0,R3		;RESTORE THE EXTERNAL POINTER +	MOV	R1,#FP_DIG78	;SET UP INTERNAL POINTER +	MOV	R7,#DIGIT	;LOOP COUNT +	JNC	DIV7		;EXIT IF NO CARRY +	; +DIV6:	MOVX	A,@R0		;DO ACCUMLATION +	MOV	R6,A +	CLR	A +	ADDC	A,#99H +	SUBB	A,R6 +	ADD	A,@R1 +	DA	A +	MOV	@R1,A +	DEC	R0 +	DEC	R1 +	DJNZ	R7,DIV6		;LOOP +	; +	INC	R5		;SUBTRACT COUNTER +	JC	DIV5		;KEEP LOOPING IF CARRY +	MOV	A,@R1		;GET CARRY +	SUBB	A,#1		;CARRY IS CLEARED +	MOV	@R1,A		;SAVE CARRY DIGIT +	CPL	C +	SJMP	DIV5		;LOOP +	; +	; Restore the result if carry was found +	; +DIV7:	ACALL	ADDLP		;ADD NUMBER BACK +	MOV	@R1,#0		;CLEAR CARRY +	MOV	R0B0,R2		;GET SAVE COUNTER +	MOV	@R0,5		;SAVE COUNT BYTE +	; +	INC	R2		;ADJUST SAVE COUNTER +	MOV	R7,#1		;BUMP DIVIDEND +	ACALL	LEFT +	CJNE	R2,#FP_ACC8+2,DIV4 +	; +	DJNZ	FP_EXP,DIV8 +	AJMP	UNDERFLOW_AND_EXIT +	; +DIV8:	MOV	FP_CARRY,#0 +	; +	newpage +	;*************************************************************** +	; +PACK:	; Pack the mantissa +	; +	;*************************************************************** +	; +	; First, set up the pointers +	; +	MOV	R0,#FP_ACCC +	MOV	A,@R0		;GET FP_ACCC +	MOV	R6,A		;SAVE FOR ZERO COUNT +	JZ	PACK0		;JUMP OVER IF ZERO +	ACALL	INC_FP_EXP	;BUMP THE EXPONENT +	DEC	R0 +	; +PACK0:	INC	R0		;POINT AT FP_ACC1 +	; +PACK1:	MOV	A,#8		;ADJUST NIBBLE POINTER +	MOV	R1,A +	ADD	A,R0 +	MOV	R0,A +	CJNE	@R0,#5,$+3	;SEE IF ADJUSTING NEEDED +	JC	PACK3+1 +	; +PACK2:	SETB	C +	CLR	A +	DEC	R0 +	ADDC	A,@R0 +	DA	A +	XCHD	A,@R0		;SAVE THE VALUE +	JNB	ACC.4,PACK3 +	DJNZ	R1,PACK2 +	; +	DEC	R0 +	MOV	@R0,#1 +	ACALL	INC_FP_EXP +	SJMP	PACK4 +	; +PACK3:	DEC	R1 +	MOV	A,R1 +	CLR	C +	XCH	A,R0 +	SUBB	A,R0 +	MOV	R0,A +	; +PACK4:	MOV	R1,#FP_DIG12 +	; +	; Now, pack +	; +PLOOP:	MOV	A,@R0 +	SWAP	A		;FLIP THE DIGITS +	INC	R0 +	XCHD	A,@R0 +	ORL	6,A		;ACCUMULATE THE OR'ED DIGITS +	MOV	@R1,A +	INC	R0 +	INC	R1 +	CJNE	R1,#FP_SIGN,PLOOP +	MOV	A,R6 +	JNZ	STORE_ALIGN_TEST_AND_EXIT +	MOV	FP_EXP,#0	;ZERO EXPONENT +	; +	;************************************************************** +	; +STORE_ALIGN_TEST_AND_EXIT:	;Save the number align carry and exit +	; +	;************************************************************** +	; +	ACALL	LOAD_POINTERS +	MOV	ARG_STACK,R1	;SET UP THE NEW STACK +	MOV	R0,#FP_EXP +	; +	; Now load the numbers +	; +STORE2:	MOV	A,@R0 +	MOVX	@R1,A		;SAVE THE NUMBER +	DEC	R0 +	DEC	R1 +	CJNE	R0,#FP_CARRY,STORE2 +	; +	CLR	A		;NO ERRORS +	; +PRET:	RET			;EXIT +	; +	newpage +INC_FP_EXP: +	; +	INC	FP_EXP +	MOV	A,FP_EXP +	JNZ	PRET		;EXIT IF NOT ZERO +	POP	ACC		;WASTE THE CALLING STACK +	POP	ACC +	AJMP	OVERFLOW_AND_EXIT +	; +;*********************************************************************** +; +UNPACK_R0:	; Unpack BCD digits and load into nibble locations +; +;*********************************************************************** +	; +	PUSH	R1B0 +	MOV	R1,#FP_NIB8 +	; +ULOOP:	MOVX	A,@R0 +	ANL	A,#0FH +	MOV	@R1,A		;SAVE THE NIBBLE +	MOVX	A,@R0 +	SWAP	A +	ANL	A,#0FH +	DEC	R1 +	MOV	@R1,A		;SAVE THE NIBBLE AGAIN +	DEC	R0 +	DEC	R1 +	CJNE	R1,#FP_NIB1-1,ULOOP +	; +	POP	R1B0 +	; +LOAD7:	RET +	; +	newpage +	;************************************************************** +	; +OVERFLOW_AND_EXIT:	;LOAD 99999999 E+127,  SET OV BIT, AND EXIT +	; +	;************************************************************** +	; +	MOV	R0,#FP_DIG78 +	MOV	A,#99H +	; +OVE1:	MOV	@R0,A +	DEC	R0 +	CJNE	R0,#FP_CARRY,OVE1 +	; +	MOV	FP_EXP,#0FFH +	ACALL	STORE_ALIGN_TEST_AND_EXIT +	; +	SETB	ACC_OVERFLOW		; ******AA +	RET +	; +	newpage +	;************************************************************** +	; +UNDERFLOW_AND_EXIT:	;LOAD 0, SET UF BIT, AND EXIT +	; +	;************************************************************** +	; +	ACALL	ZERO_AND_EXIT +	CLR	A +	SETB	ACC_UNDERFLOW		; ******AA +	RET +	; +	;************************************************************** +	; +ZERO_AND_EXIT:		;LOAD 0, SET ZERO BIT, AND EXIT +	; +	;************************************************************** +	; +	ACALL	FP_CLEAR +	ACALL	STORE_ALIGN_TEST_AND_EXIT +	SETB	ACC_ZERO		; ******AA +	RET			;EXIT +	; +	;************************************************************** +	; +FP_CLEAR: +	; +	; Clear internal storage +	; +	;************************************************************** +	; +	CLR	A +	MOV	R0,#FP_ACC8+1 +	; +FPC1:	MOV	@R0,A +	DEC	R0 +	CJNE	R0,#FP_TEMP,FPC1 +	RET +	; +	newpage +	;************************************************************** +	; +RIGHT:	; Shift ACCUMULATOR RIGHT the number of nibbles in R7 +	; Save the shifted values in R4 if SAVE_ROUND is set +	; +	;************************************************************** +	; +	MOV	R4,#0		;IN CASE OF NO SHIFT +	; +RIGHT1:	CLR	C +	MOV	A,R7		;GET THE DIGITS TO SHIFT +	JZ	RIGHT5-1	;EXIT IF ZERO +	SUBB	A,#2		;TWO TO DO? +	JNC	RIGHT5		;SHIFT TWO NIBBLES +	; +	; Swap one nibble then exit +	; +RIGHT3:	PUSH	R0B0		;SAVE POINTER REGISTER +	PUSH	R1B0 +	; +	MOV	R1,#FP_DIG78	;LOAD THE POINTERS +	MOV	R0,#FP_DIG56 +	MOV	A,R4		;GET THE OVERFLOW REGISTER +	XCHD	A,@R1		;GET DIGIT 8 +	SWAP	A		;FLIP FOR LOAD +	MOV	R4,A +	; +RIGHTL:	MOV	A,@R1		;GET THE LOW ORDER BYTE +	XCHD	A,@R0		;SWAP NIBBLES +	SWAP	A		;FLIP FOR STORE +	MOV	@R1,A		;SAVE THE DIGITS +	DEC	R0		;BUMP THE POINTERS +	DEC	R1 +	CJNE	R1,#FP_DIG12-1,RIGHTL	;LOOP +	; +	MOV	A,@R1		;ACC = CH8 +	SWAP	A		;ACC = 8CH +	ANL	A,#0FH		;ACC = 0CH +	MOV	@R1,A		;CARRY DONE +	POP	R1B0		;EXIT +	POP	R0B0		;RESTORE REGISTER +	RET +	; +RIGHT5:	MOV	R7,A		;SAVE THE NEW SHIFT NUMBER +	CLR	A +	XCH	A,FP_CARRY	;SWAP THE NIBBLES +	XCH	A,FP_DIG12 +	XCH	A,FP_DIG34 +	XCH	A,FP_DIG56 +	XCH	A,FP_DIG78 +	MOV	R4,A		;SAVE THE LAST DIGIT SHIFTED +	SJMP	RIGHT1+1 +	; +	newpage +	;*************************************************************** +	; +LEFT:	; Shift ACCUMULATOR LEFT the number of nibbles in R7 +	; +	;*************************************************************** +	; +	MOV	R4,#00H		;CLEAR FOR SOME ENTRYS +	; +LEFT1:	CLR	C +	MOV	A,R7		;GET SHIFT VALUE +	JZ	LEFT5-1		;EXIT IF ZERO +	SUBB	A,#2		;SEE HOW MANY BYTES TO SHIFT +	JNC	LEFT5 +	; +LEFT3:	PUSH	R0B0		;SAVE POINTER +	PUSH	R1B0 +	MOV	R0,#FP_CARRY +	MOV	R1,#FP_DIG12 +	; +	MOV	A,@R0		;ACC=CHCL +	SWAP	A		;ACC = CLCH +	MOV	@R0,A		;ACC = CLCH, @R0 = CLCH +	; +LEFTL:	MOV	A,@R1		;DIG 12 +	SWAP	A		;DIG 21 +	XCHD	A,@R0 +	MOV	@R1,A		;SAVE IT +	INC	R0		;BUMP POINTERS +	INC	R1 +	CJNE	R0,#FP_DIG78,LEFTL +	; +	MOV	A,R4 +	SWAP	A +	XCHD	A,@R0 +	ANL	A,#0F0H +	MOV	R4,A +	; +	POP	R1B0 +	POP	R0B0		;RESTORE +	RET			;DONE +	; +LEFT5:	MOV	R7,A		;RESTORE COUNT +	CLR	A +	XCH	A,R4		;GET THE RESTORATION BYTE +	XCH	A,FP_DIG78	;DO THE SWAP +	XCH	A,FP_DIG56 +	XCH	A,FP_DIG34 +	XCH	A,FP_DIG12 +	XCH	A,FP_CARRY +	SJMP	LEFT1+1 +	; +	newpage +MUL_NIBBLE: +	; +	; Multiply the nibble in R7 by the FP_NIB locations +	; accumulate the product in FP_ACC +	; +	; Set up the pointers for multiplication +	; +	ANL	A,#0FH		;STRIP OFF MS NIBBLE +	MOV	R7,A +	MOV	R0,#FP_ACC8 +	MOV	R1,#FP_NIB8 +	CLR	A +	MOV	FP_ACCX,A +	; +MNLOOP:	DEC	R0		;BUMP POINTER TO PROPAGATE CARRY +	ADD	A,@R0		;ATTEMPT TO FORCE CARRY +	DA	A		;BCD ADJUST +	JNB	ACC.4,MNL0	;DON'T ADJUST IF NO NEED +	DEC	R0		;PROPAGATE CARRY TO THE NEXT DIGIT +	INC	@R0		;DO THE ADJUSTING +	INC	R0		;RESTORE R0 +	; +MNL0:	XCHD	A,@R0		;RESTORE INITIAL NUMBER +	MOV	B,R7		;GET THE NUBBLE TO MULTIPLY +	MOV	A,@R1		;GET THE OTHER NIBBLE +	MUL	AB		;DO THE MULTIPLY +	MOV	B,#10		;NOW BCD ADJUST +	DIV	AB +	XCH	A,B		;GET THE REMAINDER +	ADD	A,@R0		;PROPAGATE THE PARTIAL PRODUCTS +	DA	A		;BCD ADJUST +	JNB	ACC.4,MNL1	;PROPAGATE PARTIAL PRODUCT CARRY +	INC	B +	; +MNL1:	INC	R0 +	XCHD	A,@R0		;SAVE THE NEW PRODUCT +	DEC	R0 +	MOV	A,B		;GET BACK THE QUOTIENT +	DEC	R1 +	CJNE	R1,#FP_NIB1-1,MNLOOP +	; +	ADD	A,FP_ACCX	;GET THE OVERFLOW +	DA	A		;ADJUST +	MOV	@R0,A		;SAVE IT +	RET			;EXIT +	; +	newpage +	;*************************************************************** +	; +LOAD_POINTERS:	; Load the ARG_STACK into R0 and bump R1 +	; +	;*************************************************************** +	; +	MOV	P2,#ARG_STACK_PAGE +	MOV	R0,ARG_STACK +	MOV	A,#FP_NUMBER_SIZE +	ADD	A,R0 +	MOV	R1,A +	RET +	; +	;*************************************************************** +	; +MUL_DIV_EXP_AND_SIGN: +	; +	; Load the sign into R7, R6. R5 gets the sign for +	; multiply and divide. +	; +	;*************************************************************** +	; +	ACALL	FP_CLEAR	;CLEAR INTERNAL MEMORY +	; +MDES1:	ACALL	LOAD_POINTERS	;LOAD REGISTERS +	MOVX	A,@R0		;ARG 1 EXP +	MOV	R7,A		;SAVED IN R7 +	MOVX	A,@R1		;ARG 2 EXP +	MOV	R6,A		;SAVED IN R6 +	DEC	R0		;BUMP POINTERS TO SIGN +	DEC	R1 +	MOVX	A,@R0		;GET THE SIGN +	MOV	R4,A		;SIGN OF ARG1 +	MOVX	A,@R1		;GET SIGN OF NEXT ARG +	MOV	R3,A		;SIGN OF ARG2 +	XRL	A,R4		;ACC GETS THE NEW SIGN +	MOV	R5,A		;R5 GETS THE NEW SIGN +	; +	; Bump the pointers to point at the LS digit +	; +	DEC	R0 +	DEC	R1 +	; +	RET +	; +	newpage +	;*************************************************************** +	; +LOADR1_MANTISSA: +	; +	; Load the mantissa of R0 into FP_Digits +	; +	;*************************************************************** +	; +	PUSH	R0B0		;SAVE REGISTER 1 +	MOV	R0,#FP_DIG78	;SET UP THE POINTER +	; +LOADR1:	MOVX	A,@R1 +	MOV	@R0,A +	DEC	R1 +	DEC	R0 +	CJNE	R0,#FP_CARRY,LOADR1 +	; +	POP	R0B0 +	RET +	; +	newpage +	;*************************************************************** +	; +HEXSCAN:	; Scan a string to determine if it is a hex number +		; set carry if hex, else carry = 0 +	; +	;*************************************************************** +	; +	ACALL	GET_DPTR_CHARACTER +	PUSH	DPH +	PUSH	DPL		;SAVE THE POINTER +	; +HEXSC1:	MOVX	A,@DPTR		;GET THE CHARACTER +	ACALL	DIGIT_CHECK	;SEE IF A DIGIT +	JC	HS1		;CONTINUE IF A DIGIT +	ACALL	HEX_CHECK	;SEE IF HEX +	JC	HS1 +	; +	CLR	ACC.5		;NO LOWER CASE +	CJNE	A,#'H',HEXDON +	SETB	C +	SJMP	HEXDO1		;NUMBER IS VALID HEX, MAYBE +	; +HEXDON:	CLR	C +	; +HEXDO1:	POP	DPL		;RESTORE POINTER +	POP	DPH +	RET +	; +HS1:	INC	DPTR		;BUMP TO NEXT CHARACTER +	SJMP	HEXSC1		;LOOP +	; +HEX_CHECK:	;CHECK FOR A VALID ASCII HEX, SET CARRY IF FOUND +	; +	CLR	ACC.5		;WASTE LOWER CASE +	CJNE	A,#'F'+1,$+3	;SEE IF F OR LESS +	JC	HC1 +	RET +	; +HC1:	CJNE	A,#'A',$+3	;SEE IF A OR GREATER +	CPL	C +	RET +	; +	newpage +	; +PUSHR2R0: +	;  +	MOV	R3,#HI(CONVT)	;CONVERSION LOCATION +	MOV	R1,#LO(CONVT) +	ACALL	CONVERT_BINARY_TO_ASCII_STRING +	MOV	A,#0DH		;A CR TO TERMINATE +	MOVX	@R1,A		;SAVE THE CR +	MOV	DPTR,#CONVT +	; +	; Falls thru to FLOATING INPUT +	; +	newpage +	;*************************************************************** +	; +FLOATING_POINT_INPUT:	; Input a floating point number pointed to by +			; the DPTR +	; +	;*************************************************************** +	; +	ACALL	FP_CLEAR	;CLEAR EVERYTHING +	ACALL	GET_DPTR_CHARACTER +	ACALL	PLUS_MINUS_TEST +	MOV	MSIGN,C		;SAVE THE MANTISSA SIGN +	; +	; Now, set up for input loop +	; +	MOV	R0,#FP_ACCC +	MOV	R6,#7FH		;BASE EXPONENT +	SETB	F0		;SET INITIAL FLAG +	; +INLOOP:	ACALL	GET_DIGIT_CHECK +	JNC	GTEST		;IF NOT A CHARACTER, WHAT IS IT? +	ANL	A,#0FH		;STRIP ASCII +	ACALL	STDIG		;STORE THE DIGITS +	; +INLPIK:	INC	DPTR		;BUMP POINTER FOR LOOP +	SJMP	INLOOP		;LOOP FOR INPUT +	; +GTEST:	CJNE	A,#'.',GT1	;SEE IF A RADIX +	JB	FOUND_RADIX,INERR +	SETB	FOUND_RADIX +	CJNE	R0,#FP_ACCC,INLPIK +	SETB	FIRST_RADIX	;SET IF FIRST RADIX +	SJMP	INLPIK		;GET ADDITIONAL DIGITS +	; +GT1:	JB	F0,INERR	;ERROR IF NOT CLEARED +	CJNE	A,#'e',$+5	;CHECK FOR LOWER CASE +	SJMP	$+5 +	CJNE	A,#'E',FINISH_UP +	ACALL	INC_AND_GET_DPTR_CHARACTER +	ACALL	PLUS_MINUS_TEST +	MOV	XSIGN,C		;SAVE SIGN STATUS +	ACALL	GET_DIGIT_CHECK +	JNC	INERR +	; +	ANL	A,#0FH		;STRIP ASCII BIAS OFF THE CHARACTER +	MOV	R5,A		;SAVE THE CHARACTER IN R5 +	; +GT2:	INC	DPTR +	ACALL	GET_DIGIT_CHECK +	JNC	FINISH1 +	ANL	A,#0FH		;STRIP OFF BIAS +	XCH	A,R5		;GET THE LAST DIGIT +	MOV	B,#10		;MULTIPLY BY TEN +	MUL	AB +	ADD	A,R5		;ADD TO ORIGINAL VALUE +	MOV	R5,A		;SAVE IN R5 +	JNC	GT2		;LOOP IF NO CARRY +	MOV	R5,#0FFH	;FORCE AN ERROR +	; +FINISH1:MOV	A,R5		;GET THE SIGN +	JNB	XSIGN,POSNUM	;SEE IF EXPONENT IS POS OR NEG +	CLR	C +	SUBB	A,R6 +	CPL	A +	INC	A +	JC	FINISH2 +	MOV	A,#01H +	RET +	; +POSNUM:	ADD	A,R6		;ADD TO EXPONENT +	JNC	FINISH2 +	; +POSNM1:	MOV	A,#02H +	RET +	; +FINISH2:XCH	A,R6		;SAVE THE EXPONENT +	; +FINISH_UP: +	; +	MOV	FP_EXP,R6	;SAVE EXPONENT +	CJNE	R0,#FP_ACCC,$+5 +	ACALL	FP_CLEAR	;CLEAR THE MEMORY IF 0 +	MOV	A,ARG_STACK	;GET THE ARG STACK +	CLR	C +	SUBB	A,#FP_NUMBER_SIZE+FP_NUMBER_SIZE +	MOV	ARG_STACK,A	;ADJUST FOR STORE +	AJMP	PACK +	; +STDIG:	CLR	F0		;CLEAR INITIAL DESIGNATOR +	JNZ	STDIG1		;CONTINUE IF NOT ZERO +	CJNE	R0,#FP_ACCC,STDIG1 +	JNB	FIRST_RADIX,RET_X +	; +DECX:	DJNZ	R6,RET_X +	; +INERR:	MOV	A,#0FFH +	; +RET_X:	RET +	; +STDIG1:	JB	DONE_LOAD,FRTEST +	CLR	FIRST_RADIX +	; +FRTEST:	JB	FIRST_RADIX,DECX +	; +FDTEST:	JB	FOUND_RADIX,FDT1 +	INC	R6 +	; +FDT1:	JB	DONE_LOAD,RET_X +	CJNE	R0,#FP_ACC8+1,FDT2 +	SETB	DONE_LOAD +	; +FDT2:	MOV	@R0,A		;SAVE THE STRIPPED ACCUMULATOR +	INC	R0		;BUMP THE POINTER +	RET			;EXIT +	; +	newpage +	;*************************************************************** +	; +	; I/O utilities +	; +	;*************************************************************** +	; +INC_AND_GET_DPTR_CHARACTER: +	; +	INC	DPTR +	; +GET_DPTR_CHARACTER: +	; +	MOVX	A,@DPTR		;GET THE CHARACTER +	CJNE	A,#' ',PMT1	;SEE IF A SPACE +	; +	; Kill spaces +	; +	SJMP	INC_AND_GET_DPTR_CHARACTER +	; +PLUS_MINUS_TEST: +	; +	CJNE	A,#0E3H,$+5	;SEE IF A PLUS, PLUS TOKEN FROM BASIC +	SJMP	PMT3 +	CJNE	A,#'+',$+5 +	SJMP	PMT3 +	CJNE	A,#0E5H,$+5	;SEE IF MINUS, MINUS TOKEN FROM BASIC +	SJMP	PMT2 +	CJNE	A,#'-',PMT1 +	; +PMT2:	SETB	C +	; +PMT3:	INC	DPTR +	; +PMT1:	RET +	; +	newpage +	;*************************************************************** +	; +FLOATING_POINT_OUTPUT:	; Output the number, format is in location 23 +	; +	; IF FORMAT = 00 - FREE FLOATING +	;           = FX - EXPONENTIAL (X IS THE NUMBER OF SIG DIGITS) +	;           = NX - N = NUM BEFORE RADIX, X = NUM AFTER RADIX +	;                  N + X = 8 MAX +	; +	;*************************************************************** +	; +	ACALL	MDES1		;GET THE NUMBER TO OUTPUT, R0 IS POINTER +	ACALL	POP_AND_EXIT	;OUTPUT POPS THE STACK +	MOV	A,R7 +	MOV	R6,A		;PUT THE EXPONENT IN R6 +	ACALL	UNPACK_R0	;UNPACK THE NUMBER +	MOV	R0,#FP_NIB1	;POINT AT THE NUMBER +	MOV	A,FORMAT	;GET THE FORMAT +	MOV	R3,A		;SAVE IN CASE OF EXP FORMAT +	JZ	FREE		;FREE FLOATING? +	CJNE	A,#0F0H,$+3	;SEE IF EXPONENTIAL +	JNC	EXPOUT +	; +	; If here, must be integer USING format +	; +	MOV	A,R6		;GET THE EXPONENT +	JNZ	$+4 +	MOV	R6,#80H +	MOV	A,R3		;GET THE FORMAT +	SWAP	A		;SPLIT INTEGER AND FRACTION +	ANL	A,#0FH +	MOV	R2,A		;SAVE INTEGER +	ACALL	NUM_LT		;GET THE NUMBER OF INTEGERS +	XCH	A,R2		;FLIP FOR SUBB +	CLR	C +	SUBB	A,R2 +	MOV	R7,A +	JNC	$+8 +	MOV	R5,#'?'		;OUTPUT A QUESTION MARK +	ACALL	SOUT1		;NUMBER IS TOO LARGE FOR FORMAT +	AJMP	FREE +	CJNE	R2,#00,USING0	;SEE IF ZERO +	DEC	R7 +	ACALL	SS7 +	ACALL	ZOUT		;OUTPUT A ZERO +	SJMP	USING1 +	; +USING0:	ACALL	SS7		;OUTPUT SPACES, IF NEED TO +	MOV	A,R2		;OUTPUT DIGITS +	MOV	R7,A +	ACALL	OUTR0 +	; +USING1:	MOV	A,R3 +	ANL	A,#0FH		;GET THE NUMBER RIGHT OF DP +	MOV	R2,A		;SAVE IT +	JZ	PMT1		;EXIT IF ZERO +	ACALL	ROUT		;OUTPUT DP +	ACALL	NUM_RT +	CJNE	A,2,USINGX	;COMPARE A TO R2 +	; +USINGY:	MOV	A,R2 +	AJMP	Z7R7 +	; +USINGX:	JNC	USINGY +	; +USING2:	XCH	A,R2 +	CLR	C +	SUBB	A,R2 +	XCH	A,R2 +	ACALL	Z7R7		;OUTPUT ZEROS IF NEED TO +	MOV	A,R2 +	MOV	R7,A +	AJMP	OUTR0 +	; +	; First, force exponential output, if need to +	; +FREE:	MOV	A,R6		;GET THE EXPONENT +	JNZ	FREE1		;IF ZERO, PRINT IT +	ACALL	SOUT +	AJMP	ZOUT +	; +FREE1:	MOV	R3,#0F0H	;IN CASE EXP NEEDED +	MOV	A,#80H-DIGIT-DIGIT-1 +	ADD	A,R6 +	JC	EXPOUT +	SUBB	A,#0F7H +	JC	EXPOUT +	; +	; Now, just print the number +	; +	ACALL	SINOUT		;PRINT THE SIGN OF THE NUMBER +	ACALL	NUM_LT		;GET THE NUMBER LEFT OF DP +	CJNE	A,#8,FREE4 +	AJMP	OUTR0 +	; +FREE4:	ACALL	OUTR0 +	ACALL	ZTEST		;TEST FOR TRAILING ZEROS +	JZ	U_RET		;DONE IF ALL TRAILING ZEROS +	ACALL	ROUT		;OUTPUT RADIX +	; +FREE2:	MOV	R7,#1		;OUTPUT ONE DIGIT +	ACALL	OUTR0 +	JNZ	U_RET +	ACALL	ZTEST +	JZ	U_RET +	SJMP	FREE2		;LOOP +	; +EXPOUT:	ACALL	SINOUT		;PRINT THE SIGN +	MOV	R7,#1		;OUTPUT ONE CHARACTER +	ACALL	OUTR0 +	ACALL	ROUT		;OUTPUT RADIX +	MOV	A,R3		;GET FORMAT +	ANL	A,#0FH		;STRIP INDICATOR +	JZ	EXPOTX +	; +	MOV	R7,A		;OUTPUT THE NUMBER OF DIGITS +	DEC	R7		;ADJUST BECAUSE ONE CHAR ALREADY OUT +	ACALL	OUTR0 +	SJMP	EXPOT4 +	; +EXPOTX:	ACALL	FREE2		;OUTPUT UNTIL TRAILING ZEROS +	; +EXPOT4:	ACALL	SOUT		;OUTPUT A SPACE +	MOV	R5,#'E' +	ACALL	SOUT1		;OUTPUT AN E +	MOV	A,R6		;GET THE EXPONENT +	JZ	XOUT0		;EXIT IF ZERO +	DEC	A		;ADJUST FOR THE DIGIT ALREADY OUTPUT +	CJNE	A,#80H,XOUT2	;SEE WHAT IT IS +	; +XOUT0:	ACALL	SOUT +	CLR	A +	SJMP	XOUT4 +	; +XOUT2:	JC	XOUT3		;NEGATIVE EXPONENT +	MOV	R5,#'+'		;OUTPUT A PLUS SIGN +	ACALL	SOUT1 +	SJMP	XOUT4 +	; +XOUT3:	ACALL	MOUT +	CPL	A		;FLIP BITS +	INC	A		;BUMP +	; +XOUT4:	CLR	ACC.7 +	MOV	R0,A +	MOV	R2,#0 +	MOV	R1,#LO(CONVT)	;CONVERSION LOCATION +	MOV	R3,#HI(CONVT) +	ACALL	CONVERT_BINARY_TO_ASCII_STRING +	MOV	R0,#LO(CONVT)	;NOW, OUTPUT EXPONENT +	; +EXPOT5:	MOVX	A,@R0		;GET THE CHARACTER +	MOV	R5,A		;OUTPUT IT +	ACALL	SOUT1 +	INC	R0		;BUMP THE POINTER +	MOV	A,R0		;GET THE POINTER +	CJNE	A,R1B0,EXPOT5	;LOOP +	; +U_RET:	RET			;EXIT +	; +OUTR0:	; Output the characters pointed to by R0, also bias ascii +	; +	MOV	A,R7		;GET THE COUNTER +	JZ	OUTR		;EXIT IF DONE +	MOV	A,@R0		;GET THE NUMBER +	ORL	A,#30H		;ASCII BIAS +	INC	R0		;BUMP POINTER AND COUNTER +	DEC	R7 +	MOV	R5,A		;PUT CHARACTER IN OUTPUT REGISTER +	ACALL	SOUT1		;OUTPUT THE CHARACTER +	CLR	A		;JUST FOR TEST +	CJNE	R0,#FP_NIB8+1,OUTR0 +	MOV	A,#55H		;KNOW WHERE EXIT OCCURED +	; +OUTR:	RET +	; +ZTEST:	MOV	R1,R0B0		;GET POINTER REGISTER +	; +ZT0:	MOV	A,@R1		;GET THE VALUE +	JNZ	ZT1 +	INC	R1		;BUMP POINTER +	CJNE	R1,#FP_NIB8+1,ZT0 +	; +ZT1:	RET +	; +NUM_LT:	MOV	A,R6		;GET EXPONENT +	CLR	C		;GET READY FOR SUBB +	SUBB	A,#80H		;SUB EXPONENT BIAS +	JNC	NL1		;OK IF NO CARRY +	CLR	A		;NO DIGITS LEFT +	; +NL1:	MOV	R7,A		;SAVE THE COUNT +	RET +	; +NUM_RT:	CLR	C		;SUBB AGAIN +	MOV	A,#80H		;EXPONENT BIAS +	SUBB	A,R6		;GET THE BIASED EXPONENT +	JNC	NR1 +	CLR	A +	; +NR1:	RET			;EXIT +	; +SPACE7:	MOV	A,R7		;GET THE NUMBER OF SPACES +	JZ	NR1		;EXIT IF ZERO +	ACALL	SOUT		;OUTPUT A SPACE +	DEC	R7		;BUMP COUNTER +	SJMP	SPACE7		;LOOP +	; +Z7R7:	MOV	R7,A +	; +ZERO7:	MOV	A,R7		;GET COUNTER +	JZ	NR1		;EXIT IF ZERO +	ACALL	ZOUT		;OUTPUT A ZERO +	DEC	R7		;BUMP COUNTER +	SJMP	ZERO7		;LOOP +	; +SS7:	ACALL	SPACE7 +	; +SINOUT:	MOV	A,R4		;GET THE SIGN +	JZ	SOUT		;OUTPUT A SPACE IF ZERO +	; +MOUT:	MOV	R5,#'-' +	SJMP	SOUT1		;OUTPUT A MINUS IF NOT +	; +ROUT:	MOV	R5,#'.'		;OUTPUT A RADIX +	SJMP	SOUT1 +	; +ZOUT:	MOV	R5,#'0'		;OUTPUT A ZERO +	SJMP	SOUT1 +	; +SOUT:	MOV	R5,#' '		;OUTPUT A SPACE +	; +SOUT1:	AJMP	OUTPUT +	; +	newpage +	;*************************************************************** +	; +CONVERT_ASCII_STRING_TO_BINARY: +	; +	;DPTR POINTS TO ASCII STRING +	;PUT THE BINARY NUMBER IN R2:R0, ERROR IF >64K +	; +	;*************************************************************** +	; +CASB:	ACALL	HEXSCAN		;SEE IF HEX NUMBER +	MOV	ADD_IN,C	;IF ADD_IN IS SET, THE NUMBER IS HEX +	ACALL	GET_DIGIT_CHECK +	CPL	C		;FLIP FOR EXIT +	JC	RCASB +	MOV	R3,#00H		;ZERO R3:R1 FOR LOOP +	MOV	R1,#00H +	SJMP	CASB5 +	; +CASB2:	INC	DPTR +	MOV	R0B0,R1		;SAVE THE PRESENT CONVERTED VALUE +	MOV	R0B0+2,R3	;IN R2:R0 +	ACALL	GET_DIGIT_CHECK +	JC	CASB5 +	JNB	ADD_IN,RCASB	;CONVERSION COMPLETE +	ACALL	HEX_CHECK	;SEE IF HEX NUMBER +	JC	CASB4		;PROCEED IF GOOD +	INC	DPTR		;BUMP PAST H +	SJMP	RCASB +	; +CASB4:	ADD	A,#9		;ADJUST HEX ASCII BIAS +	; +CASB5:	MOV	B,#10 +	JNB	ADD_IN,CASB6 +	MOV	B,#16		;HEX MODE +	; +CASB6:	ACALL	MULNUM		;ACCUMULATE THE DIGITS +	JNC	CASB2		;LOOP IF NO CARRY +	; +RCASB:	CLR	A		;RESET ACC +	MOV	ACC_OVERFLOW,C	;IF OVERFLOW, SAY SO ******AA +	RET			;EXIT +	; +	newpage +	; +MULNUM10:MOV	B,#10 +	; +	;*************************************************************** +	; +MULNUM:	; Take the next digit in the acc (masked to 0FH) +	; accumulate in R3:R1 +	; +	;*************************************************************** +	; +	PUSH	ACC		;SAVE ACC +	PUSH	B		;SAVE MULTIPLIER +	MOV	A,R1		;PUT LOW ORDER BITS IN ACC +	MUL	AB		;DO THE MULTIPLY +	MOV	R1,A		;PUT THE RESULT BACK +	MOV	A,R3		;GET THE HIGH ORDER BYTE +	MOV	R3,B		;SAVE THE OVERFLOW +	POP	B		;GET THE MULTIPLIER +	MUL	AB		;DO IT +	MOV	C,OV		;SAVE OVERFLOW IN F0 +	MOV	F0,C +	ADD	A,R3		;ADD OVERFLOW TO HIGH RESULT +	MOV	R3,A		;PUT IT BACK +	POP	ACC		;GET THE ORIGINAL ACC BACK +	ORL	C,F0		;OR CARRY AND OVERFLOW +	JC	MULX		;NO GOOD IF THE CARRY IS SET +	; +MUL11:	ANL	A,#0FH		;MASK OFF HIGH ORDER BITS +	ADD	A,R1		;NOW ADD THE ACC +	MOV	R1,A		;PUT IT BACK +	CLR	A		;PROPAGATE THE CARRY +	ADDC	A,R3 +	MOV	R3,A		;PUT IT BACK +	; +MULX:	RET			;EXIT WITH OR WITHOUT CARRY +	; +	;*************************************************************** +	; +CONVERT_BINARY_TO_ASCII_STRING: +	; +	;R3:R1 contains the address of the string +	;R2:R0 contains the value to convert +	;DPTR, R7, R6, and ACC gets clobbered +	; +	;*************************************************************** +	; +	CLR	A		;NO LEADING ZEROS +	MOV	DPTR,#10000	;SUBTRACT 10000 +	ACALL	RSUB		;DO THE SUBTRACTION +	MOV	DPTR,#1000	;NOW 1000 +	ACALL	RSUB +	MOV	DPTR,#100	;NOW 100 +	ACALL	RSUB +	MOV	DPTR,#10	;NOW 10 +	ACALL	RSUB +	MOV	DPTR,#1		;NOW 1 +	ACALL	RSUB +	JZ	RSUB2		;JUMP OVER RET +	; +RSUB_R:	RET +	; +RSUB:	MOV	R6,#-1		;SET UP THE COUNTER +	; +RSUB1:	INC	R6		;BUMP THE COUNTER +	XCH	A,R2		;DO A FAST COMPARE +	CJNE	A,DPH,$+3 +	XCH	A,R2 +	JC	FAST_DONE +	XCH	A,R0		;GET LOW BYTE +	SUBB	A,DPL		;SUBTRACT, CARRY IS CLEARED +	XCH	A,R0		;PUT IT BACK +	XCH	A,R2		;GET THE HIGH BYTE +	SUBB	A,DPH		;ADD THE HIGH BYTE +	XCH	A,R2		;PUT IT BACK +	JNC	RSUB1		;LOOP UNTIL CARRY +	; +	XCH	A,R0 +	ADD	A,DPL		;RESTORE R2:R0 +	XCH	A,R0 +	XCH	A,R2 +	ADDC	A,DPH +	XCH	A,R2 +	; +FAST_DONE: +	; +	ORL	A,R6		;OR THE COUNT VALUE +	JZ	RSUB_R		;RETURN IF ZERO +	; +RSUB2:	MOV	A,#'0'		;GET THE ASCII BIAS +	ADD	A,R6		;ADD THE COUNT +	; +RSUB4:	MOV	P2,R3		;SET UP P2 +	MOVX	@R1,A		;PLACE THE VALUE IN MEMORY +	INC	R1 +	CJNE	R1,#00H,RSUB3	;SEE IF RAPPED AROUND +	INC	R3		;BUMP HIGH BYTE +	; +RSUB3:	RET			;EXIT +	; +	newpage +	;*************************************************************** +	; +HEXOUT:	; Output the hex number in R3:R1, supress leading zeros, if set +	; +	;*************************************************************** +	; +	ACALL	SOUT		;OUTPUT A SPACE +	MOV	C,ZSURP		;GET ZERO SUPPRESSION BIT +	MOV	ADD_IN,C +	MOV	A,R3		;GET HIGH NIBBLE AND PRINT IT +	ACALL	HOUTHI +	MOV	A,R3 +	ACALL	HOUTLO +	; +HEX2X:	CLR	ADD_IN		;DON'T SUPPRESS ZEROS +	MOV	A,R1		;GET LOW NIBBLE AND PRINT IT +	ACALL	HOUTHI +	MOV	A,R1 +	ACALL	HOUTLO +	MOV	R5,#'H'		;OUTPUT H TO INDICATE HEX MODE +	; +SOUT_1:	AJMP	SOUT1 +	; +HOUT1:	CLR	ADD_IN		;PRINTED SOMETHING, SO CLEAR ADD_IN +	ADD	A,#90H		;CONVERT TO ASCII +	DA	A +	ADDC	A,#40H +	DA	A		;GOT IT HERE +	MOV	R5,A		;OUTPUT THE BYTE +	SJMP	SOUT_1 +	; +HOUTHI:	SWAP	A		;SWAP TO OUTPUT HIGH NIBBLE +	; +HOUTLO:	ANL	A,#0FH		;STRIP +	JNZ	HOUT1		;PRINT IF NOT ZERO +	JNB	ADD_IN,HOUT1	;OUTPUT A ZERO IF NOT SUPRESSED +	RET +	; +	newpage +	ORG	1FEBH		;FOR LINK COMPATABILITY +	; +	; +GET_DIGIT_CHECK:	; Get a character, then check for digit +	; +	ACALL	GET_DPTR_CHARACTER +	; +DIGIT_CHECK:	;CHECK FOR A VALID ASCII DIGIT, SET CARRY IF FOUND +	; +	CJNE	A,#'9'+1,$+3	;SEE IF ASCII 9 OR LESS +	JC	DC1 +	RET +	; +DC1:	CJNE	A,#'0',$+3	;SEE IF ASCII 0 OR GREATER +	CPL	C +	RET + +	endsection diff --git a/tests/t_bas52/bas52.out b/tests/t_bas52/bas52.out new file mode 100644 index 0000000..b6a0f80 --- /dev/null +++ b/tests/t_bas52/bas52.out @@ -0,0 +1,75 @@ +	;*************************************************************** +	; +	; TEROT - Output a character to the system console +	;         update PHEAD position. +	; +	;*************************************************************** +	; +STEROT:	MOV	R5,#' '		;OUTPUT A SPACE +	; +TEROT:	PUSH	ACC		;SAVE THE ACCUMULATOR +	PUSH	DPH		;SAVE THE DPTR +	PUSH	DPL +	JNB	CNT_S,$+7	;WAIT FOR A CONTROL Q +	ACALL	BCK		;GET SERIAL STATUS +	SJMP	$-5 +	MOV	A,R5		;PUT OUTPUT BYTE IN A +	JNB	BO,$+8		;CHECK FOR MONITOR +	LCALL	2040H		;DO THE MONITOR +	AJMP	TEROT1		;CLEAN UP +	JNB	COUB,$+8	;SEE IF USER WANTS OUTPUT +	LCALL	4030H +	AJMP	TEROT1 +	JNB	UPB,T_1		;NO AT IF NO XBIT +	JNB	LPB,T_1		;AT PRINT +	LCALL	403CH		;CALL AT LOCATION +	AJMP	TEROT1		;FINISH OFF OUTPUT +	; +T_1:	JNB	COB,TXX		;SEE IF LIST SET +	MOV	DPTR,#SPV	;LOAD BAUD RATE +	ACALL	LD_T +	CLR	LP		;OUTPUT START BIT +	ACALL	TIMER_LOAD	;LOAD AND START THE TIMER +	MOV	A,R5		;GET THE OUTPUT BYTE +	SETB	C		;SET CARRY FOR LAST OUTPUT +	MOV	R5,#9		;LOAD TIMER COUNTDOWN +	; +LTOUT1:	RRC	A		;ROTATE A +	JNB	TF1,$		;WAIT TILL TIMER READY +	MOV	LP,C		;OUTPUT THE BIT +	ACALL	TIMER_LOAD	;DO THE NEXT BIT +	DJNZ	R5,LTOUT1	;LOOP UNTIL DONE +	JNB	TF1,$		;FIRST STOP BIT +	ACALL	TIMER_LOAD +	JNB	TF1,$		;SECOND STOP BIT +	MOV	R5,A		;RESTORE R5 +	SJMP	TEROT1		;BACK TO TEROT +	; +	newpage +TXX:	JNB	TI,$		;WAIT FOR TRANSMIT READY +	CLR	TI +	MOV	SBUF,R5		;SEND OUT THE CHARACTER +	; +TEROT1:	CJNE	R5,#CR,$+6	;SEE IF A CR +	MOV	PHEAD,#00H	;IF A CR, RESET PHEAD AND +	; +	CJNE	R5,#LF,NLC	;SEE IF A LF +	MOV	A,NULLCT	;GET THE NULL COUNT +	JZ	NLC		;NO NULLS IF ZERO +	; +TEROT2:	MOV	R5,#NULL	;PUT THE NULL IN THE OUTPUT REGISTER +	ACALL	TEROT		;OUTPUT THE NULL +	DEC	A		;DECREMENT NULL COUNT +	JNZ	TEROT2		;LOOP UNTIL DONE +	; +NLC:	CJNE	R5,#BS,$+5	;DEC PHEAD IF A BACKSPACE +	DEC	PHEAD +	CJNE	R5,#20H,$+3	;IS IT A PRINTABLE CHARACTER? +	JC	$+4		;DON'T INCREMENT PHEAD IF NOT PRINTABLE +	INC	PHEAD		;BUMP PRINT HEAD +	POP	DPL		;RESTORE DPTR +	POP	DPH +	POP	ACC		;RESTORE ACC +	RET			;EXIT +	; + diff --git a/tests/t_bas52/bas52.pgm b/tests/t_bas52/bas52.pgm new file mode 100644 index 0000000..080d43f --- /dev/null +++ b/tests/t_bas52/bas52.pgm @@ -0,0 +1,125 @@ + +PG8:	MOV	R7,#00H		;PROGRAM ONE BYTE AT A TIME +	MOV	R6,#01H +	MOV	R2,#HI(ROMADR-1) +	MOV	R0,#LO(ROMADR-1);LOAD PROM ADDRESS +	ACALL	PG1+3 +	INC	R6 +	DB	0E5H		;MOV A DIRECT OP CODE +	DB	0CBH		;ADDRESS OF R2CAP HIGH +	ACALL	PG1+3 +	DB	0E5H		;MOV A, DIRECT OP CODE +	DB	0CAH		;R2CAP LOW +	MOV	R6,#3 +	MOV	R1,#LO(MEMTOP-1) +	MOV	R3,#HI(MEMTOP) +	ACALL	PG1+3		;SAVE MEMTOP +	SJMP	PGR +	; +CIPROG:	MOV	DPTR,#IPROGS	;LOAD IPROG LOCATION +	SETB	INTELB +	SJMP	$+7		;GO DO PROG +	; +CPROG:	MOV	DPTR,#PROGS	;LOAD PROG LOCATION +	CLR	INTELB +	; +	ACALL	LD_T		;LOAD THE TIMER +	CLR	PROMV		;TURN ON THE PROM VOLTAGE +	LCALL	DELTST		;SEE IF A CR ******AA CALL-->LCALL +	JNZ	PG8		;SAVE TIMER IF SO +	MOV	R4,#0FEH +	SETB	INBIT +	ACALL	ROMFD		;GET THE ROM ADDRESS OF THE LAST LOCATION +	LCALL	TEMPD		;SAVE THE ADDRESS ******AA CALL-->LCALL +	MOV	A,R4		;GET COUNT +	CPL	A +	LCALL	TWO_R2		;PUT IT ON THE STACK ******AA CALL-->LCALL +	CALL	FP_BASE+14	;OUTPUT IT +	ACALL	CCAL		;GET THE PROGRAM +	ACALL	CRLF		;DO CRLF +	MOV	R0,TEMP4	;GET ADDRESS +	MOV	R2,TEMP5 +	MOV	A,#55H		;LOAD SIGNIFIER +	INC	R6		;LOAD LEN + 1 +	CJNE	R6,#00,$+4 +	INC	R7 +	ACALL	PG2-2 +	; +	newpage +PGR:	SETB	PROMV +	AJMP	C_K +	; +PG1:	MOV	P2,R3		;GET THE BYTE TO PROGRAM +	MOVX	A,@R1 +	LCALL	INC3210		;BUMP POINTERS +	MOV	R5,#1		;SET UP INTELLIGENT COUMTER +	; +PG2:	MOV	R4,A		;SAVE THE BYTE IN R4 +	ACALL	PG7		;PROGRAM THE BYTE +	ACALL	PG9 +	JB	INTELB,PG4	;SEE IF INTELLIGENT PROGRAMMING +	; +PG3:	XRL	A,R4 +	JNZ	PG6		;ERROR IF NOT THE SAME +	LCALL	DEC76		;BUMP THE COUNTERS ******AA CALL-->LCALL +	JNZ	PG1		;LOOP IF NOT DONE +	ANL	PSW,#11100111B	;INSURE RB0 +	RET +	; +PG4:	XRL	A,R4		;SEE IF PROGRAMMED +	JNZ	PG5		;JUMP IF NOT +	MOV	A,R4		;GET THE DATA BACK +	ACALL	PG7		;PROGRAM THE LOCATION +	ACALL	ZRO		;AGAIN +	ACALL	ZRO		;AND AGAIN +	ACALL	ZRO		;AND AGAIN +	DJNZ	R5,$-6		;KEEP DOING IT +	ACALL	PG9		;RESET PROG +	SJMP	PG3		;FINISH THE LOOP +	; +PG5:	INC	R5		;BUMP THE COUNTER +	MOV	A,R4		;GET THE BYTE +	CJNE	R5,#25,PG2	;SEE IF TRIED 25 TIMES +	; +PG6:	SETB	PROMV		;TURN OFF PROM VOLTAGE +	MOV	PSW,#0		;INSURE RB0 +	JNB	DIRF,PG4-1	;EXIT IF IN RUN MODE +	MOV	DPTR,#E16X	;PROGRAMMING ERROR +	; +ERRLK:	LJMP	ERROR		;PROCESS THE ERROR +	; +	newpage +PG7:	MOV	P0,R0		;SET UP THE PORTS +	MOV	P2,R2		;LATCH LOW ORDER ADDRESS +	ACALL	PG11		;DELAY FOR 8748/9 +	CLR	ALED +	MOV	P0,A		;PUT DATA ON THE PORT +	; +ZRO:	NOP			;SETTLEING TIME + FP ZERO +	NOP +	NOP +	NOP +	NOP +	NOP +	ACALL	PG11		;DELAY A WHILE +	CLR	PROMP		;START PROGRAMMING +	ACALL	TIMER_LOAD	;START THE TIMER +	JNB	TF1,$		;WAIT FOR PART TO PROGRAM +	RET			;EXIT +	; +PG9:	SETB	PROMP +	ACALL	PG11		;DELAY FOR A WHILE +	JNB	P3.2,$		;LOOP FOR EEPROMS +	MOV	P0,#0FFH +	CLR	P3.7		;LOWER READ +	ACALL	PG11 +	MOV	A,P0		;READ THE PORT +	SETB	P3.7 +	SETB	ALED +	RET +	; +PG11:	MOV	TEMP5,#12	;DELAY 30uS AT 12 MHZ +	DJNZ	TEMP5,$ +	RET +	; + diff --git a/tests/t_bas52/bas52.pwm b/tests/t_bas52/bas52.pwm new file mode 100644 index 0000000..44ac409 --- /dev/null +++ b/tests/t_bas52/bas52.pwm @@ -0,0 +1,25 @@ +	;************************************************************** +	; +STONE:	; Toggle the I/O port +	; +	;************************************************************** +	; +	CALL	THREE		;GET THE NUMBERS +	ACALL	CBIAS		;BIAS R3:R1 FOR COUNT LOOP +	; +STONE1:	CLR	T_BIT		;TOGGLE THE BIT +	CLR	TR1		;STOP THE TIMER +	MOV	TH1,R3		;LOAD THE TIMER +	MOV	TL1,R1 +	CLR	TF1		;CLEAR THE OVERFLOW FLAG +	SETB	TR1		;TURN IT ON +	ACALL	DEC76 +	JNB	TF1,$		;WAIT +	ACALL	ALPAR +	SETB	T_BIT		;BACK TO A ONE +	CALL	TIMER_LOAD+2	;LOAD THE HIGH VALUE +	JNB	TF1,$		;WAIT +	JNZ	STONE1		;LOOP +	RET +	; + diff --git a/tests/t_bas52/bas52.rst b/tests/t_bas52/bas52.rst new file mode 100644 index 0000000..2d2f13a --- /dev/null +++ b/tests/t_bas52/bas52.rst @@ -0,0 +1,111 @@ + +	;************************************************************** +	; +CRST:	; This performs system initialzation, it was moved here so the +	; new power on reset functions could be tested in an 8751. +	; +	;************************************************************** +	; +	; First, initialize SFR's +	; +	MOV	SCON,#5AH	;INITIALIZE SFR'S +	MOV	TMOD,#10H +	MOV	TCON,#54H +	DB	75H		;MOV DIRECT, # OP CODE +	DB	0C8H		;T2CON LOCATION +	DB	34H		;CONFIGURATION BYTE +	; +	MOV	DPTR,#2001H	;READ CODE AT 2001H +	CLR	A +	MOVC	A,@A+DPTR +	CJNE	A,#0AAH,$+6	;IF IT IS AN AAH, DO USER RESET +	LCALL	2090H +	; +	MOV	R0,#IRAMTOP	;PUT THE TOP OF RAM IN R0 +	CLR	A		;ZERO THE ACC +	; +	MOV	@R0,A		;CLEAR INTERNAL MEMORY +	DJNZ	R0,$-1		;LOOP TIL DONE +	; +	; Now, test the external memory +	; +	MOV	SPSAV,#CMNDSP	;SET UP THE STACK +	MOV	SP,SPSAV +	; +	MOV	BOFAH,#HI(ROMADR) +	MOV	BOFAL,#LO(ROMADR+17) +	MOV	DPTR,#ROMADR	;GET THE BYTE AT 8000H +	MOVX	A,@DPTR +	CLR	C +	SUBB	A,#31H		;FOR BIAS +	MOV	MT1,A		;SAVE IN DIRECT MATH LOC +	CLR	ACC.2		;SAVE FOR RESET +	MOV	R7,A		;SAVE IT IN R7 +	INC	DPTR +	ACALL	L31DPI		;SAVE BAUD RATE +	LCALL	RCL +	INC	DPTR		;GET MEMTOP +	ACALL	L31DPI +	MOV	DPTR,#5FH	;READ THE EXTERNAL BYTE +	MOVX	A,@DPTR +	MOV	DPTR,#0		;ESTABLISH BASE FOR CLEAR +	CJNE	A,#0A5H,CRS +	MOV	A,MT1 +	CLR	ACC.0		;CLEAR BIT ONE +	XRL	A,#4H +	JZ	CR2 +	; +CRS:	CJNE	R7,#2,$+5 +	SJMP	$+5 +	CJNE	R7,#3,$+7 +	ACALL	CL_1 +	SJMP	CR1 +	; +CR0:	MOV	R3,DPH		;SAVE THE DPTR +	MOV	R1,DPL +	INC	DPTR +	MOV	A,#5AH +	MOVX	@DPTR,A +	MOVX	A,@DPTR +	CJNE	A,#5AH,CR1 +	CLR	A +	MOVX	@DPTR,A +	CJNE	R3,#0E0H,CR0 +	; +CR1:	CJNE	R3,#03H,$+3	;NEED THIS MUCH RAM +	JC	CRST +	MOV	DPTR,#MEMTOP	;SAVE MEMTOP +	ACALL	S31DP2		;SAVE MEMTOP AND SEED RCELL +	ACALL	CNEW		;CLEAR THE MEMORY AND SET UP POINTERS +	; +CR2:	ACALL	RC1		;SET UP STACKS IF NOT DONE +	; +	LCALL	AXTAL0		;DO THE CRYSTAL +	MOV	A,MT1		;GET THE RESET BYTE +	CJNE	A,#5,$+6 +	LCALL	4039H +	JNC	BG1		;CHECK FOR 0,1,2,3, OR 4 +	JNB	ACC.0,BG3	;NO RUN IF WRONG TYPE +	MOV	DPTR,#ROMADR+16 +	MOVX	A,@DPTR		;READ THE BYTE +	CJNE	A,#55H,BG3 +	LJMP	CRUN +	; +BG1:	CLR	A		;DO BAUD RATE +	MOV	R3,A +	MOV	R1,A +	MOV	R0,#4 +	JB	RXD,$		;LOOP UNTIL A CHARACTER IS RECEIVED +	; +BG2:	DJNZ	R0,$		;FOUR CLOCKS, IN LOOP +	LCALL	DEC3210+4	;NINE CLOCKS ******AA CALL-->LCALL +	MOV	R0,#2		;ONE CLOCK +	JNB	RXD,BG2		;TWO CLOCKS, LOOP UNTIL DONE +	JB	RXD,$		;WAIT FOR STOP CHARACTER TO END +	JNB	RXD,$ +	LCALL	RCL		;LOAD THE TIMER ******AA CALL-->LCALL +	; +BG3:	MOV	DPTR,#S_N	;GET THE MESSAGE +	ACALL	CRP		;PRINT IT +	LJMP	CRAM + diff --git a/tests/t_bas52/bas52.tl b/tests/t_bas52/bas52.tl new file mode 100644 index 0000000..fdf95da --- /dev/null +++ b/tests/t_bas52/bas52.tl @@ -0,0 +1,16 @@ + +	;************************************************************** +	; +TIMER_LOAD:; Load the timer +	; +	;************************************************************* +	; +	ACALL	$-1		;DELAY FOUR CLOCKS +	CLR	TR1		;STOP IT WHILE IT'S LOADED +	MOV	TH1,T_HH +	MOV	TL1,T_LL +	CLR	TF1		;CLEAR THE OVERFLOW FLAG +	SETB	TR1		;START IT NOW +	RET +	; + diff --git a/tests/t_bas52/look52.inc b/tests/t_bas52/look52.inc new file mode 100644 index 0000000..b4d13f4 --- /dev/null +++ b/tests/t_bas52/look52.inc @@ -0,0 +1,779 @@ +	;************************************************************** +	; +	; This is the equate table for 8052 basic. +	; +	;************************************************************** +	; +	; The register to direct equates for CJNE instructions. +	; +R0B0	EQU	0 +R1B0	EQU	1 +R2B0	EQU	2 +R3B0	EQU	3 +R4B0	EQU	4 +R5B0	EQU	5 +R6B0	EQU	6 +R7B0	EQU	7 +	; +	; Register bank 1 contains the text pointer +	; and the arg stack pointer. +	; +TXAL	EQU	8		;R0 BANK 1 = TEXT POINTER LOW +ASTKA	EQU	9		;R1 BANK 1 = ARG STACK +TXAH	EQU	10		;R2 BANK 1 = TEXT POINTER HIGH +	; +	; Now five temporary locations that are used by basic. +	; +TEMP1	EQU	11 +TEMP2	EQU	12 +TEMP3	EQU	13 +TEMP4	EQU	14 +TEMP5	EQU	15 +	; +	newpage +	; Register bank 2 contains the read text pointer +	; and the control stack pointer. +	; +RTXAL	EQU	16		;R0 BANK 2 = READ TEXT POINTER LOW +CSTKA	EQU	17		;R1 BANK 2 = CONTROL STACK POINTER +RTXAH	EQU	18		;R2 BANK 2 = READ TEXT POINTER HIGH +	; +	; Now some internal system equates. +	; +BOFAH	EQU	19		;START OF THE BASIC PROGRAM, HIGH BYTE +BOFAL	EQU	20		;START OF THE BASIC PROGRAM, LOW BYTE +NULLCT	EQU	21		;NULL COUNT +PHEAD	EQU	22		;PRINT HEAD POSITION +FORMAT	EQU	23 +	; +	; Register bank 3 is for the user and can be loaded +	; by basic +	; +	; +	; +	; Now everything else is used by basic. +	; First the bit locations, these use bytes 34, 35, 36, 37 and 38 +	; +	newpage +OTS		BIT	16	;34.0-ON TIME INSTRUCTION EXECUTED +INPROG		BIT	17	;34.1-INTERRUPT IN PROCESS +INTBIT		BIT	18	;34.2-INTERRUPT SET BIT +ON_ERR		BIT	19	;34.3-ON ERROR EXECUTED +OTI		BIT	20	;34.4-ON TIME INTERRUPT IN PROGRESS +LINEB		BIT	21	;34.5-LINE CHANGE OCCURED +INTPEN		BIT	22	;34.6-INTERRUPT PENDING BIT +CONB		BIT	23	;34.7-CAN CONTINUE IF SET +GTRD		BIT	24	;35.0-READ GET LOCATION +LPB		BIT	25	;35.1-PRINT TO LINE PRINTER PORT +CKS_B		BIT	26	;35.2-FOR PWM INTERRUPT +COB		BIT	27	;35.3-CONSOLE OUT BIT +				;     0 = SERIAL PORT +				;     1 = LINE PRINTER +COUB		BIT	28	;35.4-USER CONSOLE OUT BIT +				;     0 = SERIAL PORT +				;     1 = USER DRIVER +INBIT		BIT	29	;35.5-INITIALIZATION BIT +CIUB		BIT	30	;35.6-USER CONSOLE IN BIT +				;     0 = SERIAL PORT +				;     1 = USER ROUTINE +SPINT		BIT	31	;35.7-SERIAL PORT INTERRUPT +STOPBIT		BIT	32	;36.0-PROGRAM STOP ENCOUNTERED +U_IDL		BIT	33	;36.1-USER IDLE BREAK +INP_B		BIT	34	;36.2-SET DURING INPUT INSTRUCTION +;DCMPXZ		BIT	35	;36.3-DCMPX ZERO FLAG +ARGF		BIT	36	;36.4-ARG STACK HAS A VALUE +RETBIT		BIT	37	;36.5-RET FROM INTERRUPT EXECUTED +I_T0		BIT	38	;36.6-TRAP INTERRUPT ZERO TO MON +UPB		BIT	39	;36.7-SET WHEN @ IS VALID +JKBIT		BIT	40	;37.0-WB TRIGGER +ENDBIT		BIT	41	;37.1-GET END OF PROGRAM +UBIT		BIT	42	;37.2-FOR DIM STATEMENT +ISAV		BIT	43	;37.3-SAVE INTERRUPT STATUS +BO		BIT	44	;37.4-BUBBLE OUTPUT +XBIT		BIT	45	;37.5-EXTERNAL PROGRAM PRESENT +C_BIT		BIT	46	;37.6-SET WHEN CLOCK RUNNING +DIRF		BIT	47	;37.7-DIRECT INPUT MODE +NO_C		BIT	48	;38.0-NO CONTROL C +DRQ		BIT	49	;38.1-DMA ENABLED +BI		BIT	50	;38.2-BUBBLE INPUT +INTELB		BIT	51	;38.3-INTELLIGENT PROM PROGRAMMING +C0ORX1		BIT	52	;38.4-PRINT FROM ROM OR RAM +CNT_S		BIT	53	;38.5-CONTROL S ENCOUNTERED +ZSURP		BIT	54	;38.6-ZERO SUPRESS +HMODE		BIT	55	;38.7-HEX MODE PRINT +LP		BIT	P1.7	;SOFTWARE LINE PRINTER +DACK		BIT	P1.6	;DMA ACK +PROMV		BIT	P1.5	;TURN ON PROM VOLTAGE +PROMP		BIT	P1.4	;PROM PULSE +ALED		BIT	P1.3	;ALE DISABLE +T_BIT		BIT	P1.2	;I/O TOGGLE BIT +	; +	newpage +	; +	; The next location is a bit addressable byte counter +	; +BABC	EQU	39 +	; +	; Now floating point and the other temps +	; +	; FP Uses to locations 03CH +	; +	; Now the stack designators. +	; +SPSAV	EQU	3EH +S_LEN	EQU	3FH +T_HH	EQU	40H +T_LL	EQU	41H +INTXAH	EQU	42H +INTXAL	EQU	43H +MT1	EQU	45H +MT2	EQU	46H +MILLIV	EQU	47H		;TIMER LOCATIONS +TVH	EQU	48H +TVL	EQU	49H +SAVE_T	EQU	4AH +SP_H	EQU	4BH		;SERIAL PORT TIME OUT +SP_L	EQU	4CH +CMNDSP	EQU	4DH		;SYSTEM STACK POINTER +IRAMTOP	EQU	0FFH		;TOP OF RAM +STACKTP	EQU	0FEH		;ARG AND CONTROL STACK TOPS +	; +	; The character equates +	; +CR	EQU	0DH		;CARRIAGE RETURN +LF	EQU	0AH		;LINE FEED +BELL	EQU	07H		;BELL CHARACTER +BS	EQU	08H		;BACK SPACE +CNTRLC	EQU	03H		;CONTROL C +CNTRLD	EQU	04H		;CONTROL D +NULL	EQU	00H		;NULL +	; +	newpage +	; +	; The internal system equates +	; +LINLEN	EQU	73		;THE LENGTH OF AN INPUT LINE +EOF	EQU	01		;END OF FILE CHARACTER +ASTKAH	EQU	01		;ASTKA IS IN PAGE 1 OF RAM +CSTKAH	EQU	00		;CSTKA IS IN PAGE 0 OF RAM +FTYPE	EQU	01		;CONTROL STACK "FOR" +GTYPE	EQU	02		;CONTROL STACK "GOSUB" +DTYPE	EQU	03		;DO-WHILE/UNTIL TYPE +ROMADR	EQU	8000H		;LOCATION OF ROM +	; +	; The floating point equates +	; +FPSIZ	EQU	6		;NO. OF BYTES IN A FLOATING NUM +DIGIT	EQU	FPSIZ-2		;THE MANTISSA OF A FLOATING NUM +STESIZ	EQU	FPSIZ+3		;SIZE OF SYMBOL ADJUSTED TABLE ELEMENT +FP_BASE	EQU	1993H		;BASE OF FLOATING POINT ROUTINES +PSTART	EQU	512		;START OF A PROGRAM IN RAM +FSIZE	EQU	FPSIZ+FPSIZ+2+2+1 +	; +	newpage +	;************************************************************** +	; +USENT:	; User entry jump table +	; +	;************************************************************** +	; +	DW	CMND1		;(00, 00H)COMMAND MODE JUMP +	DW	IFIX		;(01, 01H)CONVERT FP TO INT +	DW	PUSHAS		;(02, 02H)PUSH VALUE ONTO ARG STACK +	DW	POPAS		;(03, 03H)POP VALUE OFF ARG STACK +	DW	PG1		;(04, 04H)PROGRAM A PROM +	DW	INLINE		;(05, 05H)INPUT A LINE +	DW	UPRNT		;(06, 06H)PRINT A LINR +	DW	CRLF		;(07, 07H)OUTPUT A CRLF +	; +	;************************************************************** +	; +	; This is the operation jump table for arithmetics +	; +	;************************************************************** +	; +OPTAB:	DW	ALPAR		;(08, 08H)LEFT PAREN +	DW	AEXP		;(09, 09H)EXPONENTAION +	DW	AMUL		;(10, 0AH)FP MUL +	DW	AADD		;(11, 0BH)FLOATING POINT ADD +	DW	ADIV		;(12, 0CH)FLOATING POINT DIVIDE +	DW	ASUB		;(13, 0DH)FLOATING POINT SUBTRACTION +	DW	AXRL		;(14, 0EH)XOR +	DW	AANL		;(15, 0FH)AND +	DW	AORL		;(16, 10H)OR +	DW	ANEG		;(17, 11H)NEGATE +	DW	AEQ		;(18, 12H)EQUAL +	DW	AGE		;(19, 13H)GREATER THAN OR EQUAL +	DW	ALE		;(20, 14H)LESS THAN OR EQUAL +	DW	ANE		;(21, 15H)NOT EQUAL +	DW	ALT		;(22, 16H)LESS THAN +	DW	AGT		;(23, 17H)GREATER THAN +	; +	newpage +	;*************************************************************** +	; +	; This is the jump table for unary operators +	; +	;*************************************************************** +	; +	DW	AABS		;(24, 18H)ABSOLUTE VALUE +	DW	AINT		;(25, 19H)INTEGER OPERATOR +	DW	ASGN		;(26, 1AH)SIGN OPERATOR +	DW	ANOT		;(27, 1BH)ONE'S COMPLEMENT +	DW	ACOS		;(28, 1CH)COSINE +	DW	ATAN		;(29, 1DH)TANGENT +	DW	ASIN		;(30, 1EH)SINE +	DW	ASQR		;(31, 1FH)SQUARE ROOT +	DW	ACBYTE		;(32, 20H)READ CODE +	DW	AETOX		;(33, 21H)E TO THE X +	DW	AATAN		;(34, 22H)ARC TANGENT +	DW	ALN		;(35, 23H)NATURAL LOG +	DW	ADBYTE		;(36, 24H)READ DATA MEMORY +	DW	AXBYTE		;(37, 25H)READ EXTERNAL MEMORY +	DW	PIPI		;(38, 26H)PI +	DW	ARND		;(39, 27H)RANDOM NUMBER +	DW	AGET		;(40, 28H)GET INPUT CHARACTER +	DW	AFREE		;(41, 29H)COMPUTE #BYTES FREE +	DW	ALEN		;(42, 2AH) COMPUTE LEN OF PORGRAM +	DW	AXTAL		;(43, 2BH) CRYSTAL +	DW	PMTOP		;(44, 2CH)TOP OF MEMORY +	DW	ATIME		;(45, 2DH) TIME +	DW	A_IE		;(46, 2EH) IE +	DW	A_IP		;(47, 2FH) IP +	DW	ATIM0		;(48, 30H) TIMER 0 +	DW	ATIM1		;(49, 31H) TIMER 1 +	DW	ATIM2		;(50, 32H) TIMER 2 +	DW	AT2CON		;(51, 33H) T2CON +	DW	ATCON		;(52, 34H) TCON +	DW	ATMOD		;(53, 35H) ATMOD +	DW	ARCAP2		;(54, 36H) RCAP2 +	DW	AP1		;(55, 37H) P1 +	DW	APCON		;(56, 38H) PCON +	DW	EXPRB		;(57, 39H) EVALUATE AN EXPRESSION +	DW	AXTAL1		;(58, 3AH) CALCULATE CRYSTAL +	DW	LINE		;(59, 3BH) EDIT A LINE +	DW	PP		;(60, 3CH) PROCESS A LINE +	DW	UPPL-3		;(61, 3DH) UNPROCESS A LINE +	DW	VAR		;(62, 3EH) FIND A VARIABLE +	DW	GC		;(63, 3FH) GET A CHARACTER +	DW	GCI		;(64, 40H) GET CHARACTER AND INCREMENT +	DW	INCHAR		;(65, 41H) INPUT A CHARACTER +	DW	CRUN		;(66, 42H) RUN A PROGRAM +	newpage +OPBOL:	DB	1		; +	; +	DB	15		;LEFT PAREN +	DB	14		;EXPONENTIAN ** +	DB	10		;MUL +	DB	8		;ADD +	DB	10		;DIVIDE +	DB	8		;SUB +	DB	3		;XOR +	DB	5		;AND +	DB	4		;OR +	DB	12		;NEGATE +	DB	6		;EQ +	DB	6		;GT +	DB	6		;LT +	DB	6		;NE +	DB	6		;LE +	DB	6		;GE +	; +UOPBOL:	DB	15		;AABS +	DB	15		;AAINT +	DB	15		;ASGN +	DB	15		;ANOT +	DB	15		;ACOS +	DB	15		;ATAN +	DB	15		;ASIN +	DB	15		;ASQR +	DB	15		;ACBYTE +	DB	15		;E TO THE X +	DB	15		;AATAN +	DB	15		;NATURAL LOG +	DB	15		;DBYTE +	DB	15		;XBYTE +	; +	newpage +	;*************************************************************** +	; +	; The ASCII printed messages. +	; +	;*************************************************************** +	; +STP:	DB	"STOP",'"' +	; +IAN:	DB	"TRY AGAIN",'"' +	; +RDYS:	DB	"READY",'"' +	; +INS:	DB	" - IN LINE ",'"' +	; +	;************************************************************** +	; +	; This is the command jump table +	; +	;************************************************************** +	; +CMNDD:	DW	CRUN		;RUN +	DW	CLIST		;LIST +	DW	CNULL		;NULL +	DW	CNEW		;NEW +	DW	CCONT		;CONTINUE +	DW	CPROG		;PROGRAM A PROM +	DW	CXFER		;TRANSFER FROM ROM TO RAM +	DW	CRAM		;RAM MODE +	DW	CROM		;ROM MODE +	DW	CIPROG		;INTELLIGENT PROM PROGRAMMING +	; +	newpage +	;*************************************************************** +	; +	; This is the statement jump table. +	; +	;************************************************************** +	; +STATD:	; +	DW	SLET		;LET		80H +	DW	SCLR		;CLEAR		81H +	DW	SPUSH		;PUSH VAR	82H +	DW	SGOTO		;GO TO		83H +	DW	STONE		;TONE		84H +	DW	SPH0		;PRINT MODE 0	85H +	DW	SUI		;USER INPUT	86H +	DW	SUO		;USER OUTPUT	87H +	DW	SPOP		;POP VAR	88H +	DW	SPRINT		;PRINT		89H +	DW	SCALL		;CALL		8AH +	DW	SDIMX		;DIMENSION	8BH +	DW	STRING		;STRING ALLO	8CH +	DW	SBAUD		;SET BAUD	8DH +	DW	SCLOCK		;CLOCK		8EH +	DW	SPH1		;PRINT MODE 1   8FH +	; +	; No direct mode from here on +	; +	DW	SSTOP		;STOP		90H +	DW	SOT		;ON TIME	91H +	DW	SONEXT		;ON EXT INT	92H +	DW	SRETI		;RET FROM INT	93H +	DW	S_DO		;DO		94H +	DW	SRESTR		;RESTOR		95H +	DW	WCR		;REM		96H +	DW	SNEXT		;NEXT		97H +	DW	SONERR		;ON ERROR	98H +	DW	S_ON		;ON		99H +	DW	SINPUT		;INPUT		9AH +	DW	SREAD		;READ		9BH +	DW	FINDCR		;DATA		9CH +	DW	SRETRN		;RETURN		9DH +	DW	SIF		;IF		9EH +	DW	SGOSUB		;GOSUB		9FH +	DW	SFOR		;FOR		A0H +	DW	SWHILE		;WHILE		A1H +	DW	SUNTIL		;UNTIL		A2H +	DW	CMND1		;END		A3H +	DW	I_DL		;IDLE		A4H +	DW	ST_A		;STORE AT	A5H +	DW	LD_A		;LOAD AT	A6H +	DW	PGU		;PGM		A7H +	DW	RROM		;RUN A ROM	A9H +	; +	newpage +	;************************************************************** +	; +TOKTAB:	; This is the basic token table +	; +	;************************************************************** +	; +	; First the tokens for statements +	; +	DB	80H		;LET TOKEN +	DB	"LET" +	; +	DB	81H		;CLEAR TOKEN +	DB	"CLEAR" +	; +	DB	82H		;PUSH TOKEN +	DB	"PUSH" +	; +T_GOTO	EQU	83H +	; +	DB	83H		;GO TO TOKEN +	DB	"GOTO" +	; +	DB	84H		;TOGGLE TOKEN +	DB	"PWM" +	; +	DB	85H		;PRINT HEX MODE 0 +	DB	"PH0." +	; +	DB	86H		;USER IN TOKEN +	DB	"UI" +	; +	DB	87H		;USER OUT TOKEN +	DB	"UO" +	; +	DB	88H		;POP TOKEN +	DB	"POP" +	; +	newpage +	DB	89H		;PRINT TOKEN +	DB	"PRINT" +	DB	89H +	DB	"P."		;P. ALSO MEANS PRINT +	DB	89H		;? ALSO +	DB	'?' +	; +	DB	8AH		;CALL TOKEN +	DB	"CALL" +	; +	DB	8BH		;DIMENSION TOKEN +	DB	"DIM" +	; +	DB	8CH		;STRING TOKEN +	DB	"STRING" +	; +	DB	8DH		;SET BAUD RATE +	DB	"BAUD" +	; +	DB	8EH		;CLOCK +	DB	"CLOCK" +	; +	DB	8FH		;PRINT HEX MODE 1 +	DB	"PH1." +	; +T_STOP	EQU	90H		;STOP TOKEN +	DB	T_STOP +	DB	"STOP" +	; +T_DIR	EQU	T_STOP		;NO DIRECT FROM HERE ON +	; +	DB	T_STOP+1	;ON TIMER INTERRUPT +	DB	"ONTIME" +	; +	DB	T_STOP+2	;ON EXTERNAL INTERRUPT +	DB	"ONEX1" +	; +	DB	T_STOP+3	;RETURN FROM INTERRUPT +	DB	"RETI" +	; +	DB	T_STOP+4	;DO TOKEN +	DB	"DO" +	; +	DB	T_STOP+5	;RESTORE TOKEN +	DB	"RESTORE" +	; +	newpage +T_REM	EQU	T_STOP+6	;REMARK TOKEN +	DB	T_REM +	DB	"REM" +	; +	DB	T_REM+1		;NEXT TOKEN +	DB	"NEXT" +	; +	DB	T_REM+2		;ON ERROR TOKEN +	DB	"ONERR" +	; +	DB	T_REM+3		;ON TOKEN +	DB	"ON" +	; +	DB	T_REM+4		;INPUT +	DB	"INPUT" +	; +	DB	T_REM+5		;READ +	DB	"READ" +	; +T_DATA	EQU	T_REM+6		;DATA +	DB	T_DATA +	DB	"DATA" +	; +	DB	T_DATA+1	;RETURN +	DB	"RETURN" +	; +	DB	T_DATA+2	;IF +	DB	"IF" +	; +T_GOSB	EQU	T_DATA+3	;GOSUB +	DB	T_GOSB +	DB	"GOSUB" +	; +	DB	T_GOSB+1	;FOR +	DB	"FOR" +	; +	DB	T_GOSB+2	;WHILE +	DB	"WHILE" +	; +	DB	T_GOSB+3	;UNTIL +	DB	"UNTIL" +	; +	DB	T_GOSB+4	;END +	DB	"END" +	; +	newpage +T_LAST	EQU	T_GOSB+5	;LAST INITIAL TOKEN +	; +T_TAB	EQU	T_LAST		;TAB TOKEN +	DB	T_TAB +	DB	"TAB" +	; +T_THEN	EQU	T_LAST+1	;THEN TOKEN +	DB	T_THEN +	DB	"THEN" +	; +T_TO	EQU	T_LAST+2	;TO TOKEN +	DB	T_TO +	DB	"TO" +	; +T_STEP	EQU	T_LAST+3	;STEP TOKEN +	DB	T_STEP +	DB	"STEP" +	; +T_ELSE	EQU	T_LAST+4	;ELSE TOKEN +	DB	T_ELSE +	DB	"ELSE" +	; +T_SPC	EQU	T_LAST+5	;SPACE TOKEN +	DB	T_SPC +	DB	"SPC" +	; +T_CR	EQU	T_LAST+6 +	DB	T_CR +	DB	"CR" +	; +	DB	T_CR+1 +	DB	"IDLE" +	; +	DB	T_CR+2 +	DB	"ST@" +	; +	DB	T_CR+3 +	DB	"LD@" +	; +	DB	T_CR+4 +	DB	"PGM" +	; +	DB	T_CR+5 +	DB	"RROM" +	; +	newpage +	; Operator tokens +	; +T_LPAR	EQU	0E0H		;LEFT PAREN +	DB	T_LPAR +	DB	'(' +	; +	DB	T_LPAR+1	;EXPONENTIAN +	DB	"**" +	; +	DB	T_LPAR+2	;FP MULTIPLY +	DB	'*' +	; +T_ADD	EQU	T_LPAR+3 +	DB	T_LPAR+3	;ADD TOKEN +	DB	'+' +	; +	DB	T_LPAR+4	;DIVIDE TOKEN +	DB	'/' +	; +T_SUB	EQU	T_LPAR+5	;SUBTRACT TOKEN +	DB	T_SUB +	DB	'-' +	; +	DB	T_LPAR+6	;LOGICAL EXCLUSIVE OR +	DB	".XOR." +	; +	DB	T_LPAR+7	;LOGICAL AND +	DB	".AND." +	; +	DB	T_LPAR+8	;LOGICAL OR +	DB	".OR." +	; +T_NEG	EQU	T_LPAR+9 +	; +T_EQU	EQU	T_LPAR+10	;EQUAL +	DB	T_EQU +	DB	'=' +	; +	DB	T_LPAR+11	;GREATER THAN OR EQUAL +	DB	">=" +	; +	DB	T_LPAR+12	;LESS THAN OR EQUAL +	DB	"<=" +	; +	DB	T_LPAR+13	;NOT EQUAL +	DB	"<>" +	; +	DB	T_LPAR+14	;LESS THAN +	DB	'<' +	; +	DB	T_LPAR+15	;GREATER THAN +	DB	'>' +	; +	; +T_UOP	EQU	0B0H		;UNARY OP BASE TOKEN +	; +	DB	T_UOP		;ABS TOKEN +	DB	"ABS" +	; +	DB	T_UOP+1		;INTEGER TOKEN +	DB	"INT" +	; +	DB	T_UOP+2		;SIGN TOKEN +	DB	"SGN" +	; +	DB	T_UOP+3		;GET TOKEN +	DB	"NOT" +	; +	DB	T_UOP+4		;COSINE TOKEN +	DB	"COS" +	; +	DB	T_UOP+5		;TANGENT TOKEN +	DB	"TAN" +	; +	DB	T_UOP+6		;SINE TOKEN +	DB	"SIN" +	; +	DB	T_UOP+7		;SQUARE ROOT TOKEN +	DB	"SQR" +	; +	DB	T_UOP+8		;CBYTE TOKEN +	DB	"CBY" +	; +	DB	T_UOP+9		;EXP (E TO THE X) TOKEN +	DB	"EXP" +	; +	DB	T_UOP+10 +	DB	"ATN" +	; +	DB	T_UOP+11 +	DB	"LOG" +	; +	DB	T_UOP+12	;DBYTE TOKEN +	DB	"DBY" +	; +	DB	T_UOP+13	;XBYTE TOKEN +	DB	"XBY" +	; +T_ULAST	EQU	T_UOP+14	;LAST OPERATOR NEEDING PARENS +	; +	DB	T_ULAST +	DB	"PI" +	; +	DB	T_ULAST+1	;RND TOKEN +	DB	"RND" +	; +	DB	T_ULAST+2	;GET TOKEN +	DB	"GET" +	; +	DB	T_ULAST+3	;FREE TOKEN +	DB	"FREE" +	; +	DB	T_ULAST+4	;LEN TOKEN +	DB	"LEN" +	; +T_XTAL	EQU	T_ULAST+5	;CRYSTAL TOKEN +	DB	T_XTAL +	DB	"XTAL" +	; +T_MTOP	EQU	T_ULAST+6	;MTOP +	DB	T_MTOP +	DB	"MTOP" +	; +T_IE	EQU	T_ULAST+8	;IE REGISTER +	DB	T_IE +	DB	"IE" +	; +T_IP	EQU	T_ULAST+9	;IP REGISTER +	DB	T_IP +	DB	"IP" +	; +TMR0	EQU	T_ULAST+10	;TIMER 0 +	DB	TMR0 +	DB	"TIMER0" +	; +TMR1	EQU	T_ULAST+11	;TIMER 1 +	DB	TMR1 +	DB	"TIMER1" +	; +TMR2	EQU	T_ULAST+12	;TIMER 2 +	DB	TMR2 +	DB	"TIMER2" +	; +T_TIME	EQU	T_ULAST+7	;TIME +	DB	T_TIME +	DB	"TIME" +	; +TT2C	EQU	T_ULAST+13	;T2CON +	DB	TT2C +	DB	"T2CON" +	; +TTC	EQU	T_ULAST+14	;TCON +	DB	TTC +	DB	"TCON" +	; +TTM	EQU	T_ULAST+15	;TMOD +	DB	TTM +	DB	"TMOD" +	; +TRC2	EQU	T_ULAST+16	;RCAP2 +	DB	TRC2 +	DB	"RCAP2" +	; +T_P1	EQU	T_ULAST+17	;P1 +	DB	T_P1 +	DB	"PORT1" +	; +T_PC	EQU	T_ULAST+18	;PCON +	DB	T_PC +	DB	"PCON" +	; +T_ASC	EQU	T_ULAST+19	;ASC TOKEN +	DB	T_ASC +	DB	"ASC(" +	; +T_USE	EQU	T_ULAST+20	;USING TOKEN +	DB	T_USE +	DB	"USING(" +	DB	T_USE +	DB	"U.(" +	; +T_CHR	EQU	T_ULAST+21	;CHR TOKEN +	DB	T_CHR +	DB	"CHR(" +	; +	newpage +T_CMND	EQU	0F0H		;COMMAND BASE +	; +	DB	0F0H		;RUN TOKEN +	DB	"RUN" +	; +	DB	0F1H		;LIST TOKEN +	DB	"LIST" +	; +	DB	0F2H		;NULL TOKEN +	DB	"NULL" +	; +	DB	0F3H		;NEW TOKEN +	DB	"NEW" +	; +	DB	0F4H		;CONTINUE TOKEN +	DB	"CONT" +	; +	DB	0F5H		;PROGRAM TOKEN +	DB	"PROG" +	; +	DB	0F6H		;TRANSFER TOKEN +	DB	"XFER" +	; +	DB	0F7H		;RAM MODE +	DB	"RAM" +	; +	DB	0F8H		;ROM MODE +	DB	"ROM" +	; +	DB	0F9H		;INTELLIGENT PROM PROGRAMMING +	DB	"FPROG" +	; +	DB	0FFH		;END OF TABLE +	; diff --git a/tests/t_bas52/t_bas52.asm b/tests/t_bas52/t_bas52.asm new file mode 100644 index 0000000..3fff5d8 --- /dev/null +++ b/tests/t_bas52/t_bas52.asm @@ -0,0 +1,4644 @@ +;  December 18, 1986 +;  MS-DOS compatible Source code for MCS BASIC-52 (tm)  +;  Assembles with ASM51 Macro Assembler Version 2.2 +; +;  The following source code does not include the floating point math +;  routines. These are seperately compiled using FP52.SRC. +; +;  Both the BASIC.SRC and FP52.SRC programs assemble into ABSOLUTE  +;  object files, and do not need to be relocated or linked. The FP52  +;  object code and the BASIC object code, when compiled without modification +;  of the source listings, create the same object code that is found on +;  the MCS BASIC-52 Version 1.1 microcontrollers. +; +;  The original source code had 7 "include" files that have been incorporated +;  into this file for ease of assembly.  +;  These 7 files are: LOOK52.SRC, BAS52.RST, BAS52.PGM, BAS52.TL, BAS52.OUT, +;  BAS52.PWM, and BAS52.CLK. +; +; +;                       Intel Corporation, Embedded Controller Operations + +        cpu	8052 + +	page	0 +        newpage + +	include	stddef51.inc +	include bitfuncs.inc +	bigendian on + +	segment	code + +	;************************************************************** +	; +	; TRAP VECTORS TO MONITOR +	; +	; RESET TAG (0AAH) ---------2001H +	; +	; TAG LOCATION (5AH) ------ 2002H +	; +	; EXTERNAL INTERRUPT 0 ---- 2040H +	; +	; COMMAND MODE ENTRY ------ 2048H +	; +	; SERIAL PORT ------------- 2050H +	; +	; MONITOR (BUBBLE) OUTPUT - 2058H +	; +	; MONITOR (BUBBLE) INPUT -- 2060H +	; +	; MONITOR (BUBBLE) CSTS --- 2068H +	; +	; GET USER JUMP VECTOR ---- 2070H +	; +	; GET USER LOOKUP VECTOR -- 2078H +	; +	; PRINT AT VECTOR --------- 2080H +	; +	; INTERRUPT PWM ----------- 2088H +	; +	; EXTERNAL RESET ---------- 2090H +	; +	; USER OUTPUT-------------- 4030H +	; +	; USER INPUT -------------- 4033H +	; +	; USER CSTS --------------- 4036H +	; +	; USER RESET -------------- 4039H +	; +	; USER DEFINED PRINT @ ---  403CH +	; +	;*************************************************************** +	; +	newpage +	;*************************************************************** +	; +	; MCS - 51  -  8K BASIC VERSION 1.1 +	; +	;*************************************************************** +	; +	AJMP	CRST		;START THE PROGRAM +        db	037h		; ******AA inserted  +	; +	ORG	3H +	; +	;*************************************************************** +	; +	;EXTERNAL INTERRUPT 0 +	; +	;*************************************************************** +	; +	JB	DRQ,STQ		;SEE IF DMA IS SET +	PUSH	PSW		;SAVE THE STATUS +	LJMP	4003H		;JUMP TO USER IF NOT SET +	; +	ORG	0BH +	; +	;*************************************************************** +	; +	;TIMER 0 OVERFLOW INTERRUPT +	; +	;*************************************************************** +	; +	PUSH	PSW		;SAVE THE STATUS +	JB	C_BIT,STJ	;SEE IF USER WANTS INTERRUPT +	LJMP	400BH		;EXIT IF USER WANTS INTERRUPTS +	; +	ORG	13H +	; +	;*************************************************************** +	; +	;EXTERNAL INTERRUPT 1 +	; +	;*************************************************************** +	; +	JB	INTBIT,STK +	PUSH	PSW +	LJMP	4013H +	; +	newpage +	; +	ORG	1BH +	; +	;*************************************************************** +	; +	;TIMER 1 OVERFLOW INTERRUPT +	; +	;*************************************************************** +	; +	PUSH	PSW +	LJMP	CKS_I +	; +STJ:	LJMP	I_DR		;DO THE INTERRUPT +	; +	;*************************************************************** +	; +	;SERIAL PORT INTERRUPT +	; +	;*************************************************************** +	; +	ORG	23H +	; +	PUSH	PSW +	JB	SPINT,STU	;SEE IF MONITOR EANTS INTERRUPT +	LJMP	4023H +	; +	ORG	2BH +	; +	;************************************************************** +	; +	;TIMER 2 OVERFLOW INTERRUPT +	; +	;************************************************************** +	; +	PUSH	PSW +	LJMP	402BH +	; +	newpage +	;************************************************************** +	; +	;USER ENTRY +	; +	;************************************************************** +	; +	ORG	30H +	; +	LJMP	IBLK		;LINK TO USER BLOCK +	; +STQ:	JB	I_T0,STS	;SEE IF MONITOR WANTS IT +	CLR	DACK +	JNB	P3.2,$		;WAIT FOR DMA TO END +	SETB	DACK +	RETI +	; +STS:	LJMP	2040H		;GO TO THE MONITOR +	; +STK:	SETB	INTPEN		;TELL BASIC AN INTERRUPT WAS RECEIVED +	RETI +	; +STU:	LJMP	2050H		;SERIAL PORT INTERRUPT +	; +	newpage + +	include look52.inc	; ******AA +	 +EIG:	DB	"EXTRA IGNORED",'"' +	; +EXA:	DB	"A-STACK",'"' +	; +EXC:	DB	"C-STACK",'"' +	; +	newpage + +	include	bas52.rst	; ******AA + +	newpage +	;*************************************************************** +	; +	; CIPROG AND CPROG - Program a prom +	; +	;*************************************************************** +	; +	include	bas52.pgm	; ******AA +	newpage +	;************************************************************** +	; +PGU:	;PROGRAM A PROM FOR THE USER +	; +	;************************************************************** +	; +	CLR	PROMV		;TURN ON THE VOLTAGE +	MOV	PSW,#00011000B	;SELECT RB3 +	ACALL	PG1		;DO IT +	SETB	PROMV		;TURN IT OFF +	RET +	; +	; +	;************************************************************* +	; +CCAL:	; Set up for prom moves +	; R3:R1 gets source +	; R7:R6 gets # of bytes +	; +	;************************************************************* +	; +	ACALL	GETEND		;GET THE LAST LOCATION +	INC	DPTR		;BUMP TO LOAD EOF +	MOV	R3,BOFAH +	MOV	R1,BOFAL	;RESTORE START +	CLR	C		;PREPARE FOR SUBB +	MOV	A,DPL		;SUB DPTR - BOFA > R7:R6 +	SUBB	A,R1 +	MOV	R6,A +	MOV	A,DPH +	SUBB	A,R3 +	MOV	R7,A +	RET +	; +	; +	include	bas52.tl	; ******AA +	newpage +	;*************************************************************** +	; +CROM:	; The command action routine - ROM - Run out of rom +	; +	;*************************************************************** +	; +	CLR	CONB		;CAN'T CONTINUE IF MODE CHANGE +	ACALL	RO1		;DO IT +	; +C_K:	LJMP	CL3		;EXIT +	; +RO1:	LCALL	DELTST		;SEE IF INTGER PRESENT ******AA CALL-->LCALL, INTGER-->DELTST +	MOV	R4,#R1B0	;SAVE THE NUMBER ******AA ABS-->IMM, R0B0-->R0B1 ?!? +	JNC	$+6		; ******AA $+4-->$+6 ??? +	;MOV	R4,#01H		;ONE IF NO INTEGER PRESENT ******AA repl. by next two +	LCALL	ONE		; ******AA  +        MOV	R4,A            ; ******AA +	ACALL	ROMFD		;FIND THE PROGRAM +	CJNE	R4,#0,RFX	;EXIT IF R4 <> 0 +	INC	DPTR		;BUMP PAST TAG +	MOV	BOFAH,DPH	;SAVE THE ADDRESS +	MOV	BOFAL,DPL +	RET +	; +ROMFD:	MOV	DPTR,#ROMADR+16	;START OF USER PROGRAM +	; +RF1:	MOVX	A,@DPTR		;GET THE BYTE +	CJNE	A,#55H,RF3	;SEE IF PROPER TAG +	DJNZ	R4,RF2		;BUMP COUNTER +	; +RFX:	RET			;DPTR HAS THE START ADDRESS +	; +RF2:	INC	DPTR		;BUMP PAST TAG +	ACALL	G5 +	INC	DPTR		;BUMP TO NEXT PROGRAM +	SJMP	RF1		;DO IT AGAIN +	; +RF3:	JBC	INBIT,RFX	;EXIT IF SET +	; +NOGO:	MOV	DPTR,#NOROM +	AJMP	ERRLK +	; +	newpage +	;*************************************************************** +	; +L20DPI:	; load R2:R0 with the location the DPTR is pointing to +	; +	;*************************************************************** +	; +	MOVX	A,@DPTR +	MOV	R2,A +	INC	DPTR +	MOVX	A,@DPTR +	MOV	R0,A +	RET			;DON'T BUMP DPTR +	; +	;*************************************************************** +	; +X31DP:	; swap R3:R1 with DPTR +	; +	;*************************************************************** +	; +	XCH	A,R3 +	XCH	A,DPH +	XCH	A,R3 +	XCH	A,R1 +	XCH	A,DPL +	XCH	A,R1 +	RET +	; +	;*************************************************************** +	; +LD_T:	; Load the timer save location with the value the DPTR is +	; pointing to. +	; +	;**************************************************************** +	; +	MOVX	A,@DPTR +	MOV	T_HH,A +	INC	DPTR +	MOVX	A,@DPTR +	MOV	T_LL,A +	RET +	; +	newpage +	; +	;*************************************************************** +	; +	;GETLIN - FIND THE LOCATION OF THE LINE NUMBER IN R3:R1 +	;         IF ACC = 0 THE LINE WAS NOT FOUND I.E. R3:R1 +	;         WAS TOO BIG, ELSE ACC <> 0 AND THE DPTR POINTS +	;         AT THE LINE THAT IS GREATER THAN OR EQUAL TO THE +	;         VALUE IN R3:R1. +	; +	;*************************************************************** +	; +GETEND:	SETB	ENDBIT		;GET THE END OF THE PROGRAM +	; +GETLIN:	LCALL	DP_B		;GET BEGINNING ADDRESS ******AA CALL-->LCALL +	; +G1:	LCALL	B_C             ; ******AA CALL-->LCALL +	JZ	G3		;EXIT WITH A ZERO IN A IF AT END +	INC	DPTR		;POINT AT THE LINE NUMBER +	JB	ENDBIT,G2	;SEE IF WE WANT TO FIND THE END +	ACALL	DCMPX		;SEE IF (DPTR) = R3:R1 +	ACALL	DECDP		;POINT AT LINE COUNT +	MOVX	A,@DPTR		;PUT LINE LENGTH INTO ACC +	JB	UBIT,G3		;EXIT IF EQUAL +	JC	G3		;SEE IF LESS THAN OR ZERO +	; +G2:	ACALL	ADDPTR		;ADD IT TO DPTR +	SJMP	G1		;LOOP +	; +G3:	CLR	ENDBIT		;RESET ENDBIT +	RET			;EXIT +	; +G4:	MOV	DPTR,#PSTART	;DO RAM +	; +G5:	SETB	ENDBIT +	SJMP	G1		;NOW DO TEST +	; +	newpage +	;*************************************************************** +	; +	; LDPTRI - Load the DATA POINTER with the value it is pointing +	;          to - DPH = (DPTR) , DPL = (DPTR+1) +	; +	; acc gets wasted +	; +	;*************************************************************** +	; +LDPTRI:	MOVX	A,@DPTR		;GET THE HIGH BYTE +	PUSH	ACC		;SAVE IT +	INC	DPTR		;BUMP THE POINTER +	MOVX	A,@DPTR		;GET THE LOW BYTE +	MOV	DPL,A		;PUT IT IN DPL +	POP	DPH		;GET THE HIGH BYTE +	RET			;GO BACK +	; +	;*************************************************************** +	; +	;L31DPI - LOAD R3 WITH (DPTR) AND R1 WITH (DPTR+1) +	; +	;ACC GETS CLOBBERED +	; +	;*************************************************************** +	; +L31DPI:	MOVX	A,@DPTR		;GET THE HIGH BYTE +	MOV	R3,A		;PUT IT IN THE REG +	INC	DPTR		;BUMP THE POINTER +	MOVX	A,@DPTR		;GET THE NEXT BYTE +	MOV	R1,A		;SAVE IT +	RET +	; +	;*************************************************************** +	; +	;DECDP - DECREMENT THE DATA POINTER - USED TO SAVE SPACE +	; +	;*************************************************************** +	; +DECDP2:	ACALL	DECDP +	; +DECDP:	XCH	A,DPL		;GET DPL +	JNZ	$+4		;BUMP IF ZERO +	DEC	DPH +	DEC	A		;DECREMENT IT +	XCH	A,DPL		;GET A BACK +	RET			;EXIT +	; +	newpage +	;*************************************************************** +	; +	;DCMPX - DOUBLE COMPARE - COMPARE (DPTR) TO R3:R1 +	;R3:R1 - (DPTR) = SET CARRY FLAG +	; +	;IF R3:R1 > (DPTR) THEN C = 0 +	;IF R3:R1 < (DPTR) THEN C = 1 +	;IF R3:R1 = (DPTR) THEN C = 0 +	; +	;*************************************************************** +	; +DCMPX:	CLR	UBIT		;ASSUME NOT EQUAL +	MOVX	A,@DPTR		;GET THE BYTE +	CJNE	A,R3B0,D1	;IF A IS GREATER THAN R3 THEN NO CARRY +				;WHICH IS R3<@DPTR = NO CARRY AND +				;R3>@DPTR CARRY IS SET +	INC	DPTR		;BUMP THE DATA POINTER +	MOVX	A,@DPTR		;GET THE BYTE +	ACALL	DECDP		;PUT DPTR BACK +	CJNE	A,R1B0,D1	;DO THE COMPARE +	CPL	C		;FLIP CARRY +	; +	CPL	UBIT		;SET IT +D1:	CPL	C		;GET THE CARRY RIGHT +	RET			;EXIT +	; +	;*************************************************************** +	; +	; ADDPTR - Add acc to the dptr +	; +	; acc gets wasted +	; +	;*************************************************************** +	; +ADDPTR:	ADD	A,DPL		;ADD THE ACC TO DPL +	MOV	DPL,A		;PUT IT IN DPL +	JNC	$+4		;JUMP IF NO CARRY +	INC	DPH		;BUMP DPH +	RET			;EXIT +	; +	newpage +	;************************************************************* +	; +LCLR:	; Set up the storage allocation +	; +	;************************************************************* +	; +	ACALL	ICLR		;CLEAR THE INTERRUPTS +	ACALL	G4		;PUT END ADDRESS INTO DPTR +	MOV	A,#6		;ADJUST MATRIX SPACE +	ACALL	ADDPTR		;ADD FOR PROPER BOUNDS +	ACALL	X31DP		;PUT MATRIX BOUNDS IN R3:R1 +	MOV	DPTR,#MT_ALL	;SAVE R3:R1 IN MATRIX FREE SPACE +	ACALL	S31DP		;DPTR POINTS TO MEMTOP +	ACALL	L31DPI		;LOAD MEMTOP INTO R3:R1 +	MOV	DPTR,#STR_AL	;GET MEMORY ALLOCATED FOR STRINGS +	ACALL	LDPTRI +	LCALL	DUBSUB		;R3:R1 = MEMTOP - STRING ALLOCATION ******AA CALL-->LCALL +	MOV	DPTR,#VARTOP	;SAVE R3:R1 IN VARTOP +	; +	; FALL THRU TO S31DP2 +	; +	;*************************************************************** +	; +	;S31DP - STORE R3 INTO (DPTR) AND R1 INTO (DPTR+1) +	; +	;ACC GETS CLOBBERED +	; +	;*************************************************************** +	; +S31DP2:	ACALL	S31DP		;DO IT TWICE +	; +S31DP:	MOV	A,R3		;GET R3 INTO ACC +	MOVX	@DPTR,A		;STORE IT +	INC	DPTR		;BUMP DPTR +	MOV	A,R1		;GET R1 +	MOVX	@DPTR,A		;STORE IT +	INC	DPTR		;BUMP IT AGAIN TO SAVE PROGRAM SPACE +	RET			;GO BACK +	; +	; +	;*************************************************************** +	; +STRING:	; Allocate memory for strings +	; +	;*************************************************************** +	; +	LCALL	TWO		;R3:R1 = NUMBER, R2:R0 = LEN +	MOV	DPTR,#STR_AL	;SAVE STRING ALLOCATION +	ACALL	S31DP +	INC	R6		;BUMP +	MOV	S_LEN,R6	;SAVE STRING LENGTH +	AJMP	RCLEAR		;CLEAR AND SET IT UP +	; +	newpage +	;*************************************************************** +	; +	; F_VAR - Find  the variable in symbol table +	;         R7:R6 contain the variable name +	;         If not found create a zero entry and set the carry +	;         R2:R0 has the address of variable on return +	; +	;*************************************************************** +	; +F_VAR:	MOV	DPTR,#VARTOP	;PUT VARTOP IN DPTR +	ACALL	LDPTRI +	ACALL	DECDP2		;ADJUST DPTR FOR LOOKUP +	; +F_VAR0:	MOVX	A,@DPTR		;LOAD THE VARIABLE +	JZ	F_VAR2		;TEST IF AT THE END OF THE TABLE +	INC	DPTR		;BUMP FOR NEXT BYTE +	CJNE	A,R7B0,F_VAR1	;SEE IF MATCH +	MOVX	A,@DPTR		;LOAD THE NAME +	CJNE	A,R6B0,F_VAR1 +	; +	; Found the variable now adjust and put in R2:R0 +	; +DLD:	MOV	A,DPL		;R2:R0 = DPTR-2 +	SUBB	A,#2 +	MOV	R0,A +	MOV	A,DPH +	SUBB	A,#0		;CARRY IS CLEARED +	MOV	R2,A +	RET +	; +F_VAR1:	MOV	A,DPL		;SUBTRACT THE STACK SIZE+ADJUST +	CLR	C +	SUBB	A,#STESIZ +	MOV	DPL,A		;RESTORE DPL +	JNC	F_VAR0 +	DEC	DPH +	SJMP	F_VAR0		;CONTINUE COMPARE +	; +	newpage +	; +	; Add the entry to the symbol table +	; +F_VAR2:	LCALL	R76S		;SAVE R7 AND R6 +	CLR	C +	ACALL	DLD		;BUMP THE POINTER TO GET ENTRY ADDRESS +	; +	; Adjust pointer and save storage allocation +	; and make sure we aren't wiping anything out +	; First calculate new storage allocation +	; +	MOV	A,R0 +	SUBB	A,#STESIZ-3	;NEED THIS MUCH RAM +	MOV	R1,A +	MOV	A,R2 +	SUBB	A,#0 +	MOV	R3,A +	; +	; Now save the new storage allocation +	; +	MOV	DPTR,#ST_ALL +	CALL	S31DP		;SAVE STORAGE ALLOCATION +	; +	; Now make sure we didn't blow it, by wiping out MT_ALL +	; +	ACALL	DCMPX		;COMPARE STORAGE ALLOCATION +	JC	CCLR3		;ERROR IF CARRY +	SETB	C		;DID NOT FIND ENTRY +	RET			;EXIT IF TEST IS OK +	; +	newpage +	;*************************************************************** +	; +	; Command action routine - NEW +	; +	;*************************************************************** +	; +CNEW:	MOV	DPTR,#PSTART	;SAVE THE START OF PROGRAM +	MOV	A,#EOF		;END OF FILE +	MOVX	@DPTR,A		;PUT IT IN MEMORY +	; +	; falls thru +	; +	;***************************************************************** +	; +	; The statement action routine - CLEAR +	; +	;***************************************************************** +	; +	CLR	LINEB		;SET UP FOR RUN AND GOTO +	; +RCLEAR:	ACALL	LCLR		;CLEAR THE INTERRUPTS, SET UP MATRICES +	MOV	DPTR,#MEMTOP	;PUT MEMTOP IN R3:R1 +	ACALL	L31DPI +	ACALL	G4		;DPTR GETS END ADDRESS +	ACALL	CL_1		;CLEAR THE MEMORY +	; +RC1:	MOV	DPTR,#STACKTP	;POINT AT CONTROL STACK TOP +	CLR	A		;CONTROL UNDERFLOW +	; +RC2:	MOVX	@DPTR,A		;SAVE IN MEMORY +	MOV	CSTKA,#STACKTP +	MOV	ASTKA,#STACKTP +	CLR	CONB		;CAN'T CONTINUE +	RET +	; +	newpage +	;*************************************************************** +	; +	; Loop until the memory is cleared +	; +	;*************************************************************** +	; +CL_1:	INC	DPTR		;BUMP MEMORY POINTER +	CLR	A		;CLEAR THE MEMORY +	MOVX	@DPTR,A		;CLEAR THE RAM +	MOVX	A,@DPTR		;READ IT +	JNZ	CCLR3		;MAKE SURE IT IS CLEARED +	MOV	A,R3		;GET POINTER FOR COMPARE +	CJNE	A,DPH,CL_1	;SEE TO LOOP +	MOV	A,R1		;NOW TEST LOW BYTE +	CJNE	A,DPL,CL_1 +	; +CL_2:	RET +	; +CCLR3:	LJMP	TB		;ALLOCATED MEMORY DOESN'T EXSIST ******AA JMP-->LJMP +	; +	;************************************************************** +	; +SCLR:	;Entry point for clear return +	; +	;************************************************************** +	; +	LCALL	DELTST		;TEST FOR A CR ******AA CALL-->LCALL +	JNC	RCLEAR +	LCALL	GCI1		;BUMP THE TEST POINTER ******AA CALL-->LCALL +	CJNE	A,#'I',RC1	;SEE IF I, ELSE RESET THE STACK +	; +	;************************************************************** +	; +ICLR:	; Clear interrupts and system garbage +	; +	;************************************************************** +	; +	JNB	INTBIT,$+5	;SEE IF BASIC HAS INTERRUPTS +	CLR	EX1		;IF SO, CLEAR INTERRUPTS +	ANL	34,#00100000B	;SET INTERRUPTS + CONTINUE +	RETI +	; +	newpage +	;*************************************************************** +	; +	;OUTPUT ROUTINES +	; +	;*************************************************************** +	; +CRLF2:	ACALL	CRLF		;DO TWO CRLF'S +	; +CRLF:	MOV	R5,#CR		;LOAD THE CR +	ACALL	TEROT		;CALL TERMINAL OUT +	MOV	R5,#LF		;LOAD THE LF +	AJMP	TEROT		;OUTPUT IT AND RETURN +	; +	;PRINT THE MESSAGE ADDRESSED IN ROM OR RAM BY THE DPTR +	;ENDS WITH THE CHARACTER IN R4 +	;DPTR HAS THE ADDRESS OF THE TERMINATOR +	; +CRP:	ACALL	CRLF		;DO A CR THEN PRINT ROM +	; +ROM_P:	CLR	A		;CLEAR A FOR LOOKUP +	MOVC	A,@A+DPTR	;GET THE CHARACTER +	CLR	ACC.7		;CLEAR MS BIT +	CJNE	A,#'"',$+4	;EXIT IF TERMINATOR +	RET +	SETB	C0ORX1 +	; +PN1:	MOV	R5,A		;OUTPUT THE CHARACTER +	ACALL	TEROT +	INC	DPTR		;BUMP THE POINTER +	SJMP	PN0 +	; +UPRNT:	ACALL	X31DP +	; +PRNTCR:	MOV	R4,#CR		;OUTPUT UNTIL A CR +	; +PN0:	JBC	C0ORX1,ROM_P +	MOVX	A,@DPTR		;GET THE RAM BYTE +	JZ	$+5 +	CJNE	A,R4B0,$+4	;SEE IF THE SAME AS TERMINATOR +	RET			;EXIT IF THE SAME +	CJNE	A,#CR,PN1	;NEVER PRINT A CR IN THIS ROUTINE +	LJMP	E1XX		;BAD SYNTAX +	; +	newpage +	;*************************************************************** +	; +	; INLINE - Input a line to IBUF, exit when a CR is received +	; +	;*************************************************************** +	; +INL2:	CJNE 	A,#CNTRLD,INL2B	;SEE IF A CONTROL D +	; +INL0:	ACALL	CRLF		;DO A CR +	; +INLINE:	MOV	P2,#HI(IBUF)	;IBUF IS IN THE ZERO PAGE +	MOV	R0,#LO(IBUF)	;POINT AT THE INPUT BUFFER +	; +INL1:	ACALL	INCHAR		;GET A CHARACTER +	MOV	R5,A		;SAVE IN R5 FOR OUTPUT +	CJNE	A,#7FH,INL2	;SEE IF A DELETE CHARACTER +	CJNE	R0,#LO(IBUF),INL6 +	MOV	R5,#BELL	;OUTPUT A BELL +	; +INLX:	ACALL	TEROT		;OUTPUT CHARACTER +	SJMP	INL1		;DO IT AGAIN +	; +INL2B:	MOVX	@R0,A		;SAVE THE CHARACTER +	CJNE	A,#CR,$+5	;IS IT A CR +	AJMP	CRLF		;OUTPUT A CRLF AND EXIT +	CJNE	A,#20H,$+3 +	JC	INLX		;ONLY ECHO CONTROL CHARACTERS +	INC	R0		;BUMP THE POINTER +	CJNE	R0,#IBUF+79,INLX +	DEC	R0		;FORCE 79 +	SJMP	INLX-2		;OUTPUT A BELL +	; +INL6:	DEC	R0		;DEC THE RAM POINTER +	MOV	R5,#BS		;OUTPUT A BACK SPACE +	ACALL	TEROT +	ACALL	STEROT		;OUTPUT A SPACE +	MOV	R5,#BS		;ANOTHER BACK SPACE +	SJMP	INLX		;OUTPUT IT +	; +PTIME:	DB	128-2		; PROM PROGRAMMER TIMER +	DB	00H +	DB	00H +	DB	50H +	DB	67H +	DB	41H +	; +	newpage +	include	bas52.out	; ******AA +	; +BCK:	ACALL	CSTS		;CHECK STATUS +	JNC	CI_RET+1	;EXIT IF NO CHARACTER +	; +	newpage +	;*************************************************************** +	; +	;INPUTS A CHARACTER FROM THE SYSTEM CONSOLE. +	; +	;*************************************************************** +	; +INCHAR:	JNB	BI,$+8		;CHECK FOR MONITOR (BUBBLE) +	LCALL	2060H +	SJMP	INCH1 +	JNB	CIUB,$+8	;CHECK FOR USER +	LCALL	4033H +	SJMP	INCH1 +	JNB	RI,$		;WAIT FOR RECEIVER READY. +	MOV	A,SBUF +	CLR	RI		;RESET READY +	CLR	ACC.7		;NO BIT 7 +	; +INCH1:	CJNE	A,#13H,$+5 +	SETB	CNT_S +	CJNE	A,#11H,$+5 +	CLR	CNT_S +	CJNE	A,#CNTRLC,$+7 +	JNB	NO_C,C_EX	;TRAP NO CONTROL C +	RET +	; +	CLR	JKBIT +	CJNE	A,#17H,CI_RET	;CONTROL W +	SETB	JKBIT +	; +CI_RET:	SETB	C		;CARRY SET IF A CHARACTER +	RET			;EXIT +	; +	;************************************************************* +	; +	;RROM - The Statement Action Routine RROM +	; +	;************************************************************* +	; +RROM:	SETB	INBIT		;SO NO ERRORS +	ACALL	RO1		;FIND THE LINE NUMBER +	JBC	INBIT,CRUN +	RET			;EXIT +	; +	newpage +	;*************************************************************** +	; +CSTS:	;	RETURNS CARRY = 1 IF THERE IS A CHARACTER WAITING FROM +	;       THE SYSTEM CONSOLE. IF NO CHARACTER THE READY CHARACTER +	;       WILL BE CLEARED +	; +	;*************************************************************** +	; +	JNB	BI,$+6		;BUBBLE STATUS +	LJMP	2068H +	JNB	CIUB,$+6	;SEE IF EXTERNAL CONSOLE +	LJMP	4036H +	MOV	C,RI +	RET +	; +	MOV	DPTR,#WB	;EGO MESSAGE +	ACALL	ROM_P +	; +C_EX:	CLR	CNT_S		;NO OUTPUT STOP +	LCALL	SPRINT+4	;ASSURE CONSOLE +	ACALL	CRLF +	JBC	JKBIT,C_EX-5 +	; +	JNB	DIRF,SSTOP0 +	AJMP	C_K		;CLEAR COB AND EXIT +	; +T_CMP:	MOV	A,TVH		;COMPARE TIMER TO SP_H AND SP_L +	MOV	R1,TVL +	CJNE	A,TVH,T_CMP +	XCH	A,R1 +	SUBB	A,SP_L +	MOV	A,R1 +	SUBB	A,SP_H +	RET +	; +	;************************************************************* +	; +BR0:	; Trap the timer interrupt +	; +	;************************************************************* +	; +	CALL	T_CMP		;COMPARE TIMER +	JC	BCHR+6		;EXIT IF TEST FAILS +	SETB	OTI		;DOING THE TIMER INTERRUPT +	CLR	OTS		;CLEAR TIMER BIT +	MOV	C,INPROG	;SAVE IN PROGRESS +	MOV	ISAV,C +	MOV	DPTR,#TIV +	SJMP	BR2 +	; +	newpage +	;*************************************************************** +	; +	; The command action routine - RUN +	; +	;*************************************************************** +	; +CRUN:	LCALL	RCLEAR-2	;CLEAR THE STORAGE ARRAYS +	ACALL	SRESTR+2	;GET THE STARTING ADDRESS +	ACALL	B_C +	JZ	CMNDLK		;IF NULL GO TO COMMAND MODE +	; +	ACALL	T_DP +	ACALL	B_TXA		;BUMP TO STARTING LINE +	; +CILOOP:	ACALL	SP0		;DO A CR AND A LF +	CLR	DIRF		;NOT IN DIRECT MODE +	; +	;INTERPERTER DRIVER +	; +ILOOP:	MOV	SP,SPSAV	;RESTORE THE STACK EACH TIME +	JB	DIRF,$+9	;NO INTERRUPTS IF IN DIRECT MODE +	MOV	INTXAH,TXAH	;SAVE THE TEXT POINTER +	MOV	INTXAL,TXAL +	LCALL	BCK		;GET CONSOLE STATUS +	JB	DIRF,I_L	;DIRECT MODE +	ANL	C,/GTRD		;SEE IF CHARACTER READY +	JNC	BCHR		;NO CHARACTER = NO CARRY +	; +	; DO TRAP OPERATION +	; +	MOV	DPTR,#GTB	;SAVE TRAP CHARACTER +	MOVX	@DPTR,A +	SETB	GTRD		;SAYS READ A BYTE +	; +BCHR:	JB	OTI,I_L		;EXIT IF TIMER INTERRUPT IN PROGRESS +	JB	OTS,BR0		;TEST TIMER VALUE IF SET +	JNB	INTPEN,I_L	;SEE IF INTERRUPT PENDING +	JB	INPROG,I_L	;DON'T DO IT AGAIN IF IN PROGRESS +	MOV	DPTR,#INTLOC	;POINT AT INTERRUPT LOCATION +	; +BR2:	MOV	R4,#GTYPE	;SETUP FOR A FORCED GOSUB +	ACALL	SGS1		;PUT TXA ON STACK +	SETB	INPROG		;INTERRUPT IN PROGRESS +	; +ERL4:	CALL	L20DPI +	AJMP	D_L1		;GET THE LINE NUMBER +	; +I_L:	ACALL	ISTAT		;LOOP +	ACALL	CLN_UP		;FINISH IT OFF +	JNC	ILOOP		;LOOP ON THE DRIVER +	JNB	DIRF,CMNDLK	;CMND1 IF IN RUN MODE +	LJMP	CMNDR		;DON'T PRINT READY +	; +CMNDLK:	LJMP	CMND1		;DONE ******AA JMP-->LJMP +	newpage +	;************************************************************** +	; +	; The Statement Action Routine - STOP +	; +	;************************************************************** +	; +SSTOP:	ACALL	CLN_UP		;FINISH OFF THIS LINE +	MOV	INTXAH,TXAH	;SAVE TEXT POINTER FOR CONT +	MOV	INTXAL,TXAL +	; +SSTOP0:	SETB	CONB		;CONTINUE WILL WORK +	MOV	DPTR,#STP	;PRINT THE STOP MESSAGE +	SETB	STOPBIT		;SET FOR ERROR ROUTINE +	LJMP	ERRS		;JUMP TO ERROR ROUTINE ******AA JMP-->LJMP +	; +	newpage +	;************************************************************** +	; +	; ITRAP - Trap special function register operators +	; +	;************************************************************** +	; +ITRAP:	CJNE	A,#TMR0,$+8	;TIMER 0 +	MOV	TH0,R3 +	MOV	TL0,R1 +	RET +	; +	CJNE	A,#TMR1,$+8	;TIMER 1 +	MOV	TH1,R3 +	MOV	TL1,R1 +	RET +	; +	CJNE	A,#TMR2,$+8	;TIMER 2 +	DB	8BH		;MOV R3 DIRECT OP CODE +	DB	0CDH		;T2H LOCATION +	DB	89H		;MOV R1 DIRECT OP CODE +	DB	0CCH		;T2L LOCATION +	RET +	; +	CJNE	A,#TRC2,$+8	;RCAP2 TOKEN +RCL:	DB	8BH		;MOV R3 DIRECT OP CODE +	DB	0CBH		;RCAP2H LOCATION +	DB	89H		;MOV R1 DIRECT OP CODE +	DB	0CAH		;RCAP2L LOCATION +	RET +	; +	ACALL	R3CK		;MAKE SURE THAT R3 IS ZERO +	CJNE	A,#TT2C,$+6 +	DB	89H		;MOV R1 DIRECT OP CODE +	DB	0C8H		;T2CON LOCATION +	RET +	; +	CJNE	A,#T_IE,$+6	;IE TOKEN +	MOV	IE,R1 +	RET +	; +	CJNE	A,#T_IP,$+6	;IP TOKEN +	MOV	IP,R1 +	RET +	; +	CJNE	A,#TTC,$+6	;TCON TOKEN +	MOV	TCON,R1 +	RET +	; +	CJNE	A,#TTM,$+6	;TMOD TOKEN +	MOV	TMOD,R1 +	RET +	; +	CJNE	A,#T_P1,T_T2	;P1 TOKEN +	MOV	P1,R1 +	RET +	; +	;*************************************************************** +	; +	; T_TRAP - Trap special operators +	; +	;*************************************************************** +	; +T_T:	MOV	TEMP5,A		;SAVE THE TOKEN +	ACALL	GCI1		;BUMP POINTER +	ACALL	SLET2		;EVALUATE AFTER = +	MOV	A,TEMP5		;GET THE TOKEN BACK +	CJNE	A,#T_XTAL,$+6 +	LJMP	AXTAL1		;SET UP CRYSTAL +	; +	ACALL	IFIXL		;R3:R1 HAS THE TOS +	MOV	A,TEMP5		;GET THE TOKEN AGAIN +	CJNE	A,#T_MTOP,T_T1	;SEE IF MTOP TOKEN +	MOV	DPTR,#MEMTOP +	CALL	S31DP +	JMP	RCLEAR		;CLEAR THE MEMORY +	; +T_T1:	CJNE	A,#T_TIME,ITRAP	;SEE IF A TIME TOKEN +	MOV	C,EA		;SAVE INTERRUPTS +	CLR	EA		;NO TIMER 0 INTERRUPTS DURING LOAD +	MOV	TVH,R3		;SAVE THE TIME +	MOV	TVL,R1 +	MOV	EA,C		;RESTORE INTERRUPTS +	RET			;EXIT +	; +T_T2:	CJNE	A,#T_PC,INTERX	;PCON TOKEN +	DB	89H		;MOV DIRECT, R1 OP CODE +	DB	87H		;ADDRESS OF PCON +	RET			;EXIT +	; +T_TRAP:	CJNE	A,#T_ASC,T_T	;SEE IF ASC TOKEN +	ACALL	IGC		;EAT IT AND GET THE NEXT CHARACTER +	CJNE	A,#'$',INTERX	;ERROR IF NOT A STRING +	ACALL	CSY		;CALCULATE ADDRESS +	ACALL	X3120 +	LCALL	TWO_EY          ; ******AA CALL-->LCALL +	ACALL	SPEOP+4		;EVALUATE AFTER EQUALS +	AJMP	ISTAX1		;SAVE THE CHARACTER +	; +	newpage +	;************************************************************** +	; +	;INTERPERT THE STATEMENT POINTED TO BY TXAL AND TXAH +	; +	;************************************************************** +	; +ISTAT:	ACALL	GC		;GET THR FIRST CHARACTER +	JNB	XBIT,IAT	;TRAP TO EXTERNAL RUN PACKAGE +	CJNE	A,#20H,$+3 +	JNC	IAT +	LCALL	2070H		;LET THE USER SET UP THE DPTR +	ACALL	GCI1 +	ANL	A,#0FH		;STRIP OFF BIAS +	SJMP	ISTA1 +	; +IAT:	CJNE	A,#T_XTAL,$+3 +	JNC	T_TRAP +	JNB	ACC.7,SLET	;IMPLIED LET IF BIT 7 NOT SET +	CJNE	A,#T_UOP+12,ISTAX	;DBYTE TOKEN +	ACALL	SPEOP		;EVALUATE SPECIAL OPERATOR +	ACALL	R3CK		;CHECK LOCATION +	MOV	@R1,A		;SAVE IT +	RET +	; +ISTAX:	CJNE	A,#T_UOP+13,ISTAY	;XBYTE TOKEN +	ACALL	SPEOP +	; +ISTAX1:	MOV	P2,R3 +	MOVX	@R1,A +	RET +	; +ISTAY:	CJNE	A,#T_CR+1,$+3	;TRAP NEW OPERATORS +	JC	I_S +	CJNE	A,#0B0H,$+3	;SEE IF TOO BIG +	JNC	INTERX +	ADD	A,#0F9H		;BIAS FOR LOOKUP TABLE +	SJMP	ISTA0		;DO THE OPERATION +	; +I_S:	CJNE	A,#T_LAST,$+3	;MAKE SURE AN INITIAL RESERVED WORD +	JC	$+5		;ERROR IF NOT +	; +INTERX:	LJMP	E1XX		;SYNTAX ERROR +	; +	JNB	DIRF,ISTA0	;EXECUTE ALL STATEMENTS IF IN RUN MODE +	CJNE	A,#T_DIR,$+3	;SEE IF ON TOKEN +	JC	ISTA0		;OK IF DIRECT +	CJNE	A,#T_GOSB+1,$+5	;SEE IF FOR +	SJMP	ISTA0		;FOR IS OK +	CJNE	A,#T_REM+1,$+5	;NEXT IS OK +	SJMP	ISTA0 +	CJNE	A,#T_STOP+6,INTERX	;SO IS REM +	; +	newpage +ISTA0:	ACALL	GCI1		;ADVANCE THE TEXT POINTER +	MOV	DPTR,#STATD	;POINT DPTR TO LOOKUP TABLE +	CJNE	A,#T_GOTO-3,$+5	;SEE IF LET TOKEN +	SJMP	ISTAT		;WASTE LET TOKEN +	ANL	A,#3FH		;STRIP OFF THE GARBAGE +	; +ISTA1:	RL	A		;ROTATE FOR OFFSET +	ADD	A,DPL		;BUMP +	MOV	DPL,A		;SAVE IT +	CLR	A +	MOVC	A,@A+DPTR	;GET HIGH BYTE +	PUSH	ACC		;SAVE IT +	INC	DPTR +	CLR	A +	MOVC	A,@A+DPTR	;GET LOW BYTE +	POP	DPH +	MOV	DPL,A +	; +AC1:	CLR	A +	JMP	@A+DPTR		;GO DO IT +	; +	newpage +	;*************************************************************** +	; +	; The statement action routine - LET +	; +	;*************************************************************** +	; +SLET:	ACALL	S_C		;CHECK FOR POSSIBLE STRING +	JC	SLET0		;NO STRING +	CLR	LINEB		;USED STRINGS +	; +	CALL	X31DP		;PUT ADDRESS IN DPTR +	MOV	R7,#T_EQU	;WASTE = +	ACALL	EATC +	ACALL	GC		;GET THE NEXT CHARACTER +	CJNE	A,#'"',S_3	;CHECK FOR A " +	MOV	R7,S_LEN	;GET THE STRING LENGTH +	; +S_0:	ACALL	GCI1		;BUMP PAST " +	ACALL	DELTST		;CHECK FOR DELIMITER +	JZ	INTERX		;EXIT IF CARRIAGE RETURN +	MOVX	@DPTR,A		;SAVE THE CHARACTER +	CJNE	A,#'"',S_1	;SEE IF DONE +	; +S_E:	MOV	A,#CR		;PUT A CR IN A +	MOVX	@DPTR,A		;SAVE CR +	AJMP	GCI1 +	; +S_3:	PUSH	DPH +	PUSH	DPL		;SAVE DESTINATION +	ACALL	S_C		;CALCULATE SOURCE +	JC	INTERX		;ERROR IF CARRY +	POP	R0B0		;GET DESTINATION BACK +	POP	R2B0 +	; +SSOOP:	MOV	R7,S_LEN	;SET UP COUNTER +	; +S_4:	LCALL	TBYTE		;TRANSFER THE BYTE ******AA CALL-->LCALL +	CJNE	A,#CR,$+4	;EXIT IF A CR +	RET +	DJNZ	R7,S_5		;BUMP COUNTER +	MOV	A,#CR		;SAVE A CR +	MOVX	@R0,A +	AJMP	EIGP		;PRINT EXTRA IGNORED +	; +	newpage +	; +S_5:	CALL	INC3210		;BUMP POINTERS +	SJMP	S_4		;LOOP +	; +S_1:	DJNZ	R7,$+8		;SEE IF DONE +	ACALL	S_E +	ACALL	EIGP		;PRINT EXTRA IGNORED +	AJMP	FINDCR		;GO FIND THE END +	INC	DPTR		;BUMP THE STORE POINTER +	SJMP	S_0		;CONTINUE TO LOOP +	; +E3XX:	MOV	DPTR,#E3X	;BAD ARG ERROR +	AJMP	EK +	; +SLET0:	ACALL	SLET1 +	AJMP	POPAS		;COPY EXPRESSION TO VARIABLE +	; +SLET1:	ACALL	VAR_ER		;CHECK FOR A"VARIABLE" +	; +SLET2:	PUSH	R2B0		;SAVE THE VARIABLE ADDRESS +	PUSH	R0B0 +	MOV	R7,#T_EQU	;GET EQUAL TOKEN +	ACALL	WE +	POP	R1B0		;POP VARIABLE TO R3:R1 +	POP	R3B0 +	RET			;EXIT +	; +R3CK:	CJNE	R3,#00H,E3XX	;CHECK TO SEE IF R3 IS ZERO +	RET +	; +SPEOP:	ACALL	GCI1		;BUMP TXA +	ACALL	P_E		;EVALUATE PAREN +	ACALL	SLET2		;EVALUATE AFTER = +	CALL	TWOL		;R7:R6 GETS VALUE, R3:R1 GETS LOCATION +	MOV	A,R6		;SAVE THE VALUE +	; +	CJNE	R7,#00H,E3XX	;R2 MUST BE = 0 +	RET +	; +	newpage +	;************************************************************** +	; +	; ST_CAL - Calculate string Address +	; +	;************************************************************** +	; +IST_CAL:; +	; +	ACALL	I_PI		;BUMP TEXT, THEN EVALUATE +	ACALL	R3CK		;ERROR IF R3 <> 0 +	INC	R1		;BUMP FOR OFFSET +	MOV	A,R1		;ERROR IF R1 = 255 +	JZ	E3XX +	MOV	DPTR,#VARTOP	;GET TOP OF VARIABLE STORAGE +	MOV	B,S_LEN		;MULTIPLY FOR LOCATION +	ACALL	VARD		;CALCULATE THE LOCATION +	MOV	DPTR,#MEMTOP	;SEE IF BLEW IT +	CALL	FUL1 +	MOV	DPL,S_LEN	;GET STRING LENGTH, DPH = 00H +	DEC	DPH		;DPH = 0 +	; +DUBSUB:	CLR	C +	MOV	A,R1 +	SUBB	A,DPL +	MOV	R1,A +	MOV	A,R3 +	SUBB	A,DPH +	MOV	R3,A +	ORL	A,R1 +	RET +	; +	;*************************************************************** +	; +	;VARD - Calculate the offset base +	; +	;*************************************************************** +	; +VARB:	MOV	B,#FPSIZ	;SET UP FOR OPERATION +	; +VARD:	CALL	LDPTRI		;LOAD DPTR +	MOV	A,R1		;MULTIPLY BASE +	MUL	AB +	ADD	A,DPL +	MOV	R1,A +	MOV	A,B +	ADDC	A,DPH +	MOV	R3,A +	RET +	; +	newpage +	;************************************************************* +	; +CSY:	; Calculate a biased string address and put in R3:R1 +	; +	;************************************************************* +	; +	ACALL	IST_CAL		;CALCULATE IT +	PUSH	R3B0		;SAVE IT +	PUSH	R1B0 +	MOV	R7,#','		;WASTE THE COMMA +	ACALL	EATC +	ACALL	ONE		;GET THE NEXT EXPRESSION +	MOV	A,R1		;CHECK FOR BOUNDS +	CJNE	A,S_LEN,$+3 +	JNC	E3XX		;MUST HAVE A CARRY +	DEC	R1		;BIAS THE POINTER +	POP	ACC		;GET VALUE LOW +	ADD	A,R1		;ADD IT TO BASE +	MOV	R1,A		;SAVE IT +	POP	R3B0		;GET HIGH ADDRESS +	JNC	$+3		;PROPAGATE THE CARRY +	INC	R3 +	AJMP	ERPAR		;WASTE THE RIGHT PAREN +	; +	newpage +	;*************************************************************** +	; +	; The statement action routine FOR +	; +	;*************************************************************** +	; +SFOR:	ACALL	SLET1		;SET UP CONTROL VARIABLE +	PUSH	R3B0		;SAVE THE CONTROL VARIABLE LOCATION +	PUSH	R1B0 +	ACALL	POPAS		;POP ARG STACK AND COPY CONTROL VAR +	MOV	R7,#T_TO	;GET TO TOKEN +	ACALL	WE +	ACALL	GC		;GET NEXT CHARACTER +	CJNE	A,#T_STEP,SF2 +	ACALL	GCI1		;EAT THE TOKEN +	ACALL	EXPRB		;EVALUATE EXPRESSION +	SJMP	$+5		;JUMP OVER +	; +SF2:	LCALL	PUSH_ONE	;PUT ONE ON THE STACK +	; +	MOV	A,#-FSIZE	;ALLOCATE FSIZE BYTES ON THE CONTROL STACK +	ACALL	PUSHCS		;GET CS IN R0 +	ACALL	CSC		;CHECK CONTROL STACK +	MOV	R3,#CSTKAH	;IN CONTROL STACK +	MOV	R1,R0B0		;STACK ADDRESS +	ACALL	POPAS		;PUT STEP ON STACK +	ACALL	POPAS		;PUT LIMIT ON STACK +	ACALL	DP_T		;DPTR GETS TEXT +	MOV	R0,R1B0		;GET THE POINTER +	ACALL	T_X_S		;SAVE THE TEXT +	POP	TXAL		;GET CONTROL VARIABLE +	POP	TXAH +	MOV	R4,#FTYPE	;AND THE TYPE +	ACALL	T_X_S		;SAVE IT +	; +SF3:	ACALL	T_DP		;GET THE TEXT POINTER +	AJMP	ILOOP		;CONTINUE TO PROCESS +	; +	newpage +	;************************************************************** +	; +	; The statement action routines - PUSH and POP +	; +	;************************************************************** +	; +SPUSH:	ACALL	EXPRB		;PUT EXPRESSION ON STACK +	ACALL	C_TST		;SEE IF MORE TO DO +	JNC	SPUSH		;IF A COMMA PUSH ANOTHER +	RET +	; +	; +SPOP:	ACALL	VAR_ER		;GET VARIABLE +	ACALL	XPOP		;FLIP THE REGISTERS FOR POPAS +	ACALL	C_TST		;SEE IF MORE TO DO +	JNC	SPOP +	; +	RET +	; +	;*************************************************************** +	; +	; The statement action routine - IF +	; +	;*************************************************************** +	; +SIF:	ACALL	RTST		;EVALUATE THE EXPRESSION +	MOV	R1,A		;SAVE THE RESULT +	ACALL	GC		;GET THE CHARACTER AFTER EXPR +	CJNE	A,#T_THEN,$+5	;SEE IF THEN TOKEN +	ACALL	GCI1		;WASTE THEN TOKEN +	CJNE	R1,#0,T_F1	;CHECK R_OP RESULT +	; +E_FIND:	MOV	R7,#T_ELSE	;FIND ELSE TOKEN +	ACALL	FINDC +	JZ	SIF-1		;EXIT IF A CR +	ACALL	GCI1		;BUMP PAST TOKEN +	CJNE	A,#T_ELSE,E_FIND;WASTE IF NO ELSE +	; +T_F1:	ACALL	INTGER		;SEE IF NUMBER +	JNC	D_L1		;EXECUTE LINE NUMBER +	AJMP	ISTAT		;EXECUTE STATEMENT IN NOT +	; +B_C:	MOVX	A,@DPTR +	DEC	A +	JB	ACC.7,FL3-5 +	RET +	; +	newpage +	;*************************************************************** +	; +	; The statement action routine - GOTO +	; +	;*************************************************************** +	; +SGOTO:	ACALL	RLINE		;R2:R0 AND DPTR GET INTGER +	; +SGT1:	ACALL	T_DP		;TEXT POINTER GETS DPTR +	; +	JBC	RETBIT,SGT2	;SEE IF RETI EXECUTED +	; +	JNB	LINEB,$+6	;SEE IF A LINE WAS EDITED +	LCALL	RCLEAR-2	;CLEAR THE MEMORY IF SET +	AJMP	ILOOP-2		;CLEAR DIRF AND LOOP +	; +SGT2:	JBC	OTI,$+8		;SEE IF TIMER INTERRUPT +	ANL	34,#10111101B	;CLEAR INTERRUPTS +	AJMP	ILOOP		;EXECUTE +	MOV	C,ISAV +	MOV	INPROG,C +	AJMP	ILOOP		;RESTORE INTERRUPTS AND RET +	; +	; +	;************************************************************* +	; +RTST:	; Test for ZERO +	; +	;************************************************************* +	; +	ACALL	EXPRB		;EVALUATE EXPRESSION +	CALL	INC_ASTKA	;BUMP ARG STACK +	JZ	$+4		;EXIT WITH ZERO OR 0FFH +	MOV	A,#0FFH +	RET +	; +	newpage +	; +	;************************************************************** +	; +	; GLN - get the line number in R2:R0, return in DPTR +	; +	;************************************************************** +	; +GLN:	ACALL	DP_B		;GET THE BEGINNING ADDRESS +	; +FL1:	MOVX	A,@DPTR		;GET THE LENGTH +	MOV	R7,A		;SAVE THE LENGTH +	DJNZ	R7,FL3		;SEE IF END OF FILE +	; +	MOV	DPTR,#E10X	;NO LINE NUMBER +	AJMP	EK		;HANDLE THE ERROR +	; +FL3:	JB	ACC.7,$-5	;CHECK FOR BIT 7 +	INC	DPTR		;POINT AT HIGH BYTE +	MOVX	A,@DPTR		;GET HIGH BYTE +	CJNE	A,R2B0,FL2	;SEE IF MATCH +	INC	DPTR		;BUMP TO LOW BYTE +	DEC	R7		;ADJUST AGAIN +	MOVX	A,@DPTR		;GET THE LOW BYTE +	CJNE	A,R0B0,FL2	;SEE IF LOW BYTE MATCH +	INC	DPTR		;POINT AT FIRST CHARACTER +	RET			;FOUND IT +	; +FL2:	MOV	A,R7		;GET THE LENGTH COUNTER +	CALL	ADDPTR		;ADD A TO DATA POINTER +	SJMP	FL1		;LOOP +	; +	; +	;************************************************************* +	; +	;RLINE - Read in ASCII string, get line, and clean it up +	; +	;************************************************************* +	; +RLINE:	ACALL	INTERR		;GET THE INTEGER +	; +RL1:	ACALL	GLN +	AJMP	CLN_UP +	; +	; +D_L1:	ACALL	GLN		;GET THE LINE +	AJMP	SGT1		;EXECUTE THE LINE +	; +	newpage +	;*************************************************************** +	; +	; The statement action routines WHILE and UNTIL +	; +	;*************************************************************** +	; +SWHILE:	ACALL	RTST		;EVALUATE RELATIONAL EXPRESSION +	CPL	A +	SJMP	S_WU +	; +SUNTIL:	ACALL	RTST		;EVALUATE RELATIONAL EXPRESSION +	; +S_WU:	MOV	R4,#DTYPE	;DO EXPECTED +	MOV	R5,A		;SAVE R_OP RESULT +	SJMP	SR0		;GO PROCESS +	; +	; +	;*************************************************************** +	; +CNULL:	; The Command Action Routine - NULL +	; +	;*************************************************************** +	; +	ACALL	INTERR		;GET AN INTEGER FOLLOWING NULL +	MOV	NULLCT,R0	;SAVE THE NULLCOUNT +	AJMP	CMNDLK		;JUMP TO COMMAND MODE +	; +	newpage +	;*************************************************************** +	; +	; The statement action routine - RETI +	; +	;*************************************************************** +	; +SRETI:	SETB	RETBIT		;SAYS THAT RETI HAS BEEN EXECUTED +	; +	;*************************************************************** +	; +	; The statement action routine - RETURN +	; +	;*************************************************************** +	; +SRETRN:	MOV	R4,#GTYPE	;MAKE SURE OF GOSUB +	MOV	R5,#55H		;TYPE RETURN TYPE +	; +SR0:	ACALL	CSETUP		;SET UP CONTROL STACK +	MOVX	A,@R0		;GET RETURN TEXT ADDRESS +	MOV	DPH,A +	INC	R0 +	MOVX	A,@R0 +	MOV	DPL,A +	INC	R0		;POP CONTROL STACK +	MOVX	A,@DPTR		;SEE IF GOSUB WAS THE LAST STATEMENT +	CJNE	A,#EOF,$+5 +	AJMP	CMNDLK +	MOV	A,R5		;GET TYPE +	JZ	SGT1		;EXIT IF ZERO +	MOV	CSTKA,R0	;POP THE STACK +	CPL	A		;OPTION TEST, 00H, 55H, 0FFH, NOW 55H +	JNZ	SGT1		;MUST BE GOSUB +	RET			;NORMAL FALL THRU EXIT FOR NO MATCH +	; +	newpage +	;*************************************************************** +	; +	; The statement action routine - GOSUB +	; +	;*************************************************************** +	; +SGOSUB:	ACALL	RLINE		;NEW TXA IN DPTR +	; +SGS0:	MOV	R4,#GTYPE +	ACALL	SGS1		;SET EVERYTHING UP +	AJMP	SF3		;EXIT +	; +SGS1:	MOV	A,#-3		;ALLOCATE 3 BYTES ON CONTROL STACK +	ACALL	PUSHCS +	; +T_X_S:	MOV	P2,#CSTKAH	;SET UP PORT FOR CONTROL STACK +	MOV	A,TXAL		;GET RETURN ADDRESS AND SAVE IT +	MOVX	@R0,A +	DEC	R0 +	MOV	A,TXAH +	MOVX	@R0,A +	DEC	R0 +	MOV	A,R4		;GET TYPE +	MOVX	@R0,A		;SAVE TYPE +	RET			;EXIT +	; +	; +CS1:	MOV	A,#3		;POP 3 BYTES +	ACALL	PUSHCS +	; +CSETUP:	MOV	R0,CSTKA	;GET CONTROL STACK +	MOV	P2,#CSTKAH +	MOVX	A,@R0		;GET BYTE +	CJNE	A,R4B0,$+5	;SEE IF TYPE MATCH +	INC	R0 +	RET +	JZ	E4XX		;EXIT IF STACK UNDERFLOW +	CJNE	A,#FTYPE,CS1	;SEE IF FOR TYPE +	ACALL	PUSHCS-2	;WASTE THE FOR TYPE +	SJMP	CSETUP		;LOOP +	; +	newpage +	;*************************************************************** +	; +	; The statement action routine - NEXT +	; +	;*************************************************************** +	; +SNEXT:	MOV	R4,#FTYPE	;FOR TYPE +	ACALL	CSETUP		;SETUP CONTROL STACK +	MOV	TEMP5,R0	;SAVE CONTROL VARIABLE ADDRESS +	MOV	R1,#TEMP1	;SAVE VAR + RETURN IN TEMP1-4 +	; +XXI:	MOVX	A,@R0		;LOOP UNTIL DONE +	MOV	@R1,A +	INC	R1 +	INC	R0 +	CJNE	R1,#TEMP5,XXI +	; +	ACALL	VAR		;SEE IF THE USER HAS A VARIABLE +	JNC	$+6 +	MOV	R2,TEMP1 +	MOV	R0,TEMP2 +	MOV	A,R2		;SEE IF VAR'S AGREE +	CJNE	A,TEMP1,E4XX +	MOV	A,R0 +	CJNE	A,TEMP2,E4XX +	ACALL	PUSHAS		;PUT CONTROL VARIABLE ON STACK +	MOV	A,#FPSIZ+FPSIZ+2;COMPUTE ADDRESS TO STEP VALUE SIGN +	ADD	A,TEMP5		;ADD IT TO BASE OF STACK +	MOV	R0,A		;SAVE IN R0 +	MOV	R2,#CSTKAH	;SET UP TO PUSH STEP VALUE +	MOV	P2,R2		;SET UP PORT +	MOVX	A,@R0		;GET SIGN +	INC	R0		;BACK TO EXPONENT +	PUSH	ACC		;SAVE SIGN OF STEP +	ACALL	PUSHAS		;PUT STEP VALUE ON STACK +	PUSH	R0B0		;SAVE LIMIT VALUE LOCATION +	CALL	AADD		;ADD STEP VALUE TO VARIABLE +	CALL	CSTAKA		;COPY STACK +	MOV	R3,TEMP1	;GET CONTROL VARIABLE +	MOV	R1,TEMP2 +	ACALL	POPAS		;SAVE THE RESULT +	MOV	R2,#CSTKAH	;RESTORE LIMIT LOCATION +	POP	R0B0 +	ACALL	PUSHAS		;PUT LIMIT ON STACK +	CALL	FP_BASE+4	;DO THE COMPARE +	POP	ACC		;GET LIMIT SIGN BACK +	JZ	$+3		;IF SIGN NEGATIVE, TEST "BACKWARDS" +	CPL	C +	ORL	C,F0		;SEE IF EQUAL +	JC	N4		;STILL SMALLER THAN LIMIT? +	MOV	A,#FSIZE	;REMOVE CONTROL STACK ENTRY +	; +	; Fall thru to PUSHCS +	; +	newpage +	;*************************************************************** +	; +	; PUSHCS - push frame onto control stack +	;          acc has - number of bytes, also test for overflow +	; +	;*************************************************************** +	; +PUSHCS:	ADD	A,CSTKA		;BUMP CONTROL STACK +	CJNE	A,#CONVT+17,$+3	;SEE IF OVERFLOWED +	JC	E4XX		;EXIT IF STACK OVERFLOW +	XCH	A,CSTKA		;STORE NEW CONTROL STACK VALUE, GET OLD +	DEC	A		;BUMP OLD VALUE +	MOV	R0,A		;PUT OLD-1 IN R0 +	; +	RET			;EXIT +	; +CSC:	ACALL	CLN_UP		;FINISH OFF THE LINE +	JNC	CSC-1		;EXIT IF NO TERMINATOR +	; +E4XX:	MOV	DPTR,#EXC	;CONTROL STACK ERROR +	AJMP	EK		;STACK ERROR +	; +N4:	MOV	TXAH,TEMP3	;GET TEXT POINTER +	MOV	TXAL,TEMP4 +	AJMP	ILOOP		;EXIT +	; +	;*************************************************************** +	; +	; The statement action routine - RESTORE +	; +	;*************************************************************** +	; +SRESTR:	ACALL	X_TR		;SWAP POINTERS +	ACALL	DP_B		;GET THE STARTING ADDRESS +	ACALL	T_DP		;PUT STARTING ADDRESS IN TEXT POINTER +	ACALL	B_TXA		;BUMP TXA +	; +	; Fall thru +	; +X_TR:	;swap txa and rtxa +	; +	XCH	A,TXAH +	XCH	A,RTXAH +	XCH	A,TXAH +	XCH	A,TXAL +	XCH	A,RTXAL +	XCH	A,TXAL +	RET			;EXIT +	; +	newpage +	;*************************************************************** +	; +	; The statement action routine - READ +	; +	;*************************************************************** +	; +SREAD:	ACALL	X_TR		;SWAP POINTERS +	; +SRD0:	ACALL	C_TST		;CHECK FOR COMMA +	JC	SRD4		;SEE WHAT IT IS +	; +SRD:	ACALL	EXPRB		;EVALUATE THE EXPRESSION +	ACALL	GC		;GET THE CHARACTER AFTER EXPRESSION +	CJNE	A,#',',SRD1	;SEE IF MORE DATA +	SJMP	SRD2		;BYBASS CLEAN UP IF A COMMA +	; +SRD1:	ACALL	CLN_UP		;FINISH OFF THE LINE, IF AT END +	; +SRD2:	ACALL	X_TR		;RESTORE POINTERS +	ACALL	VAR_ER		;GET VARIABLE ADDRESS +	ACALL	XPOP		;FLIP THE REGISTERS FOR POPAS +	ACALL	C_TST		;SEE IF A COMMA +	JNC	SREAD		;READ AGAIN IF A COMMA +	RET			;EXIT IF NOT +	; +SRD4:	CJNE	A,#T_DATA,SRD5	;SEE IF DATA +	ACALL	GCI1		;BUMP POINTER +	SJMP	SRD +	; +SRD5:	CJNE	A,#EOF,SRD6	;SEE IF YOU BLEW IT +	ACALL	X_TR		;GET THE TEXT POINTER BACK +	MOV	DPTR,#E14X	;READ ERROR +	; +EK:	LJMP	ERROR +	; +SRD6:	ACALL	FINDCR		;WASTE THIS LINE +	ACALL	CLN_UP		;CLEAN IT UP +	JC	SRD5+3		;ERROR IF AT END +	SJMP	SRD0 +	; +NUMC:	ACALL	GC		;GET A CHARACTER +	CJNE	A,#'#',NUMC1	;SEE IF A # +	SETB	COB		;VALID LINE PRINT +	AJMP	IGC		;BUMP THE TEXT POINTER +	; +NUMC1:	CJNE	A,#'@',SRD4-1	;EXIT IF NO GOOD +	SETB	LPB +	AJMP	IGC +	; +	newpage +	;*************************************************************** +	; +	; The statement action routine - PRINT +	; +	;*************************************************************** +	; +SPH0:	SETB	ZSURP		;NO ZEROS +	; +SPH1:	SETB	HMODE		;HEX MODE +	; +SPRINT:	ACALL	NUMC		;TEST FOR A LINE PRINT +	ACALL	$+9		;PROCEED +	ANL	35,#11110101B	;CLEAR COB AND LPB +	ANL	38,#00111111B	;NO HEX MODE +	; +	RET +	; +	ACALL	DELTST		;CHECK FOR A DELIMITER +	JC	SP1 +	; +SP0:	JMP	CRLF		;EXIT WITH A CR IF SO +	; +SP2:	ACALL	C_TST		;CHECK FOR A COMMA +	JC	SP0		;EXIT IF NO COMMA +	; +SP1:	ACALL	CPS		;SEE IF A STRING TO PRINT +	JNC	SP2		;IF A STRING, CHECK FOR A COMMA +	; +SP4:	CJNE	A,#T_TAB,SP6 +	ACALL	I_PI		;ALWAYS CLEARS CARRY +	SUBB	A,PHEAD		;TAKE DELTA BETWEEN TAB AND PHEAD +	JC	SP2		;EXIT IF PHEAD > TAB +	SJMP	SP7		;OUTPUT SPACES +	; +SP6:	CJNE	A,#T_SPC,SM +	ACALL	I_PI		;SET UP PAREN VALUE +	; +SP7:	JZ	SP2 +	LCALL	STEROT		;OUTPUT A SPACE +	DEC	A		;DECREMENT COUNTER +	SJMP	SP7		;LOOP +	; +	newpage +SM:	CJNE	A,#T_CHR,SP8 +	ACALL	IGC +	CJNE	A,#'$',$+9 +	ACALL	CNX		;PUT THE CHARACTER ON THE STACK +	ACALL	IFIXL		;PUT THE CHARACTER IN R1 +	SJMP	$+6 +	ACALL	ONE		;EVALUATE THE EXPRESSION, PUT IN R3:R1 +	ACALL	ERPAR +	MOV	R5,R1B0		;BYTE TO OUTPUT +	SJMP	SQ +	; +SP8:	CJNE	A,#T_CR,SX +	ACALL	GCI1		;EAT THE TOKEN +	MOV	R5,#CR +	; +SQ:	CALL	TEROT +	SJMP	SP2		;OUTPUT A CR AND DO IT AGAIN +	; +SX:	CJNE	A,#T_USE,SP9	;USING TOKEN +	ACALL	IGC		;GE THE CHARACTER AFTER THE USING TOKEN +	CJNE	A,#'F',U4	;SEE IF FLOATING +	MOV	FORMAT,#0F0H	;SET FLOATING +	ACALL	IGC		;BUMP THE POINTER AND GET THE CHARACTER +	ACALL	GCI1		;BUMP IT AGAIN +	ANL	A,#0FH		;STRIP OFF ASCII BIAS +	JZ	U3		;EXIT IF ZERO +	CJNE	A,#3,$+3	;SEE IF AT LEAST A THREE +	JNC	U3		;FORCE A THREE IF NOT A THREE +	MOV	A,#3 +	; +U3:	ORL	FORMAT,A	;PUT DIGIT IN FORMAT +	SJMP	U8		;CLEAN UP END +	; +U4:	CJNE	A,#'0',U5 +	MOV	FORMAT,#0	;FREE FORMAT +	ACALL	GCI1		;BUMP THE POINTER +	SJMP	U8 +	; +U5:	CJNE	A,#'#',U8	;SEE IF INTGER FORMAT +	ACALL	U6 +	MOV	FORMAT,R7	;SAVE THE FORMAT +	CJNE	A,#'.',U8A	;SEE IF TERMINATOR WAS RADIX +	ACALL	IGC		;BUMP PAST . +	ACALL	U6		;LOOP AGAIN +	MOV	A,R7		;GET COUNT +	ADD	A,FORMAT	;SEE IF TOO BIG +	ADD	A,#0F7H +	JNC	U5A +	; +	newpage +SE0:	AJMP	INTERX		;ERROR, BAD SYNTAX +	; +U5A:	MOV	A,R7		;GET THE COUNT BACK +	SWAP	A		;ADJUST +	ORL	FORMAT,A	;GET THE COUNT +	; +U8A:	MOV	A,FORMAT +	; +U8B:	SWAP	A		;GET THE FORMAT RIGHT +	MOV	FORMAT,A +	; +U8:	ACALL	ERPAR +	AJMP	SP2		;DONE +	; +U6:	MOV	R7,#0		;SET COUNTER +	; +U7:	CJNE	A,#'#',SP9A	;EXIT IF NOT A # +	INC	R7		;BUMP COUNTER +	ACALL	IGC		;GET THE NEXT CHARACTER +	SJMP	U7		;LOOP +	; +SP9:	ACALL	DELTST+2	;CHECK FOR DELIMITER +	JNC	SP9A		;EXIT IF A DELIMITER +	; +	CJNE	A,#T_ELSE,SS +	; +SP9A:	RET			;EXIT IF ELSE TOKEN +	; +	;************************************************************** +	; +	; P_E - Evaluate an expression in parens ( ) +	; +	;************************************************************** +	; +P_E:	MOV	R7,#T_LPAR +	ACALL	WE +	; +ERPAR:	MOV	R7,#')'		;EAT A RIGHT PAREN +	; +EATC:	ACALL	GCI		;GET THE CHARACTER +	CJNE	A,R7B0,SE0	;ERROR IF NOT THE SAME +	RET +	; +	newpage +	;*************************************************************** +	; +S_ON:	; ON Statement +	; +	;*************************************************************** +	; +	ACALL	ONE		;GET THE EXPRESSION +	ACALL	GCI		;GET THE NEXT CHARACTER +	CJNE	A,#T_GOTO,C0 +	ACALL	C1		;EAT THE COMMAS +	AJMP	SF3		;DO GOTO +	; +C0:	CJNE	A,#T_GOSB,SE0 +	ACALL	C1 +	AJMP	SGS0		;DO GOSUB +	; +C1:	CJNE	R1,#0,C2 +	ACALL	INTERR		;GET THE LINE NUMBER +	ACALL	FINDCR +	AJMP	RL1		;FINISH UP THIS LINE +	; +C2:	MOV	R7,#',' +	ACALL	FINDC +	CJNE	A,#',',SE0	;ERROR IF NOT A COMMA +	DEC	R1 +	ACALL	GCI1		;BUMP PAST COMMA +	SJMP	C1 +	; +	newpage +	; +SS:	ACALL	S_C		;SEE IF A STRING +	JC	SA		;NO STRING IF CARRY IS SET +	LCALL	UPRNT		;PUT POINTER IN DPTR +	AJMP	SP2		;SEE IF MORE +	; +SA:	ACALL	EXPRB		;MUST BE AN EXPRESSION +	MOV	A,#72 +	CJNE	A,PHEAD,$+3	;CHECK PHEAD POSITION +	JNC	$+4 +	ACALL	SP0		;FORCE A CRLF +	JNB	HMODE,S13	;HEX MODE? +	CALL	FCMP		;SEE IF TOS IS < 0FFFH +	JC	S13		;EXIT IF GREATER +	CALL	AABS		;GET THE SIGN +	JNZ	OOPS		;WASTE IF NEGATIVE +	ACALL	IFIXL +	CALL	FP_BASE+22	;PRINT HEXMODE +	AJMP	SP2 +OOPS:	CALL	ANEG		;MAKE IT NEGATIVE +	; +S13:	CALL	FP_BASE+14	;DO FP OUTPUT +	MOV	A,#1		;OUTPUT A SPACE +	AJMP	SP7 +	; +	newpage +	;*************************************************************** +	; +	; ANU -  Get variable name from text - set carry if not found +	;        if succeeds returns variable in R7:R6 +	;        R6 = 0 if no digit in name +	; +	;*************************************************************** +	; +ANU:	ACALL	IGC		;INCREMENT AND GET CHARACTER +	LCALL	1FEDH		;CHECK FOR DIGIT +	JC	$+14		;EXIT IF VALID DIGIT +	CJNE	A,#'_',$+4	;SEE IF A _ +	RET +	; +AL:	CJNE	A,#'A',$+3	;IS IT AN ASCII A? +	JC	$+6		;EXIT IF CARRY IS SET +	CJNE	A,#'Z'+1,$+3	;IS IT LESS THAN AN ASCII Z +	CPL	C		;FLIP CARRY +	RET +	; +	JNB	F0,VAR2 +	; +SD0:	MOV	DPTR,#E6X +	AJMP	EK +	; +SDIMX:	SETB	F0		;SAYS DOING A DIMENSION +	SJMP	VAR1 +	; +VAR:	CLR	F0		;SAYS DOING A VARIABLE +	; +VAR1:	ACALL	GC		;GET THE CHARACTER +	ACALL	AL		;CHECK FOR ALPHA +	JNC	$+6		;ERROR IF IN DIM +	JB	F0,SD0 +	RET +	MOV	R7,A		;SAVE ALPHA CHARACTER +	CLR	A		;ZERO IN CASE OF FAILURE +	MOV	R5,A		;SAVE IT +	; +VY:	MOV	R6,A +	ACALL	ANU		;CHECK FOR ALPHA OR NUMBER +	JC	VX		;EXIT IF NO ALPHA OR NUM +	; +	XCH	A,R7 +	ADD	A,R5		;NUMBER OF CHARACTERS IN ALPHABET +	XCH	A,R7		;PUT IT BACK +	MOV	R5,#26		;FOR THE SECOND TIME AROUND +	SJMP	VY +	; +VX:	CLR	LINEB		;TELL EDITOR A VARIABLE IS DECLARED +	CJNE	A,#T_LPAR,V4	;SEE IF A LEFT PAREN +	; +	ORL	R6B0,#80H	;SET BIT 7 TO SIGINIFY MATRIX +	CALL	F_VAR		;FIND THE VARIABLE +	PUSH	R2B0		;SAVE THE LOCATION +	PUSH	R0B0 +	JNC	SD0-3		;DEFAULT IF NOT IN TABLE +	JB	F0,SDI		;NO DEFAULT FOR DIMENSION +	MOV	R1,#10 +	MOV	R3,#0 +	ACALL	D_CHK +	; +VAR2:	ACALL	PAREN_INT	;EVALUATE INTEGER IN PARENS +	CJNE	R3,#0,SD0	;ERROR IF R3<>0 +	POP	DPL		;GET VAR FOR LOOKUP +	POP	DPH +	MOVX	A,@DPTR		;GET DIMENSION +	DEC	A		;BUMP OFFSET +	SUBB	A,R1		;A MUST BE > R1 +	JC	SD0 +	LCALL	DECDP2		;BUMP POINTER TWICE +	ACALL	VARB		;CALCULATE THE BASE +	; +X3120:	XCH	A,R1		;SWAP R2:R0, R3:R1 +	XCH	A,R0 +	XCH	A,R1 +	XCH	A,R3 +	XCH	A,R2 +	XCH	A,R3 +	RET +	; +V4:	JB	F0,SD0		;ERROR IF NO LPAR FOR DIM +	LCALL	F_VAR		;GET SCALAR VARIABLE +	CLR	C +	RET +	; +	newpage +	; +SDI:	ACALL	PAREN_INT	;EVALUATE PAREN EXPRESSION +	CJNE	R3,#0,SD0	;ERROR IF NOT ZERO +	POP	R0B0		;SET UP R2:R0 +	POP	R2B0 +	ACALL	D_CHK		;DO DIM +	ACALL	C_TST		;CHECK FOR COMMA +	JNC	SDIMX		;LOOP IF COMMA +	RET			;RETURN IF NO COMMA +	; +D_CHK:	INC	R1		;BUMP FOR TABLE LOOKUP +	MOV	A,R1 +	JZ	SD0		;ERROR IF 0FFFFH +	MOV	R4,A		;SAVE FOR LATER +	MOV	DPTR,#MT_ALL	;GET MATRIX ALLOCATION +	ACALL	VARB		;DO THE CALCULATION +	MOV	R7,DPH		;SAVE MATRIX ALLOCATION +	MOV	R6,DPL +	MOV	DPTR,#ST_ALL	;SEE IF TOO MUCH MEMORY TAKEN +	CALL	FUL1		;ST_ALL SHOULD BE > R3:R1 +	MOV	DPTR,#MT_ALL	;SAVE THE NEW MATRIX POINTER +	CALL	S31DP +	MOV	DPL,R0		;GET VARIABLE ADDRESS +	MOV	DPH,R2 +	MOV	A,R4		;DIMENSION SIZE +	MOVX	@DPTR,A		;SAVE IT +	CALL	DECDP2		;SAVE TARGET ADDRESS +	; +R76S:	MOV	A,R7 +	MOVX	@DPTR,A +	INC	DPTR +	MOV	A,R6		;ELEMENT SIZE +	MOVX	@DPTR,A +	RET			;R2:R0 STILL HAS SYMBOL TABLE ADDRESS +	; +	newpage +	;*************************************************************** +	; +	; The statement action routine - INPUT +	; +	;*************************************************************** +	; +SINPUT:	ACALL	CPS		;PRINT STRING IF THERE +	; +	ACALL	C_TST		;CHECK FOR A COMMA +	JNC	IN2A		;NO CRLF +	ACALL	SP0		;DO A CRLF +	; +IN2:	MOV	R5,#'?'		;OUTPUT A ? +	CALL	TEROT +	; +IN2A:	SETB	INP_B		;DOING INPUT +	CALL	INLINE		;INPUT THE LINE +	CLR	INP_B +	MOV	TEMP5,#HI(IBUF) +	MOV	TEMP4,#LO(IBUF) +	; +IN3:	ACALL	S_C		;SEE IF A STRING +	JC	IN3A		;IF CARRY IS SET, NO STRING +	ACALL	X3120		;FLIP THE ADDRESSES +	MOV	R3,TEMP5 +	MOV	R1,TEMP4 +	ACALL	SSOOP +	ACALL	C_TST		;SEE IF MORE TO DO +	JNC	IN2 +	RET +	; +IN3A:	CALL	DTEMP		;GET THE USER LOCATION +	CALL	GET_NUM		;GET THE USER SUPPLIED NUMBER +	JNZ	IN5		;ERROR IF NOT ZERO +	CALL	TEMPD		;SAVE THE DATA POINTER +	ACALL	VAR_ER		;GET THE VARIABLE +	ACALL	XPOP		;SAVE THE VARIABLE +	CALL	DTEMP		;GET DPTR BACK FROM VAR_ER +	ACALL	C_TST		;SEE IF MORE TO DO +	JC	IN6		;EXIT IF NO COMMA +	MOVX	A,@DPTR		;GET INPUT TERMINATOR +	CJNE	A,#',',IN5	;IF NOT A COMMA DO A CR AND TRY AGAIN +	INC	DPTR		;BUMP PAST COMMA AND READ NEXT VALUE +	CALL	TEMPD +	SJMP	IN3 +	; +	newpage +	; +IN5:	MOV	DPTR,#IAN	;PRINT INPUT A NUMBER +	CALL	CRP		;DO A CR, THEN, PRINT FROM ROM +	LJMP	CC1		;TRY IT AGAIN +	; +IN6:	MOVX	A,@DPTR +	CJNE	A,#CR,EIGP +	RET +	; +EIGP:	MOV	DPTR,#EIG +	CALL	CRP		;PRINT THE MESSAGE AND EXIT +	AJMP	SP0		;EXIT WITH A CRLF +	; +	;*************************************************************** +	; +SOT:	; On timer interrupt +	; +	;*************************************************************** +	; +	ACALL	TWO		;GET THE NUMBERS +	MOV	SP_H,R3 +	MOV	SP_L,R1 +	MOV	DPTR,#TIV	;SAVE THE NUMBER +	SETB	OTS +	AJMP	R76S		;EXIT +	; +	; +	;*************************************************************** +	; +SCALL:	; Call a user rountine +	; +	;*************************************************************** +	; +	ACALL	INTERR		;CONVERT INTEGER +	CJNE	R2,#0,S_C_1	;SEE IF TRAP +	MOV	A,R0 +	JB	ACC.7,S_C_1 +	ADD	A,R0 +	MOV	DPTR,#4100H +	MOV	DPL,A +	; +S_C_1:	ACALL	AC1		;JUMP TO USER PROGRAM +	ANL	PSW,#11100111B	;BACK TO BANK 0 +	RET			;EXIT +	; +	newpage +	;************************************************************** +	; +THREE:	; Save value for timer function +	; +	;************************************************************** +	; +	ACALL	ONE		;GET THE FIRST INTEGER +	CALL	CBIAS		;BIAS FOR TIMER LOAD +	MOV	T_HH,R3 +	MOV	T_LL,R1 +	MOV	R7,#','		;WASTE A COMMA +	ACALL	EATC		;FALL THRU TO TWO +	; +	;************************************************************** +	; +TWO:	; Get two values seperated by a comma off the stack +	; +	;************************************************************** +	; +	ACALL	EXPRB +	MOV	R7,#','		;WASTE THE COMMA +	ACALL	WE +	JMP	TWOL		;EXIT +	; +	;************************************************************* +	; +ONE:	; Evaluate an expression and get an integer +	; +	;************************************************************* +	; +	ACALL	EXPRB		;EVALUATE EXPERSSION +	; +IFIXL:	CALL	IFIX		;INTEGERS IN R3:R1 +	MOV	A,R1 +	RET +	; +	; +	;************************************************************* +	; +I_PI:	; Increment text pointer then get an integer +	; +	;************************************************************* +	; +	ACALL	GCI1		;BUMP TEXT, THEN GET INTEGER +	; +PAREN_INT:; Get an integer in parens ( ) +	; +	ACALL	P_E +	SJMP	IFIXL +	; +	newpage +	; +DP_B:	MOV	DPH,BOFAH +	MOV	DPL,BOFAL +	RET +	; +DP_T:	MOV	DPH,TXAH +	MOV	DPL,TXAL +	RET +	; +CPS:	ACALL	GC		;GET THE CHARACTER +	CJNE	A,#'"',NOPASS	;EXIT IF NO STRING +	ACALL	DP_T		;GET TEXT POINTER +	INC	DPTR		;BUMP PAST " +	MOV	R4,#'"' +	CALL	PN0		;DO THE PRINT +	INC	DPTR		;GO PAST QUOTE +	CLR	C		;PASSED TEST +	; +T_DP:	MOV	TXAH,DPH	;TEXT POINTER GETS DPTR +	MOV	TXAL,DPL +	RET +	; +	;************************************************************* +	; +S_C:	; Check for a string +	; +	;************************************************************* +	; +	ACALL	GC		;GET THE CHARACTER +	CJNE	A,#'$',NOPASS	;SET CARRY IF NOT A STRING +	AJMP	IST_CAL		;CLEAR CARRY, CALCULATE OFFSET +	; +	; +	; +	;************************************************************** +	; +C_TST:	ACALL	GC		;GET A CHARACTER +	CJNE	A,#',',NOPASS	;SEE IF A COMMA +	; +	newpage +	;*************************************************************** +	; +	;GC AND GCI - GET A CHARACTER FROM TEXT (NO BLANKS) +	;             PUT CHARACTER IN THE ACC +	; +	;*************************************************************** +	; +IGC:	ACALL	GCI1		;BUMP POINTER, THEN GET CHARACTER +	; +GC:	SETB	RS0		;USE BANK 1 +	MOV	P2,R2		;SET UP PORT 2 +	MOVX	A,@R0		;GET EXTERNAL BYTE +	CLR	RS0		;BACK TO BANK 0 +	RET			;EXIT +	; +GCI:	ACALL	GC +	; +	; This routine bumps txa by one and always clears the carry +	; +GCI1:	SETB	RS0		;BANK 1 +	INC	R0		;BUMP TXA +	CJNE	R0,#0,$+4 +	INC	R2 +	CLR	RS0 +	RET			;EXIT +	; +	newpage +	;************************************************************** +	; +	; Check delimiters +	; +	;************************************************************** +	; +DELTST:	ACALL	GC		;GET A CHARACTER +	CJNE	A,#CR,DT1	;SEE IF A CR +	CLR	A +	RET +	; +DT1:	CJNE	A,#':',NOPASS	;SET CARRY IF NO MATCH +	; +L_RET:	RET +	; +	; +	;*************************************************************** +	; +	; FINDC - Find the character in R7, update TXA +	; +	;*************************************************************** +	; +FINDCR:	MOV	R7,#CR		;KILL A STATEMENT LINE +	; +FINDC:	ACALL	DELTST +	JNC	L_RET +	; +	CJNE	A,R7B0,FNDCL2	;MATCH? +	RET +	; +FNDCL2:	ACALL	GCI1 +	SJMP	FINDC		;LOOP +	; +	ACALL	GCI1 +	; +WCR:	ACALL	DELTST		;WASTE UNTIL A "REAL" CR +	JNZ	WCR-2 +	RET +	; +	newpage +	;*************************************************************** +	; +	; VAR_ER - Check for a variable, exit if error +	; +	;*************************************************************** +	; +VAR_ER:	ACALL	VAR +	SJMP	INTERR+2 +	; +	; +	;*************************************************************** +	; +	; S_D0 - The Statement Action Routine DO +	; +	;*************************************************************** +	; +S_DO:	ACALL	CSC		;FINISH UP THE LINE +	MOV	R4,#DTYPE	;TYPE FOR STACK +	ACALL	SGS1		;SAVE ON STACK +	AJMP	ILOOP		;EXIT +	; +	newpage +	;*************************************************************** +	; +	; CLN_UP - Clean up the end of a statement, see if at end of +	;          file, eat character and line count after CR +	; +	;*************************************************************** +	; +C_2:	CJNE	A,#':',C_1	;SEE IF A TERMINATOR +	AJMP	GCI1		;BUMP POINTER AND EXIT, IF SO +	; +C_1:	CJNE	A,#T_ELSE,EP5 +	ACALL	WCR		;WASTE UNTIL A CR +	; +CLN_UP:	ACALL	GC		;GET THE CHARACTER +	CJNE	A,#CR,C_2	;SEE IF A CR +	ACALL	IGC		;GET THE NEXT CHARACTER +	CJNE	A,#EOF,B_TXA	;SEE IF TERMINATOR +	; +NOPASS:	SETB	C +	RET +	; +B_TXA:	XCH	A,TXAL		;BUMP TXA BY THREE +	ADD	A,#3 +	XCH	A,TXAL +	JBC	CY,$+4 +	RET +	INC	TXAH +	RET +	; +	newpage +	;*************************************************************** +	; +	;         Get an INTEGER from the text +	;         sets CARRY if not found +	;         returns the INTGER value in DPTR and R2:R0 +	;         returns the terminator in ACC +	; +	;*************************************************************** +	; +INTERR:	ACALL	INTGER		;GET THE INTEGER +	JC	EP5		;ERROR IF NOT FOUND +	RET			;EXIT IF FOUND +	; +INTGER:	ACALL	DP_T +	CALL	FP_BASE+18	;CONVERT THE INTEGER +	ACALL	T_DP +	MOV	DPH,R2		;PUT THE RETURNED VALUE IN THE DPTR +	MOV	DPL,R0 +	; +ITRET:	RET			;EXIT +	; +	; +WE:	ACALL	EATC		;WASTE THE CHARACTER +	; +	; Fall thru to evaluate the expression +	; +	newpage +	;*************************************************************** +	; +	; EXPRB - Evaluate an expression +	; +	;*************************************************************** +	; +EXPRB:	MOV	R2,#LO(OPBOL)	;BASE PRECEDENCE +	; +EP1:	PUSH	R2B0		;SAVE OPERATOR PRECEDENCE +	CLR	ARGF		;RESET STACK DESIGNATOR +	; +EP2:	MOV	A,SP		;GET THE STACK POINTER +	ADD	A,#12		;NEED AT LEAST 12 BYTES +	JNC	$+5 +	LJMP	ERROR-3 +	MOV	A,ASTKA		;GET THE ARG STACK +	SUBB	A,#LO(TM_TOP+12);NEED 12 BYTES ALSO +	JNC	$+5 +	LJMP	E4YY +	JB	ARGF,EP4	;MUST BE AN OPERATOR, IF SET +	ACALL	VAR		;IS THE VALUE A VARIABLE? +	JNC	EP3		;PUT VARIABLE ON STACK +	; +	ACALL	CONST		;IS THE VALUE A NUMERIC CONSTANT? +	JNC	EP4		;IF SO, CONTINUE, IF NOT, SEE WHAT +	CALL	GC		;GET THE CHARACTER +	CJNE	A,#T_LPAR,EP4	;SEE IF A LEFT PAREN +	MOV	A,#(LO(OPBOL+1)) +	SJMP	XLPAR		;PROCESS THE LEFT PAREN +	; +EP3:	ACALL	PUSHAS		;SAVE VAR ON STACK +	; +EP4:	ACALL	GC		;GET THE OPERATOR +	; +	CJNE	A,#T_LPAR,$+3	;IS IT AN OPERATOR +	JNC	XOP		;PROCESS OPERATOR +	CJNE	A,#T_UOP,$+3	;IS IT A UNARY OPERATOR +	JNC	XBILT		;PROCESS UNARY (BUILT IN) OPERATOR +	POP	R2B0		;GET BACK PREVIOUS OPERATOR PRECEDENCE +	JB	ARGF,ITRET	;OK IF ARG FLAG IS SET +	; +EP5:	CLR	C		;NO RECOVERY +	LJMP	E1XX+2 +	; +	; Process the operator +	; +XOP:	ANL	A,#1FH		;STRIP OFF THE TOKE BITS +	JB	ARGF,XOP1	;IF ARG FLAG IS SET, PROCESS +	CJNE	A,#T_SUB-T_LPAR,XOP3 +	MOV	A,#T_NEG-T_LPAR +	; +	newpage +XOP1:	ADD	A,#LO(OPBOL+1)	;BIAS THE TABLE +	MOV	R2,A +	MOV	DPTR,#00H +	MOVC	A,@A+DPTR	;GET THE CURRENT PRECEDENCE +	MOV	R4,A +	POP	ACC		;GET THE PREVIOUS PRECEDENCE +	MOV	R5,A		;SAVE THE PREVIOUS PRECEDENCE +	MOVC	A,@A+DPTR	;GET IT +	CJNE	A,R4B0,$+7	;SEE WHICH HAS HIGHER PRECEDENCE +	CJNE	A,#12,ITRET	;SEE IF ANEG +	SETB	C +	JNC	ITRET		;PROCESS NON-INCREASING PRECEDENCE +	; +	; Save increasing precedence +	; +	PUSH	R5B0		;SAVE OLD PRECEDENCE ADDRESS +	PUSH	R2B0		;SAVE NEW PRECEDENCE ADDRESS +	ACALL	GCI1		;EAT THE OPERATOR +	ACALL	EP1		;EVALUATE REMAINING EXPRESSION +	POP	ACC +	; +	; R2 has the action address, now setup and perform operation +	; +XOP2:	MOV	DPTR,#OPTAB +	ADD	A,#LO(~OPBOL) +	CALL	ISTA1		;SET UP TO RETURN TO EP2 +	AJMP	EP2		;JUMP TO EVALUATE EXPRESSION +	; +	; Built-in operator processing +	; +XBILT:	ACALL	GCI1		;EAT THE TOKEN +	ADD	A,#LO(50H+LO(UOPBOL)) +	JB	ARGF,EP5	;XBILT MUST COME AFTER AN OPERATOR +	CJNE	A,#STP,$+3 +	JNC	XOP2 +	; +XLPAR:	PUSH	ACC		;PUT ADDRESS ON THE STACK +	ACALL	P_E +	SJMP	XOP2-2		;PERFORM OPERATION +	; +XOP3:	CJNE	A,#T_ADD-T_LPAR,EP5 +	ACALL	GCI1 +	AJMP	EP2		;WASTE + SIGN +	; +	newpage +XPOP:	ACALL	X3120		;FLIP ARGS THEN POP +	; +	;*************************************************************** +	; +	; POPAS - Pop arg stack and copy variable to R3:R1 +	; +	;*************************************************************** +	; +POPAS:	LCALL	INC_ASTKA +	JMP	VARCOP		;COPY THE VARIABLE +	; +AXTAL:	MOV	R2,#HI(CXTAL) +	MOV	R0,#LO(CXTAL) +	; +	; fall thru +	; +	;*************************************************************** +	; +PUSHAS:	; Push the Value addressed by R2:R0 onto the arg stack +	; +	;*************************************************************** +	; +	CALL	DEC_ASTKA +	SETB	ARGF		;SAYS THAT SOMTHING IS ON THE STACK +	LJMP	VARCOP +	; +	; +	;*************************************************************** +	; +ST_A:	; Store at expression +	; +	;*************************************************************** +	; +	ACALL	ONE		;GET THE EXPRESSION +	SJMP	POPAS		;SAVE IT +	; +	; +	;*************************************************************** +	; +LD_A:	; Load at expression +	; +	;*************************************************************** +	; +	ACALL	ONE		;GET THE EXPRESSION +	ACALL	X3120		;FLIP ARGS +	SJMP	PUSHAS +	; +	newpage +	;*************************************************************** +	; +CONST:	; Get a constant fron the text +	; +	;*************************************************************** +	; +	CALL	GC		;FIRST SEE IF LITERAL +	CJNE	A,#T_ASC,C0C	;SEE IF ASCII TOKEN +	CALL	IGC		;GET THE CHARACTER AFTER TOKEN +	CJNE	A,#'$',CN0	;SEE IF A STRING +	; +CNX:	CALL	CSY		;CALCULATE IT +	LJMP	AXBYTE+2	;SAVE IT ON THE STACK ******AA JMP-->LJMP +	; +CN0:	LCALL	TWO_R2		;PUT IT ON THE STACK ******AA CALL-->LCALL +	CALL	GCI1		;BUMP THE POINTER +	LJMP	ERPAR		;WASTE THE RIGHT PAREN ******AA JMP-->LJMP +	; +	; +C0C:	CALL	DP_T		;GET THE TEXT POINTER +	CALL	GET_NUM		;GET THE NUMBER +	CJNE	A,#0FFH,C1C	;SEE IF NO NUMBER +	SETB	C +C2C:	RET +	; +C1C:	JNZ	FPTST +	CLR	C +	SETB	ARGF +	; +C3C:	JMP	T_DP +	; +FPTST:	ANL	A,#00001011B	;CHECK FOR ERROR +	JZ	C2C		;EXIT IF ZERO +	; +	; Handle the error condition +	; +	MOV	DPTR,#E2X	;DIVIDE BY ZERO +	JNB	ACC.0,$+6	;UNDERFLOW +	MOV	DPTR,#E7X +	JNB	ACC.1,$+6	;OVERFLOW +	MOV	DPTR,#E11X +	; +FPTS:	JMP	ERROR +	; +	newpage +	;*************************************************************** +	; +	; The Command action routine - LIST +	; +	;*************************************************************** +	; +CLIST:	CALL	NUMC		;SEE IF TO LINE PORT +	ACALL	FSTK		;PUT 0FFFFH ON THE STACK +	CALL	INTGER		;SEE IF USER SUPPLIES LN +	CLR	A		;LN = 0 TO START +	MOV	R3,A +	MOV	R1,A +	JC	CL1		;START FROM ZERO +	; +	CALL	TEMPD		;SAVE THE START ADDTESS +	CALL	GCI		;GET THE CHARACTER AFTER LIST +	CJNE	A,#T_SUB,$+10	;CHECK FOR TERMINATION ADDRESS '-' +	ACALL	INC_ASTKA	;WASTE 0FFFFH +	LCALL	INTERR		;GET TERMINATION ADDRESS +	ACALL	TWO_EY		;PUT TERMINATION ON THE ARG STACK +	MOV	R3,TEMP5	;GET THE START ADDTESS +	MOV	R1,TEMP4 +	; +CL1:	CALL	GETLIN		;GET THE LINE NO IN R3:R1 +	JZ	CL3		;RET IF AT END +	; +CL2:	ACALL	C3C		;SAVE THE ADDRESS +	INC	DPTR		;POINT TO LINE NUMBER +	ACALL	PMTOP+3		;PUT LINE NUMBER ON THE STACK +	ACALL	CMPLK		;COMPARE LN TO END ADDRESS +	JC	CL3		;EXIT IF GREATER +	CALL	BCK		;CHECK FOR A CONTROL C +	ACALL	DEC_ASTKA	;SAVE THE COMPARE ADDRESS +	CALL	DP_T		;RESTORE ADDRESS +	ACALL	UPPL		;UN-PROCESS THE LINE +	ACALL	C3C		;SAVE THE CR ADDRESS +	ACALL	CL6		;PRINT IT +	INC	DPTR		;BUMP POINTER TO NEXT LINE +	MOVX	A,@DPTR		;GET LIN LENGTH +	DJNZ	ACC,CL2		;LOOP +	ACALL	INC_ASTKA	;WASTE THE COMPARE BYTE +	; +CL3:	AJMP	CMND1		;BACK TO COMMAND PROCESSOR +	; +CL6:	MOV	DPTR,#IBUF	;PRINT IBUF +	CALL	PRNTCR		;PRINT IT +	CALL	DP_T +	; +CL7:	JMP	CRLF +	; +	LCALL	X31DP +	newpage +	;*************************************************************** +	; +	;UPPL - UN PREPROCESS A LINE ADDRESSED BY DPTR INTO IBUF +	;       RETURN SOURCE ADDRESS OF CR IN DPTR ON RETURN +	; +	;*************************************************************** +	; +UPPL:	MOV	R3,#HI(IBUF)	;POINT R3 AT HIGH IBUF +	MOV	R1,#LO(IBUF)	;POINT R1 AT IBUF +	INC	DPTR		;SKIP OVER LINE LENGTH +	ACALL	C3C		;SAVE THE DPTR (DP_T) +	CALL	L20DPI		;PUT LINE NUMBER IN R2:R0 +	CALL	FP_BASE+16	;CONVERT R2:R0 TO INTEGER +	CALL	DP_T +	INC	DPTR		;BUMP DPTR PAST THE LINE NUMBER +	; +UPP0:	CJNE	R1,#LO(IBUF+6),$+3 +	JC	UPP1A-4		;PUT SPACES IN TEXT +	INC	DPTR		;BUMP PAST LN HIGH +	MOVX	A,@DPTR		;GET USER TEXT +	MOV	R6,A		;SAVE A IN R6 FOR TOKE COMPARE +	JB	ACC.7,UPP1	;IF TOKEN, PROCESS +	CJNE	A,#20H,$+3	;TRAP THE USER TOKENS +	JNC	$+5 +	CJNE	A,#CR,UPP1	;DO IT IF NOT A CR +	CJNE	A,#'"',UPP9	;SEE IF STRING +	ACALL	UPP7		;SAVE IT +	ACALL	UPP8		;GET THE NEXT CHARACTER AND SAVE IT +	CJNE	A,#'"',$-2	;LOOP ON QUOTES +	SJMP	UPP0 +	; +UPP9:	CJNE	A,#':',UPP1A	;PUT A SPACE IN DELIMITER +	ACALL	UPP7A +	MOV	A,R6 +	ACALL	UPP7 +	ACALL	UPP7A +	SJMP	UPP0 +	; +UPP1A:	ACALL	UPP8+2		;SAVE THE CHARACTER, UPDATE POINTER +	SJMP	UPP0		;EXIT IF A CR, ELSE LOOP +	; +UPP1:	ACALL	C3C		;SAVE THE TEXT POINTER +	MOV	C,XBIT +	MOV	F0,C		;SAVE XBIT IN F0 +	MOV	DPTR,#TOKTAB	;POINT AT TOKEN TABLE +	JNB	F0,UPP2 +	LCALL	2078H		;SET UP DPTR FOR LOOKUP +	; +UPP2:	CLR	A		;ZERO A FOR LOOKUP +	MOVC	A,@A+DPTR	;GET TOKEN +	INC	DPTR		;ADVANCE THE TOKEN POINTER +	CJNE	A,#0FFH,UP_2	;SEE IF DONE +	JBC	F0,UPP2-9	;NOW DO NORMAL TABLE +	AJMP	CMND1		;EXIT IF NOT FOUND +	; +UP_2:	CJNE	A,R6B0,UPP2	;LOOP UNTIL THE SAME +	; +UP_3:	CJNE	A,#T_UOP,$+3 +	JNC	UPP3 +	ACALL	UPP7A		;PRINT THE SPACE IF OK +	; +UPP3:	CLR	A		;DO LOOKUP +	MOVC	A,@A+DPTR +	JB	ACC.7,UPP4	;EXIT IF DONE, ELSE SAVE +	JZ	UPP4		;DONE IF ZERO +	ACALL	UPP7		;SAVE THE CHARACTER +	INC	DPTR +	SJMP	UPP3		;LOOP +	; +UPP4:	CALL	DP_T		;GET IT BACK +	MOV	A,R6		;SEE IF A REM TOKEN +	XRL	A,#T_REM +	JNZ	$+6 +	ACALL	UPP8 +	SJMP	$-2 +	JNC	UPP0		;START OVER AGAIN IF NO TOKEN +	ACALL	UPP7A		;PRINT THE SPACE IF OK +	SJMP	UPP0		;DONE +	; +UPP7A:	MOV	A,#' '		;OUTPUT A SPACE +	; +UPP7:	AJMP	PPL9+1		;SAVE A +	; +UPP8:	INC	DPTR +	MOVX	A,@DPTR +	CJNE	A,#CR,UPP7 +	AJMP	PPL7+1 +	; +	newpage +	;************************************************************** +	; +	; This table contains all of the floating point constants +	; +	; The constants in ROM are stored "backwards" from the way +	; basic normally treats floating point numbers. Instead of +	; loading from the exponent and decrementing the pointer, +	; ROM constants pointers load from the most significant +	; digits and increment the pointers. This is done to 1) make +	; arg stack loading faster and 2) compensate for the fact that +	; no decrement data pointer instruction exsist. +	; +	; The numbers are stored as follows: +	; +	; BYTE X+5    = MOST SIGNIFICANT DIGITS IN BCD +	; BYTE X+4    = NEXT MOST SIGNIFICANT DIGITS IN BCD +	; BYTE X+3    = NEXT LEAST SIGNIFICANT DIGITS IN BCD +	; BYTE X+2    = LEAST SIGNIFICANT DIGITS IN BCD +	; BYTE X+1    = SIGN OF THE ABOVE MANTISSA 0 = +, 1 = - +	; BYTE X      = EXPONENT IN TWO'S COMPLEMENT BINARY +	;               ZERO EXPONENT = THE NUMBER ZERO +	; +	;************************************************************** +	; +ATTAB:	DB	128-2		; ARCTAN LOOKUP +	DB	00H +	DB	57H +	DB	22H +	DB	66H +	DB	28H +	; +	DB	128-1 +	DB	01H +	DB	37H +	DB	57H +	DB	16H +	DB	16H +	; +	DB	128-1 +	DB	00H +	DB	14H +	DB	96H +	DB	90H +	DB	42H +	; +	DB	128-1 +	DB	01H +	DB	40H +	DB	96H +	DB	28H +	DB	75H +	; +	DB	128 +	DB	00H +	DB	64H +	DB	62H +	DB	65H +	DB	10H +	; +	DB	128 +	DB	01H +	DB	99H +	DB	88H +	DB	20H +	DB	14H +	; +	DB	128 +	DB	00H +	DB	51H +	DB	35H +	DB	99H +	DB	19H +	; +	DB	128 +	DB	01H +	DB	45H +	DB	31H +	DB	33H +	DB	33H +	; +	DB	129 +	DB	00H +	DB	00H +	DB	00H +	DB	00H +	DB	10H +	; +	DB	0FFH		;END OF TABLE +	; +NTWO:	DB	129 +	DB	0 +	DB	0 +	DB	0 +	DB	0 +	DB	20H +	; +TTIME:	DB	128-4		; CLOCK CALCULATION +	DB	00H +	DB	00H +	DB	00H +	DB	04H +	DB	13H +	; +	newpage +	;*************************************************************** +	; +	; COSINE - Add pi/2 to stack, then fall thru to SIN +	; +	;*************************************************************** +	; +ACOS:	ACALL	POTWO		;PUT PI/2 ON THE STACK +	ACALL	AADD		;TOS = TOS+PI/2 +	; +	;*************************************************************** +	; +	; SINE - use taylor series to calculate sin function +	; +	;*************************************************************** +	; +ASIN:	ACALL	PIPI		;PUT PI ON THE STACK +	ACALL	RV		;REDUCE THE VALUE +	MOV	A,MT2		;CALCULATE THE SIGN +	ANL	A,#01H		;SAVE LSB +	XRL	MT1,A		;SAVE SIGN IN MT1 +	ACALL	CSTAKA		;NOW CONVERT TO ONE QUADRANT +	ACALL	POTWO +	ACALL	CMPLK		;DO COMPARE +	JC	$+6 +	ACALL	PIPI +	ACALL	ASUB +	ACALL	AABS +	MOV	DPTR,#SINTAB	;SET UP LOOKUP TABLE +	ACALL	POLYC		;CALCULATE THE POLY +	ACALL	STRIP +	AJMP	SIN0 +	; +	; Put PI/2 on the stack +	; +POTWO:	ACALL	PIPI		;PUT PI ON THE STACK, NOW DIVIDE +	; +DBTWO:	MOV	DPTR,#NTWO +	ACALL	PUSHC +	;MOV	A,#2		;BY TWO +	;ACALL	TWO_R2 +	AJMP	ADIV +	; +	newpage +	;************************************************************* +	; +POLYC:	; Expand a power series to calculate a polynomial +	; +	;************************************************************* +	; +	ACALL	CSTAKA2		;COPY THE STACK +	ACALL	AMUL		;SQUARE THE STACK +	ACALL	POP_T1		;SAVE X*X +	ACALL	PUSHC		;PUT CONSTANT ON STACK +	; +POLY1:	ACALL	PUSH_T1		;PUT COMPUTED VALUE ON STACK +	ACALL	AMUL		;MULTIPLY CONSTANT AND COMPUTED VALUE +	ACALL	PUSHC		;PUT NEXT CONSTANT ON STACK +	ACALL	AADD		;ADD IT TO THE OLD VALUE +	CLR	A		;CHECK TO SEE IF DONE +	MOVC	A,@A+DPTR +	CJNE	A,#0FFH,POLY1	;LOOP UNTIL DONE +	; +AMUL:	LCALL	FP_BASE+6 +	AJMP	FPTST +	; +	;************************************************************* +	; +RV:	; Reduce a value for Trig and A**X functions +	; +	; value = (value/x - INT(value/x)) * x +	; +	;************************************************************* +	; +	ACALL	C_T2		;COPY TOS TO T2 +	ACALL	ADIV		;TOS = TOS/TEMP2 +	ACALL	AABS		;MAKE THE TOS A POSITIVE NUMBER +	MOV	MT1,A		;SAVE THE SIGN +	ACALL	CSTAKA2		;COPY THE STACK TWICE +	ACALL	IFIX		;PUT THE NUMBER IN R3:R1 +	PUSH	R3B0		;SAVE R3 +	MOV	MT2,R1		;SAVE THE LS BYTE IN MT2 +	ACALL	AINT		;MAKE THE TOS AN INTEGER +	ACALL	ASUB		;TOS = TOS/T2 - INT(TOS/T2) +	ACALL	P_T2		;TOS = T2 +	ACALL	AMUL		;TOS = T2*(TOS/T2 - INT(TOS/T2) +	POP	R3B0		;RESTORE R3 +	RET			;EXIT +	; +	newpage +	;************************************************************** +	; +	; TAN +	; +	;************************************************************** +	; +ATAN:	ACALL	CSTAKA		;DUPLACATE STACK +	ACALL	ASIN		;TOS = SIN(X) +	ACALL	SWAP_ASTKA	;TOS = X +	ACALL	ACOS		;TOS = COS(X) +	AJMP	ADIV		;TOS = SIN(X)/COS(X) +	; +STRIP:	ACALL	SETREG		;SETUP R0 +	MOV	R3,#1		;LOOP COUNT +	AJMP	AI2-1		;WASTE THE LSB +	; +	;************************************************************ +	; +	; ARC TAN +	; +	;************************************************************ +	; +AATAN:	ACALL	AABS +	MOV	MT1,A		;SAVE THE SIGN +	ACALL	SETREG		;GET THE EXPONENT +	ADD	A,#7FH		;BIAS THE EXPONENT +	MOV	UBIT,C		;SAVE CARRY STATUS +	JNC	$+4		;SEE IF > 1 +	ACALL	RECIP		;IF > 1, TAKE RECIP +	MOV	DPTR,#ATTAB	;SET UP TO CALCULATE THE POLY +	ACALL	POLYC		;CALCULATE THE POLY +	JNB	UBIT,SIN0	;JUMP IF NOT SET +	ACALL	ANEG		;MAKE X POLY NEGATIVE +	ACALL	POTWO		;SUBTRACT PI/2 +	ACALL	AADD +	; +SIN0:	MOV	A,MT1		;GET THE SIGN +	JZ	SRT +	AJMP	ANEG +	; +	newpage +	;************************************************************* +	; +	; FCOMP - COMPARE 0FFFFH TO TOS +	; +	;************************************************************* +	; +FCMP:	ACALL	CSTAKA		;COPY THE STACK +	ACALL	FSTK		;MAKE THE TOS = 0FFFFH +	ACALL	SWAP_ASTKA	;NOW COMPARE IS 0FFFFH - X +	; +CMPLK:	JMP	FP_BASE+4	;DO THE COMPARE +	; +	;************************************************************* +	; +DEC_ASTKA:	;Push ARG STACK and check for underflow +	; +	;************************************************************* +	; +	MOV	A,#-FPSIZ +	ADD	A,ASTKA +	CJNE	A,#LO(TM_TOP+6),$+3 +	JC	E4YY +	MOV	ASTKA,A +	MOV	R1,A +	MOV	R3,#ASTKAH +	; +SRT:	RET +	; +E4YY:	MOV	DPTR,#EXA +	AJMP	FPTS		;ARG STACK ERROR +	; +	; +AXTAL3:	ACALL	PUSHC		;PUSH CONSTANT, THEN MULTIPLY +	ACALL	AMUL +	; +	; Fall thru to IFIX +	; +	newpage +	;*************************************************************** +	; +IFIX:	; Convert a floating point number to an integer, put in R3:R1 +	; +	;*************************************************************** +	; +	CLR	A		;RESET THE START +	MOV	R3,A +	MOV	R1,A +	MOV	R0,ASTKA	;GET THE ARG STACK +	MOV	P2,#ASTKAH +	MOVX	A,@R0		;READ EXPONENT +	CLR	C +	SUBB	A,#81H		;BASE EXPONENT +	MOV	R4,A		;SAVE IT +	DEC	R0		;POINT AT SIGN +	MOVX	A,@R0		;GET THE SIGN +	JNZ	SQ_ERR		;ERROR IF NEGATIVE +	JC	INC_ASTKA	;EXIT IF EXPONENT IS < 81H +	INC	R4		;ADJUST LOOP COUNTER +	MOV	A,R0		;BUMP THE POINTER REGISTER +	SUBB	A,#FPSIZ-1 +	MOV	R0,A +	; +I2:	INC	R0		;POINT AT DIGIT +	MOVX	A,@R0		;GET DIGIT +	SWAP	A		;FLIP +	CALL	FP_BASE+20	;ACCUMULATE +	JC	SQ_ERR +	DJNZ	R4,$+4 +	SJMP	INC_ASTKA +	MOVX	A,@R0		;GET DIGIT +	CALL	FP_BASE+20 +	JC	SQ_ERR +	DJNZ	R4,I2 +	; +	newpage +	;************************************************************ +	; +INC_ASTKA:	; Pop the ARG STACK and check for overflow +	; +	;************************************************************ +	; +	MOV	A,#FPSIZ	;NUMBER TO POP +	SJMP	SETREG+1 +	; +SETREG:	CLR	A		;DON'T POP ANYTHING +	MOV	R0,ASTKA +	MOV	R2,#ASTKAH +	MOV	P2,R2 +	ADD	A,R0 +	JC	E4YY +	MOV	ASTKA,A +	MOVX	A,@R0 +A_D:	RET +	; +	;************************************************************ +	; +	; EBIAS - Bias a number for E to the X calculations +	; +	;************************************************************ +	; +EBIAS:	ACALL	PUSH_ONE +	ACALL	RV +	CJNE	R3,#00H,SQ_ERR	;ERROR IF R3 <> 0 +	ACALL	C_T2		;TEMP 2 GETS FRACTIONS +	ACALL	INC_ASTKA +	ACALL	POP_T1 +	ACALL	PUSH_ONE +	; +AELP:	MOV	A,MT2 +	JNZ	AEL1 +	; +	MOV	A,MT1 +	JZ	A_D +	MOV	DPTR,#FPT2-1 +	MOVX	@DPTR,A		;MAKE THE FRACTIONS NEGATIVE +	; +RECIP:	ACALL	PUSH_ONE +	ACALL	SWAP_ASTKA +	AJMP	ADIV +	; +AEL1:	DEC	MT2 +	ACALL	PUSH_T1 +	ACALL	AMUL +	SJMP	AELP +	; +SQ_ERR:	LJMP	E3XX		;LINK TO BAD ARG +	; +	newpage +	;************************************************************ +	; +	; SQUARE ROOT +	; +	;************************************************************ +	; +ASQR:	ACALL	AABS		;GET THE SIGN +	JNZ	SQ_ERR		;ERROR IF NEGATIVE +	ACALL	C_T2		;COPY VARIABLE TO T2 +	ACALL	POP_T1		;SAVE IT IN T1 +	MOV	R0,#LO(FPT1) +	MOVX	A,@R0		;GET EXPONENT +	JZ	ALN-2		;EXIT IF ZERO +	ADD	A,#128		;BIAS THE EXPONENT +	JNC	SQR1		;SEE IF < 80H +	RR	A +	ANL	A,#127 +	SJMP	SQR2 +	; +SQR1:	CPL	A		;FLIP BITS +	INC	A +	RR	A +	ANL	A,#127		;STRIP MSB +	CPL	A +	INC	A +	; +SQR2:	ADD	A,#128		;BIAS EXPONENT +	MOVX	@R0,A		;SAVE IT +	; +	; NEWGUESS = ( X/OLDGUESS + OLDGUESS) / 2 +	; +SQR4:	ACALL	P_T2		;TOS = X +	ACALL	PUSH_T1		;PUT NUMBER ON STACK +	ACALL	ADIV		;TOS = X/GUESS +	ACALL	PUSH_T1		;PUT ON AGAIN +	ACALL	AADD		;TOS = X/GUESS + GUESS +	ACALL	DBTWO		;TOS = ( X/GUESS + GUESS ) / 2 +	ACALL	TEMP_COMP	;SEE IF DONE +	JNB	F0,SQR4 +	; +	AJMP	PUSH_T1		;PUT THE ANSWER ON THE STACK +	; +	newpage +	;************************************************************* +	; +	; NATURAL LOG +	; +	;************************************************************* +	; +ALN:	ACALL	AABS		;MAKE SURE THAT NUM IS POSITIVE +	JNZ	SQ_ERR		;ERROR IF NOT +	MOV	MT2,A		;CLEAR FOR LOOP +	INC	R0		;POINT AT EXPONENT +	MOVX	A,@R0		;READ THE EXPONENT +	JZ	SQ_ERR		;ERROR IF EXPONENT IS ZERO +	CJNE	A,#81H,$+3	;SEE IF NUM >= 1 +	MOV	UBIT,C		;SAVE CARRY STATUS +	JC	$+4		;TAKE RECIP IF >= 1 +	ACALL	RECIP +	; +	; Loop to reduce +	; +ALNL:	ACALL	CSTAKA		;COPY THE STACK FOR COMPARE +	ACALL	PUSH_ONE	;COMPARE NUM TO ONE +	ACALL	CMPLK +	JNC	ALNO		;EXIT IF DONE +	ACALL	SETREG		;GET THE EXPONENT +	ADD	A,#85H		;SEE HOW BIG IT IS +	JNC	ALN11		;BUMP BY EXP(11) IF TOO SMALL +	ACALL	PLNEXP		;PUT EXP(1) ON STACK +	MOV	A,#1		;BUMP COUNT +	; +ALNE:	ADD	A,MT2 +	JC	SQ_ERR +	MOV	MT2,A +	ACALL	AMUL		;BIAS THE NUMBER +	SJMP	ALNL +	; +ALN11:	MOV	DPTR,#EXP11	;PUT EXP(11) ON STACK +	ACALL	PUSHC +	MOV	A,#11 +	SJMP	ALNE +	; +	newpage +ALNO:	ACALL	C_T2		;PUT NUM IN TEMP 2 +	ACALL	PUSH_ONE	;TOS = 1 +	ACALL	ASUB		;TOS = X - 1 +	ACALL	P_T2		;TOS = X +	ACALL	PUSH_ONE	;TOS = 1 +	ACALL	AADD		;TOS = X + 1 +	ACALL	ADIV		;TOS = (X-1)/(X+1) +	MOV	DPTR,#LNTAB	;LOG TABLE +	ACALL	POLYC +	INC	DPTR		;POINT AT LN(10) +	ACALL	PUSHC +	ACALL	AMUL +	MOV	A,MT2		;GET THE COUNT +	ACALL	TWO_R2		;PUT IT ON THE STACK +	ACALL	ASUB		;INT - POLY +	ACALL	STRIP +	JNB	UBIT,AABS +	; +LN_D:	RET +	; +	;************************************************************* +	; +TEMP_COMP:	; Compare FPTEMP1 to TOS, FPTEMP1 gets TOS +	; +	;************************************************************* +	; +	ACALL	PUSH_T1		;SAVE THE TEMP +	ACALL	SWAP_ASTKA	;TRADE WITH THE NEXT NUMBER +	ACALL	CSTAKA		;COPY THE STACK +	ACALL	POP_T1		;SAVE THE NEW NUMBER +	JMP	FP_BASE+4	;DO THE COMPARE +	; +	newpage +AETOX:	ACALL	PLNEXP		;EXP(1) ON TOS +	ACALL	SWAP_ASTKA	;X ON TOS +	; +AEXP:	;EXPONENTIATION +	; +	ACALL	EBIAS		;T1=BASE,T2=FRACTIONS,TOS=INT MULTIPLIED +	MOV	DPTR,#FPT2	;POINT AT FRACTIONS +	MOVX	A,@DPTR		;READ THE EXP OF THE FRACTIONS +	JZ	LN_D		;EXIT IF ZERO +	ACALL	P_T2		;TOS = FRACTIONS +	ACALL	PUSH_T1		;TOS = BASE +	ACALL	SETREG		;SEE IF BASE IS ZERO +	JZ	$+4 +	ACALL	ALN		;TOS = LN(BASE) +	ACALL	AMUL		;TOS = FRACTIONS * LN(BASE) +	ACALL	PLNEXP		;TOS = EXP(1) +	ACALL	SWAP_ASTKA	;TOS = FRACTIONS * LN(BASE) +	ACALL	EBIAS		;T2 = FRACTIONS, TOS = INT MULTIPLIED +	MOV	MT2,#00H	;NOW CALCULATE E**X +	ACALL	PUSH_ONE +	ACALL	CSTAKA +	ACALL	POP_T1		;T1 = 1 +	; +AEXL:	ACALL	P_T2		;TOS = FRACTIONS +	ACALL	AMUL		;TOS = FRACTIONS * ACCUMLATION +	INC	MT2		;DO THE DEMONIATOR +	MOV	A,MT2 +	ACALL	TWO_R2 +	ACALL	ADIV +	ACALL	CSTAKA		;SAVE THE ITERATION +	ACALL	PUSH_T1		;NOW ACCUMLATE +	ACALL	AADD		;ADD ACCUMLATION +	ACALL	TEMP_COMP +	JNB	F0,AEXL		;LOOP UNTIL DONE +	; +	ACALL	INC_ASTKA +	ACALL	PUSH_T1 +	ACALL	AMUL		;LAST INT MULTIPLIED +	; +MU1:	AJMP	AMUL		;FIRST INT MULTIPLIED +	; +	newpage +	;*************************************************************** +	; +	; integer operator - INT +	; +	;*************************************************************** +	; +AINT:	ACALL	SETREG		;SET UP THE REGISTERS, CLEAR CARRY +	SUBB	A,#129		;SUBTRACT EXPONENT BIAS +	JNC	AI1		;JUMP IF ACC > 81H +	; +	; Force the number to be a zero +	; +	ACALL	INC_ASTKA	;BUMP THE STACK +	; +P_Z:	MOV	DPTR,#ZRO	;PUT ZERO ON THE STACK +	AJMP	PUSHC +	; +AI1:	SUBB	A,#7 +	JNC	AI3 +	CPL	A +	INC	A +	MOV	R3,A +	DEC	R0		;POINT AT SIGN +	; +AI2:	DEC	R0		;NOW AT LSB'S +	MOVX	A,@R0		;READ BYTE +	ANL	A,#0F0H		;STRIP NIBBLE +	MOVX	@R0,A		;WRITE BYTE +	DJNZ	R3,$+3 +	RET +	CLR	A +	MOVX	@R0,A		;CLEAR THE LOCATION +	DJNZ	R3,AI2 +	; +AI3:	RET			;EXIT +	; +	newpage +	;*************************************************************** +	; +AABS:	; Absolute value - Make sign of number positive +	;                  return sign in ACC +	; +	;*************************************************************** +	; +	ACALL	ANEG		;CHECK TO SEE IF + OR - +	JNZ	ALPAR		;EXIT IF NON ZERO, BECAUSE THE NUM IS +	MOVX	@R0,A		;MAKE A POSITIVE SIGN +	RET +	; +	;*************************************************************** +	; +ASGN:	; Returns the sign of the number 1 = +, -1 = - +	; +	;*************************************************************** +	; +	ACALL	INC_ASTKA	;POP STACK, GET EXPONENT +	JZ	P_Z		;EXIT IF ZERO +	DEC	R0		;BUMP TO SIGN +	MOVX	A,@R0		;GET THE SIGN +	MOV	R7,A		;SAVE THE SIGN +	ACALL	PUSH_ONE	;PUT A ONE ON THE STACK +	MOV	A,R7		;GET THE SIGN +	JZ	ALPAR		;EXIT IF ZERO +	; +	; Fall thru to ANEG +	; +	;*************************************************************** +	; +ANEG:	; Flip the sign of the number on the tos +	; +	;*************************************************************** +	; +	ACALL	SETREG +	DEC	R0		;POINT AT THE SIGN OF THE NUMBER +	JZ	ALPAR		;EXIT IF ZERO +	MOVX	A,@R0 +	XRL	A,#01H		;FLIP THE SIGN +	MOVX	@R0,A +	XRL	A,#01H		;RESTORE THE SIGN +	; +ALPAR:	RET +	; +	newpage +	;*************************************************************** +	; +ACBYTE:	; Read the ROM +	; +	;*************************************************************** +	; +	ACALL	IFIX		;GET EXPRESSION +	CALL	X31DP		;PUT R3:R1 INTO THE DP +	CLR	A +	MOVC	A,@A+DPTR +	AJMP	TWO_R2 +	; +	;*************************************************************** +	; +ADBYTE:	; Read internal memory +	; +	;*************************************************************** +	; +	ACALL	IFIX		;GET THE EXPRESSION +	CALL	R3CK		;MAKE SURE R3 = 0 +	MOV	A,@R1 +	AJMP	TWO_R2 +	; +	;*************************************************************** +	; +AXBYTE: ; Read external memory +	; +	;*************************************************************** +	; +	ACALL	IFIX		;GET THE EXPRESSION +	MOV	P2,R3 +	MOVX	A,@R1 +	AJMP	TWO_R2 +	; +	newpage +	;*************************************************************** +	; +	; The relational operators - EQUAL                        (=) +	;                            GREATER THAN                 (>) +	;                            LESS THAN                    (<) +	;                            GREATER THAN OR EQUAL        (>=) +	;                            LESS THAN OR EQUAL           (<=) +	;                            NOT EQUAL                    (<>) +	; +	;*************************************************************** +	; +AGT:	ACALL	CMPLK +	ORL	C,F0		;SEE IF EITHER IS A ONE +	JC	P_Z +	; +FSTK:	MOV	DPTR,#FS +	AJMP	PUSHC +	; +FS:	DB	85H +	DB	00H +	DB	00H +	DB	50H +	DB	53H +	DB	65H +	; +ALT:	ACALL	CMPLK +	CPL	C +	SJMP	AGT+4 +	; +AEQ:	ACALL	CMPLK +	MOV	C,F0 +	SJMP	ALT+2 +	; +ANE:	ACALL	CMPLK +	CPL	F0 +	SJMP	AEQ+2 +	; +AGE:	ACALL	CMPLK +	SJMP	AGT+4 +	; +ALE:	ACALL	CMPLK +	ORL	C,F0 +	SJMP	ALT+2 +	; +	newpage +	;*************************************************************** +	; +ARND:	; Generate a random number +	; +	;*************************************************************** +	; +	MOV	DPTR,#RCELL	;GET THE BINARY SEED +	CALL	L31DPI +	MOV	A,R1 +	CLR	C +	RRC	A +	MOV	R0,A +	MOV	A,#6 +	RRC	A +	ADD	A,R1 +	XCH	A,R0 +	ADDC	A,R3 +	MOV	R2,A +	DEC	DPL		;SAVE THE NEW SEED +	ACALL	S20DP +	ACALL	TWO_EY +	ACALL	FSTK +	; +ADIV:	LCALL	FP_BASE+8 +	AJMP	FPTST +	; +	newpage +	;*************************************************************** +	; +SONERR:	; ON ERROR Statement +	; +	;*************************************************************** +	; +	LCALL	INTERR		;GET THE LINE NUMBER +	SETB	ON_ERR +	MOV	DPTR,#ERRNUM	;POINT AT THR ERROR LOCATION +	SJMP	S20DP +	; +	; +	;************************************************************** +	; +SONEXT:	; ON EXT1 Statement +	; +	;************************************************************** +	; +	LCALL	INTERR +	SETB	INTBIT +	ORL	IE,#10000100B	;ENABLE INTERRUPTS +	MOV	DPTR,#INTLOC +	; +S20DP:	MOV	A,R2		;SAVE R2:R0 @DPTR +	MOVX	@DPTR,A +	INC	DPTR +	MOV	A,R0 +	MOVX	@DPTR,A +	RET +	; +	newpage +	;*************************************************************** +	; +	; CASTAK - Copy and push another top of arg stack +	; +	;*************************************************************** +	; +CSTAKA2:ACALL	CSTAKA		;COPY STACK TWICE +	; +CSTAKA:	ACALL	SETREG		;SET UP R2:R0 +	SJMP	PUSH_T1+4 +	; +PLNEXP:	MOV	DPTR,#EXP1 +	; +	;*************************************************************** +	; +	; PUSHC - Push constant on to the arg stack +	; +	;*************************************************************** +	; +PUSHC:	ACALL	DEC_ASTKA +	MOV	P2,R3 +	MOV	R3,#FPSIZ	;LOOP COUNTER +	; +PCL:	CLR	A		;SET UP A +	MOVC	A,@A+DPTR	;LOAD IT +	MOVX	@R1,A		;SAVE IT +	INC	DPTR		;BUMP POINTERS +	DEC	R1 +	DJNZ	R3,PCL		;LOOP +	; +	SETB	ARGF +	RET			;EXIT +	; +PUSH_ONE:; +	; +	MOV	DPTR,#FPONE +	AJMP	PUSHC +	; +	newpage +	; +POP_T1: +	; +	MOV	R3,#HI(FPT1) +	MOV	R1,#LO(FPT1) +	JMP	POPAS +	; +PUSH_T1: +	; +	MOV	R0,#LO(FPT1) +	MOV	R2,#HI(FPT1) +	LJMP	PUSHAS +	; +P_T2:	MOV	R0,#LO(FPT2) +	SJMP	$-7			;JUMP TO PUSHAS +	; +	;**************************************************************** +	; +SWAP_ASTKA:	; SWAP TOS<>TOS-1 +	; +	;**************************************************************** +	; +	ACALL	SETREG		;SET UP R2:R0 AND P2 +	MOV	A,#FPSIZ	;PUT TOS+1 IN R1 +	MOV	R2,A +	ADD	A,R0 +	MOV	R1,A +	; +S_L:	MOVX	A,@R0 +	MOV	R3,A +	MOVX	A,@R1 +	MOVX	@R0,A +	MOV	A,R3 +	MOVX	@R1,A +	DEC	R1 +	DEC	R0 +	DJNZ	R2,S_L +	RET +	; +	newpage +	; +C_T2:	ACALL	SETREG		;SET UP R2:R0 +	MOV	R3,#HI(FPT2) +	MOV	R1,#LO(FPT2)	;TEMP VALUE +	; +	; Fall thru +	; +	;*************************************************************** +	; +	; VARCOP - Copy a variable from R2:R0 to R3:R1 +	; +	;*************************************************************** +	; +VARCOP:	MOV	R4,#FPSIZ	;LOAD THE LOOP COUNTER +	; +V_C:	MOV	P2,R2		;SET UP THE PORTS +	MOVX	A,@R0		;READ THE VALUE +	MOV	P2,R3		;PORT TIME AGAIN +	MOVX	@R1,A		;SAVE IT +	ACALL	DEC3210		;BUMP POINTERS +	DJNZ	R4,V_C		;LOOP +	RET			;EXIT +	; +PIPI:	MOV	DPTR,#PIE +	AJMP	PUSHC +	; +	newpage +	;*************************************************************** +	; +	; The logical operators ANL, ORL, XRL, NOT +	; +	;*************************************************************** +	; +AANL:	ACALL	TWOL		;GET THE EXPRESSIONS +	MOV	A,R3		;DO THE AND +	ANL	A,R7 +	MOV	R2,A +	MOV	A,R1 +	ANL	A,R6 +	SJMP	TWO_EX +	; +AORL:	ACALL	TWOL		;SAME THING FOR OR +	MOV	A,R3 +	ORL	A,R7 +	MOV	R2,A +	MOV	A,R1 +	ORL	A,R6 +	SJMP	TWO_EX +	; +ANOT:	ACALL	FSTK		;PUT 0FFFFH ON THE STACK +	; +AXRL:	ACALL	TWOL +	MOV	A,R3 +	XRL	A,R7 +	MOV	R2,A +	MOV	A,R1 +	XRL	A,R6 +	SJMP	TWO_EX +	; +TWOL:	ACALL	IFIX +	MOV	R7,R3B0 +	MOV	R6,R1B0 +	AJMP	IFIX +	; +	newpage +	;************************************************************* +	; +AGET:	; READ THE BREAK BYTE AND PUT IT ON THE ARG STACK +	; +	;************************************************************* +	; +	MOV	DPTR,#GTB	;GET THE BREAK BYTE +	MOVX	A,@DPTR +	JBC	GTRD,TWO_R2 +	CLR	A +	; +TWO_R2:	MOV	R2,#00H		;ACC GOES TO STACK +	; +	; +TWO_EX:	MOV	R0,A		;R2:ACC GOES TO STACK +	; +	; +TWO_EY:	SETB	ARGF		;R2:R0 GETS PUT ON THE STACK +	JMP	FP_BASE+24	;DO IT +	; +	newpage +	;************************************************************* +	; +	; Put directs onto the stack +	; +	;************************************************************** +	; +A_IE:	MOV	A,IE		;IE +	SJMP	TWO_R2 +	; +A_IP:	MOV	A,IP		;IP +	SJMP	TWO_R2 +	; +ATIM0:	MOV	R2,TH0		;TIMER 0 +	MOV	R0,TL0 +	SJMP	TWO_EY +	; +ATIM1:	MOV	R2,TH1		;TIMER 1 +	MOV	R0,TL1 +	SJMP	TWO_EY +	; +ATIM2:	DB	0AAH		;MOV R2 DIRECT OP CODE +	DB	0CDH		;T2 HIGH +	DB	0A8H		;MOV R0 DIRECT OP CODE +	DB	0CCH		;T2 LOW +	SJMP	TWO_EY		;TIMER 2 +	; +AT2CON:	DB	0E5H		;MOV A,DIRECT OPCODE +	DB	0C8H		;T2CON LOCATION +	SJMP	TWO_R2 +	; +ATCON:	MOV	A,TCON		;TCON +	SJMP	TWO_R2 +	; +ATMOD:	MOV	A,TMOD		;TMOD +	SJMP	TWO_R2 +	; +ARCAP2:	DB	0AAH		;MOV R2, DIRECT OP CODE +	DB	0CBH		;RCAP2H LOCATION +	DB	0A8H		;MOV R0, DIRECT OP CODE +	DB	0CAH		;R2CAPL LOCATION +	SJMP	TWO_EY +	; +AP1:	MOV	A,P1		;GET P1 +	SJMP	TWO_R2		;PUT IT ON THE STACK +	; +APCON:	DB	0E5H		;MOV A, DIRECT OP CODE +	DB	87H		;ADDRESS OF PCON +	SJMP	TWO_R2		;PUT PCON ON THE STACK +	; +	newpage +	;*************************************************************** +	; +	;THIS IS THE LINE EDITOR +	; +	;TAKE THE PROCESSED LINE IN IBUF AND INSERT IT INTO THE +	;BASIC TEXT FILE. +	; +	;*************************************************************** +	; +	LJMP	NOGO		;CAN'T EDIT A ROM +	; +LINE:	MOV	A,BOFAH +	CJNE	A,#HI(PSTART),LINE-3 +	CALL	G4		;GET END ADDRESS FOR EDITING +	MOV	R4,DPL +	MOV	R5,DPH +	MOV	R3,TEMP5	;GET HIGH ORDER IBLN +	MOV	R1,TEMP4	;LOW ORDER IBLN +	; +	CALL	GETLIN		;FIND THE LINE +	JNZ	INSR		;INSERT IF NOT ZERO, ELSE APPEND +	; +	;APPEND THE LINE AT THE END +	; +	MOV	A,TEMP3		;PUT IBCNT IN THE ACC +	CJNE	A,#4H,$+4	;SEE IF NO ENTRY +	RET			;RET IF NO ENTRY +	; +	ACALL	FULL		;SEE IF ENOUGH SPACE LEFT +	MOV	R2,R5B0		;PUT END ADDRESS A INTO TRANSFER +	MOV	R0,R4B0		;REGISTERS +	ACALL	IMOV		;DO THE BLOCK MOVE +	; +UE:	MOV	A,#EOF		;SAVE EOF CHARACTER +	AJMP	TBR +	; +	;INSERT A LINE INTO THE FILE +	; +INSR:	MOV	R7,A		;SAVE IT IN R7 +	CALL	TEMPD		;SAVE INSERATION ADDRESS +	MOV	A,TEMP3		;PUT THE COUNT LENGTH IN THE ACC +	JC	LTX		;JUMP IF NEW LINE # NOT = OLD LINE # +	CJNE	A,#04H,$+4	;SEE IF NULL +	CLR	A +	; +	SUBB	A,R7		;SUBTRACT LINE COUNT FROM ACC +	JZ	LIN1		;LINE LENGTHS EQUAL +	JC	GTX		;SMALLER LINE +	; +	newpage +	; +	;EXPAND FOR A NEW LINE OR A LARGER LINE +	; +LTX:	MOV	R7,A		;SAVE A IN R7 +	MOV	A,TEMP3		;GET THE COUNT IN THE ACC +	CJNE	A,#04H,$+4	;DO NO INSERTATION IF NULL LINE +	RET			;EXIT IF IT IS +	; +	MOV	A,R7		;GET THE COUNT BACK - DELTA IN A +	ACALL	FULL		;SEE IF ENOUGH MEMORY NEW EOFA IN R3:R1 +	CALL	DTEMP		;GET INSERATION ADDRESS +	ACALL	NMOV		;R7:R6 GETS (EOFA)-DPTR +	CALL	X3120 +	MOV	R1,R4B0		;EOFA LOW +	MOV	R3,R5B0		;EOFA HIGH +	INC	R6		;INCREMENT BYTE COUNT +	CJNE	R6,#00,$+4	;NEED TO BUMP HIGH BYTE? +	INC	R7 +	; +	ACALL	RMOV		;GO DO THE INSERTION +	SJMP	LIN1		;INSERT THE CURRENT LINE +	; +GTX:	CPL	A		;FLIP ACC +	INC	A		;TWOS COMPLEMENT +	CALL	ADDPTR		;DO THE ADDITION +	ACALL	NMOV		;R7:R6 GETS (EOFA)-DPTR +	MOV	R1,DPL		;SET UP THE REGISTERS +	MOV	R3,DPH +	MOV	R2,TEMP5	;PUT INSERTATION ADDRESS IN THE RIGHT REG +	MOV	R0,TEMP4 +	JZ	$+4		;IF ACC WAS ZERO FROM NMOV, JUMP +	ACALL	LMOV		;IF NO ZERO DO A LMOV +	; +	ACALL	UE		;SAVE NEW END ADDRESS +	; +LIN1:	MOV	R2,TEMP5	;GET THE INSERTATION ADDRESS +	MOV	R0,TEMP4 +	MOV	A,TEMP3		;PUT THE COUNT LENGTH IN ACC +	CJNE	A,#04H,IMOV	;SEE IF NULL +	RET			;EXIT IF NULL +	newpage +	;*************************************************************** +	; +	;INSERT A LINE AT ADDRESS R2:R0 +	; +	;*************************************************************** +	; +IMOV:	CLR	A		;TO SET UP +	MOV	R1,#LO(IBCNT)	;INITIALIZE THE REGISTERS +	MOV	R3,A +	MOV	R6,TEMP3	;PUT THE BYTE COUNT IN R6 FOR LMOV +	MOV	R7,A		;PUT A 0 IN R7 FOR LMOV +	; +	;*************************************************************** +	; +	;COPY A BLOCK FROM THE BEGINNING +	; +	;R2:R0 IS THE DESTINATION ADDRESS +	;R3:R1 IS THE SOURCE ADDRESS +	;R7:R6 IS THE COUNT REGISTER +	; +	;*************************************************************** +	; +LMOV:	ACALL	TBYTE		;TRANSFER THE BYTE +	ACALL	INC3210		;BUMP THE POINTER +	ACALL	DEC76		;BUMP R7:R6 +	JNZ	LMOV		;LOOP +	RET			;GO BACK TO CALLING ROUTINE +	; +INC3210:INC	R0 +	CJNE	R0,#00H,$+4 +	INC	R2 +	; +	INC	R1 +	CJNE	R1,#00H,$+4 +	INC	R3 +	RET +	; +	newpage +	;*************************************************************** +	; +	;COPY A BLOCK STARTING AT THE END +	; +	;R2:R0 IS THE DESTINATION ADDRESS +	;R3:R1 IS THE SOURCE ADDRESS +	;R6:R7 IS THE COUNT REGISTER +	; +	;*************************************************************** +	; +RMOV:	ACALL	TBYTE		;TRANSFER THE BYTE +	ACALL	DEC3210		;DEC THE LOCATIONS +	ACALL	DEC76		;BUMP THE COUNTER +	JNZ	RMOV		;LOOP +	; +DEC_R:	NOP			;CREATE EQUAL TIMING +	RET			;EXIT +	; +DEC3210:DEC	R0		;BUMP THE POINTER +	CJNE	R0,#0FFH,$+4	;SEE IF OVERFLOWED +	DEC	R2		;BUMP THE HIGH BYTE +	DEC	R1		;BUMP THE POINTER +	CJNE	R1,#0FFH,DEC_R	;SEE IF OVERFLOWED +	DEC	R3		;CHANGE THE HIGH BYTE +	RET			;EXIT +	; +	;*************************************************************** +	; +	;TBYTE - TRANSFER A BYTE +	; +	;*************************************************************** +	; +TBYTE:	MOV	P2,R3		;OUTPUT SOURCE REGISTER TO PORT +	MOVX	A,@R1		;PUT BYTE IN ACC +	; +TBR:	MOV	P2,R2		;OUTPUT DESTINATION TO PORT +	MOVX	@R0,A		;SAVE THE BYTE +	RET			;EXIT +	; +	newpage +	;*************************************************************** +	; +	;NMOV - R7:R6 = END ADDRESS - DPTR +	; +	;ACC GETS CLOBBERED +	; +	;*************************************************************** +	; +NMOV:	MOV	A,R4		;THE LOW BYTE OF EOFA +	CLR	C		;CLEAR THE CARRY FOR SUBB +	SUBB	A,DPL		;SUBTRACT DATA POINTER LOW +	MOV	R6,A		;PUT RESULT IN R6 +	MOV	A,R5		;HIGH BYTE OF EOFA +	SUBB	A,DPH		;SUBTRACT DATA POINTER HIGH +	MOV	R7,A		;PUT RESULT IN R7 +	ORL	A,R6		;SEE IF ZERO +	RET			;EXIT +	; +	;*************************************************************** +	; +	;CHECK FOR A FILE OVERFLOW +	;LEAVES THE NEW END ADDRESS IN R3:R1 +	;A HAS THE INCREASE IN SIZE +	; +	;*************************************************************** +	; +FULL:	ADD	A,R4		;ADD A TO END ADDRESS +	MOV	R1,A		;SAVE IT +	CLR	A +	ADDC	A,R5		;ADD THE CARRY +	MOV	R3,A +	MOV	DPTR,#VARTOP	;POINT AT VARTOP +	; +FUL1:	CALL	DCMPX		;COMPARE THE TWO +	JC	FULL-1		;OUT OF ROOM +	; +TB:	MOV	DPTR,#E5X	;OUT OF MEMORY +	AJMP	FPTS +	; +	newpage +	;*************************************************************** +	; +	; PP - Preprocesses the line in IBUF back into IBUF +	;      sets F0 if no line number +	;      leaves the correct length of processed line in IBCNT +	;      puts the line number in IBLN +	;      wastes the text address TXAL and TXAH +	; +	;*************************************************************** +	; +PP:	ACALL	T_BUF		;TXA GETS IBUF +	CALL	INTGER		;SEE IF A NUMBER PRESENT +	CALL	TEMPD		;SAVE THE INTEGER IN TEMP5:TEMP4 +	MOV	F0,C		;SAVE INTEGER IF PRESENT +	MOV	DPTR,#IBLN	;SAVE THE LINE NUMBER, EVEN IF NONE +	ACALL	S20DP +	MOV	R0,TXAL		;TEXT POINTER +	MOV	R1,#LO(IBUF)	;STORE POINTER +	; +	; Now process the line back into IBUF +	; +PPL:	CLR	ARGF		;FIRST PASS DESIGNATOR +	MOV	DPTR,#TOKTAB	;POINT DPTR AT LOOK UP TABLE +	; +PPL1:	MOV	R5B0,R0		;SAVE THE READ POINTER +	CLR	A		;ZERO A FOR LOOKUP +	MOVC	A,@A+DPTR	;GET THE TOKEN +	MOV	R7,A		;SAVE TOKEN IN CASE OF MATCH +	; +PPL2:	MOVX	A,@R0		;GET THE USER CHARACTER +	MOV	R3,A		;SAVE FOR REM +	CJNE	A,#'a',$+3 +	JC	PPX		;CONVERT LOWER TO UPPER CASE +	CJNE	A,#('z'+1),$+3 +	JNC	PPX +	CLR	ACC.5 +	; +PPX:	MOV	R2,A +	MOVX	@R0,A		;SAVE UPPER CASE +	INC	DPTR		;BUMP THE LOOKUP POINTER +	CLR	A +	MOVC	A,@A+DPTR +	CJNE	A,R2B0,PPL3	;LEAVE IF NOT THE SAME +	INC	R0		;BUMP THE USER POINTER +	SJMP	PPL2		;CONTINUE TO LOOP +	; +PPL3:	JB	ACC.7,PPL6	;JUMP IF FOUND MATCH +	JZ	PPL6		;USER MATCH +	; +	; +	; Scan to the next TOKTAB entry +	; +PPL4:	INC	DPTR		;ADVANCE THE POINTER +	CLR	A		;ZERO A FOR LOOKUP +	MOVC	A,@A+DPTR	;LOAD A WITH TABLE +	JB	ACC.7,$+6	;KEEP SCANNING IF NOT A RESERVED WORD +	JNZ	PPL4 +	INC	DPTR +	; +	; See if at the end of TOKTAB +	; +	MOV	R0,R5B0		;RESTORE THE POINTER +	CJNE	A,#0FFH,PPL1	;SEE IF END OF TABLE +	; +	; Character not in TOKTAB, so see what it is +	; +	CJNE	R2,#' ',PPLX	;SEE IF A SPACE +	INC	R0		;BUMP USER POINTER +	SJMP	PPL		;TRY AGAIN +	; +PPLX:	JNB	XBIT,PPLY	;EXTERNAL TRAP +	JB	ARGF,PPLY +	SETB	ARGF		;SAYS THAT THE USER HAS TABLE +	LCALL	2078H		;SET UP POINTER +	AJMP	PPL1 +	; +PPLY:	ACALL	PPL7		;SAVE CHARACTER, EXIT IF A CR +	CJNE	A,#'"',PPL	;SEE IF QUOTED STRING, START AGAIN IF NOT +	; +	; Just copy a quoted string +	; +	ACALL	PPL7		;SAVE THE CHARACTER, TEST FOR CR +	CJNE	A,#'"',$-2	;IS THERE AN ENDQUOTE, IF NOT LOOP +	SJMP	PPL		;DO IT AGAIN IF ENDQUOTE +	; +PPL6:	MOV	A,R7		;GET THE TOKEN +	ACALL	PPL9+1		;SAVE THE TOKEN +	CJNE	A,#T_REM,PPL	;SEE IF A REM TOKEN +	MOV	A,R3 +	ACALL	PPL7+1		;WASTE THE REM STATEMENT +	ACALL	PPL7		;LOOP UNTIL A CR +	SJMP	$-2 +	; +PPL7:	MOVX	A,@R0		;GET THE CHARACTER +	CJNE	A,#CR,PPL9	;FINISH IF A CR +	POP	R0B0		;WASTE THE CALLING STACK +	POP	R0B0 +	MOVX	@R1,A		;SAVE CR IN MEMORY +	INC	R1		;SAVE A TERMINATOR +	MOV	A,#EOF +	MOVX	@R1,A +	MOV	A,R1		;SUBTRACT FOR LENGTH +	SUBB	A,#4 +	MOV	TEMP3,A		;SAVE LENGTH +	MOV	R1,#LO(IBCNT)	;POINT AT BUFFER COUNT +	; +PPL9:	INC	R0 +	MOVX	@R1,A		;SAVE THE CHARACTER +	INC	R1		;BUMP THE POINTERS +	RET			;EXIT TO CALLING ROUTINE +	; +	; +	;*************************************************************** +	; +	;DEC76 - DECREMENT THE REGISTER PAIR R7:R6 +	; +	;ACC = ZERO IF R7:R6 = ZERO ; ELSE ACC DOES NOT +	; +	;*************************************************************** +	; +DEC76:	DEC	R6		;BUMP R6 +	CJNE	R6,#0FFH,$+4	;SEE IF RAPPED AROUND +	DEC	R7 +	MOV	A,R7		;SEE IF ZERO +	ORL	A,R6 +	RET			;EXIT +	; +	;*************************************************************** +	; +	; MTOP - Get or Put the top of assigned memory +	; +	;*************************************************************** +	; +PMTOP:	MOV	DPTR,#MEMTOP +	CALL	L20DPI +	AJMP	TWO_EY		;PUT R2:R0 ON THE STACK +	; +	newpage +	;************************************************************* +	; +	; AXTAL - Crystal value calculations +	; +	;************************************************************* +	; +AXTAL0:	MOV	DPTR,#XTALV	;CRYSTAL VALUE +	ACALL	PUSHC +	; +AXTAL1:	ACALL	CSTAKA2		;COPY CRYSTAL VALUE TWICE +	ACALL	CSTAKA +	MOV	DPTR,#PTIME	;PROM TIMER +	ACALL	AXTAL2 +	MOV	DPTR,#PROGS +	ACALL	S31L +	MOV	DPTR,#IPTIME	;IPROM TIMER +	ACALL	AXTAL2 +	MOV	DPTR,#IPROGS +	ACALL	S31L +	MOV	DPTR,#TTIME	;CLOCK CALCULATION +	ACALL	AXTAL3 +	MOV	A,R1 +	CPL	A +	INC	A +	MOV	SAVE_T,A +	MOV	R3,#HI(CXTAL) +	MOV	R1,#LO(CXTAL) +	JMP	POPAS +	; +AXTAL2:	ACALL	AXTAL3 +	; +CBIAS:	;Bias the crystal calculations +	; +	MOV	A,R1		;GET THE LOW COUNT +	CPL	A		;FLIP IT FOR TIMER LOAD +	ADD	A,#15		;BIAS FOR CALL AND LOAD TIMES +	MOV	R1,A		;RESTORE IT +	MOV	A,R3		;GET THE HIGH COUNT +	CPL	A		;FLIP IT +	ADDC	A,#00H		;ADD THE CARRY +	MOV	R3,A		;RESTORE IT +	RET +	; +	newpage +	include	bas52.pwm	; ******AA +	newpage +	;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN +	; +LNTAB:	; Natural log lookup table +	; +	;LNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLNLN +	; +	DB	80H +	DB	00H +	DB	71H +	DB	37H +	DB	13H +	DB	19H +	; +	DB	7FH +	DB	00H +	DB	76H +	DB	64H +	DB	37H +	DB	94H +	; +	DB	80H +	DB	00H +	DB	07H +	DB	22H +	DB	75H +	DB	17H +	; +	DB	80H +	DB	00H +	DB	52H +	DB	35H +	DB	93H +	DB	28H +	; +	DB	80H +	DB	00H +	DB	71H +	DB	91H +	DB	85H +	DB	86H +	; +	DB	0FFH +	; +	DB	81H +	DB	00H +	DB	51H +	DB	58H +	DB	02H +	DB	23H +	; +	newpage +	;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN +	; +SINTAB:	; Sin lookup table +	; +	;SINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSINSIN +	; +	DB	128-9 +	DB	00H +	DB	44H +	DB	90H +	DB	05H +	DB	16H +	; +	DB	128-7 +	DB	01H +	DB	08H +	DB	21H +	DB	05H +	DB	25H +	; +	DB	128-5 +	DB	00H +	DB	19H +	DB	73H +	DB	55H +	DB	27H +	; +	newpage +	; +	DB	128-3 +	DB	01H +	DB	70H +	DB	12H +	DB	84H +	DB	19H +	; +	DB	128-2 +	DB	00H +	DB	33H +	DB	33H +	DB	33H +	DB	83H +	; +	DB	128 +	DB	01H +	DB	67H +	DB	66H +	DB	66H +	DB	16H +	; +FPONE:	DB	128+1 +	DB	00H +	DB	00H +	DB	00H +	DB	00H +	DB	10H +	; +	DB	0FFH		;END OF TABLE +	; +	newpage +	; +SBAUD:	CALL	AXTAL		;PUT CRYSTAL ON THE STACK +	CALL	EXPRB		;PUT THE NUMBER AFTER BAUD ON STACK +	MOV	A,#12 +	ACALL	TWO_R2		;TOS = 12 +	ACALL	AMUL		;TOS = 12*BAUD +	ACALL	ADIV		;TOS = XTAL/(12*BAUD) +	ACALL	IFIX +	ACALL	CBIAS +	MOV	DPTR,#SPV +	; +S31L:	JMP	S31DP +	; +AFREE:	CALL	PMTOP		;PUT MTOP ON STACK +	CALL	G4		;GET END ADDRESS +	MOV	R0,DPL +	MOV	R2,DPH +	ACALL	TWO_EY +	; +ASUB:	LCALL	FP_BASE+2	;DO FP SUB +	AJMP	FPTST +	; +ALEN:	CALL	CCAL		;CALCULATE THE LEN OF THE SELECTED PROGRAM +	MOV	R2,R7B0		;SAVE THE HIGH BYTE +	MOV	A,R6		;SAVE THE LOW BYTE +	AJMP	TWO_EX		;PUT IT ON THE STACK +	; +ATIME:	MOV	C,EA		;SAVE INTERRUTS +	CLR	EA +	PUSH	MILLIV		;SAVE MILLI VALUE +	MOV	R2,TVH		;GET THE TIMER +	MOV	A,TVL +	MOV	EA,C		;SAVE INTERRUPTS +	ACALL	TWO_EX		;PUT TIMER ON THE STACK +	POP	ACC		;GET MILLI +	ACALL	TWO_R2		;PUT MILLI ON STACK +	MOV	A,#200 +	ACALL	TWO_R2		;DIVIDE MILLI BY 200 +	ACALL	ADIV +	; +AADD:	LCALL	FP_BASE		;DO FP ADDITION +	AJMP	FPTST		;CHECK FOR ERRORS +	; +	newpage +	;************************************************************** +	; +	; Here are some error messages that were moved +	; +	;************************************************************** +	; +	; +E1X:	DB	"BAD SYNTAX",'"' +E2X:	DB	128+10 +	DB	"DIVIDE BY ZERO",'"' +	; +E6X:	DB	"ARRAY SIZE",'"' +	; +	newpage +	;************************************************************** +	; +T_BUF:	; TXA gets IBUF +	; +	;************************************************************** +	; +	MOV	TXAH,#HI(IBUF) +	MOV	TXAL,#LO(IBUF) +	RET +	; +	; +	;*************************************************************** +	; +CXFER:	; Transfer a program from rom to ram +	; +	;*************************************************************** +	; +	CALL	CCAL		;GET EVERYTHING SET UP +	MOV	R2,#HI(PSTART) +	MOV	R0,#LO(PSTART) +	ACALL	LMOV		;DO THE TRANSFER +	CALL	RCLEAR		;CLEAR THE MEMORY +	; +	; Fall thru to CRAM +	; +	;*************************************************************** +	; +CRAM:	; The command action routine - RAM - Run out of ram +	; +	;*************************************************************** +	; +	CLR	CONB		;CAN'T CONTINUE IF MODE CHANGE +	MOV	BOFAH,#HI(PSTART) +	MOV	BOFAL,#LO(PSTART) +	; +	; Fall thru to Command Processor +	; +	newpage +	;*************************************************************** +	; +CMND1:	; The entry point for the command processor +	; +	;*************************************************************** +	; +	LCALL	SPRINT+4	;WASTE AT AND HEX +	CLR	XBIT		;TO RESET IF NEEDED +	CLR	A +	MOV	DPTR,#2002H	;CHECK FOR EXTERNAL TRAP PACKAGE +	MOVC	A,@A+DPTR +	CJNE	A,#5AH,$+6 +	LCALL	2048H		;IF PRESENT JUMP TO LOCATION 200BH +	MOV	DPTR,#RDYS	;PRINT THE READY MESSAGE +	CALL	CRP		;DO A CR, THEN, PRINT FROM THE ROM +	; +CMNDR:	SETB	DIRF		;SET THE DIRECT INPUT BIT +	MOV	SP,SPSAV	;LOAD THE STACK +	ACALL	CL7		;DO A CRLF +	; +CMNX:	CLR	GTRD		;CLEAR BREAK +	MOV	DPTR,#5EH	;DO RUN TRAP +	MOVX	A,@DPTR +	XRL	A,#52 +	JNZ	$+5 +	LJMP	CRUN +	MOV	R5,#'>'		;OUTPUT A PROMPT +	LCALL	TEROT +	CALL	INLINE		;INPUT A LINE INTO IBUF +	CALL	PP		;PRE-PROCESS THE LINE +	JB	F0,CMND3	;NO LINE NUMBER +	CALL	LINE		;PROCESS THE LINE +	LCALL	LCLR +	JB	LINEB,CMNX	;DON'T CLEAR MEMORY IF NO NEED +	SETB	LINEB +	LCALL	RCLEAR		;CLEAR THE MEMORY +	SJMP	CMNX		;LOOP BACK +	; +CMND3:	CALL	T_BUF		;SET UP THE TEXT POINTER +	CALL	DELTST		;GET THE CHARACTER +	JZ	CMNDR		;IF CR, EXIT +	MOV	DPTR,#CMNDD	;POINT AT THE COMMAND LOOKUP +	CJNE	A,#T_CMND,$+3	;PROCESS STATEMENT IF NOT A COMMAND +	JC	CMND5 +	CALL	GCI1		;BUMP TXA +	ANL	A,#0FH		;STRIP MSB'S FOR LOOKUP +	LCALL	ISTA1		;PROCESS COMMAND +	SJMP	CMNDR +	; +CMND5:	LJMP	ILOOP		;CHECK FOR A POSSIBLE BREAK +	; +	; +	; +	;CONSTANTS +	; +XTALV:	DB	128+8		; DEFAULT CRYSTAL VALUE +	DB	00H +	DB	00H +	DB	92H +	DB	05H +	DB	11H +	; +EXP11:	DB	85H +	DB	00H +	DB	42H +	DB	41H +	DB	87H +	DB	59H +	; +EXP1:	DB	128+1		; EXP(1) +	DB	00H +	DB	18H +	DB	28H +	DB	18H +	DB	27H +	; +IPTIME:	DB	128-4		;FPROG TIMING +	DB	00H +	DB	00H +	DB	00H +	DB	75H +	DB	83H +	; +PIE:	DB	128+1		;PI +	DB	00H +	DB	26H +	DB	59H +	DB	41H +	DB	31H		; 3.1415926 +	; +	newpage +	;*************************************************************** +	; +	; The error messages, some have been moved +	; +	;*************************************************************** +	; +E7X:	DB	128+30 +	DB	"ARITH. UNDERFLOW",'"' +	; +E5X:	DB	"MEMORY ALLOCATION",'"' +	; +E3X:	DB	128+40 +	DB	"BAD ARGUMENT",'"' +	; +EXI:	DB	"I-STACK",'"' +	; +	newpage +	;*************************************************************** +	; +	; The command action routine - CONTINUE +	; +	;*************************************************************** +	; +CCONT:	MOV	DPTR,#E15X +	JNB	CONB,ERROR	;ERROR IF CONTINUE IS NOT SET +	; +CC1:	;used for input statement entry +	; +	MOV	TXAH,INTXAH	;RESTORE TXA +	MOV	TXAL,INTXAL +	JMP	CILOOP		;EXECUTE +	; +DTEMP:	MOV	DPH,TEMP5	;RESTORE DPTR +	MOV	DPL,TEMP4 +	RET +	; +TEMPD:	MOV	TEMP5,DPH +	MOV	TEMP4,DPL +	RET +	; +	newpage +	;************************************************************** +	; +I_DL:	; IDLE +	; +	;************************************************************** +	; +	JB	DIRF,E1XX	;SYNTAX ERROR IN DIRECT INPUT +	CLR	DACK		;ACK IDLE +	; +U_ID1:	DB	01000011B	;ORL DIRECT OP CODE +	DB	87H		;PCON ADDRESS +	DB	01H		;SET IDLE BIT +	JB	INTPEN,I_RET	;EXIT IF EXTERNAL INTERRUPT +	JBC	U_IDL,I_RET	;EXIT IF USER WANTS TO +	JNB	OTS,U_ID1	;LOOP IF TIMER NOT ENABLED +	LCALL	T_CMP		;CHECK THE TIMER +	JC	U_ID1		;LOOP IF TIME NOT BIG ENOUGH +	; +I_RET:	SETB	DACK		;RESTORE EXECUTION +	RET			;EXIT IF IT IS +	; +	; +	; +ER0:	INC	DPTR		;BUMP TO TEXT +	JB	DIRF,ERROR0	;CAN'T GET OUT OF DIRECT MODE +	JNB	ON_ERR,ERROR0	;IF ON ERROR ISN'T SET, GO BACK +	MOV	DPTR,#ERRLOC	;SAVE THE ERROR CODE +	CALL	RC2		;SAVE ERROR AND SET UP THE STACKS +	INC	DPTR		;POINT AT ERRNUM +	JMP	ERL4		;LOAD ERR NUM AND EXIT +	; +	newpage +	; +	; Syntax error +	; +E1XX:	MOV	C,DIRF		;SEE IF IN DIRECT MODE +	MOV	DPTR,#E1X	;ERROR MESSAGE +	SJMP	ERROR+1		;TRAP ON SET DIRF +	; +	MOV	DPTR,#EXI	;STACK ERROR +	; +	; Falls through +	; +	;*************************************************************** +	; +	;ERROR PROCESSOR - PRINT OUT THE ERROR TYPE, CHECK TO SEE IF IN +	;                  RUN OR COMMAND MODE, FIND AND PRINT OUT THE +	;                  LINE NUMBER IF IN RUN MODE +	; +	;*************************************************************** +	; +ERROR:	CLR	C		;RESET STACK +	MOV	SP,SPSAV	;RESET THE STACK +	LCALL	SPRINT+4	;CLEAR LINE AND AT MODE +	CLR	A		;SET UP TO GET ERROR CODE +	MOVC	A,@A+DPTR +	JBC	ACC.7,ER0	;PROCESS ERROR +	; +ERROR0:	ACALL	TEMPD		;SAVE THE DATA POINTER +	JC	$+5		;NO RESET IF CARRY IS SET +	LCALL	RC1		;RESET THE STACKS +	CALL	CRLF2		;DO TWO CARRIAGE RET - LINE FEED +	MOV	DPTR,#ERS	;OUTPUT ERROR MESSAGE +	CALL	ROM_P +	CALL	DTEMP		;GET THE ERROR MESSAGE BACK +	; +ERRS:	CALL	ROM_P		;PRINT ERROR TYPE +	JNB	DIRF,ER1	;DO NOT PRINT IN LINE IF DIRF=1 +	; +SERR1:	CLR	STOPBIT		;PRINT STOP THEN EXIT, FOR LIST +	JMP	CMND1 +	; +ER1:	MOV	DPTR,#INS	;OUTPUT IN LINE +	CALL	ROM_P +	; +	;NOW, FIND THE LINE NUMBER +	; +	; +	newpage +	; +	; +	CALL	DP_B		;GET THE FIRST ADDRESS OF THE PROGRAM +	CLR	A		;FOR INITIALIZATION +	; +ER2:	ACALL	TEMPD		;SAVE THE DPTR +	CALL	ADDPTR		;ADD ACC TO DPTR +	ACALL	ER4		;R3:R1 = TXA-DPTR + JC	ER3		;EXIT IF DPTR>TXA +	JZ	ER3		;EXIT IF DPTR=TXA +	MOVX	A,@DPTR		;GET LENGTH +	CJNE	A,#EOF,ER2	;SEE IF AT THE END +	; +ER3:	ACALL	DTEMP		;PUT THE LINE IN THE DPTR +	ACALL	ER4		;R3:R1 = TXA - BEGINNING OF LINE +	MOV	A,R1		;GET LENGTH +  	ADD	A,#10		;ADD 10 TO LENGTH, DPTR STILL HAS ADR +	MOV	MT1,A		;SAVE THE COUNT +	INC	DPTR		;POINT AT LINE NUMBER HIGH BYTE +	CALL	PMTOP+3		;LOAD R2:R0, PUT IT ON THE STACK +	ACALL	FP_BASE+14	;OUTPUT IT +	JB	STOPBIT,SERR1	;EXIT IF STOP BIT SET +	CALL	CRLF2		;DO SOME CRLF'S +	CALL	DTEMP +	CALL	UPPL		;UNPROCESS THE LINE +	CALL	CL6		;PRINT IT +	MOV	R5,#'-'		;OUTPUT DASHES, THEN AN X +	ACALL	T_L		;PRINT AN X IF ERROR CHARACTER FOUND +	DJNZ	MT1,$-4		;LOOP UNTIL DONE +	MOV	R5,#'X' +	ACALL	T_L +	AJMP	SERR1 +	; +ER4:	MOV	R3,TXAH		;GET TEXT POINTER AND PERFORM SUBTRACTION +	MOV	R1,TXAL +	JMP	DUBSUB +	; +	newpage +	;************************************************************** +	; +	; Interrupt driven timer +	; +	;************************************************************** +	; +I_DR:	MOV	TH0,SAVE_T	;LOAD THE TIMER +	XCH	A,MILLIV	;SAVE A, GET MILLI COUNTER +	INC	A		;BUMP COUNTER +	CJNE	A,#200,TR	;CHECK OUT TIMER VALUE +	CLR	A		;FORCE ACC TO BE ZERO +	INC	TVL		;INCREMENT LOW TIMER +	CJNE	A,TVL,TR	;CHECK LOW VALUE +	INC	TVH		;BUMP TIMER HIGH +	; +TR:	XCH	A,MILLIV +	POP	PSW +	RETI +	; +	newpage +	include	bas52.clk +	;*************************************************************** +	; +SUI:	; Statement USER IN action routine +	; +	;*************************************************************** +	; +	ACALL	OTST +	MOV	CIUB,C		;SET OR CLEAR CIUB +	RET +	; +	;*************************************************************** +	; +SUO:	; Statement USER OUT action routine +	; +	;*************************************************************** +	; +	ACALL	OTST +	MOV	COUB,C +	RET +	; +OTST:	; Check for a one +	; +	LCALL	GCI		;GET THE CHARACTER, CLEARS CARRY +	SUBB	A,#'1'		;SEE IF A ONE +	CPL	C		;SETS CARRY IF ONE, CLEARS IT IF ZERO +	RET +	; +	newpage +	;************************************************************** +	; +	; IBLK - EXECUTE USER SUPPLIED TOKEN +	; +	;************************************************************** +	; +IBLK:	JB	PSW.4,IBLK-1	;EXIT IF REGISTER BANK <> 0 +	JB	PSW.3,IBLK-1 +	JBC	ACC.7,$+9	;SEE IF BIT SEVEN IS SET +	MOV	DPTR,#USENT	;USER ENTRY LOCATION +	LJMP	ISTA1 +	; +	JB	ACC.0,199FH	;FLOATING POINT INPUT +	JZ	T_L		;DO OUTPUT ON 80H +	MOV	DPTR,#FP_BASE-2 +	JMP	@A+DPTR +	; +	; +	;************************************************************** +	; +	; GET_NUM - GET A NUMBER, EITHER HEX OR FLOAT +	; +	;************************************************************** +	; +GET_NUM:ACALL	FP_BASE+10	;SCAN FOR HEX +	JNC	FP_BASE+12	;DO FP INPUT +	; +	ACALL	FP_BASE+18	;ASCII STRING TO R2:R0 +	JNZ	H_RET +	PUSH	DPH		;SAVE THE DATA_POINTER +	PUSH	DPL +	ACALL	FP_BASE+24	;PUT R2:R0 ON THE STACK +	POP	DPL		;RESTORE THE DATA_POINTER +	POP	DPH +	CLR	A		;NO ERRORS +	RET			;EXIT +	; +	newpage +	;************************************************************** +	; +	; WB - THE EGO MESSAGE +	; +	;************************************************************** +	; +WB:	DB	'W'+80H,'R'+80H +	DB	'I'+80H,'T'+80H,'T','E'+80H,'N'+80H +	DB	' ','B'+80H,'Y'+80H,' ' +	DB	'J'+80H,'O'+80H,'H'+80H,'N'+80H,' '+80H +	DB	'K','A'+80H,'T'+80H,'A'+80H,'U'+80H +	DB	'S','K'+80H,'Y'+80H +	DB	", I",'N'+80H,'T'+80H,'E'+80H,'L'+80H +	DB	' '+80H,'C'+80H,'O'+80H,'R'+80H,'P'+80H +	DB	". 1",'9'+80H,"85" +H_RET:	RET +	; +	newpage +	ORG	1990H +	; +T_L:	LJMP	TEROT +	; +	ORG	1F78H +	; +CKS_I:	JB	CKS_B,CS_I +	LJMP	401BH +	; +CS_I:	LJMP	2088H +	; +E14X:	DB	"NO DATA",'"' +	; +E11X:	DB	128+20 +	DB	"ARITH. OVERFLOW",'"' +	; +E16X:	DB	"PROGRAMMING",'"' +	; +E15X:	DB	"CAN" +	DB	27H +	DB	"T CONTINUE",'"' +	; +E10X:	DB	"INVALID LINE NUMBER",'"' +	; +NOROM:	DB	"PROM MODE",'"' +	; +S_N:	DB	"*MCS-51(tm) BASIC V1.1*",'"' +	; +	ORG	1FF8H +	; +ERS:	DB	"ERROR: ",'"' +	; +	newpage +	;*************************************************************** +	; +	segment	xdata	;External Ram +	; +	;*************************************************************** +	; +	DS	4 +IBCNT:	DS	1		;LENGTH OF A LINE +IBLN:	DS	2		;THE LINE NUMBER +IBUF:	DS	LINLEN		;THE INPUT BUFFER +CONVT:	DS	15		;CONVERSION LOCATION FOR FPIN +	; +	ORG	100H +	; +GTB:	DS	1		;GET LOCATION +ERRLOC:	DS	1		;ERROR TYPE +ERRNUM:	DS	2		;WHERE TO GO ON AN ERROR +VARTOP:	DS	2		;TOP OF VARIABLE STORAGE +ST_ALL:	DS	2		;STORAGE ALLOCATION +MT_ALL:	DS	2		;MATRIX ALLOCATION +MEMTOP:	DS	2		;TOP OF MEMORY +RCELL:	DS	2		;RANDOM NUMBER CELL +	DS	FPSIZ-1 +CXTAL:	DS	1		;CRYSTAL +	DS	FPSIZ-1 +FPT1:	DS	1		;FLOATINP POINT TEMP 1 +	DS	FPSIZ-1 +FPT2:	DS	1		;FLOATING POINT TEMP 2 +INTLOC:	DS	2		;LOCATION TO GO TO ON INTERRUPT +STR_AL:	DS	2		;STRING ALLOCATION +SPV:	DS	2		;SERIAL PORT BAUD RATE +TIV:	DS	2		;TIMER INTERRUPT NUM AND LOC +PROGS:	DS	2		;PROGRAM A PROM TIME OUT +IPROGS:	DS	2		;INTELLIGENT PROM PROGRAMMER TIMEOUT +TM_TOP:	DS	1 + +	include	bas52.fp + +	END diff --git a/tests/t_bas52/t_bas52.doc b/tests/t_bas52/t_bas52.doc new file mode 100644 index 0000000..05efe9d --- /dev/null +++ b/tests/t_bas52/t_bas52.doc @@ -0,0 +1,11 @@ ++----------------------  Test Application BAS52  ----------------------------+ +|                                                                            | +|  This is the source of the BASIC interpreter for Intel's 8052AH-Basic      | +|  (version 1.1).  In contrast to other test programs, the reference binary  | +|  was extracted from a real 8052AH and not generated with the BP version    | +|  of AS.  Since the source of this interpreter is now freeware, it should   | +|  be okay to include this program.  Of course, I had to modify the code a   | +|  bit to adapt it to AS...  The source and ROM dump was provided by         | +|  squest@cris.com.                                                          | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_bas52/t_bas52.inc b/tests/t_bas52/t_bas52.inc new file mode 100644 index 0000000..6bf1b5c --- /dev/null +++ b/tests/t_bas52/t_bas52.inc @@ -0,0 +1,2 @@ +; tests/t_bas52/t_bas52.asm-Includefile für Assembler-Programm +; Ende Includefile für Assembler-Programm diff --git a/tests/t_bas52/t_bas52.ori b/tests/t_bas52/t_bas52.ori Binary files differnew file mode 100644 index 0000000..f86786d --- /dev/null +++ b/tests/t_bas52/t_bas52.ori diff --git a/tests/t_buf32/asflags b/tests/t_buf32/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_buf32/asflags diff --git a/tests/t_buf32/t_buf32.asm b/tests/t_buf32/t_buf32.asm new file mode 100644 index 0000000..83e1d42 --- /dev/null +++ b/tests/t_buf32/t_buf32.asm @@ -0,0 +1,4883 @@ +;*                    BUFFALO +;* "Bit User's Fast Friendly Aid to Logical Operation" +;* +;* Rev 2.0 - 4/23/85 - added disassembler. +;*                     - variables now PTRn and TMPn. +;* Rev 2.1 - 4/29/85 - added byte erase to chgbyt routine. +;* Rev 2.2 - 5/16/85 - added hooks for evb board - acia +;*                       drivers, init and host routines. +;*            7/8/85  - fixed dump wraparound problem. +;*            7/10/85 - added evm board commands. +;*                     - added fill instruction. +;*            7/18/85 - added jump to EEPROM. +;* Rev 2.3 - 8/22/85 - call targco to disconnect sci from host +;*                       in reset routine for evb board. +;*            10/3/85 - modified load for download through terminal. +;* Rev 2.4 - 7/1/86  - Changed DFLOP address to fix conflicts with +;*                       EEPROM.  (was at A000) +;* Rev 2.5 - 9/8/86  - Modified to provide additional protection from +;*                       program run-away on power down.  Also fixed bugs +;*                       in MM and MOVE.  Changed to 1 stop bit from 2. +;* Rev 2.6 - 9/25/86 - Modified boot routine for variable length download +;*                       for use with 'HC11E8. +;* Rev 3.0   1/15/87 - EEPROM programming routines consolidated into WRITE. +;*                       Fill, Assem, and breakpoints will now do EEPROM. +;*                     - Added compare a to $0D to WSKIP routine. +;*            2/11/87 - Set up load to detect receiver error. +;* Rev 3.2   7/7/87  - Add disassembly to trace. +;*                     - Add entries to jump table. +;*            9/20/87 - Rewrote trace to use XIRQ, added STOPAT Command +;*            11/24/87- Write block protect reg for 'E9 version +;*                     - Modified variable length download for use +;*                          with 'E9 bootloader (XBOOT command) +;* +;* +;**************************************************** +;*    Although the information contained herein,    * +;*    as well as any information provided relative  * +;*    thereto, has been carefully reviewed and is   * +;*    believed accurate, Motorola assumes no     * +;*    liability arising out of its application or   * +;*    use, neither does it convey any license under * +;*    its patent rights nor the rights of others.   * +;**************************************************** + +         CPU  6811 + +;*************** +;*   EQUATES   * +;*************** +RAMBS    EQU  $0000             ; start of ram +REGBS    EQU  $1000             ; start of registers +ROMBS    EQU  $E000             ; start of rom +STREE    EQU  $B600             ; start of eeprom +ENDEE    EQU  $B7FF             ; end of eeprom +PORTE    EQU  REGBS+$0A         ; port e +CFORC    EQU  REGBS+$0B         ; force output compare +TCNT     EQU  REGBS+$0E         ; timer count +TOC5     EQU  REGBS+$1E         ; oc5 reg +TCTL1    EQU  REGBS+$20         ; timer control 1 +TMSK1    EQU  REGBS+$22         ; timer mask 1 +TFLG1    EQU  REGBS+$23         ; timer flag 1 +TMSK2    EQU  REGBS+$24         ; timer mask 2 +BAUD     EQU  REGBS+$2B         ; sci baud reg +SCCR1    EQU  REGBS+$2C         ; sci control1 reg +SCCR2    EQU  REGBS+$2D         ; sci control2 reg +SCSR     EQU  REGBS+$2E         ; sci status reg +SCDAT    EQU  REGBS+$2F         ; sci data reg +BPROT    EQU  REGBS+$35         ; block protect reg +OPTION   EQU  REGBS+$39         ; option reg +COPRST   EQU  REGBS+$3A         ; cop reset reg +PPROG    EQU  REGBS+$3B         ; ee prog reg +HPRIO    EQU  REGBS+$3C         ; hprio reg +CONFIG   EQU  REGBS+$3F         ; config register +DFLOP    EQU  $4000             ; evb d flip flop +DUART    EQU  $D000             ; duart address +PORTA    EQU  DUART +PORTB    EQU  DUART+8 +ACIA     EQU  $9800             ; acia address +PROMPT   EQU  '>' +BUFFLNG  EQU  35 +CTLA     EQU  $01               ; exit host or assembler +CTLB     EQU  $02               ; send break to host +CTLW     EQU  $17               ; wait +CTLX     EQU  $18               ; abort +DEL      EQU  $7F               ; abort +EOT      EQU  $04               ; end of text/table +SWI      EQU  $3F + +;*************** +;*     RAM     * +;*************** +         ORG  $33 +;*** Buffalo ram space *** +         RMB  20                ; user stack area +USTACK   RMB  30                ; monitor stack area +STACK    RMB  1 +REGS     RMB  9                 ; user's pc,y,x,a,b,c +SP       RMB  2                 ; user's sp +INBUFF   RMB  BUFFLNG           ; input buffer +ENDBUFF  EQU  * +COMBUFF  RMB  8                 ; command buffer +SHFTREG  RMB  2                 ; input shift register +BRKTABL  RMB  8                 ; breakpoint table +AUTOLF   RMB  1                 ; auto lf flag for i/o +IODEV    RMB  1                 ; 0=sci,  1=acia, 2=duartA, 3=duartB +EXTDEV   RMB  1                 ; 0=none, 1=acia, 2=duart, +HOSTDEV  RMB  1                 ; 0=sci,  1=acia,              3=duartB +COUNT    RMB  1                 ; # characters read +CHRCNT   RMB  1                 ; # characters output on current line +PTRMEM   RMB  2                 ; current memory location + +;*** Buffalo variables - used by: *** +PTR0     RMB  2                 ; main,readbuff,incbuff,AS +PTR1     RMB  2                 ; main,BR,DU,MO,AS,EX +PTR2     RMB  2                 ; EX,DU,MO,AS +PTR3     RMB  2                 ; EX,HO,MO,AS +PTR4     RMB  2                 ; EX,AS +PTR5     RMB  2                 ; EX,AS,BOOT +PTR6     RMB  2                 ; EX,AS,BOOT +PTR7     RMB  2                 ; EX,AS +PTR8     RMB  2                 ; AS +TMP1     RMB  1                 ; main,hexbin,buffarg,termarg +TMP2     RMB  1                 ; GO,HO,AS,LOAD +TMP3     RMB  1                 ; AS,LOAD +TMP4     RMB  1                 ; TR,HO,ME,AS,LOAD +;*** Vector jump table *** +JSCI     RMB   3 +JSPI     RMB   3 +JPAIE    RMB   3 +JPAO     RMB   3 +JTOF     RMB   3 +JTOC5    RMB   3 +JTOC4    RMB   3 +JTOC3    RMB   3 +JTOC2    RMB   3 +JTOC1    RMB   3 +JTIC3    RMB   3 +JTIC2    RMB   3 +JTIC1    RMB   3 +JRTI     RMB   3 +JIRQ     RMB   3 +JXIRQ    RMB   3 +JSWI     RMB   3 +JILLOP   RMB   3 +JCOP     RMB   3 +JCLM     RMB   3 + +;***************** +;* +;* ROM starts here * +;* +;***************** + +        ORG  ROMBS + +;***************** +;**  BUFFALO - This is where Buffalo starts +;** out of reset.  All initialization is done +;** here including determination of where the +;** user terminal is (SCI,ACIA, or DUART). +;***************** + +BUFFALO  LDX  #PORTE +         BRCLR 0,X,#01,BUFISIT  ; if bit 0 of port e is 1 +         JMP  $B600             ; then jump to the start of EEPROM +BUFISIT  LDAA #$93 +         STAA OPTION            ; adpu, dly, irqe, cop +         LDAA #$00 +         STAA TMSK2             ; timer pre = %1 for trace +         LDAA #$00 +         STAA BPROT             ; clear 'E9 eeprom block protect +         LDS  #STACK            ; monitor stack pointer +         JSR  VECINIT +         LDX  #USTACK +         STX  SP                ; default user stack +         LDAA TCTL1 +         ORAA #$03 +         STAA TCTL1             ; force oc5 pin high for trace +         LDAA #$D0 +         STAA REGS+8            ; default user ccr +         LDD  #$3F0D            ; initial command is ? +         STD  INBUFF +         JSR  BPCLR             ; clear breakpoints +         CLR  AUTOLF +         INC  AUTOLF            ; auto cr/lf = on + +;* Determine type of external comm device - none, or acia * + +         CLR  EXTDEV            ; default is none +         LDAA HPRIO +         ANDA #$20 +         BEQ  BUFF2             ; jump if single chip mode +         LDAA #$03              ; see if external acia exists +         STAA ACIA              ; master reset +         LDAA ACIA +         ANDA #$7F              ; mask irq bit from status register +         BNE  BUFF1             ; jump if status reg not 0 +         LDAA #$12 +         STAA ACIA              ; turn on acia +         LDAA ACIA +         ANDA #$02 +         BEQ  BUFF1             ; jump if tdre not set +         LDAA #$01 +         STAA EXTDEV            ; external device is acia +         BRA  BUFF2 + +BUFF1    EQU  *                 ; see if duart exists +         LDAA DUART+$0C        ; read IRQ vector register +         CMPA #$0F             ; should be out of reset +         BNE  BUFF2 +         LDAA #$AA +         STAA DUART+$0C         ; write irq vector register +         LDAA DUART+$0C         ; read irq vector register +         CMPA #$AA +         BNE  BUFF2 +         LDAA #$02 +         STAA EXTDEV            ; external device is duart A + +;* Find terminal port - SCI or external. * + +BUFF2    CLR  IODEV +         JSR  TARGCO            ; disconnect sci for evb board +         JSR  SIGNON            ; initialize sci +         LDAA EXTDEV +         BEQ  BUFF3             ; jump if no external device +         STAA IODEV +         JSR  SIGNON            ; initialize external device +BUFF3    CLR  IODEV +         JSR  INPUT             ; get input from sci port +         CMPA #$0D +         BEQ  BUFF4             ; jump if cr - sci is terminal port +         LDAA EXTDEV +         BEQ  BUFF3             ; jump if no external device +         STAA IODEV +         JSR  INPUT             ; get input from external device +         CMPA #$0D +         BEQ  BUFF4             ; jump if cr - terminal found ext +         BRA  BUFF3 + +SIGNON   JSR  INIT              ; initialize device +         LDX  #MSG1             ; buffalo message +         JSR  OUTSTRG +         RTS + +;* Determine where host port should be. * + +BUFF4    CLR  HOSTDEV           ; default - host = sci port +         LDAA IODEV +         CMPA #$01 +         BEQ  BUFF5             ; default host if term = acia +         LDAA #$03 +         STAA HOSTDEV           ;  else host is duart port b +BUFF5    EQU  * + +;***************** +;**  MAIN - This module reads the user's input into +;** a buffer called INBUFF.  The first field (assumed +;** to be the command field) is then parsed into a +;** second buffer called COMBUFF.  The command table +;** is then searched for the contents of COMBUFF and +;** if found, the address of the corresponding task +;** routine is fetched from the command table.  The +;** task is then called as a subroutine so that +;** control returns back to here upon completion of +;** the task.  Buffalo expects the following format +;** for commands: +;**     <cmd>[<wsp><arg><wsp><arg>...]<cr> +;** [] implies contents optional. +;** <wsp> means whitespace character (space,comma,tab). +;** <cmd> = command string of 1-8 characters. +;** <arg> = Argument particular to the command. +;** <cr> = Carriage return signifying end of input string. +;***************** +;* Prompt user +;*do +;*   a=input(); +;*   if(a==(cntlx or del)) continue; +;*   elseif(a==backspace) +;*      b--; +;*      if(b<0) b=0; +;*   else +;*      if(a==cr && buffer empty) +;*          repeat last command; +;*      else put a into buffer; +;*          check if buffer full; +;*while(a != (cr or /) + +MAIN     LDS  #STACK            ; initialize sp every time +         CLR  AUTOLF +         INC  AUTOLF            ; auto cr/lf = on +         JSR  OUTCRLF +         LDAA #PROMPT           ; prompt user +         JSR  OUTPUT +         CLRB +MAIN1    JSR  INCHAR            ; read terminal +         LDX  #INBUFF +         ABX                    ; pointer into buffer +         CMPA #CTLX +         BEQ  MAIN              ; jump if cntl X +         CMPA #DEL +         BEQ  MAIN              ; jump if del +         CMPA #$08 +         BNE  MAIN2             ; jump if not bckspc +         DECB +         BLT  MAIN              ; jump if buffer empty +         BRA  MAIN1 +MAIN2    CMPA #$D +         BNE  MAIN3             ; jump if not cr +         TSTB +         BEQ  COMM0             ; jump if buffer empty +         STAA ,X                ; put a in buffer +         BRA  COMM0 +MAIN3    STAA ,X                ; put a in buffer +         INCB +         CMPB #BUFFLNG +         BLE  MAIN4             ; jump if not long +         LDX  #MSG3             ; "long" +         JSR  OUTSTRG +         BRA  MAIN +MAIN4     CMPA #'/' +         BNE  MAIN1             ; jump if not "/" +;*         ******************* + +;***************** +;*  Parse out and evaluate the command field. +;***************** +;*Initialize + +COMM0    EQU  * +         CLR  TMP1              ; Enable "/" command +         CLR  SHFTREG +         CLR  SHFTREG+1 +         CLRB +         LDX  #INBUFF           ; ptrbuff[] = inbuff[] +         STX  PTR0 +         JSR  WSKIP             ; find first char + +;*while((a=readbuff) != (cr or wspace)) +;*     upcase(a); +;*     buffptr[b] = a +;*     b++ +;*     if (b > 8) error(too long); +;*     if(a == "/") +;*           if(enabled) mslash(); +;*           else error(command?); +;*     else hexbin(a); + +COMM1    EQU  * +         JSR  READBUFF          ; read from buffer +         LDX  #COMBUFF +         ABX +         JSR  UPCASE            ; convert to upper case +         STAA ,X                ; put in command buffer +         CMPA #$0D +         BEQ  SRCH              ; jump if cr +         JSR  WCHEK +         BEQ  SRCH              ; jump if wspac +         JSR  INCBUFF           ; move buffer pointer +         INCB +         CMPB #$8 +         BLE  COMM2 +         LDX  #MSG3             ; "long" +         JSR  OUTSTRG +         JMP  MAIN + +COMM2    EQU  * +         CMPA #'/' +         BNE  COMM4             ; jump if not "/" +         TST  TMP1 +         BNE  COMM3             ; jump if not enabled +         DECB +         STAB COUNT +         LDX  #MSLASH +         JMP  EXEC              ; execute "/" +COMM3    LDX  #MSG8             ; "command?" +         JSR  OUTSTRG +         JMP  MAIN +COMM4    EQU  * +         JSR  HEXBIN +         BRA  COMM1 + +;***************** +;*   Search tables for command.      At this point, +;* COMBUFF holds the command field to be executed, +;* and B = # of characters in the command field. +;* The command table holds the whole command name +;* but only the first n characters of the command +;* must match what is in COMBUFF where n is the +;* number of characters entered by the user. +;***************** +;*count = b; +;*ptr1 = comtabl; +;*while(ptr1[0] != end of table) +;*   ptr1 = next entry +;*   for(b=1; b=count; b++) +;*      if(ptr1[b] == combuff[b]) continue; +;*      else error(not found); +;*   execute task; +;*  return(); +;*return(command not found); + +SRCH    STAB COUNT              ; size of command entered +        LDX  #COMTABL           ; pointer to table +        STX  PTR1               ; pointer to next entry +SRCH1   LDX  PTR1 +        LDY  #COMBUFF           ; pointer to command buffer +        LDAB 0,X +        CMPB #$FF +        BNE  SRCH2 +        LDX  #MSG2              ; "command not found" +        JSR  OUTSTRG +        JMP  MAIN +SRCH2   PSHX                    ; compute next table entry +        ADDB #$3 +        ABX +        STX  PTR1 +        PULX +        CLRB +SRCHLP  INCB                    ; match characters loop +        LDAA 1,X                ; read table +        CMPA 0,Y                ; compare to combuff +        BNE  SRCH1              ; try next entry +        INX                     ; move pointers +        INY +        CMPB COUNT +        BLT  SRCHLP             ; loop countu1 times +        LDX  PTR1 +        DEX +        DEX +        LDX  0,X                ; jump address from table +EXEC    JSR  0,X                ; call task as subroutine +        JMP  MAIN +;* +;***************** +;*   UTILITY SUBROUTINES - These routines +;* are called by any of the task routines. +;***************** +;***************** +;*  UPCASE(a) - If the contents of A is alpha, +;* returns a converted to uppercase. +;***************** +UPCASE   CMPA #'a' +         BLT  UPCASE1           ; jump if < a +         CMPA #'z' +         BGT  UPCASE1           ; jump if > z +         SUBA #$20              ; convert +UPCASE1  RTS + +;***************** +;*  BPCLR() - Clear all entries in the +;* table of breakpoints. +;***************** +BPCLR    LDX  #BRKTABL +         LDAB #8 +BPCLR1   CLR  0,X +         INX +         DECB +         BGT  BPCLR1            ; loop 8 times +         RTS + +;***************** +;*  RPRNT1(x) - Prints name and contents of a single +;* user register. On entry X points to name of register +;* in reglist.  On exit, a=register name. +;***************** +REGLIST  FCC  "PYXABCS"         ; names +         FCB  0,2,4,6,7,8,9     ; offset +         FCB  1,1,1,0,0,0,1     ; size +RPRNT1   LDAA 0,X +         PSHA +         PSHX +         JSR  OUTPUT            ; name +         LDAA #'-' +         JSR  OUTPUT            ; dash +         LDAB 7,X               ; contents offset +         LDAA 14,X              ; bytesize +         LDX  #REGS             ; address +         ABX +         TSTA +         BEQ  RPRN2             ; jump if 1 byte +         JSR  OUT1BYT           ; 2 bytes +RPRN2    JSR  OUT1BSP +         PULX +         PULA +         RTS + +;***************** +;*  RPRINT() - Print the name and contents +;* of all the user registers. +;***************** +RPRINT   PSHX +         LDX  #REGLIST +RPRI1    JSR  RPRNT1            ; print name +         INX +         CMPA #'S'              ; s is last register +         BNE  RPRI1             ; jump if not done +         PULX +         RTS + +;***************** +;*   HEXBIN(a) - Convert the ASCII character in a +;* to binary and shift into shftreg.  Returns value +;* in tmp1 incremented if a is not hex. +;***************** +HEXBIN  PSHA +        PSHB +        PSHX +        JSR  UPCASE             ; convert to upper case +        CMPA #'0' +        BLT  HEXNOT             ; jump if a < $30 +        CMPA #'9' +        BLE  HEXNMB             ; jump if 0-9 +        CMPA #'A' +        BLT  HEXNOT             ; jump if $39> a <$41 +        CMPA #'F' +        BGT  HEXNOT             ; jump if a > $46 +        ADDA #$9                ; convert $A-$F +HEXNMB  ANDA #$0F               ; convert to binary +        LDX  #SHFTREG +        LDAB #4 +HEXSHFT ASL  1,X                ; 2 byte shift through +        ROL  0,X                ; carry bit +        DECB +        BGT  HEXSHFT            ; shift 4 times +        ORAA 1,X +        STAA 1,X +        BRA  HEXRTS +HEXNOT  INC  TMP1               ; indicate not hex +HEXRTS  PULX +        PULB +        PULA +        RTS + +;***************** +;*  BUFFARG() - Build a hex argument from the +;* contents of the input buffer. Characters are +;* converted to binary and shifted into shftreg +;* until a non-hex character is found.  On exit +;* shftreg holds the last four digits read, count +;* holds the number of digits read, ptrbuff points +;* to the first non-hex character read, and A holds +;* that first non-hex character. +;***************** +;*Initialize +;*while((a=readbuff()) not hex) +;*     hexbin(a); +;*return(); + +BUFFARG  CLR  TMP1              ; not hex indicator +         CLR  COUNT             ; # or digits +         CLR  SHFTREG +         CLR  SHFTREG+1 +         JSR  WSKIP +BUFFLP   JSR  READBUFF          ; read char +         JSR  HEXBIN +         TST  TMP1 +         BNE  BUFFRTS           ; jump if not hex +         INC  COUNT +         JSR  INCBUFF           ; move buffer pointer +         BRA  BUFFLP +BUFFRTS  RTS + +;***************** +;*  TERMARG() - Build a hex argument from the +;* terminal.  Characters are converted to binary +;* and shifted into shftreg until a non-hex character +;* is found.  On exit shftreg holds the last four +;* digits read, count holds the number of digits +;* read, and A holds the first non-hex character. +;***************** +;*initialize +;*while((a=inchar()) == hex) +;*     if(a = cntlx or del) +;*           abort; +;*     else +;*           hexbin(a); countu1++; +;*return(); + +TERMARG  CLR  COUNT +         CLR  SHFTREG +         CLR  SHFTREG+1 +TERM0    JSR  INCHAR +         CMPA #CTLX +         BEQ  TERM1             ; jump if controlx +         CMPA #DEL +         BNE  TERM2             ; jump if not delete +TERM1    JMP  MAIN              ; abort +TERM2    CLR  TMP1              ; hex indicator +         JSR  HEXBIN +         TST  TMP1 +         BNE  TERM3             ; jump if not hex +         INC  COUNT +         BRA  TERM0 +TERM3    RTS + +;***************** +;*   CHGBYT() - If shftreg is not empty, put +;* contents of shftreg at address in X.       If X +;* is an address in EEPROM then program it. +;***************** +;*if(count != 0) +;*   (x) = a; +CHGBYT   TST  COUNT +         BEQ  CHGBYT4           ; quit if shftreg empty +         LDAA SHFTREG+1         ; get data into a +         JSR  WRITE +CHGBYT4  RTS + + +;***************** +;* WRITE() - This routine is used to write the +;*contents of A to the address of X.  If the +;*address is in EEPROM, it will be programmed +;*and if it is already programmed, it will be +;*byte erased first. +;****************** +;*if(X is eeprom)then +;*   if(not erased) then erase; +;*   program (x) = A; +;*write (x) = A; +;*if((x) != A) error(rom); +WRITE   EQU  * +        CPX  #CONFIG +        BEQ  WRITE1             ; jump if config +        CPX  #STREE             ; start of EE +        BLO  WRITE2             ; jump if not EE +        CPX  #ENDEE             ; end of EE +        BHI  WRITE2             ; jump if not EE +WRITEE  PSHB +        LDAB 0,X +        CMPB #$FF +        PULB +        BEQ  WRITE1             ; jump if erased +        JSR  EEBYTE             ; byte erase +WRITE1  JSR  EEWRIT             ; byte program +WRITE2  STAA 0,X                ; write for non EE +        CMPA 0,X +        BEQ  WRITE3             ; jump if write ok +        PSHX +        LDX  #MSG6              ; "rom" +        JSR  OUTSTRG +        PULX +WRITE3  RTS + + +;***************** +;*   EEWRIT(), EEBYTE(), EEBULK() - +;* These routines are used to program and eeprom +;*locations.  eewrite programs the address in X with +;*the value in A, eebyte does a byte address at X, +;*and eebulk does a bulk of eeprom.  Whether eebulk +;*erases the config or not depends on the address it +;*receives in X. +;**************** +EEWRIT  EQU  *                  ; program one byte at x +        PSHB +        LDAB #$02 +        STAB PPROG +        STAA 0,X +        LDAB #$03 +        BRA  EEPROG +;*** +EEBYTE  EQU  *                  ; byte erase address x +        PSHB +        LDAB #$16 +        STAB PPROG +        LDAB #$FF +        STAB 0,X +        LDAB #$17 +        BRA  EEPROG +;*** +EEBULK  EQU  *                  ; bulk erase eeprom +        PSHB +        LDAB #$06 +        STAB PPROG +        LDAB #$FF +        STAB 0,X                ; erase config or not +        LDAB #$07               ; depends on X addr +EEPROG  BNE  ACL1 +        CLRB                    ; fail safe +ACL1    STAB PPROG +        PULB +;*** +DLY10MS EQU  *                  ; delay 10ms at E = 2MHz +        PSHX +        LDX  #$0D06 +DLYLP   DEX +        BNE  DLYLP +        PULX +        CLR  PPROG +        RTS + + +;***************** +;*  READBUFF() -  Read the character in INBUFF +;* pointed at by ptrbuff into A.  Returns ptrbuff +;* unchanged. +;***************** +READBUFF PSHX +         LDX  PTR0 +         LDAA 0,X +         PULX +         RTS + +;***************** +;*  INCBUFF(), DECBUFF() - Increment or decrement +;* ptrbuff. +;***************** +INCBUFF  PSHX +         LDX  PTR0 +         INX +         BRA  INCDEC +DECBUFF  PSHX +         LDX  PTR0 +         DEX +INCDEC   STX  PTR0 +         PULX +         RTS + +;***************** +;*  WSKIP() - Read from the INBUFF until a +;* non whitespace (space, comma, tab) character +;* is found.  Returns ptrbuff pointing to the +;* first non-whitespace character and a holds +;* that character.  WSKIP also compares a to +;* $0D (CR) and cond codes indicating the +;* results of that compare. +;***************** +WSKIP    JSR  READBUFF          ; read character +         JSR  WCHEK +         BNE  WSKIP1            ; jump if not wspc +         JSR  INCBUFF           ; move pointer +         BRA  WSKIP             ; loop +WSKIP1   CMPA #$0D +         RTS + +;***************** +;*  WCHEK(a) - Returns z=1 if a holds a +;* whitespace character, else z=0. +;***************** +WCHEK    CMPA #$2C              ; comma +         BEQ  WCHEK1 +         CMPA #$20              ; space +         BEQ  WCHEK1 +         CMPA #$09              ; tab +WCHEK1   RTS + +;***************** +;*   DCHEK(a) - Returns Z=1 if a = whitespace +;* or carriage return.  Else returns z=0. +;***************** +DCHEK   JSR  WCHEK +        BEQ  DCHEK1             ; jump if whitespace +        CMPA #$0D +DCHEK1  RTS + +;***************** +;*  CHKABRT() - Checks for a control x or delete +;* from the terminal.  If found, the stack is +;* reset and the control is transferred to main. +;* Note that this is an abnormal termination. +;*   If the input from the terminal is a control W +;* then this routine keeps waiting until any other +;* character is read. +;***************** +;*a=input(); +;*if(a=cntl w) wait until any other key; +;*if(a = cntl x or del) abort; + +CHKABRT  JSR  INPUT +         BEQ  CHK4              ; jump if no input +         CMPA #CTLW +         BNE  CHK2              ; jump in not cntlw +CHKABRT1 JSR  INPUT +         BEQ  CHKABRT1          ; jump if no input +CHK2     CMPA #DEL +         BEQ  CHK3              ; jump if delete +         CMPA #CTLX +         BEQ  CHK3              ; jump if control x +         CMPA #CTLA +         BNE  CHK4              ; jump not control a +CHK3     JMP  MAIN              ; abort +CHK4     RTS                    ; return + +;*********************** +;*  HOSTCO - connect sci to host for evb board. +;*  TARGCO - connect sci to target for evb board. +;*********************** +HOSTCO   PSHA +         LDAA #$01 +         STAA DFLOP             ; send 1 to d-flop +         PULA +         RTS + +TARGCO   PSHA +         LDAA #$00 +         STAA DFLOP             ; send 0 to d-flop +         PULA +         RTS + +;* +;********** +;* +;*     VECINIT - This routine checks for +;*         vectors in the RAM table.  All +;*         uninitialized vectors are programmed +;*         to JMP STOPIT +;* +;********** +;* +VECINIT  LDX  #JSCI             ; Point to First RAM Vector +         LDY  #STOPIT           ; Pointer to STOPIT routine +         LDD  #$7E03            ; A=JMP opcode; B=offset +VECLOOP  CMPA 0,X +         BEQ  VECNEXT           ; If vector already in +         STAA 0,X               ; install JMP +         STY  1,X               ; to STOPIT routine +VECNEXT  ABX                    ; Add 3 to point at next vector +         CPX  #JCLM+3           ; Done? +         BNE  VECLOOP           ; If not, continue loop +         RTS +;* +STOPIT   LDAA #$50              ; Stop-enable; IRQ, XIRQ-Off +         TAP +         STOP                   ; You are lost!  Shut down +         JMP  STOPIT            ; In case continue by XIRQ + +;********** +;* +;*   I/O MODULE +;*     Communications with the outside world. +;* 3 I/O routines (INIT, INPUT, and OUTPUT) call +;* drivers specified by IODEV (0=SCI, 1=ACIA, +;* 2=DUARTA, 3=DUARTB). +;* +;********** +;*   INIT() - Initialize device specified by iodev. +;********* +;* +INIT     EQU  * +         PSHA                   ; save registers +         PSHX +         LDAA IODEV +         CMPA #$00 +         BNE  INIT1             ; jump not sci +         JSR  ONSCI             ; initialize sci +         BRA  INIT4 +INIT1    CMPA #$01 +         BNE  INIT2             ; jump not acia +         JSR  ONACIA            ; initialize acia +         BRA  INIT4 +INIT2    LDX  #PORTA +         CMPA #$02 +         BEQ  INIT3             ; jump duart a +         LDX  #PORTB +INIT3    JSR  ONUART            ; initialize duart +INIT4    PULX                   ; restore registers +         PULA +         RTS + +;********** +;*  INPUT() - Read device. Returns a=char or 0. +;*    This routine also disarms the cop. +;********** +INPUT    EQU  * +         PSHX +         LDAA #$55              ; reset cop +         STAA COPRST +         LDAA #$AA +         STAA COPRST +         LDAA IODEV +         BNE  INPUT1            ; jump not sci +         JSR  INSCI             ; read sci +         BRA  INPUT4 +INPUT1   CMPA #$01 +         BNE  INPUT2            ; jump not acia +         JSR  INACIA            ; read acia +         BRA  INPUT4 +INPUT2   LDX  #PORTA +         CMPA #$02 +         BEQ  INPUT3            ; jump if duart a +         LDX  #PORTB +INPUT3   JSR  INUART            ; read uart +INPUT4   PULX +         RTS + +;********** +;*   OUTPUT() - Output character in A. +;* chrcnt indicates the current column on the +;*output display.  It is incremented every time +;*a character is outputted, and cleared whenever +;*the subroutine outcrlf is called. +;********** + +OUTPUT   EQU  * +         PSHA                   ; save registers +         PSHB +         PSHX +         LDAB IODEV +         BNE  OUTPUT1           ; jump not sci +         JSR  OUTSCI            ; write sci +         BRA  OUTPUT4 +OUTPUT1  CMPB #$01 +         BNE  OUTPUT2           ; jump not acia +         JSR  OUTACIA           ; write acia +         BRA  OUTPUT4 +OUTPUT2  LDX  #PORTA +         CMPB #$02 +         BEQ  OUTPUT3           ; jump if duart a +         LDX  #PORTB +OUTPUT3  JSR  OUTUART           ; write uart +OUTPUT4  PULX +         PULB +         PULA +         INC  CHRCNT            ; increment column count +         RTS + +;********** +;*   ONUART(port) - Initialize a duart port. +;* Sets duart to internal clock, divide by 16, +;* 8 data + 1 stop bits. +;********** + +ONUART   LDAA #$22 +         STAA 2,X               ; reset receiver +         LDAA #$38 +         STAA 2,X               ; reset transmitter +         LDAA #$40 +         STAA 2,X               ; reset error status +         LDAA #$10 +         STAA 2,X               ; reset pointer +         LDAA #$00 +         STAA DUART+4           ; clock source +         LDAA #$00 +         STAA DUART+5           ; interrupt mask +         LDAA #$13 +         STAA 0,X               ; 8 data, no parity +         LDAA #$07 +         STAA 0,X               ; 1 stop bits +         LDAA #$BB              ; baud rate (9600) +         STAA 1,X               ; tx and rcv baud rate +         LDAA #$05 +         STAA 2,X               ; enable tx and rcv +         RTS + +;********** +;*   INUART(port) - Check duart for any input. +;********** +INUART    LDAA 1,X              ; read status +         ANDA #$01              ; check rxrdy +         BEQ  INUART1           ; jump if no data +         LDAA 3,X               ; read data +         ANDA #$7F              ; mask parity +INUART1  RTS + +;********** +;*   OUTUART(port) - Output the character in a. +;*         if autolf=1, transmits cr or lf as crlf. +;********** +OUTUART  TST  AUTOLF +         BEQ  OUTUART2          ; jump if no autolf +         BSR  OUTUART2 +         CMPA #$0D +         BNE  OUTUART1 +         LDAA #$0A              ; if cr, output lf +         BRA  OUTUART2 +OUTUART1 CMPA #$0A +         BNE  OUTUART3 +         LDAA #$0D              ; if lf, output cr +OUTUART2 LDAB 1,X               ; check status +         ANDB #$4 +         BEQ  OUTUART2          ; loop until tdre=1 +         ANDA #$7F              ; mask parity +         STAA 3,X               ; send character +OUTUART3 RTS + +;********** +;*   ONSCI() - Initialize the SCI for 9600 +;*                   baud at 8 MHz Extal. +;********** +ONSCI    LDAA #$30 +         STAA BAUD              ; baud register +         LDAA #$00 +         STAA SCCR1 +         LDAA #$0C +         STAA SCCR2             ; enable +         RTS + +;********** +;*   INSCI() - Read from SCI.  Return a=char or 0. +;********** +INSCI    LDAA SCSR              ; read status reg +         ANDA #$20              ; check rdrf +         BEQ  INSCI1            ; jump if no data +         LDAA SCDAT             ; read data +         ANDA #$7F              ; mask parity +INSCI1   RTS + +;********** +;*  OUTSCI() - Output A to sci. IF autolf = 1, +;*                 cr and lf sent as crlf. +;********** +OUTSCI   TST  AUTOLF +         BEQ  OUTSCI2           ; jump if autolf=0 +         BSR  OUTSCI2 +         CMPA #$0D +         BNE  OUTSCI1 +         LDAA #$0A              ; if cr, send lf +         BRA  OUTSCI2 +OUTSCI1  CMPA #$0A +         BNE  OUTSCI3 +         LDAA #$0D              ; if lf, send cr +OUTSCI2  LDAB SCSR              ; read status +         BITB #$80 +         BEQ  OUTSCI2           ; loop until tdre=1 +         ANDA #$7F              ; mask parity +         STAA SCDAT             ; send character +OUTSCI3  RTS + +;********** +;*   ONACIA - Initialize the ACIA for +;* 8 data bits, 1 stop bit, divide by 64 clock. +;********** +ONACIA   LDX  #ACIA +         LDAA #$03 +         STAA 0,X               ; master reset +         LDAA #$16 +         STAA 0,X               ; setup +         RTS + +;********** +;*   INACIA - Read from the ACIA, Return a=char or 0. +;* Tmp3 is used to flag overrun or framing error. +;********** +INACIA   LDX  #ACIA +         LDAA 0,X               ; read status register +         PSHA +         ANDA #$30              ; check ov, fe +         PULA +         BEQ  INACIA1           ; jump - no error +         LDAA #$01 +         STAA TMP3              ; flag receiver error +         BRA  INACIA2           ; read data to clear status +INACIA1  ANDA #$01              ; check rdrf +         BEQ  INACIA3           ; jump if no data +INACIA2  LDAA 1,X               ; read data +         ANDA #$7F              ; mask parity +INACIA3  RTS + +;********** +;*  OUTACIA - Output A to acia. IF autolf = 1, +;*                 cr or lf sent as crlf. +;********** +OUTACIA  BSR  OUTACIA3          ; output char +         TST  AUTOLF +         BEQ  OUTACIA2          ; jump no autolf +         CMPA #$0D +         BNE  OUTACIA1 +         LDAA #$0A +         BSR  OUTACIA3          ; if cr, output lf +         BRA  OUTACIA2 +OUTACIA1 CMPA #$0A +         BNE  OUTACIA2 +         LDAA #$0D +         BSR  OUTACIA3          ; if lf, output cr +OUTACIA2 RTS + +OUTACIA3 LDX  #ACIA +         LDAB 0,X +         BITB #$2 +         BEQ  OUTACIA3          ; loop until tdre +         ANDA #$7F              ; mask parity +         STAA 1,X               ; output +         RTS +;* +;*         Space for modifying OUTACIA routine +;* +         FDB  $FFFF,$FFFF,$FFFF,$FFFF +;******************************* +;*** I/O UTILITY SUBROUTINES *** +;***These subroutines perform the neccesary +;* data I/O operations. +;* OUTLHLF-Convert left 4 bits of A from binary +;*             to ASCII and output. +;* OUTRHLF-Convert right 4 bits of A from binary +;*             to ASCII and output. +;* OUT1BYT-Convert byte addresed by X from binary +;*            to ASCII and output. +;* OUT1BSP-Convert byte addressed by X from binary +;*            to ASCII and output followed by a space. +;* OUT2BSP-Convert 2 bytes addressed by X from binary +;*             to ASCII and  output followed by a space. +;* OUTSPAC-Output a space. +;* +;* OUTCRLF-Output a line feed and carriage return. +;* +;* OUTSTRG-Output the string of ASCII bytes addressed +;*             by X until $04. +;* OUTA-Output the ASCII character in A. +;* +;* TABTO-Output spaces until column 20 is reached. +;* +;* INCHAR-Input to A and echo one character.  Loops +;*             until character read. +;*         ******************* +; +;********** +;*  OUTRHLF(), OUTLHLF(), OUTA() +;*Convert A from binary to ASCII and output. +;*Contents of A are destroyed.. +;********** +OUTLHLF  LSRA                   ; shift data to right +         LSRA +         LSRA +         LSRA +OUTRHLF  ANDA #$0F              ; mask top half +         ADDA #$30              ; convert to ascii +         CMPA #$39 +         BLE  OUTA              ; jump if 0-9 +         ADDA #$07              ; convert to hex A-F +OUTA     JSR  OUTPUT            ; output character +         RTS + +;********** +;*  OUT1BYT(x) - Convert the byte at X to two +;* ASCII characters and output. Return X pointing +;* to next byte. +;********** +OUT1BYT  PSHA +         LDAA 0,X               ; get data in a +         PSHA                   ; save copy +         BSR  OUTLHLF           ; output left half +         PULA                   ; retrieve copy +         BSR  OUTRHLF           ; output right half +         PULA +         INX +         RTS + +;********** +;*  OUT1BSP(x), OUT2BSP(x) - Output 1 or 2 bytes +;* at x followed by a space.  Returns x pointing to +;* next byte. +;********** +OUT2BSP  JSR  OUT1BYT           ; do first byte +OUT1BSP  JSR  OUT1BYT           ; do next byte +OUTSPAC  LDAA #$20              ; output a space +         JSR  OUTPUT +         RTS + +;********** +;*  OUTCRLF() - Output a Carriage return and +;* a line feed.    Returns a = cr. +;********** +OUTCRLF  LDAA #$0D              ; cr +         JSR  OUTPUT            ; output a +         LDAA #$00 +         JSR  OUTPUT            ; output padding +         LDAA #$0D +         CLR  CHRCNT            ; zero the column counter +         RTS + +;********** +;*  OUTSTRG(x) - Output string of ASCII bytes +;* starting at x until end of text ($04).  Can +;* be paused by control w (any char restarts). +;********** +OUTSTRG  JSR  OUTCRLF +OUTSTRG0 PSHA +OUTSTRG1 LDAA 0,X               ; read char into a +         CMPA #EOT +         BEQ  OUTSTRG3          ; jump if eot +         JSR  OUTPUT            ; output character +         INX +         JSR  INPUT +         BEQ  OUTSTRG1          ; jump if no input +         CMPA #CTLW +         BNE  OUTSTRG1          ; jump if not cntlw +OUTSTRG2 JSR  INPUT +         BEQ  OUTSTRG2          ; jump if any input +         BRA  OUTSTRG1 +OUTSTRG3 PULA +         RTS + + +;********* +;*  TABTO() - move cursor over to column 20. +;*while(chrcnt < 16) outspac. +TABTO    EQU  * +        PSHA +TABTOLP JSR  OUTSPAC +        LDAA CHRCNT +        CMPA #20 +        BLE  TABTOLP +        PULA +        RTS + +;********** +;*  INCHAR() - Reads input until character sent. +;*    Echoes char and returns with a = char. +INCHAR    JSR  INPUT +         TSTA +         BEQ  INCHAR            ; jump if no input +         JSR  OUTPUT            ; echo +         RTS + +;********************* +;*** COMMAND TABLE *** +COMTABL  EQU  * +         FCB  5 +         FCC  "ASSEM" +         FDB  ASSEM +         FCB  5 +         FCC  "BREAK" +         FDB  BREAK +         FCB  4 +         FCC  "BULK" +         FDB  BULK +         FCB  7 +         FCC  "BULKALL" +         FDB  BULKALL +         FCB  4 +         FCC  "CALL" +         FDB  CALL +         FCB  4 +         FCC  "DUMP" +         FDB  DUMP +         FCB  4 +         FCC  "FILL" +         FDB  FILL +         FCB  2 +         FCC  "GO" +         FDB  GO +         FCB  4 +         FCC  "HELP" +         FDB  HELP +         FCB  4 +         FCC  "HOST" +         FDB  HOST +         FCB  4 +         FCC  "LOAD" +         FDB  LOAD +         FCB  6                 ; LENGTH OF COMMAND +         FCC  "MEMORY"          ; ASCII COMMAND +         FDB  MEMORY            ; COMMAND ADDRESS +         FCB  4 +         FCC  "MOVE" +         FDB  MOVE +         FCB  7 +         FCC  "PROCEED" +         FDB  PROCEED +         FCB  8 +         FCC  "REGISTER" +         FDB  REGISTER +         FCB  6 +         FCC  "STOPAT" +         FDB  STOPAT +         FCB  5 +         FCC  "TRACE" +         FDB  TRACE +         FCB  6 +         FCC  "VERIFY" +         FDB  VERIFY +         FCB  1 +         FCC  "?"               ; initial command +         FDB  HELP +         FCB  5 +         FCC  "XBOOT" +         FDB  BOOT +;* +;*** Command names for evm compatability *** +;* +         FCB  3 +         FCC  "ASM" +         FDB  ASSEM +         FCB  2 +         FCC  "BF" +         FDB  FILL +         FCB  4 +         FCC  "COPY" +         FDB  MOVE +         FCB  5 +         FCC  "ERASE" +         FDB  BULK +         FCB  2 +         FCC  "MD" +         FDB  DUMP +         FCB  2 +         FCC  "MM" +         FDB  MEMORY +         FCB  2 +         FCC  "RD" +         FDB  REGISTER +         FCB  2 +         FCC  "RM" +         FDB  REGISTER +         FCB  4 +         FCC  "READ" +         FDB  MOVE +         FCB  2 +         FCC  "TM" +         FDB  HOST +         FCB  4 +         FCC  "TEST" +         FDB  EVBTEST +         FCB  $FF + +;******************* +;*** TEXT TABLES *** + +MSG1    FCC   "BUFFALO 3.2 (int) - Bit User Fast Friendly Aid to Logical Operation" +        FCB   EOT +MSG2    FCC   "What?" +        FCB   EOT +MSG3    FCC   "Too Long" +        FCB   EOT +MSG4    FCC   "Full" +        FCB   EOT +MSG5    FCC   "Op- " +        FCB   EOT +MSG6    FCC   "rom-" +        FCB   EOT +MSG8    FCC   "Command?" +        FCB   EOT +MSG9    FCC   "Bad argument" +        FCB   EOT +MSG10   FCC   "No host port available" +        FCB   EOT +MSG11   FCC   "done" +        FCB   EOT +MSG12   FCC   "checksum error" +        FCB   EOT +MSG13   FCC   "error addr " +        FCB   EOT +MSG14   FCC   "receiver error" +        FCB   EOT + +;********** +;*   break [-][<addr>] . . . +;* Modifies the breakpoint table.  More than +;* one argument can be entered on the command +;* line but the table will hold only 4 entries. +;* 4 types of arguments are implied above: +;* break    Prints table contents. +;* break <addr>      Inserts <addr>. +;* break -<addr>   Deletes <addr>. +;* break -           Clears all entries. +;********** +;* while 1 +;*     a = wskip(); +;*     switch(a) +;*           case(cr): +;*                 bprint(); return; + +BREAK   JSR  WSKIP +        BNE  BRKDEL             ; jump if not cr +        JSR  BPRINT             ; print table +        RTS + +;*           case("-"): +;*                 incbuff(); readbuff(); +;*                 if(dchek(a))            /* look for wspac or cr */ +;*                      bpclr(); +;*                      breaksw; +;*                 a = buffarg(); +;*                 if( !dchek(a) ) return(bad argument); +;*                 b = bpsrch(); +;*                 if(b >= 0) +;*                      brktabl[b] = 0; +;*                 breaksw; + +BRKDEL  CMPA #'-' +        BNE  BRKDEF             ; jump if not - +        JSR  INCBUFF +        JSR  READBUFF +        JSR  DCHEK +        BNE  BRKDEL1            ; jump if not delimeter +        JSR  BPCLR              ; clear table +        JMP  BREAK              ; do next argument +BRKDEL1 JSR  BUFFARG            ; get address to delete +        JSR  DCHEK +        BEQ  BRKDEL2            ; jump if delimeter +        LDX  #MSG9              ; "bad argument" +        JSR  OUTSTRG +        RTS +BRKDEL2 JSR  BPSRCH             ; look for addr in table +        TSTB +        BMI  BRKDEL3            ; jump if not found +        LDX  #BRKTABL +        ABX +        CLR  0,X                ; clear entry +        CLR  1,X +BRKDEL3 JMP  BREAK              ; do next argument + +;*           default: +;*                 a = buffarg(); +;*                 if( !dchek(a) ) return(bad argument); +;*                 b = bpsrch(); +;*                 if(b < 0)              /* not already in table */ +;*                      x = shftreg; +;*                      shftreg = 0; +;*                      a = x[0]; x[0] = $3F +;*                      b = x[0]; x[0] = a; +;*                      if(b != $3F) return(rom); +;*                      b = bpsrch();   /* look for hole */ +;*                      if(b >= 0) return(table full); +;*                      brktabl[b] = x; +;*                 breaksw; + +BRKDEF  JSR  BUFFARG            ; get argument +        JSR  DCHEK +        BEQ  BRKDEF1            ; jump if delimiter +        LDX  #MSG9              ; "bad argument" +        JSR  OUTSTRG +        RTS +BRKDEF1 JSR  BPSRCH             ; look for entry in table +        TSTB +        BGE  BREAK              ; jump if already in table + +        LDX  SHFTREG            ; x = new entry addr +        LDAA 0,X                ; save original contents +        PSHA +        LDAA #SWI +        JSR  WRITE              ; write to entry addr +        LDAB 0,X                ; read back +        PULA +        JSR  WRITE              ; restore original +        CMPB #SWI +        BEQ  BRKDEF2            ; jump if writes ok +        STX  PTR1               ; save address +        LDX  #PTR1 +        JSR  OUT2BSP            ; print address +        JSR  BPRINT +        RTS +BRKDEF2 CLR  SHFTREG +        CLR  SHFTREG+1 +        PSHX +        JSR  BPSRCH             ; look for 0 entry +        PULX +        TSTB +        BPL  BRKDEF3            ; jump if table not full +        LDX  #MSG4              ; "full" +        JSR  OUTSTRG +        JSR  BPRINT +        RTS +BRKDEF3 LDY  #BRKTABL +        ABY +        STX  0,Y                ; put new entry in +        JMP  BREAK              ; do next argument + +;********** +;*   bprint() - print the contents of the table. +;********** +BPRINT  JSR  OUTCRLF +        LDX  #BRKTABL +        LDAB #4 +BPRINT1 JSR  OUT2BSP +        DECB +        BGT  BPRINT1           ; loop 4 times +        RTS + +;********** +;*   bpsrch() - search table for address in +;* shftreg. Returns b = index to entry or +;* b = -1 if not found. +;********** +;*for(b=0; b=6; b=+2) +;*     x[] = brktabl + b; +;*     if(x[0] = shftreg) +;*           return(b); +;*return(-1); + +BPSRCH   CLRB +BPSRCH1  LDX  #BRKTABL +         ABX +         LDX  0,X               ; get table entry +         CPX  SHFTREG +         BNE  BPSRCH2           ; jump if no match +         RTS +BPSRCH2  INCB +         INCB +         CMPB #$6 +         BLE  BPSRCH1           ; loop 4 times +         LDAB #$FF +         RTS + + +;********** +;*  bulk  - Bulk erase the eeprom not config. +;* bulkall - Bulk erase eeprom and config. +;********* +BULK    EQU  * +        LDX  #$B600 +        BRA  BULK1 +BULKALL LDX  #CONFIG +BULK1   LDAA #$FF +        JSR  EEBULK +        RTS + + + +;********** +;*  dump [<addr1> [<addr2>]]  - Dump memory +;* in 16 byte lines from <addr1> to <addr2>. +;*   Default starting address is "current +;* location" and default number of lines is 8. +;********** +;*ptr1 = ptrmem;        /* default start address */ +;*ptr2 = ptr1 + $80;    /* default end address */ +;*a = wskip(); +;*if(a != cr) +;*     a = buffarg(); +;*     if(countu1 = 0) return(bad argument); +;*     if( !dchek(a) ) return(bad argument); +;*     ptr1 = shftreg; +;*     ptr2 = ptr1 + $80;  /* default end address */ +;*     a = wskip(); +;*     if(a != cr) +;*           a = buffarg(); +;*           if(countu1 = 0) return(bad argument); +;*           a = wskip(); +;*           if(a != cr) return(bad argument); +;*           ptr2 = shftreg; + +DUMP     LDX  PTRMEM            ; current location +         STX  PTR1              ; default start +         LDAB #$80 +         ABX +         STX  PTR2              ; default end +         JSR  WSKIP +         BEQ  DUMP1             ; jump - no arguments +         JSR  BUFFARG           ; read argument +         TST  COUNT +         BEQ  DUMPERR           ; jump if no argument +         JSR  DCHEK +         BNE  DUMPERR           ; jump if delimiter +         LDX  SHFTREG +         STX  PTR1 +         LDAB #$80 +         ABX +         STX  PTR2              ; default end address +         JSR  WSKIP +         BEQ  DUMP1             ; jump - 1 argument +         JSR  BUFFARG           ; read argument +         TST  COUNT +         BEQ  DUMPERR           ; jump if no argument +         JSR  WSKIP +         BNE  DUMPERR           ; jump if not cr +         LDX  SHFTREG +         STX  PTR2 +         BRA  DUMP1             ; jump - 2 arguments +DUMPERR  LDX  #MSG9             ; "bad argument" +         JSR  OUTSTRG +         RTS + +;*ptrmem = ptr1; +;*ptr1 = ptr1 & $fff0; + +DUMP1    LDD  PTR1 +         STD  PTRMEM            ; new current location +         ANDB #$F0 +         STD  PTR1              ; start dump at 16 byte boundary + +;*** dump loop starts here *** +;*do: +;*     output address of first byte; + +DUMPLP   JSR  OUTCRLF +         LDX  #PTR1 +         JSR  OUT2BSP           ; first address + +;*     x = ptr1; +;*     for(b=0; b=16; b++) +;*           output contents; + +         LDX  PTR1              ; base address +         CLRB                   ; loop counter +DUMPDAT  JSR  OUT1BSP           ; hex value loop +         INCB +         CMPB #$10 +         BLT  DUMPDAT           ; loop 16 times + +;*     x = ptr1; +;*     for(b=0; b=16; b++) +;*           a = x[b]; +;*           if($7A < a < $20)  a = $20; +;*           output ascii contents; + +         CLRB                   ; loop counter +DUMPASC  LDX  PTR1              ; base address +         ABX +         LDAA ,X                ; ascii value loop +         CMPA #$20 +         BLO  DUMP3             ; jump if non printable +         CMPA #$7A +         BLS  DUMP4             ; jump if printable +DUMP3    LDAA #$20              ; space for non printables +DUMP4    JSR  OUTPUT            ; output ascii value +         INCB +         CMPB #$10 +         BLT  DUMPASC           ; loop 16 times + +;*     chkabrt(); +;*     ptr1 = ptr1 + $10; +;*while(ptr1 <= ptr2); +;*return; + +         JSR  CHKABRT           ; check abort or wait +         LDD  PTR1 +         ADDD #$10              ; point to next 16 byte bound +         STD  PTR1              ; update ptr1 +         CPD  PTR2 +         BHI  DUMP5             ; quit if ptr1 > ptr2 +         CPD  #$00              ; check wraparound at $ffff +         BNE  DUMPLP            ; jump - no wraparound +         LDD  PTR2 +         CPD  #$FFF0 +         BLO  DUMPLP            ; upper bound not at top +DUMP5    RTS                    ; quit + + + +;********** +;*  fill <addr1> <addr2> [<data>]  - Block fill +;*memory from addr1 to addr2 with data.       Data +;*defaults to $FF. +;********** +;*get addr1 and addr2 +FILL    EQU  * +        JSR  WSKIP +        JSR  BUFFARG +        TST  COUNT +        BEQ  FILLERR            ; jump if no argument +        JSR  WCHEK +        BNE  FILLERR            ; jump if bad argument +        LDX  SHFTREG +        STX  PTR1               ; address1 +        JSR  WSKIP +        JSR  BUFFARG +        TST  COUNT +        BEQ  FILLERR            ; jump if no argument +        JSR  DCHEK +        BNE  FILLERR            ; jump if bad argument +        LDX  SHFTREG +        STX  PTR2               ; address2 + +;*Get data if it exists +        LDAA #$FF +        STAA TMP2               ; default data +        JSR  WSKIP +        BEQ  FILL1              ; jump if default data +        JSR  BUFFARG +        TST  COUNT +        BEQ  FILLERR            ; jump if no argument +        JSR  WSKIP +        BNE  FILLERR            ; jump if bad argument +        LDAA SHFTREG+1 +        STAA TMP2 + +;*while(ptr1 <= ptr2) +;*   *ptr1 = data +;*   if(*ptr1 != data) abort + +FILL1   EQU  * +        JSR  CHKABRT            ; check for abort +        LDX  PTR1               ; starting address +        LDAA TMP2               ; data +        JSR  WRITE              ; write the data to x +        CMPA 0,X +        BNE  FILLBAD            ; jump if no write +        CPX  PTR2 +        BEQ  FILL2              ; quit yet? +        INX +        STX  PTR1 +        BRA  FILL1              ; loop +FILL2   RTS + +FILLERR LDX  #MSG9              ; "bad argument" +        JSR  OUTSTRG +        RTS + +FILLBAD EQU  * +        LDX  #PTR1              ; output bad address +        JSR  OUT2BSP +        RTS + + + +;********** +;*   call [<addr>] - Execute a jsr to <addr> or user +;*pc value.  Return to monitor via  rts or breakpoint. +;********** +;*a = wskip(); +;*if(a != cr) +;*     a = buffarg(); +;*     a = wskip(); +;*     if(a != cr) return(bad argument) +;*     pc = shftreg; +CALL     JSR  WSKIP +         BEQ  CALL3             ; jump if no arg +         JSR  BUFFARG +         JSR  WSKIP +         BEQ  CALL2             ; jump if cr +         LDX  #MSG9             ; "bad argument" +         JSR  OUTSTRG +         RTS +CALL2    LDX  SHFTREG +         STX  REGS              ; pc = <addr> + +;*put return address on user stack +;*setbps(); +;*restack();       /* restack and go*/ +CALL3    LDX  SP +         DEX                    ; user stack pointer +         LDD  #RETURN           ; return address +         STD  0,X +         DEX +         STX  SP                ; new user stack pointer +         JSR  SETBPS +         CLR  TMP2              ; 1=go, 0=call +         JMP  RESTACK           ; go to user code + +;********** +;*   return() - Return here from rts after +;*call command. +;********** +RETURN   PSHA                   ; save a register +         TPA +         STAA REGS+8            ; cc register +         PULA +         STD  REGS+6            ; a and b registers +         STX  REGS+4            ; x register +         STY  REGS+2            ; y register +         STS  SP                ; user stack pointer +         LDS  PTR2              ; monitor stack pointer +         JSR  REMBPS            ; remove breakpoints +         JSR  OUTCRLF +         JSR  RPRINT            ; print user registers +         RTS + + +;********** +;*   proceed - Same as go except it ignores +;*a breakpoint at the first opcode.  Calls +;*runone for the first instruction only. +;********** +PROCEED  EQU  * +         JSR  RUNONE            ; run one instruction +         JSR  CHKABRT           ; check for abort +         CLR  TMP2              ; flag for breakpoints +         INC  TMP2              ; 1=go 0=call +         JSR  SETBPS +         JMP  RESTACK           ; go execute + +;********** +;*   go [<addr>] - Execute starting at <addr> or +;*user's pc value.  Executes an rti to user code. +;*Returns to monitor via an swi through swiin. +;********** +;*a = wskip(); +;*if(a != cr) +;*     a = buffarg(); +;*     a = wskip(); +;*     if(a != cr) return(bad argument) +;*     pc = shftreg; +;*setbps(); +;*restack();       /* restack and go*/ +GO       JSR  WSKIP +         BEQ  GO2               ; jump if no arg +         JSR  BUFFARG +         JSR  WSKIP +         BEQ  GO1               ; jump if cr +         LDX  #MSG9             ; "bad argument" +         JSR  OUTSTRG +         RTS +GO1      LDX  SHFTREG +         STX  REGS              ; pc = <addr> +GO2      CLR  TMP2 +         INC  TMP2              ; 1=go, 0=call +         JSR  SETBPS +         JMP  RESTACK           ; go to user code + +;***** +;** SWIIN - Breakpoints from go or call commands enter here. +;*Remove breakpoints, save user registers, return +SWIIN    EQU  *                 ; swi entry point +         TSX                    ; user sp -> x +         LDS  PTR2              ; restore monitor sp +         JSR  SAVSTACK          ; save user regs +         JSR  REMBPS            ; remove breakpoints from code +         LDX  REGS +         DEX +         STX  REGS              ; save user pc value + +;*if(call command) remove call return addr from user stack; +         TST  TMP2              ; 1=go, 0=call +         BNE  GO3               ; jump if go command +         LDX  SP                ; remove return address +         INX                    ; user stack pointer +         INX +         STX  SP +GO3      JSR  OUTCRLF           ; print register values +         JSR  RPRINT +         RTS                    ; done + +;********** +;*  setbps - Replace user code with swi's at +;*breakpoint addresses. +;********** +;*for(b=0; b=6; b =+ 2) +;*     x = brktabl[b]; +;*     if(x != 0) +;*           optabl[b] = x[0]; +;*           x[0] = $3F; +;*Put monitor SWI vector into jump table + +SETBPS   CLRB +SETBPS1  LDX  #BRKTABL +         LDY  #PTR4 +         ABX +         ABY +         LDX  0,X               ; breakpoint table entry +         BEQ  SETBPS2           ; jump if 0 +         LDAA 0,X               ; save user opcode +         STAA 0,Y +         LDAA #SWI +         JSR  WRITE             ; insert swi into code +SETBPS2  ADDB #$2 +         CMPB #$6 +         BLE  SETBPS1           ; loop 4 times +         LDX  JSWI+1 +         STX  PTR3              ; save user swi vector +         LDAA #$7E              ; jmp opcode +         STAA JSWI +         LDX  #SWIIN +         STX  JSWI+1            ; monitor swi vector +         RTS + +;********** +;*   rembps - Remove breakpoints from user code. +;********** +;*for(b=0; b=6; b =+ 2) +;*     x = brktabl[b]; +;*     if(x != 0) +;*           x[0] = optabl[b]; +;*Replace user's SWI vector +REMBPS   CLRB +REMBPS1  LDX  #BRKTABL +         LDY  #PTR4 +         ABX +         ABY +         LDX  0,X               ; breakpoint table entry +         BEQ  REMBPS2           ; jump if 0 +         LDAA 0,Y +         JSR  WRITE             ; restore user opcode +REMBPS2  ADDB #$2 +         CMPB #$6 +         BLE  REMBPS1           ; loop 4 times +         LDX  PTR3              ; restore user swi vector +         STX  JSWI+1 +         RTS + + +;********** +;*   trace <n> - Trace n instructions starting +;*at user's pc value. n is a hex number less than +;*$FF (defaults to 1). +;********** +;*a = wskip(); +;*if(a != cr) +;*     a = buffarg(); a = wskip(); +;*     if(a != cr) return(bad argument); +;*     countt1 = n +TRACE    CLR  TMP4 +         INC  TMP4              ; default count=1 +         CLR  CHRCNT            ; set up for display +         JSR  WSKIP +         BEQ  TRACE2            ; jump if cr +         JSR  BUFFARG +         JSR  WSKIP +         BEQ  TRACE1            ; jump if cr +         LDX  #MSG9             ; "bad argument" +         JSR  OUTSTRG +         RTS +TRACE1   LDAA SHFTREG+1         ; n +         STAA TMP4 + +;*Disassemble the line about to be traced +TRACE2   EQU  * +         LDAB TMP4 +         PSHB +         LDX  REGS +         STX  PTR1              ; pc value for disass +         JSR  DISASSM +         PULB +         STAB TMP4 + +;*run one instruction +;*rprint(); +;*while(count > 0) continue trace; +         JSR  RUNONE +         JSR  CHKABRT           ; check for abort +         JSR  TABTO             ; print registers for +         JSR  RPRINT            ; result of trace +         DEC  TMP4 +         BEQ  TRACDON           ; quit if count=0 +TRACE3   JSR  OUTCRLF +         BRA  TRACE2 +TRACDON  RTS + + +;********** +;*   stopat <addr> - Trace instructions until <addr> +;*is reached. +;********** +;*if((a=wskip) != cr) +;*     a = buffarg(); a = wskip(); +;*     if(a != cr) return(bad argument); +;*else return(bad argument); +STOPAT   EQU  * +         JSR  WSKIP +         BEQ  STOPGO            ; jump if cr - no argument +         JSR  BUFFARG +         JSR  WSKIP +         BEQ  STOPAT1           ; jump if cr +         LDX  #MSG9             ; "bad argument" +         JSR  OUTSTRG +         RTS +STOPAT1  TST  COUNT +         BEQ  STOPGO            ; jump if no argument +         LDX  SHFTREG +         STX  PTRMEM            ; update "current location" + +;*while(!(ptrmem <= userpc < ptrmem+10)) runone(); +;*rprint(); +STOPGO   LDD  REGS              ; userpc +         CPD  PTRMEM +         BLO  STOPNEXT          ; if(userpc < ptrmem) runone +         LDD  PTRMEM +         ADDD #10 +         CPD  REGS +         BHI  STOPDON           ; quit if ptrmem+10 > userpc +STOPNEXT JSR  RUNONE +         JSR  CHKABRT           ; check for abort +         BRA  STOPGO +STOPDON  JSR  OUTCRLF +         JSR  RPRINT            ; result of trace +         RTS                    ; done + + +;************************* +;* runone - This routine is used by the trace and +;* execute commands to run one only one user instruction. +;*   Control is passed to the user code via an RTI.  OC5 +;* is then used to trigger an XIRQ as soon as the first user +;* opcode is fetched.  Control then returns to the monitor +;* through XIRQIN. +;*  Externally, the OC5 pin must be wired to the XIRQ pin. +;************************ +;* Disable oc5 interrupts +;* Put monitor XIRQ vector into jump table +;* Unmask x bit in user ccr +;* Setup OC5 to go low when first user instruction executed +RUNONE  EQU  * +        LDAA #$7E               ; put "jmp xirqin" in jump table +        STAA JTOC5 +        LDX  #XIRQIN +        STX  JXIRQ+1 +        LDAA REGS+8             ; x bit will be cleared when +        ANDA #$BF               ; rti is executed below +        STAA REGS+8 +        LDAB #87                ; cycles to end of rti +        LDX  TCNT +        ABX                     ;                     3~ \ +        STX  TOC5               ; oc5 match register         5~  \ +        LDAA TCTL1              ;                     4~   \ +        ANDA #$FE               ; set up oc5 low on match 2~    \ +        STAA TCTL1              ; enable oc5 interrupt       4~    / 86~ + +;** RESTACK - Restore user stack and RTI to user code. +;* This code is the pathway to execution of user code. +;*(Force extended addressing to maintain cycle count) +;*Restore user stack and rti to user code +RESTACK EQU  *                  ;                     68~ +        STS  >PTR2              ; save monitor sp +        LDS  >SP                ; user stack pointer +        LDX  >REGS +        PSHX                    ; pc +        LDX  >REGS+2 +        PSHX                    ; y +        LDX  >REGS+4 +        PSHX                    ; x +        LDD  >REGS+6 +        PSHA                    ; a +        PSHB                    ; b +        LDAA >REGS+8 +        PSHA                    ; ccr +        RTI + +;** Return here from run one line of user code. +XIRQIN  EQU  * +        TSX                     ; user sp -> x +        LDS  PTR2               ; restore monitor sp + +;** SAVSTACK - Save user's registers. +;* On entry - x points to top of user stack. +SAVSTACK EQU * +        LDAA 0,X +        STAA REGS+8             ; user ccr +        LDD  1,X +        STAA REGS+7             ; b +        STAB REGS+6             ; a +        LDD  3,X +        STD  REGS+4             ; x +        LDD  5,X +        STD  REGS+2             ; y +        LDD  7,X +        STD  REGS               ; pc +        LDAB #8 +        ABX +        STX  SP                 ; user stack pointer +        LDAA TCTL1              ; force oc5 pin high which +        ORAA #$03               ; is tied to xirq line +        STAA TCTL1 +        LDAA #$08 +        STAA CFORC +        RTS + + +;********** +;*   help  -  List buffalo commands to terminal. +;********** +HELP     EQU  * +         LDX  #HELPMSG1 +         JSR  OUTSTRG           ; print help screen +         RTS + +HELPMSG1 EQU  * +         FCC  "ASM [<addr>]  Line assembler/disassembler." +         FCB  $0D +         FCC  "    /        Do same address.           ^        Do previous address." +         FCB  $0D +         FCC  "    CTRL-J   Do next address.           RETURN   Do next opcode." +         FCB  $0D +         FCC  "    CTRL-A   Quit." +         FCB  $0D +         FCC  "BF <addr1> <addr2> [<data>]  Block fill." +         FCB  $0D +         FCC  "BR [-][<addr>]  Set up breakpoint table." +         FCB  $0D +         FCC  "BULK  Erase the EEPROM.                   BULKALL  Erase EEPROM and CONFIG." +         FCB  $0D +         FCC  "CALL [<addr>]  Call user subroutine.      G [<addr>]  Execute user code." +         FCB  $0D +         FCC  "LOAD, VERIFY [T] <host download command>  Load or verify S-records." +         FCB  $0D +         FCC  "MD [<addr1> [<addr2>]]  Memory dump." +         FCB  $0D +         FCC  "MM [<addr>]  Memory modify." +         FCB  $0D +         FCC  "    /        Open same address.         CTRL-H or ^   Open previous address." +         FCB  $0D +         FCC  "    CTRL-J   Open next address.         SPACE         Open next address." +         FCB  $0D +         FCC  "    RETURN   Quit.                      <addr>O       Compute offset to <addr>." +         FCB  $0D +         FCC  "MOVE <s1> <s2> [<d>]  Block move." +         FCB  $0D +         FCC  "P  Proceed/continue execution." +         FCB  $0D +         FCC  "RM [P, Y, X, A, B, C, or S]  Register modify." +         FCB  $0D +         FCC  "T [<n>]  Trace n instructions." +         FCB  $0D +         FCC  "TM  Transparent mode (CTRL-A = exit, CTRL-B = send break)." +         FCB  $0D +         FCC  "CTRL-H  Backspace.                      CTRL-W  Wait for any key." +         FCB  $0D +         FCC  "CTRL-X or DELETE  Abort/cancel command." +         FCB  $0D +         FCC  "RETURN  Repeat last command." +         FCB  4 + +;********** +;*   HOST() - Establishes transparent link between +;*        terminal and host.  Port used for host is +;*        determined in the reset initialization routine +;*        and stored in HOSTDEV. +;*           To exit type control A. +;*           To send break to host type control B. +;*if(no external device) return; +;*initialize host port; +;*While( !(control A)) +;*     input(terminal); output(host); +;*     input(host); output(terminal); + +HOST      LDAA EXTDEV +          BNE  HOST0            ; jump if host port avail. +          LDX  #MSG10           ; "no host port avail" +          JSR  OUTSTRG +          RTS +HOST0     CLR  AUTOLF           ; turn off autolf +          JSR  HOSTCO           ; connect sci (evb board) +          JSR  HOSTINIT         ; initialize host port +HOST1     JSR  INPUT            ; read terminal +          TSTA +          BEQ  HOST3            ; jump if no char +          CMPA #CTLA +          BEQ  HOSTEND          ; jump if control a +          CMPA #CTLB +          BNE  HOST2            ; jump if not control b +          JSR  TXBREAK          ; send break to host +          BRA  HOST3 +HOST2     JSR  HOSTOUT          ; echo to host +HOST3     JSR  HOSTIN           ; read host +          TSTA +          BEQ  HOST1            ; jump if no char +          JSR  OUTPUT           ; echo to terminal +          BRA  HOST1 +HOSTEND   INC  AUTOLF           ; turn on autolf +          JSR  TARGCO           ; disconnect sci (evb board) +          RTS                   ; return + +;********** +;* txbreak() - transmit break to host port. +;* The duration of the transmitted break is +;* approximately 200,000 E-clock cycles, or +;* 100ms at 2.0 MHz. +;*********** +TXBREAK   EQU  * +          LDAA HOSTDEV +          CMPA #$03 +          BEQ  TXBDU            ; jump if duartb is host + +TXBSCI    LDX  #SCCR2           ; sci is host +          BSET 0,X,#01          ; set send break bit +          BSR  TXBWAIT +          BCLR 0,X,#01          ; clear send break bit +          BRA TXB1 + +TXBDU     LDX  #PORTB           ; duart host port +          LDAA #$60             ; start break cmd +          STAA 2,X              ; port b command register +          BSR  TXBWAIT +          LDAA #$70             ; stop break cmd +          STAA 2,X              ; port b command register + +TXB1      LDAA #$0D +          JSR  HOSTOUT          ; send carriage return +          LDAA #$0A +          JSR  HOSTOUT          ; send linefeed +          RTS + +TXBWAIT   LDY  #$6F9B           ; loop count = 28571 +TXBWAIT1  DEY                   ; 7 cycle loop +          BNE  TXBWAIT1 +          RTS + + +;********** +;*   hostinit(), hostin(), hostout() - host i/o +;*routines.  Restores original terminal device. +;********** +HOSTINIT  LDAB IODEV            ; save terminal +          PSHB +          LDAB HOSTDEV +          STAB IODEV            ; point to host +          JSR  INIT             ; initialize host +          BRA  TERMRES          ; restore terminal +HOSTIN    LDAB IODEV            ; save terminal +          PSHB +          LDAB HOSTDEV +          STAB IODEV            ; point to host +          JSR  INPUT            ; read host +          BRA  TERMRES          ; restore terminal +HOSTOUT   LDAB IODEV            ; save terminal +          PSHB +          LDAB HOSTDEV +          STAB IODEV            ; point to host +          JSR  OUTPUT           ; write to host +TERMRES   PULB                  ; restore terminal device +          STAB IODEV +          RTS + + +;********** +;*   load(ptrbuff[]) - Load s1/s9 records from +;*host to memory.  Ptrbuff[] points to string in +;*input buffer which is a command to output s1/s9 +;*records from the host ("cat filename" for unix). +;*    Returns error and address if it can't write +;*to a particular location. +;********** +;*   verify(ptrbuff[]) - Verify memory from load +;*command.  Ptrbuff[] is same as for load. +;* tmp3 is used as an error indication, 0=no errors, +;* 1=receiver, 2=rom error, 3=checksum error. +;********** +VERIFY    CLR  TMP2 +          INC  TMP2             ; TMP2=1=verify +          BRA  LOAD1 +LOAD      CLR  TMP2             ; 0=load + +;*a=wskip(); +;*if(a = cr) goto transparent mode; +;*if(t option) hostdev = iodev; +LOAD1      CLR  TMP3            ; clear error flag +          JSR  WSKIP +          BNE  LOAD2 +          JMP  HOST             ; go to host if no args +LOAD2     JSR  UPCASE +          CMPA #'T'             ; look for t option +          BNE  LOAD3            ; jump not t option +          JSR  INCBUFF +          JSR  READBUFF         ; get next character +          JSR  DECBUFF +          CMPA #$0D +          BNE  LOAD3            ; jump if not t option +          CLR  AUTOLF +          LDAA IODEV +          STAA HOSTDEV          ; set host port = terminal +          BRA  LOAD10           ; go wait for s1 records + +;*else while(not cr) +;*     read character from input buffer; +;*     send character to host; +LOAD3     CLR  AUTOLF +          JSR  HOSTCO           ; connect sci (evb board) +          JSR  HOSTINIT         ; initialize host port +LOAD4     JSR  READBUFF         ; get next char +          JSR  INCBUFF +          PSHA                  ; save char +          JSR  HOSTOUT          ; output to host +          JSR  OUTPUT           ; echo to terminal +          PULA +          CMPA #$0D +          BNE  LOAD4            ; jump if not cr + +;*repeat:                      /* look for s records */ +;*      if(hostdev != iodev) check abort; +;*      a = hostin(); +;*      if(a = 'S') +;*           a = hostin; +;*           if(a = '1') +;*               checksum = 0; +;*               get byte count in b; +;*               get base address in x; +;*               while(byte count > 0) +;*                    byte(); +;*                    x++; b--; +;*                    if(tmp3=0)              /* no error */ +;*                        if(load) x[0] = shftreg+1; +;*                        if(x[0] != shftreg+1) +;*                             tmp3 = 2;      /* rom error */ +;*                             ptr3 = x;      /* save address */ +;*               if(tmp3 = 0) do checksum; +;*               if(checksum err) tmp3 = 3; /* checksum error */ +LOAD10    EQU  * +          LDAA HOSTDEV +          CMPA IODEV +          BEQ  LOAD11           ; jump if hostdev=iodev +          JSR  CHKABRT          ; check for abort +LOAD11    JSR  HOSTIN           ; read host +          TSTA +          BEQ  LOAD10           ; jump if no input +          CMPA #'S' +          BNE  LOAD10           ; jump if not S +LOAD12    JSR  HOSTIN           ; read host +          TSTA +          BEQ  LOAD12           ; jump if no input +          CMPA #'9' +          BEQ  LOAD90           ; jump if S9 record +          CMPA #'1' +          BNE  LOAD10           ; jump if not S1 +          CLR  TMP4             ; clear checksum +          JSR  BYTE +          LDAB SHFTREG+1 +          SUBB #$2              ; b = byte count +          JSR  BYTE +          JSR  BYTE +          LDX  SHFTREG          ; x = base address +          DEX +LOAD20    JSR  BYTE             ; get next byte +          INX +          DECB                  ; check byte count +          BEQ  LOAD30           ; if b=0, go do checksum +          TST  TMP3 +          BNE  LOAD10           ; jump if error flagged +          TST  TMP2 +          BNE  LOAD21           ; jump if verify +          LDAA SHFTREG+1 +          JSR  WRITE            ; load only +LOAD21    CMPA 0,X              ; verify ram location +          BEQ  LOAD20           ; jump if ram ok +          LDAA #$02 +          STAA TMP3             ; indicate rom error +          STX  PTR3             ; save error address +          BRA  LOAD20           ; finish download + +;* calculate checksum +LOAD30    TST  TMP3 +          BNE  LOAD10           ; jump if error already +          LDAA TMP4 +          INCA                  ; do checksum +          BEQ  LOAD10           ; jump if s1 record okay +          LDAA #$03 +          STAA TMP3             ; indicate checksum error +          BRA  LOAD10 + +;*           if(a = '9') +;*               read rest of record; +;*               if(tmp3=2) return("[ptr3]"); +;*               if(tmp3=1) return("rcv error"); +;*               if(tmp3=3) return("checksum err"); +;*               else return("done"); +LOAD90    JSR  BYTE +          LDAB SHFTREG+1        ; b = byte count +LOAD91    JSR  BYTE +          DECB +          BNE  LOAD91           ; loop until end of record +          INC  AUTOLF           ; turn on autolf +          JSR  TARGCO           ; disconnect sci (evb) +          LDX  #MSG11           ; "done" default msg +          LDAA TMP3 +          CMPA #$02 +          BNE  LOAD92           ; jump not rom error +          LDX  #PTR3 +          JSR  OUT2BSP          ; address of rom error +          BRA  LOAD95 +LOAD92    CMPA #$01 +          BNE  LOAD93           ; jump not rcv error +          LDX  #MSG14           ; "rcv error" +          BRA  LOAD94 +LOAD93    CMPA #$03 +          BNE  LOAD94           ; jump not checksum error +          LDX  #MSG12           ; "checksum error" +LOAD94    JSR  OUTSTRG +LOAD95    RTS + + +;********** +;*  byte() -  Read 2 ascii bytes from host and +;*convert to one hex byte.  Returns byte +;*shifted into shftreg and added to tmp4. +;********** +BYTE      PSHB +          PSHX +BYTE0     JSR  HOSTIN           ; read host (1st byte) +          TSTA +          BEQ  BYTE0            ; loop until input +          JSR  HEXBIN +BYTE1     JSR  HOSTIN           ; read host (2nd byte) +          TSTA +          BEQ  BYTE1            ; loop until input +          JSR  HEXBIN +          LDAA SHFTREG+1 +          ADDA TMP4 +          STAA TMP4             ; add to checksum +          PULX +          PULB +          RTS + + +;******************************************* +;*   MEMORY [<addr>] +;*   [<addr>]/ +;* Opens memory and allows user to modify the +;*contents at <addr> or the last opened location. +;*    Subcommands: +;* [<data>]<cr> - Close current location and exit. +;* [<data>]<lf> - Close current and open next. +;* [<data>]<^> - Close current and open previous. +;* [<data>]<sp> - Close current and open next. +;* [<data>]/ - Reopen current location. +;*     The contents of the current location is only +;*  changed if valid data is entered before each +;*  subcommand. +;* [<addr>]O - Compute relative offset from current +;*     location to <addr>.  The current location must +;*     be the address of the offset byte. +;********** +;*a = wskip(); +;*if(a != cr) +;*     a = buffarg(); +;*     if(a != cr) return(bad argument); +;*     if(countu1 != 0) ptrmem[] = shftreg; + +MEMORY   JSR  WSKIP +         BEQ  MEM1              ; jump if cr +         JSR  BUFFARG +         JSR  WSKIP +         BEQ  MSLASH            ; jump if cr +         LDX  #MSG9             ; "bad argument" +         JSR  OUTSTRG +         RTS +MSLASH   TST  COUNT +         BEQ  MEM1              ; jump if no argument +         LDX  SHFTREG +         STX  PTRMEM            ; update "current location" + +;********** +;* Subcommands +;********** +;*outcrlf(); +;*out2bsp(ptrmem[]); +;*out1bsp(ptrmem[0]); + +MEM1     JSR  OUTCRLF +MEM2     LDX  #PTRMEM +         JSR  OUT2BSP           ; output address +MEM3     LDX  PTRMEM +         JSR  OUT1BSP           ; output contents +         CLR  SHFTREG +         CLR  SHFTREG+1 +;*while 1 +;*a = termarg(); +;*     switch(a) +;*           case(space): +;*              chgbyt(); +;*              ptrmem[]++; +;*           case(linefeed): +;*              chgbyt(); +;*              ptrmem[]++; +;*           case(up arrow): +;*           case(backspace): +;*                 chgbyt(); +;*                 ptrmem[]--; +;*           case("/"): +;*                 chgbyt(); +;*                 outcrlf(); +;*           case(O): +;*                 d = ptrmem[0] - (shftreg); +;*                 if($80 < d < $ff81) +;*                      print(out of range); +;*                 countt1 = d-1; +;*                 out1bsp(countt1); +;*           case(carriage return): +;*                 chgbyt(); +;*                 return; +;*           default: return(command?) + +MEM4     JSR  TERMARG +         JSR  UPCASE +         LDX  PTRMEM +         CMPA #$20 +         BEQ  MEMSP             ; jump if space +         CMPA #$0A +         BEQ  MEMLF             ; jump if linefeed +         CMPA #$5E +         BEQ  MEMUA             ; jump if up arrow +         CMPA #$08 +         BEQ  MEMBS             ; jump if backspace +         CMPA #'/' +         BEQ  MEMSL             ; jump if / +         CMPA #'O' +         BEQ  MEMOFF            ; jump if O +         CMPA #$0D +         BEQ  MEMCR             ; jump if carriage ret +         LDX  #MSG8             ; "command?" +         JSR  OUTSTRG +         JMP  MEM1 +MEMSP    JSR  CHGBYT +         INX +         STX  PTRMEM +         JMP  MEM3              ; output contents +MEMLF    JSR  CHGBYT +         INX +         STX  PTRMEM +         JMP  MEM2              ; output addr, contents +MEMUA    EQU  * +MEMBS    JSR  CHGBYT +         DEX +         STX  PTRMEM +         JMP  MEM1              ; output cr, addr, contents +MEMSL    JSR  CHGBYT +         JMP  MEM1              ; output cr, addr, contents +MEMOFF   LDD  SHFTREG           ; destination addr +         SUBD PTRMEM +         CMPA #$0 +         BNE  MEMOFF1           ; jump if not 0 +         CMPB #$80 +         BLS  MEMOFF3           ; jump if in range +         BRA  MEMOFF2           ; out of range +MEMOFF1  CMPA #$FF +         BNE  MEMOFF2           ; out of range +         CMPB #$81 +         BHS  MEMOFF3           ; in range +MEMOFF2  LDX  #MSG3             ; "Too long" +         JSR  OUTSTRG +         JMP  MEM1              ; output cr, addr, contents +MEMOFF3  SUBD #$1               ; b now has offset +         STAB TMP4 +         JSR  OUTSPAC +         LDX  #TMP4 +         JSR  OUT1BSP           ; output offset +         JMP  MEM1              ; output cr, addr, contents +MEMCR    JSR  CHGBYT +         RTS                    ; exit task + + +;********** +;*   move <src1> <src2> [<dest>]  - move +;*block at <src1> to <src2> to <dest>. +;*  Moves block 1 byte up if no <dest>. +;********** +;*a = buffarg(); +;*if(countu1 = 0) return(bad argument); +;*if( !wchek(a) ) return(bad argument); +;*ptr1 = shftreg;   /* src1 */ + +MOVE     EQU  * +         JSR  BUFFARG +         TST  COUNT +         BEQ  MOVERR            ; jump if no arg +         JSR  WCHEK +         BNE  MOVERR            ; jump if no delim +         LDX  SHFTREG           ; src1 +         STX  PTR1 + +;*a = buffarg(); +;*if(countu1 = 0) return(bad argument); +;*if( !dchek(a) ) return(bad argument); +;*ptr2 = shftreg;   /* src2 */ + +         JSR  BUFFARG +         TST  COUNT +         BEQ  MOVERR            ; jump if no arg +         JSR  DCHEK +         BNE  MOVERR            ; jump if no delim +         LDX  SHFTREG           ; src2 +         STX  PTR2 + +;*a = buffarg(); +;*a = wskip(); +;*if(a != cr) return(bad argument); +;*if(countu1 != 0) tmp2 = shftreg;  /* dest */ +;*else tmp2 = ptr1 + 1; + +         JSR  BUFFARG +         JSR  WSKIP +         BNE  MOVERR            ; jump if not cr +         TST  COUNT +         BEQ  MOVE1             ; jump if no arg +         LDX  SHFTREG           ; dest +         BRA  MOVE2 +MOVERR   LDX  #MSG9             ; "bad argument" +         JSR  OUTSTRG +         RTS + +MOVE1    LDX  PTR1 +         INX                    ; default dest +MOVE2    STX  PTR3 + +;*if(src1 < dest <= src2) +;*     dest = dest+(src2-src1); +;*     for(x = src2; x = src1; x--) +;*           dest[0]-- = x[0]--; +         LDX  PTR3              ; dest +         CPX  PTR1              ; src1 +         BLS  MOVE3             ; jump if dest =< src1 +         CPX  PTR2              ; src2 +         BHI  MOVE3             ; jump if dest > src2 +         LDD  PTR2 +         SUBD PTR1 +         ADDD PTR3 +         STD  PTR3              ; dest = dest+(src2-src1) +         LDX  PTR2 +MOVELP1  JSR  CHKABRT           ; check for abort +         LDAA ,X                ; char at src2 +         PSHX +         LDX  PTR3 +         JSR  WRITE             ; write a to x +         CMPA 0,X +         BNE  MOVEBAD           ; jump if no write +         DEX +         STX  PTR3 +         PULX +         CPX  PTR1 +         BEQ  MOVRTS +         DEX +         BRA  MOVELP1           ; Loop SRC2 - SRC1 times +;* +;* else +;*     for(x=src1; x=src2; x++) +;*           dest[0]++ = x[0]++; + + +MOVE3    LDX  PTR1              ; srce1 +MOVELP2  JSR  CHKABRT           ; check for abort +         LDAA ,X +         PSHX +         LDX  PTR3              ; dest +         JSR  WRITE             ; write a to x +         CMPA 0,X +         BNE  MOVEBAD           ; jump if no write +         INX +         STX  PTR3 +         PULX +         CPX  PTR2 +         BEQ  MOVRTS +         INX +         BRA  MOVELP2           ; Loop SRC2-SRC1 times +MOVRTS   RTS + +MOVEBAD  LDX  #PTR3 +         JSR  OUT2BSP           ; output bad address +         RTS + +;********** +;*   register [<name>]  - prints the user regs +;*and opens them for modification.  <name> is +;*the first register opened (default = P). +;*   Subcommands: +;* [<nn>]<space>  Opens the next register. +;* [<nn>]<cr>       Return. +;*    The register value is only changed if +;*    <nn> is entered before the subcommand. +;********** +;*x[] = reglist +;*a = wskip(); a = upcase(a); +;*if(a != cr) +;*     while( a != x[0] ) +;*           if( x[0] = "s") return(bad argument); +;*           x[]++; +;*     incbuff(); a = wskip(); +;*     if(a != cr) return(bad argument); + +REGISTER LDX  #REGLIST +         JSR  WSKIP             ; a = first char of arg +         JSR  UPCASE            ; convert to upper case +         CMPA #$D +         BEQ  REG4              ; jump if no argument +REG1     CMPA 0,X +         BEQ  REG3 +         LDAB 0,X +         INX +         CMPB #'S' +         BNE  REG1              ; jump if not "s" +REG2     LDX  #MSG9             ; "bad argument" +         JSR  OUTSTRG +         RTS +REG3     PSHX +         JSR  INCBUFF +         JSR  WSKIP             ; next char after arg +         PULX +         BNE  REG2              ; jump if not cr + +;*rprint(); +;*     while(x[0] != "s") +;*           rprnt1(x); +;*           a = termarg();    /* read from terminal */ +;*           if( ! dchek(a) ) return(bad argument); +;*           if(countu1 != 0) +;*                 if(x[14] = 1) +;*                      regs[x[7]++ = shftreg; +;*                 regs[x[7]] = shftreg+1; +;*           if(a = cr) break; +;*return; + +REG4     JSR  RPRINT            ; print all registers +REG5     JSR  OUTCRLF +         JSR  RPRNT1            ; print reg name +         CLR  SHFTREG +         CLR  SHFTREG+1 +         JSR  TERMARG           ; read subcommand +         JSR  DCHEK +         BEQ  REG6              ; jump if delimeter +         LDX  #MSG9             ; "bad argument" +         JSR  OUTSTRG +         RTS +REG6     PSHA +         PSHX +         TST  COUNT +         BEQ  REG8              ; jump if no input +         LDAB 7,X               ; get reg offset +         LDAA 14,X              ; byte size +         LDX  #REGS             ; user registers +         ABX +         TSTA +         BEQ  REG7              ; jump if 1 byte reg +         LDAA SHFTREG +         STAA 0,X               ; put in top byte +         INX +REG7     LDAA SHFTREG+1 +         STAA 0,X               ; put in bottom byte +REG8     PULX +         PULA +         LDAB 0,X               ; CHECK FOR REGISTER S +         CMPB #'S' +         BEQ  REG9              ; jump if "s" +         INX                    ; point to next register +         CMPA #$D +         BNE  REG5              ; jump if not cr +REG9     RTS + +PAGE1    EQU  $00               ; values for page opcodes +PAGE2    EQU  $18 +PAGE3    EQU  $1A +PAGE4    EQU  $CD +IMMED    EQU  $0                ; addressing modes +INDX     EQU  $1 +INDY     EQU  $2 +LIMMED   EQU  $3                ; (long immediate) +OTHER    EQU  $4 + +;*** Rename variables for assem/disassem *** +AMODE    EQU  TMP2              ; addressing mode +YFLAG    EQU  TMP3 +PNORM    EQU  TMP4              ; page for normal opcode +OLDPC    EQU  PTR8 +PC       EQU  PTR1              ; program counter +PX       EQU  PTR2              ; page for x indexed +PY       EQU  PTR2+1            ; page for y indexed +BASEOP   EQU  PTR3              ; base opcode +CLASS    EQU  PTR3+1            ; class +DISPC    EQU  PTR4              ; pc for disassembler +BRADDR   EQU  PTR5              ; relative branch offset +MNEPTR   EQU  PTR6              ; pointer to table for dis +ASSCOMM  EQU  PTR7              ; subcommand for assembler + +;*** Error messages for assembler *** +MSGDIR   FDB  MSGA1             ; message table index +         FDB  MSGA2 +         FDB  MSGA3 +         FDB  MSGA4 +         FDB  MSGA5 +         FDB  MSGA6 +         FDB  MSGA7 +         FDB  MSGA8 +         FDB  MSGA9 +MSGA1    FCC  "Immediate mode illegal" +         FCB  EOT +MSGA2    FCC  "Error in mnemonic table" +         FCB  EOT +MSGA3    FCC  "Illegal bit op" +         FCB  EOT +MSGA4    FCC  "Bad argument" +         FCB  EOT +MSGA5    FCC  "Mnemonic not found" +         FCB  EOT +MSGA6    FCC  "Unknown addressing mode" +         FCB  EOT +MSGA7    FCC  "Indexed addressing assumed" +         FCB  EOT +MSGA8    FCC  "Syntax error" +         FCB  EOT +MSGA9    FCC  "Branch out of range" +         FCB  EOT + +;**************** +;*  assem(addr) -68HC11 line assembler/disassembler. +;*        This routine will disassemble the opcode at +;*<addr> and then allow the user to enter a line for +;*assembly. Rules for assembly are as follows: +;* -A '#' sign indicates immediate addressing. +;* -A ',' (comma) indicates indexed addressing +;*        and the next character must be X or Y. +;* -All arguments are assumed to be hex and the +;*        '$' sign shouldn't be used. +;* -Arguments should be separated by 1 or more +;*        spaces or tabs. +;* -Any input after the required number of +;*        arguments is ignored. +;* -Upper or lower case makes no difference. +;* +;*        To signify end of input line, the following +;*commands are available and have the indicated action: +;*   <cr>  -Carriage return finds the next opcode for +;*           assembly.  If there was no assembly input, +;*           the next opcode disassembled is retrieved +;*           from the disassembler. +;*   <lf>  -Linefeed works the same as carriage return +;*           except if there was no assembly input, the +;*           <addr> is incremented and the next <addr> is +;*           disassembled. +;*    '^'  -Up arrow decrements <addr> and the previous +;*           address is then disassembled. +;*    '/'  -Slash redisassembles the current address. +;* +;*        To exit the assembler use CONTROL A.  Of course +;*control X and DEL will also allow you to abort. +;********** +;*oldpc = rambase; +;*a = wskip(); +;*if (a != cr) +;*   buffarg() +;*   a = wskip(); +;*   if ( a != cr ) return(error); +;*   oldpc = a; + +ASSEM   EQU  * +        LDX  #RAMBS +        STX  OLDPC +        JSR  WSKIP +        BEQ  ASSLOOP            ; jump if no argument +        JSR  BUFFARG +        JSR  WSKIP +        BEQ  ASSEM1             ; jump if argument ok +        LDX  #MSGA4             ; "bad argument" +        JSR  OUTSTRG +        RTS +ASSEM1  LDX  SHFTREG +        STX  OLDPC + +;*repeat +;*  pc = oldpc; +;*  out2bsp(pc); +;*  disassem(); +;*  a=readln(); +;*  asscomm = a;  /* save command */ +;*  if(a == ('^' or '/')) outcrlf; +;*  if(a == 0) return(error); + +ASSLOOP LDX  OLDPC +        STX  PC +        JSR  OUTCRLF +        LDX  #PC +        JSR  OUT2BSP            ; output the address +        JSR  DISASSM            ; disassemble opcode +        JSR  TABTO +        LDAA #PROMPT            ; prompt user +        JSR  OUTA               ; output prompt character +        JSR  READLN             ; read input for assembly +        STAA ASSCOMM +        CMPA #'^' +        BEQ  ASSLP0             ; jump if up arrow +        CMPA #'/' +        BEQ  ASSLP0             ; jump if slash +        CMPA #$00 +        BNE  ASSLP1             ; jump if none of above +        RTS                     ; return if bad input +ASSLP0  JSR  OUTCRLF +ASSLP1  EQU  * +        JSR  OUTSPAC +        JSR  OUTSPAC +        JSR  OUTSPAC +        JSR  OUTSPAC +        JSR  OUTSPAC + +;*  b = parse(input); /* get mnemonic */ +;*  if(b > 5) print("not found"); asscomm='/'; +;*  elseif(b >= 1) +;*     msrch(); +;*     if(class==$FF) +;*         print("not found"); asscomm='/'; +;*     else +;*         a = doop(opcode,class); +;*         if(a == 0) dispc=0; +;*         else process error; asscomm='/'; + +        JSR  PARSE +        CMPB #$5 +        BLE  ASSLP2             ; jump if mnemonic <= 5 chars +        LDX  #MSGA5             ; "mnemonic not found" +        JSR  OUTSTRG +        BRA  ASSLP5 +ASSLP2  EQU  * +        CMPB #$0 +        BEQ  ASSLP10            ; jump if no input +        JSR  MSRCH +        LDAA CLASS +        CMPA #$FF +        BNE  ASSLP3 +        LDX  #MSGA5             ; "mnemonic not found" +        JSR  OUTSTRG +        BRA  ASSLP5 +ASSLP3  JSR  DOOP +        CMPA #$00 +        BNE  ASSLP4             ; jump if doop error +        LDX  #$00 +        STX  DISPC              ; indicate good assembly +        BRA  ASSLP10 +ASSLP4  DECA                    ; a = error message index +        TAB +        LDX  #MSGDIR +        ABX +        ABX +        LDX  0,X +        JSR  OUTSTRG            ; output error message +ASSLP5  CLR  ASSCOMM            ; error command + +;*  /* compute next address - asscomm holds subcommand +;*     and dispc indicates if valid assembly occured. */ +;*  if(asscomm=='^') oldpc -= 1; +;*  if(asscomm==(lf or cr) +;*     if(dispc==0) oldpc=pc; +;*     else +;*         if(asscomm==lf) dispc=oldpc+1; +;*         oldpc=dispc; +;*until(eot) + + +ASSLP10 EQU  * +        LDAA ASSCOMM +        CMPA #'^' +        BNE  ASSLP11            ; jump if not up arrow +        LDX  OLDPC +        DEX +        STX  OLDPC              ; back up +        BRA  ASSLP15 +ASSLP11 CMPA #$0A +        BEQ  ASSLP12            ; jump if linefeed +        CMPA #$0D +        BNE  ASSLP15            ; jump if not cr +ASSLP12 LDX  DISPC +        BNE  ASSLP13            ; jump if dispc != 0 +        LDX  PC +        STX  OLDPC +        BRA  ASSLP15 +ASSLP13 CMPA #$0A +        BNE  ASSLP14            ; jump if not linefeed +        LDX  OLDPC +        INX +        STX  DISPC +ASSLP14 LDX  DISPC +        STX  OLDPC +ASSLP15 JMP  ASSLOOP + +;**************** +;*  readln() --- Read input from terminal into buffer +;* until a command character is read (cr,lf,/,^). +;* If more chars are typed than the buffer will hold, +;* the extra characters are overwritten on the end. +;*  On exit: b=number of chars read, a=0 if quit, +;* else a=next command. +;**************** +;*for(b==0;b<=bufflng;b++) inbuff[b] = cr; + +READLN  CLRB +        LDAA #$0D               ; carriage ret +RLN0    LDX  #INBUFF +        ABX +        STAA 0,X                ; initialize input buffer +        INCB +        CMPB #BUFFLNG +        BLT  RLN0 +;*b=0; +;*repeat +;*  if(a == (ctla, cntlc, cntld, cntlx, del)) +;*     return(a=0); +;*  if(a == backspace) +;*     if(b > 0) b--; +;*     else b=0; +;*  else  inbuff[b] = upcase(a); +;*  if(b < bufflng) b++; +;*until (a == (cr,lf,^,/)) +;*return(a); + +        CLRB +RLN1    JSR  INCHAR +        CMPA #DEL               ; Delete +        BEQ  RLNQUIT +        CMPA #CTLX              ; Control X +        BEQ  RLNQUIT +        CMPA #CTLA              ; Control A +        BEQ  RLNQUIT +        CMPA #$03               ; Control C +        BEQ  RLNQUIT +        CMPA #$04               ; Control D +        BEQ  RLNQUIT +        CMPA #$08               ; backspace +        BNE  RLN2 +        DECB +        BGT  RLN1 +        BRA  READLN             ; start over +RLN2    LDX  #INBUFF +        ABX +        JSR  UPCASE +        STAA 0,X                ; put char in buffer +        CMPB #BUFFLNG           ; max buffer length +        BGE  RLN3               ; jump if buffer full +        INCB                    ; move buffer pointer +RLN3    JSR  ASSCHEK            ; check for subcommand +        BNE  RLN1 +        RTS +RLNQUIT CLRA                    ; quit +        RTS                     ; return + + +;********** +;*  parse() -parse out the mnemonic from INBUFF +;* to COMBUFF. on exit: b=number of chars parsed. +;********** +;*combuff[3] = <space>;      initialize 4th character to space. +;*ptrbuff[] = inbuff[]; +;*a=wskip(); +;*for (b = 0; b = 5; b++) +;*   a=readbuff(); incbuff(); +;*   if (a = (cr,lf,^,/,wspace)) return(b); +;*   combuff[b] = upcase(a); +;*return(b); + +PARSE   LDAA #$20 +        STAA COMBUFF+3 +        LDX  #INBUFF            ; initialize buffer ptr +        STX  PTR0 +        JSR  WSKIP              ; find first character +        CLRB +PARSLP  JSR  READBUFF           ; read character +        JSR  INCBUFF +        JSR  WCHEK +        BEQ  PARSRT             ; jump if whitespace +        JSR  ASSCHEK +        BEQ  PARSRT             ; jump if end of line +        JSR  UPCASE             ; convert to upper case +        LDX  #COMBUFF +        ABX +        STAA 0,X                ; store in combuff +        INCB +        CMPB #$5 +        BLE  PARSLP             ; loop 6 times +PARSRT  RTS + + +;**************** +;*  asschek() -perform compares for +;* cr, lf, ^, / +;**************** +ASSCHEK CMPA #$0A               ; linefeed +        BEQ  ASSCHK1 +        CMPA #$0D               ; carriage ret +        BEQ  ASSCHK1 +        CMPA #'^'               ; up arrow +        BEQ  ASSCHK1 +        CMPA #'/'               ; slash +ASSCHK1 RTS + + +;********* +;*  msrch() --- Search MNETABL for mnemonic in COMBUFF. +;*stores base opcode at baseop and class at class. +;*  Class = FF if not found. +;********** +;*while ( != EOF ) +;*   if (COMBUFF[0-3] = MNETABL[0-3]) +;*      return(MNETABL[4],MNETABL[5]); +;*   else *MNETABL =+ 6 + +MSRCH   LDX  #MNETABL           ; pointer to mnemonic table +        LDY  #COMBUFF           ; pointer to string +        BRA  MSRCH1 +MSNEXT  EQU  * +        LDAB #6 +        ABX                     ; point to next table entry +MSRCH1  LDAA 0,X                ; read table +        CMPA #EOT +        BNE  MSRCH2             ; jump if not end of table +        LDAA #$FF +        STAA CLASS              ; FF = not in table +        RTS +MSRCH2  CMPA 0,Y                ; op[0] = tabl[0] ? +        BNE  MSNEXT +        LDAA 1,X +        CMPA 1,Y                ; op[1] = tabl[1] ? +        BNE  MSNEXT +        LDAA 2,X +        CMPA 2,Y                ; op[2] = tabl[2] ? +        BNE  MSNEXT +        LDAA 3,X +        CMPA 3,Y                ; op[2] = tabl[2] ? +        BNE  MSNEXT +        LDD  4,X                ; opcode, class +        STAA BASEOP +        STAB CLASS +        RTS + +;********** +;**   doop(baseop,class) --- process mnemonic. +;**   on exit: a=error code corresponding to error +;**                                         messages. +;********** +;*amode = OTHER; /* addressing mode */ +;*yflag = 0;       /* ynoimm, nlimm, and cpd flag */ +;*x[] = ptrbuff[] + +DOOP    EQU  * +        LDAA #OTHER +        STAA AMODE              ; mode +        CLR  YFLAG +        LDX  PTR0 + +;*while (*x != end of buffer) +;*   if (x[0]++ == ',') +;*      if (x[0] == 'y') amode = INDY; +;*      else amod = INDX; +;*      break; +;*a = wskip() +;*if( a == '#' ) amode = IMMED; + +DOPLP1  CPX  #ENDBUFF           ; (end of buffer) +        BEQ  DOOP1              ; jump if end of buffer +        LDD  0,X                ; read 2 chars from buffer +        INX                     ; move pointer +        CMPA #',' +        BNE  DOPLP1 +        CMPB #'Y'               ; look for ",y" +        BNE  DOPLP2 +        LDAA #INDY +        STAA AMODE +        BRA  DOOP1 +DOPLP2  CMPB #'X'               ; look for ",x" +        BNE  DOOP1              ; jump if not x +        LDAA #INDX +        STAA AMODE +        BRA  DOOP1 +DOOP1   JSR  WSKIP +        CMPA #'#'               ; look for immediate mode +        BNE  DOOP2 +        JSR  INCBUFF            ; point at argument +        LDAA #IMMED +        STAA AMODE +DOOP2   EQU  * + +;*switch(class) +        LDAB CLASS +        CMPB #P2INH +        BNE  DOSW1 +        JMP  DOP2I +DOSW1   CMPB #INH +        BNE  DOSW2 +        JMP  DOINH +DOSW2   CMPB #REL +        BNE  DOSW3 +        JMP  DOREL +DOSW3   CMPB #LIMM +        BNE  DOSW4 +        JMP  DOLIM +DOSW4   CMPB #NIMM +        BNE  DOSW5 +        JMP  DONOI +DOSW5   CMPB #GEN +        BNE  DOSW6 +        JMP  DOGENE +DOSW6   CMPB #GRP2 +        BNE  DOSW7 +        JMP  DOGRP +DOSW7   CMPB #CPD +        BNE  DOSW8 +        JMP  DOCPD +DOSW8   CMPB #XNIMM +        BNE  DOSW9 +        JMP  DOXNOI +DOSW9   CMPB #XLIMM +        BNE  DOSW10 +        JMP  DOXLI +DOSW10  CMPB #YNIMM +        BNE  DOSW11 +        JMP  DOYNOI +DOSW11  CMPB #YLIMM +        BNE  DOSW12 +        JMP  DOYLI +DOSW12  CMPB #BTB +        BNE  DOSW13 +        JMP  DOBTB +DOSW13  CMPB #SETCLR +        BNE  DODEF +        JMP  DOSET + +;*   default: return("error in mnemonic table"); + +DODEF   LDAA #$2 +        RTS + +;*  case P2INH: emit(PAGE2) + +DOP2I   LDAA #PAGE2 +        JSR  EMIT + +;*  case INH: emit(baseop); +;*        return(0); + +DOINH   LDAA BASEOP +        JSR  EMIT +        CLRA +        RTS + +;*  case REL: a = assarg(); +;*             if(a=4) return(a); +;*             d = address - pc + 2; +;*             if ($7f >= d >= $ff82) +;*                 return (out of range); +;*             emit(opcode); +;*             emit(offset); +;*             return(0); + +DOREL   JSR  ASSARG +        CMPA #$04 +        BNE  DOREL1             ; jump if arg ok +        RTS +DOREL1  LDD  SHFTREG            ; get branch address +        LDX  PC                 ; get program counter +        INX +        INX                     ; point to end of opcode +        STX  BRADDR +        SUBD BRADDR             ; calculate offset +        STD  BRADDR             ; save result +        CPD #$7F                ; in range ? +        BLS  DOREL2             ; jump if in range +        CPD #$FF80 +        BHS  DOREL2             ; jump if in range +        LDAA #$09               ; 'Out of range' +        RTS +DOREL2  LDAA BASEOP +        JSR  EMIT               ; emit opcode +        LDAA BRADDR+1 +        JSR  EMIT               ; emit offset +        CLRA                    ; normal return +        RTS + +;*  case LIMM: if (amode == IMMED) amode = LIMMED; + +DOLIM   LDAA AMODE +        CMPA #IMMED +        BNE  DONOI +        LDAA #LIMMED +        STAA AMODE + +;*  case NIMM: if (amode == IMMED) +;*                  return("Immediate mode illegal"); + +DONOI   LDAA AMODE +        CMPA #IMMED +        BNE  DOGENE             ; jump if not immediate +        LDAA #$1                ; "immediate mode illegal" +        RTS + +;*  case GEN: dogen(baseop,amode,PAGE1,PAGE1,PAGE2); +;*             return; + +DOGENE  LDAA #PAGE1 +        STAA PNORM +        STAA PX +        LDAA #PAGE2 +        STAA PY +        JSR  DOGEN +        RTS + +;*  case GRP2: if (amode == INDY) +;*                  emit(PAGE2); +;*                  amode = INDX; +;*              if( amode == INDX ) +;*                  doindx(baseop); +;*              else a = assarg(); +;*                  if(a=4) return(a); +;*                  emit(opcode+0x10); +;*                  emit(extended address); +;*              return; + +DOGRP   LDAA AMODE +        CMPA #INDY +        BNE  DOGRP1 +        LDAA #PAGE2 +        JSR  EMIT +        LDAA #INDX +        STAA AMODE +DOGRP1  EQU  * +        LDAA AMODE +        CMPA #INDX +        BNE  DOGRP2 +        JSR  DOINDEX +        RTS +DOGRP2  EQU  * +        LDAA BASEOP +        ADDA #$10 +        JSR  EMIT +        JSR  ASSARG +        CMPA #$04 +        BEQ  DOGRPRT            ; jump if bad arg +        LDD  SHFTREG            ; extended address +        JSR  EMIT +        TBA +        JSR  EMIT +        CLRA +DOGRPRT RTS + +;*  case CPD: if (amode == IMMED) +;*                 amode = LIMMED; /* cpd */ +;*             if( amode == INDY ) yflag = 1; +;*             dogen(baseop,amode,PAGE3,PAGE3,PAGE4); +;*             return; + +DOCPD   LDAA AMODE +        CMPA #IMMED +        BNE  DOCPD1 +        LDAA #LIMMED +        STAA AMODE +DOCPD1  LDAA AMODE +        CMPA #INDY +        BNE  DOCPD2 +        INC  YFLAG +DOCPD2  LDAA #PAGE3 +        STAA PNORM +        STAA PX +        LDAA #PAGE4 +        STAA PY +        JSR  DOGEN +        RTS + +;*  case XNIMM: if (amode == IMMED)  /* stx */ +;*                   return("Immediate mode illegal"); + +DOXNOI  LDAA AMODE +        CMPA #IMMED +        BNE  DOXLI +        LDAA #$1               ; "immediate mode illegal" +        RTS + +;*  case XLIMM: if (amode == IMMED)  /* cpx, ldx */ +;*                   amode = LIMMED; +;*               dogen(baseop,amode,PAGE1,PAGE1,PAGE4); +;*               return; + +DOXLI   LDAA AMODE +        CMPA #IMMED +        BNE  DOXLI1 +        LDAA #LIMMED +        STAA AMODE +DOXLI1  LDAA #PAGE1 +        STAA PNORM +        STAA PX +        LDAA #PAGE4 +        STAA PY +        JSR  DOGEN +        RTS + +;*  case YNIMM: if (amode == IMMED)  /* sty */ +;*                   return("Immediate mode illegal"); + +DOYNOI  LDAA AMODE +        CMPA #IMMED +        BNE  DOYLI +        LDAA #$1                ; "immediate mode illegal" +        RTS + +;*  case YLIMM: if (amode == INDY) yflag = 1;/* cpy, ldy */ +;*               if(amode == IMMED) amode = LIMMED; +;*               dogen(opcode,amode,PAGE2,PAGE3,PAGE2); +;*               return; + +DOYLI   LDAA AMODE +        CMPA #INDY +        BNE  DOYLI1 +        INC  YFLAG +DOYLI1  CMPA #IMMED +        BNE  DOYLI2 +        LDAA #LIMMED +        STAA AMODE +DOYLI2  LDAA #PAGE2 +        STAA PNORM +        STAA PY +        LDAA #PAGE3 +        STAA PX +        JSR  DOGEN +        RTS + +;*  case BTB:          /* bset, bclr */ +;*  case SETCLR: a = bitop(baseop,amode,class); +;*                 if(a=0) return(a = 3); +;*                 if( amode == INDY ) +;*                    emit(PAGE2); +;*                    amode = INDX; + +DOBTB   EQU  * +DOSET   JSR  BITOP +        CMPA #$00 +        BNE  DOSET1 +        LDAA #$3                ; "illegal bit op" +        RTS +DOSET1  LDAA AMODE +        CMPA #INDY +        BNE  DOSET2 +        LDAA #PAGE2 +        JSR  EMIT +        LDAA #INDX +        STAA AMODE +DOSET2  EQU  * + +;*                 emit(baseop); +;*                 a = assarg(); +;*                 if(a = 4) return(a); +;*                 emit(index offset); +;*                 if( amode == INDX ) +;*                    Buffptr += 2;      /* skip ,x or ,y */ + +        LDAA BASEOP +        JSR  EMIT +        JSR  ASSARG +        CMPA #$04 +        BNE  DOSET22            ; jump if arg ok +        RTS +DOSET22 LDAA SHFTREG+1          ; index offset +        JSR  EMIT +        LDAA AMODE +        CMPA #INDX +        BNE  DOSET3 +        JSR  INCBUFF +        JSR  INCBUFF +DOSET3  EQU  * + +;*                 a = assarg(); +;*                 if(a = 4) return(a); +;*                 emit(mask);   /* mask */ +;*                 if( class == SETCLR ) +;*                    return; + +        JSR  ASSARG +        CMPA #$04 +        BNE  DOSET33            ; jump if arg ok +        RTS +DOSET33 LDAA SHFTREG+1          ; mask +        JSR  EMIT +        LDAA CLASS +        CMPA #SETCLR +        BNE  DOSET4 +        CLRA +        RTS +DOSET4  EQU  * + +;*                 a = assarg(); +;*                 if(a = 4) return(a); +;*                 d = (pc+1) - shftreg; +;*                 if ($7f >= d >= $ff82) +;*                    return (out of range); +;*                 emit(branch offset); +;*                 return(0); + +        JSR  ASSARG +        CMPA #$04 +        BNE  DOSET5             ; jump if arg ok +        RTS +DOSET5  LDX  PC                 ; program counter +        INX                     ; point to next inst +        STX  BRADDR             ; save pc value +        LDD  SHFTREG            ; get branch address +        SUBD BRADDR             ; calculate offset +        CPD #$7F +        BLS  DOSET6             ; jump if in range +        CPD #$FF80 +        BHS  DOSET6             ; jump if in range +        CLRA +        JSR  EMIT +        LDAA #$09               ; 'out of range' +        RTS +DOSET6  TBA                     ; offset +        JSR  EMIT +        CLRA +        RTS + + +;********** +;**   bitop(baseop,amode,class) --- adjust opcode on bit +;**        manipulation instructions.  Returns opcode in a +;**        or a = 0 if error +;********** +;*if( amode == INDX || amode == INDY ) return(op); +;*if( class == SETCLR ) return(op-8); +;*else if(class==BTB) return(op-12); +;*else fatal("bitop"); + +BITOP   EQU  * +        LDAA AMODE +        LDAB CLASS +        CMPA #INDX +        BNE  BITOP1 +        RTS +BITOP1  CMPA #INDY +        BNE  BITOP2             ; jump not indexed +        RTS +BITOP2  CMPB #SETCLR +        BNE  BITOP3             ; jump not bset,bclr +        LDAA BASEOP             ; get opcode +        SUBA #8 +        STAA BASEOP +        RTS +BITOP3  CMPB #BTB +        BNE  BITOP4             ; jump not bit branch +        LDAA BASEOP             ; get opcode +        SUBA #12 +        STAA BASEOP +        RTS +BITOP4  CLRA                    ; 0 = fatal bitop +        RTS + +;********** +;**   dogen(baseop,mode,pnorm,px,py) - process +;** general addressing modes. Returns a = error #. +;********** +;*pnorm = page for normal addressing modes: IMM,DIR,EXT +;*px = page for INDX addressing +;*py = page for INDY addressing +;*switch(amode) +DOGEN   LDAA AMODE +        CMPA #LIMMED +        BEQ  DOGLIM +        CMPA #IMMED +        BEQ  DOGIMM +        CMPA #INDY +        BEQ  DOGINDY +        CMPA #INDX +        BEQ  DOGINDX +        CMPA #OTHER +        BEQ  DOGOTH + +;*default: error("Unknown Addressing Mode"); + +DOGDEF  LDAA #$06               ; unknown addre... +        RTS + +;*case LIMMED: epage(pnorm); +;*              emit(baseop); +;*              a = assarg(); +;*              if(a = 4) return(a); +;*              emit(2 bytes); +;*              return(0); + +DOGLIM  LDAA PNORM +        JSR  EPAGE +DOGLIM1 LDAA BASEOP +        JSR  EMIT +        JSR  ASSARG             ; get next argument +        CMPA #$04 +        BNE  DOGLIM2            ; jump if arg ok +        RTS +DOGLIM2 LDD  SHFTREG +        JSR  EMIT +        TBA +        JSR  EMIT +        CLRA +        RTS + +;*case IMMED: epage(pnorm); +;*             emit(baseop); +;*             a = assarg(); +;*             if(a = 4) return(a); +;*             emit(lobyte); +;*             return(0); + +DOGIMM  LDAA PNORM +        JSR  EPAGE +        LDAA BASEOP +        JSR  EMIT +        JSR  ASSARG +        CMPA #$04 +        BNE  DOGIMM1            ; jump if arg ok +        RTS +DOGIMM1 LDAA SHFTREG+1 +        JSR  EMIT +        CLRA +        RTS + +;*case INDY: epage(py); +;*            a=doindex(op+0x20); +;*            return(a); + +DOGINDY LDAA PY +        JSR  EPAGE +        LDAA BASEOP +        ADDA #$20 +        STAA BASEOP +        JSR  DOINDEX +        RTS + +;*case INDX: epage(px); +;*            a=doindex(op+0x20); +;*            return(a); + +DOGINDX LDAA PX +        JSR  EPAGE +        LDAA BASEOP +        ADDA #$20 +        STAA BASEOP +        JSR  DOINDEX +        RTS + +;*case OTHER: a = assarg(); +;*             if(a = 4) return(a); +;*             epage(pnorm); +;*             if(countu1 <= 2 digits)   /* direct */ +;*                 emit(op+0x10); +;*                 emit(lobyte(Result)); +;*                 return(0); +;*             else    emit(op+0x30);    /* extended */ +;*                 eword(Result); +;*                 return(0) + +DOGOTH  JSR  ASSARG +        CMPA #$04 +        BNE  DOGOTH0            ; jump if arg ok +        RTS +DOGOTH0 LDAA PNORM +        JSR  EPAGE +        LDAA COUNT +        CMPA #$2 +        BGT  DOGOTH1 +        LDAA BASEOP +        ADDA #$10               ; direct mode opcode +        JSR  EMIT +        LDAA SHFTREG+1 +        JSR  EMIT +        CLRA +        RTS +DOGOTH1 LDAA BASEOP +        ADDA #$30               ; extended mode opcode +        JSR  EMIT +        LDD  SHFTREG +        JSR  EMIT +        TBA +        JSR  EMIT +        CLRA +        RTS + +;********** +;**  doindex(op) --- handle all wierd stuff for +;**   indexed addressing. Returns a = error number. +;********** +;*emit(baseop); +;*a=assarg(); +;*if(a = 4) return(a); +;*if( a != ',' ) return("Syntax"); +;*buffptr++ +;*a=readbuff() +;*if( a != 'x' &&  != 'y') warn("Ind Addr Assumed"); +;*emit(lobyte); +;*return(0); + +DOINDEX LDAA BASEOP +        JSR  EMIT +        JSR  ASSARG +        CMPA #$04 +        BNE  DOINDX0            ; jump if arg ok +        RTS +DOINDX0 CMPA #',' +        BEQ  DOINDX1 +        LDAA #$08               ; "syntax error" +        RTS +DOINDX1 JSR  INCBUFF +        JSR  READBUFF +        CMPA #'Y' +        BEQ  DOINDX2 +        CMPA #'X' +        BEQ  DOINDX2 +        LDX  MSGA7              ; "index addr assumed" +        JSR  OUTSTRG +DOINDX2 LDAA SHFTREG+1 +        JSR  EMIT +        CLRA +        RTS + +;********** +;**   assarg(); - get argument.      Returns a = 4 if bad +;** argument, else a = first non hex char. +;********** +;*a = buffarg() +;*if(asschk(aa) && countu1 != 0) return(a); +;*return(bad argument); + +ASSARG  JSR  BUFFARG +        JSR  ASSCHEK            ; check for command +        BEQ  ASSARG1            ; jump if ok +        JSR  WCHEK              ; check for whitespace +        BNE  ASSARG2            ; jump if not ok +ASSARG1 TST  COUNT +        BEQ  ASSARG2            ; jump if no argument +        RTS +ASSARG2 LDAA #$04               ; bad argument +        RTS + +;********** +;**  epage(a) --- emit page prebyte +;********** +;*if( a != PAGE1 ) emit(a); + +EPAGE   CMPA #PAGE1 +        BEQ  EPAGRT             ; jump if page 1 +        JSR  EMIT +EPAGRT  RTS + +;********** +;*   emit(a) --- emit contents of a +;********** +EMIT    LDX  PC +        JSR  WRITE              ; write a to x +        JSR  OUT1BSP +        STX  PC +        RTS + +;*Mnemonic table for hc11 line assembler +NULL     EQU  $0                ; nothing +INH      EQU  $1                ; inherent +P2INH    EQU  $2                ; page 2 inherent +GEN      EQU  $3                ; general addressing +GRP2     EQU  $4                ; group 2 +REL      EQU  $5                ; relative +IMM      EQU  $6                ; immediate +NIMM     EQU  $7                ; general except for immediate +LIMM     EQU  $8                ; 2 byte immediate +XLIMM    EQU  $9                ; longimm for x +XNIMM    EQU  $10               ; no immediate for x +YLIMM    EQU  $11               ; longimm for y +YNIMM    EQU  $12               ; no immediate for y +BTB      EQU  $13               ; bit test and branch +SETCLR   EQU  $14               ; bit set or clear +CPD      EQU  $15               ; compare d +BTBD     EQU  $16               ; bit test and branch direct +SETCLRD  EQU  $17               ; bit set or clear direct + +;********** +;*   mnetabl - includes all '11 mnemonics, base opcodes, +;* and type of instruction.  The assembler search routine +;*depends on 4 characters for each mnemonic so that 3 char +;*mnemonics are extended with a space and 5 char mnemonics +;*are truncated. +;********** + +MNETABL EQU  * +        FCC  "ABA "             ; Mnemonic +        FCB  $1B                ; Base opcode +        FCB  INH                ; Class +        FCC  "ABX " +        FCB  $3A +        FCB  INH +        FCC  "ABY " +        FCB  $3A +        FCB  P2INH +        FCC  "ADCA" +        FCB  $89 +        FCB  GEN +        FCC  "ADCB" +        FCB  $C9 +        FCB  GEN +        FCC  "ADDA" +        FCB  $8B +        FCB  GEN +        FCC  "ADDB" +        FCB  $CB +        FCB  GEN +        FCC  "ADDD" +        FCB  $C3 +        FCB  LIMM +        FCC  "ANDA" +        FCB  $84 +        FCB  GEN +        FCC  "ANDB" +        FCB  $C4 +        FCB  GEN +        FCC  "ASL " +        FCB  $68 +        FCB  GRP2 +        FCC  "ASLA" +        FCB  $48 +        FCB  INH +        FCC  "ASLB" +        FCB  $58 +        FCB  INH +        FCC  "ASLD" +        FCB  $05 +        FCB  INH +        FCC  "ASR " +        FCB  $67 +        FCB  GRP2 +        FCC  "ASRA" +        FCB  $47 +        FCB  INH +        FCC  "ASRB" +        FCB  $57 +        FCB  INH +        FCC  "BCC " +        FCB  $24 +        FCB  REL +        FCC  "BCLR" +        FCB  $1D +        FCB  SETCLR +        FCC  "BCS " +        FCB  $25 +        FCB  REL +        FCC  "BEQ " +        FCB  $27 +        FCB  REL +        FCC  "BGE " +        FCB  $2C +        FCB  REL +        FCC  "BGT " +        FCB  $2E +        FCB  REL +        FCC  "BHI " +        FCB  $22 +        FCB  REL +        FCC  "BHS " +        FCB  $24 +        FCB  REL +        FCC  "BITA" +        FCB  $85 +        FCB  GEN +        FCC  "BITB" +        FCB  $C5 +        FCB  GEN +        FCC  "BLE " +        FCB  $2F +        FCB  REL +        FCC  "BLO " +        FCB  $25 +        FCB  REL +        FCC  "BLS " +        FCB  $23 +        FCB  REL +        FCC  "BLT " +        FCB  $2D +        FCB  REL +        FCC  "BMI " +        FCB  $2B +        FCB  REL +        FCC  "BNE " +        FCB  $26 +        FCB  REL +        FCC  "BPL " +        FCB  $2A +        FCB  REL +        FCC  "BRA " +        FCB  $20 +        FCB  REL +        FCC  "BRCL"             ; (BRCLR) +        FCB  $1F +        FCB  BTB +        FCC  "BRN " +        FCB  $21 +        FCB  REL +        FCC  "BRSE"             ; (BRSET) +        FCB  $1E +        FCB  BTB +        FCC  "BSET" +        FCB  $1C +        FCB  SETCLR +        FCC  "BSR " +        FCB  $8D +        FCB  REL +        FCC  "BVC " +        FCB  $28 +        FCB  REL +        FCC  "BVS " +        FCB  $29 +        FCB  REL +        FCC  "CBA " +        FCB  $11 +        FCB  INH +        FCC  "CLC " +        FCB  $0C +        FCB  INH +        FCC  "CLI " +        FCB  $0E +        FCB  INH +        FCC  "CLR " +        FCB  $6F +        FCB  GRP2 +        FCC  "CLRA" +        FCB  $4F +        FCB  INH +        FCC  "CLRB" +        FCB  $5F +        FCB  INH +        FCC  "CLV " +        FCB  $0A +        FCB  INH +        FCC  "CMPA" +        FCB  $81 +        FCB  GEN +        FCC  "CMPB" +        FCB  $C1 +        FCB  GEN +        FCC  "COM " +        FCB  $63 +        FCB  GRP2 +        FCC  "COMA" +        FCB  $43 +        FCB  INH +        FCC  "COMB" +        FCB  $53 +        FCB  INH +        FCC  "CPD " +        FCB  $83 +        FCB  CPD +        FCC  "CPX " +        FCB  $8C +        FCB  XLIMM +        FCC  "CPY " +        FCB  $8C +        FCB  YLIMM +        FCC  "DAA " +        FCB  $19 +        FCB  INH +        FCC  "DEC " +        FCB  $6A +        FCB  GRP2 +        FCC  "DECA" +        FCB  $4A +        FCB  INH +        FCC  "DECB" +        FCB  $5A +        FCB  INH +        FCC  "DES " +        FCB  $34 +        FCB  INH +        FCC  "DEX " +        FCB  $09 +        FCB  INH +        FCC  "DEY " +        FCB  $09 +        FCB  P2INH +        FCC  "EORA" +        FCB  $88 +        FCB  GEN +        FCC  "EORB" +        FCB  $C8 +        FCB  GEN +        FCC  "FDIV" +        FCB  $03 +        FCB  INH +        FCC  "IDIV" +        FCB  $02 +        FCB  INH +        FCC  "INC " +        FCB  $6C +        FCB  GRP2 +        FCC  "INCA" +        FCB  $4C +        FCB  INH +        FCC  "INCB" +        FCB  $5C +        FCB  INH +        FCC  "INS " +        FCB  $31 +        FCB  INH +        FCC  "INX " +        FCB  $08 +        FCB  INH +        FCC  "INY " +        FCB  $08 +        FCB  P2INH +        FCC  "JMP " +        FCB  $6E +        FCB  GRP2 +        FCC  "JSR " +        FCB  $8D +        FCB  NIMM +        FCC  "LDAA" +        FCB  $86 +        FCB  GEN +        FCC  "LDAB" +        FCB  $C6 +        FCB  GEN +        FCC  "LDD " +        FCB  $CC +        FCB  LIMM +        FCC  "LDS " +        FCB  $8E +        FCB  LIMM +        FCC  "LDX " +        FCB  $CE +        FCB  XLIMM +        FCC  "LDY " +        FCB  $CE +        FCB  YLIMM +        FCC  "LSL " +        FCB  $68 +        FCB  GRP2 +        FCC  "LSLA" +        FCB  $48 +        FCB  INH +        FCC  "LSLB" +        FCB  $58 +        FCB  INH +        FCC  "LSLD" +        FCB  $05 +        FCB  INH +        FCC  "LSR " +        FCB  $64 +        FCB  GRP2 +        FCC  "LSRA" +        FCB  $44 +        FCB  INH +        FCC  "LSRB" +        FCB  $54 +        FCB  INH +        FCC  "LSRD" +        FCB  $04 +        FCB  INH +        FCC  "MUL " +        FCB  $3D +        FCB  INH +        FCC  "NEG " +        FCB  $60 +        FCB  GRP2 +        FCC  "NEGA" +        FCB  $40 +        FCB  INH +        FCC  "NEGB" +        FCB  $50 +        FCB  INH +        FCC  "NOP " +        FCB  $01 +        FCB  INH +        FCC  "ORAA" +        FCB  $8A +        FCB  GEN +        FCC  "ORAB" +        FCB  $CA +        FCB  GEN +        FCC  "PSHA" +        FCB  $36 +        FCB  INH +        FCC  "PSHB" +        FCB  $37 +        FCB  INH +        FCC  "PSHX" +        FCB  $3C +        FCB  INH +        FCC  "PSHY" +        FCB  $3C +        FCB  P2INH +        FCC  "PULA" +        FCB  $32 +        FCB  INH +        FCC  "PULB" +        FCB  $33 +        FCB  INH +        FCC  "PULX" +        FCB  $38 +        FCB  INH +        FCC  "PULY" +        FCB  $38 +        FCB  P2INH +        FCC  "ROL " +        FCB  $69 +        FCB  GRP2 +        FCC  "ROLA" +        FCB  $49 +        FCB  INH +        FCC  "ROLB" +        FCB  $59 +        FCB  INH +        FCC  "ROR " +        FCB  $66 +        FCB  GRP2 +        FCC  "RORA" +        FCB  $46 +        FCB  INH +        FCC  "RORB" +        FCB  $56 +        FCB  INH +        FCC  "RTI " +        FCB  $3B +        FCB  INH +        FCC  "RTS " +        FCB  $39 +        FCB  INH +        FCC  "SBA " +        FCB  $10 +        FCB  INH +        FCC  "SBCA" +        FCB  $82 +        FCB  GEN +        FCC  "SBCB" +        FCB  $C2 +        FCB  GEN +        FCC  "SEC " +        FCB  $0D +        FCB  INH +        FCC  "SEI " +        FCB  $0F +        FCB  INH +        FCC  "SEV " +        FCB  $0B +        FCB  INH +        FCC  "STAA" +        FCB  $87 +        FCB  NIMM +        FCC  "STAB" +        FCB  $C7 +        FCB  NIMM +        FCC  "STD " +        FCB  $CD +        FCB  NIMM +        FCC  "STOP" +        FCB  $CF +        FCB  INH +        FCC  "STS " +        FCB  $8F +        FCB  NIMM +        FCC  "STX " +        FCB  $CF +        FCB  XNIMM +        FCC  "STY " +        FCB  $CF +        FCB  YNIMM +        FCC  "SUBA" +        FCB  $80 +        FCB  GEN +        FCC  "SUBB" +        FCB  $C0 +        FCB  GEN +        FCC  "SUBD" +        FCB  $83 +        FCB  LIMM +        FCC  "SWI " +        FCB  $3F +        FCB  INH +        FCC  "TAB " +        FCB  $16 +        FCB  INH +        FCC  "TAP " +        FCB  $06 +        FCB  INH +        FCC  "TBA " +        FCB  $17 +        FCB  INH +        FCC  "TPA " +        FCB  $07 +        FCB  INH +        FCC  "TEST" +        FCB  $00 +        FCB  INH +        FCC  "TST " +        FCB  $6D +        FCB  GRP2 +        FCC  "TSTA" +        FCB  $4D +        FCB  INH +        FCC  "TSTB" +        FCB  $5D +        FCB  INH +        FCC  "TSX " +        FCB  $30 +        FCB  INH +        FCC  "TSY " +        FCB  $30 +        FCB  P2INH +        FCC  "TXS " +        FCB  $35 +        FCB  INH +        FCC  "TYS " +        FCB  $35 +        FCB  P2INH +        FCC  "WAI " +        FCB  $3E +        FCB  INH +        FCC  "XGDX" +        FCB  $8F +        FCB  INH +        FCC  "XGDY" +        FCB  $8F +        FCB  P2INH +        FCC  "BRSE"             ; bit direct modes for +        FCB  $12                ; disassembler. +        FCB  BTBD +        FCC  "BRCL" +        FCB  $13 +        FCB  BTBD +        FCC  "BSET" +        FCB  $14 +        FCB  SETCLRD +        FCC  "BCLR" +        FCB  $15 +        FCB  SETCLRD +        FCB  EOT                ; End of table + +;********************************************** +PG1      EQU      $0 +PG2      EQU      $1 +PG3      EQU      $2 +PG4      EQU      $3 + +;****************** +;*disassem() - disassemble the opcode. +;****************** +;*(check for page prebyte) +;*baseop=pc[0]; +;*pnorm=PG1; +;*if(baseop==$18) pnorm=PG2; +;*if(baseop==$1A) pnorm=PG3; +;*if(baseop==$CD) pnorm=PG4; +;*if(pnorm != PG1) dispc=pc+1; +;*else dispc=pc; (dispc points to next byte) + +DISASSM EQU  * +        LDX  PC                 ; address +        LDAA 0,X                ; opcode +        LDAB #PG1 +        CMPA #$18 +        BEQ  DISP2              ; jump if page2 +        CMPA #$1A +        BEQ  DISP3              ; jump if page3 +        CMPA #$CD +        BNE  DISP1              ; jump if not page4 +DISP4   INCB                    ; set up page value +DISP3   INCB +DISP2   INCB +        INX +DISP1   STX  DISPC              ; point to opcode +        STAB PNORM              ; save page + +;*If(opcode == ($00-$5F or $8D or $8F or $CF)) +;*  if(pnorm == (PG3 or PG4)) +;*      disillop(); return(); +;*  b=disrch(opcode,NULL); +;*  if(b==0) disillop(); return(); + +        LDAA 0,X                ; get current opcode +        STAA BASEOP +        INX +        STX  DISPC              ; point to next byte +        CMPA #$5F +        BLS  DIS1               ; jump if in range +        CMPA #$8D +        BEQ  DIS1               ; jump if bsr +        CMPA #$8F +        BEQ  DIS1               ; jump if xgdx +        CMPA #$CF +        BEQ  DIS1               ; jump if stop +        JMP  DISGRP             ; try next part of map +DIS1    LDAB PNORM +        CMPB #PG3 +        BLO  DIS2               ; jump if page 1 or 2 +        JSR  DISILLOP           ; "illegal opcode" +        RTS +DIS2    LDAB BASEOP             ; opcode +        CLRB                    ; class=null +        JSR  DISRCH +        TSTB +        BNE  DISPEC             ; jump if opcode found +        JSR  DISILLOP           ; "illegal opcode" +        RTS + +;*   if(opcode==$8D) dissrch(opcode,REL); +;*   if(opcode==($8F or $CF)) disrch(opcode,INH); + +DISPEC  LDAA BASEOP +        CMPA #$8D +        BNE  DISPEC1 +        LDAB #REL +        BRA  DISPEC3            ; look for BSR opcode +DISPEC1 CMPA #$8F +        BEQ  DISPEC2            ; jump if XGDX opcode +        CMPA #$CF +        BNE  DISINH             ; jump not STOP opcode +DISPEC2 LDAB #INH +DISPEC3 JSR  DISRCH             ; find other entry in table + +;*   if(class==INH)              /* INH */ +;*      if(pnorm==PG2) +;*          b=disrch(baseop,P2INH); +;*          if(b==0) disillop(); return(); +;*      prntmne(); +;*      return(); + +DISINH  EQU  * +        LDAB CLASS +        CMPB #INH +        BNE  DISREL             ; jump if not inherent +        LDAB PNORM +        CMPB #PG1 +        BEQ  DISINH1            ; jump if page1 +        LDAA BASEOP             ; get opcode +        LDAB #P2INH             ; class=p2inh +        JSR  DISRCH +        TSTB +        BNE  DISINH1            ; jump if found +        JSR  DISILLOP           ; "illegal opcode" +        RTS +DISINH1 JSR  PRNTMNE +        RTS + +;*   elseif(class=REL)          /* REL */ +;*      if(pnorm != PG1) +;*          disillop(); return(); +;*      prntmne(); +;*      disrelad(); +;*      return(); + +DISREL  EQU  * +        LDAB CLASS +        CMPB #REL +        BNE  DISBTD +        TST  PNORM +        BEQ  DISREL1            ; jump if page1 +        JSR  DISILLOP           ; "illegal opcode" +        RTS +DISREL1 JSR  PRNTMNE            ; output mnemonic +        JSR  DISRELAD           ; compute relative address +        RTS + +;*   else    /* SETCLR,SETCLRD,BTB,BTBD */ +;*      if(class == (SETCLRD or BTBD)) +;*          if(pnorm != PG1) +;*             disillop(); return();   /* illop */ +;*          prntmne();             /* direct */ +;*          disdir();             /* output $byte */ +;*      else (class == (SETCLR or BTB)) +;*          prntmne();             /* indexed */ +;*          disindx(); +;*      outspac(); +;*      disdir(); +;*      outspac(); +;*      if(class == (BTB or BTBD)) +;*          disrelad(); +;*   return(); + +DISBTD  EQU  * +        LDAB CLASS +        CMPB #SETCLRD +        BEQ  DISBTD1 +        CMPB #BTBD +        BNE  DISBIT             ; jump not direct bitop +DISBTD1 TST  PNORM +        BEQ  DISBTD2            ; jump if page 1 +        JSR  DISILLOP +        RTS +DISBTD2 JSR  PRNTMNE +        JSR  DISDIR             ; operand(direct) +        BRA  DISBIT1 +DISBIT  EQU  * +        JSR  PRNTMNE +        JSR  DISINDX            ; operand(indexed) +DISBIT1 JSR  OUTSPAC +        JSR  DISDIR             ; mask +        LDAB CLASS +        CMPB #BTB +        BEQ  DISBIT2            ; jump if btb +        CMPB #BTBD +        BNE  DISBIT3            ; jump if not bit branch +DISBIT2 JSR  DISRELAD           ; relative address +DISBIT3 RTS + + +;*Elseif($60 <= opcode <= $7F)  /*  GRP2 */ +;*   if(pnorm == (PG3 or PG4)) +;*      disillop(); return(); +;*   if((pnorm==PG2) and (opcode != $6x)) +;*      disillop(); return(); +;*   b=disrch(baseop & $6F,NULL); +;*   if(b==0) disillop(); return(); +;*   prntmne(); +;*   if(opcode == $6x) +;*      disindx(); +;*   else +;*      disext(); +;*   return(); + +DISGRP  EQU  * +        CMPA #$7F               ; a=opcode +        BHI  DISNEXT            ; try next part of map +        LDAB PNORM +        CMPB #PG3 +        BLO  DISGRP2            ; jump if page 1 or 2 +        JSR  DISILLOP           ; "illegal opcode" +        RTS +DISGRP2 ANDA #$6F               ; mask bit 4 +        CLRB                    ; class=null +        JSR  DISRCH +        TSTB +        BNE  DISGRP3            ; jump if found +        JSR  DISILLOP           ; "illegal opcode" +        RTS +DISGRP3 JSR  PRNTMNE +        LDAA BASEOP             ; get opcode +        ANDA #$F0 +        CMPA #$60 +        BNE  DISGRP4            ; jump if not 6x +        JSR  DISINDX            ; operand(indexed) +        RTS +DISGRP4 JSR  DISEXT             ; operand(extended) +        RTS + +;*Else  ($80 <= opcode <= $FF) +;*   if(opcode == ($87 or $C7)) +;*      disillop(); return(); +;*   b=disrch(opcode&$CF,NULL); +;*   if(b==0) disillop(); return(); + +DISNEXT EQU  * +        CMPA #$87               ; a=opcode +        BEQ  DISNEX1 +        CMPA #$C7 +        BNE  DISNEX2 +DISNEX1 JSR  DISILLOP           ; "illegal opcode" +        RTS +DISNEX2 ANDA #$CF +        CLRB                    ; class=null +        JSR  DISRCH +        TSTB +        BNE  DISNEW             ; jump if mne found +        JSR  DISILLOP           ; "illegal opcode" +        RTS + +;*   if(opcode&$CF==$8D) disrch(baseop,NIMM; (jsr) +;*   if(opcode&$CF==$8F) disrch(baseop,NIMM; (sts) +;*   if(opcode&$CF==$CF) disrch(baseop,XNIMM; (stx) +;*   if(opcode&$CF==$83) disrch(baseop,LIMM); (subd) + +DISNEW  LDAA BASEOP +        ANDA #$CF +        CMPA #$8D +        BNE  DISNEW1            ; jump not jsr +        LDAB #NIMM +        BRA  DISNEW4 +DISNEW1 CMPA #$8F +        BNE  DISNEW2            ; jump not sts +        LDAB #NIMM +        BRA  DISNEW4 +DISNEW2 CMPA #$CF +        BNE  DISNEW3            ; jump not stx +        LDAB #XNIMM +        BRA  DISNEW4 +DISNEW3 CMPA #$83 +        BNE  DISGEN             ; jump not subd +        LDAB #LIMM +DISNEW4 JSR  DISRCH +        TSTB +        BNE  DISGEN             ; jump if found +        JSR  DISILLOP           ; "illegal opcode" +        RTS + +;*   if(class == (GEN or NIMM or LIMM   ))   /* GEN,NIMM,LIMM,CPD */ +;*      if(opcode&$CF==$83) +;*          if(pnorm==(PG3 or PG4)) disrch(opcode#$CF,CPD) +;*          class=LIMM; +;*      if((pnorm == (PG2 or PG4) and (opcode != ($Ax or $Ex))) +;*          disillop(); return(); +;*      disgenrl(); +;*      return(); + +DISGEN  LDAB CLASS              ; get class +        CMPB #GEN +        BEQ  DISGEN1 +        CMPB #NIMM +        BEQ  DISGEN1 +        CMPB #LIMM +        BNE  DISXLN             ; jump if other class +DISGEN1 LDAA BASEOP +        ANDA #$CF +        CMPA #$83 +        BNE  DISGEN3            ; jump if not #$83 +        LDAB PNORM +        CMPB #PG3 +        BLO  DISGEN3            ; jump not pg3 or 4 +        LDAB #CPD +        JSR  DISRCH             ; look for cpd mne +        LDAB #LIMM +        STAB CLASS              ; set class to limm +DISGEN3 LDAB PNORM +        CMPB #PG2 +        BEQ  DISGEN4            ; jump if page 2 +        CMPB #PG4 +        BNE  DISGEN5            ; jump not page 2 or 4 +DISGEN4 LDAA BASEOP +        ANDA #$B0               ; mask bits 6,3-0 +        CMPA #$A0 +        BEQ  DISGEN5            ; jump if $Ax or $Ex +        JSR  DISILLOP           ; "illegal opcode" +        RTS +DISGEN5 JSR  DISGENRL           ; process general class +        RTS + +;*   else       /* XLIMM,XNIMM,YLIMM,YNIMM */ +;*      if(pnorm==(PG2 or PG3)) +;*          if(class==XLIMM) disrch(opcode&$CF,YLIMM); +;*          else disrch(opcode&$CF,YNIMM); +;*      if((pnorm == (PG3 or PG4)) +;*          if(opcode != ($Ax or $Ex)) +;*             disillop(); return(); +;*      class=LIMM; +;*      disgen(); +;*   return(); + +DISXLN  LDAB PNORM +        CMPB #PG2 +        BEQ  DISXLN1            ; jump if page2 +        CMPB #PG3 +        BNE  DISXLN4            ; jump not page3 +DISXLN1 LDAA BASEOP +        ANDA #$CF +        LDAB CLASS +        CMPB #XLIMM +        BNE  DISXLN2 +        LDAB #YLIMM +        BRA  DISXLN3            ; look for ylimm +DISXLN2 LDAB #YNIMM             ; look for ynimm +DISXLN3 JSR  DISRCH +DISXLN4 LDAB PNORM +        CMPB #PG3 +        BLO  DISXLN5            ; jump if page 1 or 2 +        LDAA BASEOP             ; get opcode +        ANDA #$B0               ; mask bits 6,3-0 +        CMPA #$A0 +        BEQ  DISXLN5            ; jump opcode = $Ax or $Ex +        JSR  DISILLOP           ; "illegal opcode" +        RTS +DISXLN5 LDAB #LIMM +        STAB CLASS +        JSR  DISGENRL           ; process general class +        RTS + + +;****************** +;*disrch(a=opcode,b=class) +;*return b=0 if not found +;*  else mneptr=points to mnemonic +;*         class=class of opcode +;****************** +;*x=#MNETABL +;*while(x[0] != eot) +;*   if((opcode==x[4]) && ((class=NULL) || (class=x[5]))) +;*      mneptr=x; +;*      class=x[5]; +;*      return(1); +;*   x += 6; +;*return(0);        /* not found */ + +DISRCH  EQU  * +        LDX  #MNETABL           ; point to top of table +DISRCH1 CMPA 4,X                ; test opcode +        BNE  DISRCH3            ; jump not this entry +        TSTB +        BEQ  DISRCH2            ; jump if class=null +        CMPB 5,X                ; test class +        BNE  DISRCH3            ; jump not this entry +DISRCH2 LDAB 5,X +        STAB CLASS +        STX  MNEPTR             ; return ptr to mnemonic +        INCB +        RTS                     ; return found +DISRCH3 PSHB                    ; save class +        LDAB #6 +        ABX +        LDAB 0,X +        CMPB #EOT               ; test end of table +        PULB +        BNE  DISRCH1 +        CLRB +        RTS                     ; return not found + +;****************** +;*prntmne() - output the mnemonic pointed +;*at by mneptr. +;****************** +;*outa(mneptr[0-3]); +;*outspac; +;*return(); + +PRNTMNE EQU  * +        LDX  MNEPTR +        LDAA 0,X +        JSR  OUTA               ; output char1 +        LDAA 1,X +        JSR  OUTA               ; output char2 +        LDAA 2,X +        JSR  OUTA               ; output char3 +        LDAA 3,X +        JSR  OUTA               ; output char4 +        JSR  OUTSPAC +        RTS + +;****************** +;*disindx() - process indexed mode +;****************** +;*disdir(); +;*outa(','); +;*if(pnorm == (PG2 or PG4)) outa('Y'); +;*else outa('X'); +;*return(); + +DISINDX EQU  * +        JSR  DISDIR             ; output $byte +        LDAA #',' +        JSR  OUTA               ; output , +        LDAB PNORM +        CMPB #PG2 +        BEQ  DISIND1            ; jump if page2 +        CMPB #PG4 +        BNE  DISIND2            ; jump if not page4 +DISIND1 LDAA #'Y' +        BRA DISIND3 +DISIND2 LDAA #'X' +DISIND3 JSR  OUTA               ; output x or y +        RTS + +;****************** +;*disrelad() - compute and output relative address. +;****************** +;* braddr = dispc[0] + (dispc++);( 2's comp arith) +;*outa('$'); +;*out2bsp(braddr); +;*return(); + +DISRELAD EQU * +        LDX  DISPC +        LDAB 0,X                ; get relative offset +        INX +        STX  DISPC +        TSTB +        BMI  DISRLD1            ; jump if negative +        ABX +        BRA  DISRLD2 +DISRLD1 DEX +        INCB +        BNE  DISRLD1            ; subtract +DISRLD2 STX  BRADDR             ; save address +        JSR  OUTSPAC +        LDAA #'$' +        JSR  OUTA +        LDX  #BRADDR +        JSR  OUT2BSP            ; output address +        RTS + + +;****************** +;*disgenrl() - output data for the general cases which +;*includes immediate, direct, indexed, and extended modes. +;****************** +;*prntmne(); +;*if(baseop == ($8x or $Cx))   /* immediate */ +;*   outa('#'); +;*   disdir(); +;*   if(class == LIMM) +;*      out1byt(dispc++); +;*elseif(baseop == ($9x or $Dx))  /* direct */ +;*   disdir(); +;*elseif(baseop == ($Ax or $Ex)) /* indexed */ +;*   disindx(); +;*else  (baseop == ($Bx or $Fx)) /* extended */ +;*   disext(); +;*return(); + +DISGENRL EQU * +        JSR  PRNTMNE            ; print mnemonic +        LDAA BASEOP             ; get opcode +        ANDA #$B0               ;  mask bits 6,3-0 +        CMPA #$80 +        BNE  DISGRL2            ; jump if not immed +        LDAA #'#'               ; do immediate +        JSR  OUTA +        JSR  DISDIR +        LDAB CLASS +        CMPB #LIMM +        BEQ  DISGRL1            ; jump class = limm +        RTS +DISGRL1 LDX  DISPC +        JSR  OUT1BYT +        STX  DISPC +        RTS +DISGRL2 CMPA #$90 +        BNE  DISGRL3            ; jump not direct +        JSR  DISDIR             ; do direct +        RTS +DISGRL3 CMPA #$A0 +        BNE  DISGRL4            ; jump not indexed +        JSR  DISINDX            ; do extended +        RTS +DISGRL4 JSR  DISEXT             ; do extended +        RTS + +;***************** +;*disdir() - output "$ next byte" +;***************** +DISDIR  EQU  * +        LDAA #'$' +        JSR  OUTA +        LDX  DISPC +        JSR  OUT1BYT +        STX  DISPC +        RTS + +;***************** +;*disext() - output "$ next 2 bytes" +;***************** +DISEXT  EQU  * +        LDAA #'$' +        JSR  OUTA +        LDX  DISPC +        JSR  OUT2BSP +        STX  DISPC +        RTS + + +;***************** +;*disillop() - output "illegal opcode" +;***************** +DISMSG1 FCC  "ILLOP" +        FCB  EOT +DISILLOP EQU * +        PSHX +        LDX  #DISMSG1 +        JSR  OUTSTRG0           ; no cr +        PULX +        RTS + +;* Equates +JPORTD   EQU   $08 +JDDRD    EQU   $09 +JBAUD    EQU   $2B +JSCCR1   EQU   $2C +JSCCR2   EQU   $2D +JSCSR    EQU   $2E +JSCDAT   EQU   $2F +;* + +;************ +;*  xboot [<addr1> [<addr2>]] - Use SCI to talk to an 'hc11 in +;* boot mode.  Downloads bytes from addr1 thru addr2. +;* Default addr1 = $C000 and addr2 = $C0ff. +;* +;* IMPORTANT: +;* if talking to an 'A8 or 'A2: use either default addresses or ONLY +;*    addr1 - this sends 256 bytes +;* if talking to an 'E9: include BOTH addr1 and addr2 for variable +;*    length +;************ + +;*Get arguments +;*If no args, default $C000 +BOOT    JSR   WSKIP +        BNE   BOT1              ; jump if arguments +        LDX   #$C0FF            ; addr2 default +        STX   PTR5 +        LDY   #$C000            ; addr1 default +        BRA   BOT2              ; go - use default address + +;*Else get arguments +BOT1    JSR   BUFFARG +        TST   COUNT +        BEQ   BOTERR            ; jump if no address +        LDY   SHFTREG           ; start address (addr1) +        JSR   WSKIP +        BNE   BOT1A             ; go get addr2 +        STY   PTR5              ; default addr2... +        LDD   PTR5              ; ...by taking addr1... +        ADDD  #$FF              ; ...and adding 255 to it... +        STD   PTR5              ; ...for a total download of 256 +        BRA   BOT2              ; continue +;* +BOT1A   JSR   BUFFARG +        TST   COUNT +        BEQ   BOTERR            ; jump if no address +        LDX   SHFTREG           ; end address (addr2) +        STX   PTR5 +        JSR   WSKIP +        BNE   BOTERR            ; go use addr1 and addr2 +        BRA   BOT2 + +;* +BOTERR  LDX   #MSG9             ; "bad argument" +        JSR   OUTSTRG +        RTS + +;*Boot routine +BOT2    LDAB  #$FF              ; control character ($ff -> download) +        JSR   BTSUB             ; set up SCI and send control char +;*                                initializes X as register pointer +;*Download block +BLOP    LDAA  0,Y +        STAA  JSCDAT,X          ; write to transmitter +        BRCLR JSCSR,X,#80,*     ; wait for TDRE +        CPY   PTR5              ; if last... +        BEQ   BTDONE            ; ...quit +        INY                     ; else... +        BRA   BLOP              ; ...send next +BTDONE  RTS + +;************************************************ +;*Subroutine +;*  btsub   - sets up SCI and outputs control character +;* On entry, B = control character +;* On exit,  X = $1000 +;*            A = $0C +;*************************** + +BTSUB   EQU   * +        LDX   #$1000            ; to use indexed addressing +        LDAA  #$02 +        STAA  JPORTD,X          ; drive transmitter line +        STAA  JDDRD,X           ; high +        CLR   JSCCR2,X          ; turn off XMTR and RCVR +        LDAA  #$22              ; BAUD = /16 +        STAA  JBAUD,X +        LDAA  #$0C              ; TURN ON XMTR & RCVR +        STAA  JSCCR2,X +        STAB  JSCDAT,X +        BRCLR JSCSR,X,#80,*     ; wait for TDRE +        RTS + +;****************** +;* +;*        EVBTEST - This routine makes it a little easier +;*        on us to test this board. +;* +;****************** + +EVBTEST  LDAA  #$FF +         STAA  $1000            ; Write ones to port A +         CLR  AUTOLF            ; Turn off auto lf +         JSR  HOSTCO            ; Connect host +         JSR  HOSTINIT          ; Initialize host +         LDAA #$7f +         JSR  HOSTOUT           ; Send Delete to Altos +         LDAA #$0d +         JSR  HOSTOUT           ; Send <CR> +         INC  AUTOLF            ; Turn on Auto LF +         LDX  #INBUFF+5         ; Point at Load message +         STX  PTR0              ; Set pointer for load command +         LDY  #MSGEVB           ; Point at cat line +LOOP     LDAA 0,Y               ; Loop to xfer command line +         CMPA #04               ; Into buffalo line buffer +         BEQ  DONE              ; Quit on $04 +         STAA 0,X +         INX                    ; next character +         INY +         BRA  LOOP +DONE     CLR  TMP2              ; Set load vs. verify +         JSR  LOAD3             ; Jmp into middle of load +         LDS  #STACK            ; Reset Stack +         JMP  $C0B3             ; Jump to Downloaded code + +MSGEVB   FCC  "cat evbtest.out" +         FCB  $0D +         FCB  $04 + + + +;*** Jump table *** +        ORG      ROMBS+$1F7C +.WARMST JMP       MAIN +.BPCLR  JMP       BPCLR +.RPRINT JMP       RPRINT +.HEXBIN JMP       HEXBIN +.BUFFAR JMP       BUFFARG +.TERMAR JMP       TERMARG +.CHGBYT JMP       CHGBYT +.READBU JMP       READBUFF +.INCBUF JMP       INCBUFF +.DECBUF JMP       DECBUFF +.WSKIP  JMP       WSKIP +.CHKABR JMP       CHKABRT + +        ORG      ROMBS+$1FA0 +.UPCASE JMP       UPCASE +.WCHEK  JMP       WCHEK +.DCHEK  JMP       DCHEK +.INIT   JMP       INIT +.INPUT  JMP       INPUT +.OUTPUT JMP       OUTPUT +.OUTLHL JMP       OUTLHLF +.OUTRHL JMP       OUTRHLF +.OUTA   JMP       OUTA +.OUT1BY JMP       OUT1BYT +.OUT1BS JMP       OUT1BSP +.OUT2BS JMP       OUT2BSP +.OUTCRL JMP       OUTCRLF +.OUTSTR JMP       OUTSTRG +.OUTST0 JMP       OUTSTRG0 +.INCHAR JMP       INCHAR +.VECINT JMP       VECINIT + +         ORG     ROMBS+$1FD6 +;*** Vectors *** +VSCI      FDB     JSCI +VSPI      FDB     JSPI +VPAIE     FDB     JPAIE +VPAO      FDB     JPAO +VTOF      FDB     JTOF +VTOC5     FDB     JTOC5 +VTOC4     FDB     JTOC4 +VTOC3     FDB     JTOC3 +VTOC2     FDB     JTOC2 +VTOC1     FDB     JTOC1 +VTIC3     FDB     JTIC3 +VTIC2     FDB     JTIC2 +VTIC1     FDB     JTIC1 +VRTI      FDB     JRTI +VIRQ      FDB     JIRQ +VXIRQ     FDB     JXIRQ +VSWI      FDB     JSWI +VILLOP    FDB     JILLOP +VCOP      FDB     JCOP +VCLM      FDB     JCLM +VRST      FDB     BUFFALO +          END diff --git a/tests/t_buf32/t_buf32.doc b/tests/t_buf32/t_buf32.doc new file mode 100644 index 0000000..67e8f37 --- /dev/null +++ b/tests/t_buf32/t_buf32.doc @@ -0,0 +1,5 @@ ++------------------------  Test Application BUF32 ----------------------------+ +|                                                                             | +|  This is a version of Motorola's 68HC11-Monitor Buffalo-32 adapted for AS.  | +|                                                                             | ++-----------------------------------------------------------------------------+ diff --git a/tests/t_buf32/t_buf32.inc b/tests/t_buf32/t_buf32.inc new file mode 100644 index 0000000..98ae373 --- /dev/null +++ b/tests/t_buf32/t_buf32.inc @@ -0,0 +1,2 @@ +; tests/t_buf32/t_buf32.asm-Includefile für Assembler-Programm +; Ende Includefile für Assembler-Programm diff --git a/tests/t_buf32/t_buf32.ori b/tests/t_buf32/t_buf32.ori Binary files differnew file mode 100644 index 0000000..774e9c9 --- /dev/null +++ b/tests/t_buf32/t_buf32.ori diff --git a/tests/t_cop8/asflags b/tests/t_cop8/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_cop8/asflags diff --git a/tests/t_cop8/t_cop8.asm b/tests/t_cop8/t_cop8.asm new file mode 100644 index 0000000..68573d1 --- /dev/null +++ b/tests/t_cop8/t_cop8.asm @@ -0,0 +1,128 @@ +        cpu     cop87l84 + +        macexp  off + +        include regcop8.inc + +        nop +        ret +        reti +        retsk +        sc +        rc +        ifc +        ifnc +        vis +        jid +        intr +        laid +        rpnd + +        clr     a +        inc     a +        dec     a +        dcor    a +        rrc     a +        rlc     a +        swap    a +        pop     a +        push    a + +        adc     a,[b] +        adc     a,0x12 +        adc     a,#0x12 + +        subc    a,[b] +        subc    a,0x12 +        subc    a,#0x12 + +        add     a,[b] +        add     a,0x12 +        add     a,#0x12 + +        ifgt    a,[b] +        ifgt    a,0x12 +        ifgt    a,#0x12 + +        and     a,[b] +        and     a,0x12 +        and     a,#0x12 + +        xor     a,[b] +        xor     a,0x12 +        xor     a,#0x12 + +        or      a,[b] +        or      a,0x12 +        or      a,#0x12 + +        ld      a,[b] +        ld      a,0x12 +        ld      a,#0x12 +        ld      a,[x] +        ld      r4,#0x12 +        ld      b,#12 +        ld      b,#0x12 +        ld      a,[b+] +        ld      a,[x+] +        ld      a,[b-] +        ld      a,[x-] +        ld      [b],#0x12 +        ld      [b+],#0x12 +        ld      [b-],#0x12 +        ld      0x12,#0x12 + +        x       a,[b] +        x       [x],a +        x       a,[b+] +        x       [x+],a +        x       a,[b-] +        x       [x-],a +        x       a,0x12 + +        andsz   a,#0x12 + +        ifeq    a,[b] +        ifeq    a,0x12 +        ifeq    a,#0x12 +        ifeq    0x12,#0x12 + +        ifne    a,[b] +        ifne    a,0x12 +        ifne    a,#0x12 + +        ifbit   3,[b] +        ifbit   5,0x12 +        sbit    3,[b] +        sbit    5,0x12 +        rbit    3,[b] +        rbit    5,0x12 + +        ifbne   #7 +        ifbne   #0xc + +        jmp     0x123 +        jsr     0x987 + +        jmpl    0x1234 +        jsrl    0x3456 + +        jp      .+6 +        jp      .-20 +        jp      .+1 + +        drsz    r12 +        drsz    r8 + +reg     sfr     10 + +        addr    1,2,3,4,5 +        addrw   1,2,3,4,5 +        byte    1,2,3,4,5 +        word    1,2,3,4,5 +        dsb     20 +        dsw     20 +        fb      10,20 +        fw      10,20 + + diff --git a/tests/t_cop8/t_cop8.doc b/tests/t_cop8/t_cop8.doc new file mode 100644 index 0000000..94aacd5 --- /dev/null +++ b/tests/t_cop8/t_cop8.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application COP8 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the COP8 code generator                 | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_cop8/t_cop8.ori b/tests/t_cop8/t_cop8.ori Binary files differnew file mode 100644 index 0000000..15e176e --- /dev/null +++ b/tests/t_cop8/t_cop8.ori diff --git a/tests/t_f2mc8l/asflags b/tests/t_f2mc8l/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_f2mc8l/asflags diff --git a/tests/t_f2mc8l/t_f2mc8l.asm b/tests/t_f2mc8l/t_f2mc8l.asm new file mode 100644 index 0000000..25540b7 --- /dev/null +++ b/tests/t_f2mc8l/t_f2mc8l.asm @@ -0,0 +1,242 @@ +	cpu	mb89190 +	page	0 + +;---------------------------------------------------------------------------- +; Transfer + +	mov	23h,a +	mov	@ix+34h,a +	mov	1234h,a +	mov	@ep,a +	mov	r0,a +	mov	r1,a +	mov	r2,a +	mov	r3,a +	mov	r4,a +	mov	r5,a +	mov	r6,a +	mov	r7,a +	mov	a,#12h +	mov	a,23h +	mov	a,@ix+34h +	mov	a,1234h +	mov	a,@a +	mov	a,@ep +	mov	a,r0 +	mov	a,r1 +	mov	a,r2 +	mov	a,r3 +	mov	a,r4 +	mov	a,r5 +	mov	a,r6 +	mov	a,r7 +	mov	23h,#12h +	mov	@ix+34h,#12h +	mov	@ep,#12h +	mov	r0,#12h +	mov	r1,#12h +	mov	r2,#12h +	mov	r3,#12h +	mov	r4,#12h +	mov	r5,#12h +	mov	r6,#12h +	mov	r7,#12h +	movw	12h,a +	movw	@ix+34h,a +	movw	1234h,a +	movw	@ep,a +	movw	ep,a +	movw	a,#2345h +	movw	a,12h +	movw	a,@ix+34h +	movw	a,1234h +	movw	a,@a +	movw	a,@ep +	movw	a,ep +	movw	ep,#2345h +	movw	ix,a +	movw	a,ix +	movw	sp,a +	movw	a,sp +	mov     @a,t +	movw	@a,t +	movw	ix,#2345h +	movw	a,ps +	movw	ps,a +	movw	sp,#2345h +	swap +	setb	12h:6 +	clrb	12h:5 +	xch	a,t +	xchw	a,t +	xchw	a,ep +	xchw	a,ix +	xchw	a,sp +	movw	a,pc + + +;---------------------------------------------------------------------------- +; Arithmetik + +	addc	a,r0 +	addc	a,r1 +	addc	a,r2 +	addc	a,r3 +	addc	a,r4 +	addc	a,r5 +	addc	a,r6 +	addc	a,r7 +	addc	a,#12h +	addc	a,23h +	addc	a,@ix+34h +	addc	a,@ep +        addcw	a +	addc	a +	subc	a,r0 +	subc	a,r1 +	subc	a,r2 +	subc	a,r3 +	subc	a,r4 +	subc	a,r5 +	subc	a,r6 +	subc	a,r7 +	subc	a,#12h +	subc	a,23h +	subc	a,@ix+34h +	subc	a,@ep +	subcw	a +	subc	a +	inc	r0 +	inc	r1 +	inc	r2 +	inc	r3 +	inc	r4 +	inc	r5 +	inc	r6 +	inc	r7 +	incw	ep +	incw	ix +	incw	a +	dec	r0 +	dec	r1 +	dec	r2 +	dec	r3 +	dec	r4 +	dec	r5 +	dec	r6 +	dec	r7 +	decw	ep +	decw	ix +	decw	a +	mulu	a +	divu	a +	andw	a +	orw	a +	xorw	a +	cmp	a +	rorc	a +	rolc	a +	cmp	a,#12h +	cmp	a,23h +	cmp	a,@ix+34h +	cmp	a,@ep +	cmp	a,r0 +	cmp	a,r1 +	cmp	a,r2 +	cmp	a,r3 +	cmp	a,r4 +	cmp	a,r5 +	cmp	a,r6 +	cmp	a,r7 +	daa +	das +	xor	a +	xor	a,#12h +	xor	a,23h +	xor	a,@ix+34h +	xor	a,@ep +	xor	a,r0 +	xor	a,r1 +	xor	a,r2 +	xor	a,r3 +	xor	a,r4 +	xor	a,r5 +	xor	a,r6 +	xor	a,r7 +	and	a +	and	a,#12h +	and	a,23h +	and	a,@ix+34h +	and	a,@ep +	and	a,r0 +	and	a,r1 +	and	a,r2 +	and	a,r3 +	and	a,r4 +	and	a,r5 +	and	a,r6 +	and	a,r7 +	or	a +	or	a,#12h +	or	a,23h +	or	a,@ix+34h +	or	a,@ep +	or	a,r0 +	or	a,r1 +	or	a,r2 +	or	a,r3 +	or	a,r4 +	or	a,r5 +	or	a,r6 +	or	a,r7 +	cmp	23h,#12h +	cmp	@ep,#12h +	cmp	@ix+34h,#12h +	cmp	r0,#12h +	cmp	r1,#12h +	cmp	r2,#12h +	cmp	r3,#12h +	cmp	r4,#12h +	cmp	r5,#12h +	cmp	r6,#12h +	cmp	r7,#12h +	incw	sp +	decw	sp + +;---------------------------------------------------------------------------- +; Spruenge + +	bz	$ +	beq	$ +	bnz	$ +	bne	$ +	bc	$ +	blo	$ +	bnc	$ +	bhs	$ +	bn	$ +	bp	$ +	blt	$ +	bge	$ +	bbc	23h:5,$ +	bbs	23h:4,$ +	jmp	@a +	jmp	2345h +	callv	#4 +	call	2345h +	xchw	a,pc +	ret +	reti + +;---------------------------------------------------------------------------- +; Sonstiges + +	pushw	a +	popw	a +	pushw	ix +	popw	ix +	nop +	clrc +	setc +	clri +	seti diff --git a/tests/t_f2mc8l/t_f2mc8l.doc b/tests/t_f2mc8l/t_f2mc8l.doc new file mode 100644 index 0000000..8bb3785 --- /dev/null +++ b/tests/t_f2mc8l/t_f2mc8l.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application F2MC8L --------------------------+ +|                                                                            | +|        This is a (synthetic) test of the F2MC8L's instruction set          | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_f2mc8l/t_f2mc8l.ori b/tests/t_f2mc8l/t_f2mc8l.ori Binary files differnew file mode 100644 index 0000000..3f1f4ae --- /dev/null +++ b/tests/t_f2mc8l/t_f2mc8l.ori diff --git a/tests/t_fl90/asflags b/tests/t_fl90/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_fl90/asflags diff --git a/tests/t_fl90/cpu_time.inc b/tests/t_fl90/cpu_time.inc new file mode 100644 index 0000000..bb23594 --- /dev/null +++ b/tests/t_fl90/cpu_time.inc @@ -0,0 +1,170 @@ +; CPU_TIME.INC +;****************************************************************************** +;* Zeitmessmodul fr TLCS 90                                                  * +;*                                                                            * +;* Originale fr den TLCS 900 von Oli(ver Sellke)                             * +;* Implementierung TLCS 90 von Alfred Arnold, Dezember 1993                   * +;*                                                                            * +;*  Routine     Funktion                Eingabe Ausgabe  Stack    L„nge       * +;*                                                                            * +;* InitTimer    Timer initialisieren     ----    ----    0 Byte   6 Byte      * +;* StartTimer   Timer starten            ----    ----    0 Byte   7 Byte      * +;* StopTime     Timer stoppen & Ausgabe  ----    ----    6 Byte 117 Byte *)   * +;*                                                                            * +;*      *) bei hoher Aufl”sung                                                * +;*                                                                            * +;* - Die Routinen benutzen Timer 4, dieser darf nicht von der Anwendung       * +;*   benutzt werden!!                                                         * +;* - Die Aufl”sung kann ber das Symbol BigTime umgeschaltet werden:          * +;*                                                                            * +;*       BigTime       Aufl”sung    Maximalzeit                               * +;*       definiert      0,8 us       52,428 ms                                * +;*       undefiniert   12,8 us      838,848 ms                                * +;*                                                                            * +;* - Die Datei MON.INC wird fr die Einsprnge des TDBTMP90-Monitors ben”tigt.* +;* - MACROS.INC muá vorher eingebunden werden                                 * +;*                                                                            * +;****************************************************************************** + +                section CPU_Time + +;------------------------------------------------------------------------------ +; Monitoreinsprungadressen laden + +                include "mon.inc" + +;------------------------------------------------------------------------------ +; Timer vorinitialisieren + +                proc    InitTimer +                ifdef   BigTime +                 ld      (T4MOD),00100010b ; nur Software-Capture, Phi16 +                elseif +                 ld      (T4MOD),00100001b ; nur Software-Capture, Phi1 +                endif +                set     5,(TRUN)        ; Vorteiler starten +                res     4,(TRUN)        ; Timer steht noch +                ret +                endp + +;------------------------------------------------------------------------------ +; Timer starten + +                proc    StartTimer +                set     2,(T4MOD)       ; Timer l”schen +                res     2,(T4MOD) +                set     4,(TRUN)        ; Timer starten +                ret +                endp + +;------------------------------------------------------------------------------ +; Timer stoppen & Wert auf Konsole ausgeben + +                subproc Div24 + +                ld      b,16            ; A-HL : B = HL und A +DivLoop:        sll     l               ; Divident hochschieben +                rl      h +                rla +                srl     h               ; fr nachher +                rr      l +                sub     a,c             ; paát Divisor hinein ? +                jr      nc,DivOK +                add     a,c             ; nein, zurcknehmen +                scf                     ; ins Ergebnis 0 einschieben +DivOK:          ccf                     ; neues Ergebnisbit +                rl      l               ; Ergebnis in HL einschieben +                rl      h +                djnz    DivLoop +                ret + +                endp + + +                proc    StopTimer + +                push    af              ; Register retten +                push    hl +                push    de +                push    bc + +                res     5,(T4MOD)       ; Wert im CAP1 latchen +                res     4,(TRUN)        ; Timer wieder anhalten +                ld      hl,(CAP1L)      ; Wert auslesen + +                ifdef   BigTime +                 ld     a,h             ; groáe Periode: x128... +                 ld     h,l +                 ld     l,0 +                 srla +                 rr     h +                 rr     l +                 ld     c,100           ; ...Teilen durch 100 +                elseif +                 ld     a,0             ; kleine Periode: x8... +                 rept   3 +                  sll   l +                  rl    h +                  rla +                 endm +                 ld     c,10            ; ...Teilen durch 10 +                endif +                call    Div24           ; Division durchfhren +                ifdef   BigTime         ; Kommatrennung fr groáe Periode +                 ld     a,0 +                 call   Div24 +                 ld     d,a             ; Rest merken +                endif +                ld      e,0             ; Zeichenz„hler nullen +                ld      c,10            ; Teilerfaktor konstant +InLoop:         ld      a,0             ; Erweiterung auf 24 Bit +                call    Div24           ; einmal teilen +                push    af              ; Zeichen auf LIFO merken +                inc     e               ; ein Zeichen mehr +                or      hl,hl           ; noch etwas brig ? +                jr      nz,InLoop +                ld      a,5             ; Leerzeichen fr Ausrichtung +                sub     a,e             ; Zahl berechnen +                jr      z,OutErg        ; Nullschleife abfangen +                ld      b,a             ; ansonsten passende Zahl Leerzeichen +BlankLoop:      call    BLAUS           ; voranstellen +                djnz    BlankLoop +OutErg:         ld      b,e             ; jetzt die Zeichen ausgeben +OutLoop:        pop     af +                add     a,'0' +                call    CONOUT +                djnz    OutLoop +                ifdef   BigTime         ; bei groáer Aufl”sung Nachkommastellen +                 ld     a,'.' +                 call   CONOUT +                 ld     l,d             ; Zehner/Einerzerlegung +                 ld     h,0 +                 div    hl,c +                 add    hl,'00' +                 ld     a,l +                 call   CONOUT +                 ld     a,h +                 call   CONOUT +                 call   BLAUS +                 ld     a,'m' +                elseif +                 ld     a,' ' +                 call   CONOUT +                 ld     a,'u' +                endif +                call    CONOUT          ; Ausgabe Einheit +                ld      a,'s' +                call    CONOUT + +                pop     bc              ; Register zurck +                pop     de +                pop     hl +                pop     af + +                ret +                endp + +;------------------------------------------------------------------------------ +; gemeinsames Ende + +                endsection diff --git a/tests/t_fl90/float.inc b/tests/t_fl90/float.inc new file mode 100644 index 0000000..7355130 --- /dev/null +++ b/tests/t_fl90/float.inc @@ -0,0 +1,1601 @@ +; FLOAT.INC +;****************************************************************************** +;* Gleitkommabibliothek fr TLCS 90                                           * +;*                                                                            * +;* Originale fr den Z80 aus mc 12/88,1/89                                    * +;* Portierung auf TLCS 90 von Alfred Arnold, Dezember 1993                    * +;*                                                                            * +;*  Routine  Funktion             Eingabe Ausgabe  Stack    L„nge  Zeit/10MHz * +;*                                                                            * +;*  fadd     Addition             2*Stack  BC-DE  14 Byte 347 Byte   248 us   * +;*  fsub     Subtraktion          2*Stack  BC-DE  14 Byte  12 Byte   255 us   * +;*  fmul     Multiplikation       2*Stack  BC-DE  20 Byte 356 Byte   936 us   * +;*  fdiv     Division             2*Stack  BC-DE  22 Byte 303 Byte  1081 us   * +;*  fmul2    Mult. mit 2er-Potenz Stack,A  BC-DE  10 Byte 162 Byte    28 us   * +;*  fsqrt    Quadratwurzel        Stack    BC-DE  22 Byte 621 Byte  1900 us   * +;*  fitof    Int-->Float          Stack    BC-DE  10 Byte  84 Byte  160 us *) * +;*  fftoi    Float-->Int          Stack    BC-DE  10 Byte 104 Byte  170 us *) * +;*  fftoa    Float-->ASCII        3*Stack  -----  40 Byte 451 Byte     *)     * +;*  fatof    ASCII-->Float        Stack  C,BC-DE  42 Byte 396 Byte     *)     * +;*                                                                            * +;*  *) Die Ausfhrungszeiten streuen je nach Operand sehr stark und k”nnen    * +;*     bei den ASCII-Funktionen bei vielen Millisekunden liegen.              * +;*                                                                            * +;*  - Parametereingabe ber den Stack bedeutet, daá die Parameter mittels     * +;*    PUSH vor dem Aufruf auf den Stack gelegt werden mssen.  Diese Werte    * +;*    werden von den Unterroutinen am Ende automatisch vom Stack entfernt.    * +;*    Der zur šbergabe ben”tigte Platz ist bei den Angaben zur Stackbelastung * +;*    eingerechnet!                                                           * +;*  - Wollen Sie einzelne Routinen entfernen, so beachten Sie, daá fsub Teile * +;*    aus fadd, fdiv Teile aus fmul sowie fftoi Teile aus fitof verwendet !   * +;*  - Gleitkommaformat ist IEEE Single (32 Bit)                               * +;*  - Integerwerte bei fmul2, fitof und fftoi sind vorzeichenbehaftet         * +;*  - Da die Routinen lokale Labels verwenden, ist mindestens AS 1.39 erfor-  * +;*    derlich                                                                 * +;*  - MACROS.INC muá vorher eingebunden werden                                * +;****************************************************************************** + +                section float + +;------------------------------------------------------------------------------ +; modulglobale Konstanten + +MaxExpo         equ     255 +Bias            equ     127 + +OpSize          equ     4               ; Gr”áe eines Operanden + +fIX_alt         equ     0               ; Top of Stack liegt IX +FAdr            equ     2               ; Rcksprungadresse +Op2             equ     4               ; Adresse Operand 2 +Op1             equ     Op2+OpSize      ; Adresse Operand 1 + +Ld10:           dd      ld(10) +One:            dd      1.0 +Ten:            dd      10.0 +Tenth:          dd      3dcccccdh       ; =0.1, aber die Rundung auf manchen +					; Systemen variiert (damit Test nicht +					; scheitert) +Half:           dd      0.5 + +cpsh            macro   reg,op,{NoExpand} +                ld      reg,(op+2) +                push    reg +                ld      reg,(op) +                push    reg +                endm + +;------------------------------------------------------------------------------ +; Addition + +                proc    fadd +                link    ix,0            ; Eintritt + +                push    af              ; Register retten +                push    hl + +                public  AddSub:Parent   ; Einsprung fr fsub + +AddSub:         ld      a,(ix+Op1+3)    ; Vorzeichen Operand 1 laden +                ld      e,a             ; Ergebnisvorzeichen in E, Bit 7 +                xor     a,(ix+Op2+3)    ; mit Vorzeichen von Op2 verknpfen +                ld      d,a             ; Subtraktionsflag in D, Bit 7 +                res     7,(ix+Op1+3)    ; Vorzeichen in Mantisse 1 l”schen +                res     7,(ix+Op2+3)    ; Vorzeichen in Mantisse 2 l”schen + +; Die Operanden sind jetzt in der Form 0eee eeee efff ... ffff + +                ld      hl,(ix+Op1)     ; Differenz Op1-Op2 bilden +                sub     hl,(ix+Op2) +                ld      hl,(ix+Op1+2) +                sbc     hl,(ix+Op2+2) +                jr      nc,Ad_1         ; Sprung falls Op1>Op2 +                ld      bc,(ix+Op1)     ; ansonsten Operanden vertauschen +                ex      bc,(ix+Op2) +                ld      (ix+Op1),bc +                ld      bc,(ix+Op1+2) +                ex      bc,(ix+Op2+2) +                ld      (ix+Op1+2),bc +                ld      a,e             ; Ergebnisvorzeichen neu berechnen +                xor     a,d +                ld      e,a + +Ad_1:           ld      a,(ix+Op1+2)    ; Exponent der gr”áeren Zahl laden +                ld      c,(ix+Op1+3) +                slaa +                rl      c +                jr      z,Den1 +                set     7,(ix+Op1+2)    ; implizite Eins erzeugen +Den1:           ld      a,(ix+Op2+2)    ; dito Zahl 2 +                ld      b,(ix+Op2+3) +                slaa +                rl      b +                jr      z,Den2 +                set     7,(ix+Op2+2) + +Den2:           push    bc              ; jetzt die Register fr den +                push    de              ; Blocktransferbefehl retten +                ld      bc,2*OpSize-1   ; beide Operanden verschieben +                ld      hl,ix           ; HL zeigt auf letztes Byte +                add     hl,Op2+2*OpSize-1 +                ld      de,hl           ; HL nach DE kopieren +                dec     hl              ; HL zeigt auf vorletztes Byte +                lddr                    ; Verschiebung beider Mantissen +                pop     de              ; um 8 Bit nach links +                pop     bc + +                xor     a,a +                ld      (ix+Op1),a      ; Form: ffff ... ffff 0000 0000 +                ld      (ix+Op2),a +                ld      a,c             ; Differenz der Exponenten berechnen +                sub     a,b +                ld      b,a             ; Differenz nach B fr LOOP-Befehl +                jr      z,N_Anp         ; falls Null, keine Anpassung +                cp      a,25            ; mehr als 24? (Abfrage mit Carry +                jp      c,Anp           ; erfordert Vergleich mit 25) +                ld      b,0             ; !!!! +                jp      Round + +Anp:            srl     (ix+Op2+3)      ; Anpassung der zweiten Mantisse +                rr      (ix+Op2+2)      ; durch Verschiebung nach rechts +                rr      (ix+Op2+1) +                rr      (ix+Op2) +                djnz    Anp             ; bis B=0 + +N_Anp:          bit     7,d             ; Addition oder Subtraktion ? +                jr      nz,Subtract     ; ggfs. zur Subtraktion springen +                ld      hl,(ix+Op1)     ; jetzt werden die beiden Mantissen +                add     hl,(ix+Op2)     ; zueinander addiert +                ld      (ix+Op1),hl +                ld      hl,(ix+Op1+2) +                adc     hl,(ix+Op2+2) +                ld      (ix+Op1+2),hl +                jr      nc,Round        ; kein šberlauf-->zum Runden +                rr      (ix+Op1+3)      ; šberlauf einschieben +                rr      (ix+Op1+2) +                rr      (ix+Op1+1) +                rr      (ix+Op1) +                inc     bc              ; Exponent erh”hen (B ist 0 durch +                jr      Round           ; Schleife), zum Runden + +Subtract:       ld      hl,(ix+Op1)     ; beide Mantissen werden voneinander +                sub     hl,(ix+Op2)     ; subtrahiert +                ld      (ix+Op1),hl +                ld      hl,(ix+Op1+2) +                sbc     hl,(ix+Op2+2) +                ld      (ix+Op1+2),hl +                jr      m,Round         ; bei fhrender Eins zum Runden +                jr      nz,Norm         ; ungleich 0 ?  Dann zum Normalisieren +                cp      hl,(ix+Op1)     ; Rest der Mantisse auch Null ? +                jr      eq,Zero         ; alles Null --> Ergebnis ist Null + +Norm:           ld      a,b             ; Exponent noch nicht Null ? +                or      a,c +                jr      z,Round +                dec     bc              ; Exponent erniedrigen +                sla     (ix+Op1)        ; Mantisse normalisieren, bis +                rl      (ix+Op1+1)      ; fhrende Eins auftaucht +                rl      (ix+Op1+2) +                rl      (ix+Op1+3) +                jr      p,Norm          ; noch keine Eins-->weitermachen + +Round:          add     (ix+Op1),80h    ; jetzt Runden auf Bit hinter Mantisse +                jr      nc,NoOver       ; kein šbertrag ? +                inc     (ix+Op1+1)      ; doch, n„chstes Mantissenbyte +                jr      nz,NoOver       ; behandeln, jetzt auf Null prfen, +                inc     (ix+Op1+2)      ; da der INC-Befehl kein Carry liefert +                jr      nz,NoOver +                inc     (ix+Op1+3) +                jr      nz,NoOver +                scf                     ; fhrende Eins erzeugen +                rr      (ix+Op1+3)      ; bei šberlauf Mantisse durch +                rr      (ix+Op1+2)      ; Rechtsschieben wieder normalisieren +                rr      (ix+Op1+1)      ; (nur fr 24 Bit notwendig) +                inc     bc              ; und Exponent korrigieren + +NoOver:         xor     a,a             ; A = 0 +                cp      a,(ix+Op1+3)    ; Mantisse auf Null prfen +                jr      nz,NoZero +                cp      a,(ix+Op1+2) +                jr      nz,NoZero +                cp      a,(ix+Op1+1)    ; alle Mantissenbytes Null ? +                jr      nz,NoZero       ; dann ist auch das Ergebnis Null + +Zero:           ld      b,a             ; Null-Ergebnis aufbauen +                ld      c,a +                ld      de,bc +                jr      Exit            ; dann Routine verlassen + +NoZero:         cp      a,b             ; A ist Null +                ld      a,MaxExpo       ; Exponent oberes Byte ungleich Null ? +                jr      nz,Over         ; dann ist šberlauf eingetreten +                cp      a,c             ; oder genau MaxExpo erreicht ? +                jr      nz,NoUe +Over:           ld      c,a             ; Exponent auf MaxExpo setzen +                xor     a,a             ; und Mantisse auf Null +                ld      (ix+Op1+3),a +                ld      (ix+Op1+2),a +                ld      (ix+Op1+1),a +                jr      DeNorm + +NoUe:           xor     a,a             ; A = 0 +                cp      a,c             ; Exponent Null (Zahl denormalisiert ? +                jr      z,DeNorm        ; ja --> +                sla     (ix+Op1+1)      ; fhrendes Bit wird nicht gespeichert +                rl      (ix+Op1+2)      ; daher Mantisse um 1 Bit nach links +                rl      (ix+Op1+3) + +DeNorm:         ld      b,c             ; Ergebnis aufbauen: Exponent in B +                ld      c,(ix+Op1+3)    ; Mantisse oberstes Byte +                ld      d,(ix+Op1+2) +                sla     e               ; Vorzeichen aus E in Carry schieben +                ld      e,(ix+Op1+1) +                rr      b               ; Vorzeichen in Ergebnis einschieben +                rr      c +                rr      d +                rr      e + +Exit:           pop     hl              ; Register restaurieren +                pop     af + +                unlk    ix              ; Austritt +                retd    2*OpSize        ; Parameter abr„umen +                endp + +;------------------------------------------------------------------------------ +; Subtraktion + +                proc    fsub + +                link    ix,0            ; Eintritt + +                push    af              ; Register retten +                push    hl + +                xor     (ix+Op2+3),80h  ; Vorzeichen Operand 2 kippen + +                jrl     AddSub          ; weiter wie Addition + +                endp + +;------------------------------------------------------------------------------ +; Multiplikation + +                proc    fmul + +                DefLocal temp,6         ; Platz Tempor„rvariable + +                link    ix,LocalSize    ; Platz auf Stack reservieren + +                push    af              ; Register retten +                push    hl + +                ld      a,(ix+Op1+3)    ; Ergebnisvorzeichen bestimmen +                xor     a,(ix+Op2+3) +                ld      c,a             ; in C merken + +                ld      d,0             ; Exponent 1 laden +                ld      e,(ix+Op1+3) +                ld      a,(ix+Op1+2) +                slaa                    ; Exponent unterstes Bit in Carry +                rl      e               ; und in E einschieben +                srla                    ; ergibt Bit 7=0 +                ld      (ix+Op1+3),a    ; impl. Null vorbesetzen+um 8 Bit schieben +                cp      e,0 +                jr      z,Den1          ; falls Null, dann denormalisiert +                set     7,(ix+Op1+3)    ; ansonsten impl. Eins erzeugen +                dec     de              ; Bias kompensieren +Den1:           ld      hl,(ix+Op1)     ; jetzt restliche Bytes verschieben +                ld      (ix+Op1+1),hl +                xor     hl,hl           ; unterste Mantissenbits l”schen +                ld      (ix+Op1),h      ; Form: ffff ... ffff 0000 0000 + +                ld      (ix+temp+4),hl  ; lokale Variable mit Null vorbesetzen +                ld      (ix+temp+2),hl +                ld      (ix+temp),hl + +                ld      l,(ix+Op2+3)    ; Exponent 2 in HL aufbauen +                ld      a,(ix+Op2+2) +                res     7,(ix+Op2+2)    ; gleiches Verfahren wie Op1 +                slaa +                rl      l +                jr      z,Den2 +                set     7,(ix+Op2+2) +                dec     hl +Den2: +                add     hl,de           ; Exponenten aufaddieren +                sub     hl,Bias-3       ; Bias-3 subtrahieren +                jp      p,NoZero        ; positiv-->kein Unterlauf +                ld      a,l             ; Exponent <-24 ? +                cp      a,-24 +                jr      nc,NoZero +                jp      MulZero         ; ja, dann ist Ergebnis Null + +NoZero:         ld      b,24            ; Schleifenz„hler Multiplikation +                ld      de,0            ; Hilfsregister Multiplikand +                push    hl              ; HL zum Addieren benutzen +Multiply:       srl     (ix+Op1+3)      ; Multiplikand nach rechts schieben +                rr      (ix+Op1+2) +                rr      (ix+Op1+1) +                rr      (ix+Op1) +                rr      d               ; DE als Verl„ngerung von Operand 1 +                rr      e +                sla     (ix+Op2)        ; Multiplikator nach links schieben +                rl      (ix+Op2+1) +                rl      (ix+Op2+2)      ; falls fhrendes Bit 0, nicht addieren +                jr      nc,NoAdd +                ld      hl,(ix+temp)    ; sonst aufaddieren +                add     hl,de +                ld      (ix+temp),hl +                ld      hl,(ix+temp+2) +                adc     hl,(ix+Op1) +                ld      (ix+temp+2),hl +                ld      hl,(ix+temp+4) +                adc     hl,(ix+Op1+2) +                ld      (ix+temp+4),hl +NoAdd:          djnz    Multiply        ; Schleife durchlaufen +                pop     hl +                ld      a,(ix+temp+5) +                or      a,a             ; Flags setzen +                jp      m,MulRound      ; bei fhrender Eins zum Runden +                jr      nz,Normalize    ; ansonsten normalisieren +                cp      a,(ix+temp+4) +                jr      nz,Normalize +                cp      a,(ix+temp+3) +                jr      nz,Normalize +                cp      a,(ix+temp+2) +                jr      Normalize +                jp      MulZero         ; komplett Null-->Ergebnis Null + +Normalize:      bit     7,h             ; Exponent negativ ? +                jp      nz,Underrun     ; ggf. Unterlauf behandlen + +Norm1:          cp      hl,0            ; Exponent=0 ? +                jr      z,MulRound +                dec     hl              ; Exponent erniedrigen, +                sla     (ix+temp)       ; Mantisse verschieben... +                rl      (ix+temp+1) +                rl      (ix+temp+2) +                rl      (ix+temp+3) +                rl      (ix+temp+4) +                rl      (ix+temp+5) +                jp      p,Norm1         ; ...bis fhrende Eins auftaucht + +                public  MulRound:Parent ; Einsprung fr Division +MulRound:       ld      a,(ix+temp+2)   ; jetzt Runden auf Bit hinter Mantisse +                add     a,80h +                jr      nc,NoOver       ; kein šbertrag +                inc     (ix+temp+3)     ; doch, n„chstes Mantissenbyte +                jr      nz,NoOver       ; behandeln, jetzt auf Null prfen +                inc     (ix+temp+4)     ; da INC kein Carry liefert +                jr      nz,NoOver +                inc     (ix+temp+5) +                jr      nz,NoOver +                scf                     ; Eins erzeugen +                rr      (ix+temp+5)     ; bei šberlauf Mantisse durch +                rr      (ix+temp+4)     ; Rechtsschieben wieder normalisieren +                rr      (ix+temp+3) +                inc     hl              ; und Exponent korrigieren + +NoOver:         cp      hl,MaxExpo      ; Exponent prfen +                jr      ult,NoUeber     ; kein šberlauf + +                public  MulOver:Parent  ; Einsprung fr fdiv +MulOver:        ld      hl,MaxExpo      ; šberlauf: Exponent=MaxExpo +                ld      (ix+temp+5),h +                ld      (ix+temp+4),h +                ld      (ix+temp+3),h +                jr      DeNorm + +NoUeber:        xor     a,a             ; A=0 +                cp      a,l             ; Exponent ist Null ? +                jr      z,DeNorm        ; ja, Ergebnis ist denormalisiert +                sla     (ix+temp+3)     ; nein, fhrende=implizite Eins +                rl      (ix+temp+4)     ; rausschieben +                rl      (ix+temp+5) + +DeNorm:         sla     c               ; Vorzeichen in Carry schieben +                ld      b,l             ; Exponent einsetzen +                ld      c,(ix+temp+5) +                ld      d,(ix+temp+4) +                ld      e,(ix+temp+3) +                rr      b               ; und Vorzeichen einschieben +                rr      c +                rr      d +                rr      e               ; Form: seee eeee efff ffff ... ffff + +Result:         pop     hl              ; Register zurck +                pop     af + +                unlk    ix              ; Stackrahmen abbauen +                retd    2*OpSize        ; Operanden abr„umen + +                public  MulZero:Parent  ; Einsprung fr fdiv +MulZero:        xor     a,a             ; Ergebnis ist Null +                ld      b,a +                ld      c,a +                ld      d,a +                ld      e,a +                jr      Result + +Underrun:       ld      a,l             ; Exponent in A +                neg     a               ; negieren fr Schleifenz„hler +                cp      a,24            ; totaler Unterlauf ? +                jr      nc,MulZero      ; ja, dann ist Ergebnis Null +                ld      b,a             ; Mantisse denormalisieren +Shr:            srl     (ix+temp+5)     ; bis Exponent Null ist +                rr      (ix+temp+4) +                rr      (ix+temp+3) +                djnz    Shr +                ld      l,b             ; Exponent in Register L=B=0 +                jp      Denorm          ; denormalisiertes Ergebnis erzeugen + +                endp + +;------------------------------------------------------------------------------ +; Division + +                proc    fdiv + +                DefLocal temp,6         ; Platz Tempor„rvariable + +                link    ix,LocalSize    ; 6 Byte Platz auf Stack reservieren + +                push    af              ; Register retten +                push    hl + +                ld      a,(ix+Op1+3)    ; Ergebnisvorzeichen bestimmen +                xor     a,(ix+Op2+3) +                ld      c,a             ; Vorzeichen in C Bit 7 merken +                push    bc              ; Vorzeichen retten + +                ld      h,0             ; Exponent 1 laden +                ld      l,(ix+Op1+3) +                ld      a,(ix+Op1+2) +                res     7,(ix+Op1+2)    ; impl. Null vorbesetzen +                slaa                    ; Exponent unterstes Bit in Carry +                rl      l               ; und in L einschieben +                jr      z,Den1          ; falls Null, dann Op1 denormalisiert +                set     7,(ix+Op1+2)    ; implizite Eins erzeugen +                dec     hl              ; Bias kompensieren +Den1: +                ld      d,0             ; Exponent 2 in DE aufbauen +                ld      e,(ix+Op2+3) +                ld      a,(ix+Op2+2) +                ld      (ix+Op2+3),a    ; Verfahren wie oben +                res     7,(ix+Op2+3) +                slaa +                rl      e +                jr      z,Den2 +                set     7,(ix+Op2+3) +                dec     de +Den2: +                ld      bc,(ix+Op2)     ; jetzt restliche Bytes kopieren +                ld      (ix+Op2+1),bc +                xor     a,a             ; A=0 +                ld      (ix+Op2),a      ; Form: ffff ... ffff 0000 0000 +                srl     (ix+Op2+3) +                rr      (ix+Op2+2) +                rr      (ix+Op2+1) +                rr      (ix+Op2)        ; Form: 0fff ... ffff f000 0000 +                jr      nz,NoZero1      ; Mantisse 2 auf Null prfen +                cp      a,(ix+Op2+1) +                jr      nz,NoZero1 +                cp      a,(ix+Op2+2) +                jr      nz,NoZero1 +                cp      a,(ix+Op2+3) +                jr      nz,NoZero1 +                jp      MulOver + +NoZero1:        xor     a,a             ; Carry-Flag l”schen +                sbc     hl,de           ; Exponenten subtrahieren +                add     hl,Bias         ; Bias addieren +                jr      p,NoZero        ; Exponent negativ ? +                cp      l,-24           ; Exponent kleiner als -24 ? +                jr      nc,NoZero +                jp      MulZero         ; ja, dann ist das Ergebnis Null +NoZero: +                add     hl,25           ; Exponent um 25 erh”hen; jetzt ist er sicher gr”áer als Null +                xor     a,a             ; A=0 +                ld      bc,(ix+Op1+1)   ; Divident in Register kopieren +                ld      d,(ix+Op1) +                ld      e,a             ; die untersten Bits sind Null +                cp      a,d             ; ist Divident Null ? +                jr      nz,NoZero2 +                cp      a,c +                jr      nz,NoZero2 +                cp      a,b +                jr      nz,NoZero2 +                pop     bc              ; Stack bereinigen (Vorzeichen laden) +                jp      MulZero         ; und Null als Ergebnis ausgeben +NoZero2: +                ld      (ix+temp+5),a   ; Ergebnis vorbesetzen +                ld      (ix+temp+4),a +                ld      (ix+temp+3),a +                ld      (ix+temp+2),a + +NormLoop:       bit     6,(ix+Op2+3)    ; ist der Divisor normalisiert ? +                jr      nz,Norm         ; ja--> +                inc     hl              ; nein, Exponent erh”hen +                sla     (ix+Op2)        ; Divisor verschieben bis in +                rl      (ix+Op2+1)      ; Form 01ff ... +                rl      (ix+Op2+2) +                rl      (ix+Op2+3) +                jr      NormLoop +Norm:           srl     b +                rr      c +                rr      d +                rr      e               ; Form: 0fff ... ffff f000 0000 + +                push    iy              ; Exponent nach IY +                ld      iy,hl +Loop:           ld      (ix+Op1+2),bc   ; Divident zwischenspeichern +                                        ; die Speicherpl„tze von Op1 +                ld      (ix+Op1),de     ; stehen zur Verfgung, da wir Op1 +                                        ; in die Register BC-DE kopiert haben +                ld      hl,de           ; jetzt Divisor abziehen +                sub     hl,(ix+Op2) +                ld      de,hl +                ld      hl,bc +                sbc     hl,(ix+Op2+2) +                ld      bc,hl +                jr      nc,IsOne        ; kein Carry: Divisor paát +                ld      de,(ix+Op1)     ; ansonsten zurckkopieren +                ld      bc,(ix+Op1+2)   ; Carry bleibt erhalten! +IsOne:          ccf                     ; Carry-Flag umdrehen +                rl      (ix+temp+2)     ; Ergebnis aufbauen +                rl      (ix+temp+3) +                rl      (ix+temp+4) +                rl      (ix+temp+5) +                sla     e               ; Divident verschieben +                rl      d +                rl      c +                rl      b + +                add     iy,-1           ; Exponent erniedrigen +                jr      z,DeNorm        ; falls Null, dann denormalisiert +                bit     0,(ix+temp+5)   ; fhrende Eins in Ergebnis-Mantisse ? +                jr      z,Loop          ; nein, weiter rechnen + +DeNorm:         ld      hl,iy           ; Exponent zurck +                ld      b,(ix+temp+5)   ; h”chstes Bit merken +                ld      a,(ix+temp+4) +                ld      (ix+temp+5),a   ; Mantisse in Form +                ld      iy,(ix+temp+2)  ; ffff ... ffff 0000 0000 +                ld      (ix+temp+3),iy +                pop     iy              ; IY erst jetzt freigeben +                rr      b               ; h”chstes Bit einschieben +                rr      (ix+temp+5) +                rr      (ix+temp+4) +                rr      (ix+temp+3) +                rr      (ix+temp+2) + +                pop     bc              ; Vorzeichen wieder laden +                xor     a,a             ; A=0 +                cp      a,(ix+temp+5)   ; Mantisse ist Null ? +                jr      nz,NoZero3 +                cp      a,(ix+temp+4) +                jr      nz,NoZero3 +                cp      a,(ix+temp+3) +                jr      nz,NoZero3 +                cp      a,(ix+temp+2) +                jp      z,MulZero +NoZero3: +                jp      MulRound + +                endp + +;------------------------------------------------------------------------------ +; Wandlung Integer-->Gleitkomma + +                proc    fitof + +                link    ix,0            ; Stackrahmen aufbauen +                push    af              ; Register retten +                push    hl + +                ld      bc,(ix+Op2+2)   ; Operanden hereinholen +                ld      de,(ix+Op2)     ; Reihenfolge: BCDE + +                ld      hl,bc           ; Operand = 0 ? +                or      hl,de +                jr      z,ItofResult    ; dann Ergebnis Null + +                bit     7,b             ; Zahl positiv ? +                jr      z,Positive +                ld      hl,bc           ; dann Zahl negieren +                xor     hl,-1 +                ld      bc,hl +                ld      hl,de +                xor     hl,-1 +                inc     hl +                or      hl,hl +                ld      de,hl +                jr      nz,Positive +                inc     bc + +Positive:       ld      l,Bias+32       ; Exponent vorbesetzen +Shift:          dec     l +                sla     e               ; Mantisse verschieben, bis fhrende +                rl      d               ; Eins auftaucht +                rl      c +                rl      b +                jr      nc,Shift +                ld      e,d             ; Exponent einsetzen +                ld      d,c +                ld      c,b +                ld      b,l +                sla     (ix+Op2+3)      ; Vorzeichen in Carry +                rr      b               ; ins Ergebnis einschieben +                rr      c +                rr      d +                rr      e + +                public  ItofResult:Parent +ItofResult:     pop     hl              ; Register zurck +                pop     af +                unlk    ix              ; abbauen +                retd    4               ; Ende + +                endp + +;------------------------------------------------------------------------------ +; Wandlung Gleitkomma-->Integer + +                proc    fftoi + +                link    ix,0            ; Stackrahmen aufbauen + +                push    af              ; Register retten +                push    hl + +                ld      d,(ix+Op2)      ; Operand in Register laden +                ld      bc,(ix+Op2+1)   ; Reihenfolge: EBCD +                ld      e,(ix+Op2+3)    ; erspart sp„ter Vertauschungen + +                ld      h,e             ; Vorzeichen in H, Bit 7 +                ld      a,e             ; Exponent in A aufbauen +                sla     b               ; LSB aus B holen +                rla +                scf                     ; impl. Eins einschieben +                rr      b +                sub     a,Bias +                ld      l,a             ; Exponent nach L kopieren +                jp      m,Zero          ; falls keiner Null, Ergebnis Null +                ld      a,30 +                cp      a,l             ; gr”áer 30 ? +                jr      c,Over          ; dann šberlauf +                ld      e,0             ; Zahl jetzt in BCDE in der Form +                inc     a               ; 1fff ... ffff 0000 0000 + +Shift:          srl     b               ; jetzt Mantisse verschieben +                rr      c +                rr      d +                rr      e +                inc     l +                cp      a,l             ; bis Exponent stimmt +                jr      nz,Shift +                bit     7,h             ; Zahl negativ ? +                jr      z,ItofResult    ; nein, fertig + +                ld      hl,de           ; Zahl negieren +                xor     hl,-1 +                ld      de,hl +                ld      hl,bc +                xor     hl,-1 +                ld      bc,hl +                inc     de +                jr      nz,ItofResult +                inc     bc +                jr      nz,ItofResult + +Zero:           ld      bc,0 +                ld      de,bc +                jp      ItofResult      ; Ergebnis Null + +Over:           bit     7,h             ; Ergebnis positiv ? +                jr      z,OpPos +                ld      b,80h           ; MININT laden +                xor     a,a             ; A=0 +                ld      c,a +                ld      d,a +                ld      e,a +                jp      ItofResult +OpPos:          ld      b,7fh           ; MAXINT laden +                ld      a,0ffh +                ld      c,a +                ld      d,a +                ld      e,a +                jp      ItofResult + +                endp + +;------------------------------------------------------------------------------ +; Multiplikation mit Zweierpotenz (in A) + +                proc    fmul2 + +                link    ix,0            ; Stackrahmen aufbauen + +                push    af              ; Register retten +                push    hl + +                ld      de,(ix+Op2)     ; Operand 1 in Register laden +                ld      bc,(ix+Op2+2) + +                ld      h,a             ; Operand 2 nach H kopieren +                ld      l,b             ; Vorzeichen nach L, Bit 7 +                xor     a,a             ; A=0 +                cp      a,b             ; Operand 1 = Null ? +                jr      nz,NoZero +                cp      a,c +                jr      nz,NoZero +                cp      a,d +                jr      nz,NoZero +                cp      a,e +                jr      z,Zero + +NoZero:         sla     e               ; Operand 1 verschieben +                rl      d +                rl      c +                rl      b               ; Form: eeee eeee ffff ... fff0 +                jr      z,Den           ; Falls Exponent Null -->denormal + +                add     a,h             ; A=0+H +                jr      m,Div           ; Falls Op2<0-->Division +                add     a,b             ; A=Summe der Exponenten +                ld      b,a             ; zurck nach B +                jr      c,Over          ; bei šberlauf--> +                cp      a,MaxExpo       ; oder genau MaxExpo +                jr      z,Over + +Result:         sla     l               ; Vorzeichen in Carry schieben +                rr      b +                rr      c +                rr      d +                rr      e               ; Ergebnis zusammensetzen + +Zero:           pop     hl              ; Register zurck +                pop     af + +                unlk    ix              ; Stackrahmen abbauen +                retd    4               ; Ende + +Over:           ld      b,MaxExpo       ; šberlauf: Exponent=MaxExpo +                xor     a,a             ;           Mantisse=0 +                ld      c,a +                ld      d,a +                ld      e,a +                jr      Result + +Div:            add     a,b             ; A = Summe der Exponenten +                ld      b,a             ; zurck nach B +                jr      z,Div2 +                jr      p,Result        ; falls >0, Ergebnis abliefern +Div2:           scf                     ; implizite Eins real machen +                rr      c +                rr      d +                rr      e               ; Form: eeee eeee 1fff ... ffff + +Denorm:         xor     a,a             ; A = 0 +                cp      a,b             ; Exponent Null ? +                jr      z,Result        ; ja, ergebnis abliefern +                srl     c +                rr      d +                rr      e               ; Mantisse denormalisieren +                jr      nz,NoZero2 +                cp      a,d +                jr      nz,NoZero2 +                cp      a,c +                jr      nz,NoZero2 +                ld      b,a             ; totaler Unterlauf, Ergebnis = Null +                jr      Zero + +NoZero2:        inc     b               ; Exponent erh”hen +                jr      Denorm          ; weiter denormalisieren + +DDD:            add     a,b             ; Summe der Exponenten bilden +                ld      b,a             ; zurck nach B +                jr      Denorm + +Den:            add     a,h             ; A=0+H +                jr      m,DDD           ; bei Division verzweigen +NoOver:         sla     e               ; Multiplikation: Eine +                rl      d               ; denormalisierte Mantisse +                rl      c               ; wird wieder normalisiert +                jr      c,Stop          ; bis fhrende Eins rausfliegt +                dec     h               ; oder Operand 2 = Null +                jr      nz,NoOver +                jr      Result + +Stop:           ld      a,h             ; Summe der Exponenten bilden +                add     a,b +                ld      b,a             ; zurck nach B +                jr      Result + +                endp + +;------------------------------------------------------------------------------ +; Quadratwurzel ziehen + +                proc    fsqrt + +Op              equ     4               ; Lage Parameter +                DefLocal XRoot,4        ; Iterationsvariablen +                DefLocal m2,4 +                DefLocal xx2,4 + +                link    ix,LocalSize    ; Stackrahmen aufbauen + +                push    af              ; Register retten +                push    hl +                push    iy + +                bit     7,(ix+Op+3)     ; negatives Argument ? +                jp      nz,DomainError  ; dann Fehler + +                ld      hl,(ix+Op+2)    ; Exponent isolieren +                and     hl,07f80h +                jp      z,Zero          ; keine Behandlung denormaler Zahlen + +                ld      (ix+Op+3),0     ; Mantisse isolieren +                and     (ix+Op+2),7fh +                sub     hl,7fh*80h      ; Bias vom Exponenten entfernen +                ld      bc,hl +                bit     7,c             ; Exponent ungerade ? +                res     7,c +                jr      z,EvenExp +                ld      hl,(ix+Op)      ; ja: Mantisse verdoppeln +                add     hl,hl +                ld      (ix+Op),hl +                ld      hl,(ix+Op+2) +                adc     hl,hl +                add     hl,100h-80h     ; impl. Eins dazu +                ld      (ix+Op+2),hl +EvenExp: +                sra     b               ; Exponent/2 mit Vorzeichen +                rr      c +                ld      hl,7fh*80h      ; Bias wieder dazu +                add     hl,bc +                ld      iy,hl           ; Exponent in IY aufheben +                ld      de,(ix+Op+1)    ; x ausrichten (um 7 nach links) +                ld      a,(ix+Op+3)     ; oberstes Byte merken +                ld      (ix+Op+2),de    ; da wir hier eins zuviel schieben +                ld      d,(ix+Op) +                ld      e,0 +                ld      (ix+Op),de +                srla                    ; dieses Bit einschieben +                rr      (ix+Op+3) +                rr      (ix+Op+2) +                rr      (ix+Op+1) +                rr      (ix+Op) +                ld      de,0            ; vorbelegen +                ld      (ix+XRoot),de +                ld      (ix+m2),de +                ld      d,40h +                ld      (ix+XRoot+2),de +                ld      d,10h +                ld      (ix+m2+2),de +Loop10:         ld      de,(ix+Op)      ; xx2 = x +                ld      (ix+xx2),de +                ld      de,(ix+Op+2) +                ld      (ix+xx2+2),de +Loop11:         ld      hl,(ix+xx2)     ; xx2 -= xroot +                sub     hl,(ix+XRoot) +                ld      (ix+xx2),hl +                ld      hl,(ix+xx2+2) +                sbc     hl,(ix+XRoot+2) +                ld      (ix+xx2+2),hl +                srl     (ix+XRoot+3)    ; xroot /= 2 +                rr      (ix+XRoot+2) +                rr      (ix+XRoot+1) +                rr      (ix+XRoot) +                ld      hl,(ix+xx2)     ; xx2 -= m2 +                sub     hl,(ix+m2) +                ld      (ix+xx2),hl +                ld      hl,(ix+xx2+2) +                sbc     hl,(ix+m2+2) +                ld      (ix+xx2+2),hl +                jr      m,DontSet1 +                ld      hl,(ix+xx2)     ; x = xx2 +                ld      (ix+Op),hl +                ld      hl,(ix+xx2+2) +                ld      (ix+Op+2),hl +                ld      hl,(ix+XRoot)   ; xroot += m2 +                or      hl,(ix+m2) +                ld      (ix+XRoot),hl +                ld      hl,(ix+XRoot+2) +                or      hl,(ix+m2+2) +                ld      (ix+XRoot+2),hl +                ld      hl,(ix+m2)      ; m2 /= 4 +                ld      de,(ix+m2+2) +                rept    2 +                 srl    d +                 rr     e +                 rr     h +                 rr     l +                endm +                ld      (ix+m2),hl +                ld      (ix+m2+2),de +                or      hl,de +                jr      nz,Loop11 +                jr      IsSame +DontSet1:       ld      hl,(ix+m2)      ; m2 /= 4 +                ld      de,(ix+m2+2) +                rept    2 +                 srl    d +                 rr     e +                 rr     h +                 rr     l +                endm +                ld      (ix+m2),hl +                ld      (ix+m2+2),de +                or      hl,de +                jp      nz,Loop10       ; 15* abarbeiten +                                        ; Bit 22..8 +                ld      hl,(ix+Op)      ; 17. Iteration separat +                ld      (ix+xx2),hl +                ld      hl,(ix+Op+2) +                ld      (ix+xx2+2),hl +IsSame:         ld      hl,(ix+xx2) +                sub     hl,(ix+XRoot) +                ld      (ix+xx2),hl +                ld      hl,(ix+xx2+2) +                sbc     hl,(ix+XRoot+2) +                ld      (ix+xx2+2),hl +                ld      de,(ix+XRoot+2) ; mitsamt Carry... +                ld      hl,(ix+XRoot) +                srl     d +                rr      e +                rr      h +                rr      l +                jr      nc,NoC1 +                set     7,d +NoC1:           ld      (ix+XRoot+2),hl ; auf neues Alignment umstellen +                ld      (ix+XRoot),de +                decw    (ix+xx2)        ; Carry von 0-$4000: xx2 -= m2 +                jr      nz,NoC2 +                decw    (ix+xx2+2) +NoC2:           bit     7,(ix+xx2+3) +                jr      nz,DontSet7 +                or      (ix+xx2+3),0c0h ; 0-$4000: x2 -= m2, Teil 2 +                ld      hl,(ix+xx2) +                ld      (ix+Op),hl +                ld      hl,(ix+xx2+2) +                ld      (ix+Op+2),hl +                or      (ix+XRoot+1),40h; xroot += m2 +DontSet7:       ld      hl,(ix+Op)      ; x auf neues Alignment umstellen +                ld      de,(ix+Op+2) +                ld      (ix+Op),de +                ld      (ix+Op+2),hl +                ld      hl,1000h        ; m2 - obere H„lfte schon 0 +                ld      (ix+m2),hl +Loop20:         ld      hl,(ix+Op)      ; xx2 = x +                ld      (ix+xx2),hl +                ld      hl,(ix+Op+2) +                ld      (ix+xx2+2),hl +Loop21:         ld      hl,(ix+xx2)     ; xx2 -= xroot +                sub     hl,(ix+XRoot) +                ld      (ix+xx2),hl +                ld      hl,(ix+xx2+2) +                sbc     hl,(ix+XRoot+2) +                ld      (ix+xx2+2),hl +                srl     (ix+XRoot+3)    ; XRoot = XRoot/2 +                rr      (ix+XRoot+2) +                rr      (ix+XRoot+1) +                rr      (ix+XRoot) +                ld      hl,(ix+xx2)     ; x2 -= m2 +                sub     hl,(ix+m2) +                ld      (ix+xx2),hl +                ld      hl,(ix+xx2+2) +                sbc     hl,(ix+m2+2) +                ld      (ix+xx2+2),hl +                jr      m,DontSet2 +                ld      hl,(ix+xx2)     ; x = xx2 +                ld      (ix+Op),hl +                ld      hl,(ix+xx2+2) +                ld      (ix+Op+2),hl +                ld      hl,(ix+XRoot)   ; xroot += m2 +                or      hl,(ix+m2) +                ld      (ix+XRoot),hl +                ld      hl,(ix+XRoot+2) +                or      hl,(ix+m2+2) +                ld      (ix+XRoot+2),hl +                ld      hl,(ix+m2)      ; m2 /= 4 +                ld      de,(ix+m2+2) +                rept    2 +                 srl    d +                 rr     e +                 rr     h +                 rr     l +                endm +                ld      (ix+m2),hl +                ld      (ix+m2+2),de +                or      hl,de +                jr      nz,Loop21 +                jr      Finish +DontSet2:       ld      hl,(ix+m2)      ; m2 /= 4 +                ld      de,(ix+m2+2) +                rept    2 +                 srl    d +                 rr     e +                 rr     h +                 rr     l +                endm +                ld      (ix+m2),hl +                ld      (ix+m2+2),de +                or      hl,de +                jp      nz,Loop20       ; 7* abarbeiten + +Finish:         ld      hl,(ix+Op)      ; Aufrunden notwendig ? +                sub     hl,(ix+XRoot) +                ld      (ix+Op),hl +                ld      hl,(ix+Op+2) +                sub     hl,(ix+XRoot+2) +                ld      (ix+Op+2),hl +                jr      ule,NoInc +                incw    (ix+XRoot)      ; wenn ja, durchfhren +                jr      nz,NoInc +                incw    (ix+XRoot) +NoInc:          res     7,(ix+XRoot+2)  ; impl. Eins l”schen +                ld      hl,(ix+XRoot+2) ; Exponent einbauen +                or      hl,iy +                ld      bc,hl           ; Ergebnis in BC-DE +                ld      de,(ix+XRoot) +                jr      End + +DomainError:    ld      bc,0ffc0h       ; - NAN zuckgeben +                ld      de,0 +                jr      End + +Zero:           ld      bc,0            ; Ergebnis 0 +                ld      de,bc + +End:            pop     iy              ; Register zurck +                pop     hl +                pop     af + +                unlk    ix              ; Stackrahmen abbauen +                retd    4               ; Ende + +                endp + +;------------------------------------------------------------------------------ +; Zehnerpotenz bilden + +                subproc fPot10 + +                push    ix              ; Register retten +                push    iy +                push    hl + +                ld      bc,(One+2)      ; Ausgangspunkt frs Multiplizieren +                ld      de,(One) +                ld      ix,(Ten+2)      ; zu benutzende Potenz +                ld      iy,(Ten) +                or      hl,hl           ; negative Potenz? +                jr      p,IsPos +                ld      ix,(Tenth+2)    ; dann eben mit Zehntel +                ld      iy,(Tenth) +                xor     hl,-1           ; Zweierkomplement +                inc     hl +IsPos: +                or      hl,hl           ; weiter multiplizieren ? +                jr      z,End           ; nein, Ende +                bit     0,l             ; Restpotenz ungerade ? +                jr      z,IsEven +                push    bc              ; ja: einzeln multiplizieren +                push    de +                push    ix +                push    iy +                call    fmul +IsEven:         srl     h +                rr      l +                push    bc              ; n„chste Potenz berechnen +                push    de +                push    ix              ; durch quadrieren +                push    iy +                push    ix +                push    iy +                call    fmul +                ld      ix,bc +                ld      iy,de +                pop     de +                pop     bc +                jr      IsPos           ; weitersuchen +End: +                pop     hl              ; Register zurck +                pop     iy +                pop     ix + +                ret                     ; Ende + +                endp + +;------------------------------------------------------------------------------ + +                subproc fOutDec + +Op              equ     6               ; Adresse Operand +Format          equ     4               ; Formatdeskriptor +                DefLocal Temp,4         ; 64-Bit-Erweiterung Divident + +                link    ix,LocalSize + +                push    af              ; Register retten +                push    bc +                push    de +                push    hl + +                bit     7,(ix+Op+3)     ; negativ ? +                jr      z,IsPos +                ld      (iy),'-'        ; ja: vermerken... +                inc     iy +                ld      hl,(ix+Op)      ; ...und Zweierkomplement +                xor     hl,-1 +                ld      (ix+Op),hl +                ld      hl,(ix+Op+2) +                xor     hl,-1 +                ld      (ix+Op+2),hl +                incw    (ix+Op) +                jr      nz,GoOn +                incw    (ix+Op+2) +                jr      GoOn +IsPos:          bit     7,(ix+Format+1) ; Pluszeichen ausgeben ? +                jr      nz,GoOn +                ld      (iy),'+' +                inc     iy +GoOn:           res     7,(ix+Format+1) ; Plusflag l”schen +                ld      de,0            ; Nullflag & Z„hler l”schen + +InLoop:         ld      hl,0            ; Division vorbereiten +                ld      (ix+Temp),hl    ; dazu auf 64 Bit erweitern +                ld      (ix+Temp+2),hl +                ld      b,32            ; 32-Bit-Division +DivLoop:        sll     (ix+Op)         ; eins weiterschieben +                rl      (ix+Op+1) +                rl      (ix+Op+2) +                rl      (ix+Op+3) +                rl      (ix+Temp) +                rl      (ix+Temp+1) +                rl      (ix+Temp+2) +                rl      (ix+Temp+3) +                srl     (ix+Op)         ; fr nachher +                ld      hl,(ix+Temp)    ; probeweise abziehen +                sub     hl,10 +                ld      (ix+Temp),hl +                ld      hl,(ix+Temp+2) +                sbc     hl,0 +                ld      (ix+Temp+2),hl +                jr      nc,DivOK        ; paát es ? +                ld      hl,(ix+Temp)    ; nein, zurcknehmen +                add     hl,10 +                ld      (ix+Temp),hl +                ld      hl,(ix+Temp+2) +                adc     hl,0 +                ld      (ix+Temp+2),hl +                scf                     ; ins Ergebnis 0 einschieben +DivOK:          ccf                     ; neues Ergebnisbit +                rl      (ix+Op)         ; von unten einschieben +                djnz    DivLoop + +                ld      a,(ix+Temp)     ; ASCII-Offset addieren +                add     a,'0' +                bit     0,d             ; schon im Nullbereich ? +                jr      z,NormVal +                ld      a,(ix+Format)   ; ja, dann gewnschtes Leerzeichen +NormVal:        push    af              ; auf LIFO legen +                inc     e               ; ein Zeichen mehr +                ld      a,(ix+Op)       ; Quotient Null ? +                or      a,(ix+Op+1) +                or      a,(ix+Op+2) +                or      a,(ix+Op+3) +                ld      d,0             ; Annahme: nicht Null +                jr      nz,InLoop       ; falls <>0, auf jeden Fall weiter +                ld      d,0ffh          ; Flag auf True setzen +                ld      a,e             ; ansonsten nur weiter, falls minimale +                cp      a,(ix+Format+1) ; Zahl noch nicht erreicht +                jr      ult,InLoop + +                ld      b,e             ; jetzt Zeichen ausgeben +OutLoop:        pop     af +                ld      (iy),a +                inc     iy +                djnz    OutLoop + +                pop     hl              ; Register zurck +                pop     de +                pop     bc +                pop     af + +                unlk    ix +                retd    6 + +                endp + +;------------------------------------------------------------------------------ +; Wandlung Float-->ASCII + +                proc    fftoa + +Op              equ     8               ; Lage Eingabe auf Stack +Format          equ     6               ; Lage Formatdeskriptor auf Stack +Buffer          equ     4               ; Pufferadresse +                DefLocal Copy,4         ; Tempor„rkopie der Zahl +                DefLocal ExpSave,2      ; berechneter Exponent + +                link    ix,LocalSize    ; Platz fr Exponenten/Kopie der Zahl + +                push    af              ; Register retten +                push    de +                push    iy +                push    hl + +                ld      iy,(ix+Buffer)  ; Pufferadresse holen + +                ld      hl,(ix+Op)      ; Zahl kopieren +                ld      (ix+Copy),hl +                ld      hl,(ix+Op+2) +                res     7,h             ; dabei Vorzeichen l”schen +                ld      (ix+Copy+2),hl + +                ld      a,'+'           ; Annahme positiv +                sll     (ix+Op)         ; Vorzeichen herausschieben +                rl      (ix+Op+1)       ; und in Carry bringen +                rl      (ix+Op+2) +                rl      (ix+Op+3) +                jr      c,IsNeg         ; Minuszeichen immer erforderlich +                bit     0,(ix+Format+1) ; Pluszeichen dagegen optional +                jr      nz,NoMantSgn +                jr      WrMantSgn +IsNeg:          ld      a,'-'           ; negative Zahl +WrMantSgn:      ld      (iy),a          ; Vorzeichen ablegen +                inc     iy +NoMantSgn: +                ld      l,(ix+Op+3)     ; Exponent herausholen... +                ld      h,0             ; ...auf 16 Bit erweitern... +                ld      bc,(ix+Op+1)    ; ...und in Quelle l”schen +                ld      (ix+Op+2),bc +                ld      b,(ix+Op) +                ld      c,0 +                ld      (ix+Op),bc + +                cp      hl,MaxExpo      ; Sonderwerte ? +                jp      z,SpecialVals   ; ja--> + +                or      hl,hl           ; Zahl denormal ? +                jr      nz,IsNormal     ; nein, normal weiter +                ld      a,(ix+Op+3)     ; falls Mantisse Null, +                or      a,(ix+Op+2)     ; nicht normalisieren +                or      a,(ix+Op+1) +                jr      z,IsNull +Normalize:      sll     (ix+Op+1)       ; ansonsten schieben, bis fhrende +                rl      (ix+Op+2)       ; Eins da +                rl      (ix+Op+3) +                jr      c,IsNormal +                dec     hl +                jr      Normalize +IsNormal:       sub     hl,Bias         ; Bias abziehen +IsNull: +                ld      b,h             ; Zweierexponenten in Float wandeln +                ld      c,h +                push    bc +                push    hl +                call    fitof +                push    bc              ; in Dezimalexponenten wandeln +                push    de +                cpsh    bc,Ld10 +                call    fdiv +                bit     7,b             ; Zahl negativ ? +                jr      z,NoCorr +                push    bc              ; dann noch eins abziehen wegen +                push    de              ; unterer Gauáklammer +                cpsh    bc,One +                call    fsub +NoCorr:         push    bc              ; den Ausflug in Float beenden +                push    de +                call    fftoi +                ld      (ix+ExpSave),de ; Exponenten retten + +                ld      bc,(ix+Copy+2)  ; Originalzahl +                push    bc +                ld      bc,(ix+Copy) +                push    bc +                ld      hl,de           ; durch die Zehnerpotenz +                call    fPot10          ; des Exponenten +                push    bc +                push    de +                call    fdiv            ; teilen +Again:          ld      (ix+Copy),de    ; Ergebnis zwischen 1...9,999 retten +                ld      (ix+Copy+2),bc +                push    bc              ; Vorkommastelle berechnen +                push    de +                call    fftoi +                cp      e,10            ; doch etwas drber ? +                jr      ult,NoRoundErr +                ld      bc,(ix+Copy+2)  ; dann nocheinmal zehnteln +                push    bc +                ld      bc,(ix+Copy) +                push    bc +                cpsh    bc,Tenth +                call    fmul +                incw    (ix+ExpSave) +                jr      Again +NoRoundErr:     add     e,'0'           ; Vorkommastelle nach ASCII +                ld      (iy),e          ; ablegen +                inc     iy +                sub     e,'0'           ; wieder rckg„ngig machen +                cp      (ix+Format),0   ; gar keine Nachkommastellen ? +                jr      eq,NoComma +                ld      (iy),'.'        ; Dezimalpunkt ausgeben +                inc     iy +                push    bc              ; Vorkomma nach Float wandeln +                push    de +                call    fitof +                push    bc +                push    de +                cpsh    bc,ix+Copy      ; von alter Zahl abziehen +                call    fsub +                xor     b,80h           ; war verkehrtherum +                push    bc              ; zum Skalieren auf Stack +                push    de +                ld      l,(ix+Format)   ; passende Skalierungskonstante ausrechnen +                ld      h,0 +                call    fPot10 +                push    bc +                push    de +                call    fmul            ; hochskalieren +                push    bc              ; Rundung +                push    de +                cpsh    bc,Half +                call    fadd +                push    bc              ; Stellen nach Integer +                push    de +                call    fftoi +                push    bc              ; entspr. ausgeben +                push    de +                ld      b,(ix+Format)   ; Format fr fOutDec aufbauen +                set     7,b             ; kein Pluszeichen +                ld      c,'0'           ; Fllzeichen Nullen +                push    bc +                call    fOutDec +                bit     5,(ix+Format+1) ; Nullen am Ende abr„umen ? +                jr      nz,CleanZeros +NoComma: +                ld      a,(ix+Format+1) ; falls Minimalstellenzahl Exponent=0 +                and     a,00011100b     ; und Exponent=0, vergessen +                or      a,(ix+ExpSave) +                or      a,(ix+ExpSave+1) +                jr      z,End + +                ld      (iy),'E'        ; Exponenten ausgeben +                inc     iy +                ld      hl,(ix+ExpSave) +                ld      b,h +                ld      c,h +                push    bc +                push    hl +                ld      c,'0'           ; evtl. vornullen +                ld      b,(ix+Format+1) +                rrc     b               ; Bit 1-->Bit 7 +                rrc     b +                and     b,87h +                push    bc +                call    fOutDec + +End:            ld      (iy),0          ; NUL-Zeichen als Terminierer +                ld      de,iy           ; Endezeiger nach DE +                pop     hl              ; Register zurck +                pop     iy +                ex      de,hl           ; zur Subtraktion tauschen +                sub     hl,de           ; = Zahl geschriebener Zeichen +                ex      de,hl           ; HL wieder original +                ld      bc,de           ; Ergebnis nach BC +                pop     de +                pop     af + +                unlk    ix              ; Stackrahmen abbauen +                retd    8               ; Ende + +SpecialVals:    ld      a,(ix+Op+3)     ; Mantisse Null ? +                or      a,(ix+Op+2) +                or      a,(ix+Op+1) +                jr      nz,IsNAN +                ld      (iy),'I'        ; ja: Unendlichkeit +                ld      (iy+1),'N' +                ld      (iy+2),'F' +                add     iy,3 +                jr      End +IsNAN:          ld      (iy),'N'        ; nein: NAN +                ld      (iy+1),'A' +                ld      (iy+2),'N' +                add     iy,3 +                jr      End + +CleanZeros:     cp      (iy-1),'0'      ; Null am Ende ? +                jr      nz,CleanNoZero  ; nein, Ende +                dec     iy              ; ja: Z„hler runter, so daá ber- +                jr      CleanZeros      ; schrieben wird und neuer Versuch +CleanNoZero:    cp      (iy-1),'.'      ; evtl. Komma entfernbar ? +                jr      nz,Ready        ; nein--> +                dec     iy              ; ja: noch ein Zeichen weniger +Ready:          jrl     NoComma + +                endp + +;------------------------------------------------------------------------------ +; Wandlung ASCII-->Float + +                proc    fatof + +SrcAddr         equ     4               ; Lage Parameter auf Stack +                DefLocal Flags,2        ; Steuerflags +                DefLocal Exp,2          ; Speicher Exponent +                DefLocal Mant,4         ; Speicher fr Mantissenzwischenwert +                DefLocal Factor,4       ; Speicher fr Zehnerpotenz + +                link    ix,LocalSize    ; Stackrahmen aufbauen + +                push    af              ; Register retten +                push    hl +                push    iy + +                ld      iy,(ix+SrcAddr) ; Zeigeradresse laden +                ld      (ix+Flags),01h  ; Phase 1 (Mantisse), noch kein Vorzeichen +                ld      (ix+Flags+1),0 +                ld      bc,(Ten)        ; in der Mantisse mit 10 hochmultiplizieren +                ld      (ix+Factor),bc +                ld      bc,(Ten+2) +                ld      (ix+Factor+2),bc +                ld      bc,0            ; Exponent mit 0 vorbelegen +                ld      (ix+Exp),bc +                ld      (ix+Mant),bc    ; Mantisse auch +                ld      (ix+Mant+2),bc + +ReadLoop:       ld      a,(iy)          ; ein neues Zeichen holen +                inc     iy + +                cp      a,0             ; Endezeichen ? +                jp      eq,Combine      ; ja, zusammenbauen + +                cp      a,' '           ; Leerzeichen ignorieren +                jr      eq,ReadLoop + +                cp      a,'+'           ; Pluszeichen gnadenhalber zulassen +                jr      ne,NoPlus       ; ist aber nur ein Dummy +                bit     0,(ix+Flags+1)  ; schon ein Vorzeichen dagewesen ? +                jp      nz,Error        ; dann Fehler +                set     0,(ix+Flags+1)  ; ansonsten einfach setzen +                jr      ReadLoop +NoPlus: +                cp      a,'-'           ; Minuszeichen bewirkt schon eher etwas +                jr      ne,NoMinus +                bit     0,(ix+Flags+1)  ; darf auch nur einmal auftreten +                jp      nz,Error +                set     0,(ix+Flags+1) +                cp      (ix+Flags),1    ; je nach Phase anderes Flag setzen +                jr      ne,MinPhase3 +                set     1,(ix+Flags+1)  ; bei Mantisse Bit 1... +                jr      ReadLoop +MinPhase3:      set     2,(ix+Flags+1)  ; ...bei Exponent Bit 2 +                jr      ReadLoop +NoMinus: +                cp      a,'.'           ; Umschaltung Phase 2 (Nachkomma) ? +                jr      ne,NoPoint +                cp      (ix+Flags),1    ; bish. Phase muá Eins sein +                jp      ne,Error +                ld      (ix+Flags),2    ; neue Phase eintragen +                set     0,(ix+Flags+1)  ; Nachkomma darf kein Vorzeichen haben +                ld      bc,(Tenth)      ; im Nachkomma durch 10 teilen +                ld      (ix+Factor),bc +                ld      bc,(Tenth+2) +                ld      (ix+Factor+2),bc +                jr      ReadLoop +NoPoint: +                cp      a,'e'           ; kleines & groáes E zulassen +                jr      eq,IsE +                cp      a,'E' +                jr      ne,NoE +IsE:            cp      (ix+Flags),3    ; vorh. Phase muá 1 oder 2 sein +                jp      eq,Error +                ld      (ix+Flags),3    ; vermerken +                res     0,(ix+Flags+1)  ; Vorzeichen wieder zulassen +                jr      ReadLoop +NoE: +                sub     a,'0'           ; jetzt nur noch 0..9 zugelassen +                jp      c,Error +                cp      a,9 +                jp      ugt,Error +                set     0,(ix+Flags+1)  ; nach Ziffern keine Vorzeichen mehr zulassen + +                cp      (ix+Flags),1    ; Phase 1 (Mantisse) : +                jr      ne,NoPhase1 +                cpsh    bc,ix+Mant      ; bish. Mantisse * 10 +                cpsh    bc,ix+Factor +                call    fmul +                push    bc              ; Ziffer dazuaddieren +                push    de +                ld      e,a +                ld      d,0 +                ld      bc,0 +                push    bc +                push    de +                call    fitof +                push    bc +                push    de +                call    fadd +                ld      (ix+Mant),de    ; Mantisse zurcklegen +                ld      (ix+Mant+2),bc +                jrl     ReadLoop +NoPhase1: +                cp      (ix+Flags),2    ; Phase 2 (Nachkomma) : +                jr      nz,NoPhase2 +                ld      e,a             ; Stelle nach Float +                ld      d,0 +                ld      bc,0 +                push    bc +                push    de +                call    fitof +                push    bc              ; mit Zehnerpotenz skalieren +                push    de +                cpsh    bc,ix+Factor +                call    fmul +                push    bc              ; zur Mantisse addieren +                push    de +                cpsh    bc,ix+Mant +                call    fadd +                ld      (ix+Mant),de    ; Mantisse zurcklegen +                ld      (ix+Mant+2),bc +                cpsh    bc,ix+Factor    ; Faktor * 1/10 +                cpsh    bc,Tenth +                call    fmul +                ld      (ix+Factor),de +                ld      (ix+Factor+2),bc +                jrl     ReadLoop +NoPhase2: +                ld      hl,(ix+Exp) +                mul     hl,10           ; Exponent heraufmultiplizieren +                add     a,l +                ld      l,a +                ld      a,0 +                adc     h,0 +                cp      hl,45           ; Minimum ist 1E-45 +                jr      ugt,Error +                ld      (ix+Exp),hl +                jrl     ReadLoop + +Combine:        ld      hl,(ix+Exp) +                bit     2,(ix+Flags+1)  ; Exponent negativ ? +                jr      z,ExpPos +                xor     hl,-1 +                inc     hl +ExpPos:         call    fPot10          ; Zehnerpotenz des Exponenten bilden +                push    bc +                push    de +                cpsh    bc,ix+Mant      ; mit Mantisse kombinieren +                call    fmul +                bit     1,(ix+Flags+1)  ; Mantisse negativ ? +                jr      z,ManPos +                set     7,b +ManPos:         rcf                     ; Ende ohne Fehler + +End:            pop     iy              ; Register zurck +                pop     hl +                pop     af + +                unlk    ix              ; Rahmen abbauen +                retd    2               ; Ende + +Error:          ld      hl,iy           ; rel. Zeichenposition ermitteln +                sub     hl,(ix+SrcAddr) +                ld      bc,hl +                scf                     ; Ende mit Fehler +                jr      End + +                endp + +;------------------------------------------------------------------------------ +; gemeinsames Ende + +                endsection + diff --git a/tests/t_fl90/macros.inc b/tests/t_fl90/macros.inc new file mode 100644 index 0000000..d949ddc --- /dev/null +++ b/tests/t_fl90/macros.inc @@ -0,0 +1,57 @@ +; MACROS.INC +;****************************************************************************** +;* überall gebrauchte Makros                                                  * +;*                                                                            * +;* Alfred Arnold, Oktober 1993                                                * +;****************************************************************************** + +proc            macro   name,{NoExpand} ; Prozedureintritt +                section name +                forward LocalSize       ; lokal reservierter Speicher auf Stack +LocalSize       eval    0 +                public  name +name            label   $ +                endm + +subproc         macro   name,{NoExpand} ; Prozedureintritt für private Routine +                section name +                forward LocalSize       ; lokal reservierter Speicher auf Stack +LocalSize       eval    0 +                public  name:Parent +name            label   $ +                endm + +endp            macro   name,{NoExpand} ; Prozeduraustritt +LocalSize       eval    0-LocalSize     ; damit man's im Listing lesen kann +                endsection name +                endm + +link            macro   reg,count,{NoExpand} ; Stack-Rahmen einrichten +                push    reg             ; alten Basepointer retten +                ld      reg,sp          ; neuen aufbauen +                if      count<>0 +                 add    sp,count        ; Platz auf Stack reservieren +                endif +                endm + +unlk            macro   reg,{NoExpand}  ; Stack-Rahmen abbauen +                ld      sp,reg          ; Speicherreservierung zurücknehmen +                pop     reg             ; alten Basepointer zurück +                endm + +retd            macro   dist,{NoExpand} ; Return and Deallocate +                if      dist<>0 +                 push   hl              ; Arbeitsregister retten +                 ld     hl,(sp+2)       ; Rücksprungadresse umkopieren +                 ld     (sp+2+dist),hl +                 ld     hl,(sp)         ; Arbeitsregister zurück +                 add    sp,2+dist       ; Stack aufräumen +                endif +                ret +                endm + +DefLocal        macro   Name,Size,{NoExpand} ; eine lokale Variable definieren +LocalSize       eval    LocalSize-Size  ; zählt lok. reservierten Speicher +Name            equ     LocalSize       ; liegt an neuem unteren Ende des Stackrahmens +                endm + diff --git a/tests/t_fl90/mon.inc b/tests/t_fl90/mon.inc new file mode 100644 index 0000000..46e08d3 --- /dev/null +++ b/tests/t_fl90/mon.inc @@ -0,0 +1,11 @@ +MRET    EQU     0080H           ;  RETURN TO MONITOR +CONIN	EQU	0083H		;  CONSOLE INPUT +COSTAT	EQU	0086H		;  CONSOLE STATUS +CONOUT	EQU	0089H		;  CONSOLE OUTPUT +TXTAUS	EQU	008CH		;  TEXT-OUTPUT +PSTR	EQU	008FH		;  STRING OUTPUT +A_ASC	EQU	0092H		;  CONVERT CONTENT OF A TO ASCII  +HL_ASC	EQU	0095H		;  CONVERT CONTENT OF HL TO ASCII +BLAUS	EQU	0098H		;  BLANK OUTPUT +GETZEIL	EQU	009BH		;  READ LINE	 + diff --git a/tests/t_fl90/t_fl90.asm b/tests/t_fl90/t_fl90.asm new file mode 100644 index 0000000..3e53195 --- /dev/null +++ b/tests/t_fl90/t_fl90.asm @@ -0,0 +1,179 @@ +; FTEST.ASM +;****************************************************************************** +;* Testet Gleitkommabibliothek für TLCS90                                     * +;*                                                                            * +;* Hardware: TDB-TMP90                                                        * +;* Software: AS 1.39p5 oder höher                                             * +;*           Includes MACROS.INC, FLOAT.INC, CPU_TIME.INC                     * +;*                                                                            * +;* Übersetzen mit AS ftest oder beiliegendem Makefile                         * +;*                                                                            * +;****************************************************************************** + +                cpu     90c141 + +                org     8500h           ; Startadresse User-RAM + +;------------------------------------------------------------------------------ + +CR              equ     13 +LF              equ     10 +Format_Tab      equ     0000100000000110b ; fftoa-Format für tab. Ausgabe +Format_Min      equ     0010001100000101b ; fftoa-Format für minimale Länge +;                         ^<+>^^<--+---> +;                         | | ||   | +;                         | | ||   +------ Maximalzahl Nachkommastellen +;                         | | |+---------- Mantissenpluszeichen unterdrücken +;                         | | +----------- Exponentenpluszeichen unterdrücken +;                         | +------------- Minimalstellenzahl Exponent +;                         +--------------- anhängende Nullen in Mantisse löschen +Format          equ     Format_Tab      ; gewähltes fftoa-Format + +;------------------------------------------------------------------------------ +; Vorgaben + +                include stddef90.inc    ; Registeradressen +                include macros.inc      ; für Unterroutinen benötigte Makros +                include mon.inc         ; Einsprungadressen TDBTMP90-Monitor + +                section MainProg + +;------------------------------------------------------------------------------ +; Makros zur Schreiberleichterung + +pushop          macro   adr,{NoExpand}  ; einen Operanden auf den Stack legen +                ld      hl,(adr+2) +                push    hl +                ld      hl,(adr) +                push    hl +                endm + +storeop         macro   {NoExpand}      ; Ergebnis in Array ablegen +                ld      (iy),de +                ld      (iy+2),bc +                add     iy,4 +                endm + +OneOp           macro   Msg,Operation,Op1,Op2,{Expand}  ; Aufruf, Ausgabe und +                call    PSTR                              ; Zeitmessung +                db      Msg,0 +                call    StartTimer +                if      "OP1"<>"" +                 pushop Op1 +                endif +                if      "OP2"<>"" +                 pushop Op2 +                endif +                call    Operation +                storeop +                call    StopTimer +                if      (("OPERATION"<>"FNOP") && ("OPERATION"<>"FFTOI")) +                 call    PSTR +                 db      ", Ergebnis ",0 +                 push    bc +                 push    de +                 ld      hl,Format +                 push    hl +                 ld      hl,CharBuffer +                 push    hl +                 call    fftoa +                 call    TXTAUS +                endif +                call    PSTR +                db      CR,LF,0 +                endm + +;------------------------------------------------------------------------------ +; Hauptroutine + +                proc    Main + +                ld      sp,Stack        ; Stack reservieren +                ld      iy,Erg          ; Zeiger auf Ergebnisfeld +                call    InitTimer       ; Zeitmessung vorinitialisieren + +                OneOp   "Ladeoverhead         : ",fnop,Eins,Eins +                OneOp   "Addition 2+Pi        : ",fadd,Zwei,Pi +                OneOp   "Addition 100000+2    : ",fadd,Thou,Zwei +                OneOp   "Addition 0+1         : ",fadd,Null,Eins +                OneOp   "Subtraktion Pi-2     : ",fsub,Pi,Zwei +                OneOp   "Subtraktion 100000-1 : ",fsub,Thou,Eins +                OneOp   "Multiplikation 2*Pi  : ",fmul,Zwei,Pi +                OneOp   "Division 1/Pi        : ",fdiv,Eins,Pi +                OneOp   "Wurzel aus 2         : ",fsqrt,Zwei, +                OneOp   "Wurzel aus 10000     : ",fsqrt,Thou, +                OneOp   "Wurzel aus -1        : ",fsqrt,MinEins, +                OneOp   "Wandlung 1-->Float   : ",fitof,IntEins, +                OneOp   "Wandlung 1E5-->Float : ",fitof,IntThou, +                OneOp   "Wandlung 1-->Int     : ",fftoi,Eins, +                OneOp   "Wandlung 1E5-->Int   : ",fftoi,Thou, +                ld      a,10 +                OneOp   "Pi*2^10              : ",fmul2,Pi, +                ld      a,-10 +                OneOp   "Pi*2^(-10)           : ",fmul2,Pi, + +                call    PSTR +                db      "Eingabe: ",0 +                ld      hl,InpBuffer +                call    TXTAUS +                ld      hl,InpBuffer +                push    hl +                call    fatof +                storeop +                call    PSTR +                db      ", Ergebnis: ",0 +                push    bc +                push    de +                ld      hl,Format +                push    hl +                ld      hl,CharBuffer +                push    hl +                call    fftoa +                call    TXTAUS +                call    PSTR +                db      13,10,0 + +                jp      MRET + +                endp + +                proc    fnop            ; Dummyroutine fr Overheadmessung + +                link    ix,0 +                unlk    ix + +                retd    8 + +                endp + +CharBuffer:     db      30 dup (?)      ; Puffer fr fftoa +InpBuffer:      db      "-123.456E-7",0 ; Puffer fr fatof + +                align   4 +Eins:           dd      1.0             ; ben”tigte Konstanten +MinEins:        dd      -1.0 +Zwei:           dd      2.0 +Pi:             dd      40490fdbh	; um Vergleichsfehler durch Rundung zu +                                        ; vermeiden +Zehn:           dd      10.0 +Null:           dd      0.0 +Thou:           dd      100000.0 +IntEins:        dd      1 +IntThou:        dd      100000 +Erg:            dd      40 dup (?)      ; Ergebnisfeld + +                align   2               ; Platz fr Stack +                db      300 dup (?) +Stack: +                endsection + +;------------------------------------------------------------------------------ +; ben”tigte Module + +                include cpu_time.inc     ; Zeitmessung +                include float.inc        ; Gleitkommabibliothek + +;------------------------------------------------------------------------------ + +                end     Main + diff --git a/tests/t_fl90/t_fl90.doc b/tests/t_fl90/t_fl90.doc new file mode 100644 index 0000000..668986f --- /dev/null +++ b/tests/t_fl90/t_fl90.doc @@ -0,0 +1,6 @@ ++------------------------  Test Application FL90 -----------------------------+ +|                                                                             | +|  This is an IEEE single precision floating point library for the Toshiba    | +|  TLCS-90 microcontroller, embedded into a small test program.               | +|                                                                             | ++-----------------------------------------------------------------------------+ diff --git a/tests/t_fl90/t_fl90.ori b/tests/t_fl90/t_fl90.ori Binary files differnew file mode 100644 index 0000000..4aff532 --- /dev/null +++ b/tests/t_fl90/t_fl90.ori diff --git a/tests/t_fl900/asflags b/tests/t_fl900/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_fl900/asflags diff --git a/tests/t_fl900/conout.inc b/tests/t_fl900/conout.inc new file mode 100644 index 0000000..6483884 --- /dev/null +++ b/tests/t_fl900/conout.inc @@ -0,0 +1,154 @@ +; CONOUT.INC +;****************************************************************************** +;* Konsolenausgabe fr Micro-ICE TLCS900                                      * +;*                                                                            * +;* Routinen CONOUT, PSTR, A_ASC von Oliver Sellke                             * +;* Routine WriteDec von Alfred Arnold, Oktober 1993                           * +;* 20.11.1993 StrTerm C-konform auf 00h ge„ndert                              * +;*            TXTAUS hinzugefgt                                              * +;*                                                                            * +;*  Routine     Funktion         Eingabe                    Stack             * +;*                                                                            * +;*  CONOUT   Zeichen ausgeben      A                        1..3 Byte         * +;*  TXTAUS   String ausgeben       (XHL)                                      * +;*  PSTR     String ausgeben    hinter CALL+StrTerm als Ende 6 Byte           * +;*  A_ASC    Byte hex ausgeben     A                         2 Byte           * +;*  WriteDec Wort dez ausgeben     WA                        6 Byte           * +;*                                                                            * +;*  - Da die Routinen lokale Labels verwenden, ist mindestens AS 1.39 erfor-  * +;*    derlich                                                                 * +;*  - Der Prozessor muá sich im Maximum-Modus befinden                        * +;*  - Symbol SIODelay setzen, falls langsames Terminal vorhanden              * +;*  - MACROS.INC muá vorher eingebunden werden                                * +;****************************************************************************** + +;------------------------------------------------------------------------------ +; gemeinsamer Anfang, Definitionen + +                section ConOut + +                public  StrTerm +StrTerm         equ     0 + +SC0BUF          EQU     050H +INTES0          EQU     077H + +;****************************************************************************** +; (7 bit ASCII) Ausgabe ber SIO-Kanal 0 + +                proc    CONOUT +                PUSH    A               ;sichern +                RES     7,A             ;MSB ausblenden (nur ASCII!) +CONOUT1:        BIT     7,(INTES0)      ;ist der Buffer frei? +                JR      Z,CONOUT1       ;Wenn nicht, dann weiter prfen +                LD      (INTES0),0Dh    ;Flag rcksetzen +                LD      (SC0BUF),A      ;Zeichen in Transmit-Buffer +                ifdef   SIODelay +                 PUSH    HL             ;sichern +                 LD      HL,80H         ;Verz”gerungszeit laden +WAIT:            DEC     1,HL           ;Z„hler - 1 +                 CP      HL,0           ;Ist Z„hler = 0? +                 JR      NZ,WAIT        ;Wenn nicht, dann weiter DEC +                 POP     HL             ;restaurieren +                endif +                POP     A               ;restaurieren +                RET                     ;Zurck zum Aufruf +                endp + +;****************************************************************************** +; ASCIIZ-String ab (XHL) ausgeben: + +                proc    TXTAUS +                push    xhl             ; Register retten +                push    a +Schl:           ld      a,(xhl+)        ; ein Zeichen holen +                cp      a,StrTerm       ; Endemarkierung ? +                jr      eq,Ende +                call    CONOUT          ; nein, ausgeben +                jr      Schl            ; Go on... +Ende:           pop     a               ; Register zurck +                pop     xhl +                ret +                endp + +;****************************************************************************** +; String der dem Aufruf folgt bis zur Endemarkierung ausgeben +; Siehe auch TXTAUS: + +                proc    PSTR +                PUSH    XHL             ;sichern +                LD      XHL,(XSP+4)     ;Datenadresse lesen +                PUSH    F               ;sichern +                PUSH    A               ;dito +PSTR1:          LD      A,(XHL)         ;Zeichen holen +                INC     1,C             ;Zeichenz„hler + 1 +                INC     1,XHL           ;Zeichenzeiger + 1 +                CP      A,StrTerm       ;Endemarkierung erwischt? +                JR      Z,PSTR2         ;Wenn ja, dann Ende +                AND     A,A             ;Null-Zeichen erwischt? +                JR      Z,PSTR1         ;Wenn ja, dann nicht ausgeben +                CALL    CONOUT          ;Zeichen ausgeben +                AND     A,A             ;War das 8. Bit gesetzt? +                JR      P,PSTR1         ;Wenn nicht, dann n„chstes Zeichen +PSTR2:          POP     A               ;restaurieren +                POP     F               ;dito +                LD      (XSP+4),XHL     ;Rcksprungadresse restaurieren +                POP     XHL             ;Rcksprungadresse abspeichern +                RET                     ;Zurck zum Aufruf +                endp + +;****************************************************************************** +; "A" als ASCII Text ausgeben + +                proc    A_ASC +                PUSH    F               ;Sichern +                PUSH    A               ;dito +                RR      4,A             ;high nibble an die richtige +                CALL    A_ASC00         ;Stelle und ausgeben +                POP     A               ;restaurieren bzw. +                POP     F               ;low nibble laden +A_ASC00:        AND     A,00FH          ;low nibble maskieren +                CP      A,00AH          ;eine Zahl ? +                JR      C,A_ASC01       ;ja +                ADD     A,007H          ;Offset A-F +A_ASC01:        ADD     A,'0'           ;Offset ASCII +                JP      CONOUT          ;Ausgabe und Ende UP +                endp + +;****************************************************************************** +; Zahl in WA dezimal ausgeben +; C = minimale Stellenzahl +; B = Fllzeichen (z.B. ' ', '0') + +                proc    WriteDec +                push    xwa             ; Register retten +                push    de + +                sub     de,de           ; E z„hlt echte Stellenzahl, D=1 falls Null +InLoop:         extz    xwa             ; fr Division vorbereiten +                div     xwa,10          ; letzte Stelle ausmaskieren +                add     qa,'0'          ; ASCII-Offset +                cp      d,1             ; schon im Nullbereich ? +                jr      ne,NormVal +                ld      qa,b            ; ja, dann gewnschtes Leerzeichen +NormVal:        push    qa              ; ein Zeichen mehr +                inc     e +                or      wa,wa           ; schon Null ? +                scc     z,d +                jr      nz,InLoop       ; wenn nicht Null, auf jeden Fall weiter +                cp      e,c             ; noch nicht genug Zeichen ? +                jr      ult,InLoop      ; dann auch weiter + +OutLoop:        pop     a               ; umgekehrt ausgeben +                call    ConOut +                djnz    e,OutLoop + +                pop     de +                pop     xwa +                ret +                endp + +;****************************************************************************** +; Modulende + +                endsection diff --git a/tests/t_fl900/cpu_time.inc b/tests/t_fl900/cpu_time.inc new file mode 100644 index 0000000..1240be2 --- /dev/null +++ b/tests/t_fl900/cpu_time.inc @@ -0,0 +1,240 @@ +; CPU_TIME.INC +;************************************************************************* +;*                                                                       * +;* Author...: Oli(ver Sellke)                 D-65199 Wiesbaden          * +;* auf AS umgestellt von Alfred Arnold, Oktober 1993                     * +;* die Low-Level-Ausgaberoutinen sind nach CONOUT.INC verlagert          * +;* Date.....: 14 Okt 1993                     Version..: 1.0             * +;* Target...: TLCS900-Family (TOSHIBA)        Compiler.: AS      V1.39p1 * +;* Project..: General Purpose / e.g. TMP96C141F / Watt Ihr Volt          * +;*                                                                       * +;* Function.: Mit dieser Routine kann man die Ausfhrungszeit die        * +;*            ein Programm(teil) ben”tigt ermitteln.                     * +;*            Die Zeit wird mit Timer4 und CAP1 davon gemessen, d.h.     * +;*            dieser darf innerhalb des gemessenen Programm(teil)s       * +;*            nicht (!) benutzt werden.                                  * +;*            !!! Alle Zeiten beziehen sich auf einen 14,7456MHz Quarz!! * +;*            Zur Ausgabe des Messwertes werden Monitor-Routinen benutzt,* +;*            deshalb kann es auch nur unter Anwendung von diesem zur    * +;*            Ausfhrung gebracht werden.                                * +;*            Wenn ein Programm(teil) getestet wird, dessen Ausfhrungs- * +;*            zeit unbekannt ist, sollte man die 8,681æs Aufl”sung w„hlen* +;*            um einen Overrun des Counters zu verhindern. Wenn der Wert * +;*            entsprechend klein ist ( <0FFF ), kann man die 0,543æs Auf-* +;*            l”sung w„hlen um genauere Werte zu bekommen.               * +;*            Auáerdem ist die Ermittlung der 16 gr”áten und 16 kleinsten* +;*            Werte die bei mehreren Durchl„ufen erzielt wurden m”glich! * +;*            Man kann so einige 1000 Durchl„ufe fahren mit immer unter- * +;*            schiedlichen Randbedingungen auf die der zu testende Pro-  * +;*            teil entsprechend reagiert und auch Zeit ben”tigt.         * +;*            So hat man sicher die minimale und maximale Laufzeit.      * +;*                                                                       * +;*            Bei allgemeiner Verwendung:                                * +;*            Max.Meáwert=0FFFFH =  35.585æs bei 0,543æs Aufl”sung       * +;*            Max.Meáwert=0FFFFH = 568.909æs bei 8,681æs Aufl”sung       * +;*                                                                       * +;* Hardware.: getested auf Micro-ICE TLCS900 mit 14,7456MHz Quarz !!!!   * +;*                                                                       * +;*  Routine      Funktion           Ausgabe             Stack            * +;*                                                                       * +;*  CPU_TI_INI   Initialisierung    ------              6 Byte           * +;*  CPU_TIME     Uhr starten        ------              0 Byte           * +;*  CPU_STOP     Uhr stoppen        Zeit+Statistik      8 Byte           * +;*                                                                       * +;*  - Der Prozessor muá sich im Maximum-Modus befinden                   * +;*  - Symbol BigTime definieren fr gr”áere Aufl”sung                    * +;*  - Da die Routinen lokale Labels verwenden, ist mindestens AS 1.39    * +;*    erforderlich                                                       * +;*  - MACROS.INC muá vorher, CONOUT.INC irgendwo eingebunden werden      * +;************************************************************************* + +;------------------------------------------------------------------------- +; gemeinsamer Anfang, Definitionen + +                section Timer + +TRUN            EQU   020H +CAP1L           EQU   034H +CAP1H           EQU   035H +T4MOD           EQU   038H + +CR              EQU    0DH +LF              EQU    0AH + +                ifdef  BigTime +Overhead         equ    1               ; Eigenverbrauch Start/Stop +                elseif +Overhead         equ    9 +                endif + +CPU_TI_FAA      db    40h dup (?)       ; FeldAnfangsAdresse, ab hier wer- +                                        ; den 40H (64) RAM-Zellen ben”tigt +                                        ; gleich 2 * 16 Worte +CPU_TI_CR       dd    ?                 ; CPU_TIME-Control-Register, +                                        ; wird noch nicht ben”tigt!!! + +;************************************************************************* +;Dieser Aufruf geh”rt in den Initialisierungsbereich des zu testenden +;Programmabschnittes!! + +                proc    CPU_TI_INI + +;Hier werden die Feldwerte initialisiert.. + +                PUSH    XDE             ;Wird gleich benutzt +                PUSH    BC              ;Wird gleich benutzt +                LD      B,10H           ;16 W”rter fr Max.Werte werden gebraucht +                LD      XDE,CPU_TI_FAA  ;FeldAnfangsAdresse laden +CPU_TI_INI1:    LDW     (XDE),00000H    ;Feldzelle fr Max.Werte initalisieren +                INC     2,XDE           ;n„chste Max.Wert-Feldzelle +                                        ;adressieren +                DJNZ    CPU_TI_INI1     ;Alle Max.Werte initialisiert? +                LD      B,10H           ;16 W”rter fr Min.Werte werden gebraucht +CPU_TI_INI2:    LDW     (XDE),0FFFFH    ;Feldzelle fr Min.Werte initalisieren +                INC     2,XDE           ;n„chste Max.Wert-Feldzelle +                                        ;adressieren +                DJNZ    CPU_TI_INI2     ;Alle Min.Werte initialisiert? +                POP     BC              ;Und wieder restaurieren +                POP     XDE             ;hier auch... +                RET                     ;Zurck zum Aufruf! +                endp + +;************************************************************************* +; Uhr starten + +                proc    CPU_TIME + +                                          ;Timer4 CPU-Time-Messung vorbereiten +                RES     4,(TRUN)          ;Timer4 stop and clear ! +                ifdef   BigTime +                 LD      (T4MOD),00100011B ;Bit 0+1:Source-Clock: 8,681æs +                elseif +                 LD      (T4MOD),00100001B ;Bit 0+1:Source-Clock: 0,543æs +                endif +                                          ;Bit 2  :clear from TREG5 disabled +                                          ;Bit 3+4:INT-Capture disabled +                                          ;Bit 5  :No Sw. capture now +                SET     4,(TRUN)          ;Timer4 start and count ! +                RET +                endp + +;************************************************************************* + +                proc    CPU_STOP + +                RES     5,(T4MOD)         ;Capture1 grabs count +                CALL    CPU_TI_SOUT       ;Einzelausgabe des gemessenen Wertes +                CALL    CPU_TI_SOR        ;gemessenen Wert ins Feld sortieren +                RET                       ;Zurck zum Aufruf! +                endp + +;************************************************************************* +;Hier wird der gerade gemessene Wert ausgegeben. Diese Ausgabe ist  +;ausreichend um Laufzeitwerte von statischen Programmabschnitten +;zu ermitteln (keine Verzweigungen im Programmabschnitt). + +CPU_TI_SOUT:    PUSH    A                 ; needed little later +                PUSH    F                 ; needed little later +                push    bc                ; needed little later +                ld      wa,(cap1l)        ; gemesser Wert +                call    WriteTime +                pop     bc                ; back to the roots ... +                POP     F  +                POP     A +                RET                       ; Zurck zum Aufruf! + +;************************************************************************* +;Hier werden die ermittelten Werte sortiert abgelegt! +;Jeweils am Feldanfang steht der gr”áte und der kleinste Wert. +;Falls ein Wert einem anderen im Feld entspricht (gleicher Messwert) +;wird dieser nicht nochmal eingetragen!!!!  +;!!Achtung diese Routine ben”tigt max. 145æs (14,7456MHz Quarz)  +;  im worst case!! Aber nur wenn Daten und Code 16Bit breit sind  +;  und keine Waitstates zugeschaltet sind (Micro-ICE TLCS900 default RAM)! + +CPU_TI_SOR:     PUSH    HL              ;Wird gleich benutzt +                PUSH    BC              ;Wird gleich benutzt +                PUSH    XDE             ;Wird gleich benutzt +                                        ;Max.Werte sortiert ablegen!!! +                LD      B,10H           ;16 W”rter enth„lt Max.Wert-Feld +                LD      HL,(CAP1L)      ;gemessenen Wert aus Capture-Reg. holen +                LD      XDE,CPU_TI_FAA  ;erste Max.Wert-Feldzelle adressieren +CPU_TI_SOR1:    CP      HL,(XDE)        ;Wert mit Feldinhalt vergleichen +                JR      ULT,CPU_TI_SOR2 ;Ist Wert kleiner als Feldinhalt? +                JR      Z,CPU_TI_SOR3   ;Ist Wert gleich Feldinhalt? Abbrechen! +                EX      (XDE),HL        ;Nein-->Wert mit Feldinhalt tauschen! +CPU_TI_SOR2:    INC     2,XDE           ;n„chste Feldzelle adressieren +                DJNZ    B,CPU_TI_SOR1   ;Alle 16 Max.Werte kontrolliert? +                                        ;Min.Werte sortiert ablegen!!! +CPU_TI_SOR3:    LD      B,10H           ;16 W”rter enth„lt Min.Wert-Feld +                LD      HL,(CAP1L)      ;gemessenen Wert aus Capture-Reg. holen +                LD      XDE,CPU_TI_FAA+20H ;erste Min.Wert-Feldzelle adressieren +CPU_TI_SOR4:    CP      HL,(XDE)        ;Wert mit Feldinhalt vergleichen +                JR      UGT,CPU_TI_SOR5 ;Ist Wert gr”áer als Feldinhalt? +                JR      Z,CPU_TI_SOR6   ;Ist Wert gleich Feldinhalt? Abbrechen! +                EX      (XDE),HL        ;Nein-->Wert mit Feldinhalt tauschen! +CPU_TI_SOR5:    INC     2,XDE           ;n„chste Feldzelle adressieren +                DJNZ    B,CPU_TI_SOR4   ;Alle 16 Min.Werte kontrolliert? +CPU_TI_SOR6:    POP     XDE             ;Und wieder restaurieren +                POP     BC              ;wieder restaurieren +                POP     HL              ;hier auch... +                RET                     ;Zurck zum Aufruf! + +;************************************************************************* +;Hier werden die im Feld abgelegten Werte ausgeben.  + +CPU_TI_MOUT:                            ;Muá noch geschrieben werden! +                RET                     ;Zurck zum Aufruf! + +;************************************************************************* +; eine Zeitdifferenz in WA umrechnen und ausgeben +; wegen der Aufl”sung der Timer ist die letzte Stelle hinter dem Komma +; bei hoher Aufl”sung mit Vorsicht zu genieáen + +WriteTime:      push    xwa             ; Register retten +                push    bc +                sub     wa,Overhead     ; Zeit korrigieren +                ifdef   BigTime         ; Fall 1: niedrige Aufl”sung +                 mul    xwa,8681        ; -->Nanos in XWA +                 add    xwa,5000        ; !!Rundung!! +                 div    xwa,10000       ; Nanos , einzelne Mikros wegschmeiáen +                 extz   xwa +                 div    xwa,100         ; Millisekunden in WA +                 ld     bc,2003h        ; ausgeben +                 call   WriteDec +                 ld     a,'.' +                 call   CONOUT +                 ld     wa,qwa          ; auf 10 us genau ausgeben +                 ld     bc,3002h +                 call   WriteDec +                 call   PSTR +                 db     " Milli",StrTerm +                elseif                  ; Fall 2: hohe Aufl”sung +                 mul    xwa,543         ; -->Nanosekunden in XWA +                 div    xwa,1000        ; -->Nanos in QWA, Mikros in WA +                 ld     bc,2005h        ; Mikros 5-stellig mit Blanks +                 call   WriteDec +                 ld     a,'.' +                 call   CONOUT +                 ld     wa,qwa          ; Nanos einstellig +                 add    wa,50           ; Rundung +                 extz   xwa +                 div    xwa,100         ; Ergebnis 0..9 +                 cp     wa,10 +                 jr     ne,NoErr +                 ld     wa,9 +NoErr:           ld     bc,3001h        ; einstellig ausgeben +                 call   WriteDec +                 call   PSTR +                 db     " Mikro",StrTerm +                endif +                call    PSTR +                db      "sekunden",StrTerm ; gemeinsamer Rest +                pop     bc              ; Register zurck +                pop     xwa +                ret + +;************************************************************************* +; gemeinsames Ende + +                endsection diff --git a/tests/t_fl900/float.inc b/tests/t_fl900/float.inc new file mode 100644 index 0000000..dd4796c --- /dev/null +++ b/tests/t_fl900/float.inc @@ -0,0 +1,973 @@ +; FLOAT.INC +;****************************************************************************** +;* Gleitkommabibliothek fr TLCS 900                                          * +;*                                                                            * +;* Originale fr den 68000 aus mc, bis auf die Quadratwurzel aus c't          * +;* Portierung auf TLCS 900 von Alfred Arnold, Oktober 1993                    * +;*                                                                            * +;*  Routine  Funktion             Eingabe Ausgabe  Stack    L„nge  Zeit/14MHz * +;*                                                                            * +;*  fadd     Addition             XWA+XHL    XWA  12 Byte 194 Byte    60 us   * +;*  fsub     Subtraktion          XWA-XHL    XWA  12 Byte   7 Byte    65 us   * +;*  fmul     Multiplikation       XWA*XHL    XWA  20 Byte 218 Byte    70 us   * +;*  fdiv     Division             XWA/XHL    XWA  20 Byte 147 Byte   300 us   * +;*  fmul2    Mult. mit 2er-Potenz XWA*(2^BC) XWA   6 Byte  99 Byte    20 us   * +;*  fitof    Int-->Float          XWA        XWA   4 Byte  41 Byte    90 us   * +;*  fftoi    Float-->Int          XWA        XWA   2 Byte  72 Byte    20 us   * +;*  fsqrt    Quadratwurzel        XWA        XWA  16 Byte 192 Byte   220 us   * +;*  fftoa    Float-->ASCII        XWA   (XHL),BC ~38 Byte 228 Byte ~4500 us   * +;*  fatof    ASCII-->Float     (XHL),BC XWA,[BC] ~40 Byte 260 Byte ~2300 us   * +;*                                                                            * +;*  - Wollen Sie einzelne Routinen entfernen, so beachten Sie, daá fsub Teile * +;*    aus fadd und fdiv Teile aus fmul verwendet !                            * +;*  - Gleitkommaformat ist IEEE Single (32 Bit)                               * +;*  - Integerwerte bei fmul2, fitof und fftoi sind vorzeichenbehaftet         * +;*  - Der Prozessor muá sich im Maximum-Modus befinden                        * +;*  - Da die Routinen lokale Labels verwenden, ist mindestens AS 1.39 erfor-  * +;*    derlich                                                                 * +;*  - Die Ausfhrungszeiten k”nnen je nach Operand streuen, insbesondere bei  * +;*    den Konvertierungsfunktionen                                            * +;*  - MACROS.INC muá vorher eingebunden werden                                * +;****************************************************************************** + +;------------------------------------------------------------------------------ +; gemeinsamer Anfang, Makros + +shifta          macro   op,dest         ; Schieben, falls evtl. A>=16 +                push    a               ; A wird zerschossen +                bit     4,a             ; Akku im Bereich 16..31 ? +                jr      z,smaller +                op      16,dest         ; dann einmal groá schieben +smaller:        push    f               ; Carry erhalten +                and     a,15            ; obere Bits pl„tten +                jr      z,fertig +                pop     f               ; evtl. Rest verarbeiten +                op      a,dest +                jr      ende            ; Carry schon gut +fertig:         pop     f +ende:           pop     a               ; A zurck +                endm + +                section FloatLib + +;------------------------------------------------------------------------------ +; Konstanten + +Ld10:           dd      ld(10)          ; Konversionskonstanten +One:            dd      1.0 +Half:           dd      0.5 +Ten:            dd      10.0 +Tenth:          dd      3dcccccdh       ; =0.1, aber die Rundung auf manchen +					; Systemen variiert (damit Test nicht +					; scheitert) + +Bias            equ     127 +MaxExpo         equ     255 +Comma           equ     '.' + +;------------------------------------------------------------------------------ +; Addition: XWA=XWA+XHL + +                proc    fadd + +                push    xbc             ; andere Register retten +                push    xde +                push    xhl + +                ld      xde,xwa         ; Operand 1 nach XDE verschieben +                rlc     1,xde           ; Vorzeichen der Operanden nach Bit 0 +                rlc     1,xhl +                ld      xbc,xde         ; Differenz bilden +                sub     xbc,xhl +                jr      nc,NoSwap       ; evtl. vertauschen, so daá +                ld      xwa,xhl         ; gr”áere in XDE +                ld      xhl,xde +                ld      xde,xwa +NoSwap:         ld      qa,e            ; Vorzeichen 1 ausmaskieren +                and     qa,1            ; (=Ergebnis Vorzeichen) +                bit     0,c             ; gleiches Vorzeichen ? +                jr      z,NoSub +                set     1,qa            ; dann Subtraktion vormerken + +NoSub:          sub     xbc,xbc         ; XBC initialisieren +                rlc     8,xde           ; Exponent 1 rausholen +                ld      c,e +                or      e,e             ; falls <>0, implizite 1 einbauen +                scc     nz,e +                rrc     1,xde +                ld      e,0             ; Bit 0..7 wieder pl„tten + +                rlc     8,xhl           ; dito Exponent 2 extrahieren +                ld      qc,l +                or      l,l +                scc     nz,l +                rrc     1,xhl +                ld      l,0 + +; Zwischenstand: +;  - Mantissen linksbndig inkl. impliziter Eins in XDE und XHL +;  - Exponent 1 in BC, Exponent 2 in QBC +;  - Ergebnisvorzeichen in QA, Bit 0 +;  - Subtraktionsflag in QA, Bit 1 + +                ld      wa,bc           ; Exponentendifferenz berechnen +                sub     wa,qbc +                cp      wa,24           ; >24, d.h. Zahl 2 vernachl„ssigbar gegen Zahl 1 +                jr      gt,Round        ; ja, Ergebnis ist gr”áere Zahl +                shifta  srl,xhl         ; ansonsten Mantisse 2 entspr. anpassen + +Add:            bit     1,qa            ; subtrahieren ? +                jr      nz,Subtract     ; ja--> +                add     xde,xhl         ; nein, Mantissen addieren +                jr      nc,Round        ; kein šberlauf, runden +                rr      1,xde           ; ansonsten šberlauf einschieben... +                inc     bc              ; ...und Exponent korrigieren +                jr      Round           ; normal weiter runden + +Subtract:       sub     xde,xhl         ; Mantissen subtrahieren +                jr      z,Zero          ; falls Null, Gesamtergebnis 0 +                jr      m,Round         ; fhrende 1 noch da: zum Runden +Normalize:      or      bc,bc           ; Exponent bereits Null ? +                jr      z,Round         ; dann denormales Ergebnis +                dec     bc              ; ansonsten Mantisse eins rauf, Exponent +                sll     1,xde           ; eins runter +                jr      p,Normalize     ; solange, bis Eins auftaucht + +Round:          add     xde,80h         ; Rundung auf Bit hinter Mantisse +                jr      nc,NoOver +                rr      1,xde           ; Bei šberlauf korrigieren +                inc     bc +NoOver:         ld      e,0             ; Mantissenrest pl„tten +                or      xde,xde         ; insgesamt 0 ? +                jr      z,Zero          ; dann Ergebnis 0 +                cp      bc,MaxExpo      ; Exponentenberlauf ? +                jr      lt,NoEOver +                ld      bc,MaxExpo      ; ja: Unendlich: Exponent=Maximum +                sub     xde,xde         ;                Mantisse=0 +                jr      Denormal + +NoEOver:        or      bc,bc           ; Exponent 0 ? +                jr      z,Denormal      ; ja, denormal +                sll     1,xde           ; fhrende Eins nicht speichern +Denormal:       ld      e,c             ; Exponenten einbauen +                rrc     8,xde           ; nach oben schieben +                rr      1,qa            ; Vorzeichen einbauen +                rr      1,xde + +Zero:           ld      xwa,xde         ; Ergebnis in Akku + +                pop     xhl             ; Register zurck +                pop     xde +                pop     xbc + +                ret + +                endp + +;------------------------------------------------------------------------------ +; Subtraktion: XWA=XWA-XHL + +                proc    fsub + +                xor     qh,80h          ; Vorzeichen 2 drehen +                jp      fadd            ; ansonsten wie Addition + +                endp + +;------------------------------------------------------------------------------ +; Multiplikation: XWA=XWA*XHL + +                proc    fmul + +		public  MulRound:Parent,MulZero:Parent,MulResult:Parent +		public	DivError:Parent + +		push    xbc             ; Register retten +		push    xde +		push    xhl +		push    xix +		push    xiy + +		ld      xiy,xwa         ; Op1 kopieren +                xor     xiy,xhl         ; Ergebnisvorzeichen bestimmen + +                ex      wa,qwa          ; Registerh„lften Op1 vertauschen +                ld      xde,xwa         ; Op1 ab sofort in XDE +                and     de,7fh          ; Exponent und Vz. behandeln +                and     wa,7f80h        ; Exponent maskieren +                jr      z,Denorm1       ; gleich Null-->Op1 denormal +                set     7,de            ; ansonsten implizite Eins einbauen +                sub     wa,80h          ; Bias kompensieren +Denorm1: +                ex      hl,qhl          ; Op2 genauso behandeln +                ld      xbc,xhl +                and     hl,7fh +                and     bc,7f80h +                jr      z,Denorm2 +                set     7,hl +                sub     bc,80h +Denorm2: +                add     bc,wa           ; Exponenten addieren +                srl     7,bc            ; richtig positionieren +                sub     bc,Bias-3       ; Bias-3 abziehen +                cp      bc,-24          ; totaler Unterlauf ? +		jr      lt,MulZero      ; dann Ergebnis 0 + +                ld      wa,de           ; beide oberen H„lften multiplizieren +                mul     xwa,hl +                ex      wa,qwa          ; Ergebnis in oberer H„lfte lagern +                ld      wa,de           ; obere H„lfte Op1 retten +                ex      de,qde          ; untere H„lfte Op1 holen +                ld      ix,hl           ; untere H„lfte Op1 * obere Op2 +                mul     xix,de +                ex      hl,qhl          ; untere Op1 * untere Op2 +                mul     xde,hl +                ex      de,qde          ; obere Op1 * untere Op2 +                mul     xhl,wa + +                ld      wa,de           ; Teile aufaddieren +                add     xwa,xix +                add     xwa,xhl +		jr      z,MulResult     ; Mantisse Null, Ergebnis Null +                jr      m,MulRound + +                or      bc,bc           ; Exponent negativ ? +                jr      m,Unterlauf     ; ggfs. Unterlauf behandeln + +Nor:            or      bc,bc           ; Exponent Null ? +                jr      z,MulRound      ; ja-->zum Runden +                rl      1,xde           ; nein, Mantisse eins nachschieben +                rl      1,xwa +                dec     bc              ; und Exponent runter +                or      xwa,xwa         ; fhrende Eins da ? +                jr      p,Nor           ; nein, weiterschieben + +MulRound:       add     xwa,80h         ; Rundung +                jr      nc,NoROver      ; dabei šberlauf ? +                rr      1,xwa           ; ja: Mantisse & Exponent korrigieren +                inc     bc +NoROver:        cp      bc,MaxExpo      ; Exponentenberlauf ? +                jr      lt,NoEOver +DivError:       ld      bc,MaxExpo      ; dann unendlich einstellen +                sub     xwa,xwa +                jr      Denormal + +NoEOver:        or      bc,bc           ; Exponent 0 ? +                jr      z,Denormal +                sll     1,xwa           ; fhrende 1 l”schen + +Denormal:       ld      a,c             ; Exponent einbauen +                rrc     8,xwa           ; hochschieben +                rl      1,xiy           ; Vorzeichen einbauen +                rr      1,xwa + +MulResult:      pop     xiy +                pop     xix +                pop     xhl +                pop     xde +                pop     xbc + +                ret + +MulZero:        sub     xwa,xwa         ; Null erzeugen +		jr      MulResult + +Unterlauf:      cp      bc,-24          ; totaler Unterlauf ? +		jr      le,MulZero      ; dann Null +		neg     bc              ; sonst umbauen +		ld      xde,xwa         ; dazu Akku freimachen +		sub     wa,wa           ; Endexponent +                ex      wa,bc           ; ist 0 +		shifta  srl,xde         ; Mantisse herunterschieben +                ld      xwa,xde         ; Ergebnis zurck nach XWA +                jr      MulRound        ; zurck mit Exponent 0 + +                endp + +;------------------------------------------------------------------------------ +; Division: XWA=XWA/XHL + +                proc    fdiv + +                push    xbc             ; Register retten (muá gleich zu fmul sein) +                push    xde +                push    xhl +                push    xix +                push    xiy + +                ld      xiy,xwa         ; Op1 kopieren +                xor     xiy,xhl         ; Ergebnisvorzeichen bestimmen + +                ex      wa,qwa          ; Vorbehandlung wie bei fmul +                ld      xde,xwa +                and     de,7fh +                and     wa,7f80h +                jr      z,Denorm1 +                set     7,de +                sub     wa,80h +Denorm1: +                ex      hl,qhl +                ld      xbc,xhl +                and     hl,7fh +                and     bc,7f80h +                jr      z,Denorm2 +                set     7,hl +                sub     bc,80h +Denorm2: +                sub     wa,bc           ; Exponentendifferenz bilden +                ld      bc,wa           ; muá in BC liegen +                sra     7,bc            ; richtig positionieren +                add     bc,Bias         ; Bias addieren +                cp      bc,-24          ; totaler Unterlauf ? +                jr      lt,MulZero      ; ja, Ergebnis Null + +                ex      hl,qhl          ; Format 0fff ... ffff 0000 0000 +		or      xhl,xhl         ; Ergebnis unendlich ? +		jrl     z,DivError +                sll     7,xhl +                ex      de,qde          ; dito Divident +                or      xde,xde         ; falls Null, Ergebnis Null +                jrl     z,MulZero +                sll     7,xde + +NormLoop:       bit     14,qhl          ; Divisor normalisiert ? +                jr      nz,Normal +                inc     bc              ; nein, Exponent RAUF (ist Ergebnisexponent) +                sll     1,xhl +                jr      NormLoop + +Normal:         sub     xwa,xwa         ; Ergebnisquotient vorbesetzen +                add     bc,25           ; Exponent nicht gr”áer als 0 + +Loop:           ld      xix,xde         ; Divident zwischenspeichern +                sub     xde,xhl         ; probeweise abziehen +                ccf                     ; Carry drehen +                jr      c,IsOne         ; ungedrehter Carry=1: Divisor paát +                ld      xde,xix         ; ansonsten zurckkopieren +IsOne:          rl      1,xwa           ; Ergebnisbit einschieben +                sll     1,xde           ; Divident verschieben +                dec     bc              ; Exponent runter +                or      bc,bc +                jr      z,Denorm        ; falls Null, denormalisieren +                bit     8,qwa           ; fhrende Eins da ? +                jr      z,Loop          ; nein, weiterrechnen + +Denorm:         sll     7,xwa           ; Mantisse positionieren +                jrl     z,MulResult     ; Ergebnis 0 ? +                jrl     MulRound        ; ansonsten zum Runden + +                endp + +;----------------------------------------------------------------------------- +; Multiplikation mit Zweierpotenz: XWA=XWA*2^BC + +                proc    fmul2 + +                push    bc              ; Register retten +                push    xde + +                ld      xde,xwa         ; Vorzeichen merken +                sll     1,xwa           ; Vorzeichen rausschieben +                jr      z,Zero          ; falls Null, Ergebnis Null +                rlc     8,xwa           ; Exponent nach unten... +                sub     de,de           ; und in DE packen +                add     e,a +                jr      z,Denorm        ; falls denormalisiert.. +                or      bc,bc           ; Multiplikation oder Division ? +                jr      m,Divide        ; (neg. Exponent=Division) + +                add     de,bc           ; Exponent addieren +                cp      de,MaxExpo      ; šberlauf ? +                jr      ge,Over         ; ja, Ergebnis unendlich +Result:         ld      a,e             ; Ergebnisexponent einbauen +                rrc     8,xwa           ; Exponent nach oben +                rl      1,xde           ; Vorzeichen einschieben +                rr      1,xwa + +Zero:           pop     xde             ; Register zurck +                pop     bc +                ret + +Over:           ld      de,MaxExpo      ; Ergebnis unendlich +                sub     xwa,xwa +                jr      Result + +Divide:         add     de,bc           ; Exponentensumme bilden +                jr      gt,Result       ; >0, keine Sonderbehandlung +                scf                     ; ansonsten 1 explizit fr +                rr      1,xwa           ; denormale Zahl machen +DDenorm:        or      de,de           ; Exponent=0 ? +                jr      z,Result        ; ja, Ergebnis einfach denormal +                srl     1,xwa           ; ansonsten weiter denormalisieren +                jr      z,Zero          ; dabei totaler Unterlauf->Null +                inc     de              ; Exponent korrigieren +                jr      DDenorm +DDDenorm:       add     de,bc           ; Exponentensumme bilden +                jr      DDenorm + +Denorm:         or      bc,bc           ; Multiplikation oder Division ? +                jr      m,DDDenorm +                sub     a,a             ; alten Exponenten l”schen +Norm:           sll     1,xwa           ; normalisieren... +                jr      c,Stop          ; bis fhrende Eins da +                dec     bc              ; oder 2. Exponent 0 +                or      bc,bc +                jr      nz,Norm +                jr      Result          ; Multiplikator kompl. fr Normalisierung draufgegangen +Stop:           add     de,bc           ; Rest addieren +                jr      Result          ; alles andere schon o.k. + +                endp + +;------------------------------------------------------------------------------ +; LongInt-->Float : XWA-->XWA + +                proc    fitof + +                push    xbc             ; Register retten + +                or      xwa,xwa         ; Null ? +                jr      z,Result        ; dann Ergebnis Null +                scc     m,qc            ; Vorzeichen nach QC, Bit 0 +                jr      p,Positive +                cpl     wa              ; falls negativ,drehen +                cpl     qwa +                inc     xwa +Positive:       ld      bc,Bias+32      ; Exponent vorbesetzen +Shift:          dec     bc              ; Mantisse verschieben +                sll     1,xwa +                jr      nc,Shift +                ld      a,c             ; Exponent einbauen +                rrc     8,xwa           ; Exponent nach oben +                rr      1,qc            ; Vorzeichen einbauen +                rr      1,xwa + +Result:         pop     xbc             ; Register zurck +                ret + +                endp + +;------------------------------------------------------------------------------ +; Float-->LongInt : XWA-->XWA + +                proc    fftoi + +                push    bc              ; Register retten + +                rl      1,xwa           ; Vorzeichen in Carry +                scc     c,b             ; in B merken + +                rlc     8,xwa           ; Exponent nach unten +                ld      c,a             ; in C legen +                sub     c,Bias          ; Bias abziehen + +                jr      m,Zero          ; neg. Exponent -> Zahl<0 -> Ergebnis 0 +                cp      c,31            ; šberlauf ? +                jr      ge,Over + +                scf                     ; fhrende Eins einschieben +                rr      1,xwa +                sub     a,a             ; Exponent l”schen + +Shift:          srl     1,xwa           ; jetzt schieben, bis Ergebnis stimmt +                inc     c +                cp      c,31 +                jr      ne,Shift + +                srl     1,b             ; negieren ? +                jr      nc,Positive +                cpl     wa              ; ggfs. negieren +                cpl     qwa +                inc     xwa + +Positive:       pop     bc              ; Register zurck +                ret + +Zero:           sub     xwa,xwa         ; Ergebnis 0 +                jr      Positive + +Over:           ld      xwa,7fffffffh   ; šberlauf: Maxint zurckgeben +                srl     1,b             ; negativ ? +                jr      nc,Positive +                cpl     wa              ; ja, neg. Maximum zurckgeben +                cpl     qwa +                jr      Positive + +                endp + +;------------------------------------------------------------------------------ +; Quadratwurzel: XWA=SQRT(XWA) + +                proc    fsqrt + +                push    xbc             ; Register retten +                push    xde +                push    xhl +                push    xix + +                ld      xix,xwa         ; Argument retten +                or      xix,xix         ; Zahl negativ ? +                jrl     m,DomainError   ; dann geht es nicht + +                ex      ix,qix          ; MSW holen +                and     xix,7f80h       ; Exponent isolieren +                jrl     z,Zero          ; keine Behandlung denormaler Zahlen + +                and     xwa,7fffffh     ; Mantisse isolieren +                sub     ix,7fh*80h      ; Bias vom Exponenten entfernen +                bit     7,ix            ; Exponent ungerade ? +                res     7,ix +                jr      z,EvenExp +                add     xwa,xwa         ; ja: Mantisse verdoppeln +                add     xwa,1000000h-800000h ; impl. Eins dazu +EvenExp:                                ; erste Iteration ohne impl. Eins +                sra     1,ix            ; Exponent/2 mit Vorzeichen +                add     ix,7fh*80h      ; Bias wieder dazu +                ex      ix,qix          ; neuen Exponenten in QIX aufheben +                sll     7,xwa           ; x ausrichten +                ld      xde,40000000h   ; xroot nach erster Iteration +                ld      xhl,10000000h   ; m2=2 << (MaxBit-1) +Loop10:         ld      xbc,xwa         ; xx2 = x +Loop11:         sub     xbc,xde         ; xx2 -= xroot +                srl     1,xde           ; xroot = xroot/2 +                sub     xbc,xhl         ; x2 -= m2 +                jr      m,DontSet1 +                ld      xwa,xbc         ; x = xx2 +                or      xde,xhl         ; xroot += m2 +                srl     2,xhl           ; m2 = m2/4 +                jr      nz,Loop11 +                jr      WABCSame +DontSet1:       srl     2,xhl           ; m2 = m2/4 +                jr      nz,Loop10       ; 15* abarbeiten +                                        ; Bit 22..8 +                ld      xbc,xwa         ; 17. Iteration separat +WABCSame:       sub     xbc,xde +                rrc     1,xde           ; mitsamt Carry... +                ex      de,qde          ; auf neues Alignment umstellen +                sub     xbc,1           ; Carry von 0-$4000: x2 -= m2 +                jr      m,DontSet7 +                or      xbc,-40000000h  ; 0-$4000: x2 -= m2, Teil 2 +                ld      xwa,xbc +                or      de,4000h        ; xroot += m2 +DontSet7:       ex      wa,qwa          ; x auf neues Alignment umstellen +                ld      hl,1000h        ; m2 - obere H„lfte schon 0 +Loop20:         ld      xbc,xwa         ; xx2 = x +Loop21:         sub     xbc,xde         ; xx2 -= xroot +                srl     1,xde           ; xroot = xroot/2 +                sub     xbc,xhl         ; x2 -= m2 +                jr      m,DontSet2 +                ld      xwa,xbc         ; x = xx2 +                or      xde,xhl         ; xroot += m2 +                srl     2,xhl           ; m2 = m2/4 +                jr      nz,Loop21 +                jr      Finish +DontSet2:       srl     2,xhl           ; m2 = m2/4 +                jr      nz,Loop20       ; 7* abarbeiten + +Finish:         sub     xwa,xde         ; Aufrunden notwendig ? +                jr      ule,NoInc +                inc     xde             ; wenn ja, durchfhren +NoInc:          res     7,qde           ; impl. Eins l”schen +                or      xde,xix +                ld      xwa,xde         ; Ergebnis in XWA +                jr      End + +DomainError:    ld      xwa,0ffc00000h  ; -NAN zurckgeben +                jr      End + +Zero:           sub     xwa,xwa         ; Ergebnis 0 + +End:            pop     xix             ; Register zurck +                pop     xhl +                pop     xde +                pop     xbc +                ret + +                endp + +;------------------------------------------------------------------------------ +; Unterroutine Zehnerpotenz bilden: XWA=10.0^BC + +                section fPot10          ; nicht mit proc, da private Funktion +                public  fPot10:Parent +fPot10: + +                push    xbc             ; Register retten +                push    xhl + +                ld      xwa,(One)       ; Ausgangspunkt frs Multiplizieren +                ld      xhl,(Ten)       ; zu benutzende Potenz +                or      bc,bc           ; negative Potenz ? +                jr      p,IsPos +                ld      xhl,(Tenth)     ; dann eben Zehntel multiplizieren +                neg     bc              ; fr Schleife immer positiv +IsPos: +                or      bc,bc           ; Noch weiter multiplizieren ? +                jr      z,End +                bit     0,bc            ; Restpotenz ungerade ? +                jr      z,IsEven +                call    fmul            ; ja: einzeln multiplizieren +IsEven:         srl     1,bc            ; n„chste Stelle +                push    xwa             ; neue Potenz berechnen +                ld      xwa,xhl +                call    fmul            ; durch quadrieren +                ld      xhl,xwa +                pop     xwa +                jr      IsPos           ; weiter nach Einsen suchen + +End:            pop     xhl             ; Register zurck +                pop     xbc +                ret + +                endsection + +;------------------------------------------------------------------------------ +; Unterroutine Zahl dezimal wandeln + +                section fOutDec +                public  fOutDec:Parent +fOutDec: + +                push    xwa             ; Register retten +                push    xbc +                push    de +                push    xhl + +                bit     15,qwa          ; negativ ? +                jr      z,IsPos +                ld      (xix+),'-'      ; ja: vermerken... +                cpl     wa              ; ...und Zweierkomplement +                cpl     qwa +                inc     xwa +                jr      GoOn +IsPos:          bit     7,c             ; Pluszeichen ausgeben ? +                jr      nz,GoOn +                ld      (xix+),'+' +GoOn:           res     7,c             ; Plusflag l”schen +                ld      qbc,0           ; Nullflag und Z„hler l”schen + +InLoop:         ld      xhl,0           ; Division vorbereiten +                ld      e,32            ; 32 Bit-Division +DivLoop:        sll     1,xwa           ; eins weiterschieben +                rl      1,xhl +                srl     1,xwa           ; fr nachher +                sub     xhl,10          ; paát Divisor hinein ? +                jr      nc,DivOK +                add     xhl,10          ; nein, zurcknehmen... +                scf                     ; im Ergebnis 0 einschieben +DivOK:          ccf                     ; neues Ergebnisbit +                rl      1,xwa           ; Ergebnis in XWA einschieben... +                djnz    e,DivLoop + +                add     l,'0'           ; ASCII-Offset addieren +                bit     1,qb            ; schon im Nullbereich ? +                jr      z,NormVal +                ld      l,b             ; ja, dann gewnschtes Leerzeichen +NormVal:        push    l               ; auf LIFO legen +                inc     qc              ; ein Zeichen mehr +                or      xwa,xwa         ; Quotient Null ? +                scc     z,qb +                jr      nz,InLoop       ; wenn nicht Null, auf jeden Fall weiter +                cp      c,qc            ; ansonsten nur, falls min. Stellenzahl +                jr      ugt,InLoop      ; noch nicht erreicht + +OutLoop:        pop     a               ; jetzt Zeichen umgekehrt ablegen +                ld      (xix+),a +                djnz    qc,OutLoop + +                pop     xhl             ; Register zurck +                pop     de +                pop     xbc +                pop     xwa + +                ret + +                endsection + +;------------------------------------------------------------------------------ +; Gleitkomma nach ASCII wandeln: +; In:  Zahl in XWA +;      Zeiger auf Speicher in XHL +;      max. Anzahl Nachkommastellen in C +;      B/Bit 0 setzen, falls Mantissen-Pluszeichen unerwnscht +;      B/Bit 1 setzen, falls Exponenten-Pluszeichen unerwnscht +;      B/Bit 2..4 = Stellenzahl Exponent +;      B/Bit 5 setzen, falls Nullen am Ende der Mantisse unerwnscht +; Out: Zahl abgelegter Zeichen (exkl. NUL am Ende) in BC +;      (XHL) = gebildeter String + +                proc    fftoa + +                push    xix             ; Register retten +                push    xhl +                push    de +                push    xbc +                push    xwa + +                ld      xix,xhl         ; Zeiger auf Speicher kopieren +                ld      de,bc           ; Parameter sichern + +                ld      xhl,xwa         ; Zahl auf die Zerlegebank bringen +                res     15,qwa          ; Vorzeichen hier nicht mehr gebraucht + +                ld      c,'+'           ; Annahme positiv +                sll     1,xhl           ; Vorzeichen in Carry bringen +                jr      c,IsNeg         ; Minuszeichen immer erforderlich... +                bit     0,d             ; ...Pluszeichen optional +                jr      nz,NoMantSgn +                jr      WrMantSgn +IsNeg:          ld      c,'-'           ; ja +WrMantSgn:      ld      (xix+),c        ; Mantissenvorzeichen ablegen +NoMantSgn: +                ld      c,qh            ; Exponenten herausholen... +                extz    bc              ; ...auf 16 Bit erweitern... +                sll     8,xhl           ; ...und in Quelle l”schen + +                cp      bc,MaxExpo      ; Sonderwert (INF/NAN) ? +                jrl     z,SpecialVals   ; ja--> + +                or      bc,bc           ; Zahl denormal ? +                jr      nz,IsNormal     ; nein, normal weiter +                or      xhl,xhl         ; bei kompl. Null auch berspringen +                jr      z,IsNull +Normalize:      sll     1,xhl           ; ja: solange z„hlen, bis 1 erscheint +                jr      c,IsNormal +                dec     bc +                jr      Normalize +IsNormal:       sub     bc,Bias         ; Bias abziehen +IsNull: +                push    xwa             ; fr folgendes Zahl retten +                ld      wa,bc           ; Zweierexponenten in Float wandeln +                exts    xwa +                call    fitof +                ld      xhl,(Ld10)      ; in Dezimalexponenten wandeln +                call    fdiv +                or      xwa,xwa         ; Zahl negativ ? +                jr      p,NoCorr +                ld      xhl,(One)       ; dann nocheinmal korrigieren wg. +                call    fsub            ; unterer Gauáklammer +NoCorr:         call    fftoi           ; Den Ausflug in Float beenden +                ld      qbc,wa          ; den Zehnerexponenten retten +                ld      bc,wa +                call    fPot10          ; von diesem Exponenten Zehnerpotenz +                ld      xhl,xwa         ; bilden +                pop     xwa             ; alte Zahl zurck +                call    fdiv            ; Teilen: Ergebnis ist Zahl zwischen +Again:          ld      xhl,xwa         ; 1.0 und 9.9999..., diese retten +                call    fftoi           ; Vorkommastelle berechnen +                cp      a,10            ; doch etwas drber ? +                jr      ult,NoRoundErr +                ld      xwa,xhl         ; ja, dann noch einmal zehnteln +                ld      xhl,(Tenth) +                call    fmul +                inc     qbc +                jr      Again +NoRoundErr:     add     a,'0'           ; diese nach ASCII wandeln... +                ld      (xix+),a        ; ...und ablegen +                sub     a,'0'           ; wieder rckg„ngig machen +                cp      e,0             ; gar keine Nachkommastellen ? +                jr      eq,NoComma +                ld      (xix+),Comma    ; Dezimalpunkt ausgeben +                call    fitof           ; in ganze Gleitkommazahl wandeln +                call    fsub            ; Differenz bilden +                chg     15,qwa          ; war verkehrtherum... +                ld      xhl,xwa         ; nach XHL verschieben, weil XWA gebraucht +                ld      c,e             ; Zehnerpotenz fr Skalierung ausrechnen +                extz    bc              ; auf 16 Bit aufblasen +                call    fPot10          ; Skalierungswert berechnen +                call    fmul            ; hochmultiplizieren +                ld      xhl,(Half)      ; Rundung +                call    fadd +                call    fftoi           ; diese herausziehen +                ld      b,'0'           ; n-stellig mit Vornullen ausgeben +                ld      c,e +                set     7,c             ; kein Pluszeichen! +                call    fOutDec +                bit     5,d             ; Nullen am Ende abr„umen ? +                jr      nz,CleanZeros +NoComma: +                ld      a,d             ; falls Minimalstellenzahl Exponent=0 +                and     a,00011100b     ; und Exponent=0, vergessen +                or      a,qb +                or      a,qc +                jr      z,End + +                ld      (xix+),'E'      ; Exponenten ausgeben +                ld      wa,qbc +                exts    xwa +                ld      b,'0'           ; evtl. vornullen... +                ld      c,d             ; Bit 1-->Bit 7 +                rrc     2,c +                and     c,87h           ; Bits ausmaskieren +                call    fOutDec + +End:            pop     xwa             ; Register zurck +                pop     xbc +                pop     de +                pop     xhl +                ld      (xix),0         ; NUL-Zeichen im String nicht vergessen +                sub     xix,xhl         ; Stringl„nge berechnen +                ld      bc,ix +                pop     xix + +                ret + +SpecialVals:    or      xde,xde         ; Ist die Mantisse Null ? +                jr      nz,IsNAN +                ldw     (xix+),'NI'     ; ja: INF einschreiben +                ld      (xix+),'F' +                jr      End +IsNAN:          ldw     (xix+),'AN'     ; nein: NAN einschreiben +                ld      (xix+),'N' +                jr      End + +CleanZeros:     cp      (xix-1),'0'     ; steht da eine Null am Ende ? +                jr      nz,CleanNoZero  ; nein, Ende +                dec     xix             ; ja: Z„hler runter, so daá ber- +                jr      CleanZeros      ; schrieben wird und neuer Versuch +CleanNoZero:    cp      (xix-1),Comma   ; evtl. Komma entfernbar ? +                jr      nz,NoComma      ; nein--> +                dec     xix             ; ja: noch ein Zeichen weniger +                jr      NoComma + +                endp + +;------------------------------------------------------------------------------ +; ASCII nach Gleitkomma wandeln: +; In:  Zeiger auf String (ASCIIZ) in XHL +; Out: XWA = Ergebnis bzw. fehlerhafte Stelle +;      CY = 0, falls fehlerfrei + +                proc    fatof + +                push    xbc             ; Register retten +                push    xde +                push    xhl +                push    xix + +                ld      xix,xhl         ; Zeiger nach XIX +                ld      qbc,01          ; Phase 1 (Mantisse), noch kein Vorzeichen +                ld      xde,(Ten)       ; in der Mantisse mit 10 hochmultiplizieren +                ld      xhl,0           ; Mantisse vorbelegen +                ld      bc,0            ; Exponent vorbelegen + +ReadLoop:       ld      a,(xix+)        ; ein neues Zeichen holen +                extz    wa              ; auf 32 Bit aufblasen +                extz    xwa + +                cp      a,0             ; Endezeichen ? +                jrl     eq,Combine      ; ja, alles zusammen + +                cp      a,' '           ; Leerzeichen ignorieren +                jr      eq,ReadLoop + +                cp      a,'+'           ; Pluszeichen gnadenhalber zugelassen +                jr      ne,NoPlus       ; ist aber nur ein Dummy +                bit     0,qb            ; schon ein Vorzeichen dagewesen ? +                jrl     nz,Error        ; dann Fehler +                set     0,qb            ; ansonsten einfach setzen +                jr      ReadLoop +NoPlus: +                cp      a,'-'           ; Minuszeichen bewirkt schon eher etwas +                jr      ne,NoMinus +                bit     0,qb            ; darf auch nur einmal auftreten +                jrl     nz,Error +                set     0,qb +                cp      qc,1            ; je nach Phase anderes Flag setzen +                jr      ne,MinPhase3 +                set     1,qb            ; bei Mantisse Bit 1... +                jr      ReadLoop +MinPhase3:      set     2,qb            ; bei Exponent Bit 2 +                jr      ReadLoop +NoMinus: +                cp      a,'.'           ; Umschaltung zu Phase 2 (Nachkomma) ? +                jr      ne,NoPoint +                cp      qc,1            ; bish. Phase muá eins sein +                jrl     ne,Error +                ld      qc,2            ; neue Phase eintragen +                set     0,qb            ; Nachkomma darf kein Vorzeichen haben +                ld      xde,(Tenth)     ; im Nachkomma durch 10 teilen +                jr      ReadLoop +NoPoint: +                cp      a,'e'           ; kleines und groáes E zulassen +                jr      eq,IsE +                cp      a,'E' +                jr      ne,NoE +IsE:            cp      qc,3            ; vorherige Phase muá 1 oder 2 sein +                jr      eq,Error +                ld      qc,3            ; vermerken +                res     0,qb            ; Vorzeichen wieder zugelassen +                jr      ReadLoop +NoE: +                sub     a,'0'           ; jetzt nur noch 0..9 zugelassen +                jr      c,Error +                cp      a,9 +                jr      ugt,Error +                set     0,qb            ; nach Ziffern kein Vorzeichen mehr zulassen + +                cp      qc,1            ; Phase 1 (Mantisse) : +                jr      ne,NoPhase1 +                push    xwa             ; Zeichen retten +                ld      xwa,xde         ; bish. Mantisse * 10 +                call    fmul +                ld      xhl,xwa +                pop     xwa             ; Zahl nach Float wandeln +                call    fitof +                call    fadd            ; dazuaddieren +                ld      xhl,xwa         ; Mantisse zurcklegen +                jrl     ReadLoop +NoPhase1: +                cp      qc,2            ; Phase 2 (Nachkomma) : +                jr      ne,NoPhase2 +                call    fitof           ; Stelle nach Float wandeln +                push    xhl             ; Mantisse retten +                ld      xhl,xde         ; Stelle mit Zehnerpotenz skalieren +                call    fmul +                pop     xhl             ; zur Mantisse addieren +                call    fadd +                push    xwa             ; Zwischenergebnis retten +                ld      xwa,xde         ; n„chste Skalierungspotenz ausrechnen +                ld      xhl,(Tenth) +                call    fmul +                ld      xde,xwa         ; alles wieder zurck +                pop     xhl +                jrl     ReadLoop +NoPhase2: +                mul     bc,10           ; Exponent heraufmultiplizieren +                add     bc,wa +                cp      bc,45           ; Minimum ist 1e-45 +                jr      ugt,Error +                jrl     ReadLoop + +Combine:        bit     2,qb            ; Exponent negativ ? +                jr      z,ExpPos +                neg     bc +ExpPos:         call    fPot10          ; Zehnerpotenz des Exponenten bilden +                call    fmul            ; mit Mantisse kombinieren +                bit     1,qb            ; Mantisse negativ ? +                jr      z,ManPos +                set     15,qwa +ManPos:         rcf                     ; Ende ohne Fehler + +                pop     xix             ; Register zurck +                pop     xhl +                pop     xde +                pop     xbc +                ret + +Error:          ld      xwa,xix         ; Endzeiger laden +                pop     xix +                pop     xhl +                sub     xwa,xhl         ; rel. Position des fehlerhaften Zeichens berechnen +                pop     xde +                pop     xbc +                scf                     ; Ende mit Fehler +                ret + +                endp + +;------------------------------------------------------------------------------ +; gemeinsames Ende + +                endsection + diff --git a/tests/t_fl900/macros.inc b/tests/t_fl900/macros.inc new file mode 100644 index 0000000..951a117 --- /dev/null +++ b/tests/t_fl900/macros.inc @@ -0,0 +1,16 @@ +; MACROS.INC +;****************************************************************************** +;* šberall gebrauchte Makros                                                  * +;*                                                                            * +;* Alfred Arnold, Oktober 1993                                                * +;****************************************************************************** + +proc            macro   name            ; Prozedureintritt +                section name +                public  name +name            label   $ +                endm + +endp            macro   name            ; Prozeduraustritt +                endsection name +                endm diff --git a/tests/t_fl900/t_fl900.asm b/tests/t_fl900/t_fl900.asm new file mode 100644 index 0000000..72510c2 --- /dev/null +++ b/tests/t_fl900/t_fl900.asm @@ -0,0 +1,166 @@ +; FTEST.ASM +;****************************************************************************** +;* Testet Gleitkommabibliothek fr TLCS900                                    * +;*                                                                            * +;* Hardware: Micro-ICE TLCS900                                                * +;* Software: AS 1.39p1 oder h”her                                             * +;*           Includes MACROS.INC, FLOAT.INC, CONOUT.INC, CPU_TIME.INC         * +;*                                                                            * +;* šbersetzen mit AS ftest oder beiliegendem Makefile                         * +;*                                                                            * +;****************************************************************************** + +                cpu     96c141 + +                org     1000h           ; Startadresse User-RAM + +;------------------------------------------------------------------------------ + +CR              equ     13 +LF              equ     10 +Format_Tab      equ     0000100000000110b ; fftoa-Format fr tab. Ausgabe +Format_Min      equ     0010001100000101b ; fftoa-Format fr minimale L„nge +;                         ³<Â>³³<ÄÄÂÄÄÄ> +;                         ³ ³ ³³   ³ +;                         ³ ³ ³³   ÀÄÄÄÄÄÄ Maximalzahl Nachkommastellen +;                         ³ ³ ³ÀÄÄÄÄÄÄÄÄÄÄ Mantissenpluszeichen unterdrcken +;                         ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄ Exponentenpluszeichen unterdrcken +;                         ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄ Minimalstellenzahl Exponent +;                         ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ anh„ngende Nullen Mantisse l”schen +Format          equ     Format_Tab      ; gew„hltes fftoa-Format + +                supmode on              ; Vorgaben +                maxmode on +                macexp  off +                page    0               ; keine FFs +                include macros.inc + +;------------------------------------------------------------------------------ +; Hauptroutine, Test + +; kleine Schreiberleichterung: + +bench           macro   op,arg1,arg2,arg3,msg +                call    PSTR            ; Kennmeldung ausgeben +                db      msg,StrTerm +                call    CPU_TIME        ; Uhr starten +                ld      xwa,arg1        ; Operanden holen +                if      "ARG2"<>""      ; 2. Operanden evtl. weglassen +                 ld     xhl,arg2 +                endif +                if      "ARG3"<>""      ; dito 3. Operanden +                 ld     bc,arg3 +                endif +                call    op              ; Probanden laufen lassen +                ld      (xiz),xwa       ; Ergebnis weglegen... +                call    CPU_STOP        ; Uhr anhalten, Zeit ausgeben +                if ("OP"<>"FNOP")&&("OP"<>"FFTOI") +                 call    PSTR            ; etwas Platz +                 db      ", Ergebnis: ",StrTerm +                 ld      xwa,(xiz+)      ; Wert ausgeben +                 lda     xhl,(Buffer) +                 ld      bc,Format +                 call    fftoa +                 call    TXTAUS +                endif +                call    PSTR +                db      CR,LF,StrTerm +                endm + +                proc    Main + +                max                     ; ohne das macht das keinen Spaá ! +                lda     xsp,(Stack)     ; etwas brauchen wir schon... +                lda     xiz,(Ergs)      ; Zeiger auf Ergebnisfeld +                call    CPU_TI_INI      ; Timer initialisieren + +                ; Overhead messen +                bench   fnop,(FConst1),(FConst1),,"Overhead            : " + +                ; Addition zweier fast gleicher Zahlen +                bench   fadd,(FConst1),(FConst2),,"Laufzeit 1+2        : " + +                ; Addition zweier unterschiedl. groáer Zahlen +                bench   fadd,(FConst1),(FConst100000),,"Laufzeit 1+100000   : " + +                ; Subtraktion zweier fast gleicher Zahlen +                bench   fsub,(FConst1),(FConst2),,"Laufzeit 1-2        : " + +                ; Subtraktion zweier unterschiedl. groáer Zahlen +                bench   fsub,(FConst1),(FConst100000),,"Laufzeit 1-100000   : " + +                ; Multiplikation +                bench   fmul,(FConst2),(FConstPi),,"Laufzeit 2*Pi       : " + +                ; Division +                bench   fdiv,(FConst2),(FConstPi),,"Laufzeit 2/Pi       : " + +                ; Multiplikation mit 2er-Potenz +                bench   fmul2,(FConstPi),,10,"Laufzeit Pi*2^(10)  : " + +                ; Division durch 2er-Potenz +                bench   fmul2,(FConstPi),,-10,"Laufzeit Pi*2^(-10) : " + +                ; kleine Zahl nach Float wandeln +                bench   fitof,1,,,"Laufzeit 1-->Float  : " + +                ; groáe Zahl nach Float wandeln +                bench   fitof,100000,,,"Laufzeit 1E5-->Float: " + +                ; kleine Zahl nach Int wandeln +                bench   fftoi,(FConst1),,,"Laufzeit 1-->Int    : " + +                ; groáe Zahl nach Int wandeln +                bench   fftoi,(FConst100000),,,"Laufzeit 1E5-->Int  : " + +                ; Wurzel +                bench   fsqrt,(FConst2),,,"Laufzeit SQRT(2)    : " + +                call    PSTR +                db      "Eingabe: ",StrTerm +                lda     xhl,(InpBuffer) +                call    TXTAUS +                call    fatof +                call    PSTR +                db      ", Ergebnis: ",StrTerm +                lda     xhl,(Buffer) +                ld      bc,Format +                call    fftoa +                call    TXTAUS +                call    PSTR +                db      13,10,StrTerm + +                swi     7               ; zum Monitor zurck + +                endp + +fnop:           ld      xwa,0           ; Dummy +                ret + +                include "float.inc" +                include "conout.inc" +                include "cpu_time.inc" + +;------------------------------------------------------------------------------ +; Gleitkommakonstanten + +                align   4               ; fr schnelleren Zugriff + +FConst1         dd      1.0 +FConst2         dd      2.0 +FConst100000    dd      100000.0 +FConstM1        dd      -1.0 +FConstM2        dd      -2.0 +FConstPi        dd      40490fdbh       ; um Vergleichsfehler durch Rundung zu  +					; vermeiden +Ergs            dd      30 dup (?)      ; Platz fr Ergebnisse + +Buffer:         db      20 dup (?) +InpBuffer:      db      "12.3456E-12",0 + +;------------------------------------------------------------------------------ +; Stack + +                db      200 dup (?) +Stack: + diff --git a/tests/t_fl900/t_fl900.doc b/tests/t_fl900/t_fl900.doc new file mode 100644 index 0000000..4e7cf63 --- /dev/null +++ b/tests/t_fl900/t_fl900.doc @@ -0,0 +1,6 @@ ++------------------------  Test Application FL900 ----------------------------+ +|                                                                             | +|  This is an IEEE single precision floating point library for the Toshiba    | +|  TLCS-900 microcontroller, embedded into a small test program.              | +|                                                                             | ++-----------------------------------------------------------------------------+ diff --git a/tests/t_fl900/t_fl900.inc b/tests/t_fl900/t_fl900.inc new file mode 100644 index 0000000..4a02c1e --- /dev/null +++ b/tests/t_fl900/t_fl900.inc @@ -0,0 +1,2 @@ +; t_fl900.asm-Includefile für Assembler-Programm +; Ende Includefile für Assembler-Programm diff --git a/tests/t_fl900/t_fl900.ori b/tests/t_fl900/t_fl900.ori Binary files differnew file mode 100755 index 0000000..74929d8 --- /dev/null +++ b/tests/t_fl900/t_fl900.ori diff --git a/tests/t_full09/asflags b/tests/t_full09/asflags new file mode 100644 index 0000000..27cc2fa --- /dev/null +++ b/tests/t_full09/asflags @@ -0,0 +1 @@ +-D __6309__ diff --git a/tests/t_full09/t_full09.asm b/tests/t_full09/t_full09.asm new file mode 100644 index 0000000..4b39d38 --- /dev/null +++ b/tests/t_full09/t_full09.asm @@ -0,0 +1,1604 @@ +                cpu     6309 + +list            macro +                listing on +                endm + +nolist          macro +                listing off +                endm + +db              macro   op +                byt     (op) +                endm + +fcb             macro   op +                byt     (op) +                endm + +fcc             macro   op +                byt     (op) +                endm + +dw              macro   op +                adr     (op) +                endm + +fdb             macro   op +                adr     (op) +                endm + +fcw             macro   op +                adr     (op) +                endm + +ds              macro   op +                dfs     (op) +                endm + +rmb             macro   op +                rept    op +                db      0 +                endm +                endm + +dd              macro   op +                adr     (op)>>16,(op)&$ffff +                endm + +fcd             macro   op +                adr     (op)>>16,(op)&$ffff +                endm + +direct          macro   num +                if      num=-1 +                 assume dpr:nothing +                elseif  num>255 +                 assume dpr:num>>8 +                elseif +                 assume dpr:num +                endif +                endm + +page            macro +                newpage +                endm + +opt             macro +                endm + +noopt           macro +                endm + +nop             macro   cnt +                if      "CNT"="" +__cnt            set    1 +                elseif +__cnt            set    cnt +                endif +                rept    __cnt +                 !nop +                endm +                endm + +momseg          set     0 +segsave_code    set     0 +segsave_data    set     0 +segsave_bss     set     0 + +saveseg         macro +                switch  momseg +                case    0 +segsave_code    set     * +                case    1 +segsave_data    set     * +                case    2 +segsave_bss     set     * +                endcase +                endm + +data            macro +                saveseg +                org     segsave_data +momseg          set     1 +                endm + +code            macro +                saveseg +                org     segsave_code +momseg          set     0 +                endm + +bss             macro +                saveseg +                org     segsave_bss +momseg          set     2 +                endm + +;-------------------------------------------------------------------------- + +; <:t17,25,41,45:> +; +=====================================================================+ +; |                                                                     | +; |   TESTCASE.A09                                                      | +; |                                                                     | +; |   Test case for 6809/6309 assembler.                                | +; |                                                                     | +; |   Copyright 1993, Frank A. Vorstenbosch                             | +; |                                                                     | +; +=====================================================================+ +; +; File created 13-oct-93 + +                title   "Test case for 6809/6309 assembler" + +                list + +; +---------------------------------------------------------------------+ +; |                                                                     | +; |   Options.                                                          | +; |                                                                     | +; +---------------------------------------------------------------------+ + +;   -dERRORS   check error handling +;   -n         disable optimizations + + +; +---------------------------------------------------------------------+ +; |                                                                     | +; |   Assembler pseudo instructions.                                    | +; |                                                                     | +; +---------------------------------------------------------------------+ + +; ----- expressions ----------------------------------------------------- + +                data +                org     4 +                bss +                org     1634 + +TEST            equ     2+*/2 +                ifdef ERRORS +TEST            equ     TEST+1 +                endif + +Constant8       equ     -43 +Constant16      equ     16383 +Constant32      equ     96285725 +Address         equ     $bb5a + +ANOTHER         set     3|24&8 +ANOTHER         set     (3|24)&8 +ANOTHER         set     4*(3>5) +ANOTHER         set     4*~~(3<5) +ANOTHER         set     15<<4 +ANOTHER         set     ANOTHER+1 +ANOTHER         set     ANOTHER+1       ; shorthand for SET + +CHAR            equ     "a" +DOUBLECHAR      equ     "xy" +QUADCHAR        equ     "quad" + +                ifdef ERRORS +TRIPLE          equ     "abc" +TOOMUCH         equ     "abcde" +                endif + +                data +AddressFour     dw      TEST +                dw      **5 + +                org     $800 + +                direct  $8 +                direct  $0800 + +                ds      14 +DirectByte      db      123 +                align   32 +DirectWord      dw      12345 +                align   48 +DirectLong      dd      123456789 +                align   79 +DirectCode      rts + +                dw      1234#12 +                dw      %1010100101 +                dw      (1+2)#8 +                dw      1010101#%1010101 + +                bss +Unin_1          db      0 +Unin_2          dw      4256 +Unin_3          dd      34568957 + +                code +                org     $200 + +                page + +                ifdef ERRORS +1 +                equ     123 +                psscht +                ! +                endif + +; ----- range checking on immediate values ------------------------------ + +                lda     #10 +                lda     #100 +                ifdef ERRORS +                lda     #1000 +                lda     #10000 +                lda     #100000 +                lda     #1000000 +                lda     #10000000 +                lda     #100000000 +                lda     #1000000000 +                endif + +                ldx     #10 +                ldx     #100 +                ldx     #1000 +                ldx     #10000 +                ifdef ERRORS +                ldx     #100000 +                ldx     #1000000 +                ldx     #10000000 +                ldx     #100000000 +                ldx     #1000000000 +                endif + +                ifdef __6309__ +                ldq     #10 +                ldq     #100 +                ldq     #1000 +                ldq     #10000 +                ldq     #100000 +                ldq     #1000000 +                ldq     #10000000 +                ldq     #100000000 +                ldq     #1000000000 +                endif + +                page    10              ; keep 10 lines togethre + +; ----- align ----------------------------------------------------------- + +                align   16 +                align   32 + + +; ----- code, data, org ------------------------------------------------- + +                code +                org     $1300 +                data +                org     $1180 + +                code +                lda     #1 + +                data +Table           db      1,2,3 + +                code +                ldx     #Table + + +; ----- db, fcb, fcc ---------------------------------------------------- + +Message1        db      7,"Error",13,10,0 + +Message2        fcb     7 +                fcc     "Error" +                fcb     13,10,0 + + +; ----- ds, rmb --------------------------------------------------------- + +                ds      10 +                rmb     10 + + +; ----- dw, fcw, fdb ---------------------------------------------------- + +                dw      23457 +                fcw     13462 +                fdb     6235 + + +; ----- if ... else ... endif ------------------------------------------- + +                if      5=6 +                db      0 +                if      0 +                db      1 +                else +                db      2 +                endif +                db      3 +                else +                db      4 +                if      1 +                db      5 +                else +                db      6 +                endif +                db      7 +                endif + + +; ----- list, nolist ---------------------------------------------------- + +                nolist +                ; comment not listed +                db      10 + +                list +                ; comment is listed +                db      10 + + +; ----- opt, noopt ------------------------------------------------------ + +                noopt + +                opt + + +; ----- nop ------------------------------------------------------------- + +                nop +                nop     3 +                 + +; ----- struct ---------------------------------------------------------- + +;                struct  ListNode +;                dw      LN_Next +;                dw      LN_Previous +;                db      LN_Type +;                end struct + + +; ----- number bases ---------------------------------------------------- + +                dd      1 +                dd      10 +                dd      100 +                dd      1000 + +                dd      $1 +                dd      $10 +                dd      $100 +                dd      $1000 + +                dd      %1 +                dd      %10 +                dd      %100 +                dd      %1000 + +                dd      @1 +                dd      @10 +                dd      @100 +                dd      @1000 + +                dd      2#1 +                dd      2#10 +                dd      2#100 +                dd      2#1000 + +                dd      3#1 +                dd      3#10 +                dd      3#100 +                dd      3#1000 +                dd      3#12 + +                dd      4#1 +                dd      4#10 +                dd      4#100 +                dd      4#1000 +                dd      4#123 + +                dd      5#1 +                dd      5#10 +                dd      5#100 +                dd      5#1000 +                dd      5#1234 + +                dd      6#1 +                dd      6#10 +                dd      6#100 +                dd      6#1000 +                dd      6#2345 + +                dd      7#1 +                dd      7#10 +                dd      7#100 +                dd      7#1000 +                dd      7#3456 + +                dd      8#1 +                dd      8#10 +                dd      8#100 +                dd      8#1000 +                dd      8#4567 + +                dd      9#1 +                dd      9#10 +                dd      9#100 +                dd      9#1000 +                dd      9#5678 + +                dd      10#1 +                dd      10#10 +                dd      10#100 +                dd      10#1000 +                dd      10#6789 + +                dd      11#1 +                dd      11#10 +                dd      11#100 +                dd      11#1000 +;                dd      11#789a + +                dd      12#1 +                dd      12#10 +                dd      12#100 +                dd      12#1000 +;                dd      12#89ab + +                dd      13#1 +                dd      13#10 +                dd      13#100 +                dd      13#1000 +;                dd      13#9abc + +                dd      14#1 +                dd      14#10 +                dd      14#100 +                dd      14#1000 +;                dd      14#abcd + +                dd      15#1 +                dd      15#10 +                dd      15#100 +                dd      15#1000 +;                dd      15#bcde + +                dd      16#1 +                dd      16#10 +                dd      16#100 +                dd      16#1000 +;                dd      16#cdef + +                dd      17#1 +                dd      17#10 +                dd      17#100 +                dd      17#1000 +;                dd      17#defg + +                dd      18#1 +                dd      18#10 +                dd      18#100 +                dd      18#1000 +;                dd      18#efgh + +                dd      19#1 +                dd      19#10 +                dd      19#100 +                dd      19#1000 +;                dd      19#fghi + +                dd      20#1 +                dd      20#10 +                dd      20#100 +                dd      20#1000 +;                dd      20#ghij + +                dd      21#1 +                dd      21#10 +                dd      21#100 +                dd      21#1000 +;                dd      21#hijk + +                dd      22#1 +                dd      22#10 +                dd      22#100 +                dd      22#1000 +;                dd      22#ijkl + +                dd      23#1 +                dd      23#10 +                dd      23#100 +                dd      23#1000 +;                dd      23#jklm + +                dd      24#1 +                dd      24#10 +                dd      24#100 +                dd      24#1000 +;                dd      24#klmn + +                dd      25#1 +                dd      25#10 +                dd      25#100 +                dd      25#1000 +;                dd      25#lmno + +                dd      26#1 +                dd      26#10 +                dd      26#100 +                dd      26#1000 +;                dd      26#mnop + +                dd      27#1 +                dd      27#10 +                dd      27#100 +                dd      27#1000 +;                dd      27#nopq + +                dd      28#1 +                dd      28#10 +                dd      28#100 +                dd      28#1000 +;                dd      28#opqr + +                dd      29#1 +                dd      29#10 +                dd      29#100 +                dd      29#1000 +;                dd      29#pqrs + +                dd      30#1 +                dd      30#10 +                dd      30#100 +                dd      30#1000 +;                dd      30#qrst + +                dd      31#1 +                dd      31#10 +                dd      31#100 +                dd      31#1000 +;                dd      31#rstu + +                dd      32#1 +                dd      32#10 +                dd      32#100 +                dd      32#1000 +;                dd      32#stuv + +                dd      33#1 +                dd      33#10 +                dd      33#100 +                dd      33#1000 +;                dd      33#tuvw + +                dd      34#1 +                dd      34#10 +                dd      34#100 +                dd      34#1000 +;                dd      34#uvwx + +                dd      35#1 +                dd      35#10 +                dd      35#100 +                dd      35#1000 +;                dd      35#vwxy + +                dd      36#1 +                dd      36#10 +                dd      36#100 +                dd      36#1000 +;                dd      36#wxyz + +                ifdef ERRORS +                dd      37#1 +                dd      37#10 +                dd      37#100 +                dd      37#1000 + +                dd      1#1 +                dd      1#10 +                dd      1#100 +                dd      1#1000 + +                dd      0#1 +                dd      0#10 +                dd      0#100 +                dd      0#1000 +                endif + + +; ----- garbage in inactive if-clause ----------------------------------- +                 +                if 0 + !"#$%&'()*+,-./ +0123456789:;<=>? +@ABCDEFGHIJKLMNO +PQRSTUVWXYZ[\]^_ +`abcdefghijklmno +pqrstuvwxyz{|}~ +€‚ƒ„…†‡ˆ‰Š‹ŒŽ +‘’“”•–—˜™š›œžŸ + ¡¢£¤¥¦§¨©ª«¬®¯ +°±²|´µ¶·¸¹|+¼½¾¿ +ÀÁÂÃ-ÅÆÇÈ+ÊËÌ=ÎÏ +ÐÑÒÓÔÕÖרÙÚÛÜÝÞß +àáâãäåæçèéêëìíîï +ðñòóôõö÷øùúûüýþ +                endif + + +; +=====================================================================+ +; |                                                                     | +; |   Instructions.                                                     | +; |                                                                     | +; È=====================================================================¼ + +; Ú---------------------------------------------------------------------¿ +; |                                                                     | +; |   Register to register operations.                                  | +; |                                                                     | +; À---------------------------------------------------------------------Ù + +Start           tfr     a,a             ; NOP +                tfr     a,b +                tfr     a,cc +                tfr     a,ccr +                tfr     a,dp +                tfr     a,dpr + +                tfr     b,a +                tfr     b,b             ; NOP +                tfr     b,cc +                tfr     b,ccr +                tfr     b,dp +                tfr     b,dpr + +                tfr     d,d             ; NOP +                tfr     d,x +                tfr     d,y +                tfr     d,u +                tfr     d,s +                tfr     d,sp + +                tfr     x,d +                tfr     x,x             ; NOP +                tfr     x,y +                tfr     x,u +                tfr     x,s +                tfr     x,sp + +                tfr     y,d +                tfr     y,x +                tfr     y,y             ; NOP +                tfr     y,u +                tfr     y,s +                tfr     y,sp + +                tfr     u,d +                tfr     u,x +                tfr     u,y +                tfr     u,u             ; NOP +                tfr     u,s +                tfr     u,sp + +                tfr     s,d +                tfr     s,x +                tfr     s,y +                tfr     s,u +                tfr     s,s             ; NOP +                tfr     s,sp            ; NOP + +                tfr     sp,d +                tfr     sp,x +                tfr     sp,y +                tfr     sp,u +                tfr     sp,s            ; NOP +                tfr     sp,sp           ; NOP + +                tfr     pc,d +                tfr     pc,x +                tfr     pc,y +                tfr     pc,u +                tfr     pc,s +                tfr     pc,sp + +                ifdef __6309__ +                tfr     a,e +                tfr     a,f +                tfr     b,e +                tfr     b,f + +                tfr     e,a +                tfr     e,b +                tfr     e,cc +                tfr     e,ccr +                tfr     e,dp +                tfr     e,dpr +                tfr     e,e             ; NOP +                tfr     e,f + +                tfr     f,a +                tfr     f,b +                tfr     f,cc +                tfr     f,ccr +                tfr     f,dp +                tfr     f,dpr +                tfr     f,e +                tfr     f,f             ; NOP + +                tfr     d,v +                tfr     d,w + +                tfr     v,d +                tfr     v,v             ; NOP +                tfr     v,w +                tfr     v,x +                tfr     v,y +                tfr     v,u +                tfr     v,s +                tfr     v,sp + +                tfr     w,d +                tfr     w,v +                tfr     w,w             ; NOP +                tfr     w,x +                tfr     w,y +                tfr     w,u +                tfr     w,s +                tfr     w,sp + +                tfr     x,v +                tfr     x,w +                tfr     y,v +                tfr     y,w +                tfr     u,v +                tfr     u,w +                tfr     s,v +                tfr     s,w +                tfr     pc,v +                tfr     pc,w + +                tfr     z,a +                tfr     z,b +                tfr     z,cc +                tfr     z,ccr +                tfr     z,dp +                tfr     z,dpr +                tfr     z,e +                tfr     z,f +                tfr     z,d +                tfr     z,v +                tfr     z,w +                tfr     z,x +                tfr     z,y +                tfr     z,u +                tfr     z,s +                tfr     z,sp +                 +                tfr     a,z +                tfr     b,z +                tfr     cc,z +                tfr     ccr,z +                tfr     dp,z +                tfr     dpr,z +                tfr     e,z +                tfr     f,z +                tfr     d,z +                tfr     v,z +                tfr     w,z +                tfr     x,z +                tfr     y,z +                tfr     u,z +                tfr     s,z +                tfr     sp,z +                tfr     pc,z +                endif + +                ifdef ERRORS +                tfm     a,b +                tfr     a,d +                tfr     a,v +                tfr     a,w +                tfr     a,x +                tfr     a,y +                tfr     a,u +                tfr     a,s +                tfr     a,sp + +                tfr     b,d +                tfr     b,v +                tfr     b,w +                tfr     b,x +                tfr     b,y +                tfr     b,u +                tfr     b,s +                tfr     b,sp +                endif + + +; +---------------------------------------------------------------------+ +; |                                                                     | +; |   Addressing modes.                                                 | +; |                                                                     | +; +---------------------------------------------------------------------+ + +                lda     #0 +                lda     DirectByte +                lda     >DirectByte +                lda     AddressFour +                ifdef ERRORS +                lda     <AddressFour +                endif +                lda     12+5*17/3 +                lda     ,x +                noopt +                lda     0,x +                opt +                lda     0,x +                lda     <0,x +                lda     <<0,x +                noopt +                lda     <<0,x +                opt +                lda     >0,x +                lda     1,x +                lda     <1,x +                lda     <<1,x +                lda     >1,x +                lda     15,x +                lda     -16,x +                lda     16,x +                lda     -17,x +                lda     127,x +                lda     -128,x +                lda     128,x +                lda     -129,x +                lda     FORWARD5,x +                lda     <FORWARD5,x +                lda     <<FORWARD5,x +                lda     FORWARD99,x +                lda     <FORWARD99,x +                ifdef ERRORS +                lda     <<FORWARD99,x +                endif +                lda     a,x +                lda     b,x +                lda     d,x +                lda     ,x+ +                lda     ,x++ +                lda     ,-x +                lda     ,--x +                lda     NearData,pc +                lda     <NearData,pc +                lda     AddressFour,pc +                lda     [,x] +                lda     [0,x] +                lda     [1,x] +                lda     [15,x] +                lda     [-16,x] +                lda     [17,x] +                lda     [-17,x] +                lda     [127,x] +                lda     [-128,x] +                lda     [128,x] +                lda     [-129,x] +                lda     [a,x] +                lda     [b,x] +NearData        lda     [d,x] +                lda     [,x++] +                lda     [,--x] +                lda     [NearData,pc] +                lda     [>NearData,pc] +                lda     [AddressFour,pc] +                ifdef ERRORS +                lda     [<AddressFour,pc] +                endif + +FORWARD5        equ     5 +FORWARD99       equ     99 + +                ifdef __6309__ +                lda     e,x +                lda     f,x +                lda     w,x +                lda     ,w +                lda     0,w +                lda     1,w +                lda     ,w++ +                lda     ,--w +                lda     [e,x] +                lda     [f,x] +                lda     [w,x] +                lda     [,w] +                lda     [0,w] +                lda     [1000,w] +                lda     [,w++] +                lda     [,--w] +                endif + + +; +---------------------------------------------------------------------+ +; |                                                                     | +; |   Instructions in numerical order.                                  | +; |                                                                     | +; +---------------------------------------------------------------------+ + +                neg     DirectByte                  ; $00,2 +                ifdef __6309__ +                oim     #123,DirectByte             ; $01,3 +                aim     #123,DirectByte             ; $02,3 +                endif +                com     DirectByte                  ; $03,2 +                lsr     DirectByte                  ; $04,2 +                ifdef __6309__ +                eim     #123,DirectByte             ; $05,3 +                endif +                ror     DirectByte                  ; $06,2 +                asr     DirectByte                  ; $07,2 +                asl     DirectByte                  ; $08,2 +                lsl     DirectByte                  ; alternate +                rol     DirectByte                  ; $09,2 +                dec     DirectByte                  ; $0A,2 +                ifdef __6309__ +                tim     #1,DirectByte               ; $0B,3 +                endif +                inc     DirectByte                  ; $0C,2 +                tst     DirectByte                  ; $0D,2 +                jmp     DirectByte                  ; $0E,2 +                clr     DirectByte                  ; $0F,2 + +; ----------------------------------------------------------------------- + +                nop                                 ; $12,1 +                nop     4                           ; repeat count specified +                sync                                ; $13,1 +                ifdef __6309__ +                sexw                                ; $14,1 +                endif +                noopt +                lbra    AddressFour                 ; $16,3 +                lbsr    AddressFour                 ; $17,3 +                opt +                daa                                 ; $19,1 +                orcc    #1                          ; $1A,2 +                orcc    c                           ; alternate, specifying flags +                andcc   #~6                         ; $1C,2 +                andcc   z,v                         ; alternate +                sex                                 ; $1D,1 +                exg     a,b                         ; $1E,2 +                tfr     a,b                         ; $1F,2 +                ifdef __6309__ +                clrs                                ; using TFR to clear registers +                clrv +                clrx +                clry +                endif + +; ----------------------------------------------------------------------- + +BranchTarget    bra     BranchTarget                ; $20,2 +                brn     BranchTarget                ; $21,2 +                bhi     BranchTarget                ; $22,2 +                bls     BranchTarget                ; $23,2 +                bhs     BranchTarget                ; $24,2 +                bcc     BranchTarget                ; alternate +                blo     BranchTarget                ; $25,2 +                bcs     BranchTarget                ; alternate +                bne     BranchTarget                ; $26,2 +                beq     BranchTarget                ; $27,2 +                bvc     BranchTarget                ; $28,2 +                bvs     BranchTarget                ; $29,2 +                bpl     BranchTarget                ; $2A,2 +                bmi     BranchTarget                ; $2B,2 +                bge     BranchTarget                ; $2C,2 +                blt     BranchTarget                ; $2D,2 +                bgt     BranchTarget                ; $2E,2 +                ble     BranchTarget                ; $2F,2 + +; ----------------------------------------------------------------------- + +                leax    a,x                         ; 30,2+ +                leay    b,y                         ; 31,2+ +                leas    d,s                         ; 32,2+ +                leau    1,u                         ; 33,2+ +                pshs    a,b                         ; $34,2 +                pshs    all                         ; alternate +                pshs    #123                        ; alternate +                puls    x                           ; $35,2 +                puls    all                         ; alternate +                puls    #$ff                        ; alternate +                pshu    ccr                         ; $36,2 +                pulu    dpr                         ; $37,2 +                rts                                 ; $39,1 +                abx                                 ; $3A,1 +                rti                                 ; $3B,1 +                cwai    #127                        ; $3C,2 +                cwai    e                           ; alternate +                mul                                 ; $3D,1 +                swi                                 ; $3F,1 + +; ----------------------------------------------------------------------- + +                nega                                ; $40,1 +                coma                                ; $43,1 +                lsra                                ; $44,1 +                rora                                ; $46,1 +                asra                                ; $47,1 +                asla                                ; $48,1 +                lsla                                ; alternate +                rola                                ; $49,1 +                deca                                ; $4A,1 +                inca                                ; $4C,1 +                tsta                                ; $4D,1 +                clra                                ; $4F,1 + +; ----------------------------------------------------------------------- + +                negb                                ; $50,1 +                comb                                ; $53,1 +                lsrb                                ; $54,1 +                rorb                                ; $56,1 +                asrb                                ; $57,1 +                aslb                                ; $58,1 +                lslb                                ; alternate +                rolb                                ; $59,1 +                decb                                ; $5A,1 +                incb                                ; $5C,1 +                tstb                                ; $5D,1 +                clrb                                ; $5F,1 + +; ----------------------------------------------------------------------- + +                neg     ,x                          ; $60,2+ +                ifdef __6309__ +                oim     #4,,x                       ; $61,3+ +                aim     #8,,x                       ; $62,3+ +                endif +                com     ,x                          ; $63,2+ +                lsr     ,x                          ; $64,2+ +                ifdef __6309__ +                eim     #9,,x                       ; $65,3+ +                endif +                ror     ,x                          ; $66,2+ +                asr     ,x                          ; $67,2+ +                asl     ,x                          ; $68,2+ +                lsl     ,x                          ; alternate +                rol     ,x                          ; $69,2+ +                dec     ,x                          ; $6A,2+ +                ifdef __6309__ +                tim     #123,,x                     ; $6B,3+ +                endif +                inc     ,x                          ; $6C,2+ +                tst     ,x                          ; $6D,2+ +                jmp     ,x                          ; $6E,2+ +                clr     ,x                          ; $6F,2+ + +; ----------------------------------------------------------------------- + +                neg     AddressFour                 ; $70,3 +                ifdef __6309__ +                oim     #99,AddressFour             ; $71,4 +                aim     #99,AddressFour             ; $72,4 +                endif +                com     AddressFour                 ; $73,3 +                lsr     AddressFour                 ; $74,3 +                ifdef __6309__ +                eim     #-1,AddressFour             ; $75,4 +                endif +                ror     AddressFour                 ; $76,3 +                asr     AddressFour                 ; $77,3 +                asl     AddressFour                 ; $78,3 +                lsl     AddressFour                 ; alternate +                rol     AddressFour                 ; $79,3 +                dec     AddressFour                 ; $7A,3 +                ifdef __6309__ +                tim     #-128,AddressFour           ; $7B,4 +                endif +                inc     AddressFour                 ; $7C,3 +                tst     AddressFour                 ; $7D,3 +                jmp     AddressFour                 ; $7E,3 +                clr     AddressFour                 ; $7F,3 + +; ----------------------------------------------------------------------- + +CallAddress     suba    #123                        ; $80,2 +                cmpa    #123                        ; $81,2 +                sbca    #123                        ; $82,2 +                subd    #12345                      ; $83,3 +                anda    #123                        ; $84,2 +                bita    #123                        ; $85,2 +                lda     #123                        ; $86,2 +                eora    #123                        ; $88,2 +                adca    #123                        ; $89,2 +                ora     #123                        ; $8A,2 +                adda    #123                        ; $8B,2 +                cmpx    #12345                      ; $8C,3 +                bsr     CallAddress                 ; $8D,2 +                ldx     #12345                      ; $8E,3 + +; ----------------------------------------------------------------------- + +                suba    DirectByte                  ; $90,2 +                cmpa    DirectByte                  ; $91,2 +                sbca    DirectByte                  ; $92,2 +                subd    DirectWord                  ; $93,3 +                anda    DirectByte                  ; $94,2 +                bita    DirectByte                  ; $95,2 +                lda     DirectByte                  ; $96,2 +                sta     DirectByte                  ; $97,2 +                eora    DirectByte                  ; $98,2 +                adca    DirectByte                  ; $99,2 +                ora     DirectByte                  ; $9A,2 +                adda    DirectByte                  ; $9B,2 +                cmpx    DirectWord                  ; $9C,2 +                jsr     DirectCode                  ; $9D,2 +                ldx     DirectWord                  ; $9E,2 +                stx     DirectWord                  ; $9F,2 + +; ----------------------------------------------------------------------- + +                suba    [3,s]                       ; $A0,2+ +                cmpa    [3,s]                       ; $A1,2+ +                sbca    [3,s]                       ; $A2,2+ +                subd    [3,s]                       ; $A3,2+ +                anda    [3,s]                       ; $A4,2+ +                bita    [3,s]                       ; $A5,2+ +                lda     [3,s]                       ; $A6,2+ +                sta     [3,s]                       ; $A7,2+ +                eora    [3,s]                       ; $A8,2+ +                adca    [3,s]                       ; $A9,2+ +                ora     [3,s]                       ; $AA,2+ +                adda    [3,s]                       ; $AB,2+ +                cmpx    [3,s]                       ; $AC,2+ +                jsr     [3,s]                       ; $AD,2+ +                ldx     [3,s]                       ; $AE,2+ +                stx     [3,s]                       ; $AF,2+ + +; ----------------------------------------------------------------------- + +                suba    $ff00                       ; $B0,3 +                cmpa    $ff00                       ; $B1,3 +                sbca    $ff00                       ; $B2,3 +                subd    $ff00                       ; $B3,3 +                anda    $ff00                       ; $B4,3 +                bita    $ff00                       ; $B5,3 +                lda     $ff00                       ; $B6,3 +                sta     $ff00                       ; $B7,3 +                eora    $ff00                       ; $B8,3 +                adca    $ff00                       ; $B9,3 +                ora     $ff00                       ; $BA,3 +                adda    $ff00                       ; $BB,3 +                cmpx    $ff00                       ; $BC,3 +                jsr     $ff00                       ; $BD,3 +                ldx     $ff00                       ; $BE,3 +                stx     $ff00                       ; $BF,3 + +; ----------------------------------------------------------------------- + +                subb    #123                        ; $C0,2 +                cmpb    #123                        ; $C1,2 +                sbcb    #123                        ; $C2,2 +                addd    #12345                      ; $C3,3 +                andb    #123                        ; $C4,2 +                bitb    #123                        ; $C5,2 +                ldb     #123                        ; $C6,2 +                eorb    #123                        ; $C8,2 +                adcb    #123                        ; $C9,2 +                orb     #123                        ; $CA,2 +                addb    #123                        ; $CB,2 +                ldd     #12345                      ; $CC,3 +                ifdef __6309__ +                ldq     #123456789                  ; $CD,5 +                endif +                ldu     #12345                      ; $CE,3 + +; ----------------------------------------------------------------------- + +                subb    DirectByte                  ; $D0,2 +                cmpb    DirectByte                  ; $D1,2 +                sbcb    DirectByte                  ; $D2,2 +                addd    DirectWord                  ; $D3,3 +                andb    DirectByte                  ; $D4,2 +                bitb    DirectByte                  ; $D5,2 +                ldb     DirectByte                  ; $D6,2 +                stb     DirectByte                  ; $D7,2 +                eorb    DirectByte                  ; $D8,2 +                adcb    DirectByte                  ; $D9,2 +                orb     DirectByte                  ; $DA,2 +                addb    DirectByte                  ; $DB,2 +                ldd     DirectWord                  ; $DC,2 +                std     DirectWord                  ; $DD,2 +                ldu     DirectWord                  ; $DE,2 +                stu     DirectWord                  ; $DF,2 + +; ----------------------------------------------------------------------- + +; note effect of quasi-forward reference in the next line +LocalData       subb    LocalData,pc                ; $E0,2+ +AnotherLocal    cmpb    <AnotherLocal,pc            ; $E1,2+ +                sbcb    LocalData,pc                ; $E2,2+ +                addd    LocalData,pc                ; $E3,2+ +                andb    LocalData,pc                ; $E4,2+ +                bitb    LocalData,pc                ; $E5,2+ +                ldb     LocalData,pc                ; $E6,2+ +                stb     LocalData,pc                ; $E7,2+ +                eorb    LocalData,pc                ; $E8,2+ +                adcb    LocalData,pc                ; $E9,2+ +                orb     LocalData,pc                ; $EA,2+ +                addb    LocalData,pc                ; $EB,2+ +                ldd     LocalData,pc                ; $EC,2+ +                std     LocalData,pc                ; $ED,2+ +                ldu     LocalData,pc                ; $EE,2+ +                stu     LocalData,pc                ; $EF,2+ + +; ----------------------------------------------------------------------- + +                subb    LocalData                   ; $F0,3 +                cmpb    LocalData                   ; $F1,3 +                sbcb    LocalData                   ; $F2,3 +                addd    LocalData                   ; $F3,3 +                andb    LocalData                   ; $F4,3 +                bitb    LocalData                   ; $F5,3 +                ldb     LocalData                   ; $F6,3 +                stb     LocalData                   ; $F7,3 +                eorb    LocalData                   ; $F8,3 +                adcb    LocalData                   ; $F9,3 +                orb     LocalData                   ; $FA,3 +                addb    LocalData                   ; $FB,3 +                ldd     LocalData                   ; $FC,3 +                std     LocalData                   ; $FD,3 +                ldu     LocalData                   ; $FE,3 +                stu     LocalData                   ; $FF,3 + +; +---------------------------------------------------------------------+ +; |                                                                     | +; |   Instructions with prefix byte $10.                                | +; |                                                                     | +; +---------------------------------------------------------------------+ + +                lbrn    BranchTarget                ; $1021,4 +                lbhi    BranchTarget                ; $1022,4 +                lbls    BranchTarget                ; $1023,4 +                lbhs    BranchTarget                ; $1024,4 +                lbcc    BranchTarget                ; alternate +                lblo    BranchTarget                ; $1025,4 +                lbcs    BranchTarget                ; alternate +                lbne    BranchTarget                ; $1026,4 +                lbeq    BranchTarget                ; $1027,4 +                lbvc    BranchTarget                ; $1028,4 +                lbvs    BranchTarget                ; $1029,4 +                lbpl    BranchTarget                ; $102A,4 +                lbmi    BranchTarget                ; $102B,4 +                lbge    BranchTarget                ; $102C,4 +                lblt    BranchTarget                ; $102D,4 +                lbgt    BranchTarget                ; $102E,4 +                lble    BranchTarget                ; $102F,4 + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                addr    a,b                         ; $1030,3 +                add     a,b                         ; alternate +                adcr    w,d                         ; $1031,3 +                adc     w,d                         ; alternate +                subr    d,x                         ; $1032,3 +                sub     d,x                         ; alternate +                sbcr    b,a                         ; $1033,3 +                sbc     b,a                         ; alternate +                andr    a,ccr                       ; $1034,3 +                and     a,ccr                       ; alternate +                orr     b,dpr                       ; $1035,3 +                or      b,dpr                       ; alternate +                eorr    w,d                         ; $1036,3 +                eor     w,d                         ; alternate +                cmpr    d,u                         ; $1037,3 +                cmp     d,u                         ; alternate +                pshsw                               ; $1038,2 +                pshs    w                           ; alternate +                pulsw                               ; $1039,2 +                puls    w                           ; alternate +                pshuw                               ; $103A,2 +                pshu    w                           ; alternate +                puluw                               ; $103B,2 +                pulu    w                           ; alternate +                endif +                swi2                                ; $103F,2 +                swi     2                           ; alternate + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                negd                                ; $1040,2 +                comd                                ; $1043,2 +                lsrd                                ; $1044,2 +                rord                                ; $1046,2 +                asrd                                ; $1047,2 +                asld                                ; $1048,2 +                rold                                ; $1049,2 +                decd                                ; $104A,2 +                incd                                ; $104C,2 +                tstd                                ; $104D,2 +                clrd                                ; $104F,2 + +; ----------------------------------------------------------------------- + +                comw                                ; $1053,2 +                lsrw                                ; $1054,2 +                rorw                                ; $1056,2 +                rolw                                ; $1059,2 +                decw                                ; $105A,2 +                incw                                ; $105C,2 +                tstw                                ; $105D,2 +                clrw                                ; $105F,2 + +; ----------------------------------------------------------------------- + +                subw    #12345                      ; $1080,4 +                cmpw    #12345                      ; $1081,4 +                sbcd    #12345                      ; $1082,4 +                endif +                cmpd    #12345                      ; $1083,4 +                ifdef __6309__ +                andd    #12345                      ; $1084,4 +                bitd    #12345                      ; $1085,4 +                ldw     #12345                      ; $1086,4 +                eord    #12345                      ; $1088,4 +                adcd    #12345                      ; $1089,4 +                ord     #12345                      ; $108A,4 +                addw    #12345                      ; $108B,4 +                endif +                cmpy    #12345                      ; $108C,4 +                ldy     #12345                      ; $108E,4 + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                subw    DirectWord                  ; $1090,3 +                cmpw    DirectWord                  ; $1091,3 +                sbcd    DirectWord                  ; $1092,3 +                endif +                cmpd    DirectWord                  ; $1093,3 +                ifdef __6309__ +                andd    DirectWord                  ; $1094,3 +                bitd    DirectWord                  ; $1095,3 +                ldw     DirectWord                  ; $1096,3 +                stw     DirectWord                  ; $1097,3 +                eord    DirectWord                  ; $1098,3 +                adcd    DirectWord                  ; $1099,3 +                ord     DirectWord                  ; $109A,3 +                addw    DirectWord                  ; $109B,3 +                endif +                cmpy    DirectWord                  ; $109C,3 +                ldy     DirectWord                  ; $109E,3 +                sty     DirectWord                  ; $109F,3 + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                subw    ,w++                        ; $10A0,3+ +                cmpw    ,w++                        ; $10A1,3+ +                sbcd    ,w++                        ; $10A2,3+ +                endif +                cmpd    ,--x                        ; $10A3,3+ +                ifdef __6309__ +                andd    ,w++                        ; $10A4,3+ +                bitd    ,w++                        ; $10A5,3+ +                ldw     ,w++                        ; $10A6,3+ +                stw     ,w++                        ; $10A7,3+ +                eord    ,w++                        ; $10A8,3+ +                adcd    ,w++                        ; $10A9,3+ +                ord     ,w++                        ; $10AA,3+ +                addw    ,w++                        ; $10AB,3+ +                endif +                cmpy    ,--x                        ; $10AC,3+ +                ldy     ,--x                        ; $10AE,3+ +                sty     ,--x                        ; $10AF,3+ + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                subw    $7000                       ; $10B0,4 +                cmpw    $7000                       ; $10B1,4 +                sbcd    $7000                       ; $10B2,4 +                endif +                cmpd    $7000                       ; $10B3,4 +                ifdef __6309__ +                andd    $7000                       ; $10B4,4 +                bitd    $7000                       ; $10B5,4 +                ldw     $7000                       ; $10B6,4 +                stw     $7000                       ; $10B7,4 +                eord    $7000                       ; $10B8,4 +                adcd    $7000                       ; $10B9,4 +                ord     $7000                       ; $10BA,4 +                addw    $7000                       ; $10BB,4 +                endif +                cmpy    $7000                       ; $10BC,4 +                ldy     $7000                       ; $10BE,4 +                sty     $7000                       ; $10BF,4 + +; ----------------------------------------------------------------------- + +                lds     #12345                      ; $10CE,4 + +                ifdef __6309__ +                ldq     DirectLong                  ; $10DC,3 +                stq     DirectLong                  ; $10DD,3 +                endif +                lds     DirectWord                  ; $10DE,3 +                sts     DirectWord                  ; $10DF,3 + +                ifdef __6309__ +                ldq     ,x                          ; $10EC,3+ +                stq     ,x                          ; $10ED,3+ +                endif +                lds     ,x                          ; $10EE,3+ +                sts     ,x                          ; $10EF,3+ + +                ifdef __6309__ +                ldq     AddressFour                 ; $10FC,4 +                stq     AddressFour                 ; $10FD,4 +                endif +                lds     AddressFour                 ; $10FE,4 +                sts     AddressFour                 ; $10FF,4 + +; +---------------------------------------------------------------------+ +; |                                                                     | +; |   Instructions with prefix byte $11.                                | +; |                                                                     | +; +---------------------------------------------------------------------+ + +                ifdef __6309__ +                band    a.7,DirectByte.0            ; $1130,4 +                biand   b.6,DirectByte.1            ; $1131,4   +                bor     cc.5,DirectByte.2           ; $1132,4   +                bior    a.4,DirectByte.3            ; $1133,4   +                beor    b.3,DirectByte.4            ; $1134,4   +                bieor   cc.2,DirectByte.5           ; $1135,4   +                ldbt    ccr.1,DirectByte.6          ; $1136,4   +                stbt    ccr.0,DirectByte.7          ; $1137,4   + +                tfr     x+,y+                       ; $1138,3 +                tfm     x+,y+                       ; alternate +                tfr     u-,x-                       ; $1139,3 +                tfm     u-,x-                       ; alternate +                tfr     s+,x                        ; $113A,3 +                tfm     s+,x                        ; alternate +                tfr     x,y+                        ; $113B,3 +                tfm     x,y+                        ; alternate +                bitmd    #128                       ; $113C,3   +                ldmd     #1                         ; $113D,3   +                endif +                swi3                                ; $113F,2 +                swi     3                           ; alternate + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                come                                ; $1143,2   +                dece                                ; $114A,2   +                ince                                ; $114C,2   +                tste                                ; $114D,2   +                clre                                ; $114F,2   + +                comf                                ; $1153,2   +                decf                                ; $115A,2   +                incf                                ; $115C,2   +                tstf                                ; $115D,2   +                clrf                                ; $115F,2   +                endif + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                sube    #123                        ; $1180,3   +                cmpe    #123                        ; $1181,3   +                endif +                cmpu    #12345                      ; $1183,4 +                ifdef __6309__ +                lde     #123                        ; $1186,3   +                adde    #123                        ; $118B,3   +                endif +                cmps    #12345                      ; $118C,4 +                ifdef __6309__ +                divd    #123                        ; $118D,3   +                divq    #12345                      ; $118E,4   +                muld    #12345                      ; $118F,4   +                endif + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                sube    DirectByte                  ; $1190,3  +                cmpe    DirectByte                  ; $1191,3  +                endif +                cmpu    DirectWord                  ; $1193,3 +                ifdef __6309__ +                lde     DirectByte                  ; $1196,3  +                ste     DirectByte                  ; $1197,3  +                adde    DirectByte                  ; $119B,3  +                endif +                cmps    DirectWord                  ; $119C,3 +                ifdef __6309__ +                divd    DirectWord                  ; $119D,3  +                divq    DirectWord                  ; $119E,3  +                muld    DirectWord                  ; $119F,3  +                endif + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                sube    ,s+                         ; $11A0,3+  +                cmpe    ,s+                         ; $11A1,3+  +                endif +                cmpu    ,s++                        ; $11A3,3+ +                ifdef __6309__ +                lde     ,s+                         ; $11A6,3+  +                ste     ,s+                         ; $11A7,3+  +                adde    ,s+                         ; $11AB,3+  +                endif +                cmps    ,s++                        ; $11AC,3+ +                ifdef __6309__ +                divd    ,s+                         ; $11AD,3+  +                divq    ,s++                        ; $11AE,3+  +                muld    ,s++                        ; $11AF,3+  +                endif + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                sube    $9000                       ; $11B0,4 +                cmpe    $9000                       ; $11B1,4 +                endif +                cmpu    $9000                       ; $11B3,4 +                ifdef __6309__ +                lde     $9000                       ; $11B6,4 +                ste     $9000                       ; $11B7,4 +                adde    $9000                       ; $11BB,4 +                endif +                cmps    $9000                       ; $11BC,4 +                ifdef __6309__ +                divd    $9000                       ; $11BD,4 +                divq    $9000                       ; $11BE,4 +                muld    $9000                       ; $11BF,4 +                endif + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                subf    #123                        ; $11C0,3 +                cmpf    #123                        ; $11C1,3 +                ldf     #123                        ; $11C6,3 +                addf    #123                        ; $11CB,3 +                endif + +; ----------------------------------------------------------------------- + +                ifdef __6309__ +                subf    DirectByte                  ; $11D0,3  +                cmpf    DirectByte                  ; $11D1,3  +                ldf     DirectByte                  ; $11D6,3  +                stf     DirectByte                  ; $11D7,3  +                addf    DirectByte                  ; $11DB,3  + +                subf    ,s+                         ; $11E0,3+ +                cmpf    ,s+                         ; $11E1,3+ +                ldf     ,s+                         ; $11E6,3+ +                stf     ,s+                         ; $11E7,3+ +                addf    ,s+                         ; $11EB,3+ + +                subf    $9000                       ; $11F0,4  +                cmpf    $9000                       ; $11F1,4  +                ldf     $9000                       ; $11F6,4  +                stf     $9000                       ; $11F7,4  +                addf    $9000                       ; $11FB,4  +                endif + + +                end     Start +; ----- EOF ------------------------------------------------------------- + diff --git a/tests/t_full09/t_full09.doc b/tests/t_full09/t_full09.doc new file mode 100644 index 0000000..1121b25 --- /dev/null +++ b/tests/t_full09/t_full09.doc @@ -0,0 +1,6 @@ ++----------------------- Test Application FULL09 ----------------------------+ +|                                                                            | +|      This is a bit more thorough (synthetic) test of the 6809/6309 in-     | +|      tion set, borrowed from another 6809 assembler ;-)                    | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_full09/t_full09.ori b/tests/t_full09/t_full09.ori Binary files differnew file mode 100644 index 0000000..564da0d --- /dev/null +++ b/tests/t_full09/t_full09.ori diff --git a/tests/t_h8_3/asflags b/tests/t_h8_3/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_h8_3/asflags diff --git a/tests/t_h8_3/t_h8_3.asm b/tests/t_h8_3/t_h8_3.asm new file mode 100644 index 0000000..47c8743 --- /dev/null +++ b/tests/t_h8_3/t_h8_3.asm @@ -0,0 +1,353 @@ +	cpu	hd6413309 +	maxmode	on +	page	0 +        relaxed on + +        dc.w	1234 +        dc.w	$4d2 +        dc.w	@2322 +        dc.w	%10011010010 +        dc.w	4d2h +        dc.w	2322o +        dc.w	10011010010b +        dc.w	0x4d2 +	dc.w	02322 + +	nop +	sleep +	rts +	rte + +	eepmov +	eepmov.b +	eepmov.w + +	dec	r2h +	dec	#1,r5l +	dec	r4 +	dec	#1,e6 +	dec	#2,e1 +	dec	er1 +	dec	#1,er4 +	dec	#2,er7 +	inc	r2h +	inc	#1,r5l +	inc	r4 +	inc	#1,e6 +	inc	#2,e1 +	inc	er1 +	inc	#1,er4 +	inc	#2,er7 + +targ:   bsr	targ +	bsr.s	targ +	bsr.l	targ +	bra	targ +	bra.s	targ +	bra.l	targ +	bt	targ +	bt.s	targ +	bt.l	targ +	brn	targ +	brn.s	targ +	brn.l	targ +	bf	targ +	bf.s	targ +	bf.l	targ +	bhi	targ +	bhi.s	targ +	bhi.l	targ +	bls	targ +	bls.s	targ +	bls.l	targ +	bcc	targ +	bcc.s	targ +	bcc.l	targ +	bhs	targ +	bhs.s	targ +	bhs.l	targ +	bcs	targ +	bcs.s	targ +	bcs.l	targ +	blo	targ +	blo.s	targ +	blo.l	targ +	bne	targ +	bne.s	targ +	bne.l	targ +	beq	targ +	beq.l	targ +	bvc	targ +	bvc.l	targ +	bvs	targ +	bvs.l	targ +	bpl	targ +	bpl.l	targ +	bmi	targ +	bmi.l	targ +	bge	targ +	bge.l	targ +	blt	targ +	blt.l	targ +	bgt	targ +	bgt.l	targ +	ble	targ +	ble.l	targ + +	rotl	r4h +	rotl	r2 +	rotl	er1 +	rotr	r2l +	rotr	r1 +	rotr	er5 +	rotxl	r2h +	rotxl	e4 +	rotxl	er2 +	rotxr	r6h +	rotxr	e0 +	rotxr	er7 +	shal	r3l +	shal	r6 +	shal	er0 +	shar	r5l +	shar	r2 +	shar	er6 +	shll	r2h +	shll	e4 +	shll	er5 +	shlr	r1l +	shlr	r7 +	shlr	er4 + +	not	r7h +	not	r6 +	not	er2 +	neg	r2l +	neg	e2 +	neg	er5 + +	exts	r5 +	extu	e3 +	exts	er4 +	extu	er6 + +        and	r5h,r3l +        and	#10,r2h +        and	r7,e1 +        and	#%1101,r1 +        and	er2,er6 +        and	#$12345678,er3 +        andc	#$20,ccr +        or	r6h,r4l +        or	#20,r3h +        or	r0,e2 +        or	#%11101,r2 +        or	er2,er7 +        or	#$12345678,er4 +        orc	#$30,ccr +        xor	r4h,r2l +        xor     #$08,r1h +        xor	r6,e0 +        xor	#%101101,r0 +        xor	er1,er5 +        xor	#$12345678,er2 +        xorc	#$30,ccr + +        daa	r1l +        das	r5h + +        addx	#10,r5l +        addx	r1h,r1l +        subx	#$55,r7h +        subx	r3h,r0l + +        adds	#1,er0 +        adds	#2,er4 +        adds	#4,er5 +        subs	#1,er6 +        subs	#2,er3 +        subs	#4,er1 + +        divxs	r4h,e2 +        divxs	r4,er5 +        divxu	r1l,r3 +        divxu	e6,er7 +        mulxs	r0l,e6 +        mulxs	r5,er2 +        mulxu	r7h,r5 +        mulxu	e3,er4 + +	add	r1h,r2l +	add	#$34,r6h +	add	r2,e3 +	add	#%10101010101010,e5 +	add     er3,er1 +	add	#1000000,er4 +	sub	r1l,r2h +	sub	r6,e1 +	sub	#%10101010101010,r2 +	sub     er1,er5 +	sub	#1000000,er6 +	cmp	r1h,r2l +	cmp	#$34,r6h +	cmp	r2,e3 +	cmp	#%10101010101010,e5 +	cmp     er3,er1 +	cmp	#1000000,er4 + + +	pop	r5 +	push	e2 +	pop	er1 +	push	er6 + +	mov	r2l,r5h +	mov	r1,e2 +	mov	er5,er2 + +	mov.b	@er4,r6h +	mov.b	r6h,@er4 +	mov.w	@er1,e7 +	mov.w	e7,@er1 +	mov.l	@er5,er2 +	mov.l	er2,@er5 + +	mov.b	@er2+,r5l +	mov.b	r5l,@-er2 +	mov.w	@er5+,r4 +	mov.w	r4,@-er5 +	mov.l	@er6+,er1 +	mov.l	er1,@-er6 + +	mov.b	@(-100,er2),r4l +	mov.b	r4l,@(-100,er2) +	mov.w	@(200,er4),e3 +	mov.w	e3,@(200,er4) +	mov.l	@(-300,sp),er5 +	mov.l	er5,@(-300,sp) + +	mov.b	@(-100000,er4),r3h +	mov.b	r3h,@(-100000,er4) +	mov.w	@(200000,er2),r6 +	mov.w	r6,@(200000,er2) +	mov.l	@(-300000,er5),er1 +	mov.l	er1,@(-300000,er5) + +	mov.b	$ffff20,r1h +	mov.b	r1h,$ffff20 +	mov.w	$ffffa4,e6 +	mov.w	e6,$ffffa4 +	mov.l	$ffffc0,er3 +	mov.l	er3,$ffffc0 + +	mov.b	$1234,r3h +	mov.b	r3h,$1234 +	mov.w	$2345,e5 +	mov.w	e5,$2345 +	mov.l	$3456,er4 +	mov.l	er4,$3456 + +	mov.b	$123456,r3l +	mov.b	r3l,$123456 +	mov.w	$234567,r5 +	mov.w	r5,$234567 +	mov.l	$345678,er7 +	mov.l	er7,$345678 + +	mov.b	#$12,r4l +	mov.w	#$1234,e2 +        mov.l   #$12345678,er3 + +	movfpe	@1234,r4l +	movtpe	r4l,@1234 + +	band	#4,r2l +	band	#2,@er3 +	band	#6,$ffff4e +	biand	#4,r2l +	biand	#2,@er3 +	biand	#6,$ffff4e +	bild	#4,r2l +	bild	#2,@er3 +	bild	#6,$ffff4e +	bior	#4,r2l +	bior	#2,@er3 +	bior	#6,$ffff4e +	bist	#4,r2l +	bist	#2,@er3 +	bist	#6,$ffff4e +	bixor	#4,r2l +	bixor	#2,@er3 +	bixor	#6,$ffff4e +	bld	#4,r2l +	bld	#2,@er3 +	bld	#6,$ffff4e +	bor	#4,r2l +	bor	#2,@er3 +	bor	#6,$ffff4e +	bst	#4,r2l +	bst	#2,@er3 +	bst	#6,$ffff4e +	bxor	#4,r2l +	bxor	#2,@er3 +	bxor	#6,$ffff4e + +	bclr	#3,r5h +	bclr	#7,@er6 +	bclr	#2,$ffff1a +	bclr	r5l,r6h +	bclr	r1h,@er4 +	bclr	r7h,$ffff24 +	bnot	#3,r5h +	bnot	#7,@er6 +	bnot	#2,$ffff1a +	bnot	r5l,r6h +	bnot	r1h,@er4 +	bnot	r7h,$ffff24 +	bset	#3,r5h +	bset	#7,@er6 +	bset	#2,$ffff1a +	bset	r5l,r6h +	bset	r1h,@er4 +	bset	r7h,$ffff24 +	btst	#3,r5h +	btst	#7,@er6 +	btst	#2,$ffff1a +	btst	r5l,r6h +	btst	r1h,@er4 +	btst	r7h,$ffff24 + +	jmp	@er2 +	jmp	$123456 +	jmp	@@$35 +	jsr	@er2 +	jsr	$123456 +	jsr	@@$35 + +	ldc	#23,ccr +	ldc	r5h,ccr +	stc	ccr,r5h +	ldc	@er6,ccr +	stc	ccr,@er6 +	ldc	@er3+,ccr +	stc	ccr,@-er3 +	ldc	@(100,er1),ccr +	stc	ccr,@(100,er1) +	ldc	@(100000,er5),ccr +	stc	ccr,@(100000,er5) +	ldc	$1234,ccr +	stc	ccr,$1234 +	ldc	$123456,ccr +	stc	ccr,$123456 + +	dc	20 + +	dc.b	5,"Hallo" +	dc.w	1,2,3,4 +	dc.l	1,2,3,4 +;	dc.q	1,2,3,4		; omit for the sake of non-64-bit-platforms... +	dc.s	1,2,3,4 +	dc.d	1,2,3,4 +	dc.x	1,2,3,4 +	dc.p	1,2,3,4 + diff --git a/tests/t_h8_3/t_h8_3.doc b/tests/t_h8_3/t_h8_3.doc new file mode 100644 index 0000000..d4ee7a9 --- /dev/null +++ b/tests/t_h8_3/t_h8_3.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application H8_3 ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the H8/300(H) instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_h8_3/t_h8_3.ori b/tests/t_h8_3/t_h8_3.ori Binary files differnew file mode 100644 index 0000000..e2e4cbd --- /dev/null +++ b/tests/t_h8_3/t_h8_3.ori diff --git a/tests/t_h8_5/asflags b/tests/t_h8_5/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_h8_5/asflags diff --git a/tests/t_h8_5/t_h8_5.asm b/tests/t_h8_5/t_h8_5.asm new file mode 100644 index 0000000..8987d73 --- /dev/null +++ b/tests/t_h8_5/t_h8_5.asm @@ -0,0 +1,229 @@ +                cpu     hd6475348 +                page    0 +                maxmode on +                padding off + +                assume  br:0,dp:0 + +                add.b   r5,sp +                add.w   r2,r4 +                add.b   @r4,r2 +                add.w   @r4,r2 +                add.b   @(20,r4),r2 +                add.w   @(20:8,r4),r2 +                add.b   @(20:16,r4),r2 +                add.w   @(2000,r4),r2 +                add.b   @(2000:16,r4),r2 +                add.w   @-r4,r2 +                add.b   @r4+,r2 +                add.w   @20,r2 +                add.b   @20:16,r2 +                add.w   @2000,r2 +                add.b   #5,r2 +                add.w   #100,r2 +                add.b:g #1,r2 +                add.w:g #-1,r2 +                add.b   #1,r2 +                add.w   #-1,r2 + +                adds.w  #$10,r3 + +                addx.b  @($20,r4),r0 + +                and.b   @$f8:8,r1 + +                andc.b  #$fe,ccr + +                bra     *+20 +                bra     *+2000 +                bt      *+20 +                bt      *+2000 +                brn     *+20 +                brn     *+2000 +                bf      *+20 +                bf      *+2000 +                bhi     *+20 +                bhi     *+2000 +                bls     *+20 +                bls     *+2000 +                bcc     *+20 +                bcc     *+2000 +                bhs     *+20 +                bhs     *+2000 +                bcs     *+20 +                bcs     *+2000 +                blo     *+20 +                blo     *+2000 +                bne     *+20 +                bne     *+2000 +                beq     *+20 +                beq     *+2000 +                bvc     *+20 +                bvc     *+2000 +                bvs     *+20 +                bvs     *+2000 +                bpl     *+20 +                bpl     *+2000 +                bmi     *+20 +                bmi     *+2000 +                bge     *+20 +                bge     *+2000 +                blt     *+20 +                blt     *+2000 +                bgt     *+20 +                bgt     *+2000 +                ble     *+20 +                ble     *+2000 + +                bclr.b  #7,@$ff00 + +                bnot.w  r0,r1 + +                bset.b  #0,@r1+ + +                bsr     *+20 +                bsr     *+2000 + +                btst.b  r0,@$f0:8 + +                clr.w   @($1000,r5) + +                cmp:g.b #$aa,@-r3 +                cmp.b   #$aa,@-r3 +                cmp:e.b #$00,r0 +                cmp.b   #$00,r0 +                cmp:i.w #$ffff,r1 +                cmp.w   #$ffff,r1 + +                dadd    r0,r1 + +                divxu.w @r3,r0 + +                dsub    r2,r3 + +                exts    r0 + +                extu    r1 + +                jmp     @(#$10,r4) + +                jsr     @($fff,r3) + +                ldc.b   #$01,dp + +                ldm     @sp+,(r0,r2-r4) + +                link    fp,#-4 + +                mov:g.w r0,@r1 +                mov.w   r0,@r1 +                mov:e.b #$55,r0 +                mov.b   #$55,r0 +                mov:f.b @(4,r6),r0 +                mov.b   @(4,r6),r0 +                mov:f.b r0,@(4,r6) +                mov.b   r0,@(4,r6) +                mov:i.w #$ff00,r5 +                mov.w   #$ff00,r5 +                mov:l.b @$a0,r0 +                mov.b   @$a0,r0 +                mov:s.w r0,@$a0:8 +                mov.w   r0,@$a0:8 + +                movfpe  @$f000,r0 + +                movtpe  r0,@r1 + +                mulxu.b r0,r1 + +                neg.w   r0 + +                nop + +                not.b   @($10,r2) + +                or.b    @$f0:8,r1 + +                orc.w   #$0700,sr + +                pjmp    @r4 + +                pjsr    @$010000 + +                prtd    #8 + +                prts + +                rotl.w  r0 + +                rotr.b  @r1 + +                rotxl.w @($02,r1) + +                rotxr.b @$fa:8 + +                rtd     #400 + +                rte + +                rts + +                scb/eq  r4,*-20 + +                shal.b  @r2+ + +                shar.w  @$ff00 + +                shll.b  r1 + +                shlr.w  @-r1 + +                sleep + +                stc.b   br,@-sp + +                stm     (r0-r3),@-sp + +                sub.w   @r1,r0 + +                subs.w  #2,r2 + +                subx.w  @r2+,r0 + +                swap    r0 + +                tas     @$f000 + +                trapa   #4 + +                trap/vs + +                tst     @($1000,r1) + +                unlk    fp + +                xch     r0,r1 + +                xor.b   @$a0:8,r0 + +                xorc.b  #$01,ccr + +                bra     *+126 +                bra     *+127 +                bra     *+128 +                bra     *+129 +                bra     *+130 +                bra     *+131 +                bra     *+132 +                bra     *+133 +                bra     *+134 +                bra     *-123 +                bra     *-124 +                bra     *-125 +                bra     *-126 +                bra     *-127 +                bra     *-128 +                bra     *-129 +                bra     *-130 +                bra     *-131 + diff --git a/tests/t_h8_5/t_h8_5.doc b/tests/t_h8_5/t_h8_5.doc new file mode 100644 index 0000000..75c6b34 --- /dev/null +++ b/tests/t_h8_5/t_h8_5.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application H8_5 ----------------------------+ +|                                                                            | +|         This is a (synthetic) test of the H8/500 instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_h8_5/t_h8_5.ori b/tests/t_h8_5/t_h8_5.ori Binary files differnew file mode 100644 index 0000000..492cd40 --- /dev/null +++ b/tests/t_h8_5/t_h8_5.ori diff --git a/tests/t_m16c/asflags b/tests/t_m16c/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_m16c/asflags diff --git a/tests/t_m16c/t_m16c.asm b/tests/t_m16c/t_m16c.asm new file mode 100644 index 0000000..6fe5136 --- /dev/null +++ b/tests/t_m16c/t_m16c.asm @@ -0,0 +1,4051 @@ +; +;; A comprehensive mnemonic exerciser, thanks to a company in Sweden who +;; shall go nameless...  all mnemonics and addressing modes are represented. +;; +;; =RMS= +;; +; +	cpu	M30620 + +	ORG 0 + +	ABS.B	[A0] +	ABS.B	12H[A0] +	ABS.B	12H[FB] +	ABS.B	12H[SB] +	ABS.B	2345H +	ABS.B	2345H[A0] +	ABS.B	2345H[SB] +	ABS.B	R0L +	ABS.W	[A0] +	ABS.W	12H[A0] +	ABS.W	12H[FB] +	ABS.W	12H[SB] +	ABS.W	2345H +	ABS.W	2345H[A0] +	ABS.W	2345H[SB] +	ABS.W	A0 +	ABS.W	R0 +	ADC.B	#7,[A0] +	ADC.B	#7,12H[A0] +	ADC.B	#7,12H[FB] +	ADC.B	#7,12H[SB] +	ADC.B	#7,2345H +	ADC.B	#7,2345H[A0] +	ADC.B	#7,2345H[SB] +	ADC.B	#7,A0 +	ADC.B	#7,R0L +	ADC.B	[A0],[A0] +	ADC.B	[A0],12H[A0] +	ADC.B	[A0],12H[FB] +	ADC.B	[A0],12H[SB] +	ADC.B	[A0],2345H +	ADC.B	[A0],2345H[A0] +	ADC.B	[A0],2345H[SB] +	ADC.B	[A0],A0 +	ADC.B	[A0],R0L +	ADC.B	12H[A0],[A0] +	ADC.B	12H[A0],12H[A0] +	ADC.B	12H[A0],12H[FB] +	ADC.B	12H[A0],12H[SB] +	ADC.B	12H[A0],2345H +	ADC.B	12H[A0],2345H[A0] +	ADC.B	12H[A0],2345H[SB] +	ADC.B	12H[A0],A0 +	ADC.B	12H[A0],R0L +	ADC.B	12H[FB],[A0] +	ADC.B	12H[FB],12H[A0] +	ADC.B	12H[FB],12H[FB] +	ADC.B	12H[FB],12H[SB] +	ADC.B	12H[FB],2345H +	ADC.B	12H[FB],2345H[A0] +	ADC.B	12H[FB],2345H[SB] +	ADC.B	12H[FB],A0 +	ADC.B	12H[FB],R0L +	ADC.B	12H[SB],[A0] +	ADC.B	12H[SB],12H[A0] +	ADC.B	12H[SB],12H[FB] +	ADC.B	12H[SB],12H[SB] +	ADC.B	12H[SB],2345H +	ADC.B	12H[SB],2345H[A0] +	ADC.B	12H[SB],2345H[SB] +	ADC.B	12H[SB],A0 +	ADC.B	12H[SB],R0L +	ADC.B	2345H,[A0] +	ADC.B	2345H,12H[A0] +	ADC.B	2345H,12H[FB] +	ADC.B	2345H,12H[SB] +	ADC.B	2345H,2345H +	ADC.B	2345H,2345H[A0] +	ADC.B	2345H,2345H[SB] +	ADC.B	2345H,A0 +	ADC.B	2345H,R0L +	ADC.B	2345H[A0],[A0] +	ADC.B	2345H[A0],12H[A0] +	ADC.B	2345H[A0],12H[FB] +	ADC.B	2345H[A0],12H[SB] +	ADC.B	2345H[A0],2345H +	ADC.B	2345H[A0],2345H[A0] +	ADC.B	2345H[A0],2345H[SB] +	ADC.B	2345H[A0],A0 +	ADC.B	2345H[A0],R0L +	ADC.B	2345H[SB],[A0] +	ADC.B	2345H[SB],12H[A0] +	ADC.B	2345H[SB],12H[FB] +	ADC.B	2345H[SB],12H[SB] +	ADC.B	2345H[SB],2345H +	ADC.B	2345H[SB],2345H[A0] +	ADC.B	2345H[SB],2345H[SB] +	ADC.B	2345H[SB],A0 +	ADC.B	2345H[SB],R0L +	ADC.B	A0,[A0] +	ADC.B	A0,12H[A0] +	ADC.B	A0,12H[FB] +	ADC.B	A0,12H[SB] +	ADC.B	A0,2345H +	ADC.B	A0,2345H[A0] +	ADC.B	A0,2345H[SB] +	ADC.B	A0,R0L +	ADC.B	R0L,[A0] +	ADC.B	R0L,12H[A0] +	ADC.B	R0L,12H[FB] +	ADC.B	R0L,12H[SB] +	ADC.B	R0L,2345H +	ADC.B	R0L,2345H[A0] +	ADC.B	R0L,2345H[SB] +	ADC.B	R0L,A0 +	ADC.B	R0L,R0L +	ADC.W	#2345H,[A0] +	ADC.W	#2345H,12H[A0] +	ADC.W	#2345H,12H[FB] +	ADC.W	#2345H,12H[SB] +	ADC.W	#2345H,2345H +	ADC.W	#2345H,2345H[A0] +	ADC.W	#2345H,2345H[SB] +	ADC.W	#2345H,A0 +	ADC.W	#2345H,R0 +	ADC.W	#7,[A0] +	ADC.W	#7,12H[A0] +	ADC.W	#7,12H[FB] +	ADC.W	#7,12H[SB] +	ADC.W	#7,2345H +	ADC.W	#7,2345H[A0] +	ADC.W	#7,2345H[SB] +	ADC.W	#7,A0 +	ADC.W	#7,R0 +	ADC.W	[A0],[A0] +	ADC.W	[A0],12H[A0] +	ADC.W	[A0],12H[FB] +	ADC.W	[A0],12H[SB] +	ADC.W	[A0],2345H +	ADC.W	[A0],2345H[A0] +	ADC.W	[A0],2345H[SB] +	ADC.W	[A0],A0 +	ADC.W	[A0],R0 +	ADC.W	12H[A0],[A0] +	ADC.W	12H[A0],12H[A0] +	ADC.W	12H[A0],12H[FB] +	ADC.W	12H[A0],12H[SB] +	ADC.W	12H[A0],2345H +	ADC.W	12H[A0],2345H[A0] +	ADC.W	12H[A0],2345H[SB] +	ADC.W	12H[A0],A0 +	ADC.W	12H[A0],R0 +	ADC.W	12H[FB],[A0] +	ADC.W	12H[FB],12H[A0] +	ADC.W	12H[FB],12H[FB] +	ADC.W	12H[FB],12H[SB] +	ADC.W	12H[FB],2345H +	ADC.W	12H[FB],2345H[A0] +	ADC.W	12H[FB],2345H[SB] +	ADC.W	12H[FB],A0 +	ADC.W	12H[FB],R0 +	ADC.W	12H[SB],[A0] +	ADC.W	12H[SB],12H[A0] +	ADC.W	12H[SB],12H[FB] +	ADC.W	12H[SB],12H[SB] +	ADC.W	12H[SB],2345H +	ADC.W	12H[SB],2345H[A0] +	ADC.W	12H[SB],2345H[SB] +	ADC.W	12H[SB],A0 +	ADC.W	12H[SB],R0 +	ADC.W	2345H,[A0] +	ADC.W	2345H,12H[A0] +	ADC.W	2345H,12H[FB] +	ADC.W	2345H,12H[SB] +	ADC.W	2345H,2345H +	ADC.W	2345H,2345H[A0] +	ADC.W	2345H,2345H[SB] +	ADC.W	2345H,A0 +	ADC.W	2345H,R0 +	ADC.W	2345H[A0],[A0] +	ADC.W	2345H[A0],12H[A0] +	ADC.W	2345H[A0],12H[FB] +	ADC.W	2345H[A0],12H[SB] +	ADC.W	2345H[A0],2345H +	ADC.W	2345H[A0],2345H[A0] +	ADC.W	2345H[A0],2345H[SB] +	ADC.W	2345H[A0],A0 +	ADC.W	2345H[A0],R0 +	ADC.W	2345H[SB],[A0] +	ADC.W	2345H[SB],12H[A0] +	ADC.W	2345H[SB],12H[FB] +	ADC.W	2345H[SB],12H[SB] +	ADC.W	2345H[SB],2345H +	ADC.W	2345H[SB],2345H[A0] +	ADC.W	2345H[SB],2345H[SB] +	ADC.W	2345H[SB],A0 +	ADC.W	2345H[SB],R0 +	ADC.W	A0,[A0] +	ADC.W	A0,12H[A0] +	ADC.W	A0,12H[FB] +	ADC.W	A0,12H[SB] +	ADC.W	A0,2345H +	ADC.W	A0,2345H[A0] +	ADC.W	A0,2345H[SB] +	ADC.W	A0,A0 +	ADC.W	A0,R0 +	ADC.W	R0,[A0] +	ADC.W	R0,12H[A0] +	ADC.W	R0,12H[FB] +	ADC.W	R0,12H[SB] +	ADC.W	R0,2345H +	ADC.W	R0,2345H[A0] +	ADC.W	R0,2345H[SB] +	ADC.W	R0,A0 +	ADC.W	R0,R0 +	ADCF.B	[A0] +	ADCF.B	12H[A0] +	ADCF.B	12H[FB] +	ADCF.B	12H[SB] +	ADCF.B	2345H +	ADCF.B	2345H[A0] +	ADCF.B	2345H[SB] +	ADCF.B	R0L +	ADCF.W	[A0] +	ADCF.W	12H[A0] +	ADCF.W	12H[FB] +	ADCF.W	12H[SB] +	ADCF.W	2345H +	ADCF.W	2345H[A0] +	ADCF.W	2345H[SB] +	ADCF.W	A0 +	ADCF.W	R0 +	ADD.B:G	#7,[A0] +	ADD.B:G	#7,12H[A0] +	ADD.B:G	#7,12H[FB] +	ADD.B:G	#7,12H[SB] +	ADD.B:G	#7,2345H +	ADD.B:G	#7,2345H[A0] +	ADD.B:G	#7,2345H[SB] +	ADD.B:G	#7,A0 +	ADD.B:G	#7,R0L +	ADD.B:G	#7,SP +	ADD.B:G	[A0],[A0] +	ADD.B:G	[A0],12H[A0] +	ADD.B:G	[A0],12H[FB] +	ADD.B:G	[A0],12H[SB] +	ADD.B:G	[A0],2345H +	ADD.B:G	[A0],2345H[A0] +	ADD.B:G	[A0],2345H[SB] +	ADD.B:G	[A0],A0 +	ADD.B:G	[A0],R0L +	ADD.B:G	12H[A0],[A0] +	ADD.B:G	12H[A0],12H[A0] +	ADD.B:G	12H[A0],12H[FB] +	ADD.B:G	12H[A0],12H[SB] +	ADD.B:G	12H[A0],2345H +	ADD.B:G	12H[A0],2345H[A0] +	ADD.B:G	12H[A0],2345H[SB] +	ADD.B:G	12H[A0],A0 +	ADD.B:G	12H[A0],R0L +	ADD.B:G	12H[FB],[A0] +	ADD.B:G	12H[FB],12H[A0] +	ADD.B:G	12H[FB],12H[FB] +	ADD.B:G	12H[FB],12H[SB] +	ADD.B:G	12H[FB],2345H +	ADD.B:G	12H[FB],2345H[A0] +	ADD.B:G	12H[FB],2345H[SB] +	ADD.B:G	12H[FB],A0 +	ADD.B:G	12H[FB],R0L +	ADD.B:G	12H[SB],[A0] +	ADD.B:G	12H[SB],12H[A0] +	ADD.B:G	12H[SB],12H[FB] +	ADD.B:G	12H[SB],12H[SB] +	ADD.B:G	12H[SB],2345H +	ADD.B:G	12H[SB],2345H[A0] +	ADD.B:G	12H[SB],2345H[SB] +	ADD.B:G	12H[SB],A0 +	ADD.B:G	12H[SB],R0L +	ADD.B:G	2345H,[A0] +	ADD.B:G	2345H,12H[A0] +	ADD.B:G	2345H,12H[FB] +	ADD.B:G	2345H,12H[SB] +	ADD.B:G	2345H,2345H +	ADD.B:G	2345H,2345H[A0] +	ADD.B:G	2345H,2345H[SB] +	ADD.B:G	2345H,A0 +	ADD.B:G	2345H,R0L +	ADD.B:G	2345H[A0],[A0] +	ADD.B:G	2345H[A0],12H[A0] +	ADD.B:G	2345H[A0],12H[FB] +	ADD.B:G	2345H[A0],12H[SB] +	ADD.B:G	2345H[A0],2345H +	ADD.B:G	2345H[A0],2345H[A0] +	ADD.B:G	2345H[A0],2345H[SB] +	ADD.B:G	2345H[A0],A0 +	ADD.B:G	2345H[A0],R0L +	ADD.B:G	2345H[SB],[A0] +	ADD.B:G	2345H[SB],12H[A0] +	ADD.B:G	2345H[SB],12H[FB] +	ADD.B:G	2345H[SB],12H[SB] +	ADD.B:G	2345H[SB],2345H +	ADD.B:G	2345H[SB],2345H[A0] +	ADD.B:G	2345H[SB],2345H[SB] +	ADD.B:G	2345H[SB],A0 +	ADD.B:G	2345H[SB],R0L +	ADD.B:G	A0,[A0] +	ADD.B:G	A0,12H[A0] +	ADD.B:G	A0,12H[FB] +	ADD.B:G	A0,12H[SB] +	ADD.B:G	A0,2345H +	ADD.B:G	A0,2345H[A0] +	ADD.B:G	A0,2345H[SB] +	ADD.B:G	A0,R0L +	ADD.B:G	R0L,[A0] +	ADD.B:G	R0L,12H[A0] +	ADD.B:G	R0L,12H[FB] +	ADD.B:G	R0L,12H[SB] +	ADD.B:G	R0L,2345H +	ADD.B:G	R0L,2345H[A0] +	ADD.B:G	R0L,2345H[SB] +	ADD.B:G	R0L,A0 +	ADD.B:G	R0L,R0L +	ADD.B:Q	#7,[A0] +	ADD.B:Q	#7,12H[A0] +	ADD.B:Q	#7,12H[FB] +	ADD.B:Q	#7,12H[SB] +	ADD.B:Q	#7,2345H +	ADD.B:Q	#7,2345H[A0] +	ADD.B:Q	#7,2345H[SB] +	ADD.B:Q	#7,A0 +	ADD.B:Q	#7,R0L +	ADD.B:Q	#7,SP +	ADD.B:S	#7,12H[FB] +	ADD.B:S	#7,12H[SB] +	ADD.B:S	#7,2345H +	ADD.B:S	#7,R0L +	ADD.B:S	12H[FB],R0L +	ADD.B:S	12H[SB],R0L +	ADD.B:S	2345H,R0L +	ADD.W:G	#2345H,[A0] +	ADD.W:G	#2345H,12H[A0] +	ADD.W:G	#2345H,12H[FB] +	ADD.W:G	#2345H,12H[SB] +	ADD.W:G	#2345H,2345H +	ADD.W:G	#2345H,2345H[A0] +	ADD.W:G	#2345H,2345H[SB] +	ADD.W:G	#2345H,A0 +	ADD.W:G	#2345H,R0 +	ADD.W:G	#2345H,SP +	ADD.W:G	#7,[A0] +	ADD.W:G	#7,12H[A0] +	ADD.W:G	#7,12H[FB] +	ADD.W:G	#7,12H[SB] +	ADD.W:G	#7,2345H +	ADD.W:G	#7,2345H[A0] +	ADD.W:G	#7,2345H[SB] +	ADD.W:G	#7,A0 +	ADD.W:G	#7,R0 +	ADD.W:G	#7,SP +	ADD.W:G	[A0],[A0] +	ADD.W:G	[A0],12H[A0] +	ADD.W:G	[A0],12H[FB] +	ADD.W:G	[A0],12H[SB] +	ADD.W:G	[A0],2345H +	ADD.W:G	[A0],2345H[A0] +	ADD.W:G	[A0],2345H[SB] +	ADD.W:G	[A0],A0 +	ADD.W:G	[A0],R0 +	ADD.W:G	12H[A0],[A0] +	ADD.W:G	12H[A0],12H[A0] +	ADD.W:G	12H[A0],12H[FB] +	ADD.W:G	12H[A0],12H[SB] +	ADD.W:G	12H[A0],2345H +	ADD.W:G	12H[A0],2345H[A0] +	ADD.W:G	12H[A0],2345H[SB] +	ADD.W:G	12H[A0],A0 +	ADD.W:G	12H[A0],R0 +	ADD.W:G	12H[FB],[A0] +	ADD.W:G	12H[FB],12H[A0] +	ADD.W:G	12H[FB],12H[FB] +	ADD.W:G	12H[FB],12H[SB] +	ADD.W:G	12H[FB],2345H +	ADD.W:G	12H[FB],2345H[A0] +	ADD.W:G	12H[FB],2345H[SB] +	ADD.W:G	12H[FB],A0 +	ADD.W:G	12H[FB],R0 +	ADD.W:G	12H[SB],[A0] +	ADD.W:G	12H[SB],12H[A0] +	ADD.W:G	12H[SB],12H[FB] +	ADD.W:G	12H[SB],12H[SB] +	ADD.W:G	12H[SB],2345H +	ADD.W:G	12H[SB],2345H[A0] +	ADD.W:G	12H[SB],2345H[SB] +	ADD.W:G	12H[SB],A0 +	ADD.W:G	12H[SB],R0 +	ADD.W:G	2345H,[A0] +	ADD.W:G	2345H,12H[A0] +	ADD.W:G	2345H,12H[FB] +	ADD.W:G	2345H,12H[SB] +	ADD.W:G	2345H,2345H +	ADD.W:G	2345H,2345H[A0] +	ADD.W:G	2345H,2345H[SB] +	ADD.W:G	2345H,A0 +	ADD.W:G	2345H,R0 +	ADD.W:G	2345H[A0],[A0] +	ADD.W:G	2345H[A0],12H[A0] +	ADD.W:G	2345H[A0],12H[FB] +	ADD.W:G	2345H[A0],12H[SB] +	ADD.W:G	2345H[A0],2345H +	ADD.W:G	2345H[A0],2345H[A0] +	ADD.W:G	2345H[A0],2345H[SB] +	ADD.W:G	2345H[A0],A0 +	ADD.W:G	2345H[A0],R0 +	ADD.W:G	2345H[SB],[A0] +	ADD.W:G	2345H[SB],12H[A0] +	ADD.W:G	2345H[SB],12H[FB] +	ADD.W:G	2345H[SB],12H[SB] +	ADD.W:G	2345H[SB],2345H +	ADD.W:G	2345H[SB],2345H[A0] +	ADD.W:G	2345H[SB],2345H[SB] +	ADD.W:G	2345H[SB],A0 +	ADD.W:G	2345H[SB],R0 +	ADD.W:G	A0,[A0] +	ADD.W:G	A0,12H[A0] +	ADD.W:G	A0,12H[FB] +	ADD.W:G	A0,12H[SB] +	ADD.W:G	A0,2345H +	ADD.W:G	A0,2345H[A0] +	ADD.W:G	A0,2345H[SB] +	ADD.W:G	A0,A0 +	ADD.W:G	A0,R0 +	ADD.W:G	R0,[A0] +	ADD.W:G	R0,12H[A0] +	ADD.W:G	R0,12H[FB] +	ADD.W:G	R0,12H[SB] +	ADD.W:G	R0,2345H +	ADD.W:G	R0,2345H[A0] +	ADD.W:G	R0,2345H[SB] +	ADD.W:G	R0,A0 +	ADD.W:G	R0,R0 +	ADD.W:Q	#7,[A0] +	ADD.W:Q	#7,12H[A0] +	ADD.W:Q	#7,12H[FB] +	ADD.W:Q	#7,12H[SB] +	ADD.W:Q	#7,2345H +	ADD.W:Q	#7,2345H[A0] +	ADD.W:Q	#7,2345H[SB] +	ADD.W:Q	#7,A0 +	ADD.W:Q	#7,R0 +	ADD.W:Q	#7,SP +	AND.B:G	#7,[A0] +	AND.B:G	#7,12H[A0] +	AND.B:G	#7,12H[FB] +	AND.B:G	#7,12H[SB] +	AND.B:G	#7,2345H +	AND.B:G	#7,2345H[A0] +	AND.B:G	#7,2345H[SB] +	AND.B:G	#7,A0 +	AND.B:G	#7,R0L +	AND.B:G	[A0],[A0] +	AND.B:G	[A0],12H[A0] +	AND.B:G	[A0],12H[FB] +	AND.B:G	[A0],12H[SB] +	AND.B:G	[A0],2345H +	AND.B:G	[A0],2345H[A0] +	AND.B:G	[A0],2345H[SB] +	AND.B:G	[A0],A0 +	AND.B:G	[A0],R0L +	AND.B:G	12H[A0],[A0] +	AND.B:G	12H[A0],12H[A0] +	AND.B:G	12H[A0],12H[FB] +	AND.B:G	12H[A0],12H[SB] +	AND.B:G	12H[A0],2345H +	AND.B:G	12H[A0],2345H[A0] +	AND.B:G	12H[A0],2345H[SB] +	AND.B:G	12H[A0],A0 +	AND.B:G	12H[A0],R0L +	AND.B:G	12H[FB],[A0] +	AND.B:G	12H[FB],12H[A0] +	AND.B:G	12H[FB],12H[FB] +	AND.B:G	12H[FB],12H[SB] +	AND.B:G	12H[FB],2345H +	AND.B:G	12H[FB],2345H[A0] +	AND.B:G	12H[FB],2345H[SB] +	AND.B:G	12H[FB],A0 +	AND.B:G	12H[FB],R0L +	AND.B:G	12H[SB],[A0] +	AND.B:G	12H[SB],12H[A0] +	AND.B:G	12H[SB],12H[FB] +	AND.B:G	12H[SB],12H[SB] +	AND.B:G	12H[SB],2345H +	AND.B:G	12H[SB],2345H[A0] +	AND.B:G	12H[SB],2345H[SB] +	AND.B:G	12H[SB],A0 +	AND.B:G	12H[SB],R0L +	AND.B:G	2345H,[A0] +	AND.B:G	2345H,12H[A0] +	AND.B:G	2345H,12H[FB] +	AND.B:G	2345H,12H[SB] +	AND.B:G	2345H,2345H +	AND.B:G	2345H,2345H[A0] +	AND.B:G	2345H,2345H[SB] +	AND.B:G	2345H,A0 +	AND.B:G	2345H,R0L +	AND.B:G	2345H[A0],[A0] +	AND.B:G	2345H[A0],12H[A0] +	AND.B:G	2345H[A0],12H[FB] +	AND.B:G	2345H[A0],12H[SB] +	AND.B:G	2345H[A0],2345H +	AND.B:G	2345H[A0],2345H[A0] +	AND.B:G	2345H[A0],2345H[SB] +	AND.B:G	2345H[A0],A0 +	AND.B:G	2345H[A0],R0L +	AND.B:G	2345H[SB],[A0] +	AND.B:G	2345H[SB],12H[A0] +	AND.B:G	2345H[SB],12H[FB] +	AND.B:G	2345H[SB],12H[SB] +	AND.B:G	2345H[SB],2345H +	AND.B:G	2345H[SB],2345H[A0] +	AND.B:G	2345H[SB],2345H[SB] +	AND.B:G	2345H[SB],A0 +	AND.B:G	2345H[SB],R0L +	AND.B:G	A0,[A0] +	AND.B:G	A0,12H[A0] +	AND.B:G	A0,12H[FB] +	AND.B:G	A0,12H[SB] +	AND.B:G	A0,2345H +	AND.B:G	A0,2345H[A0] +	AND.B:G	A0,2345H[SB] +	AND.B:G	A0,R0L +	AND.B:G	R0L,[A0] +	AND.B:G	R0L,12H[A0] +	AND.B:G	R0L,12H[FB] +	AND.B:G	R0L,12H[SB] +	AND.B:G	R0L,2345H +	AND.B:G	R0L,2345H[A0] +	AND.B:G	R0L,2345H[SB] +	AND.B:G	R0L,A0 +	AND.B:S	#7,12H[FB] +	AND.B:S	#7,12H[SB] +	AND.B:S	#7,2345H +	AND.B:S	#7,R0L +	AND.B:S	12H[FB],R0L +	AND.B:S	12H[SB],R0L +	AND.B:S	2345H,R0L +	AND.W:G	#2345H,[A0] +	AND.W:G	#2345H,12H[A0] +	AND.W:G	#2345H,12H[FB] +	AND.W:G	#2345H,12H[SB] +	AND.W:G	#2345H,2345H +	AND.W:G	#2345H,2345H[A0] +	AND.W:G	#2345H,2345H[SB] +	AND.W:G	#2345H,A0 +	AND.W:G	#2345H,R0 +	AND.W:G	#7,[A0] +	AND.W:G	#7,12H[A0] +	AND.W:G	#7,12H[FB] +	AND.W:G	#7,12H[SB] +	AND.W:G	#7,2345H +	AND.W:G	#7,2345H[A0] +	AND.W:G	#7,2345H[SB] +	AND.W:G	#7,A0 +	AND.W:G	#7,R0 +	AND.W:G	[A0],[A0] +	AND.W:G	[A0],12H[A0] +	AND.W:G	[A0],12H[FB] +	AND.W:G	[A0],12H[SB] +	AND.W:G	[A0],2345H +	AND.W:G	[A0],2345H[A0] +	AND.W:G	[A0],2345H[SB] +	AND.W:G	[A0],A0 +	AND.W:G	[A0],R0 +	AND.W:G	12H[A0],[A0] +	AND.W:G	12H[A0],12H[A0] +	AND.W:G	12H[A0],12H[FB] +	AND.W:G	12H[A0],12H[SB] +	AND.W:G	12H[A0],2345H +	AND.W:G	12H[A0],2345H[A0] +	AND.W:G	12H[A0],2345H[SB] +	AND.W:G	12H[A0],A0 +	AND.W:G	12H[A0],R0 +	AND.W:G	12H[FB],[A0] +	AND.W:G	12H[FB],12H[A0] +	AND.W:G	12H[FB],12H[FB] +	AND.W:G	12H[FB],12H[SB] +	AND.W:G	12H[FB],2345H +	AND.W:G	12H[FB],2345H[A0] +	AND.W:G	12H[FB],2345H[SB] +	AND.W:G	12H[FB],A0 +	AND.W:G	12H[FB],R0 +	AND.W:G	12H[SB],[A0] +	AND.W:G	12H[SB],12H[A0] +	AND.W:G	12H[SB],12H[FB] +	AND.W:G	12H[SB],12H[SB] +	AND.W:G	12H[SB],2345H +	AND.W:G	12H[SB],2345H[A0] +	AND.W:G	12H[SB],2345H[SB] +	AND.W:G	12H[SB],A0 +	AND.W:G	12H[SB],R0 +	AND.W:G	2345H,[A0] +	AND.W:G	2345H,12H[A0] +	AND.W:G	2345H,12H[FB] +	AND.W:G	2345H,12H[SB] +	AND.W:G	2345H,2345H +	AND.W:G	2345H,2345H[A0] +	AND.W:G	2345H,2345H[SB] +	AND.W:G	2345H,A0 +	AND.W:G	2345H,R0 +	AND.W:G	2345H[A0],[A0] +	AND.W:G	2345H[A0],12H[A0] +	AND.W:G	2345H[A0],12H[FB] +	AND.W:G	2345H[A0],12H[SB] +	AND.W:G	2345H[A0],2345H +	AND.W:G	2345H[A0],2345H[A0] +	AND.W:G	2345H[A0],2345H[SB] +	AND.W:G	2345H[A0],A0 +	AND.W:G	2345H[A0],R0 +	AND.W:G	2345H[SB],[A0] +	AND.W:G	2345H[SB],12H[A0] +	AND.W:G	2345H[SB],12H[FB] +	AND.W:G	2345H[SB],12H[SB] +	AND.W:G	2345H[SB],2345H +	AND.W:G	2345H[SB],2345H[A0] +	AND.W:G	2345H[SB],2345H[SB] +	AND.W:G	2345H[SB],A0 +	AND.W:G	2345H[SB],R0 +	AND.W:G	A0,[A0] +	AND.W:G	A0,12H[A0] +	AND.W:G	A0,12H[FB] +	AND.W:G	A0,12H[SB] +	AND.W:G	A0,2345H +	AND.W:G	A0,2345H[A0] +	AND.W:G	A0,2345H[SB] +	AND.W:G	A0,A0 +	AND.W:G	A0,R0 +	AND.W:G	R0,[A0] +	AND.W:G	R0,12H[A0] +	AND.W:G	R0,12H[FB] +	AND.W:G	R0,12H[SB] +	AND.W:G	R0,2345H +	AND.W:G	R0,2345H[A0] +	AND.W:G	R0,2345H[SB] +	AND.W:G	R0,A0 +	AND.W:G	R0,R0 +	BAND	[A0] +	BAND	0FFFH +	BAND	0FFFH,0FFFH +	BAND	0FFFH,0FFFH[SB] +	BAND	0FFFH,12H[SB] +	BAND	0FFFH,15 +	BAND	12H[A0] +	BAND	15 +	BAND	15,0FFFH +	BAND	15,0FFFH[SB] +	BAND	15,12H[SB] +	BAND	15,15 +	BAND	15,1H[FB] +	BAND	15,A0 +	BAND	15,R0 +	BAND	2345H[A0] +	BCLR:G	[A0] +	BCLR:G	0FFFH +	BCLR:G	0FFFH,0FFFH +	BCLR:G	0FFFH,0FFFH[SB] +	BCLR:G	0FFFH,12H[SB] +	BCLR:G	0FFFH,15 +	BCLR:G	12H[A0] +	BCLR:G	15 +	BCLR:G	15,0FFFH +	BCLR:G	15,0FFFH[SB] +	BCLR:G	15,12H[SB] +	BCLR:G	15,15 +	BCLR:G	15,1H[FB] +	BCLR:G	15,A0 +	BCLR:G	15,R0 +	BCLR:G	2345H[A0] +	BCLR:S	15,12H[SB] +	BMEQ	[A0] +	BMEQ	0FFFH +	BMEQ	0FFFH,0FFFH +	BMEQ	0FFFH,0FFFH[SB] +	BMEQ	0FFFH,12H[SB] +	BMEQ	0FFFH,15 +	BMEQ	12H[A0] +	BMEQ	15 +	BMEQ	15,0FFFH +	BMEQ	15,0FFFH[SB] +	BMEQ	15,12H[SB] +	BMEQ	15,15 +	BMEQ	15,1H[FB] +	BMEQ	15,A0 +	BMEQ	15,R0 +	BMEQ	2345H[A0] +	BMEQ	C +	BMGE	[A0] +	BMGE	0FFFH +	BMGE	0FFFH,0FFFH +	BMGE	0FFFH,0FFFH[SB] +	BMGE	0FFFH,12H[SB] +	BMGE	0FFFH,15 +	BMGE	12H[A0] +	BMGE	15 +	BMGE	15,0FFFH +	BMGE	15,0FFFH[SB] +	BMGE	15,12H[SB] +	BMGE	15,15 +	BMGE	15,1H[FB] +	BMGE	15,A0 +	BMGE	15,R0 +	BMGE	2345H[A0] +	BMGE	C +	BMGEU	[A0] +	BMGEU	0FFFH +	BMGEU	0FFFH,0FFFH +	BMGEU	0FFFH,0FFFH[SB] +	BMGEU	0FFFH,12H[SB] +	BMGEU	0FFFH,15 +	BMGEU	12H[A0] +	BMGEU	15 +	BMGEU	15,0FFFH +	BMGEU	15,0FFFH[SB] +	BMGEU	15,12H[SB] +	BMGEU	15,15 +	BMGEU	15,1H[FB] +	BMGEU	15,A0 +	BMGEU	15,R0 +	BMGEU	2345H[A0] +	BMGEU	C +	BMGT	[A0] +	BMGT	0FFFH +	BMGT	0FFFH,0FFFH +	BMGT	0FFFH,0FFFH[SB] +	BMGT	0FFFH,12H[SB] +	BMGT	0FFFH,15 +	BMGT	12H[A0] +	BMGT	15 +	BMGT	15,0FFFH +	BMGT	15,0FFFH[SB] +	BMGT	15,12H[SB] +	BMGT	15,15 +	BMGT	15,1H[FB] +	BMGT	15,A0 +	BMGT	15,R0 +	BMGT	2345H[A0] +	BMGT	C +	BMGTU	[A0] +	BMGTU	0FFFH +	BMGTU	0FFFH,0FFFH +	BMGTU	0FFFH,0FFFH[SB] +	BMGTU	0FFFH,12H[SB] +	BMGTU	0FFFH,15 +	BMGTU	12H[A0] +	BMGTU	15 +	BMGTU	15,0FFFH +	BMGTU	15,0FFFH[SB] +	BMGTU	15,12H[SB] +	BMGTU	15,15 +	BMGTU	15,1H[FB] +	BMGTU	15,A0 +	BMGTU	15,R0 +	BMGTU	2345H[A0] +	BMGTU	C +	BMLE	[A0] +	BMLE	0FFFH +	BMLE	0FFFH,0FFFH +	BMLE	0FFFH,0FFFH[SB] +	BMLE	0FFFH,12H[SB] +	BMLE	0FFFH,15 +	BMLE	12H[A0] +	BMLE	15 +	BMLE	15,0FFFH +	BMLE	15,0FFFH[SB] +	BMLE	15,12H[SB] +	BMLE	15,15 +	BMLE	15,1H[FB] +	BMLE	15,A0 +	BMLE	15,R0 +	BMLE	2345H[A0] +	BMLE	C +	BMLEU	[A0] +	BMLEU	0FFFH +	BMLEU	0FFFH,0FFFH +	BMLEU	0FFFH,0FFFH[SB] +	BMLEU	0FFFH,12H[SB] +	BMLEU	0FFFH,15 +	BMLEU	12H[A0] +	BMLEU	15 +	BMLEU	15,0FFFH +	BMLEU	15,0FFFH[SB] +	BMLEU	15,12H[SB] +	BMLEU	15,15 +	BMLEU	15,1H[FB] +	BMLEU	15,A0 +	BMLEU	15,R0 +	BMLEU	2345H[A0] +	BMLEU	C +	BMLT	[A0] +	BMLT	0FFFH +	BMLT	0FFFH,0FFFH +	BMLT	0FFFH,0FFFH[SB] +	BMLT	0FFFH,12H[SB] +	BMLT	0FFFH,15 +	BMLT	12H[A0] +	BMLT	15 +	BMLT	15,0FFFH +	BMLT	15,0FFFH[SB] +	BMLT	15,12H[SB] +	BMLT	15,15 +	BMLT	15,1H[FB] +	BMLT	15,A0 +	BMLT	15,R0 +	BMLT	2345H[A0] +	BMLT	C +	BMLTU	[A0] +	BMLTU	0FFFH +	BMLTU	0FFFH,0FFFH +	BMLTU	0FFFH,0FFFH[SB] +	BMLTU	0FFFH,12H[SB] +	BMLTU	0FFFH,15 +	BMLTU	12H[A0] +	BMLTU	15 +	BMLTU	15,0FFFH +	BMLTU	15,0FFFH[SB] +	BMLTU	15,12H[SB] +	BMLTU	15,15 +	BMLTU	15,1H[FB] +	BMLTU	15,A0 +	BMLTU	15,R0 +	BMLTU	2345H[A0] +	BMLTU	C +	BMN	[A0] +	BMN	0FFFH +	BMN	0FFFH,0FFFH +	BMN	0FFFH,0FFFH[SB] +	BMN	0FFFH,12H[SB] +	BMN	0FFFH,15 +	BMN	12H[A0] +	BMN	15 +	BMN	15,0FFFH +	BMN	15,0FFFH[SB] +	BMN	15,12H[SB] +	BMN	15,15 +	BMN	15,1H[FB] +	BMN	15,A0 +	BMN	15,R0 +	BMN	2345H[A0] +	BMN	C +	BMNC	[A0] +	BMNC	0FFFH +	BMNC	0FFFH,0FFFH +	BMNC	0FFFH,0FFFH[SB] +	BMNC	0FFFH,12H[SB] +	BMNC	0FFFH,15 +	BMNC	12H[A0] +	BMNC	15 +	BMNC	15,0FFFH +	BMNC	15,0FFFH[SB] +	BMNC	15,12H[SB] +	BMNC	15,15 +	BMNC	15,1H[FB] +	BMNC	15,A0 +	BMNC	15,R0 +	BMNC	2345H[A0] +	BMNC	C +	BMNE	[A0] +	BMNE	0FFFH +	BMNE	0FFFH,0FFFH +	BMNE	0FFFH,0FFFH[SB] +	BMNE	0FFFH,12H[SB] +	BMNE	0FFFH,15 +	BMNE	12H[A0] +	BMNE	15 +	BMNE	15,0FFFH +	BMNE	15,0FFFH[SB] +	BMNE	15,12H[SB] +	BMNE	15,15 +	BMNE	15,1H[FB] +	BMNE	15,A0 +	BMNE	15,R0 +	BMNE	2345H[A0] +	BMNE	C +	BMNO	[A0] +	BMNO	0FFFH +	BMNO	0FFFH,0FFFH +	BMNO	0FFFH,0FFFH[SB] +	BMNO	0FFFH,12H[SB] +	BMNO	0FFFH,15 +	BMNO	12H[A0] +	BMNO	15 +	BMNO	15,0FFFH +	BMNO	15,0FFFH[SB] +	BMNO	15,12H[SB] +	BMNO	15,15 +	BMNO	15,1H[FB] +	BMNO	15,A0 +	BMNO	15,R0 +	BMNO	2345H[A0] +	BMNO	C +	BMNZ	[A0] +	BMNZ	0FFFH +	BMNZ	0FFFH,0FFFH +	BMNZ	0FFFH,0FFFH[SB] +	BMNZ	0FFFH,12H[SB] +	BMNZ	0FFFH,15 +	BMNZ	12H[A0] +	BMNZ	15 +	BMNZ	15,0FFFH +	BMNZ	15,0FFFH[SB] +	BMNZ	15,12H[SB] +	BMNZ	15,15 +	BMNZ	15,1H[FB] +	BMNZ	15,A0 +	BMNZ	15,R0 +	BMNZ	2345H[A0] +	BMNZ	C +	BMO	[A0] +	BMO	0FFFH +	BMO	0FFFH,0FFFH +	BMO	0FFFH,0FFFH[SB] +	BMO	0FFFH,12H[SB] +	BMO	0FFFH,15 +	BMO	12H[A0] +	BMO	15 +	BMO	15,0FFFH +	BMO	15,0FFFH[SB] +	BMO	15,12H[SB] +	BMO	15,15 +	BMO	15,1H[FB] +	BMO	15,A0 +	BMO	15,R0 +	BMO	2345H[A0] +	BMO	C +	BMPZ	[A0] +	BMPZ	0FFFH +	BMPZ	0FFFH,0FFFH +	BMPZ	0FFFH,0FFFH[SB] +	BMPZ	0FFFH,12H[SB] +	BMPZ	0FFFH,15 +	BMPZ	12H[A0] +	BMPZ	15 +	BMPZ	15,0FFFH +	BMPZ	15,0FFFH[SB] +	BMPZ	15,12H[SB] +	BMPZ	15,15 +	BMPZ	15,1H[FB] +	BMPZ	15,A0 +	BMPZ	15,R0 +	BMPZ	2345H[A0] +	BMPZ	C +	BMZ	[A0] +	BMZ	0FFFH +	BMZ	0FFFH,0FFFH +	BMZ	0FFFH,0FFFH[SB] +	BMZ	0FFFH,12H[SB] +	BMZ	0FFFH,15 +	BMZ	12H[A0] +	BMZ	15 +	BMZ	15,0FFFH +	BMZ	15,0FFFH[SB] +	BMZ	15,12H[SB] +	BMZ	15,15 +	BMZ	15,1H[FB] +	BMZ	15,A0 +	BMZ	15,R0 +	BMZ	2345H[A0] +	BMZ	C +	BNAND	[A0] +	BNAND	0FFFH +	BNAND	0FFFH,0FFFH +	BNAND	0FFFH,0FFFH[SB] +	BNAND	0FFFH,12H[SB] +	BNAND	0FFFH,15 +	BNAND	12H[A0] +	BNAND	15 +	BNAND	15,0FFFH +	BNAND	15,0FFFH[SB] +	BNAND	15,12H[SB] +	BNAND	15,15 +	BNAND	15,1H[FB] +	BNAND	15,A0 +	BNAND	15,R0 +	BNAND	2345H[A0] +	BNOR	[A0] +	BNOR	0FFFH +	BNOR	0FFFH,0FFFH +	BNOR	0FFFH,0FFFH[SB] +	BNOR	0FFFH,12H[SB] +	BNOR	0FFFH,15 +	BNOR	12H[A0] +	BNOR	15 +	BNOR	15,0FFFH +	BNOR	15,0FFFH[SB] +	BNOR	15,12H[SB] +	BNOR	15,15 +	BNOR	15,1H[FB] +	BNOR	15,A0 +	BNOR	15,R0 +	BNOR	2345H[A0] +	BNOT:G	[A0] +	BNOT:G	0FFFH +	BNOT:G	0FFFH,0FFFH +	BNOT:G	0FFFH,0FFFH[SB] +	BNOT:G	0FFFH,12H[SB] +	BNOT:G	0FFFH,15 +	BNOT:G	12H[A0] +	BNOT:G	15 +	BNOT:G	15,0FFFH +	BNOT:G	15,0FFFH[SB] +	BNOT:G	15,12H[SB] +	BNOT:G	15,15 +	BNOT:G	15,1H[FB] +	BNOT:G	15,A0 +	BNOT:G	15,R0 +	BNOT:G	2345H[A0] +	BNOT:S	15,12H[SB] +	BNTST	[A0] +	BNTST	0FFFH +	BNTST	0FFFH,0FFFH +	BNTST	0FFFH,0FFFH[SB] +	BNTST	0FFFH,12H[SB] +	BNTST	0FFFH,15 +	BNTST	12H[A0] +	BNTST	15 +	BNTST	15,0FFFH +	BNTST	15,0FFFH[SB] +	BNTST	15,12H[SB] +	BNTST	15,15 +	BNTST	15,1H[FB] +	BNTST	15,A0 +	BNTST	15,R0 +	BNTST	2345H[A0] +	BNXOR	[A0] +	BNXOR	0FFFH +	BNXOR	0FFFH,0FFFH +	BNXOR	0FFFH,0FFFH[SB] +	BNXOR	0FFFH,12H[SB] +	BNXOR	0FFFH,15 +	BNXOR	12H[A0] +	BNXOR	15 +	BNXOR	15,0FFFH +	BNXOR	15,0FFFH[SB] +	BNXOR	15,12H[SB] +	BNXOR	15,15 +	BNXOR	15,1H[FB] +	BNXOR	15,A0 +	BNXOR	15,R0 +	BNXOR	2345H[A0] +	BOR	[A0] +	BOR	0FFFH +	BOR	0FFFH,0FFFH +	BOR	0FFFH,0FFFH[SB] +	BOR	0FFFH,12H[SB] +	BOR	0FFFH,15 +	BOR	12H[A0] +	BOR	15 +	BOR	15,0FFFH +	BOR	15,0FFFH[SB] +	BOR	15,12H[SB] +	BOR	15,15 +	BOR	15,1H[FB] +	BOR	15,A0 +	BOR	15,R0 +	BOR	2345H[A0] +	BRK +	BSET:G	[A0] +	BSET:G	0FFFH +	BSET:G	0FFFH,0FFFH +	BSET:G	0FFFH,0FFFH[SB] +	BSET:G	0FFFH,12H[SB] +	BSET:G	0FFFH,15 +	BSET:G	12H[A0] +	BSET:G	15 +	BSET:G	15,0FFFH +	BSET:G	15,0FFFH[SB] +	BSET:G	15,12H[SB] +	BSET:G	15,15 +	BSET:G	15,1H[FB] +	BSET:G	15,A0 +	BSET:G	15,R0 +	BSET:G	2345H[A0] +	BSET:S	15,12H[SB] +	BTST:G	[A0] +	BTST:G	0FFFH +	BTST:G	0FFFH,0FFFH +	BTST:G	0FFFH,0FFFH[SB] +	BTST:G	0FFFH,12H[SB] +	BTST:G	0FFFH,15 +	BTST:G	12H[A0] +	BTST:G	15 +	BTST:G	15,0FFFH +	BTST:G	15,0FFFH[SB] +	BTST:G	15,12H[SB] +	BTST:G	15,15 +	BTST:G	15,1H[FB] +	BTST:G	15,A0 +	BTST:G	15,R0 +	BTST:G	2345H[A0] +	BTST:S	15,12H[SB] +	BTSTC	[A0] +	BTSTC	0FFFH +	BTSTC	0FFFH,0FFFH +	BTSTC	0FFFH,0FFFH[SB] +	BTSTC	0FFFH,12H[SB] +	BTSTC	0FFFH,15 +	BTSTC	12H[A0] +	BTSTC	15 +	BTSTC	15,0FFFH +	BTSTC	15,0FFFH[SB] +	BTSTC	15,12H[SB] +	BTSTC	15,15 +	BTSTC	15,1H[FB] +	BTSTC	15,A0 +	BTSTC	15,R0 +	BTSTC	2345H[A0] +	BTSTS	[A0] +	BTSTS	0FFFH +	BTSTS	0FFFH,0FFFH +	BTSTS	0FFFH,0FFFH[SB] +	BTSTS	0FFFH,12H[SB] +	BTSTS	0FFFH,15 +	BTSTS	12H[A0] +	BTSTS	15 +	BTSTS	15,0FFFH +	BTSTS	15,0FFFH[SB] +	BTSTS	15,12H[SB] +	BTSTS	15,15 +	BTSTS	15,1H[FB] +	BTSTS	15,A0 +	BTSTS	15,R0 +	BTSTS	2345H[A0] +	BXOR	[A0] +	BXOR	0FFFH +	BXOR	0FFFH,0FFFH +	BXOR	0FFFH,0FFFH[SB] +	BXOR	0FFFH,12H[SB] +	BXOR	0FFFH,15 +	BXOR	12H[A0] +	BXOR	15 +	BXOR	15,0FFFH +	BXOR	15,0FFFH[SB] +	BXOR	15,12H[SB] +	BXOR	15,15 +	BXOR	15,1H[FB] +	BXOR	15,A0 +	BXOR	15,R0 +	BXOR	2345H[A0] +	CMP.B:G	#7,[A0] +	CMP.B:G	#7,12H[A0] +	CMP.B:G	#7,12H[FB] +	CMP.B:G	#7,12H[SB] +	CMP.B:G	#7,2345H +	CMP.B:G	#7,2345H[A0] +	CMP.B:G	#7,2345H[SB] +	CMP.B:G	#7,A0 +	CMP.B:G	#7,R0H +	CMP.B:G	#7,R0L +	CMP.B:G	[A0],[A0] +	CMP.B:G	[A0],12H[A0] +	CMP.B:G	[A0],12H[FB] +	CMP.B:G	[A0],12H[SB] +	CMP.B:G	[A0],2345H +	CMP.B:G	[A0],2345H[A0] +	CMP.B:G	[A0],2345H[SB] +	CMP.B:G	[A0],A0 +	CMP.B:G	[A0],R0H +	CMP.B:G	[A0],R0L +	CMP.B:G	12H[A0],[A0] +	CMP.B:G	12H[A0],12H[A0] +	CMP.B:G	12H[A0],12H[FB] +	CMP.B:G	12H[A0],12H[SB] +	CMP.B:G	12H[A0],2345H +	CMP.B:G	12H[A0],2345H[A0] +	CMP.B:G	12H[A0],2345H[SB] +	CMP.B:G	12H[A0],A0 +	CMP.B:G	12H[A0],R0H +	CMP.B:G	12H[A0],R0L +	CMP.B:G	12H[FB],[A0] +	CMP.B:G	12H[FB],12H[A0] +	CMP.B:G	12H[FB],12H[FB] +	CMP.B:G	12H[FB],12H[SB] +	CMP.B:G	12H[FB],2345H +	CMP.B:G	12H[FB],2345H[A0] +	CMP.B:G	12H[FB],2345H[SB] +	CMP.B:G	12H[FB],A0 +	CMP.B:G	12H[FB],R0H +	CMP.B:G	12H[FB],R0L +	CMP.B:G	12H[SB],[A0] +	CMP.B:G	12H[SB],12H[A0] +	CMP.B:G	12H[SB],12H[FB] +	CMP.B:G	12H[SB],12H[SB] +	CMP.B:G	12H[SB],2345H +	CMP.B:G	12H[SB],2345H[A0] +	CMP.B:G	12H[SB],2345H[SB] +	CMP.B:G	12H[SB],A0 +	CMP.B:G	12H[SB],R0H +	CMP.B:G	12H[SB],R0L +	CMP.B:G	2345H,[A0] +	CMP.B:G	2345H,12H[A0] +	CMP.B:G	2345H,12H[FB] +	CMP.B:G	2345H,12H[SB] +	CMP.B:G	2345H,2345H +	CMP.B:G	2345H,2345H[A0] +	CMP.B:G	2345H,2345H[SB] +	CMP.B:G	2345H,A0 +	CMP.B:G	2345H,R0H +	CMP.B:G	2345H,R0L +	CMP.B:G	2345H[A0],[A0] +	CMP.B:G	2345H[A0],12H[A0] +	CMP.B:G	2345H[A0],12H[FB] +	CMP.B:G	2345H[A0],12H[SB] +	CMP.B:G	2345H[A0],2345H +	CMP.B:G	2345H[A0],2345H[A0] +	CMP.B:G	2345H[A0],2345H[SB] +	CMP.B:G	2345H[A0],A0 +	CMP.B:G	2345H[A0],R0H +	CMP.B:G	2345H[A0],R0L +	CMP.B:G	2345H[SB],[A0] +	CMP.B:G	2345H[SB],12H[A0] +	CMP.B:G	2345H[SB],12H[FB] +	CMP.B:G	2345H[SB],12H[SB] +	CMP.B:G	2345H[SB],2345H +	CMP.B:G	2345H[SB],2345H[A0] +	CMP.B:G	2345H[SB],2345H[SB] +	CMP.B:G	2345H[SB],A0 +	CMP.B:G	2345H[SB],R0H +	CMP.B:G	2345H[SB],R0L +	CMP.B:G	A0,[A0] +	CMP.B:G	A0,12H[A0] +	CMP.B:G	A0,12H[FB] +	CMP.B:G	A0,12H[SB] +	CMP.B:G	A0,2345H +	CMP.B:G	A0,2345H[A0] +	CMP.B:G	A0,2345H[SB] +	CMP.B:G	A0,R0H +	CMP.B:G	A0,R0L +	CMP.B:G	R0H,[A0] +	CMP.B:G	R0H,12H[A0] +	CMP.B:G	R0H,12H[FB] +	CMP.B:G	R0H,12H[SB] +	CMP.B:G	R0H,2345H +	CMP.B:G	R0H,2345H[A0] +	CMP.B:G	R0H,2345H[SB] +	CMP.B:G	R0H,A0 +	CMP.B:G	R0H,R0H +	CMP.B:G	R0H,R0L +	CMP.B:G	R0L,[A0] +	CMP.B:G	R0L,12H[A0] +	CMP.B:G	R0L,12H[FB] +	CMP.B:G	R0L,12H[SB] +	CMP.B:G	R0L,2345H +	CMP.B:G	R0L,2345H[A0] +	CMP.B:G	R0L,2345H[SB] +	CMP.B:G	R0L,A0 +	CMP.B:G	R0L,R0H +	CMP.B:G	R0L,R0L +	CMP.B:Q	#7,[A0] +	CMP.B:Q	#7,12H[A0] +	CMP.B:Q	#7,12H[FB] +	CMP.B:Q	#7,12H[SB] +	CMP.B:Q	#7,2345H +	CMP.B:Q	#7,2345H[A0] +	CMP.B:Q	#7,2345H[SB] +	CMP.B:Q	#7,A0 +	CMP.B:Q	#7,R0H +	CMP.B:Q	#7,R0L +	CMP.B:S	#7,12H[FB] +	CMP.B:S	#7,12H[SB] +	CMP.B:S	#7,2345H +	CMP.B:S	#7,R0H +	CMP.B:S	#7,R0L +	CMP.B:S	12H[FB],R0H +	CMP.B:S	12H[FB],R0L +	CMP.B:S	12H[SB],R0H +	CMP.B:S	12H[SB],R0L +	CMP.B:S	2345H,R0H +	CMP.B:S	2345H,R0L +	CMP.B:S	R0H,R0L +	CMP.B:S	R0L,R0H +	CMP.W:G	#2345H,[A0] +	CMP.W:G	#2345H,12H[A0] +	CMP.W:G	#2345H,12H[FB] +	CMP.W:G	#2345H,12H[SB] +	CMP.W:G	#2345H,2345H +	CMP.W:G	#2345H,2345H[A0] +	CMP.W:G	#2345H,2345H[SB] +	CMP.W:G	#2345H,A0 +	CMP.W:G	#2345H,R0 +	CMP.W:G	#2345H,R1 +	CMP.W:G	#7,[A0] +	CMP.W:G	#7,12H[A0] +	CMP.W:G	#7,12H[FB] +	CMP.W:G	#7,12H[SB] +	CMP.W:G	#7,2345H +	CMP.W:G	#7,2345H[A0] +	CMP.W:G	#7,2345H[SB] +	CMP.W:G	#7,A0 +	CMP.W:G	#7,R0 +	CMP.W:G	#7,R1 +	CMP.W:G	[A0],[A0] +	CMP.W:G	[A0],12H[A0] +	CMP.W:G	[A0],12H[FB] +	CMP.W:G	[A0],12H[SB] +	CMP.W:G	[A0],2345H +	CMP.W:G	[A0],2345H[A0] +	CMP.W:G	[A0],2345H[SB] +	CMP.W:G	[A0],A0 +	CMP.W:G	[A0],R0 +	CMP.W:G	[A0],R1 +	CMP.W:G	12H[A0],[A0] +	CMP.W:G	12H[A0],12H[A0] +	CMP.W:G	12H[A0],12H[FB] +	CMP.W:G	12H[A0],12H[SB] +	CMP.W:G	12H[A0],2345H +	CMP.W:G	12H[A0],2345H[A0] +	CMP.W:G	12H[A0],2345H[SB] +	CMP.W:G	12H[A0],A0 +	CMP.W:G	12H[A0],R0 +	CMP.W:G	12H[A0],R1 +	CMP.W:G	12H[FB],[A0] +	CMP.W:G	12H[FB],12H[A0] +	CMP.W:G	12H[FB],12H[FB] +	CMP.W:G	12H[FB],12H[SB] +	CMP.W:G	12H[FB],2345H +	CMP.W:G	12H[FB],2345H[A0] +	CMP.W:G	12H[FB],2345H[SB] +	CMP.W:G	12H[FB],A0 +	CMP.W:G	12H[FB],R0 +	CMP.W:G	12H[FB],R1 +	CMP.W:G	12H[SB],[A0] +	CMP.W:G	12H[SB],12H[A0] +	CMP.W:G	12H[SB],12H[FB] +	CMP.W:G	12H[SB],12H[SB] +	CMP.W:G	12H[SB],2345H +	CMP.W:G	12H[SB],2345H[A0] +	CMP.W:G	12H[SB],2345H[SB] +	CMP.W:G	12H[SB],A0 +	CMP.W:G	12H[SB],R0 +	CMP.W:G	12H[SB],R1 +	CMP.W:G	2345H,[A0] +	CMP.W:G	2345H,12H[A0] +	CMP.W:G	2345H,12H[FB] +	CMP.W:G	2345H,12H[SB] +	CMP.W:G	2345H,2345H +	CMP.W:G	2345H,2345H[A0] +	CMP.W:G	2345H,2345H[SB] +	CMP.W:G	2345H,A0 +	CMP.W:G	2345H,R0 +	CMP.W:G	2345H,R1 +	CMP.W:G	2345H[A0],[A0] +	CMP.W:G	2345H[A0],12H[A0] +	CMP.W:G	2345H[A0],12H[FB] +	CMP.W:G	2345H[A0],12H[SB] +	CMP.W:G	2345H[A0],2345H +	CMP.W:G	2345H[A0],2345H[A0] +	CMP.W:G	2345H[A0],2345H[SB] +	CMP.W:G	2345H[A0],A0 +	CMP.W:G	2345H[A0],R0 +	CMP.W:G	2345H[A0],R1 +	CMP.W:G	2345H[SB],[A0] +	CMP.W:G	2345H[SB],12H[A0] +	CMP.W:G	2345H[SB],12H[FB] +	CMP.W:G	2345H[SB],12H[SB] +	CMP.W:G	2345H[SB],2345H +	CMP.W:G	2345H[SB],2345H[A0] +	CMP.W:G	2345H[SB],2345H[SB] +	CMP.W:G	2345H[SB],A0 +	CMP.W:G	2345H[SB],R0 +	CMP.W:G	2345H[SB],R1 +	CMP.W:G	A0,[A0] +	CMP.W:G	A0,12H[A0] +	CMP.W:G	A0,12H[FB] +	CMP.W:G	A0,12H[SB] +	CMP.W:G	A0,2345H +	CMP.W:G	A0,2345H[A0] +	CMP.W:G	A0,2345H[SB] +	CMP.W:G	A0,A0 +	CMP.W:G	A0,R0 +	CMP.W:G	A0,R1 +	CMP.W:G	R0,[A0] +	CMP.W:G	R0,12H[A0] +	CMP.W:G	R0,12H[FB] +	CMP.W:G	R0,12H[SB] +	CMP.W:G	R0,2345H +	CMP.W:G	R0,2345H[A0] +	CMP.W:G	R0,2345H[SB] +	CMP.W:G	R0,A0 +	CMP.W:G	R0,R0 +	CMP.W:G	R0,R1 +	CMP.W:G	R1,[A0] +	CMP.W:G	R1,12H[A0] +	CMP.W:G	R1,12H[FB] +	CMP.W:G	R1,12H[SB] +	CMP.W:G	R1,2345H +	CMP.W:G	R1,2345H[A0] +	CMP.W:G	R1,2345H[SB] +	CMP.W:G	R1,A0 +	CMP.W:G	R1,R0 +	CMP.W:G	R1,R1 +	CMP.W:Q	#7,[A0] +	CMP.W:Q	#7,12H[A0] +	CMP.W:Q	#7,12H[FB] +	CMP.W:Q	#7,12H[SB] +	CMP.W:Q	#7,2345H +	CMP.W:Q	#7,2345H[A0] +	CMP.W:Q	#7,2345H[SB] +	CMP.W:Q	#7,A0 +	CMP.W:Q	#7,R0 +	CMP.W:Q	#7,R1 +	DADC.B	#7,R0L +	DADC.B	R0H,R0L +	DADC.W	#2345H,R0 +	DADC.W	#7,R0 +	DADC.W	R1,R0 +	DADD.B	#7,R0L +	DADD.B	R0H,R0L +	DADD.W	#2345H,R0 +	DADD.W	#7,R0 +	DADD.W	R1,R0 +	DEC.B	12H[FB] +	DEC.B	12H[SB] +	DEC.B	2345H +	DEC.B	R0H +	DEC.B	R0L +	DEC.W	A0 +	DIV.B	#7 +	DIV.B	[A0] +	DIV.B	12H[A0] +	DIV.B	12H[FB] +	DIV.B	12H[SB] +	DIV.B	2345H +	DIV.B	2345H[A0] +	DIV.B	2345H[SB] +	DIV.B	A0 +	DIV.B	R0H +	DIV.B	R0L +	DIV.W	#2345H +	DIV.W	#7 +	DIV.W	[A0] +	DIV.W	12H[A0] +	DIV.W	12H[FB] +	DIV.W	12H[SB] +	DIV.W	2345H +	DIV.W	2345H[A0] +	DIV.W	2345H[SB] +	DIV.W	A0 +	DIV.W	R0 +	DIV.W	R1 +	DIVU.B	#7 +	DIVU.B	[A0] +	DIVU.B	12H[A0] +	DIVU.B	12H[FB] +	DIVU.B	12H[SB] +	DIVU.B	2345H +	DIVU.B	2345H[A0] +	DIVU.B	2345H[SB] +	DIVU.B	A0 +	DIVU.B	R0H +	DIVU.B	R0L +	DIVU.W	#2345H +	DIVU.W	#7 +	DIVU.W	[A0] +	DIVU.W	12H[A0] +	DIVU.W	12H[FB] +	DIVU.W	12H[SB] +	DIVU.W	2345H +	DIVU.W	2345H[A0] +	DIVU.W	2345H[SB] +	DIVU.W	A0 +	DIVU.W	R0 +	DIVU.W	R1 +	DIVX.B	#7 +	DIVX.B	[A0] +	DIVX.B	12H[A0] +	DIVX.B	12H[FB] +	DIVX.B	12H[SB] +	DIVX.B	2345H +	DIVX.B	2345H[A0] +	DIVX.B	2345H[SB] +	DIVX.B	A0 +	DIVX.B	R0H +	DIVX.B	R0L +	DIVX.W	#2345H +	DIVX.W	#7 +	DIVX.W	[A0] +	DIVX.W	12H[A0] +	DIVX.W	12H[FB] +	DIVX.W	12H[SB] +	DIVX.W	2345H +	DIVX.W	2345H[A0] +	DIVX.W	2345H[SB] +	DIVX.W	A0 +	DIVX.W	R0 +	DIVX.W	R1 +	DSBB.B	#7,R0L +	DSBB.B	R0H,R0L +	DSBB.W	#2345H,R0 +	DSBB.W	#7,R0 +	DSBB.W	R1,R0 +	DSUB.B	#7,R0L +	DSUB.B	R0H,R0L +	DSUB.W	#2345H,R0 +	DSUB.W	#7,R0 +	DSUB.W	R1,R0 +	ENTER	#7 +	EXITD +	EXTS.B	[A0] +	EXTS.B	12H[A0] +	EXTS.B	12H[FB] +	EXTS.B	12H[SB] +	EXTS.B	2345H +	EXTS.B	2345H[A0] +	EXTS.B	2345H[SB] +	EXTS.B	R0L +	FCLR	C +	FCLR	D +	FCLR	I +	FCLR	O +	FCLR	S +	FSET	C +	FSET	D +	FSET	I +	FSET	O +	FSET	S +	INC.B	12H[FB] +	INC.B	12H[SB] +	INC.B	2345H +	INC.B	R0H +	INC.B	R0L +	INC.W	A0 +	INT	#7 +	INTO +	JEQ	$+5 +	JGE	$+5 +	JGEU	$+5 +	JGT	$+5 +	JGTU	$+5 +	JLE	$+5 +	JLEU	$+5 +	JLT	$+5 +	JLTU	$+5 +	jmp.a	12345H +	jmp.a	2345H +	jmp.b	$+5 +	jmp.S	$+5 +	jmp.w	$+5 +	JMPI.A	[A0] +	JMPI.A	12H[A0] +	JMPI.A	12H[FB] +	JMPI.A	12H[SB] +	JMPI.A	2345H +	JMPI.A	2345H[A0] +	JMPI.A	2345H[SB] +	JMPI.A	A1A0 +	JMPI.A	R2R0 +	JMPI.W	[A0] +	JMPI.W	12H[A0] +	JMPI.W	12H[FB] +	JMPI.W	12H[SB] +	JMPI.W	$+5 +	JMPI.W	2345H[A0] +	JMPI.W	2345H[SB] +	JMPI.W	A0 +	JMPI.W	R0 +	JMPS	#18 +	JN	$+5 +	JNC	$+5 +	JNE	$+5 +	JNO	$+5 +	JNZ	$+5 +	JO	$+5 +	JPZ	$+5 +	jsr.a	12345H +	jsr.a	2345H +	jsr.w	$+5 +	JSRI.A	[A0] +	JSRI.A	12H[A0] +	JSRI.A	12H[FB] +	JSRI.A	12H[SB] +	JSRI.A	2345H +	JSRI.A	2345H[A0] +	JSRI.A	2345H[SB] +	JSRI.A	A1A0 +	JSRI.A	R2R0 +	JSRI.W	[A0] +	JSRI.W	12H[A0] +	JSRI.W	12H[FB] +	JSRI.W	12H[SB] +	JSRI.W	$+5 +	JSRI.W	2345H[A0] +	JSRI.W	2345H[SB] +	JSRI.W	A0 +	JSRI.W	R0 +	JSRS	#18 +	JZ	$+5 +	LDC	#2345H,FB +	LDC	#2345H,FLG +	LDC	#2345H,INTBH +	LDC	#2345H,INTBL +	LDC	#2345H,ISP +	LDC	#2345H,SB +	LDC	#2345H,SP +	LDC	#7,FB +	LDC	#7,FLG +	LDC	#7,INTBH +	LDC	#7,INTBL +	LDC	#7,ISP +	LDC	#7,SB +	LDC	#7,SP +	LDC	[A0],FB +	LDC	[A0],FLG +	LDC	[A0],INTBH +	LDC	[A0],INTBL +	LDC	[A0],ISP +	LDC	[A0],SB +	LDC	[A0],SP +	LDC	12H[A0],FB +	LDC	12H[A0],FLG +	LDC	12H[A0],INTBH +	LDC	12H[A0],INTBL +	LDC	12H[A0],ISP +	LDC	12H[A0],SB +	LDC	12H[A0],SP +	LDC	12H[FB],FB +	LDC	12H[FB],FLG +	LDC	12H[FB],INTBH +	LDC	12H[FB],INTBL +	LDC	12H[FB],ISP +	LDC	12H[FB],SB +	LDC	12H[FB],SP +	LDC	12H[SB],FB +	LDC	12H[SB],FLG +	LDC	12H[SB],INTBH +	LDC	12H[SB],INTBL +	LDC	12H[SB],ISP +	LDC	12H[SB],SB +	LDC	12H[SB],SP +	LDC	2345H,FB +	LDC	2345H,FLG +	LDC	2345H,INTBH +	LDC	2345H,INTBL +	LDC	2345H,ISP +	LDC	2345H,SB +	LDC	2345H,SP +	LDC	2345H[A0],FB +	LDC	2345H[A0],FLG +	LDC	2345H[A0],INTBH +	LDC	2345H[A0],INTBL +	LDC	2345H[A0],ISP +	LDC	2345H[A0],SB +	LDC	2345H[A0],SP +	LDC	2345H[SB],FB +	LDC	2345H[SB],FLG +	LDC	2345H[SB],INTBH +	LDC	2345H[SB],INTBL +	LDC	2345H[SB],ISP +	LDC	2345H[SB],SB +	LDC	2345H[SB],SP +	LDC	A0,FB +	LDC	A0,FLG +	LDC	A0,INTBH +	LDC	A0,INTBL +	LDC	A0,ISP +	LDC	A0,SB +	LDC	A0,SP +	LDC	R0,FB +	LDC	R0,FLG +	LDC	R0,INTBH +	LDC	R0,INTBL +	LDC	R0,ISP +	LDC	R0,SB +	LDC	R0,SP +	LDCTX	2345H,12345H +	LDCTX	2345H,2345H +	LDE.B	[A1A0],[A0] +	LDE.B	[A1A0],12H[A0] +	LDE.B	[A1A0],12H[FB] +	LDE.B	[A1A0],12H[SB] +	LDE.B	[A1A0],2345H +	LDE.B	[A1A0],2345H[A0] +	LDE.B	[A1A0],2345H[SB] +	LDE.B	[A1A0],A0 +	LDE.B	[A1A0],R0L +	LDE.B	12345H,[A0] +	LDE.B	12345H,12H[A0] +	LDE.B	12345H,12H[FB] +	LDE.B	12345H,12H[SB] +	LDE.B	12345H,2345H +	LDE.B	12345H,2345H[A0] +	LDE.B	12345H,2345H[SB] +	LDE.B	12345H,A0 +	LDE.B	12345H,R0L +	LDE.B	12345H[A0],[A0] +	LDE.B	12345H[A0],12H[A0] +	LDE.B	12345H[A0],12H[FB] +	LDE.B	12345H[A0],12H[SB] +	LDE.B	12345H[A0],2345H +	LDE.B	12345H[A0],2345H[A0] +	LDE.B	12345H[A0],2345H[SB] +	LDE.B	12345H[A0],A0 +	LDE.B	12345H[A0],R0L +	LDE.B	12H[A0],[A0] +	LDE.B	12H[A0],12H[A0] +	LDE.B	12H[A0],12H[FB] +	LDE.B	12H[A0],12H[SB] +	LDE.B	12H[A0],2345H +	LDE.B	12H[A0],2345H[A0] +	LDE.B	12H[A0],2345H[SB] +	LDE.B	12H[A0],A0 +	LDE.B	12H[A0],R0L +	LDE.B	2345H,[A0] +	LDE.B	2345H,12H[A0] +	LDE.B	2345H,12H[FB] +	LDE.B	2345H,12H[SB] +	LDE.B	2345H,2345H +	LDE.B	2345H,2345H[A0] +	LDE.B	2345H,2345H[SB] +	LDE.B	2345H,A0 +	LDE.B	2345H,R0L +	LDE.B	2345H[A0],[A0] +	LDE.B	2345H[A0],12H[A0] +	LDE.B	2345H[A0],12H[FB] +	LDE.B	2345H[A0],12H[SB] +	LDE.B	2345H[A0],2345H +	LDE.B	2345H[A0],2345H[A0] +	LDE.B	2345H[A0],2345H[SB] +	LDE.B	2345H[A0],A0 +	LDE.B	2345H[A0],R0L +	LDE.W	[A1A0],[A0] +	LDE.W	[A1A0],12H[A0] +	LDE.W	[A1A0],12H[FB] +	LDE.W	[A1A0],12H[SB] +	LDE.W	[A1A0],2345H +	LDE.W	[A1A0],2345H[A0] +	LDE.W	[A1A0],2345H[SB] +	LDE.W	[A1A0],A0 +	LDE.W	[A1A0],R0 +	LDE.W	12345H,[A0] +	LDE.W	12345H,12H[A0] +	LDE.W	12345H,12H[FB] +	LDE.W	12345H,12H[SB] +	LDE.W	12345H,2345H +	LDE.W	12345H,2345H[A0] +	LDE.W	12345H,2345H[SB] +	LDE.W	12345H,A0 +	LDE.W	12345H,R0 +	LDE.W	12345H[A0],[A0] +	LDE.W	12345H[A0],12H[A0] +	LDE.W	12345H[A0],12H[FB] +	LDE.W	12345H[A0],12H[SB] +	LDE.W	12345H[A0],2345H +	LDE.W	12345H[A0],2345H[A0] +	LDE.W	12345H[A0],2345H[SB] +	LDE.W	12345H[A0],A0 +	LDE.W	12345H[A0],R0 +	LDE.W	12H[A0],[A0] +	LDE.W	12H[A0],12H[A0] +	LDE.W	12H[A0],12H[FB] +	LDE.W	12H[A0],12H[SB] +	LDE.W	12H[A0],2345H +	LDE.W	12H[A0],2345H[A0] +	LDE.W	12H[A0],2345H[SB] +	LDE.W	12H[A0],A0 +	LDE.W	12H[A0],R0 +	LDE.W	2345H,[A0] +	LDE.W	2345H,12H[A0] +	LDE.W	2345H,12H[FB] +	LDE.W	2345H,12H[SB] +	LDE.W	2345H,2345H +	LDE.W	2345H,2345H[A0] +	LDE.W	2345H,2345H[SB] +	LDE.W	2345H,A0 +	LDE.W	2345H,R0 +	LDE.W	2345H[A0],[A0] +	LDE.W	2345H[A0],12H[A0] +	LDE.W	2345H[A0],12H[FB] +	LDE.W	2345H[A0],12H[SB] +	LDE.W	2345H[A0],2345H +	LDE.W	2345H[A0],2345H[A0] +	LDE.W	2345H[A0],2345H[SB] +	LDE.W	2345H[A0],A0 +	LDE.W	2345H[A0],R0 +	LDINTB	#2345H +	LDINTB	#7 +	LDIPL	#7 +	MOV.B:G	#0,[A0] +	MOV.B:G	#0,12H[A0] +	MOV.B:G	#0,12H[FB] +	MOV.B:G	#0,12H[SB] +	MOV.B:G	#0,2345H +	MOV.B:G	#0,2345H[A0] +	MOV.B:G	#0,2345H[SB] +	MOV.B:G	#0,A0 +	MOV.B:G	#0,R0L +	MOV.B:G	#7,[A0] +	MOV.B:G	#7,12H[A0] +	MOV.B:G	#7,12H[FB] +	MOV.B:G	#7,12H[SB] +	MOV.B:G	#7,2345H +	MOV.B:G	#7,2345H[A0] +	MOV.B:G	#7,2345H[SB] +	MOV.B:G	#7,A0 +	MOV.B:G	#7,R0L +	MOV.B:G	[A0],[A0] +	MOV.B:G	[A0],12H[A0] +	MOV.B:G	[A0],12H[FB] +	MOV.B:G	[A0],12H[SB] +	MOV.B:G	[A0],12H[SP] +	MOV.B:G	[A0],2345H +	MOV.B:G	[A0],2345H[A0] +	MOV.B:G	[A0],2345H[SB] +	MOV.B:G	[A0],A0 +	MOV.B:G	[A0],R0L +	MOV.B:G	12H[A0],[A0] +	MOV.B:G	12H[A0],12H[A0] +	MOV.B:G	12H[A0],12H[FB] +	MOV.B:G	12H[A0],12H[SB] +	MOV.B:G	12H[A0],12H[SP] +	MOV.B:G	12H[A0],2345H +	MOV.B:G	12H[A0],2345H[A0] +	MOV.B:G	12H[A0],2345H[SB] +	MOV.B:G	12H[A0],A0 +	MOV.B:G	12H[A0],R0L +	MOV.B:G	12H[FB],[A0] +	MOV.B:G	12H[FB],12H[A0] +	MOV.B:G	12H[FB],12H[FB] +	MOV.B:G	12H[FB],12H[SB] +	MOV.B:G	12H[FB],12H[SP] +	MOV.B:G	12H[FB],2345H +	MOV.B:G	12H[FB],2345H[A0] +	MOV.B:G	12H[FB],2345H[SB] +	MOV.B:G	12H[FB],A0 +	MOV.B:G	12H[FB],R0L +	MOV.B:G	12H[SB],[A0] +	MOV.B:G	12H[SB],12H[A0] +	MOV.B:G	12H[SB],12H[FB] +	MOV.B:G	12H[SB],12H[SB] +	MOV.B:G	12H[SB],12H[SP] +	MOV.B:G	12H[SB],2345H +	MOV.B:G	12H[SB],2345H[A0] +	MOV.B:G	12H[SB],2345H[SB] +	MOV.B:G	12H[SB],A0 +	MOV.B:G	12H[SB],R0L +	MOV.B:G	12H[SP],[A0] +	MOV.B:G	12H[SP],12H[A0] +	MOV.B:G	12H[SP],12H[FB] +	MOV.B:G	12H[SP],12H[SB] +	MOV.B:G	12H[SP],2345H +	MOV.B:G	12H[SP],2345H[A0] +	MOV.B:G	12H[SP],2345H[SB] +	MOV.B:G	12H[SP],A0 +	MOV.B:G	12H[SP],R0L +	MOV.B:G	2345H,[A0] +	MOV.B:G	2345H,12H[A0] +	MOV.B:G	2345H,12H[FB] +	MOV.B:G	2345H,12H[SB] +	MOV.B:G	2345H,12H[SP] +	MOV.B:G	2345H,2345H +	MOV.B:G	2345H,2345H[A0] +	MOV.B:G	2345H,2345H[SB] +	MOV.B:G	2345H,A0 +	MOV.B:G	2345H,R0L +	MOV.B:G	2345H[A0],[A0] +	MOV.B:G	2345H[A0],12H[A0] +	MOV.B:G	2345H[A0],12H[FB] +	MOV.B:G	2345H[A0],12H[SB] +	MOV.B:G	2345H[A0],12H[SP] +	MOV.B:G	2345H[A0],2345H +	MOV.B:G	2345H[A0],2345H[A0] +	MOV.B:G	2345H[A0],2345H[SB] +	MOV.B:G	2345H[A0],A0 +	MOV.B:G	2345H[A0],R0L +	MOV.B:G	2345H[SB],[A0] +	MOV.B:G	2345H[SB],12H[A0] +	MOV.B:G	2345H[SB],12H[FB] +	MOV.B:G	2345H[SB],12H[SB] +	MOV.B:G	2345H[SB],12H[SP] +	MOV.B:G	2345H[SB],2345H +	MOV.B:G	2345H[SB],2345H[A0] +	MOV.B:G	2345H[SB],2345H[SB] +	MOV.B:G	2345H[SB],A0 +	MOV.B:G	2345H[SB],R0L +	MOV.B:G	A0,[A0] +	MOV.B:G	A0,12H[A0] +	MOV.B:G	A0,12H[FB] +	MOV.B:G	A0,12H[SB] +	MOV.B:G	A0,12H[SP] +	MOV.B:G	A0,2345H +	MOV.B:G	A0,2345H[A0] +	MOV.B:G	A0,2345H[SB] +	MOV.B:G	A0,R0L +	MOV.B:G	R0L,[A0] +	MOV.B:G	R0L,12H[A0] +	MOV.B:G	R0L,12H[FB] +	MOV.B:G	R0L,12H[SB] +	MOV.B:G	R0L,12H[SP] +	MOV.B:G	R0L,2345H +	MOV.B:G	R0L,2345H[A0] +	MOV.B:G	R0L,2345H[SB] +	MOV.B:G	R0L,A0 +	MOV.B:G	R0L,R0L +	MOV.B:Q	#0,[A0] +	MOV.B:Q	#0,12H[A0] +	MOV.B:Q	#0,12H[FB] +	MOV.B:Q	#0,12H[SB] +	MOV.B:Q	#0,2345H +	MOV.B:Q	#0,2345H[A0] +	MOV.B:Q	#0,2345H[SB] +	MOV.B:Q	#0,A0 +	MOV.B:Q	#0,R0L +	MOV.B:Q	#7,[A0] +	MOV.B:Q	#7,12H[A0] +	MOV.B:Q	#7,12H[FB] +	MOV.B:Q	#7,12H[SB] +	MOV.B:Q	#7,2345H +	MOV.B:Q	#7,2345H[A0] +	MOV.B:Q	#7,2345H[SB] +	MOV.B:Q	#7,A0 +	MOV.B:Q	#7,R0L +	MOV.B:S	#0,12H[FB] +	MOV.B:S	#0,12H[SB] +	MOV.B:S	#0,2345H +	MOV.B:S	#0,A0 +	MOV.B:S	#0,R0L +	MOV.B:S	#7,12H[FB] +	MOV.B:S	#7,12H[SB] +	MOV.B:S	#7,2345H +	MOV.B:S	#7,A0 +	MOV.B:S	#7,R0L +	MOV.B:S	12H[FB],A0 +	MOV.B:S	12H[FB],R0L +	MOV.B:S	12H[SB],A0 +	MOV.B:S	12H[SB],R0L +	MOV.B:S	2345H,A0 +	MOV.B:S	2345H,R0L +	MOV.B:S	R0L,12H[FB] +	MOV.B:S	R0L,12H[SB] +	MOV.B:S	R0L,2345H +	MOV.B:Z	#0,12H[FB] +	MOV.B:Z	#0,12H[SB] +	MOV.B:Z	#0,2345H +	MOV.B:Z	#0,R0L +	MOV.W:G	#0,[A0] +	MOV.W:G	#0,12H[A0] +	MOV.W:G	#0,12H[FB] +	MOV.W:G	#0,12H[SB] +	MOV.W:G	#0,2345H +	MOV.W:G	#0,2345H[A0] +	MOV.W:G	#0,2345H[SB] +	MOV.W:G	#0,A0 +	MOV.W:G	#0,R0 +	MOV.W:G	#2345H,[A0] +	MOV.W:G	#2345H,12H[A0] +	MOV.W:G	#2345H,12H[FB] +	MOV.W:G	#2345H,12H[SB] +	MOV.W:G	#2345H,2345H +	MOV.W:G	#2345H,2345H[A0] +	MOV.W:G	#2345H,2345H[SB] +	MOV.W:G	#2345H,A0 +	MOV.W:G	#2345H,R0 +	MOV.W:G	#7,[A0] +	MOV.W:G	#7,12H[A0] +	MOV.W:G	#7,12H[FB] +	MOV.W:G	#7,12H[SB] +	MOV.W:G	#7,2345H +	MOV.W:G	#7,2345H[A0] +	MOV.W:G	#7,2345H[SB] +	MOV.W:G	#7,A0 +	MOV.W:G	#7,R0 +	MOV.W:G	[A0],[A0] +	MOV.W:G	[A0],12H[A0] +	MOV.W:G	[A0],12H[FB] +	MOV.W:G	[A0],12H[SB] +	MOV.W:G	[A0],12H[SP] +	MOV.W:G	[A0],2345H +	MOV.W:G	[A0],2345H[A0] +	MOV.W:G	[A0],2345H[SB] +	MOV.W:G	[A0],A0 +	MOV.W:G	[A0],R0 +	MOV.W:G	12H[A0],[A0] +	MOV.W:G	12H[A0],12H[A0] +	MOV.W:G	12H[A0],12H[FB] +	MOV.W:G	12H[A0],12H[SB] +	MOV.W:G	12H[A0],12H[SP] +	MOV.W:G	12H[A0],2345H +	MOV.W:G	12H[A0],2345H[A0] +	MOV.W:G	12H[A0],2345H[SB] +	MOV.W:G	12H[A0],A0 +	MOV.W:G	12H[A0],R0 +	MOV.W:G	12H[FB],[A0] +	MOV.W:G	12H[FB],12H[A0] +	MOV.W:G	12H[FB],12H[FB] +	MOV.W:G	12H[FB],12H[SB] +	MOV.W:G	12H[FB],12H[SP] +	MOV.W:G	12H[FB],2345H +	MOV.W:G	12H[FB],2345H[A0] +	MOV.W:G	12H[FB],2345H[SB] +	MOV.W:G	12H[FB],A0 +	MOV.W:G	12H[FB],R0 +	MOV.W:G	12H[SB],[A0] +	MOV.W:G	12H[SB],12H[A0] +	MOV.W:G	12H[SB],12H[FB] +	MOV.W:G	12H[SB],12H[SB] +	MOV.W:G	12H[SB],12H[SP] +	MOV.W:G	12H[SB],2345H +	MOV.W:G	12H[SB],2345H[A0] +	MOV.W:G	12H[SB],2345H[SB] +	MOV.W:G	12H[SB],A0 +	MOV.W:G	12H[SB],R0 +	MOV.W:G	12H[SP],[A0] +	MOV.W:G	12H[SP],12H[A0] +	MOV.W:G	12H[SP],12H[FB] +	MOV.W:G	12H[SP],12H[SB] +	MOV.W:G	12H[SP],2345H +	MOV.W:G	12H[SP],2345H[A0] +	MOV.W:G	12H[SP],2345H[SB] +	MOV.W:G	12H[SP],A0 +	MOV.W:G	12H[SP],R0 +	MOV.W:G	2345H,[A0] +	MOV.W:G	2345H,12H[A0] +	MOV.W:G	2345H,12H[FB] +	MOV.W:G	2345H,12H[SB] +	MOV.W:G	2345H,12H[SP] +	MOV.W:G	2345H,2345H +	MOV.W:G	2345H,2345H[A0] +	MOV.W:G	2345H,2345H[SB] +	MOV.W:G	2345H,A0 +	MOV.W:G	2345H,R0 +	MOV.W:G	2345H[A0],[A0] +	MOV.W:G	2345H[A0],12H[A0] +	MOV.W:G	2345H[A0],12H[FB] +	MOV.W:G	2345H[A0],12H[SB] +	MOV.W:G	2345H[A0],12H[SP] +	MOV.W:G	2345H[A0],2345H +	MOV.W:G	2345H[A0],2345H[A0] +	MOV.W:G	2345H[A0],2345H[SB] +	MOV.W:G	2345H[A0],A0 +	MOV.W:G	2345H[A0],R0 +	MOV.W:G	2345H[SB],[A0] +	MOV.W:G	2345H[SB],12H[A0] +	MOV.W:G	2345H[SB],12H[FB] +	MOV.W:G	2345H[SB],12H[SB] +	MOV.W:G	2345H[SB],12H[SP] +	MOV.W:G	2345H[SB],2345H +	MOV.W:G	2345H[SB],2345H[A0] +	MOV.W:G	2345H[SB],2345H[SB] +	MOV.W:G	2345H[SB],A0 +	MOV.W:G	2345H[SB],R0 +	MOV.W:G	A0,[A0] +	MOV.W:G	A0,12H[A0] +	MOV.W:G	A0,12H[FB] +	MOV.W:G	A0,12H[SB] +	MOV.W:G	A0,12H[SP] +	MOV.W:G	A0,2345H +	MOV.W:G	A0,2345H[A0] +	MOV.W:G	A0,2345H[SB] +	MOV.W:G	A0,A0 +	MOV.W:G	A0,R0 +	MOV.W:G	R0,[A0] +	MOV.W:G	R0,12H[A0] +	MOV.W:G	R0,12H[FB] +	MOV.W:G	R0,12H[SB] +	MOV.W:G	R0,12H[SP] +	MOV.W:G	R0,2345H +	MOV.W:G	R0,2345H[A0] +	MOV.W:G	R0,2345H[SB] +	MOV.W:G	R0,A0 +	MOV.W:G	R0,R0 +	MOV.W:Q	#0,[A0] +	MOV.W:Q	#0,12H[A0] +	MOV.W:Q	#0,12H[FB] +	MOV.W:Q	#0,12H[SB] +	MOV.W:Q	#0,2345H +	MOV.W:Q	#0,2345H[A0] +	MOV.W:Q	#0,2345H[SB] +	MOV.W:Q	#0,A0 +	MOV.W:Q	#0,R0 +	MOV.W:Q	#7,[A0] +	MOV.W:Q	#7,12H[A0] +	MOV.W:Q	#7,12H[FB] +	MOV.W:Q	#7,12H[SB] +	MOV.W:Q	#7,2345H +	MOV.W:Q	#7,2345H[A0] +	MOV.W:Q	#7,2345H[SB] +	MOV.W:Q	#7,A0 +	MOV.W:Q	#7,R0 +	MOV.W:S	#0,A0 +	MOV.W:S	#2345H,A0 +	MOV.W:S	#7,A0 +	MOVA	12H[A0],A0 +	MOVA	12H[A0],R0 +	MOVA	12H[FB],A0 +	MOVA	12H[FB],R0 +	MOVA	12H[SB],A0 +	MOVA	12H[SB],R0 +	MOVA	2345H,A0 +	MOVA	2345H,R0 +	MOVA	2345H[A0],A0 +	MOVA	2345H[A0],R0 +	MOVA	2345H[SB],A0 +	MOVA	2345H[SB],R0 +	MOVHH	[A0],R0L +	MOVHH	12H[A0],R0L +	MOVHH	12H[FB],R0L +	MOVHH	12H[SB],R0L +	MOVHH	2345H,R0L +	MOVHH	2345H[A0],R0L +	MOVHH	2345H[SB],R0L +	MOVHH	R0L,[A0] +	MOVHH	R0L,12H[A0] +	MOVHH	R0L,12H[FB] +	MOVHH	R0L,12H[SB] +	MOVHH	R0L,2345H +	MOVHH	R0L,2345H[A0] +	MOVHH	R0L,2345H[SB] +	MOVHH	R0L,R0L +	MOVHL	[A0],R0L +	MOVHL	12H[A0],R0L +	MOVHL	12H[FB],R0L +	MOVHL	12H[SB],R0L +	MOVHL	2345H,R0L +	MOVHL	2345H[A0],R0L +	MOVHL	2345H[SB],R0L +	MOVHL	R0L,[A0] +	MOVHL	R0L,12H[A0] +	MOVHL	R0L,12H[FB] +	MOVHL	R0L,12H[SB] +	MOVHL	R0L,2345H +	MOVHL	R0L,2345H[A0] +	MOVHL	R0L,2345H[SB] +	MOVHL	R0L,R0L +	MOVLH	[A0],R0L +	MOVLH	12H[A0],R0L +	MOVLH	12H[FB],R0L +	MOVLH	12H[SB],R0L +	MOVLH	2345H,R0L +	MOVLH	2345H[A0],R0L +	MOVLH	2345H[SB],R0L +	MOVLH	R0L,[A0] +	MOVLH	R0L,12H[A0] +	MOVLH	R0L,12H[FB] +	MOVLH	R0L,12H[SB] +	MOVLH	R0L,2345H +	MOVLH	R0L,2345H[A0] +	MOVLH	R0L,2345H[SB] +	MOVLH	R0L,R0L +	MOVLL	[A0],R0L +	MOVLL	12H[A0],R0L +	MOVLL	12H[FB],R0L +	MOVLL	12H[SB],R0L +	MOVLL	2345H,R0L +	MOVLL	2345H[A0],R0L +	MOVLL	2345H[SB],R0L +	MOVLL	R0L,[A0] +	MOVLL	R0L,12H[A0] +	MOVLL	R0L,12H[FB] +	MOVLL	R0L,12H[SB] +	MOVLL	R0L,2345H +	MOVLL	R0L,2345H[A0] +	MOVLL	R0L,2345H[SB] +	MOVLL	R0L,R0L +	MUL.B	#0,[A0] +	MUL.B	#0,12H[A0] +	MUL.B	#0,12H[FB] +	MUL.B	#0,12H[SB] +	MUL.B	#0,2345H +	MUL.B	#0,2345H[A0] +	MUL.B	#0,2345H[SB] +	MUL.B	#0,A0 +	MUL.B	#0,R0L +	MUL.B	#7,[A0] +	MUL.B	#7,12H[A0] +	MUL.B	#7,12H[FB] +	MUL.B	#7,12H[SB] +	MUL.B	#7,2345H +	MUL.B	#7,2345H[A0] +	MUL.B	#7,2345H[SB] +	MUL.B	#7,A0 +	MUL.B	#7,R0L +	MUL.B	[A0],[A0] +	MUL.B	[A0],12H[A0] +	MUL.B	[A0],12H[FB] +	MUL.B	[A0],12H[SB] +	MUL.B	[A0],2345H +	MUL.B	[A0],2345H[A0] +	MUL.B	[A0],2345H[SB] +	MUL.B	[A0],A0 +	MUL.B	[A0],R0L +	MUL.B	12H[A0],[A0] +	MUL.B	12H[A0],12H[A0] +	MUL.B	12H[A0],12H[FB] +	MUL.B	12H[A0],12H[SB] +	MUL.B	12H[A0],2345H +	MUL.B	12H[A0],2345H[A0] +	MUL.B	12H[A0],2345H[SB] +	MUL.B	12H[A0],A0 +	MUL.B	12H[A0],R0L +	MUL.B	12H[FB],[A0] +	MUL.B	12H[FB],12H[A0] +	MUL.B	12H[FB],12H[FB] +	MUL.B	12H[FB],12H[SB] +	MUL.B	12H[FB],2345H +	MUL.B	12H[FB],2345H[A0] +	MUL.B	12H[FB],2345H[SB] +	MUL.B	12H[FB],A0 +	MUL.B	12H[FB],R0L +	MUL.B	12H[SB],[A0] +	MUL.B	12H[SB],12H[A0] +	MUL.B	12H[SB],12H[FB] +	MUL.B	12H[SB],12H[SB] +	MUL.B	12H[SB],2345H +	MUL.B	12H[SB],2345H[A0] +	MUL.B	12H[SB],2345H[SB] +	MUL.B	12H[SB],A0 +	MUL.B	12H[SB],R0L +	MUL.B	2345H,[A0] +	MUL.B	2345H,12H[A0] +	MUL.B	2345H,12H[FB] +	MUL.B	2345H,12H[SB] +	MUL.B	2345H,2345H +	MUL.B	2345H,2345H[A0] +	MUL.B	2345H,2345H[SB] +	MUL.B	2345H,A0 +	MUL.B	2345H,R0L +	MUL.B	2345H[A0],[A0] +	MUL.B	2345H[A0],12H[A0] +	MUL.B	2345H[A0],12H[FB] +	MUL.B	2345H[A0],12H[SB] +	MUL.B	2345H[A0],2345H +	MUL.B	2345H[A0],2345H[A0] +	MUL.B	2345H[A0],2345H[SB] +	MUL.B	2345H[A0],A0 +	MUL.B	2345H[A0],R0L +	MUL.B	2345H[SB],[A0] +	MUL.B	2345H[SB],12H[A0] +	MUL.B	2345H[SB],12H[FB] +	MUL.B	2345H[SB],12H[SB] +	MUL.B	2345H[SB],2345H +	MUL.B	2345H[SB],2345H[A0] +	MUL.B	2345H[SB],2345H[SB] +	MUL.B	2345H[SB],A0 +	MUL.B	2345H[SB],R0L +	MUL.B	A0,[A0] +	MUL.B	A0,12H[A0] +	MUL.B	A0,12H[FB] +	MUL.B	A0,12H[SB] +	MUL.B	A0,2345H +	MUL.B	A0,2345H[A0] +	MUL.B	A0,2345H[SB] +	MUL.B	A0,R0L +	MUL.B	R0L,[A0] +	MUL.B	R0L,12H[A0] +	MUL.B	R0L,12H[FB] +	MUL.B	R0L,12H[SB] +	MUL.B	R0L,2345H +	MUL.B	R0L,2345H[A0] +	MUL.B	R0L,2345H[SB] +	MUL.B	R0L,A0 +	MUL.B	R0L,R0L +	MUL.W	#0,[A0] +	MUL.W	#0,12H[A0] +	MUL.W	#0,12H[FB] +	MUL.W	#0,12H[SB] +	MUL.W	#0,2345H +	MUL.W	#0,2345H[A0] +	MUL.W	#0,2345H[SB] +	MUL.W	#0,A0 +	MUL.W	#0,R0 +	MUL.W	#2345H,[A0] +	MUL.W	#2345H,12H[A0] +	MUL.W	#2345H,12H[FB] +	MUL.W	#2345H,12H[SB] +	MUL.W	#2345H,2345H +	MUL.W	#2345H,2345H[A0] +	MUL.W	#2345H,2345H[SB] +	MUL.W	#2345H,A0 +	MUL.W	#2345H,R0 +	MUL.W	#7,[A0] +	MUL.W	#7,12H[A0] +	MUL.W	#7,12H[FB] +	MUL.W	#7,12H[SB] +	MUL.W	#7,2345H +	MUL.W	#7,2345H[A0] +	MUL.W	#7,2345H[SB] +	MUL.W	#7,A0 +	MUL.W	#7,R0 +	MUL.W	[A0],[A0] +	MUL.W	[A0],12H[A0] +	MUL.W	[A0],12H[FB] +	MUL.W	[A0],12H[SB] +	MUL.W	[A0],2345H +	MUL.W	[A0],2345H[A0] +	MUL.W	[A0],2345H[SB] +	MUL.W	[A0],A0 +	MUL.W	[A0],R0 +	MUL.W	12H[A0],[A0] +	MUL.W	12H[A0],12H[A0] +	MUL.W	12H[A0],12H[FB] +	MUL.W	12H[A0],12H[SB] +	MUL.W	12H[A0],2345H +	MUL.W	12H[A0],2345H[A0] +	MUL.W	12H[A0],2345H[SB] +	MUL.W	12H[A0],A0 +	MUL.W	12H[A0],R0 +	MUL.W	12H[FB],[A0] +	MUL.W	12H[FB],12H[A0] +	MUL.W	12H[FB],12H[FB] +	MUL.W	12H[FB],12H[SB] +	MUL.W	12H[FB],2345H +	MUL.W	12H[FB],2345H[A0] +	MUL.W	12H[FB],2345H[SB] +	MUL.W	12H[FB],A0 +	MUL.W	12H[FB],R0 +	MUL.W	12H[SB],[A0] +	MUL.W	12H[SB],12H[A0] +	MUL.W	12H[SB],12H[FB] +	MUL.W	12H[SB],12H[SB] +	MUL.W	12H[SB],2345H +	MUL.W	12H[SB],2345H[A0] +	MUL.W	12H[SB],2345H[SB] +	MUL.W	12H[SB],A0 +	MUL.W	12H[SB],R0 +	MUL.W	2345H,[A0] +	MUL.W	2345H,12H[A0] +	MUL.W	2345H,12H[FB] +	MUL.W	2345H,12H[SB] +	MUL.W	2345H,2345H +	MUL.W	2345H,2345H[A0] +	MUL.W	2345H,2345H[SB] +	MUL.W	2345H,A0 +	MUL.W	2345H,R0 +	MUL.W	2345H[A0],[A0] +	MUL.W	2345H[A0],12H[A0] +	MUL.W	2345H[A0],12H[FB] +	MUL.W	2345H[A0],12H[SB] +	MUL.W	2345H[A0],2345H +	MUL.W	2345H[A0],2345H[A0] +	MUL.W	2345H[A0],2345H[SB] +	MUL.W	2345H[A0],A0 +	MUL.W	2345H[A0],R0 +	MUL.W	2345H[SB],[A0] +	MUL.W	2345H[SB],12H[A0] +	MUL.W	2345H[SB],12H[FB] +	MUL.W	2345H[SB],12H[SB] +	MUL.W	2345H[SB],2345H +	MUL.W	2345H[SB],2345H[A0] +	MUL.W	2345H[SB],2345H[SB] +	MUL.W	2345H[SB],A0 +	MUL.W	2345H[SB],R0 +	MUL.W	A0,[A0] +	MUL.W	A0,12H[A0] +	MUL.W	A0,12H[FB] +	MUL.W	A0,12H[SB] +	MUL.W	A0,2345H +	MUL.W	A0,2345H[A0] +	MUL.W	A0,2345H[SB] +	MUL.W	A0,A0 +	MUL.W	A0,R0 +	MUL.W	R0,[A0] +	MUL.W	R0,12H[A0] +	MUL.W	R0,12H[FB] +	MUL.W	R0,12H[SB] +	MUL.W	R0,2345H +	MUL.W	R0,2345H[A0] +	MUL.W	R0,2345H[SB] +	MUL.W	R0,A0 +	MUL.W	R0,R0 +	MULU.B	#0,[A0] +	MULU.B	#0,12H[A0] +	MULU.B	#0,12H[FB] +	MULU.B	#0,12H[SB] +	MULU.B	#0,2345H +	MULU.B	#0,2345H[A0] +	MULU.B	#0,2345H[SB] +	MULU.B	#0,A0 +	MULU.B	#0,R0L +	MULU.B	#7,[A0] +	MULU.B	#7,12H[A0] +	MULU.B	#7,12H[FB] +	MULU.B	#7,12H[SB] +	MULU.B	#7,2345H +	MULU.B	#7,2345H[A0] +	MULU.B	#7,2345H[SB] +	MULU.B	#7,A0 +	MULU.B	#7,R0L +	MULU.B	[A0],[A0] +	MULU.B	[A0],12H[A0] +	MULU.B	[A0],12H[FB] +	MULU.B	[A0],12H[SB] +	MULU.B	[A0],2345H +	MULU.B	[A0],2345H[A0] +	MULU.B	[A0],2345H[SB] +	MULU.B	[A0],A0 +	MULU.B	[A0],R0L +	MULU.B	12H[A0],[A0] +	MULU.B	12H[A0],12H[A0] +	MULU.B	12H[A0],12H[FB] +	MULU.B	12H[A0],12H[SB] +	MULU.B	12H[A0],2345H +	MULU.B	12H[A0],2345H[A0] +	MULU.B	12H[A0],2345H[SB] +	MULU.B	12H[A0],A0 +	MULU.B	12H[A0],R0L +	MULU.B	12H[FB],[A0] +	MULU.B	12H[FB],12H[A0] +	MULU.B	12H[FB],12H[FB] +	MULU.B	12H[FB],12H[SB] +	MULU.B	12H[FB],2345H +	MULU.B	12H[FB],2345H[A0] +	MULU.B	12H[FB],2345H[SB] +	MULU.B	12H[FB],A0 +	MULU.B	12H[FB],R0L +	MULU.B	12H[SB],[A0] +	MULU.B	12H[SB],12H[A0] +	MULU.B	12H[SB],12H[FB] +	MULU.B	12H[SB],12H[SB] +	MULU.B	12H[SB],2345H +	MULU.B	12H[SB],2345H[A0] +	MULU.B	12H[SB],2345H[SB] +	MULU.B	12H[SB],A0 +	MULU.B	12H[SB],R0L +	MULU.B	2345H,[A0] +	MULU.B	2345H,12H[A0] +	MULU.B	2345H,12H[FB] +	MULU.B	2345H,12H[SB] +	MULU.B	2345H,2345H +	MULU.B	2345H,2345H[A0] +	MULU.B	2345H,2345H[SB] +	MULU.B	2345H,A0 +	MULU.B	2345H,R0L +	MULU.B	2345H[A0],[A0] +	MULU.B	2345H[A0],12H[A0] +	MULU.B	2345H[A0],12H[FB] +	MULU.B	2345H[A0],12H[SB] +	MULU.B	2345H[A0],2345H +	MULU.B	2345H[A0],2345H[A0] +	MULU.B	2345H[A0],2345H[SB] +	MULU.B	2345H[A0],A0 +	MULU.B	2345H[A0],R0L +	MULU.B	2345H[SB],[A0] +	MULU.B	2345H[SB],12H[A0] +	MULU.B	2345H[SB],12H[FB] +	MULU.B	2345H[SB],12H[SB] +	MULU.B	2345H[SB],2345H +	MULU.B	2345H[SB],2345H[A0] +	MULU.B	2345H[SB],2345H[SB] +	MULU.B	2345H[SB],A0 +	MULU.B	2345H[SB],R0L +	MULU.B	A0,[A0] +	MULU.B	A0,12H[A0] +	MULU.B	A0,12H[FB] +	MULU.B	A0,12H[SB] +	MULU.B	A0,2345H +	MULU.B	A0,2345H[A0] +	MULU.B	A0,2345H[SB] +	MULU.B	A0,R0L +	MULU.B	R0L,[A0] +	MULU.B	R0L,12H[A0] +	MULU.B	R0L,12H[FB] +	MULU.B	R0L,12H[SB] +	MULU.B	R0L,2345H +	MULU.B	R0L,2345H[A0] +	MULU.B	R0L,2345H[SB] +	MULU.B	R0L,A0 +	MULU.B	R0L,R0L +	MULU.W	#0,[A0] +	MULU.W	#0,12H[A0] +	MULU.W	#0,12H[FB] +	MULU.W	#0,12H[SB] +	MULU.W	#0,2345H +	MULU.W	#0,2345H[A0] +	MULU.W	#0,2345H[SB] +	MULU.W	#0,A0 +	MULU.W	#0,R0 +	MULU.W	#2345H,[A0] +	MULU.W	#2345H,12H[A0] +	MULU.W	#2345H,12H[FB] +	MULU.W	#2345H,12H[SB] +	MULU.W	#2345H,2345H +	MULU.W	#2345H,2345H[A0] +	MULU.W	#2345H,2345H[SB] +	MULU.W	#2345H,A0 +	MULU.W	#2345H,R0 +	MULU.W	#7,[A0] +	MULU.W	#7,12H[A0] +	MULU.W	#7,12H[FB] +	MULU.W	#7,12H[SB] +	MULU.W	#7,2345H +	MULU.W	#7,2345H[A0] +	MULU.W	#7,2345H[SB] +	MULU.W	#7,A0 +	MULU.W	#7,R0 +	MULU.W	[A0],[A0] +	MULU.W	[A0],12H[A0] +	MULU.W	[A0],12H[FB] +	MULU.W	[A0],12H[SB] +	MULU.W	[A0],2345H +	MULU.W	[A0],2345H[A0] +	MULU.W	[A0],2345H[SB] +	MULU.W	[A0],A0 +	MULU.W	[A0],R0 +	MULU.W	12H[A0],[A0] +	MULU.W	12H[A0],12H[A0] +	MULU.W	12H[A0],12H[FB] +	MULU.W	12H[A0],12H[SB] +	MULU.W	12H[A0],2345H +	MULU.W	12H[A0],2345H[A0] +	MULU.W	12H[A0],2345H[SB] +	MULU.W	12H[A0],A0 +	MULU.W	12H[A0],R0 +	MULU.W	12H[FB],[A0] +	MULU.W	12H[FB],12H[A0] +	MULU.W	12H[FB],12H[FB] +	MULU.W	12H[FB],12H[SB] +	MULU.W	12H[FB],2345H +	MULU.W	12H[FB],2345H[A0] +	MULU.W	12H[FB],2345H[SB] +	MULU.W	12H[FB],A0 +	MULU.W	12H[FB],R0 +	MULU.W	12H[SB],[A0] +	MULU.W	12H[SB],12H[A0] +	MULU.W	12H[SB],12H[FB] +	MULU.W	12H[SB],12H[SB] +	MULU.W	12H[SB],2345H +	MULU.W	12H[SB],2345H[A0] +	MULU.W	12H[SB],2345H[SB] +	MULU.W	12H[SB],A0 +	MULU.W	12H[SB],R0 +	MULU.W	2345H,[A0] +	MULU.W	2345H,12H[A0] +	MULU.W	2345H,12H[FB] +	MULU.W	2345H,12H[SB] +	MULU.W	2345H,2345H +	MULU.W	2345H,2345H[A0] +	MULU.W	2345H,2345H[SB] +	MULU.W	2345H,A0 +	MULU.W	2345H,R0 +	MULU.W	2345H[A0],[A0] +	MULU.W	2345H[A0],12H[A0] +	MULU.W	2345H[A0],12H[FB] +	MULU.W	2345H[A0],12H[SB] +	MULU.W	2345H[A0],2345H +	MULU.W	2345H[A0],2345H[A0] +	MULU.W	2345H[A0],2345H[SB] +	MULU.W	2345H[A0],A0 +	MULU.W	2345H[A0],R0 +	MULU.W	2345H[SB],[A0] +	MULU.W	2345H[SB],12H[A0] +	MULU.W	2345H[SB],12H[FB] +	MULU.W	2345H[SB],12H[SB] +	MULU.W	2345H[SB],2345H +	MULU.W	2345H[SB],2345H[A0] +	MULU.W	2345H[SB],2345H[SB] +	MULU.W	2345H[SB],A0 +	MULU.W	2345H[SB],R0 +	MULU.W	A0,[A0] +	MULU.W	A0,12H[A0] +	MULU.W	A0,12H[FB] +	MULU.W	A0,12H[SB] +	MULU.W	A0,2345H +	MULU.W	A0,2345H[A0] +	MULU.W	A0,2345H[SB] +	MULU.W	A0,A0 +	MULU.W	A0,R0 +	MULU.W	R0,[A0] +	MULU.W	R0,12H[A0] +	MULU.W	R0,12H[FB] +	MULU.W	R0,12H[SB] +	MULU.W	R0,2345H +	MULU.W	R0,2345H[A0] +	MULU.W	R0,2345H[SB] +	MULU.W	R0,A0 +	MULU.W	R0,R0 +	NEG.B	[A0] +	NEG.B	12H[A0] +	NEG.B	12H[FB] +	NEG.B	12H[SB] +	NEG.B	2345H +	NEG.B	2345H[A0] +	NEG.B	2345H[SB] +	NEG.B	R0L +	NEG.W	[A0] +	NEG.W	12H[A0] +	NEG.W	12H[FB] +	NEG.W	12H[SB] +	NEG.W	2345H +	NEG.W	2345H[A0] +	NEG.W	2345H[SB] +	NEG.W	A0 +	NEG.W	R0 +	NOP +	NOT.B:G	[A0] +	NOT.B:G	12H[A0] +	NOT.B:G	12H[FB] +	NOT.B:G	12H[SB] +	NOT.B:G	2345H +	NOT.B:G	2345H[A0] +	NOT.B:G	2345H[SB] +	NOT.B:G	R0L +	NOT.B:S	12H[FB] +	NOT.B:S	12H[SB] +	NOT.B:S	2345H +	NOT.B:S	R0L +	NOT.W:G	[A0] +	NOT.W:G	12H[A0] +	NOT.W:G	12H[FB] +	NOT.W:G	12H[SB] +	NOT.W:G	2345H +	NOT.W:G	2345H[A0] +	NOT.W:G	2345H[SB] +	NOT.W:G	A0 +	NOT.W:G	R0 +	OR.B:G	#7,[A0] +	OR.B:G	#7,12H[A0] +	OR.B:G	#7,12H[FB] +	OR.B:G	#7,12H[SB] +	OR.B:G	#7,2345H +	OR.B:G	#7,2345H[A0] +	OR.B:G	#7,2345H[SB] +	OR.B:G	#7,A0 +	OR.B:G	#7,R0L +	OR.B:G	[A0],[A0] +	OR.B:G	[A0],12H[A0] +	OR.B:G	[A0],12H[FB] +	OR.B:G	[A0],12H[SB] +	OR.B:G	[A0],2345H +	OR.B:G	[A0],2345H[A0] +	OR.B:G	[A0],2345H[SB] +	OR.B:G	[A0],A0 +	OR.B:G	[A0],R0L +	OR.B:G	12H[A0],[A0] +	OR.B:G	12H[A0],12H[A0] +	OR.B:G	12H[A0],12H[FB] +	OR.B:G	12H[A0],12H[SB] +	OR.B:G	12H[A0],2345H +	OR.B:G	12H[A0],2345H[A0] +	OR.B:G	12H[A0],2345H[SB] +	OR.B:G	12H[A0],A0 +	OR.B:G	12H[A0],R0L +	OR.B:G	12H[FB],[A0] +	OR.B:G	12H[FB],12H[A0] +	OR.B:G	12H[FB],12H[FB] +	OR.B:G	12H[FB],12H[SB] +	OR.B:G	12H[FB],2345H +	OR.B:G	12H[FB],2345H[A0] +	OR.B:G	12H[FB],2345H[SB] +	OR.B:G	12H[FB],A0 +	OR.B:G	12H[FB],R0L +	OR.B:G	12H[SB],[A0] +	OR.B:G	12H[SB],12H[A0] +	OR.B:G	12H[SB],12H[FB] +	OR.B:G	12H[SB],12H[SB] +	OR.B:G	12H[SB],2345H +	OR.B:G	12H[SB],2345H[A0] +	OR.B:G	12H[SB],2345H[SB] +	OR.B:G	12H[SB],A0 +	OR.B:G	12H[SB],R0L +	OR.B:G	2345H,[A0] +	OR.B:G	2345H,12H[A0] +	OR.B:G	2345H,12H[FB] +	OR.B:G	2345H,12H[SB] +	OR.B:G	2345H,2345H +	OR.B:G	2345H,2345H[A0] +	OR.B:G	2345H,2345H[SB] +	OR.B:G	2345H,A0 +	OR.B:G	2345H,R0L +	OR.B:G	2345H[A0],[A0] +	OR.B:G	2345H[A0],12H[A0] +	OR.B:G	2345H[A0],12H[FB] +	OR.B:G	2345H[A0],12H[SB] +	OR.B:G	2345H[A0],2345H +	OR.B:G	2345H[A0],2345H[A0] +	OR.B:G	2345H[A0],2345H[SB] +	OR.B:G	2345H[A0],A0 +	OR.B:G	2345H[A0],R0L +	OR.B:G	2345H[SB],[A0] +	OR.B:G	2345H[SB],12H[A0] +	OR.B:G	2345H[SB],12H[FB] +	OR.B:G	2345H[SB],12H[SB] +	OR.B:G	2345H[SB],2345H +	OR.B:G	2345H[SB],2345H[A0] +	OR.B:G	2345H[SB],2345H[SB] +	OR.B:G	2345H[SB],A0 +	OR.B:G	2345H[SB],R0L +	OR.B:G	A0,[A0] +	OR.B:G	A0,12H[A0] +	OR.B:G	A0,12H[FB] +	OR.B:G	A0,12H[SB] +	OR.B:G	A0,2345H +	OR.B:G	A0,2345H[A0] +	OR.B:G	A0,2345H[SB] +	OR.B:G	A0,R0L +	OR.B:G	R0L,[A0] +	OR.B:G	R0L,12H[A0] +	OR.B:G	R0L,12H[FB] +	OR.B:G	R0L,12H[SB] +	OR.B:G	R0L,2345H +	OR.B:G	R0L,2345H[A0] +	OR.B:G	R0L,2345H[SB] +	OR.B:G	R0L,A0 +	OR.B:G	R0L,R0L +	OR.B:S	#7,12H[FB] +	OR.B:S	#7,12H[SB] +	OR.B:S	#7,2345H +	OR.B:S	#7,R0L +	OR.B:S	12H[FB],R0L +	OR.B:S	12H[SB],R0L +	OR.B:S	2345H,R0L +	OR.W:G	#2345H,[A0] +	OR.W:G	#2345H,12H[A0] +	OR.W:G	#2345H,12H[FB] +	OR.W:G	#2345H,12H[SB] +	OR.W:G	#2345H,2345H +	OR.W:G	#2345H,2345H[A0] +	OR.W:G	#2345H,2345H[SB] +	OR.W:G	#2345H,A0 +	OR.W:G	#2345H,R0 +	OR.W:G	#7,[A0] +	OR.W:G	#7,12H[A0] +	OR.W:G	#7,12H[FB] +	OR.W:G	#7,12H[SB] +	OR.W:G	#7,2345H +	OR.W:G	#7,2345H[A0] +	OR.W:G	#7,2345H[SB] +	OR.W:G	#7,A0 +	OR.W:G	#7,R0 +	OR.W:G	[A0],[A0] +	OR.W:G	[A0],12H[A0] +	OR.W:G	[A0],12H[FB] +	OR.W:G	[A0],12H[SB] +	OR.W:G	[A0],2345H +	OR.W:G	[A0],2345H[A0] +	OR.W:G	[A0],2345H[SB] +	OR.W:G	[A0],A0 +	OR.W:G	[A0],R0 +	OR.W:G	12H[A0],[A0] +	OR.W:G	12H[A0],12H[A0] +	OR.W:G	12H[A0],12H[FB] +	OR.W:G	12H[A0],12H[SB] +	OR.W:G	12H[A0],2345H +	OR.W:G	12H[A0],2345H[A0] +	OR.W:G	12H[A0],2345H[SB] +	OR.W:G	12H[A0],A0 +	OR.W:G	12H[A0],R0 +	OR.W:G	12H[FB],[A0] +	OR.W:G	12H[FB],12H[A0] +	OR.W:G	12H[FB],12H[FB] +	OR.W:G	12H[FB],12H[SB] +	OR.W:G	12H[FB],2345H +	OR.W:G	12H[FB],2345H[A0] +	OR.W:G	12H[FB],2345H[SB] +	OR.W:G	12H[FB],A0 +	OR.W:G	12H[FB],R0 +	OR.W:G	12H[SB],[A0] +	OR.W:G	12H[SB],12H[A0] +	OR.W:G	12H[SB],12H[FB] +	OR.W:G	12H[SB],12H[SB] +	OR.W:G	12H[SB],2345H +	OR.W:G	12H[SB],2345H[A0] +	OR.W:G	12H[SB],2345H[SB] +	OR.W:G	12H[SB],A0 +	OR.W:G	12H[SB],R0 +	OR.W:G	2345H,[A0] +	OR.W:G	2345H,12H[A0] +	OR.W:G	2345H,12H[FB] +	OR.W:G	2345H,12H[SB] +	OR.W:G	2345H,2345H +	OR.W:G	2345H,2345H[A0] +	OR.W:G	2345H,2345H[SB] +	OR.W:G	2345H,A0 +	OR.W:G	2345H,R0 +	OR.W:G	2345H[A0],[A0] +	OR.W:G	2345H[A0],12H[A0] +	OR.W:G	2345H[A0],12H[FB] +	OR.W:G	2345H[A0],12H[SB] +	OR.W:G	2345H[A0],2345H +	OR.W:G	2345H[A0],2345H[A0] +	OR.W:G	2345H[A0],2345H[SB] +	OR.W:G	2345H[A0],A0 +	OR.W:G	2345H[A0],R0 +	OR.W:G	2345H[SB],[A0] +	OR.W:G	2345H[SB],12H[A0] +	OR.W:G	2345H[SB],12H[FB] +	OR.W:G	2345H[SB],12H[SB] +	OR.W:G	2345H[SB],2345H +	OR.W:G	2345H[SB],2345H[A0] +	OR.W:G	2345H[SB],2345H[SB] +	OR.W:G	2345H[SB],A0 +	OR.W:G	2345H[SB],R0 +	OR.W:G	A0,[A0] +	OR.W:G	A0,12H[A0] +	OR.W:G	A0,12H[FB] +	OR.W:G	A0,12H[SB] +	OR.W:G	A0,2345H +	OR.W:G	A0,2345H[A0] +	OR.W:G	A0,2345H[SB] +	OR.W:G	A0,A0 +	OR.W:G	A0,R0 +	OR.W:G	R0,[A0] +	OR.W:G	R0,12H[A0] +	OR.W:G	R0,12H[FB] +	OR.W:G	R0,12H[SB] +	OR.W:G	R0,2345H +	OR.W:G	R0,2345H[A0] +	OR.W:G	R0,2345H[SB] +	OR.W:G	R0,A0 +	OR.W:G	R0,R0 +	POP.B:G	[A0] +	POP.B:G	12H[A0] +	POP.B:G	12H[FB] +	POP.B:G	12H[SB] +	POP.B:G	2345H +	POP.B:G	2345H[A0] +	POP.B:G	2345H[SB] +	POP.B:G	R0L +	POP.B:S	R0L +	POP.W:G	[A0] +	POP.W:G	12H[A0] +	POP.W:G	12H[FB] +	POP.W:G	12H[SB] +	POP.W:G	2345H +	POP.W:G	2345H[A0] +	POP.W:G	2345H[SB] +	POP.W:G	A0 +	POP.W:G	R0 +	POP.W:S	A0 +	POPC	FB +	POPC	FLG +	POPC	INTBH +	POPC	INTBL +	POPC	ISP +	POPC	SB +	POPC	SP +	POPM	A0 +	POPM	A0,FB +	POPM	A0,R0 +	POPM	A0,SB +	POPM	FB +	POPM	FB,A0 +	POPM	FB,R0 +	POPM	FB,SB +	POPM	R0 +	POPM	R0,A0 +	POPM	R0,FB +	POPM	R0,SB +	POPM	SB +	POPM	SB,A0 +	POPM	SB,FB +	POPM	SB,R0 +	PUSH.B:G	#7 +	PUSH.B:G	[A0] +	PUSH.B:G	12H[A0] +	PUSH.B:G	12H[FB] +	PUSH.B:G	12H[SB] +	PUSH.B:G	2345H +	PUSH.B:G	2345H[A0] +	PUSH.B:G	2345H[SB] +	PUSH.B:G	R0L +	PUSH.B:S	R0L +	PUSH.W:G	#2345H +	PUSH.W:G	#7 +	PUSH.W:G	[A0] +	PUSH.W:G	12H[A0] +	PUSH.W:G	12H[FB] +	PUSH.W:G	12H[SB] +	PUSH.W:G	2345H +	PUSH.W:G	2345H[A0] +	PUSH.W:G	2345H[SB] +	PUSH.W:G	A0 +	PUSH.W:G	R0 +	PUSH.W:S	A0 +	PUSHA	12H[A0] +	PUSHA	12H[FB] +	PUSHA	12H[SB] +	PUSHA	2345H +	PUSHA	2345H[A0] +	PUSHA	2345H[SB] +	PUSHC	FB +	PUSHC	FLG +	PUSHC	INTBH +	PUSHC	INTBL +	PUSHC	ISP +	PUSHC	SB +	PUSHC	SP +	PUSHM	A0 +	PUSHM	A0,FB +	PUSHM	A0,R0 +	PUSHM	A0,SB +	PUSHM	FB +	PUSHM	FB,A0 +	PUSHM	FB,R0 +	PUSHM	FB,SB +	PUSHM	R0 +	PUSHM	R0,A0 +	PUSHM	R0,FB +	PUSHM	R0,SB +	PUSHM	SB +	PUSHM	SB,A0 +	PUSHM	SB,FB +	PUSHM	SB,R0 +	REIT +	RMPA.B +	RMPA.W +	ROLC.B	[A0] +	ROLC.B	12H[A0] +	ROLC.B	12H[FB] +	ROLC.B	12H[SB] +	ROLC.B	2345H +	ROLC.B	2345H[A0] +	ROLC.B	2345H[SB] +	ROLC.B	r0l +	ROLC.B	R1H +	ROLC.W	[A0] +	ROLC.W	12H[A0] +	ROLC.W	12H[FB] +	ROLC.W	12H[SB] +	ROLC.W	2345H +	ROLC.W	2345H[A0] +	ROLC.W	2345H[SB] +	ROLC.W	A0 +	ROLC.W	R0 +	RORC.B	[A0] +	RORC.B	12H[A0] +	RORC.B	12H[FB] +	RORC.B	12H[SB] +	RORC.B	2345H +	RORC.B	2345H[A0] +	RORC.B	2345H[SB] +	RORC.B	r0l +	RORC.B	R1H +	RORC.W	[A0] +	RORC.W	12H[A0] +	RORC.W	12H[FB] +	RORC.W	12H[SB] +	RORC.W	2345H +	RORC.W	2345H[A0] +	RORC.W	2345H[SB] +	RORC.W	A0 +	RORC.W	R0 +	ROT.B	#7,[A0] +	ROT.B	#7,12H[A0] +	ROT.B	#7,12H[FB] +	ROT.B	#7,12H[SB] +	ROT.B	#7,2345H +	ROT.B	#7,2345H[A0] +	ROT.B	#7,2345H[SB] +	ROT.B	#7,r0l +	ROT.B	#7,R1H +	ROT.B	R1H,[A0] +	ROT.B	R1H,12H[A0] +	ROT.B	R1H,12H[FB] +	ROT.B	R1H,12H[SB] +	ROT.B	R1H,2345H +	ROT.B	R1H,2345H[A0] +	ROT.B	R1H,2345H[SB] +	ROT.B	R1H,r0l +	ROT.W	#7,[A0] +	ROT.W	#7,12H[A0] +	ROT.W	#7,12H[FB] +	ROT.W	#7,12H[SB] +	ROT.W	#7,2345H +	ROT.W	#7,2345H[A0] +	ROT.W	#7,2345H[SB] +	ROT.W	#7,A0 +	ROT.W	#7,R0 +	ROT.W	R1H,[A0] +	ROT.W	R1H,12H[A0] +	ROT.W	R1H,12H[FB] +	ROT.W	R1H,12H[SB] +	ROT.W	R1H,2345H +	ROT.W	R1H,2345H[A0] +	ROT.W	R1H,2345H[SB] +	ROT.W	R1H,A0 +	ROT.W	R1H,R0 +	RTS +	SBB.B	#7,[A0] +	SBB.B	#7,12H[A0] +	SBB.B	#7,12H[FB] +	SBB.B	#7,12H[SB] +	SBB.B	#7,2345H +	SBB.B	#7,2345H[A0] +	SBB.B	#7,2345H[SB] +	SBB.B	#7,A0 +	SBB.B	#7,R0L +	SBB.B	#7,R1H +	SBB.B	[A0],[A0] +	SBB.B	[A0],12H[A0] +	SBB.B	[A0],12H[FB] +	SBB.B	[A0],12H[SB] +	SBB.B	[A0],2345H +	SBB.B	[A0],2345H[A0] +	SBB.B	[A0],2345H[SB] +	SBB.B	[A0],A0 +	SBB.B	[A0],R0L +	SBB.B	[A0],R1H +	SBB.B	12H[A0],[A0] +	SBB.B	12H[A0],12H[A0] +	SBB.B	12H[A0],12H[FB] +	SBB.B	12H[A0],12H[SB] +	SBB.B	12H[A0],2345H +	SBB.B	12H[A0],2345H[A0] +	SBB.B	12H[A0],2345H[SB] +	SBB.B	12H[A0],A0 +	SBB.B	12H[A0],R0L +	SBB.B	12H[A0],R1H +	SBB.B	12H[FB],[A0] +	SBB.B	12H[FB],12H[A0] +	SBB.B	12H[FB],12H[FB] +	SBB.B	12H[FB],12H[SB] +	SBB.B	12H[FB],2345H +	SBB.B	12H[FB],2345H[A0] +	SBB.B	12H[FB],2345H[SB] +	SBB.B	12H[FB],A0 +	SBB.B	12H[FB],R0L +	SBB.B	12H[FB],R1H +	SBB.B	12H[SB],[A0] +	SBB.B	12H[SB],12H[A0] +	SBB.B	12H[SB],12H[FB] +	SBB.B	12H[SB],12H[SB] +	SBB.B	12H[SB],2345H +	SBB.B	12H[SB],2345H[A0] +	SBB.B	12H[SB],2345H[SB] +	SBB.B	12H[SB],A0 +	SBB.B	12H[SB],R0L +	SBB.B	12H[SB],R1H +	SBB.B	2345H,[A0] +	SBB.B	2345H,12H[A0] +	SBB.B	2345H,12H[FB] +	SBB.B	2345H,12H[SB] +	SBB.B	2345H,2345H +	SBB.B	2345H,2345H[A0] +	SBB.B	2345H,2345H[SB] +	SBB.B	2345H,A0 +	SBB.B	2345H,R0L +	SBB.B	2345H,R1H +	SBB.B	2345H[A0],[A0] +	SBB.B	2345H[A0],12H[A0] +	SBB.B	2345H[A0],12H[FB] +	SBB.B	2345H[A0],12H[SB] +	SBB.B	2345H[A0],2345H +	SBB.B	2345H[A0],2345H[A0] +	SBB.B	2345H[A0],2345H[SB] +	SBB.B	2345H[A0],A0 +	SBB.B	2345H[A0],R0L +	SBB.B	2345H[A0],R1H +	SBB.B	2345H[SB],[A0] +	SBB.B	2345H[SB],12H[A0] +	SBB.B	2345H[SB],12H[FB] +	SBB.B	2345H[SB],12H[SB] +	SBB.B	2345H[SB],2345H +	SBB.B	2345H[SB],2345H[A0] +	SBB.B	2345H[SB],2345H[SB] +	SBB.B	2345H[SB],A0 +	SBB.B	2345H[SB],R0L +	SBB.B	2345H[SB],R1H +	SBB.B	A0,[A0] +	SBB.B	A0,12H[A0] +	SBB.B	A0,12H[FB] +	SBB.B	A0,12H[SB] +	SBB.B	A0,2345H +	SBB.B	A0,2345H[A0] +	SBB.B	A0,2345H[SB] +	SBB.B	A0,R0L +	SBB.B	A0,R1H +	SBB.B	R0L,[A0] +	SBB.B	R0L,12H[A0] +	SBB.B	R0L,12H[FB] +	SBB.B	R0L,12H[SB] +	SBB.B	R0L,2345H +	SBB.B	R0L,2345H[A0] +	SBB.B	R0L,2345H[SB] +	SBB.B	R0L,A0 +	SBB.B	R0L,R0L +	SBB.B	R0L,R1H +	SBB.B	R1H,[A0] +	SBB.B	R1H,12H[A0] +	SBB.B	R1H,12H[FB] +	SBB.B	R1H,12H[SB] +	SBB.B	R1H,2345H +	SBB.B	R1H,2345H[A0] +	SBB.B	R1H,2345H[SB] +	SBB.B	R1H,A0 +	SBB.B	R1H,R0L +	SBB.B	R1H,R1H +	SBB.W	#2345H,[A0] +	SBB.W	#2345H,12H[A0] +	SBB.W	#2345H,12H[FB] +	SBB.W	#2345H,12H[SB] +	SBB.W	#2345H,2345H +	SBB.W	#2345H,2345H[A0] +	SBB.W	#2345H,2345H[SB] +	SBB.W	#2345H,A0 +	SBB.W	#2345H,R0 +	SBB.W	#7,[A0] +	SBB.W	#7,12H[A0] +	SBB.W	#7,12H[FB] +	SBB.W	#7,12H[SB] +	SBB.W	#7,2345H +	SBB.W	#7,2345H[A0] +	SBB.W	#7,2345H[SB] +	SBB.W	#7,A0 +	SBB.W	#7,R0 +	SBB.W	[A0],[A0] +	SBB.W	[A0],12H[A0] +	SBB.W	[A0],12H[FB] +	SBB.W	[A0],12H[SB] +	SBB.W	[A0],2345H +	SBB.W	[A0],2345H[A0] +	SBB.W	[A0],2345H[SB] +	SBB.W	[A0],A0 +	SBB.W	[A0],R0 +	SBB.W	12H[A0],[A0] +	SBB.W	12H[A0],12H[A0] +	SBB.W	12H[A0],12H[FB] +	SBB.W	12H[A0],12H[SB] +	SBB.W	12H[A0],2345H +	SBB.W	12H[A0],2345H[A0] +	SBB.W	12H[A0],2345H[SB] +	SBB.W	12H[A0],A0 +	SBB.W	12H[A0],R0 +	SBB.W	12H[FB],[A0] +	SBB.W	12H[FB],12H[A0] +	SBB.W	12H[FB],12H[FB] +	SBB.W	12H[FB],12H[SB] +	SBB.W	12H[FB],2345H +	SBB.W	12H[FB],2345H[A0] +	SBB.W	12H[FB],2345H[SB] +	SBB.W	12H[FB],A0 +	SBB.W	12H[FB],R0 +	SBB.W	12H[SB],[A0] +	SBB.W	12H[SB],12H[A0] +	SBB.W	12H[SB],12H[FB] +	SBB.W	12H[SB],12H[SB] +	SBB.W	12H[SB],2345H +	SBB.W	12H[SB],2345H[A0] +	SBB.W	12H[SB],2345H[SB] +	SBB.W	12H[SB],A0 +	SBB.W	12H[SB],R0 +	SBB.W	2345H,[A0] +	SBB.W	2345H,12H[A0] +	SBB.W	2345H,12H[FB] +	SBB.W	2345H,12H[SB] +	SBB.W	2345H,2345H +	SBB.W	2345H,2345H[A0] +	SBB.W	2345H,2345H[SB] +	SBB.W	2345H,A0 +	SBB.W	2345H,R0 +	SBB.W	2345H[A0],[A0] +	SBB.W	2345H[A0],12H[A0] +	SBB.W	2345H[A0],12H[FB] +	SBB.W	2345H[A0],12H[SB] +	SBB.W	2345H[A0],2345H +	SBB.W	2345H[A0],2345H[A0] +	SBB.W	2345H[A0],2345H[SB] +	SBB.W	2345H[A0],A0 +	SBB.W	2345H[A0],R0 +	SBB.W	2345H[SB],[A0] +	SBB.W	2345H[SB],12H[A0] +	SBB.W	2345H[SB],12H[FB] +	SBB.W	2345H[SB],12H[SB] +	SBB.W	2345H[SB],2345H +	SBB.W	2345H[SB],2345H[A0] +	SBB.W	2345H[SB],2345H[SB] +	SBB.W	2345H[SB],A0 +	SBB.W	2345H[SB],R0 +	SBB.W	A0,[A0] +	SBB.W	A0,12H[A0] +	SBB.W	A0,12H[FB] +	SBB.W	A0,12H[SB] +	SBB.W	A0,2345H +	SBB.W	A0,2345H[A0] +	SBB.W	A0,2345H[SB] +	SBB.W	A0,A0 +	SBB.W	A0,R0 +	SBB.W	R0,[A0] +	SBB.W	R0,12H[A0] +	SBB.W	R0,12H[FB] +	SBB.W	R0,12H[SB] +	SBB.W	R0,2345H +	SBB.W	R0,2345H[A0] +	SBB.W	R0,2345H[SB] +	SBB.W	R0,A0 +	SBB.W	R0,R0 +	SHA.B	#7,[A0] +	SHA.B	#7,12H[A0] +	SHA.B	#7,12H[FB] +	SHA.B	#7,12H[SB] +	SHA.B	#7,2345H +	SHA.B	#7,2345H[A0] +	SHA.B	#7,2345H[SB] +	SHA.B	#7,R0L +	SHA.B	#7,R1H +	SHA.B	R1H,[A0] +	SHA.B	R1H,12H[A0] +	SHA.B	R1H,12H[FB] +	SHA.B	R1H,12H[SB] +	SHA.B	R1H,2345H +	SHA.B	R1H,2345H[A0] +	SHA.B	R1H,2345H[SB] +	SHA.B	R1H,R0L +	SHA.L	#7,R2R0 +	SHA.L	R1H,R2R0 +	SHA.W	#7,[A0] +	SHA.W	#7,12H[A0] +	SHA.W	#7,12H[FB] +	SHA.W	#7,12H[SB] +	SHA.W	#7,2345H +	SHA.W	#7,2345H[A0] +	SHA.W	#7,2345H[SB] +	SHA.W	#7,A0 +	SHA.W	#7,R0 +	SHA.W	R1H,[A0] +	SHA.W	R1H,12H[A0] +	SHA.W	R1H,12H[FB] +	SHA.W	R1H,12H[SB] +	SHA.W	R1H,2345H +	SHA.W	R1H,2345H[A0] +	SHA.W	R1H,2345H[SB] +	SHA.W	R1H,A0 +	SHA.W	R1H,R0 +	SHL.B	#7,[A0] +	SHL.B	#7,12H[A0] +	SHL.B	#7,12H[FB] +	SHL.B	#7,12H[SB] +	SHL.B	#7,2345H +	SHL.B	#7,2345H[A0] +	SHL.B	#7,2345H[SB] +	SHL.B	#7,R0L +	SHL.B	#7,R1H +	SHL.B	R1H,[A0] +	SHL.B	R1H,12H[A0] +	SHL.B	R1H,12H[FB] +	SHL.B	R1H,12H[SB] +	SHL.B	R1H,2345H +	SHL.B	R1H,2345H[A0] +	SHL.B	R1H,2345H[SB] +	SHL.B	R1H,R0L +	SHL.L	#7,R2R0 +	SHL.L	R1H,R2R0 +	SHL.W	#7,[A0] +	SHL.W	#7,12H[A0] +	SHL.W	#7,12H[FB] +	SHL.W	#7,12H[SB] +	SHL.W	#7,2345H +	SHL.W	#7,2345H[A0] +	SHL.W	#7,2345H[SB] +	SHL.W	#7,A0 +	SHL.W	#7,R0 +	SHL.W	R1H,[A0] +	SHL.W	R1H,12H[A0] +	SHL.W	R1H,12H[FB] +	SHL.W	R1H,12H[SB] +	SHL.W	R1H,2345H +	SHL.W	R1H,2345H[A0] +	SHL.W	R1H,2345H[SB] +	SHL.W	R1H,A0 +	SHL.W	R1H,R0 +	SMOVB.B +	SMOVB.w +	SMOVF.B +	SMOVF.w +	SSTR.B +	SSTR.w +	STC	FB,[A0] +	STC	FB,12H[A0] +	STC	FB,12H[FB] +	STC	FB,12H[SB] +	STC	FB,2345H +	STC	FB,2345H[A0] +	STC	FB,2345H[SB] +	STC	FB,A0 +	STC	FB,R0 +	STC	FLG,[A0] +	STC	FLG,12H[A0] +	STC	FLG,12H[FB] +	STC	FLG,12H[SB] +	STC	FLG,2345H +	STC	FLG,2345H[A0] +	STC	FLG,2345H[SB] +	STC	FLG,A0 +	STC	FLG,R0 +	STC	INTBH,[A0] +	STC	INTBH,12H[A0] +	STC	INTBH,12H[FB] +	STC	INTBH,12H[SB] +	STC	INTBH,2345H +	STC	INTBH,2345H[A0] +	STC	INTBH,2345H[SB] +	STC	INTBH,A0 +	STC	INTBH,R0 +	STC	INTBL,[A0] +	STC	INTBL,12H[A0] +	STC	INTBL,12H[FB] +	STC	INTBL,12H[SB] +	STC	INTBL,2345H +	STC	INTBL,2345H[A0] +	STC	INTBL,2345H[SB] +	STC	INTBL,A0 +	STC	INTBL,R0 +	STC	ISP,[A0] +	STC	ISP,12H[A0] +	STC	ISP,12H[FB] +	STC	ISP,12H[SB] +	STC	ISP,2345H +	STC	ISP,2345H[A0] +	STC	ISP,2345H[SB] +	STC	ISP,A0 +	STC	ISP,R0 +	STC	PC,[A0] +	STC	PC,12H[A0] +	STC	PC,12H[FB] +	STC	PC,12H[SB] +	STC	PC,2345H +	STC	PC,2345H[A0] +	STC	PC,2345H[SB] +	STC	PC,A1A0 +	STC	PC,R2R0 +	STC	SB,[A0] +	STC	SB,12H[A0] +	STC	SB,12H[FB] +	STC	SB,12H[SB] +	STC	SB,2345H +	STC	SB,2345H[A0] +	STC	SB,2345H[SB] +	STC	SB,A0 +	STC	SB,R0 +	STC	SP,[A0] +	STC	SP,12H[A0] +	STC	SP,12H[FB] +	STC	SP,12H[SB] +	STC	SP,2345H +	STC	SP,2345H[A0] +	STC	SP,2345H[SB] +	STC	SP,A0 +	STC	SP,R0 +	STCTX	2345H,12345H +	STCTX	2345H,2345H +	STE.B	[A0],[A1A0] +	STE.B	[A0],12345H +	STE.B	[A0],12345H[A0] +	STE.B	[A0],12H[A0] +	STE.B	[A0],2345H +	STE.B	[A0],2345H[A0] +	STE.B	12H[A0],[A1A0] +	STE.B	12H[A0],12345H +	STE.B	12H[A0],12345H[A0] +	STE.B	12H[A0],12H[A0] +	STE.B	12H[A0],2345H +	STE.B	12H[A0],2345H[A0] +	STE.B	12H[FB],[A1A0] +	STE.B	12H[FB],12345H +	STE.B	12H[FB],12345H[A0] +	STE.B	12H[FB],12H[A0] +	STE.B	12H[FB],2345H +	STE.B	12H[FB],2345H[A0] +	STE.B	12H[SB],[A1A0] +	STE.B	12H[SB],12345H +	STE.B	12H[SB],12345H[A0] +	STE.B	12H[SB],12H[A0] +	STE.B	12H[SB],2345H +	STE.B	12H[SB],2345H[A0] +	STE.B	2345H,[A1A0] +	STE.B	2345H,12345H +	STE.B	2345H,12345H[A0] +	STE.B	2345H,12H[A0] +	STE.B	2345H,2345H +	STE.B	2345H,2345H[A0] +	STE.B	2345H[A0],[A1A0] +	STE.B	2345H[A0],12345H +	STE.B	2345H[A0],12345H[A0] +	STE.B	2345H[A0],12H[A0] +	STE.B	2345H[A0],2345H +	STE.B	2345H[A0],2345H[A0] +	STE.B	2345H[SB],[A1A0] +	STE.B	2345H[SB],12345H +	STE.B	2345H[SB],12345H[A0] +	STE.B	2345H[SB],12H[A0] +	STE.B	2345H[SB],2345H +	STE.B	2345H[SB],2345H[A0] +	STE.B	A0,[A1A0] +	STE.B	A0,12345H +	STE.B	A0,12345H[A0] +	STE.B	A0,12H[A0] +	STE.B	A0,2345H +	STE.B	A0,2345H[A0] +	STE.B	R0L,[A1A0] +	STE.B	R0L,12345H +	STE.B	R0L,12345H[A0] +	STE.B	R0L,12H[A0] +	STE.B	R0L,2345H +	STE.B	R0L,2345H[A0] +	STE.B	R1H,[A1A0] +	STE.B	R1H,12345H +	STE.B	R1H,12345H[A0] +	STE.B	R1H,12H[A0] +	STE.B	R1H,2345H +	STE.B	R1H,2345H[A0] +	STE.W	[A0],[A1A0] +	STE.W	[A0],12345H +	STE.W	[A0],12345H[A0] +	STE.W	[A0],12H[A0] +	STE.W	[A0],2345H +	STE.W	[A0],2345H[A0] +	STE.W	12H[A0],[A1A0] +	STE.W	12H[A0],12345H +	STE.W	12H[A0],12345H[A0] +	STE.W	12H[A0],12H[A0] +	STE.W	12H[A0],2345H +	STE.W	12H[A0],2345H[A0] +	STE.W	12H[FB],[A1A0] +	STE.W	12H[FB],12345H +	STE.W	12H[FB],12345H[A0] +	STE.W	12H[FB],12H[A0] +	STE.W	12H[FB],2345H +	STE.W	12H[FB],2345H[A0] +	STE.W	12H[SB],[A1A0] +	STE.W	12H[SB],12345H +	STE.W	12H[SB],12345H[A0] +	STE.W	12H[SB],12H[A0] +	STE.W	12H[SB],2345H +	STE.W	12H[SB],2345H[A0] +	STE.W	2345H,[A1A0] +	STE.W	2345H,12345H +	STE.W	2345H,12345H[A0] +	STE.W	2345H,12H[A0] +	STE.W	2345H,2345H +	STE.W	2345H,2345H[A0] +	STE.W	2345H[A0],[A1A0] +	STE.W	2345H[A0],12345H +	STE.W	2345H[A0],12345H[A0] +	STE.W	2345H[A0],12H[A0] +	STE.W	2345H[A0],2345H +	STE.W	2345H[A0],2345H[A0] +	STE.W	2345H[SB],[A1A0] +	STE.W	2345H[SB],12345H +	STE.W	2345H[SB],12345H[A0] +	STE.W	2345H[SB],12H[A0] +	STE.W	2345H[SB],2345H +	STE.W	2345H[SB],2345H[A0] +	STE.W	A0,[A1A0] +	STE.W	A0,12345H +	STE.W	A0,12345H[A0] +	STE.W	A0,12H[A0] +	STE.W	A0,2345H +	STE.W	A0,2345H[A0] +	STE.W	R0,[A1A0] +	STE.W	R0,12345H +	STE.W	R0,12345H[A0] +	STE.W	R0,12H[A0] +	STE.W	R0,2345H +	STE.W	R0,2345H[A0] +	STNZ	#7,12H[FB] +	STNZ	#7,12H[SB] +	STNZ	#7,2345H +	STNZ	#7,R0H +	STZ	#7,12H[FB] +	STZ	#7,12H[SB] +	STZ	#7,2345H +	STZ	#7,R0H +	SUB.B:G	#7,[A0] +	SUB.B:G	#7,12H[A0] +	SUB.B:G	#7,12H[FB] +	SUB.B:G	#7,12H[SB] +	SUB.B:G	#7,2345H +	SUB.B:G	#7,2345H[A0] +	SUB.B:G	#7,2345H[SB] +	SUB.B:G	#7,A0 +	SUB.B:G	#7,R0H +	SUB.B:G	[A0],[A0] +	SUB.B:G	[A0],12H[A0] +	SUB.B:G	[A0],12H[FB] +	SUB.B:G	[A0],12H[SB] +	SUB.B:G	[A0],2345H +	SUB.B:G	[A0],2345H[A0] +	SUB.B:G	[A0],2345H[SB] +	SUB.B:G	[A0],A0 +	SUB.B:G	[A0],R0H +	SUB.B:G	12H[A0],[A0] +	SUB.B:G	12H[A0],12H[A0] +	SUB.B:G	12H[A0],12H[FB] +	SUB.B:G	12H[A0],12H[SB] +	SUB.B:G	12H[A0],2345H +	SUB.B:G	12H[A0],2345H[A0] +	SUB.B:G	12H[A0],2345H[SB] +	SUB.B:G	12H[A0],A0 +	SUB.B:G	12H[A0],R0H +	SUB.B:G	12H[FB],[A0] +	SUB.B:G	12H[FB],12H[A0] +	SUB.B:G	12H[FB],12H[FB] +	SUB.B:G	12H[FB],12H[SB] +	SUB.B:G	12H[FB],2345H +	SUB.B:G	12H[FB],2345H[A0] +	SUB.B:G	12H[FB],2345H[SB] +	SUB.B:G	12H[FB],A0 +	SUB.B:G	12H[FB],R0H +	SUB.B:G	12H[SB],[A0] +	SUB.B:G	12H[SB],12H[A0] +	SUB.B:G	12H[SB],12H[FB] +	SUB.B:G	12H[SB],12H[SB] +	SUB.B:G	12H[SB],2345H +	SUB.B:G	12H[SB],2345H[A0] +	SUB.B:G	12H[SB],2345H[SB] +	SUB.B:G	12H[SB],A0 +	SUB.B:G	12H[SB],R0H +	SUB.B:G	2345H,[A0] +	SUB.B:G	2345H,12H[A0] +	SUB.B:G	2345H,12H[FB] +	SUB.B:G	2345H,12H[SB] +	SUB.B:G	2345H,2345H +	SUB.B:G	2345H,2345H[A0] +	SUB.B:G	2345H,2345H[SB] +	SUB.B:G	2345H,A0 +	SUB.B:G	2345H,R0H +	SUB.B:G	2345H[A0],[A0] +	SUB.B:G	2345H[A0],12H[A0] +	SUB.B:G	2345H[A0],12H[FB] +	SUB.B:G	2345H[A0],12H[SB] +	SUB.B:G	2345H[A0],2345H +	SUB.B:G	2345H[A0],2345H[A0] +	SUB.B:G	2345H[A0],2345H[SB] +	SUB.B:G	2345H[A0],A0 +	SUB.B:G	2345H[A0],R0H +	SUB.B:G	2345H[SB],[A0] +	SUB.B:G	2345H[SB],12H[A0] +	SUB.B:G	2345H[SB],12H[FB] +	SUB.B:G	2345H[SB],12H[SB] +	SUB.B:G	2345H[SB],2345H +	SUB.B:G	2345H[SB],2345H[A0] +	SUB.B:G	2345H[SB],2345H[SB] +	SUB.B:G	2345H[SB],A0 +	SUB.B:G	2345H[SB],R0H +	SUB.B:G	A0,[A0] +	SUB.B:G	A0,12H[A0] +	SUB.B:G	A0,12H[FB] +	SUB.B:G	A0,12H[SB] +	SUB.B:G	A0,2345H +	SUB.B:G	A0,2345H[A0] +	SUB.B:G	A0,2345H[SB] +	SUB.B:G	A0,R0H +	SUB.B:G	R0H,[A0] +	SUB.B:G	R0H,12H[A0] +	SUB.B:G	R0H,12H[FB] +	SUB.B:G	R0H,12H[SB] +	SUB.B:G	R0H,2345H +	SUB.B:G	R0H,2345H[A0] +	SUB.B:G	R0H,2345H[SB] +	SUB.B:G	R0H,A0 +	SUB.B:G	R0H,R0H +	SUB.B:S	#7,12H[FB] +	SUB.B:S	#7,12H[SB] +	SUB.B:S	#7,2345H +	SUB.B:S	#7,R0H +	SUB.B:S	12H[FB],R0H +	SUB.B:S	12H[SB],R0H +	SUB.B:S	2345H,R0H +	SUB.W:G	#2345H,[A0] +	SUB.W:G	#2345H,12H[A0] +	SUB.W:G	#2345H,12H[FB] +	SUB.W:G	#2345H,12H[SB] +	SUB.W:G	#2345H,2345H +	SUB.W:G	#2345H,2345H[A0] +	SUB.W:G	#2345H,2345H[SB] +	SUB.W:G	#2345H,A0 +	SUB.W:G	#2345H,R0 +	SUB.W:G	#7,[A0] +	SUB.W:G	#7,12H[A0] +	SUB.W:G	#7,12H[FB] +	SUB.W:G	#7,12H[SB] +	SUB.W:G	#7,2345H +	SUB.W:G	#7,2345H[A0] +	SUB.W:G	#7,2345H[SB] +	SUB.W:G	#7,A0 +	SUB.W:G	#7,R0 +	SUB.W:G	[A0],[A0] +	SUB.W:G	[A0],12H[A0] +	SUB.W:G	[A0],12H[FB] +	SUB.W:G	[A0],12H[SB] +	SUB.W:G	[A0],2345H +	SUB.W:G	[A0],2345H[A0] +	SUB.W:G	[A0],2345H[SB] +	SUB.W:G	[A0],A0 +	SUB.W:G	[A0],R0 +	SUB.W:G	12H[A0],[A0] +	SUB.W:G	12H[A0],12H[A0] +	SUB.W:G	12H[A0],12H[FB] +	SUB.W:G	12H[A0],12H[SB] +	SUB.W:G	12H[A0],2345H +	SUB.W:G	12H[A0],2345H[A0] +	SUB.W:G	12H[A0],2345H[SB] +	SUB.W:G	12H[A0],A0 +	SUB.W:G	12H[A0],R0 +	SUB.W:G	12H[FB],[A0] +	SUB.W:G	12H[FB],12H[A0] +	SUB.W:G	12H[FB],12H[FB] +	SUB.W:G	12H[FB],12H[SB] +	SUB.W:G	12H[FB],2345H +	SUB.W:G	12H[FB],2345H[A0] +	SUB.W:G	12H[FB],2345H[SB] +	SUB.W:G	12H[FB],A0 +	SUB.W:G	12H[FB],R0 +	SUB.W:G	12H[SB],[A0] +	SUB.W:G	12H[SB],12H[A0] +	SUB.W:G	12H[SB],12H[FB] +	SUB.W:G	12H[SB],12H[SB] +	SUB.W:G	12H[SB],2345H +	SUB.W:G	12H[SB],2345H[A0] +	SUB.W:G	12H[SB],2345H[SB] +	SUB.W:G	12H[SB],A0 +	SUB.W:G	12H[SB],R0 +	SUB.W:G	2345H,[A0] +	SUB.W:G	2345H,12H[A0] +	SUB.W:G	2345H,12H[FB] +	SUB.W:G	2345H,12H[SB] +	SUB.W:G	2345H,2345H +	SUB.W:G	2345H,2345H[A0] +	SUB.W:G	2345H,2345H[SB] +	SUB.W:G	2345H,A0 +	SUB.W:G	2345H,R0 +	SUB.W:G	2345H[A0],[A0] +	SUB.W:G	2345H[A0],12H[A0] +	SUB.W:G	2345H[A0],12H[FB] +	SUB.W:G	2345H[A0],12H[SB] +	SUB.W:G	2345H[A0],2345H +	SUB.W:G	2345H[A0],2345H[A0] +	SUB.W:G	2345H[A0],2345H[SB] +	SUB.W:G	2345H[A0],A0 +	SUB.W:G	2345H[A0],R0 +	SUB.W:G	2345H[SB],[A0] +	SUB.W:G	2345H[SB],12H[A0] +	SUB.W:G	2345H[SB],12H[FB] +	SUB.W:G	2345H[SB],12H[SB] +	SUB.W:G	2345H[SB],2345H +	SUB.W:G	2345H[SB],2345H[A0] +	SUB.W:G	2345H[SB],2345H[SB] +	SUB.W:G	2345H[SB],A0 +	SUB.W:G	2345H[SB],R0 +	SUB.W:G	A0,[A0] +	SUB.W:G	A0,12H[A0] +	SUB.W:G	A0,12H[FB] +	SUB.W:G	A0,12H[SB] +	SUB.W:G	A0,2345H +	SUB.W:G	A0,2345H[A0] +	SUB.W:G	A0,2345H[SB] +	SUB.W:G	A0,A0 +	SUB.W:G	A0,R0 +	SUB.W:G	R0,[A0] +	SUB.W:G	R0,12H[A0] +	SUB.W:G	R0,12H[FB] +	SUB.W:G	R0,12H[SB] +	SUB.W:G	R0,2345H +	SUB.W:G	R0,2345H[A0] +	SUB.W:G	R0,2345H[SB] +	SUB.W:G	R0,A0 +	SUB.W:G	R0,R0 +	TST.B	#7,[A0] +	TST.B	#7,12H[A0] +	TST.B	#7,12H[FB] +	TST.B	#7,12H[SB] +	TST.B	#7,2345H +	TST.B	#7,2345H[A0] +	TST.B	#7,2345H[SB] +	TST.B	#7,A0 +	TST.B	#7,R0H +	TST.B	[A0],[A0] +	TST.B	[A0],12H[A0] +	TST.B	[A0],12H[FB] +	TST.B	[A0],12H[SB] +	TST.B	[A0],2345H +	TST.B	[A0],2345H[A0] +	TST.B	[A0],2345H[SB] +	TST.B	[A0],A0 +	TST.B	[A0],R0H +	TST.B	12H[A0],[A0] +	TST.B	12H[A0],12H[A0] +	TST.B	12H[A0],12H[FB] +	TST.B	12H[A0],12H[SB] +	TST.B	12H[A0],2345H +	TST.B	12H[A0],2345H[A0] +	TST.B	12H[A0],2345H[SB] +	TST.B	12H[A0],A0 +	TST.B	12H[A0],R0H +	TST.B	12H[FB],[A0] +	TST.B	12H[FB],12H[A0] +	TST.B	12H[FB],12H[FB] +	TST.B	12H[FB],12H[SB] +	TST.B	12H[FB],2345H +	TST.B	12H[FB],2345H[A0] +	TST.B	12H[FB],2345H[SB] +	TST.B	12H[FB],A0 +	TST.B	12H[FB],R0H +	TST.B	12H[SB],[A0] +	TST.B	12H[SB],12H[A0] +	TST.B	12H[SB],12H[FB] +	TST.B	12H[SB],12H[SB] +	TST.B	12H[SB],2345H +	TST.B	12H[SB],2345H[A0] +	TST.B	12H[SB],2345H[SB] +	TST.B	12H[SB],A0 +	TST.B	12H[SB],R0H +	TST.B	2345H,[A0] +	TST.B	2345H,12H[A0] +	TST.B	2345H,12H[FB] +	TST.B	2345H,12H[SB] +	TST.B	2345H,2345H +	TST.B	2345H,2345H[A0] +	TST.B	2345H,2345H[SB] +	TST.B	2345H,A0 +	TST.B	2345H,R0H +	TST.B	2345H[A0],[A0] +	TST.B	2345H[A0],12H[A0] +	TST.B	2345H[A0],12H[FB] +	TST.B	2345H[A0],12H[SB] +	TST.B	2345H[A0],2345H +	TST.B	2345H[A0],2345H[A0] +	TST.B	2345H[A0],2345H[SB] +	TST.B	2345H[A0],A0 +	TST.B	2345H[A0],R0H +	TST.B	2345H[SB],[A0] +	TST.B	2345H[SB],12H[A0] +	TST.B	2345H[SB],12H[FB] +	TST.B	2345H[SB],12H[SB] +	TST.B	2345H[SB],2345H +	TST.B	2345H[SB],2345H[A0] +	TST.B	2345H[SB],2345H[SB] +	TST.B	2345H[SB],A0 +	TST.B	2345H[SB],R0H +	TST.B	A0,[A0] +	TST.B	A0,12H[A0] +	TST.B	A0,12H[FB] +	TST.B	A0,12H[SB] +	TST.B	A0,2345H +	TST.B	A0,2345H[A0] +	TST.B	A0,2345H[SB] +	TST.B	A0,R0H +	TST.B	R0H,[A0] +	TST.B	R0H,12H[A0] +	TST.B	R0H,12H[FB] +	TST.B	R0H,12H[SB] +	TST.B	R0H,2345H +	TST.B	R0H,2345H[A0] +	TST.B	R0H,2345H[SB] +	TST.B	R0H,A0 +	TST.B	R0H,R0H +	TST.W	#2345H,[A0] +	TST.W	#2345H,12H[A0] +	TST.W	#2345H,12H[FB] +	TST.W	#2345H,12H[SB] +	TST.W	#2345H,2345H +	TST.W	#2345H,2345H[A0] +	TST.W	#2345H,2345H[SB] +	TST.W	#2345H,A0 +	TST.W	#2345H,R0 +	TST.W	#7,[A0] +	TST.W	#7,12H[A0] +	TST.W	#7,12H[FB] +	TST.W	#7,12H[SB] +	TST.W	#7,2345H +	TST.W	#7,2345H[A0] +	TST.W	#7,2345H[SB] +	TST.W	#7,A0 +	TST.W	#7,R0 +	TST.W	[A0],[A0] +	TST.W	[A0],12H[A0] +	TST.W	[A0],12H[FB] +	TST.W	[A0],12H[SB] +	TST.W	[A0],2345H +	TST.W	[A0],2345H[A0] +	TST.W	[A0],2345H[SB] +	TST.W	[A0],A0 +	TST.W	[A0],R0 +	TST.W	12H[A0],[A0] +	TST.W	12H[A0],12H[A0] +	TST.W	12H[A0],12H[FB] +	TST.W	12H[A0],12H[SB] +	TST.W	12H[A0],2345H +	TST.W	12H[A0],2345H[A0] +	TST.W	12H[A0],2345H[SB] +	TST.W	12H[A0],A0 +	TST.W	12H[A0],R0 +	TST.W	12H[FB],[A0] +	TST.W	12H[FB],12H[A0] +	TST.W	12H[FB],12H[FB] +	TST.W	12H[FB],12H[SB] +	TST.W	12H[FB],2345H +	TST.W	12H[FB],2345H[A0] +	TST.W	12H[FB],2345H[SB] +	TST.W	12H[FB],A0 +	TST.W	12H[FB],R0 +	TST.W	12H[SB],[A0] +	TST.W	12H[SB],12H[A0] +	TST.W	12H[SB],12H[FB] +	TST.W	12H[SB],12H[SB] +	TST.W	12H[SB],2345H +	TST.W	12H[SB],2345H[A0] +	TST.W	12H[SB],2345H[SB] +	TST.W	12H[SB],A0 +	TST.W	12H[SB],R0 +	TST.W	2345H,[A0] +	TST.W	2345H,12H[A0] +	TST.W	2345H,12H[FB] +	TST.W	2345H,12H[SB] +	TST.W	2345H,2345H +	TST.W	2345H,2345H[A0] +	TST.W	2345H,2345H[SB] +	TST.W	2345H,A0 +	TST.W	2345H,R0 +	TST.W	2345H[A0],[A0] +	TST.W	2345H[A0],12H[A0] +	TST.W	2345H[A0],12H[FB] +	TST.W	2345H[A0],12H[SB] +	TST.W	2345H[A0],2345H +	TST.W	2345H[A0],2345H[A0] +	TST.W	2345H[A0],2345H[SB] +	TST.W	2345H[A0],A0 +	TST.W	2345H[A0],R0 +	TST.W	2345H[SB],[A0] +	TST.W	2345H[SB],12H[A0] +	TST.W	2345H[SB],12H[FB] +	TST.W	2345H[SB],12H[SB] +	TST.W	2345H[SB],2345H +	TST.W	2345H[SB],2345H[A0] +	TST.W	2345H[SB],2345H[SB] +	TST.W	2345H[SB],A0 +	TST.W	2345H[SB],R0 +	TST.W	A0,[A0] +	TST.W	A0,12H[A0] +	TST.W	A0,12H[FB] +	TST.W	A0,12H[SB] +	TST.W	A0,2345H +	TST.W	A0,2345H[A0] +	TST.W	A0,2345H[SB] +	TST.W	A0,A0 +	TST.W	A0,R0 +	TST.W	R0,[A0] +	TST.W	R0,12H[A0] +	TST.W	R0,12H[FB] +	TST.W	R0,12H[SB] +	TST.W	R0,2345H +	TST.W	R0,2345H[A0] +	TST.W	R0,2345H[SB] +	TST.W	R0,A0 +	TST.W	R0,R0 +	UND +	WAIT +	XCHG.B	R0H,[A0] +	XCHG.B	R0H,12H[A0] +	XCHG.B	R0H,12H[FB] +	XCHG.B	R0H,12H[SB] +	XCHG.B	R0H,2345H +	XCHG.B	R0H,2345H[A0] +	XCHG.B	R0H,2345H[SB] +	XCHG.B	R0H,A0 +	XCHG.B	R0H,R0H +	XCHG.W	R0,[A0] +	XCHG.W	R0,12H[A0] +	XCHG.W	R0,12H[FB] +	XCHG.W	R0,12H[SB] +	XCHG.W	R0,2345H +	XCHG.W	R0,2345H[A0] +	XCHG.W	R0,2345H[SB] +	XCHG.W	R0,A0 +	XCHG.W	R0,R0 +	XOR.B	#7,[A0] +	XOR.B	#7,12H[A0] +	XOR.B	#7,12H[FB] +	XOR.B	#7,12H[SB] +	XOR.B	#7,2345H +	XOR.B	#7,2345H[A0] +	XOR.B	#7,2345H[SB] +	XOR.B	#7,A0 +	XOR.B	#7,R0H +	XOR.B	[A0],[A0] +	XOR.B	[A0],12H[A0] +	XOR.B	[A0],12H[FB] +	XOR.B	[A0],12H[SB] +	XOR.B	[A0],2345H +	XOR.B	[A0],2345H[A0] +	XOR.B	[A0],2345H[SB] +	XOR.B	[A0],A0 +	XOR.B	[A0],R0H +	XOR.B	12H[A0],[A0] +	XOR.B	12H[A0],12H[A0] +	XOR.B	12H[A0],12H[FB] +	XOR.B	12H[A0],12H[SB] +	XOR.B	12H[A0],2345H +	XOR.B	12H[A0],2345H[A0] +	XOR.B	12H[A0],2345H[SB] +	XOR.B	12H[A0],A0 +	XOR.B	12H[A0],R0H +	XOR.B	12H[FB],[A0] +	XOR.B	12H[FB],12H[A0] +	XOR.B	12H[FB],12H[FB] +	XOR.B	12H[FB],12H[SB] +	XOR.B	12H[FB],2345H +	XOR.B	12H[FB],2345H[A0] +	XOR.B	12H[FB],2345H[SB] +	XOR.B	12H[FB],A0 +	XOR.B	12H[FB],R0H +	XOR.B	12H[SB],[A0] +	XOR.B	12H[SB],12H[A0] +	XOR.B	12H[SB],12H[FB] +	XOR.B	12H[SB],12H[SB] +	XOR.B	12H[SB],2345H +	XOR.B	12H[SB],2345H[A0] +	XOR.B	12H[SB],2345H[SB] +	XOR.B	12H[SB],A0 +	XOR.B	12H[SB],R0H +	XOR.B	2345H,[A0] +	XOR.B	2345H,12H[A0] +	XOR.B	2345H,12H[FB] +	XOR.B	2345H,12H[SB] +	XOR.B	2345H,2345H +	XOR.B	2345H,2345H[A0] +	XOR.B	2345H,2345H[SB] +	XOR.B	2345H,A0 +	XOR.B	2345H,R0H +	XOR.B	2345H[A0],[A0] +	XOR.B	2345H[A0],12H[A0] +	XOR.B	2345H[A0],12H[FB] +	XOR.B	2345H[A0],12H[SB] +	XOR.B	2345H[A0],2345H +	XOR.B	2345H[A0],2345H[A0] +	XOR.B	2345H[A0],2345H[SB] +	XOR.B	2345H[A0],A0 +	XOR.B	2345H[A0],R0H +	XOR.B	2345H[SB],[A0] +	XOR.B	2345H[SB],12H[A0] +	XOR.B	2345H[SB],12H[FB] +	XOR.B	2345H[SB],12H[SB] +	XOR.B	2345H[SB],2345H +	XOR.B	2345H[SB],2345H[A0] +	XOR.B	2345H[SB],2345H[SB] +	XOR.B	2345H[SB],A0 +	XOR.B	2345H[SB],R0H +	XOR.B	A0,[A0] +	XOR.B	A0,12H[A0] +	XOR.B	A0,12H[FB] +	XOR.B	A0,12H[SB] +	XOR.B	A0,2345H +	XOR.B	A0,2345H[A0] +	XOR.B	A0,2345H[SB] +	XOR.B	A0,R0H +	XOR.B	R0H,[A0] +	XOR.B	R0H,12H[A0] +	XOR.B	R0H,12H[FB] +	XOR.B	R0H,12H[SB] +	XOR.B	R0H,2345H +	XOR.B	R0H,2345H[A0] +	XOR.B	R0H,2345H[SB] +	XOR.B	R0H,A0 +	XOR.B	R0H,R0H +	XOR.W	#2345H,[A0] +	XOR.W	#2345H,12H[A0] +	XOR.W	#2345H,12H[FB] +	XOR.W	#2345H,12H[SB] +	XOR.W	#2345H,2345H +	XOR.W	#2345H,2345H[A0] +	XOR.W	#2345H,2345H[SB] +	XOR.W	#2345H,A0 +	XOR.W	#2345H,R0 +	XOR.W	#7,[A0] +	XOR.W	#7,12H[A0] +	XOR.W	#7,12H[FB] +	XOR.W	#7,12H[SB] +	XOR.W	#7,2345H +	XOR.W	#7,2345H[A0] +	XOR.W	#7,2345H[SB] +	XOR.W	#7,A0 +	XOR.W	#7,R0 +	XOR.W	[A0],[A0] +	XOR.W	[A0],12H[A0] +	XOR.W	[A0],12H[FB] +	XOR.W	[A0],12H[SB] +	XOR.W	[A0],2345H +	XOR.W	[A0],2345H[A0] +	XOR.W	[A0],2345H[SB] +	XOR.W	[A0],A0 +	XOR.W	[A0],R0 +	XOR.W	12H[A0],[A0] +	XOR.W	12H[A0],12H[A0] +	XOR.W	12H[A0],12H[FB] +	XOR.W	12H[A0],12H[SB] +	XOR.W	12H[A0],2345H +	XOR.W	12H[A0],2345H[A0] +	XOR.W	12H[A0],2345H[SB] +	XOR.W	12H[A0],A0 +	XOR.W	12H[A0],R0 +	XOR.W	12H[FB],[A0] +	XOR.W	12H[FB],12H[A0] +	XOR.W	12H[FB],12H[FB] +	XOR.W	12H[FB],12H[SB] +	XOR.W	12H[FB],2345H +	XOR.W	12H[FB],2345H[A0] +	XOR.W	12H[FB],2345H[SB] +	XOR.W	12H[FB],A0 +	XOR.W	12H[FB],R0 +	XOR.W	12H[SB],[A0] +	XOR.W	12H[SB],12H[A0] +	XOR.W	12H[SB],12H[FB] +	XOR.W	12H[SB],12H[SB] +	XOR.W	12H[SB],2345H +	XOR.W	12H[SB],2345H[A0] +	XOR.W	12H[SB],2345H[SB] +	XOR.W	12H[SB],A0 +	XOR.W	12H[SB],R0 +	XOR.W	2345H,[A0] +	XOR.W	2345H,12H[A0] +	XOR.W	2345H,12H[FB] +	XOR.W	2345H,12H[SB] +	XOR.W	2345H,2345H +	XOR.W	2345H,2345H[A0] +	XOR.W	2345H,2345H[SB] +	XOR.W	2345H,A0 +	XOR.W	2345H,R0 +	XOR.W	2345H[A0],[A0] +	XOR.W	2345H[A0],12H[A0] +	XOR.W	2345H[A0],12H[FB] +	XOR.W	2345H[A0],12H[SB] +	XOR.W	2345H[A0],2345H +	XOR.W	2345H[A0],2345H[A0] +	XOR.W	2345H[A0],2345H[SB] +	XOR.W	2345H[A0],A0 +	XOR.W	2345H[A0],R0 +	XOR.W	2345H[SB],[A0] +	XOR.W	2345H[SB],12H[A0] +	XOR.W	2345H[SB],12H[FB] +	XOR.W	2345H[SB],12H[SB] +	XOR.W	2345H[SB],2345H +	XOR.W	2345H[SB],2345H[A0] +	XOR.W	2345H[SB],2345H[SB] +	XOR.W	2345H[SB],A0 +	XOR.W	2345H[SB],R0 +	XOR.W	A0,[A0] +	XOR.W	A0,12H[A0] +	XOR.W	A0,12H[FB] +	XOR.W	A0,12H[SB] +	XOR.W	A0,2345H +	XOR.W	A0,2345H[A0] +	XOR.W	A0,2345H[SB] +	XOR.W	A0,A0 +	XOR.W	A0,R0 +	XOR.W	R0,[A0] +	XOR.W	R0,12H[A0] +	XOR.W	R0,12H[FB] +	XOR.W	R0,12H[SB] +	XOR.W	R0,2345H +	XOR.W	R0,2345H[A0] +	XOR.W	R0,2345H[SB] +	XOR.W	R0,A0 +	XOR.W	R0,R0 +	END diff --git a/tests/t_m16c/t_m16c.doc b/tests/t_m16c/t_m16c.doc new file mode 100644 index 0000000..c80281e --- /dev/null +++ b/tests/t_m16c/t_m16c.doc @@ -0,0 +1,6 @@ ++------------------------- Test Application M16C ----------------------------+ +|                                                                            | +|        This is a (synthetic) test of the M16C instruction set              | +|         All instructions and addressing modes are exercised.               | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_m16c/t_m16c.ori b/tests/t_m16c/t_m16c.ori Binary files differnew file mode 100644 index 0000000..6a366db --- /dev/null +++ b/tests/t_m16c/t_m16c.ori diff --git a/tests/t_mcore/asflags b/tests/t_mcore/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_mcore/asflags diff --git a/tests/t_mcore/t_mcore.asm b/tests/t_mcore/t_mcore.asm new file mode 100644 index 0000000..3e69815 --- /dev/null +++ b/tests/t_mcore/t_mcore.asm @@ -0,0 +1,140 @@ +	cpu	mcore +	page	0 +	supmode	on + +	bkpt +	doze +	rfi +	rte +	stop +	sync +	wait + +	abs	r0 +        asrc	r1 +        brev	r2 +        clrf	r3 +        clrt	r4 +        decf	r5 +        decgt	r6 +        declt	r7 +        decne	r8 +        dect	r9 +        divs	r10 +        divu	r11 +        ff1	r12 +        incf	r13 +        inct	r14 +        jmp	r15 +        jsr	r0 +        lslc	r1 +        lsrc	r2 +        mvc	r3 +        mvcv	r4 +        not	r5 +        sextb	r6 +        sexth	r7 +        tstnbz	r8 +        xsr	r9 +        xtrb0	r10 +        xtrb1	r11 +        xtrb2	r12 +        xtrb3	r13 +        zextb	r14 +        zexth	r15 + +        addc	r1,r2 +        addu	r2,r3 +        and	r3,r4 +        andn	r4,r5 +        asr	r5,r6 +        bgenr	r6,r7 +        cmphs	r7,r8 +        cmplt	r8,r9 +        cmpne	r9,r10 +        ixh	r10,r11 +        ixw	r11,r12 +        lsl	r12,r13 +        lsr	r13,r14 +        mov	r14,r15 +        movf	r1,r2 +        movt	r2,r3 +        mult	r3,r4 +        or	r4,r5 +        rsub	r5,r6 +        subc	r6,r7 +        subu	r7,r8 +        tst	r8,r9 +        xor	r9,r10 + +	addi	r2,1 +        andi	r3,2 +        asri	r4,3 +        bclri	r5,4 +        bseti	r6,5 +        btsti	r7,6 +        cmplti	r8,7 +        cmpnei	r9,8 +        lsli	r10,9 +        lsri	r11,10 +        rotli	r12,11 +        rsubi	r13,12 +        subi	r14,13 + +	bgeni	r4,0 +	bgeni	r4,6 +	bgeni	r4,7 +	bgeni	r4,12 +	bgeni	r4,31 +	bmaski	r7,32 +	bmaski	r7,1 +	bmaski	r7,4 +	bmaski	r7,7 +	bmaski	r7,8 +	bmaski	r7,22 + +	bf	*-$20 +	br	* +	bsr	next +	bt	*+$200 +next: + +	align	4 +	jmpi	[*+4] +	jsri	[*+2] + +	ldb	r4,(0,r3) +	ldh	r4,(r3) +	ldw	r4,(r3,12) +	ld	r4,(10,r3,2) +	ld.b	r4,(3,r3) +	ld.h	r4,(r3,6) +	ld.w	r4,(24,r3) +	stb	r4,(0,r3) +	sth	r4,(r3) +	stw	r4,(r3,12) +	st	r4,(10,r3,2) +	st.b	r4,(3,r3) +	st.h	r4,(r3,6) +	st.w	r4,(24,r3) + +	ldm	r2-r15,(r0) +	stm	r4-r15,(r0) +	ldq	r4-r7,(r3) +	stq	r4-r7,(r12) + +	loopt	r4,* + +	align	4 +	lrm	r4,[*+4] +	lrm	r4,[*+2] + +	mfcr	r12,cr5 +        mfcr    r12,fpc +	mtcr	r2,cr26 + +ptrreg	reg	r10 +	movi	r10,123 +	movi	ptrreg,123 + +	trap	#2 diff --git a/tests/t_mcore/t_mcore.doc b/tests/t_mcore/t_mcore.doc new file mode 100644 index 0000000..b3e90a1 --- /dev/null +++ b/tests/t_mcore/t_mcore.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application MCORE ---------------------------+ +|                                                                            | +|      This is a (synthetic) test of the M*CORE instruction set              | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_mcore/t_mcore.ori b/tests/t_mcore/t_mcore.ori Binary files differnew file mode 100644 index 0000000..819d8b7 --- /dev/null +++ b/tests/t_mcore/t_mcore.ori diff --git a/tests/t_mic51/DEBUG.ASM b/tests/t_mic51/DEBUG.ASM new file mode 100644 index 0000000..7aff702 --- /dev/null +++ b/tests/t_mic51/DEBUG.ASM @@ -0,0 +1,532 @@ + +; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 30.06.1994 +; letzte Aenderung am : 01.07.1994 +; Bemerkung : Wird in das gegebene File "MAIN.ASM" includet. +; +; Dateiname : debug.asm +; + +;--------------------------------------------------------------------- +        SEGMENT CODE +;--------------------------------------------------------------------- +; Funktion : Dump ext. RAM. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +N_BYTES EQU     12 + + +DUMP:   PUSH PSW +        PUSH ACC +        PUSH B +        PUSH_DPTR +DUMP_ADR: LCALL LCD_CLEAR +        LCD 0h,"Start=" +        LCALL IN_DPTR +DUMP_LINE: LCALL LCD_CLEAR                      ; 1. Zeile +        LCALL DPTR_LCD +        MOV A,#':' +        LCALL LCD_WRITE_CHAR +        MOV B,#N_BYTES +DUMP_BYTE: MOVX A,@DPTR +        LCALL A_LCD +        INC DPTR +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        DJNZ B,DUMP_BYTE + +        MOV A,#40h                              ; 2. Zeile +        LCALL LCD_SET_DD_RAM_ADDRESS +        LCALL DPTR_LCD +        MOV A,#':' +        LCALL LCD_WRITE_CHAR +        MOV B,#(N_BYTES-1) +DUMP_BYTE2: MOVX A,@DPTR +        LCALL A_LCD +        INC DPTR +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        DJNZ B,DUMP_BYTE2 +        MOVX A,@DPTR +        LCALL A_LCD +        INC DPTR +         +        LCALL CHAR_ACC +        LCALL UPCASE +        IFMAKE 'D',LJMP DUMP_ADR +        IFMAKE 'X',SUBB_DPTR N_BYTES +        IFMAKE 'E',SUBB_DPTR (3*N_BYTES) +        IFMAKE 'Q',LJMP DUMP_ENDE + +        LJMP DUMP_LINE +DUMP_ENDE: +        POP_DPTR +        POP B +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Ausgabe der Start- und Endadr. des definierten ext. Speichers. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +ADRESSEN: +        PUSH ACC +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Startadr.=" +        MOV DPTR,#MEM_ANF +        LCALL DPTR_LCD +        LCD 0Eh,";Endadr.=" +        MOV DPTR,#MEM_ENDE +        LCALL DPTR_LCD +        LCD 1bh,";Groesse=" +        MOV DPTR,#(MEM_ENDE-MEM_ANF) +        LCALL DPTR_LCD +        LCD 40h,"NEXT_FREE=" +        GET_16 NEXT_FREE +        LCALL DPTR_LCD +        LCD 4Eh,";RD_P=" +        GET_16 RD_POINTER +        LCALL DPTR_LCD +        LCALL CHECK_SUM +        LCD 5bh,";CHECK=" +        MOV DPL,CHECKSUMME +        MOV DPH,CHECKSUMME+1 +        LCALL DPTR_LCD +        LCALL WAIT_KEY +        POP_DPTR +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : Ausgabe der Variablen fuer die Synchronisation +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +DEBUG_SYNC: +        PUSH ACC +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"R_Sync-C.=" +        MOV a,R_Sync_Counter +        LCALL A_LCD +        jb runningbit,DESYNC1 +        LCD 0ch,"not " +DESYNC1: LCD 10h,"running" +        jb Sync_Waiting,DESYNC2 +        LCD 18h,"not " +DESYNC2: LCD 1ch,"Sync.waiting" +        LCD 0h,"T_Sync-C.=" +        MOV a,T_Sync_Counter +        LCALL A_LCD +        jb Ready_Waiting,DESYNC3 +        LCD 4ch,"not " +DESYNC3: LCD 50h,"Ready waiting" +        POP_DPTR +        POP ACC +        LCALL WAIT_KEY +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher fuellen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +FUELLEN: +        PUSH PSW +        PUSH ACC +        PUSH B +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Fuellwert =" +        LCALL IN_ACC +        MOV B,A +        MOV DPTR,#MEM_ANF +FUELLEN1: MOV A,B +        MOVX @DPTR,A +        INC DPTR +        MOV A,DPH +        CJNE A,#(MEM_ENDE/256),FUELLEN1 +        MOV A,DPL +        CJNE A,#(MEM_ENDE#256),FUELLEN1 +        LCD 40h,"Speicher gefuellt." +        LCALL WAIT_KEY +        POP_DPTR +        POP B +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Schreiben in Speicher +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SCHREIBEN: +        PUSH PSW +        PUSH ACC +        PUSH B +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Schreibadr.=" +        LCALL IN_DPTR +        LCD 12h,"Schreibwert=" +        LCALL IN_ACC +        LCALL ACC_WR_MEM +        LCD 40h,"Wert geschrieben." +        LCALL WAIT_KEY +        POP_DPTR +        POP B +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Lesen aus Speicher +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +LESEN: +        PUSH PSW +        PUSH ACC +        PUSH B +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Leseadr.=" +        LCALL IN_DPTR +        LCALL ACC_RD_MEM +        LCD 40h,"Wert    =" +        LCALL A_LCD +        LCALL WAIT_KEY +        POP_DPTR +        POP B +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher auf PC schreiben +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +WR_PC: +        LCALL LCD_CLEAR +        LCD 0h,"Speicher auf PC" +        LCALL WR_MEM_PC +        LCD 40h,"o.k." +        LCALL WAIT_KEY +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher initialisieren +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SPEICHER_INIT: +        LCALL LCD_CLEAR +        LCD 0h,"Speicher initialisieren" +        LCALL INIT_MEM +        LCD 40h,"o.k." +        LCALL WAIT_KEY +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher zum lesen zuruecksetzen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +RESET: +        LCALL LCD_CLEAR +        LCD 0h,"Speicher reset" +        LCALL RESET_MEM +        LCD 40h,"o.k." +        LCALL WAIT_KEY +        RET + +;--------------------------------------------------------------------- +; Funktion : Element aus Speicher lesen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +GET: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Element lesen von:" +        GET_16 RD_POINTER +        LCALL DPTR_LCD +        LCALL GET_ELEMENT_MEM +        JC GET_ERROR +        LCD 40h,"o.k. ACC=" +        LCALL A_LCD +        LCALL WAIT_KEY +        POP_DPTR +        RET + +GET_ERROR: +        LCD 40h,"Fehler." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Element in den Speicher schreiben +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +PUT: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Element schreiben ab:" +        GET_16 NEXT_FREE +        LCALL DPTR_LCD +        LCD 20h,"ACC=" +        LCALL IN_ACC + +        LCALL PUT_ELEMENT_MEM +        JC PUT_ERROR +        LCD 40h,"o.k." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +PUT_ERROR: +        LCD 40h,"Fehler." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher von PC lesen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +RD_PC: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"Speicher von PC" +        CLR READY +        LCALL RD_MEM_PC +RD_PC_LOOP: +        JNB MSG,$ +        LCALL MEM_SCHEDULER +        JNB READY,RD_PC_LOOP +        JB CRC,RD_PC_ERROR +        LCD 10h,"o.k." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +RD_PC_ERROR: +        LCD 10h,"CRC- Fehler beim laden." +        LCALL WAIT_KEY +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Zeiger setzen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SET_NEXT_FREE: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"next_free=" +        lcall IN_DPTR +        SET_16 NEXT_FREE +        LCALL WAIT_KEY +        POP_DPTR +        RET + +SET_RD_POINTER: +        PUSH_DPTR +        LCALL LCD_CLEAR +        LCD 0h,"RD_POINTER=" +        lcall IN_DPTR +        SET_16 RD_POINTER +        LCALL WAIT_KEY +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Msg_Handler_Test +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +; **************************************************************************** +; R0    Empf„nger (logische Adresse) +; R1    Message +; R2 - R7 Parameter +; **************************************************************************** + +Msg_Handler_Test: +        PUSH ACC +        PUSH AR0 +        PUSH AR1 +        LCALL LCD_CLEAR +        LCD 0h,"Msg_Handler_Test" +        LCD 16h,"R0=" +        LCALL IN_ACC +        MOV R0,A +        LCD 20h,"R1=" +        LCALL IN_ACC +        MOV R1,A +        LCALL Dispatch_Msg +        POP AR1 +        POP AR0 +        POP ACC +        ret + +;--------------------------------------------------------------------- +; Funktion : Testbit toggeln +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +T_TEST: +        LCALL LCD_CLEAR +        LCD 0h,"TEST" +        LCALL WAIT_KEY +        CPL TESTBIT +        ret + +;--------------------------------------------------------------------- +; Funktion : Test RUN- Manager +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +TEST_RUN: +        LCD 0h,"TEST RUN_ Manager" +        LCALL WAIT_KEY +        LCALL START_RUNNING +        LCALL LCD_CLEAR +        ret + +;--------------------------------------------------------------------- +; Funktion : Debuger fuer das Speichermodul +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +DEBUG_MEM: +        mov a,#1 +        lcall lcd_curser_onoff + +DEBUG_START: +        LCALL LCD_CLEAR +        LCD 0,"DEBUG SPEICHERMODUL " +DEBUG_LOOP: +        JNB KB_CHAR_READY,DEBUG3 +        LJMP DEBUG1 +DEBUG3: +        LJMP DEBUG_LOOP + +DEBUG1: CLR KB_CHAR_READY +        MOV A,KB_CHAR_BUFFER +        LCALL LCD_WRITE_CHAR +        LCALL UPCASE +        IFCALL 'A',ADRESSEN +        IFCALL 'B',LOAD_ROB +        IFCALL 'C',LOAD_FRAES +        IFCALL 'D',DUMP +        IFCALL 'E',Msg_Handler_Test +        IFCALL 'F',FUELLEN +        IFCALL 'G',GET +        IFCALL 'H',SAVE_ROB +        IFCALL 'I',SAVE_FRAES +        IFCALL 'J',SPEICHER_INIT +        IFCALL 'K',T_TEST +        IFCALL 'L',LESEN +        IFCALL 'M',STORE_ROB +        IFCALL 'O',RESET +        IFCALL 'P',PUT +        IFMAKE 'Q',LJMP DEBUG_ENDE +        IFCALL 'R',RD_PC +        IFCALL 'S',SCHREIBEN +        IFCALL 'T',TEST_RUN +        IFCALL 'U',SET_RD_POINTER +        IFCALL 'W',WR_PC +        IFCALL 'X',DEBUG_SYNC +        IFCALL 'Y',STORE_SYNC +        IFCALL 'Z',SET_NEXT_FREE + +        ljmp DEBUG_START + +DEBUG_ENDE: + +        LCALL LCD_CLEAR +        ret + +;===================================================================== +;        END +;--------------------------------------------------------------------- + + diff --git a/tests/t_mic51/MAKRO1.ASM b/tests/t_mic51/MAKRO1.ASM new file mode 100644 index 0000000..4d93adc --- /dev/null +++ b/tests/t_mic51/MAKRO1.ASM @@ -0,0 +1,542 @@ + +; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 21.05.1994 +; letzte Aenderung am : 01.08.1994 +; Bemerkung : Makros +; +; Dateiname : makro1.asm +; + +;---------------------------------------------------------------------   +; Funktion : Direkter Bitmove- Befehl +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : PSW +; Stackbedarf : +; Zeitbedarf : +; + +MOVB    MACRO   ZIEL,QUELLE + +        MOV C,QUELLE +        MOV ZIEL,C + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : String auf LCD ausgaben. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +LCD     MACRO   POS,STRG + +        PUSH ACC +        PUSH DPH +        PUSH DPL +        MOV A,#POS +        LCALL LCD_SET_DD_RAM_ADDRESS +        MOV DPTR,#STR_ADR +        LCALL LCD_WRITE_STRING +        LJMP WEITER + +STR_ADR   DB    STRG,0 + +WEITER: POP DPL +        POP DPH +        POP ACC + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : A, B, PSW, DPTR, R0 - R7 auf Stack retten +; Aufrufparameter : PUSH_ALL +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : 2 +; Zeitbedarf : +; + +PUSH_ALL        MACRO + +        PUSH ACC +        PUSH B +        PUSH PSW +        PUSH_DPTR +        PUSH AR0 +        PUSH AR1 +        PUSH AR2 +        PUSH AR3 +        PUSH AR4 +        PUSH AR5 +        PUSH AR6 +        PUSH AR7 + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : A, B, PSW, DPTR, R0 - R7 von Stack holen +; Aufrufparameter : POP_ALL +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : 2 +; Zeitbedarf : +; + +POP_ALL        MACRO + +        POP AR7 +        POP AR6 +        POP AR5 +        POP AR4 +        POP AR3 +        POP AR2 +        POP AR1 +        POP AR0 +        POP_DPTR +        POP PSW +        POP B +        POP ACC + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : DPTR pushen und popen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +PUSH_DPTR       MACRO + +        PUSH DPL +        PUSH DPH + +        ENDM + +POP_DPTR        MACRO + +        POP DPH +        POP DPL + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : DPTR decreminieren. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +        ifdef joerg +DEC_DPTR       MACRO + +        INC DPL +        DJNZ DPL,DEC_DPTR1 +        DEC DPH +DEC_DPTR1: +        DEC DPL + +        ENDM + +        endif + +;--------------------------------------------------------------------- +; Funktion : Addieren und subtraieren mit DPTR. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +ADD_DPTR       MACRO    WERT + +        PUSH PSW +        PUSH ACC +        MOV A,#(WERT#256) +        ADD A,DPL +        MOV DPL,A +        MOV A,#(WERT/256) +        ADDC A,DPH +        MOV DPH,A +        POP ACC +        POP PSW + +        ENDM + + +SUBB_DPTR       MACRO    WERT + +        PUSH PSW +        PUSH ACC +        MOV A,DPL +        CLR C +        SUBB A,#(WERT#256) +        MOV DPL,A +        MOV A,DPH +        SUBB A,#(WERT/256) +        MOV DPH,A +        POP ACC +        POP PSW + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Rechnen mit 16- Bit- Werten im ext. RAM (L,H). +; Aufrufparameter : DPTR = Wert +; Ruechgabeparameter : DPTR = Wert +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SET_16  MACRO   NAME + +        PUSH ACC +        PUSH_DPTR +        PUSH DPH +        PUSH DPL +        MOV DPTR,#NAME +        POP ACC +        MOVX @DPTR,A +        INC DPTR +        POP ACC +        MOVX @DPTR,A +        POP_DPTR +        POP ACC + +        ENDM + +GET_16  MACRO   NAME + +        PUSH ACC +        MOV DPTR,#NAME +        MOVX A,@DPTR +        PUSH ACC +        INC DPTR +        MOVX A,@DPTR +        MOV DPH,A +        POP DPL +        POP ACC + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Scheduler. +; Aufrufparameter : ACC = Zeichen +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +IFCALL  MACRO   CONST,ROUTINE + +        CJNE A,#CONST,IFCALL1 +        LCALL ROUTINE +IFCALL1: + +        ENDM + +IFMAKE  MACRO   CONST,CODE + +        CJNE A,#CONST,IFMAKE1 +        CODE +IFMAKE1: + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Warten bis Netzwerk freiund Message senden. +; Aufrufparameter : ACC = Zeichen +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +SEND_NET  MACRO + +        push acc +SEND_NET1: LCALL READ_STATUS +        JB ACC.1,SEND_NET1 +        pop acc +        LCALL SEND_MESSAGE + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Message senden. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +post_Message1 macro Modul,Msg + +;        if MY_SLAVE_ADR = uC_Modul +;          call ADR_Msg                   ; interne Message +;        elseif +        PUSH ACC +WAIT_NET: LCALL READ_STATUS +        JB ACC.1,WAIT_NET +        PUSH DPL +        PUSH DPH +        MOV DPTR,#ModulNetAdr_Tab +        MOV A,#Modul +        MOVC A,@A+DPTR +        POP DPH +        POP DPL +        MOV R0,#Modul +        MOV R1,#Msg +        LCALL SEND_MESSAGE              ; Message ins Netz +        POP ACC + +;        endif +        endm + +;--------------------------------------------------------------------- +; Funktion : Message senden, alle Parameter im Mkroaufruf, B automatisch. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : R0- R7 +; Stackbedarf : +; Zeitbedarf : +; + +post_Message2 macro Modul,Msg,PARA1,PARA2,PARA3,PARA4,PARA5,PARA6 + +Parameteranzahl SET     2                       ; min. Modulnr. und Msg.-Nr. + +        PUSH ACC +        PUSH B + +        IF "PARA1"<>"" +        MOV R2,PARA1 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA2"<>"" +        MOV R3,PARA2 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA3"<>"" +        MOV R4,PARA3 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA4"<>"" +        MOV R5,PARA4 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA5"<>"" +        MOV R6,PARA5 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF +        IF "PARA6"<>"" +        MOV R7,PARA6 +Parameteranzahl SET     Parameteranzahl+1 +        ENDIF + +        PUSH DPL +        PUSH DPH +        MOV DPTR,#ModulNetAdr_Tab +        MOV A,Modul +        MOVC A,@A+DPTR +        POP DPH +        POP DPL +        MOV R0,Modul +        MOV R1,Msg +        MOV B,#Parameteranzahl +        PUSH ACC +WAIT_NET: LCALL READ_STATUS +        JB ACC.1,WAIT_NET +        POP ACC +        LCALL SEND_MESSAGE              ; Message ins Netz + +        POP B +        POP ACC + +        endm +                                         +;--------------------------------------------------------------------- +; Funktion : Message ausgeben +; Aufrufparameter : wie definiert +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +TEST_MESSAGE_HEX    MACRO   POS + +        PUSH ACC +        MOV A,#POS +        LCALL LCD_SET_DD_RAM_ADDRESS +        POP ACC +        PUSH ACC +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,B +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R0 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R1 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R2 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R3 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R4 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R5 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R6 +        LCALL A_LCD +        MOV A,#' ' +        LCALL LCD_WRITE_CHAR +        MOV A,R7 +        LCALL A_LCD +        POP ACC + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Fehlerbehandlung +; Aufrufparameter : Fehlernr. +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +ERROR   MACRO   NR + + +        ENDM + +;--------------------------------------------------------------------- + + + + + + + + + + +;--------------------------------------------------------------------- +TEST_MESSAGE    MACRO   POS,SCHALTER + +        IF SCHALTER<=TEST_LEVEL +          PUSH ACC +          MOV A,#POS +          LCALL LCD_SET_DD_RAM_ADDRESS +          MOV A,R0 +          LCALL LCD_WRITE_CHAR +          MOV A,R1 +          LCALL LCD_WRITE_CHAR +          MOV A,R2 +          LCALL LCD_WRITE_CHAR +          MOV A,R3 +          LCALL LCD_WRITE_CHAR +          MOV A,R4 +          LCALL LCD_WRITE_CHAR +          MOV A,R5 +          LCALL LCD_WRITE_CHAR +          MOV A,R6 +          LCALL LCD_WRITE_CHAR +          MOV A,R7 +          LCALL LCD_WRITE_CHAR +          POP ACC +        ENDIF +        ENDM +;--------------------------------------------------------------------- +MAKE_MESSAGE    MACRO   ADR,STRG + +        IF 0=0 +          MOV A,#0 +          MOV DPTR,#STR_ADR +          MOVC A,@A+DPTR +          MOV R0,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R1,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R2,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R3,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R4,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R5,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R6,A +          MOV A,#0 +          INC DPTR +          MOVC A,@A+DPTR +          MOV R7,A +          MOV A,#ADR +          MOV B,#8 +          LJMP WEITER + +STR_ADR   DB    STRG + +WEITER:   NOP +        ENDIF +        ENDM + +;--------------------------------------------------------------------- +MAKE_MESSAGE_HEX    MACRO   ADR,L,A0,A1,A2,A3,A4,A5,A6,A7 + +        IF 0=0 +          MOV R0,#A0 +          MOV R1,#A1 +          MOV R2,#A2 +          MOV R3,#A3 +          MOV R4,#A4 +          MOV R5,#A5 +          MOV R6,#A6 +          MOV R7,#A7 +          MOV A,#ADR +          MOV B,#L +        ENDIF +        ENDM + +;--------------------------------------------------------------------- + diff --git a/tests/t_mic51/MEM1.ASM b/tests/t_mic51/MEM1.ASM new file mode 100644 index 0000000..05fb409 --- /dev/null +++ b/tests/t_mic51/MEM1.ASM @@ -0,0 +1,727 @@ + +; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 21.05.1994 +; letzte Aenderung am : 02.08.1994 +; Bemerkung : Routinen fuer die Speicherverwaltung +; +; Dateiname : mem1.asm +; + +;===================================================================== +; Definitionen der Funktionen des Seichermoduls + +;INIT_MEM        Initialisieren des Speichermoduls +;DEINIT_MEM      Deinitialisieren des Speichermoduls +;CLEAR_MEM       Speicher loeschen +;RESET_MEM       Speicher zum lesen zuruecksetzen +;PUT_ELEMENT_MEM Element anf naechste freie Position schreiben +;GET_ELEMENT_MEM Element von akt. Position lesen +;WR_MEM_PC       Speicher auf dem PC speichern. +;RD_MEM_PC       Speicher vom PC laden. + +;------------------------------------------------------------------------------ + +;Messagedefinitionen + +;1.Dateityp (Bit 0 und Bit 1) +Msg_PC_To_Net           equ     00b             ;direkte Eingabe von Hex-Messages fr das Netz +Msg_Frs_Datei           equ     01b             ;Fr„stischdatei +Msg_Rob_Teach_Datei     equ     10b             ;Roboter-Teach-In-Datei +Msg_Frs_Teach_Datei     equ     11b             ;Fr„stisch-Teach-In-Datei + +;2.Aktion (Bit 2 und Bit 3) +Msg_PC_Get              equ     0000b           ;Rekordanfrage an PC +Msg_PC_Put              equ     0100b           ;Rekordspeichern Slave=>PC, Rekordausgabe PC=>Slave +Msg_PC_Reset            equ     1000b           ;PC Datei ”ffnen zum Lesen +Msg_PC_Rewrite          equ     1100b           ;PC Datei ”ffnen zum Schreiben + +;3.Slaveadresse Slave=>PC ; Msg_From_PC PC=>Slave +Msg_From_PC             equ     00000000b       ;Antwort auf Anfrage + +EOF_Record              equ     0ffffh          ; +PC_Slave_Adr            equ     0eh             ; + +;------------------------------------------------------------------------------ +; Speicherdefinitionen + + +        SEGMENT DATA + +CHECKSUMME      DW      ? + + +        SEGMENT XDATA + +POINTER         DW      ?               ; fuer Test +NEXT_FREE       DW      ? +RD_POINTER      DW      ? +BLOCKNR         DW      ? + +MEM_ANF         DB      1000 DUP (?)      ; Speichergroesse in Bytes +MEM_ENDE + +;---------------------------------------------------------------------   +        SEGMENT CODE +;--------------------------------------------------------------------- +; Funktion : Initialisieren des Speichermoduls +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +INIT_MEM: +        PUSH PSW +        PUSH_DPTR +        MOV DPTR,#MEM_ANF +        SET_16 NEXT_FREE +        SET_16 RD_POINTER +        MOV CHECKSUMME,#0 +        MOV CHECKSUMME+1,#0 +        CLR READY +        CLR CRC + +        POP_DPTR +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Deinitialisieren des Speichermoduls +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +DEINIT_MEM: + +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher loeschen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +CLEAR_MEM: +        PUSH PSW +        PUSH_DPTR +        MOV DPTR,#MEM_ANF +        SET_16 NEXT_FREE +        SET_16 RD_POINTER +        MOV CHECKSUMME,#0 +        MOV CHECKSUMME+1,#0 +        CLR READY +        CLR CRC + +        POP_DPTR +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher zum lesen zuruecksetzen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +RESET_MEM: +        PUSH_DPTR +        MOV DPTR,#MEM_ANF +        SET_16 RD_POINTER + +        POP_DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher von MEM_ANF bis NEXT_FREE auf dem PC speichern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +WR_MEM_PC: +        PUSH_ALL +        ; MOV A,#MSG_PC_REWRITE+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_REWRITE +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr                       ; Datei oeffnen +        MOV B,#8 +        SEND_NET + +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr                       ; Header zusammenstellen +        MOV B,#8 +        MOV DPTR,#0 +        SET_16 BLOCKNR                  ; Blocknr.=0 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        GET_16 NEXT_FREE +        SUBB_DPTR MEM_ANF +        MOV R3,DPL                      ; Anzahl Bytes +        MOV R4,DPH +        LCALL CHECK_SUM +        MOV R5,CHECKSUMME               ; Pruefsumme +        MOV R6,CHECKSUMME+1 +        SEND_NET                        ; Header senden + +        MOV DPTR,#MEM_ANF +        SET_16 POINTER                  ; Zeiger auf MEM_ANF setzen + +WR_MEM_MSG: +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG1 +        LJMP WR_MEM_CLOSE               ; keine Bytes mehr -> close datei +WR_MEM_MSG1: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R3,A                        ; Message aufbauen +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG2 +        LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben +WR_MEM_MSG2: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R4,A                        ; Message aufbauen +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG3 +        LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben +WR_MEM_MSG3: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R5,A                        ; Message aufbauen +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG4 +        LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben +WR_MEM_MSG4: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R6,A                        ; Message aufbauen +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JNC WR_MEM_MSG5 +        LJMP WR_MEM_REST                ; keine Bytes mehr -> Rest schreiben +WR_MEM_MSG5: +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        MOV R7,A                        ; Message aufbauen +        PUSH_DPTR +        GET_16 BLOCKNR +        INC DPTR +        SET_16 BLOCKNR                  ; Blocknr.=+1 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        POP_DPTR +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr +        MOV B,#8 +        SEND_NET                        ; Message senden +        LJMP WR_MEM_MSG                 ; naechste Message + +WR_MEM_REST: +        PUSH_DPTR                       ; nicht volle MSG schreiben +        GET_16 BLOCKNR +        INC DPTR +        SET_16 BLOCKNR                  ; Blocknr.=+1 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        POP_DPTR +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr +        MOV B,#8 +        SEND_NET                                ; Message senden + +WR_MEM_CLOSE: +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV         A,#PC_Slave_Adr            ; Datei schlieáen +        MOV         B,#8 +        MOV         R1,#(EOF_RECORD#256) +        MOV         R2,#(EOF_RECORD/256) +        SEND_NET +        POP_ALL +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher vom PC laden. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +RD_MEM_PC: +        PUSH_ALL +        ; MOV A,#MSG_PC_RESET+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_RESET +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr                       ; Datei oeffnen +        MOV B,#8 +        SEND_NET +        ; MOV A,#MSG_PC_GET+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_GET +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr                       ; Header laden +        MOV B,#8 +        MOV DPTR,#0 +        SET_16 BLOCKNR                          ; Blocknr.=0 setzen +        MOV R1,DPL                              ; Blocknr. +        MOV R2,DPH +        SEND_NET                                ; Header anfordern +        POP_ALL +        RET + + +GET_FROM_PC: +        PUSH_ALL +        CJNE R1,#0,GET_NO_HEADER1       ; wenn Blocknr.=0, dann +        CJNE R2,#0,GET_NO_HEADER1       ; Header +        LJMP GET_HEADER +GET_NO_HEADER1: +        LJMP GET_NO_HEADER +GET_HEADER: +        CJNE R3,#0,GET_NOT_EMPTY_JMP    ; testen ob 0 Bytes in Datei +        CJNE R4,#0,GET_NOT_EMPTY_JMP +        LJMP GET_EMPTY +GET_NOT_EMPTY_JMP: +        LJMP GET_NOT_EMPTY + +GET_EMPTY:                              ; Datei leer +        LCALL INIT_MEM                  ; Speicherreset +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                          ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                 ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV         A,#PC_Slave_Adr     ; und Datei schlieáen +        MOV         B,#8 +        MOV         R1,#(EOF_RECORD#256) +        MOV         R2,#(EOF_RECORD/256) +        SEND_NET +        POP_ALL +        SETB READY +        LCD 40H,"Teachin- Datei leer.                    " +        RET + +GET_NOT_EMPTY:                          ; Datei nicht leer +        MOV DPL,R3                      ; Groesse nach DPTR +        MOV DPH,R4 +        ADD_DPTR MEM_ANF +        SET_16 NEXT_FREE                ; neues Speicherende setzen +        MOV CHECKSUMME,R5               ; neue Checksumme laden +        MOV CHECKSUMME+1,R6 +        PUSH_DPTR +        GET_16 BLOCKNR +        INC DPTR +        SET_16 BLOCKNR                  ; Blocknr.=+1 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        POP_DPTR +        ; MOV A,#MSG_PC_GET+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_GET +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr +        MOV B,#8 +        SEND_NET                        ; 1. Block anfordern + +        MOV DPTR,#MEM_ANF +        SET_16 POINTER                  ; Zeiger auf MEM_ANF setzen + +        POP_ALL +        RET + +GET_NO_HEADER: +        GET_16 POINTER                  ; Schreibzeiger laden +        MOV A,R3 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE2 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE2: +        MOV A,R4 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE3 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE3: +        MOV A,R5 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE4 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE4: +        MOV A,R6 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE5 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE5: +        MOV A,R7 +        LCALL ACC_WR_MEM                ; in den Speicher schreiben +        LCALL CHECK_RD_POINTER          ; pruefen ob noch Bytes in der Datei +        JNC GET_MORE6 +        LJMP GET_CLOSE                  ; wenn nicht Datei schliessen +GET_MORE6: +        SET_16 POINTER +        GET_16 BLOCKNR +        INC DPTR +        SET_16 BLOCKNR                  ; Blocknr.=+1 setzen +        MOV R1,DPL                      ; Blocknr. +        MOV R2,DPH +        ; MOV A,#MSG_PC_GET+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_GET +        MOVB ACC.0,P3.5                    ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV A,#PC_Slave_Adr +        MOV B,#8 +        SEND_NET                        ; naechsten Block anfordern +        POP_ALL +        RET + + +GET_CLOSE: +        ; MOV A,#MSG_PC_PUT+MY_SLAVE_ADR1*16 +        MOV A,MY_SLAVE_ADR +        SWAP A                             ; *16 +        ADD A,#MSG_PC_PUT +        MOVB ACC.0,P3.5                      ; Datei fuer Roboter oder Fraese +        SETB ACC.1 +        MOV R0,A +        MOV         A,#PC_Slave_Adr               ; und Datei schlieáen +        MOV         B,#8 +        MOV         R1,#(EOF_RECORD#256) +        MOV         R2,#(EOF_RECORD/256) +        SEND_NET +        MOV R0,CHECKSUMME +        MOV A,CHECKSUMME+1 +        LCALL CHECK_SUM +        CJNE A,CHECKSUMME+1,GET_CRC_ERROR +        MOV A,R0 +        CJNE A,CHECKSUMME,GET_CRC_ERROR +        POP_ALL +        CLR CRC +        SETB READY +        LCD 40H,"Teachin- Datei fehlerfrei geladen.      " +        RET + +GET_CRC_ERROR: +        POP_ALL +        SETB CRC +        SETB READY +        LCD 40H,"FEHLER bei Laden der Teachin- Datei.    " +        RET + +;--------------------------------------------------------------------- +; Funktion : Testen ob DPTR zum LESEN auf belegten Speicher zeigt. +;               C=0 ==> MEM_ANF <= DPTR < NEXT_FREE +;               C=1 ==> sonst +; Aufrufparameter : DPTR = Pointer +; Ruechgabeparameter : - +; Veraenderte Register : PSW +; Stackbedarf : +; Zeitbedarf : +; + +CHECK_RD_POINTER: +        PUSH PSW +        PUSH ACC +        MOV A,#((MEM_ANF-1)/256) +        CJNE A,DPH,CH_RD1               ; Test ob Pointer >= MEM_ANF +CH_RD1: JC CH_RD_OK1 +        CJNE A,DPH,CH_RD_ERROR          ; +        MOV A,#((MEM_ANF-1)#256) +        CJNE A,DPL,CH_RD2 +CH_RD2: JC CH_RD_OK1 +        LJMP CH_RD_ERROR                ; +CH_RD_OK1: +        PUSH_DPTR +        MOV DPTR,#(NEXT_FREE+1) +        MOVX A,@DPTR +        POP_DPTR +        CJNE A,DPH,CH_RD3               ; Test ob Pointer < NEXT_FREE +CH_RD3: JC CH_RD_ERROR +        CJNE A,DPH,CH_RD_OK2            ; +        PUSH_DPTR +        MOV DPTR,#NEXT_FREE +        MOVX A,@DPTR +        POP_DPTR +        CJNE A,DPL,CH_RD4 +CH_RD4: JC CH_RD_ERROR +        CJNE A,DPL,CH_RD_OK2 +        LJMP CH_RD_ERROR                ; + +CH_RD_OK2: +        POP ACC +        POP PSW +        CLR C                           ; o.k. +        RET + +CH_RD_ERROR: +        POP ACC +        POP PSW +        SETB C                          ; Fehler +        RET + +;--------------------------------------------------------------------- +; Funktion : Testen ob DPTR zum SCHREIBEN auf belegten Speicher zeigt. +;               C=0 ==> MEM_ANF <= DPTR <= NEXT_FREE +;               C=1 ==> sonst +; Aufrufparameter : DPTR = Pointer +; Ruechgabeparameter : - +; Veraenderte Register : PSW +; Stackbedarf : +; Zeitbedarf : +; + +CHECK_WR_POINTER: +        PUSH PSW +        PUSH ACC +        MOV A,#((MEM_ANF-1)/256) +        CJNE A,DPH,CH_WR1               ; Test ob Pointer >= MEM_ANF +CH_WR1: JC CH_WR_OK1 +        CJNE A,DPH,CH_WR_ERROR          ; +        MOV A,#((MEM_ANF-1)#256) +        CJNE A,DPL,CH_WR2 +CH_WR2: JC CH_WR_OK1 +        LJMP CH_WR_ERROR                ; +CH_WR_OK1: +        PUSH_DPTR +        MOV DPTR,#(NEXT_FREE+1) +        MOVX A,@DPTR +        POP_DPTR +        CJNE A,DPH,CH_WR3               ; Test ob Pointer <= NEXT_FREE +CH_WR3: JC CH_WR_ERROR +        CJNE A,DPH,CH_WR_OK2            ; +        PUSH_DPTR +        MOV DPTR,#NEXT_FREE +        MOVX A,@DPTR +        POP_DPTR +        CJNE A,DPL,CH_WR4 +CH_WR4: JNC CH_WR_OK2 +        LJMP CH_WR_ERROR                ; + +CH_WR_OK2: +        POP ACC +        POP PSW +        CLR C                           ; o.k. +        RET + +CH_WR_ERROR: +        POP ACC +        POP PSW +        SETB C                          ; Fehler +        RET + +;--------------------------------------------------------------------- +; Funktion : Testen ob DPTR < MEM_ENDE. +;               C=0 ==> DPTR < MEM_ENDE +;               C=1 ==> sonst +; Aufrufparameter : DPTR = Pointer +; Ruechgabeparameter : - +; Veraenderte Register : PSW +; Stackbedarf : +; Zeitbedarf : +; + +CHECK_EOM_POINTER: +        PUSH PSW +        PUSH ACC +        MOV A,#(MEM_ENDE/256) +        CJNE A,DPH,CH_EOM3               ; Test ob Pointer < MEM_ENDE +CH_EOM3: JC CH_EOM_ERROR +        CJNE A,DPH,CH_EOM_OK2            ; +        MOV A,#(MEM_ENDE#256) +        CJNE A,DPL,CH_EOM4 +CH_EOM4: JC CH_EOM_ERROR +        CJNE A,DPL,CH_EOM_OK2 +        LJMP CH_EOM_ERROR                ; + +CH_EOM_OK2: +        POP ACC +        POP PSW +        CLR C                           ; o.k. +        RET + +CH_EOM_ERROR: +        POP ACC +        POP PSW +        SETB C                          ; Fehler +        RET + +;--------------------------------------------------------------------- +; Funktion : ACC in den Speicher schreiben, DPTR increminieren. +; Aufrufparameter : ACC = Wert, DPTR = Pointer +; Ruechgabeparameter : - +; Veraenderte Register : DPTR +; Stackbedarf : +; Zeitbedarf : +; + +ACC_WR_MEM: +        MOVX @DPTR,A +        INC DPTR +        RET + + +;--------------------------------------------------------------------- +; Funktion : ACC aus dem Speicher lesen, DPTR increminieren. +; Aufrufparameter : DPTR = Pointer +; Ruechgabeparameter : ACC = Wert +; Veraenderte Register : ACC, DPTR +; Stackbedarf : +; Zeitbedarf : +; + +ACC_RD_MEM: +        MOVX A,@DPTR +        INC DPTR +        RET + +;--------------------------------------------------------------------- +; Funktion : Pruefsumme ueber den Speicher bilden. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +CHECK_SUM: +        PUSH PSW +        PUSH ACC +        PUSH_DPTR +        MOV CHECKSUMME,#0 +        MOV CHECKSUMME+1,#0 +        MOV DPTR,#MEM_ANF               ; Pointer auf MEM_ANF setzen +CHECK_SUM1: +        LCALL CHECK_RD_POINTER          ; Pointer in DPTR!!! +        JC CHECK_SUM_ENDE +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        ADD A,CHECKSUMME +        MOV CHECKSUMME,A +        MOV A,#0 +        ADDC A,CHECKSUMME+1 +        MOV CHECKSUMME+1,A +        LJMP CHECK_SUM1 + +CHECK_SUM_ENDE: +        POP_DPTR +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Element in den Speicher auf die naechste frei Position schreiben. +; Aufrufparameter : ACC = Wert +; Ruechgabeparameter : C=0 ==> o.k., C=1 ==> Speicherueberlauf +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +PUT_ELEMENT_MEM: +        PUSH PSW +        GET_16 NEXT_FREE                 +        LCALL CHECK_EOM_POINTER         ; testen ob DPTR < MEM_ENDE +        JC GET_ELEMENT_ERROR            ; wenn nicht Fehler +        LCALL CHECK_WR_POINTER          ; testen ob MEM_ANF <= DPTR <= NEXT_FREE +        JC PUT_ELEMENT_ERROR            ; wenn nicht Fehler +        LCALL ACC_WR_MEM                ; Byte aus MEM lesen +        SET_16 NEXT_FREE + +PUT_EL_OK1: +        POP PSW +        CLR C +        RET + +PUT_ELEMENT_ERROR: +        POP PSW +        SETB C +        RET + +        RET + +;--------------------------------------------------------------------- +; Funktion : Element von der akt. Position aus dem Speicher lesen. +; Aufrufparameter : - +; Ruechgabeparameter : ACC = Wert +;                      C=0 ==> o.k., C=1 ==> Schreib- gleich Lesezeiger +;                      oder Lesezeiger ausserhalb des gueltigen Bereiches +; Veraenderte Register : ACC, PSW +; Stackbedarf : +; Zeitbedarf : +; + +GET_ELEMENT_MEM: +        PUSH PSW +        GET_16 RD_POINTER                +        LCALL CHECK_EOM_POINTER         ; testen ob DPTR < MEM_ENDE +        JC GET_ELEMENT_ERROR            ; wenn nicht Fehler +        LCALL CHECK_RD_POINTER          ; testen ob MEM_ANF <= DPTR < NEXT_FREE +        JC GET_ELEMENT_ERROR            ; wenn nicht Fehler +        LCALL ACC_RD_MEM                ; Byte aus MEM lesen +        SET_16 RD_POINTER + +GET_EL_OK1: +        POP PSW +        CLR C +        RET + +GET_ELEMENT_ERROR: +        POP PSW +        SETB C +        RET + +;===================================================================== +;        END +;--------------------------------------------------------------------- + diff --git a/tests/t_mic51/RUN1.ASM b/tests/t_mic51/RUN1.ASM new file mode 100644 index 0000000..690e68b --- /dev/null +++ b/tests/t_mic51/RUN1.ASM @@ -0,0 +1,773 @@ +; +; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 01.07.1994 +; letzte Aenderung am : 02.08.1994 +; Bemerkung : +; +; Dateiname : run1.asm +; + +;--------------------------------------------------------------------- +Definitionen + +ENDE_MARKE      EQU     0FFH +SYNC_MARKE      EQU     0FEH +READY_MARKE     EQU     0FDH +DRILL_MARKE     EQU     0FCH + +PenUp           EQU     000H +PenDown         EQU     0FFH +d_z             EQU     200             ; Schritte fuer Auf-/Ab +Queue_Const     EQU     10              ; je Befehle ein GibReady an Frs + +;--------------------------------------------------------------------- +        SEGMENT CODE +;--------------------------------------------------------------------- +; Funktion : Initialisierung +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +INIT_RUN: +        CLR RUNNINGBIT +        CLR Sync_Waiting +        CLR Ready_Waiting +        CLR Drilling +        CLR Drill_down +        CLR FrsWarning +        CLR PAUSE +        CLR SingleStep +        CLR Break +        MOV R_Sync_Counter,#0 +        MOV Queue_Counter,#Queue_Const +        RET + +;--------------------------------------------------------------------- +; Funktion : Runmodul liesst ein Fkt.-Byte oder eine komplette Msg. +;            aus dem Speicher und schickt diese ins Netz. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +RUN_MODUL: +        PUSH_ALL +        JNB Break,RUN1 +        LJMP RUN_ENDE +RUN1:   LCALL GET_ELEMENT_MEM                   ; Anzahl Bytes +        JNC RUN4                                ; Speicher leer +        LJMP RUN_LEER +RUN4:   CJNE A,#ENDE_MARKE,RUN5                 ; Ende -MARKE im Speicher +        GET_16 RD_POINTER +        DEC_DPTR +        SET_16 RD_POINTER +        LJMP RUN_ENDE                           ; erkannt +RUN5:   CJNE A,#SYNC_MARKE,RUN6                 ; Sync -MARKE im Speicher +        LJMP RUN_SYNC                           ; erkannt +RUN6:   CJNE A,#READY_MARKE,RUN7                ; Ready -MARKE im Speicher +        LJMP RUN_READY                          ; erkannt +RUN7:   CJNE A,#DRILL_MARKE,RUN8                ; Drill -MARKE im Speicher +        LJMP RUN_DRILL                          ; erkannt +RUN8: +        LCD 40h,"Ablauf der Teachin- Datei.              " +        PUSH ACC +        MOV B,A +        USING 1                                 ; Msg. +        MOV R0,#AR0                             ; aus Speicher nach Bank 1 +        USING 0 +RUN_Next_Byte: +        LCALL GET_ELEMENT_MEM                   ; Bytes aus Speicher +        MOV @R0,A                               ; holen +        INC R0 +        DJNZ B,RUN_Next_Byte + +        POP B +        PUSH PSW +        CLR RS1                                 ; Bank 1 +        SETB RS0 +        MOV DPTR,#ModulNetAdr_Tab +        MOV A,R0 +        MOVC A,@A+DPTR +        SEND_NET                                ; Msg senden +        POP PSW                                 ; alte Bank +        POP_ALL +        JNB SingleStep,RUN_Next_Ende +        PUSH_ALL +        LJMP RUN_READY +RUN_Next_Ende: +        RET                                     ; fertig ! + + +RUN_READY: +        LCD 40h,"Warten bis Geraet fertig.               " +        JNB P3.5,RUN_READY_FRS +        post_message2 #Frs,#GibReady,#MemFrs,#GetFrsReady,#0 ; Ready-Anforderung +        LJMP RUN_READY_WEITER                   ; schicken +RUN_READY_FRS: +        post_message2 #Rob,#RobGibReady,#MemRob,#GetRobReady +RUN_READY_WEITER: +        SETB Ready_Waiting +        POP_ALL +        RET + + +RUN_SYNC: +        LCD 40h,"Warten auf Synchronisationspunkt Nr.: " +        LCALL GET_ELEMENT_MEM                   ; Sync_Counter aus Speicher +        LCALL A_LCD +        JB P3.5,RUN_SYNC_FRS +        post_message2 #MemFrs,#GetFrsSync,A     ; Sync.-Meldung an Partner +        LJMP RUN_SYNC0                          ; schicken +RUN_SYNC_FRS: +        post_message2 #MemRob,#GetRobSync,A +RUN_SYNC0: +        MOV B,A +        MOV A,R_Sync_Counter +        CJNE A,B,RUN_SYNC1 +RUN_SYNC1: JNC RUN_SYNC_ENDE +        SETB Sync_Waiting +RUN_SYNC_ENDE: +        POP_ALL +        RET + + +RUN_DRILL: +        JNB P3.5,RUN_DRILL_ROB +        LJMP RUN_DRILL_FRS +RUN_DRILL_ROB: +        LCD 40h,"Roboter kann nicht fraesen! Abbruch.    " +        CLR RUNNINGBIT +        POP_ALL +        LCALL INIT_TEACH +        LCALL RESET_TEACH +        RET + +RUN_DRILL_FRS: +        LCD 40h,"Fraesdatei wird abgearbeitet.           " +        SETB Drilling +        LCALL GET_ELEMENT_MEM                          ; Fraestiefe aus Speicher +        MOV Frs_Ref_Tiefe,A +        LCALL GET_ELEMENT_MEM +        MOV Frs_Ref_Tiefe+1,A +        post_message2 #Frs,#FrsVelocityDraw,#fast       ; schnelle Bewegung +        post_message2 #Frs,#GoPieceRefPos               ; Werkstueckreferenz +        post_message2 #Frs,#MoveRZ,#(d_z/256),#(d_z#256) ; Pen up +        post_message2 #Frs,#DRILL,#on                   ; Motor an +        clr DRILL_DOWN +        SETB DRILL_DOWN + +        MOV A,MY_SLAVE_ADR +        SWAP A                                         ; *16 +        ADD A,#MSG_PC_RESET+Msg_Frs_Datei +        MOV R0,A +        MOV A,#PC_Slave_Adr                            ; Datei oeffnen +        MOV B,#8 +        SEND_NET +        MOV A,MY_SLAVE_ADR +        SWAP A                                         ; *16 +        ADD A,#MSG_PC_GET+Msg_Frs_Datei +        MOV R0,A +        MOV A,#PC_Slave_Adr                            ; +        MOV B,#8 +        MOV DPTR,#0 +        SET_16 BLOCKNR                                 ; Blocknr.=0 setzen +        MOV R1,DPL                                     ; Blocknr. +        MOV R2,DPH +        SEND_NET                                       ; 0. Block laden +        POP_ALL +        RET + + +RUN_LEER: +        LCD 40h,"Speicherinhalt defeckt.                 " +        CLR RUNNINGBIT +        POP_ALL +        LCALL INIT_TEACH +        LCALL RESET_TEACH +        RET + + +RUN_ENDE: +        LCD 40h,"Ablauf beendet.                         " +        GET_16 NEXT_FREE +        DEC_DPTR +        SET_16 NEXT_FREE                        ; Ende- MARKE entfernen +        CLR RUNNINGBIT                          ; Ablaufbeenden +        MOV A,R_Sync_Counter +        MOV T_Sync_Counter,A +        GET_16 RD_POINTER +        SET_16 NEXT_FREE +        POP_ALL +        CLR Break +        RET + +;--------------------------------------------------------------------- +; Funktion : Start des Runmoduls. Schreibt die Endemarke in den Speicher, +;            setzt den Speicher zurueck und setzt das Bit RUNNINBIT. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +START_RUNNING: +        JB READY,START_R +        LJMP START_NICHT_BEREIT +START_R: PUSH ACC +        MOV A,#ENDE_MARKE +        LCALL PUT_ELEMENT_MEM +        POP ACC +        LCALL RESET_MEM +        SETB RUNNINGBIT +        CLR Sync_Waiting +        CLR Ready_Waiting +        MOV R_Sync_Counter,#0 +        RET + +START_NICHT_BEREIT: +        LCD 40H,"Modul nicht bereit fuer Ablauf.         " +        RET + + ;--------------------------------------------------------------------- +; Funktion : Piece-Ref-Position der Fraese speichern. 1. Teil: Position +;            anforndern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +STORE_PIECE_REF: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JNB READY,STORE_P_REF_ENDE              ; Fertig und Fraese? +        JNB P3.5,STORE_P_REF_ENDE + +;        MOV B,#4                                ; Msg. an Frs um Pos. +;        MOV R2,#MemFrs                          ; Empfaenger angeben +;        MOV R3,#FrsPieceRef                     ; Msg.-Nr. Empfaenger angeben +;        post_message1 Frs,GibFrsPos1            ; zu erfragen +        post_message2 #Frs,#GibFrsPos1,#MemFrs,#FrsPieceRef + +STORE_P_REF_ENDE: +        CLR READY                               ; Teach- In nicht bereit +        POP AR0 +        POP ACC +        POP PSW +        RET + + ;--------------------------------------------------------------------- +; Funktion : Piece-Ref-Position der Fraese speichern. 2. Teil: Position +;            in x,y,z speichern, Ref_Flag setzen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +PIECE_REF_FROM_FRS: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JNB READY,P_REF_FRS_DO                    ; NICHT Fertig und Roboter ? +        JB P3.5,P_REF_FRS_DO +        LJMP P_REF_FRS_ENDE +P_REF_FRS_DO: +        MOV Frs_Ref_x,R2                        ; Position speichern +        MOV Frs_Ref_x+1,R3                      ; Position speichern +        MOV Frs_Ref_y,R4                        ; Position speichern +        MOV Frs_Ref_y+1,R5                      ; Position speichern +        MOV Frs_Ref_z,R6                        ; Position speichern +        MOV Frs_Ref_z+1,R7                      ; Position speichern + +P_REF_FRS_ENDE: +        POP AR0 +        POP ACC +        POP PSW +        SETB READY                               ; Teach- In wieder bereit +        SETB Ref_Flag +        RET + + ;--------------------------------------------------------------------- +; Funktion : Fraestiefe der Fraese speichern. 1. Teil: Position +;            anforndern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +STORE_TIEFE: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JNB READY,STORE_TIEFE_ENDE              ; Fertig und Fraese? +        JNB P3.5,STORE_TIEFE_ENDE + +;        MOV B,#4                                ; Msg. an Frs um Pos. +;        MOV R2,#MemFrs                          ; Empfaenger angeben +;        MOV R3,#FrsTiefe                        ; Msg.-Nr. Empfaenger angeben +;        post_message1 Frs,GibFrsPos1            ; zu erfragen +        post_message2 #Frs,#GibFrsPos1,#MemFrs,#FrsTiefe + +STORE_TIEFE_ENDE: +        CLR READY                               ; Teach- In nicht bereit +        POP AR0 +        POP ACC +        POP PSW +        RET + + ;--------------------------------------------------------------------- +; Funktion : Fraestiefe der Fraese speichern. 2. Teil: Tiefe berechnen +;            und in Frs_Ref_Tiefe speichern, Tiefe_Flag setzen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +TIEFE_FROM_FRS: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JNB READY,TIEFE_FRS_DO                  ; NICHT Fertig und Roboter ? +        JB P3.5,TIEFE_FRS_DO +        LJMP TIEFE_FRS_ENDE +TIEFE_FRS_DO: +;        MOV A,AR7                               ; Fraestiefe berechnen +;        CLR C                                   ; und speichern +;        SUBB A,Frs_Ref_Tiefe+1 +        MOV Frs_Ref_Tiefe+1,AR7 +;  7 +;        MOV A,AR6 +;        SUBB A,Frs_Ref_Tiefe +        MOV Frs_Ref_Tiefe,AR6 +TIEFE_FRS_ENDE: +        POP AR0 +        POP ACC +        POP PSW +        SETB READY                               ; Teach- In wieder bereit +        SETB Tiefe_Flag +        RET + +;--------------------------------------------------------------------- +; Funktion : Flags abfragen, nur wenn Ref_Flag und Tiefe_Flag low weiter. +;            SetPieceRef Msg. in Speicher ablegen, Drill Marke ablegen, +;            Tiefe ablegen. +; Aufrrameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +STORE_DRILL: +        PUSH PSW +        PUSH ACC +        JNB Ref_Flag,STORE_DRILL_ERROR          ; PieceRefPos und Tiefe +        JNB Tiefe_Flag,STORE_DRILL_ERROR        ; definiert +        LJMP STORE_DRILL_OK + +STORE_DRILL_ERROR: +        LCD 40h,"Fehler: RefPos/ Tiefe nicht definiert.  " +        POP ACC +        POP PSW +        RET + +STORE_DRILL_OK: +        MOV A,#8                                ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.-Laenge) +        ERROR 0 +        MOV A,#Frs                              ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Modulnr.) +        ERROR 0 +        MOV A,#SetPieceRef                      ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,Frs_Ref_x                         ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High) +        ERROR 0 +        MOV A,Frs_Ref_x+1                       ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low) +        ERROR 0 +        MOV A,Frs_Ref_y                         ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High) +        ERROR 0 +        MOV A,Frs_Ref_y+1                       ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 Low) +        ERROR 0 +        MOV A,Frs_Ref_z                         ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High) +        ERROR 0 +        MOV A,Frs_Ref_z+1                       ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low) +        ERROR 0 + +        MOV A,#DRILL_MARKE +        LCALL PUT_ELEMENT_MEM + +        MOV A,Frs_Ref_Tiefe                     ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High) +        ERROR 0 +        MOV A,Frs_Ref_Tiefe+1                   ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low) +        ERROR 0 + +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Speichert die Ready-MARKE im Speicher +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +STORE_READY: +        PUSH ACC +        MOV A,#READY_MARKE +        LCALL PUT_ELEMENT_MEM +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : Speichert das Sync.-MARKE und den Sync.-Counter im Speicher +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +STORE_SYNC: +        PUSH ACC +        MOV A,#SYNC_MARKE +        LCALL PUT_ELEMENT_MEM +        INC T_Sync_Counter                ; Sync_Counter +1 +        MOV A,T_Sync_Counter +        LCALL PUT_ELEMENT_MEM +        LCD 29,"Sync.-Nr." +        LCALL A_LCD +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : Ready-Msg. erhalten und bearbeiten. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +GET_READY_MSG: +        LCD 40H,"                                        " +        CLR Ready_Waiting +        RET + +;--------------------------------------------------------------------- +; Funktion : Sync.-Msg. erhalten und bearbeiten. Bricht Running ab +;            wenn von Partner Sync.-Nr. 0 kommt. Wenn eigenes Modul +;            noch nicht getstartet wird Sync.-Msg. mit #0 an Partner +;            geschickt. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +GET_SYNC_MSG: +        JNB RunningBit,G_S_1 +        LJMP G_S_2 +G_S_1:  PUSH B +        MOV B,#3                                ; Msg. +        MOV R2,#0                               ; mit #0 +        JB P3.5,G_S_FRS +        post_message1 MemFrs,GetFrsSync         ; Sync.-Meldung an Partner +        POP B +        RET                                     ; schicken +G_S_FRS: post_message1 MemRob,GetRobSync +        POP B +        RET + +G_S_2:  PUSH PSW +        PUSH ACC +        INC R_Sync_Counter +        MOV A,R2                        ; Sync_Counter aus Msg. holen +        CJNE A,#0,G_S_KEIN_ABBRUCH        ; Abbruch bei #0 +        LJMP G_S_ABBRUCH +G_S_KEIN_ABBRUCH: +        CJNE A,R_Sync_Counter,G_S_ERROR   ; Fehler wenn ungleich +        CLR Sync_Waiting +        POP ACC +        POP PSW +        RET + +G_S_ABBRUCH: +        LCD 40h,"Partner nicht bereit. Abbruch.          " +        CLR RUNNINGBIT +        POP ACC +        POP PSW +        LCALL INIT_TEACH +        LCALL RESET_TEACH +        RET + +G_S_ERROR: +        LCD 40h,"Synchronisationsfehler.                 " +        CLR RUNNINGBIT +        POP ACC +        POP PSW +        LCALL INIT_TEACH +        LCALL RESET_TEACH +        RET + +;--------------------------------------------------------------------- +; Funktion : Testen ob Queue- Warnung von Frs gekommen ist. Wenn ja, +;            GibReady an die Fraese schicken und warten bis kommt. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +queue_test      macro + +Q_T_Main_Loop: +        LCALL MAIN_EVENT_LOOP +        JB PAUSE,Q_T_Main_Loop                  ; Pause aktiv +        JB READY_WAITING,Q_T_Main_Loop          ; warten auf Ready von Frs +        LCALL READ_STATUS +        JB ACC.1,Q_T_Main_Loop + +        endm + +;--------------------------------------------------------------------- +; Funktion : Daten aus der Fraesdatei vom PC empfangen, konvertieren +;            und an die Fraese schicken. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + + +GET_WORKFR_FROM_PC: +        PUSH_ALL +        JB RUNNINGBIT,GET_WORKFR_FROM_PC_START +        LJMP GET_WORKFR_FROM_PC_ABBRUCH +GET_WORKFR_FROM_PC_START: +        MOV A,R1                                ; testen ob Dateiende +        CJNE A,#0ffh,GET_WORKFR_FROM_PC_NEXT +        MOV A,R2 +        CJNE A,#0ffh,GET_WORKFR_FROM_PC_NEXT +        LJMP GET_WORKFR_FROM_PC_ENDE + +GET_WORKFR_FROM_PC_NEXT:                        ; naechste Msg. von PC +        PUSH_ALL                                ; konvertieren und an Frs +        queue_test +        MOV A,AR7                               ; schicken +        CJNE A,#PenDown,G_W_PenUp               ; Auf- oder Abbewegung? +        ljmp G_W_PenDown +G_W_PenUp: +        jb drill_down,G_W_Make_Up +        ljmp G_W_Pen_Ready                      ; ist schon oben +G_W_Make_Up: +        post_message2 #Frs,#MoveZ,Frs_Ref_z,Frs_Ref_z+1 ; Pen aus Werkstueck ziehen +        queue_test +        post_message2 #Frs,#FrsVelocityDraw,#fast ; schnelle Bewegung +        queue_test +        post_message2 #Frs,#MoveRZ,#(d_z/256),#(d_z#256) ; Pen up +        clr DRILL_DOWN +        queue_test +        LJMP G_W_Pen_Ready                      ; fertig + +G_W_PenDown: +        jnb drill_down,G_W_Make_Down +        ljmp G_W_Pen_Ready                       ; ist schon unten +G_W_Make_Down: +        post_message2 #Frs,#MoveRZ,#(((-d_z) & 0ffffh) / 256),#(((-d_z) & 0ffffh) # 256) ; Ab +        queue_test +        post_message2 #Frs,#FrsVelocityDraw,#slow ; langsame Bewegung +        queue_test +        post_message2 #Frs,#MoveZ,Frs_Ref_Tiefe,Frs_Ref_Tiefe+1 ; Pen aus Werkstueck ziehen +        queue_test +        SETB DRILL_DOWN +G_W_Pen_Ready:                                  ; Pen fertig ! + +        POP_ALL +        post_message2 #Frs,#MovePR,AR4,AR3,AR6,AR5,#0,#0 ; rel. Bewegung +        queue_test + +;        DJNZ Queue_Counter,G_W_Send_no_Ready +;        MOV Queue_Counter,#Queue_Const +;        PUSH_ALL +;        post_message2 #Frs,#GibReady,#MemFrs,#GetFrsReady,#0 +;        POP_ALL + +G_W_Send_no_Ready: + +        GET_16 BLOCKNR +        INC DPTR +        SET_16 BLOCKNR                          ; Blocknr.=+1 setzen +        MOV R1,DPL                              ; Blocknr. +        MOV R2,DPH +        MOV A,MY_SLAVE_ADR +        SWAP A                                  ; *16 +        ADD A,#MSG_PC_GET+Msg_Frs_Datei +        MOV R0,A +        MOV A,#PC_Slave_Adr +        MOV B,#8 +        SEND_NET                                ; naechsten Block anfordern +        POP_ALL +        RET + +GET_WORKFR_FROM_PC_ENDE: +        post_message2 #Frs,#DRILL,#off          ; +        CLR Drilling + +        POP_ALL +        LCD 40h,"Fraesdatei fertig.                      " +        RET + +GET_WORKFR_FROM_PC_ABBRUCH: +        CLR Drilling +        POP_ALL +        RET + +;--------------------------------------------------------------------- +; Funktion : Warnung von Frs erhalten und verarbeiten. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +Get_Warning_From_Frs: +        LCD 40h,"Warnung Fraese:                         " +        PUSH ACC +        PUSH PSW +        PUSH B +        PUSH_DPTR + +        MOV A,AR2 +        IFMAKE QUEUE_WARNING,SETB FrsWarning    ; Queue Fraese laeuf ueber + +        MOV DPTR,#ParamStr_Tab                  ; Tabellenbasis laden +GWFF_NEXT: +        MOV A,#0 +        MOVC A,@A+DPTR                          ; Wert laden +        PUSH ACC                                ; retten +        MOV A,#1 +        MOVC A,@A+DPTR                          ; Stringlaenge laden +        MOV B,A +        POP ACC                                 ; Wert mit empfangenem +        CJNE A,AR2,GWFF_LOOP                    ; vergleichen +        LJMP GWFF_AUSGABE +GWFF_LOOP: +        MOV A,B                                 ; Stringlaende auf Tabellen- +        ADD A,DPL                               ; zeiger addieren +        MOV DPL,A +        MOV A,#0 +        ADDC A,DPH +        MOV DPH,A +        LJMP GWFF_NEXT + +GWFF_AUSGABE: +        MOV A,#50h                              ; LCD- Position +        LCALL LCD_SET_DD_RAM_ADDRESS +        INC DPTR +        INC DPTR +        LCALL LCD_WRITE_STRING                  ; Meldung ausgeben +        MOV A,#0h                               ; LCD- Position +        LCALL LCD_SET_DD_RAM_ADDRESS + +        POP_DPTR +        POP B +        POP PSW +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : Fehler von Frs erhalten und verarbeiten. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +Get_Error_From_Frs: +        LCD 40h,"Fehler Fraese:                          " +        PUSH ACC +        PUSH PSW +        PUSH B +        PUSH_DPTR +        MOV DPTR,#ParamStr_Tab                  ; Tabellenbasis laden +GEFF_NEXT: +        MOV A,#0 +        MOVC A,@A+DPTR                          ; Wert laden +        PUSH ACC +        MOV A,#1 +        MOVC A,@A+DPTR                          ; Stringlaenge laden +        MOV B,A +        POP ACC                                 ; Wert mit empfangenem +        CJNE A,AR2,GEFF_LOOP                    ; vergleichen +        LJMP GEFF_AUSGABE +GEFF_LOOP: +        MOV A,B                                 ; Stringlaende auf Tabellen- +        ADD A,DPL                               ; zeiger addieren +        MOV DPL,A +        MOV A,#0 +        ADDC A,DPH +        MOV DPH,A +        LJMP GEFF_NEXT + +GEFF_AUSGABE: +        MOV A,#4Fh                              ; LCD- Position +        LCALL LCD_SET_DD_RAM_ADDRESS +        INC DPTR +        INC DPTR +        LCALL LCD_WRITE_STRING                  ; Meldung ausgeben +        MOV A,#0h                               ; LCD- Position +        LCALL LCD_SET_DD_RAM_ADDRESS + +        POP_DPTR +        POP B +        POP PSW +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +;===================================================================== +;        END +;--------------------------------------------------------------------- + + + diff --git a/tests/t_mic51/TAST1.ASM b/tests/t_mic51/TAST1.ASM new file mode 100644 index 0000000..0a34ecb --- /dev/null +++ b/tests/t_mic51/TAST1.ASM @@ -0,0 +1,250 @@ + +; Aufgabe Nr.: Speichermodul fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 21.05.1994 +; letzte Aenderung am : +; Bemerkung : Routinen fuer ASCII- Tastatur +; +; Dateiname : tast1.asm +; + +;---------------------------------------------------------------------	 +; Definitionen + +        SEGMENT DATA + +ZEICHEN         DB      ? + +        SEGMENT BITDATA + +STROB           DB      ? + +;--------------------------------------------------------------------- +        SEGMENT CODE +;===================================================================== +; Funktion : Tastaturinterrupt initialisieren +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +INIT_TASTATUR: +        Init_Vektor INT0_VEKTOR,TASTATUR_INT +        SETB IT0 +        CLR IE0 +        SETB EX0 +        RET + +;--------------------------------------------------------------------- +; Funktion : Interruptroutine fuer Tastatur, setzt bei Tastaturstrob +;            das Bit STROB und schreibt das Zeichen von der Tastatur +;            nach ZEICHEN. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +TASTATUR_INT: +        MOV ZEICHEN,P1 +        SETB STROB +        RETI + +;--------------------------------------------------------------------- +; Funktion : Klein- in Grossbuchstaben umwandeln. +; Aufrufparameter : ACC = Zeichen +; Ruechgabeparameter : ACC = Zeichen +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +        ifdef joerg + +UPCASE: PUSH PSW +        CJNE A,#'a',UPCASE1 +UPCASE1: JC UPCASE2 +        CJNE A,#07bh,UPCASE3 +UPCASE3: JNC UPCASE2 +        CLR C +        SUBB A,#32 +UPCASE2: POP PSW +        RET + +        endif + +;--------------------------------------------------------------------- +; Funktion : Warten bis Tastendruck und Zeichen verwerfen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +WAIT_KEY: +        ifdef joerg +         +        JNB STROB,$ +        CLR STROB +        RET + +        elseif +         +        JNB KB_CHAR_READY,$ +        CLR KB_CHAR_READY +        RET + +        endif +;--------------------------------------------------------------------- +; Funktion : Warten bis Tastendruck und Zeichen nach ACC von der +;            Tastatur einlesen. +; Aufrufparameter : - +; Ruechgabeparameter : ACC = Zeichen +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +CHAR_ACC: +        ifdef joerg + +        JNB STROB,$ +        CLR STROB +        MOV A,ZEICHEN +        RET + +        elseif + +        JNB KB_CHAR_READY,$ +        CLR KB_CHAR_READY +        MOV A,KB_CHAR_BUFFER +        RET + +        endif + +;--------------------------------------------------------------------- +; Funktion : ACC in hex von der Tastatur einlesen. +; Aufrufparameter : - +; Ruechgabeparameter : ACC = Wert +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +IN_ACC: +        PUSH PSW +        PUSH B +        LCALL CHAR_ACC +        LCALL LCD_WRITE_CHAR +        LCALL UPCASE +        CJNE A,#'A',IN_ACC1 +IN_ACC1: JC IN_ACC2 +        CJNE A,#'G',IN_ACC3 +IN_ACC3: JNC IN_ACC2 +        CLR C +        SUBB A,#7 +IN_ACC2: CLR C +        SUBB A,#30h +        SWAP A +        MOV B,A +        LCALL CHAR_ACC +        LCALL LCD_WRITE_CHAR +        LCALL UPCASE +        CJNE A,#'A',IN_ACC11 +IN_ACC11: JC IN_ACC12 +        CJNE A,#'G',IN_ACC13 +IN_ACC13: JNC IN_ACC12 +        CLR C +        SUBB A,#7 +IN_ACC12: CLR C +        SUBB A,#30h +        ORL A,B +        POP B +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : DPTR in hex von der Tastatur einlesen. +; Aufrufparameter : - +; Ruechgabeparameter : DPTR = Wert +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +IN_DPTR: +        PUSH ACC +        LCALL IN_ACC +        MOV DPH,A +        LCALL IN_ACC +        MOV DPL,A +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : ACC in hex auf LCD ausgeben. +; Aufrufparameter : ACC = Wert +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +A_LCD:  PUSH ACC +        PUSH ACC +        SWAP A +        ANL A,#00001111B +        ADD A,#'0' +        CJNE A,#':',A_LCD1 +A_LCD1: JC A_LCD2 +        ADD A,#7 +A_LCD2: LCALL LCD_WRITE_CHAR +        POP ACC +        ANL A,#00001111B +        ADD A,#'0' +        CJNE A,#':',A_LCD3 +A_LCD3: JC A_LCD4 +        ADD A,#7 +A_LCD4: LCALL LCD_WRITE_CHAR +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : DPTR in hex auf LCD ausgeben. +; Aufrufparameter : DPTR = Wert +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +DPTR_LCD: +        PUSH ACC +        MOV A,DPH +        LCALL A_LCD +        MOV A,DPL +        LCALL A_LCD +        POP ACC +        RET + +;--------------------------------------------------------------------- +; Funktion : Setzt LCD- Status neu +; Aufrufparameter : A = Status +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +LCD_SET_STATUS: + +        RET + +;===================================================================== +;        END +;--------------------------------------------------------------------- + diff --git a/tests/t_mic51/TEACH1.ASM b/tests/t_mic51/TEACH1.ASM new file mode 100644 index 0000000..3618062 --- /dev/null +++ b/tests/t_mic51/TEACH1.ASM @@ -0,0 +1,504 @@ + +; Aufgabe Nr.: Teach- In Einheit fuer uP- Praktikum II +; Autor: Joerg Vollandt  +; erstellt am : 31.05.1994 +; letzte Aenderung am : 14.07.1994 +; Bemerkung : +; +; Dateiname : teach1.asm +; + +;===================================================================== +; Definitionen der Funktionen der Teach- In Einheit + +;INIT_TEACH      Initialisieren der Teach- In Einheit +;DEINIT_TEACH    Deinitialisieren der Teach- In Einheit +;CLEAR_TEACH     Speicher loeschen +;RESET_TEACH     Speicher zum lesen zuruecksetzen +;STORE_ROB       Position Roboter speichern +;STORE_FRAES     Position Fraese speichern +;SYNC +;LOAD_ROB        Roboter Teach- In Datei von PC laden +;LOAD_FRAES      Fraese- Teach- In Datei von PC laden +;LOAD            Beide Teach- In Dateien von PC laden +;SAVE_ROB        Roboter Teach- In Datei auf PC speichern +;SAVE_FRAES      Fraese- Teach- In Datei auf PC speichern + +;------------------------------------------------------------------------------ +        SEGMENT CODE +;--------------------------------------------------------------------- +; Funktion : Initialisieren der Error- und Warningeinspruenge fuer die +;            Fraese. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +INIT_FRS: +        JB P3.5,INIT_FRAES_START +        LJMP INIT_FRAES_ENDE +INIT_FRAES_START: +        PUSH_ALL +;        MOV B,#5                                ; Msg. Frs +;        MOV AR2,#MemFrs                         ; meine Adr. +;        MOV AR3,#GetFrsError                    ; Fehlereinsprung +;        MOV AR4,#GetFrsWarning                  ; Warnungeinsprung +;        post_message1 Frs,SetMasterAdress       ; Ready-Anfordrung +        post_message2 #Frs,#SetMasterAdress,#MemFrs,#GetFrsError,#GetFrsWarning +        POP_ALL +INIT_FRAES_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Initialisieren der Teach- In Einheit +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +INIT_TEACH: +        CLR READY +        CLR CRC +        LCALL INIT_MEM +        MOV T_Sync_Counter,#0 +        MOV Frs_Ref_x,#0 +        MOV Frs_Ref_x+1,#0 +        MOV Frs_Ref_y,#0 +        MOV Frs_Ref_y+1,#0 +        MOV Frs_Ref_z,#0 +        MOV Frs_Ref_z+1,#0 +        MOV Frs_Ref_Tiefe,#0 +        MOV Frs_Ref_Tiefe+1,#0 +        CLR Ref_Flag +        CLR Tiefe_Flag +        RET + +;--------------------------------------------------------------------- +; Funktion : Deinitialisieren der Teach- In Einheit +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +DEINIT_TEACH: +        CLR READY +        CLR CRC +        LCALL DEINIT_MEM + +        RET + +;--------------------------------------------------------------------- +; Funktion : Speicher der Teach- In Einheit loeschen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +CLEAR_TEACH: + +        RET + +;--------------------------------------------------------------------- +; Funktion : Teach- In Einheit zuruecksetzen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +RESET_TEACH: +        LCALL RESET_MEM +        SETB READY + +        RET + +;--------------------------------------------------------------------- +; Funktion : Roboter Teach- In Datei von PC laden +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +LOAD_ROB: +        JB P3.5,LOAD_ROB_ENDE +        CLR READY +        LCD 40H,"Roboter- Teachin- Datei wird geladen.   " +        LCALL RD_MEM_PC +LOAD_ROB_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Fraese- Teach- In Datei von PC laden +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +LOAD_FRAES: +        JNB P3.5,LOAD_FRAES_ENDE +        CLR READY +        LCD 40H,"Fraese- Teachin- Datei wird geladen.    " +        LCALL RD_MEM_PC +LOAD_FRAES_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Roboter Teach- In Datei auf PC speichern +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +SAVE_ROB: +        JB READY,SAVE_ROB_START +        JNB P3.5,SAVE_ROB_START +        LJMP SAVE_ROB_ENDE +SAVE_ROB_START: +        LCD 40H,"Roboter- Teachin- Datei wird gespeichert" +        LCALL WR_MEM_PC +        JNC SAVE_ROB_OK +        LCD 40H,"FEHLER bei Speichern.                   " +        RET + +SAVE_ROB_OK: +        LCD 40H,"Datei gespeichert.                      " +        RET + +SAVE_ROB_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Fraese- Teach- In Datei auf PC speichern +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +SAVE_FRAES: +        JB READY,SAVE_FRAES_START +        JB P3.5,SAVE_FRAES_START +        LJMP SAVE_FRAES_ENDE +SAVE_FRAES_START: +        LCALL WR_MEM_PC +        JNC SAVE_FRAES_OK +        LCD 40H,"FEHLER bei Speichern.                   " +        RET + +SAVE_FRAES_OK: +        LCD 40H,"Datei gespeichert.                      " +        RET + +SAVE_FRAES_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : Position des Roboters speichern. 1. Teil: Msg- Header +;            in MEM speichern und ersten Teil der Position vom Roboter +;            anfordern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +STORE_ROB: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JNB READY,STORE_ROB_ENDE                ; Fertig und Roboter ? +        JB P3.5,STORE_ROB_ENDE + +        MOV B,#4                                ; Msg. an Roboter um Pos. +        MOV R2,#MemRob                          ; Empfaenger angeben +        MOV R3,#RobPos1                         ; Msg.-Nr. Empfaenger angeben +        post_message1 Rob,GibPos1                ; zu erfragen + +STORE_ROB_ENDE: +        CLR READY                               ; Teach- In nicht bereit +        POP AR0 +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Position des Roboters speichern. 2. Teil: 1. Teil Position +;            in MEM speichern und zweiten Teil der Position vom Roboter +;            anfordern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +FIRST_FROM_ROB: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JB READY,FIRST_ROB_ENDE                 ; NICHT Fertig und Roboter ? +        JB P3.5,FIRST_ROB_ENDE +        MOV A,#8                                ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.-Laenge) +        ERROR 0 +        MOV A,#Rob                              ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Modulnr.) +        ERROR 0 +        MOV A,#MoveAPos1                        ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R2                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High) +        ERROR 0 +        MOV A,R3                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low) +        ERROR 0 +        MOV A,R4                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High) +        ERROR 0 +        MOV A,R5                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 Low) +        ERROR 0 +        MOV A,R6                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High) +        ERROR 0 +        MOV A,R7                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low) +        ERROR 0 + +        MOV B,#4                                ; Msg. an Roboter um Pos. +        MOV R2,#MemRob                          ; Empfaenger angeben +        MOV R3,#RobPos2                         ; Msg.-Nr. Empfaenger angeben +        post_message1 Rob,GibPos2               ; zu erfragen + +FIRST_ROB_ENDE: +        POP AR0 +        POP ACC +        POP PSW + +        RET + +;--------------------------------------------------------------------- +; Funktion : Position des Roboters speichern. 3. Teil: 2. Teil Position +;            in MEM speichern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +SECOND_FROM_ROB: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JB READY,SECOND_ROB_ENDE                ; NICHT Fertig und Roboter ? +        JB P3.5,SECOND_ROB_ENDE +        MOV A,#8                                ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.-Laenge) +        ERROR 0 +        MOV A,#Rob                              ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Modulnr.) +        ERROR 0 +        MOV A,#MoveAPos2                        ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R2                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High) +        ERROR 0 +        MOV A,R3                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low) +        ERROR 0 +        MOV A,R4                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High) +        ERROR 0 +        MOV A,R5                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 Low) +        ERROR 0 +        MOV A,R6                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High) +        ERROR 0 +        MOV A,R7                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low) +        ERROR 0 + +SECOND_ROB_ENDE: +        POP AR0 +        POP ACC +        POP PSW +        SETB READY                               ; Teach- In wieder bereit +        RET + +;--------------------------------------------------------------------- +; Funktion : Position der Fraese speichern. 1. Teil: Msg- Header +;            in MEM speichern und ersten Teil der Position von Fraese +;            anfordern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +STORE_FRAES: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JNB READY,STORE_FRS_ENDE                ; Fertig und Fraese? +        JNB P3.5,STORE_FRS_ENDE + +        MOV B,#4                                ; Msg. an Roboter um Pos. +        MOV R2,#MemFrs                          ; Empfaenger angeben +        MOV R3,#FrsPos1                         ; Msg.-Nr. Empfaenger angeben +        post_message1 Frs,GibFrsPos1            ; zu erfragen + +STORE_FRS_ENDE: +        CLR READY                               ; Teach- In nicht bereit +        POP AR0 +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Position der Fraese speichern. 2. Teil: 1. Teil Position +;            in MEM speichern und zweiten Teil der Position von Fraese +;            anfordern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +FIRST_FROM_FRS: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JB READY,FIRST_FRS_ENDE                 ; NICHT Fertig und Roboter ? +        JNB P3.5,FIRST_FRS_ENDE +        MOV A,#8                                ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.-Laenge) +        ERROR 0 +        MOV A,#Frs                              ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Modulnr.) +        ERROR 0 +        MOV A,#MoveAPos                         ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R2                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High) +        ERROR 0 +        MOV A,R3                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low) +        ERROR 0 +        MOV A,R4                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High) +        ERROR 0 +        MOV A,R5                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 Low) +        ERROR 0 +        MOV A,R6                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 High) +        ERROR 0 +        MOV A,R7                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 3 Low) +        ERROR 0 + +        MOV B,#4                                ; Msg. an Roboter um Pos. +        MOV R2,#MemFrs                          ; Empfaenger angeben +        MOV R3,#FrsPos2                         ; Msg.-Nr. Empfaenger angeben +        post_message1 Frs,GibFrsPos2            ; zu erfragen + +FIRST_FRS_ENDE: +        POP AR0 +        POP ACC +        POP PSW + +        RET + +;--------------------------------------------------------------------- +; Funktion : Position der Fraese speichern. 3. Teil: 2. Teil Position +;            in MEM speichern. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +SECOND_FROM_FRS: +        PUSH PSW +        PUSH ACC +        PUSH AR0 +        JB READY,SECOND_FRS_ENDE                ; NICHT Fertig und Roboter ? +        JNB P3.5,SECOND_FRS_ENDE + +        MOV A,#4                                ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.-Laenge) +        ERROR 0 +        MOV A,#Frs                              ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Modulnr.) +        ERROR 0 +        MOV A,#MoveV                            ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R2                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 High) +        ERROR 0 +        MOV A,R3                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 1 Low) +        ERROR 0 + +        MOV A,#3                                ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.-Laenge) +        ERROR 0 +        MOV A,#Frs                              ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Modulnr.) +        ERROR 0 +        MOV A,#Drill                            ; Msg- Header speichern +        LCALL PUT_ELEMENT_MEM                   ; (Msg.- Nr.) +        ERROR 0 +        MOV A,R4                                ; Position speichern +        LCALL PUT_ELEMENT_MEM                   ; (Parameter 2 High) +        ERROR 0 + +SECOND_FRS_ENDE: +        POP AR0 +        POP ACC +        POP PSW +        SETB READY                               ; Teach- In wieder bereit +        RET + +;--------------------------------------------------------------------- +; Funktion : +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + + +        RET + +;===================================================================== +;        END +;--------------------------------------------------------------------- + diff --git a/tests/t_mic51/asflags b/tests/t_mic51/asflags new file mode 100644 index 0000000..d0334c2 --- /dev/null +++ b/tests/t_mic51/asflags @@ -0,0 +1 @@ +-c -A 
\ No newline at end of file diff --git a/tests/t_mic51/defKey.inc b/tests/t_mic51/defKey.inc new file mode 100644 index 0000000..aac5ab1 --- /dev/null +++ b/tests/t_mic51/defKey.inc @@ -0,0 +1,83 @@ +; ***************************************************************************** +; Definition des Tastenfeldes der Teach-In Einheit +; Format: +;      DefKey {On,Off}, {P4,P5}, <Teach-In Modul>, <String> +; +;      Es muss genau 8 Elemente pro Kategorie eingetragen werden +;      Wenn leerer String, wird keine Message durch das Netz gesendet + + +        DefKey On, P4, TeachRob, "Rob MoveCHL"     ; Hand links +        DefKey On, P4, TeachRob, "Rob MoveCHR"     ; Hand rechts +        DefKey On, P4, TeachRob, "Rob MoveCHO"     ; Hand oeffnen +        DefKey On, P4, TeachRob, "Rob MoveCHC"     ; Hand schliessen +        DefKey On, P4, TeachRob, "MemRob StoreRobPos" ; STORE +        DefKey On, P4, TeachRob, "MemRob StoreRobReady"     ; AUX1 +        DefKey On, P4, TeachRob, "MemRob StoreRobSync"   ; AUX2 +        DefKey On, P4, TeachRob, "Rob RobVelocity Fast" ; FAST + +        DefKey Off, P4, TeachRob, "Rob StopCHT" +        DefKey Off, P4, TeachRob, "Rob StopCHT" +        DefKey Off, P4, TeachRob, "Rob StopCH" +        DefKey Off, P4, TeachRob, "Rob StopCH" +        DefKey Off, P4, TeachRob, "" +        DefKey Off, P4, TeachRob, "" +        DefKey Off, P4, TeachRob, "" +        DefKey Off, P4, TeachRob, "Rob RobVelocity Slow" + +        DefKey On, P5, TeachRob, "Rob MoveCBL"     ; Rumpf links +        DefKey On, P5, TeachRob, "Rob MoveCBR"     ; Rumpf rechts +        DefKey On, P5, TeachRob, "Rob MoveCSU"     ; Oberarm heben +        DefKey On, P5, TeachRob, "Rob MoveCSD"     ; Oberarm senken +        DefKey On, P5, TeachRob, "Rob MoveCEU"     ; Unterarm heben +        DefKey On, P5, TeachRob, "Rob MoveCED"     ; Unterarm senken +        DefKey On, P5, TeachRob, "Rob MoveCHU"     ; Hand heben +        DefKey On, P5, TeachRob, "Rob MoveCHD"     ; Hand senken + +        DefKey Off, P5, TeachRob, "Rob StopCB" +        DefKey Off, P5, TeachRob, "Rob StopCB" +        DefKey Off, P5, TeachRob, "Rob StopCS" +        DefKey Off, P5, TeachRob, "Rob StopCS" +        DefKey Off, P5, TeachRob, "Rob StopCE" +        DefKey Off, P5, TeachRob, "Rob StopCE" +        DefKey Off, P5, TeachRob, "Rob StopCHP" +        DefKey Off, P5, TeachRob, "Rob StopCHP" + +        DefKey On, P4, TeachFrs, "Frs Drill on"       ; Fraesmotor ein +        DefKey On, P4, TeachFrs, "Frs Drill off"      ; Fraesmotor aus +        DefKey On, P4, TeachFrs, "MemFrs StoreFrsPos" ; STORE +        DefKey On, P4, TeachFrs, "Frs FrsVelocity fast"     ; FAST +        DefKey On, P4, TeachFrs, "MemFrs StoreFrsReady"     ; AUX1 +        DefKey On, P4, TeachFrs, "MemFrs StoreFrsSync"      ; AUX2 +        DefKey On, P4, TeachFrs, "MemFrs StoreFrsDrill"     ; AUX3 +        DefKey On, P4, TeachFrs, ""     ; AUX4 + +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "Frs FrsVelocity slow" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" +        DefKey Off, P4, TeachFrs, "" + +        DefKey On, P5, TeachFrs, "Frs MoveCX +"     ; X+ +        DefKey On, P5, TeachFrs, "Frs MoveCX -"     ; X- +        DefKey On, P5, TeachFrs, "Frs MoveCY +"     ; Y+ +        DefKey On, P5, TeachFrs, "Frs MoveCY -"     ; Y- +        DefKey On, P5, TeachFrs, "Frs MoveCZ +"     ; Z+ +        DefKey On, P5, TeachFrs, "Frs MoveCZ -"     ; Z- +        DefKey On, P5, TeachFrs, "Frs MoveCV +"     ; Schraubstock auf +        DefKey On, P5, TeachFrs, "Frs MoveCV -"     ; Schraubstock zu + +        DefKey Off, P5, TeachFrs, "Frs StopCX +" +        DefKey Off, P5, TeachFrs, "Frs StopCX -" +        DefKey Off, P5, TeachFrs, "Frs StopCY +" +        DefKey Off, P5, TeachFrs, "Frs StopCY -" +        DefKey Off, P5, TeachFrs, "Frs StopCZ +" +        DefKey Off, P5, TeachFrs, "Frs StopCZ -" +        DefKey Off, P5, TeachFrs, "Frs StopCV +" +        DefKey Off, P5, TeachFrs, "Frs StopCV -" + +; +; ***************************************************************************** diff --git a/tests/t_mic51/defModul.inc b/tests/t_mic51/defModul.inc new file mode 100644 index 0000000..98682ca --- /dev/null +++ b/tests/t_mic51/defModul.inc @@ -0,0 +1,18 @@ +; **************************************************************************** +; Definition der Modulnamen +; Format: +;      defModul <Modulname>, <Netzwerkadressse> +; +; Dem <Modulname> wird eine eindeutige Zahl zugeordnet. +; +       defModul  Rob,        uC_Rob +       defModul  Frs,        uC_Frs +       defModul  TeachRob,   uC_Teach_Rob +       defModul  TeachFrs,   uC_Teach_Frs +       defModul  TeachKey,   uC_Teach_Key +       defModul  MemRob,     uC_Teach_Rob +       defModul  MemFrs,     uC_Teach_Frs +       defModul  PC_SIO,     uC_PC_SIO + +; +; **************************************************************************** diff --git a/tests/t_mic51/defMsg.inc b/tests/t_mic51/defMsg.inc new file mode 100644 index 0000000..420c19e --- /dev/null +++ b/tests/t_mic51/defMsg.inc @@ -0,0 +1,141 @@ +; **************************************************************************** +; Definition der Parameter - Pattern +; +;NoParamSingle +;ParamSingle1 +;ParamSingle2 +;ParamSingle3 +;ParamSingle4 +;ParamSingle5 +;ParamSingle6 + +; +; **************************************************************************** +; Definition der Messages +; Format: +;      DefMsg <Modul>, <MsgName>, <Anzahl Parameter>, <Parameter - Pattern> +; +    DefMsg Rob, MoveAB          , 1, NoParamSingle +    DefMsg Rob, MoveAS          , 1, NoParamSingle +    DefMsg Rob, MoveAE          , 1, NoParamSingle +    DefMsg Rob, MoveARW         , 1, NoParamSingle +    DefMsg Rob, MoveALW         , 1, NoParamSingle +    DefMsg Rob, MoveAH          , 1, NoParamSingle +    DefMsg Rob, MoveAPos1       , 3, NoParamSingle +    DefMsg Rob, MoveAPos2       , 3, NoParamSingle +    DefMsg Rob, MoveRB          , 1, NoParamSingle +    DefMsg Rob, MoveRS          , 1, NoParamSingle +    DefMsg Rob, MoveRE          , 1, NoParamSingle +    DefMsg Rob, MoveRRW         , 1, NoParamSingle +    DefMsg Rob, MoveRLW         , 1, NoParamSingle +    DefMsg Rob, MoveRH          , 1, NoParamSingle +    DefMsg Rob, MoveRPos1       , 3, NoParamSingle +    DefMsg Rob, MoveRPos2       , 3, NoParamSingle +    DefMsg Rob, MoveCBL         , 0, NoParamSingle +    DefMsg Rob, MoveCBR         , 0, NoParamSingle +    DefMsg Rob, StopCB          , 0, NoParamSingle +    DefMsg Rob, MoveCSU         , 0, NoParamSingle +    DefMsg Rob, MoveCSD         , 0, NoParamSingle +    DefMsg Rob, StopCS          , 0, NoParamSingle +    DefMsg Rob, MoveCEU         , 0, NoParamSingle +    DefMsg Rob, MoveCED         , 0, NoParamSingle +    DefMsg Rob, StopCE          , 0, NoParamSingle +    DefMsg Rob, MoveCHU         , 0, NoParamSingle +    DefMsg Rob, MoveCHD         , 0, NoParamSingle +    DefMsg Rob, StopCHP         , 0, NoParamSingle +    DefMsg Rob, MoveCHL         , 0, NoParamSingle +    DefMsg Rob, MoveCHR         , 0, NoParamSingle +    DefMsg Rob, StopCHT         , 0, NoParamSingle +    DefMsg Rob, MoveCHO         , 0, NoParamSingle +    DefMsg Rob, MoveCHC         , 0, NoParamSingle +    DefMsg Rob, StopCH          , 0, NoParamSingle +    DefMsg Rob, RobVelocity     , 1, ParamSingle1 +    DefMsg Rob, RobGoHome       , 0, NoParamSingle +    DefMsg Rob, SetHome         , 0, NoParamSingle +    DefMsg Rob, GibPos1         , 2, ParamSingle1+ParamSingle2 +    DefMsg Rob, GibPos2         , 2, ParamSingle1+ParamSingle2 +    DefMsg Rob, RobGibReady     , 2, ParamSingle1+ParamSingle2 +    DefMsg Rob, RobInit         , 0, NoParamSingle +    DefMsg Rob, RobDeInit       , 0, NoParamSingle + +    DefMsg Frs, Init            , 0, NoParamSingle +    DefMsg Frs, DeInit          , 0, NoParamSingle +    DefMsg Frs, MoveCX          , 1, ParamSingle1 +    DefMsg Frs, MoveCY          , 1, ParamSingle1 +    DefMsg Frs, MoveCZ          , 1, ParamSingle1 +    DefMsg Frs, MoveCV          , 1, ParamSingle1 +    DefMsg Frs, StopCX          , 1, ParamSingle1 +    DefMsg Frs, StopCY          , 1, ParamSingle1 +    DefMsg Frs, StopCZ          , 1, ParamSingle1 +    DefMsg Frs, StopCV          , 1, ParamSingle1 +    DefMsg Frs, FrsVelocity     , 1, ParamSingle1 +    DefMsg Frs, FrsVelocityDraw , 1, ParamSingle1 +    DefMsg Frs, FrsGoHome       , 0, NoParamSingle +    DefMsg Frs, RefFahrt        , 0, NoParamSingle +    DefMsg Frs, SetDrillRef     , 0, NoParamSingle +    DefMsg Frs, SetPieceRef     , 3, NoParamSingle +    DefMsg Frs, MoveX           , 1, NoParamSingle +    DefMsg Frs, MoveY           , 1, NoParamSingle +    DefMsg Frs, MoveZ           , 1, NoParamSingle +    DefMsg Frs, MoveAPos        , 3, NoParamSingle +    DefMsg Frs, MoveRX          , 1, NoParamSingle +    DefMsg Frs, MoveRY          , 1, NoParamSingle +    DefMsg Frs, MoveRZ          , 1, NoParamSingle +    DefMsg Frs, MoveRV          , 1, NoParamSingle +    DefMsg Frs, MoveRPos        , 3, NoParamSingle +    DefMsg Frs, MoveVOpen       , 0, NoParamSingle +    DefMsg Frs, MoveVClose      , 0, NoParamSingle +    DefMsg Frs, MoveV           , 1, NoParamSingle +    DefMsg Frs, GoPieceRefPos   , 0, NoParamSingle +    DefMsg Frs, MovePR          , 3, NoParamSingle +    DefMsg Frs, Drill           , 1, ParamSingle1 +    DefMsg Frs, SetMasterAdress , 3, ParamSingle1+ParamSingle2+ParamSingle3 +    DefMsg Frs, GibFrsPos1      , 2, ParamSingle1+ParamSingle2 +    DefMsg Frs, GibFrsPos2      , 2, ParamSingle1+ParamSingle2 +    DefMsg Frs, GibPosP         , 2, ParamSingle1+ParamSingle2 +    DefMsg Frs, GibStatus       , 2, ParamSingle1+ParamSingle2 +    DefMsg Frs, GibReady        , 3, ParamSingle1+ParamSingle2+ParamSingle3 + +    DefMsg MemRob,LoadRob,0, NoParamSingle +    DefMsg MemRob,SaveRob,0, NoParamSingle +    DefMsg MemRob,StartRobRun,0, NoParamSingle +    DefMsg MemRob,StoreRobPos,0, NoParamSingle +    DefMsg MemRob,StoreRobSync,0, NoParamSingle +    DefMsg MemRob,StoreRobReady,0, NoParamSingle +    DefMsg MemRob,InitRobTeach,0, NoParamSingle +    DefMsg MemRob,DeinitRobTeach,0, NoParamSingle +    DefMsg MemRob,ClearRobTeach,0, NoParamSingle +    DefMsg MemRob,ResetRobTeach,0, NoParamSingle +    DefMsg MemRob,GetRobSync,1,ParamSingle1 +    DefMsg MemRob,GetRobReady,0, NoParamSingle +    DefMsg MemRob,RobPos1,3, NoParamSingle +    DefMsg MemRob,RobPos2,3, NoParamSingle +    DefMsg MemRob,DebugRob,0, NoParamSingle + +    DefMsg MemFrs,LoadFrs,0, NoParamSingle +    DefMsg MemFrs,SaveFrs,0, NoParamSingle +    DefMsg MemFrs,StartFrsRun,0, NoParamSingle +    DefMsg MemFrs,StoreFrsPos,0, NoParamSingle +    DefMsg MemFrs,StoreFrsSync,0, NoParamSingle +    DefMsg MemFrs,StoreFrsReady,0, NoParamSingle +    DefMsg MemFrs,StoreFrsPieceRef,0, NoParamSingle +    DefMsg MemFrs,StoreFrsTiefe,0, NoParamSingle +    DefMsg MemFrs,StoreFrsDrill,0, NoParamSingle +    DefMsg MemFrs,InitFrsTeach,0, NoParamSingle +    DefMsg MemFrs,DeinitFrsTeach,0, NoParamSingle +    DefMsg MemFrs,ClearFrsTeach,0, NoParamSingle +    DefMsg MemFrs,ResetFrsTeach,0, NoParamSingle +    DefMsg MemFrs,GetFrsSync,1,ParamSingle1 +    DefMsg MemFrs,GetFrsReady,0, NoParamSingle +    DefMsg MemFrs,FrsPos1,3, NoParamSingle +    DefMsg MemFrs,FrsPos2,3, NoParamSingle +    DefMsg MemFrs,FrsPieceRef,3, NoParamSingle +    DefMsg MemFrs,FrsTiefe,3, NoParamSingle +    DefMsg MemFrs,GetFrsError,1, ParamSingle1 +    DefMsg MemFrs,GetFrsWarning,1, ParamSingle1 +    DefMsg MemFrs,DebugFrs,0, NoParamSingle + +    DefMsg TeachFrs,Bug,0,NoParamSingle + +; +; **************************************************************************** diff --git a/tests/t_mic51/defParam.inc b/tests/t_mic51/defParam.inc new file mode 100644 index 0000000..8d7e9d5 --- /dev/null +++ b/tests/t_mic51/defParam.inc @@ -0,0 +1,46 @@ +; ***************************************************************************** +; Definition der Parameter +; Format: +;      DefParam <Parametername>, <Wert>, <String> +; soll der String gleichlautend wie der Parametername sein dann reicht "" +; + +       DefParam On,      001H, "" +       DefParam Off,     000H, "" +       DefParam Plus,    001H, "+" +       DefParam Minus,   000H, "-" +       DefParam Fast,    001H, "" +       DefParam Slow,    000H, "" +       DefParam Superslow, 002H, "" + +;      Hier kommen die Warning-Codes fr die Fr„se + +       DefParam Queue_Warning,             081H, "Queue Warning" + +;      Hier kommen die Error-Codes fr die Fr„se + +       DefParam Queue_Full,                061H, "Queue Full" +       DefParam Undef_Par,                 062H, "Undefined Parameter" +       DefParam Undef_Piece_Ref,           063H, "Undefined Piece Reference" +       DefParam Undef_Drill_Ref,           064H, "Undefined Drill Reference" +       DefParam Undef_Koord_Ref,           065H, "Undefined Koord Reference" +       DefParam Internal_Error,            066H, "Internal Error" + +       DefParam End_X_Plus,                067H, "Software End X+" +       DefParam End_Y_Plus,                068H, "Software End Y+" +       DefParam End_Z_Plus,                069H, "Software End Z+" +       DefParam End_V_Plus,                06AH, "Software End V+" +       DefParam End_X_Minus,               070H, "Software End X-" +       DefParam End_Y_Minus,               071H, "Software End Y-" +       DefParam End_Z_Minus,               072H, "Software End Z-" +       DefParam End_V_Minus,               073H, "Software End V-" + +       DefParam Hard_End_X_Plus,           074H, "Hardware End X+" +       DefParam Hard_End_Y_Plus,           075H, "Hardware End Y+" +       DefParam Hard_End_Z_Plus,           076H, "Hardware End Z+" +       DefParam Hard_End_V_Plus,           077H, "Hardware End V+" +       DefParam Hard_End_X_Minus,          078H, "Hardware End X-" +       DefParam Hard_End_Y_Minus,          079H, "Hardware End Y-" +       DefParam Hard_End_Z_Minus,          07AH, "Hardware End Z-" +       DefParam Hard_End_V_Minus,          07BH, "Hardware End V-" +; ***************************************************************************** diff --git a/tests/t_mic51/defgequ.inc b/tests/t_mic51/defgequ.inc new file mode 100644 index 0000000..c77f9b1 --- /dev/null +++ b/tests/t_mic51/defgequ.inc @@ -0,0 +1,48 @@ +; **************************************************************************** +; EQU - Anweisungen fuer alle Module +; **************************************************************************** + +        ifndef defgequ_inc +defgequ_inc             equ 000H + +; ---------------------------------------------------------------------------- +StringEnde              equ 000H +TableEnd                equ 0FFH +TableAnf                equ 0FEH +Rob_NextMsg             set 001H +Frs_NextMsg             set 001H +TeachRob_NextMsg        set 001H +TeachFrs_NextMsg        set 001H +MemRob_NextMsg          set 001H +MemFrs_NextMsg          set 001H +NextModul               set 010H        ; Modul < 10H : = Message from PC!! +                                        ; Doku beachten. +; ---------------------------------------------------------------------------- +; Definition der Netzwerkadressen +; +uC_Rob          equ       001H    ; Microcontroller des Roboters +uC_Frs          equ       002H    ; Microcontroller der Fraese +uC_Teach_Rob    equ       003H    ; Microcontroller Teach-In Roboter +uC_Teach_Frs    equ       004H    ; Microcontroller Teach-In Fraese +uC_Teach_Key    equ       005H    ; Microcontroller Teach-In Tastatur + +uC_PC_SIO       equ       00EH    ; Microcontroller PC + +; ---------------------------------------------------------------------------- + +          elseif +            fatal "Die Datei DEFGEQU.INC ist mehrmals eingebunden" +          endif + +; ---------------------------------------------------------------------------- + +NoParamSingle  equ 000H +ParamSingle1   equ 001H +ParamSingle2   equ 002H +ParamSingle3   equ 004H +ParamSingle4   equ 008H +ParamSingle5   equ 010H +ParamSingle6   equ 020H + +; +; **************************************************************************** diff --git a/tests/t_mic51/defint.inc b/tests/t_mic51/defint.inc new file mode 100644 index 0000000..2ea07c5 --- /dev/null +++ b/tests/t_mic51/defint.inc @@ -0,0 +1,234 @@ +;**************************************************************************** +; Definition der Interrupts und des Timers 2 +; + +Falling_Edge    EQU     True +Low_Level       EQU     False +Negative_Trans  EQU     False +Positive_Trans  EQU     True + +Param_On        EQU     True +Param_Off       EQU     False + +Nope            EQU     False + +Tm2_Off         EQU     0               ; +Tm2_Timer       EQU     1               ; Input selection +Tm2_Counter     EQU     2               ; +Tm2_Gated       EQU     3               ; + +Tm2_Reload_Off  EQU     0               ; +Tm2_Reload_Ov   EQU     2               ; Reload mode +Tm2_Reload_Ext  EQU     3               ; + +Tm2_Comp_Mode0  EQU     False           ; Compare mode +Tm2_Comp_Mode1  EQU     True            ; + +Tm2_Slow        EQU     True            ; Prescaler selection +Tm2_Normal      EQU     False           ; + +Tm2_CC_Off      EQU     0 +Tm2_CC_Capt_Ext EQU     1 +Tm2_CC_Comp_On  EQU     2 +Tm2_CC_Capt_CRCL EQU    3 + +;----------------------------------------------------------------------------- + +Init_Interrupt  MACRO   PInterrupt, PTrig, PState +                IFNDEF PInterrupt +                  FATAL "unbekannter Interrupt" +                ELSEIF + +                  SWITCH PInterrupt +                  CASE INT0_VEKTOR              ; INT0 +                  IF PTrig +                    SETB        IT0 +                  ELSEIF +                    CLR         IT0 +                  ENDIF + +                  CASE INT1_VEKTOR              ; INT1 +                  IF PTrig +                    SETB        IT1 +                  ELSEIF +                    CLR         IT1 +                  ENDIF + +                  CASE INT2_VEKTOR              ; INT2 +                  IF PTrig +                    SETB        I2FR +                  ELSEIF +                    CLR         I2FR +                  ENDIF + +                  CASE INT3_VEKTOR              ; INT3 +                  IF PTrig +                    SETB        I3FR +                  ELSEIF +                    CLR         I3FR +                  ENDIF + +                  ELSECASE +                  ENDCASE + +                  IF PState +                    Int_On      PInterrupt +                  ELSEIF +                    Int_Off     PInterrupt +                  ENDIF + +                ENDIF +                ENDM + + +;----------------------------------------------------------------------------- + +Int_On          MACRO   PInterrupt +                IFNDEF PInterrupt +                  FATAL "unbekannter Interrupt" +                ELSEIF +                  SWITCH PInterrupt +                  CASE INT0_VEKTOR +                    CLR         IE0 +                    SETB        EX0 +                  CASE ICT0_VEKTOR +                    CLR         TF0 +                    SETB        ET0 +                  CASE INT1_VEKTOR +                    CLR         IE1 +                    SETB        EX1 +                  CASE ICT1_VEKTOR +                    CLR         TF1 +                    SETB        ET1 +                  CASE ICT2_VEKTOR +                    CLR         TF2 +                    CLR         EXF2 +                    SETB        ET2 +                  CASE AD_I_VEKTOR +                    CLR         IADC +                    SETB        EADC +                  CASE INT2_VEKTOR +                    CLR         IEX2 +                    SETB        EX2 +                  CASE INT3_VEKTOR +                    CLR         IEX3 +                    SETB        EX3 +                  CASE INT4_VEKTOR +                    CLR         IEX4 +                    SETB        EX4 +                  CASE INT5_VEKTOR +                    CLR         IEX5 +                    SETB        EX5 +                  CASE INT6_VEKTOR +                    CLR         IEX6 +                    SETB        EX6 +                  ENDCASE +                ENDIF +                ENDM + +;----------------------------------------------------------------------------- + +Int_Off         MACRO   PInterrupt +                IFNDEF PInterrupt +                  FATAL "unbekannter Interrupt" +                ELSEIF +                  SWITCH PInterrupt +                  CASE INT0_VEKTOR +                    CLR         EX0 +                    CLR         IE0 +                  CASE ICT0_VEKTOR +                    CLR         ET0 +                    CLR         TF0 +                  CASE INT1_VEKTOR +                    CLR         EX1 +                    CLR         IE1 +                  CASE ICT1_VEKTOR +                    CLR         ET1 +                    CLR         TF1 +                  CASE ICT2_VEKTOR +                    CLR         ET2 +                    CLR         TF2 +                    CLR         EXF2 +                  CASE AD_I_VEKTOR +                    CLR         EADC +                    CLR         IADC +                  CASE INT2_VEKTOR +                    CLR         EX2 +                    CLR         IEX2 +                  CASE INT3_VEKTOR +                    CLR         EX3 +                    CLR         IEX3 +                  CASE INT4_VEKTOR +                    CLR         EX4 +                    CLR         IEX4 +                  CASE INT5_VEKTOR +                    CLR         EX5 +                    CLR         IEX5 +                  CASE INT6_VEKTOR +                    CLR         EX6 +                    CLR         IEX6 +                  ENDCASE +                ENDIF +                ENDM + +;----------------------------------------------------------------------------- + +Init_Timer2     MACRO   PInput, PReloadMode, PCompareMode, PPrescaler, PReloadValue + +                SWITCH  PInput +                CASE    Tm2_Off +                  CLR           T2I1 +                  CLR           T2I0 +                CASE    Tm2_Timer +                  CLR           T2I1 +                  SETB          T2I0 +                CASE    Tm2_Counter +                  SETB          T2I1 +                  CLR           T2I0 +                CASE    Tm2_Gated +                  SETB          T2I1 +                  SETB          T2I0 +                ENDCASE + +                SWITCH  PReloadMode +                CASE    Tm2_Reload_Off +                  CLR           T2R1 +                  CLR           T2R0 +                CASE    Tm2_Reload_Ov +                  SETB          T2R1 +                  CLR           T2R0 +                CASE    Tm2_Reload_Ext +                  SETB          T2R1 +                  SETB          T2R0 +                ENDCASE + +                IF      PCompareMode +                  SETB          T2CM +                ELSEIF +                  CLR           T2CM +                ENDIF + +                IF      PPrescaler +                  SETB          T2PS +                ELSEIF +                  CLR           T2PS +                ENDIF + +                MOV             CRCL, #(PReloadValue # 256) +                MOV             CRCH, #(PReloadValue / 256) + +                ENDM + + + +Init_Comp_Timer2  MACRO   PMode1, PMode2, PMode3, PValue1, PValue2, PValue3 + +                MOV     CCEN, #(PMode1*4+PMode2*16+PMode3*64) +                MOV     CCL1, #(PValue1 # 256) +                MOV     CCH1, #(PValue1 / 256) +                MOV     CCL2, #(PValue1 # 256) +                MOV     CCH2, #(PValue1 / 256) +                MOV     CCL3, #(PValue1 # 256) +                MOV     CCH3, #(PValue1 / 256) + +                ENDM diff --git a/tests/t_mic51/defmacro.inc b/tests/t_mic51/defmacro.inc new file mode 100644 index 0000000..f5b710d --- /dev/null +++ b/tests/t_mic51/defmacro.inc @@ -0,0 +1,175 @@ + +; *************************************************************************** +; Definition einer Tabelle aus den MSG - Includedateien + +Create_IncOffsTab macro TabName, IncDatei +TabName_Tab:  label   $ +FStr:         db      TableAnf +              db      FStrEnd - FStr, StringEnde, FStrEnd - FStr +FStrEnd: +              include IncDatei +TabName_Tend:  label   $ +              db      TableEnd +              endm + + +Create_IncTab macro TabName, IncDatei +TabName_Tab:  label   $ +              include IncDatei +TabName_Tend:  label   $ +              endm + + +Create_IncKeyTab macro State, Port, Modul, IncDatei +Key_Counter   set 0 +State_Port_Modul_Tab:  label   $ +             include IncDatei +State_Port_Modul_Tend:  label   $ +             if Key_Counter <> 8 +                fatal "Inkorrekte Anzahl von Elementen in Key-Tabelle" +             endif +           endm + + +Create_MsgJmpTab macro Modul, IncDatei +Modul_MsgCall_Tab:      label   $ +                 include IncDatei +Modul_MsgCall_Tend:     label   $ +                 db      TableEnd +                 endm + + + +; *************************************************************************** +; + +DefModul macro Modul, NetAdr + +   ifndef Modul +Modul     equ  NextModul +Net_Modul equ  NetAdr +NextModul set  NextModul + 1 + +     SHARED Modul,NetAdr + +   endif + +   ifdef ModulNetAdr_Tab +     ifndef ModulNetAdr_TEND +       if (ModulNetAdr_Tab + Modul - $) < 0 +           Fatal "NetAdr Tabelle inkonsistent" +         elseif +           org ModulNetAdr_Tab + Modul +         endif + +        db NetAdr +      endif +    endif + +; ------------------------- + +   ifdef ModulStr_Tab +     ifndef ModulStr_TEnd + +strdef:   db Modul, strdefnext - strdef, "MODUL", StringEnde, strdefnext - strdef +strdefnext: + +       endif +     endif + +   endm + +; +; *************************************************************************** +; + +DefParam macro Param, Wert, String + +   ifndef Param +Param     equ Wert + +     SHARED Param + +   endif + +   ifdef ParamStr_Tab +     ifndef ParamStr_TEnd +strdef:   db Wert +          db strdefnext - strdef +          if String = "" +              db "PARAM", StringEnde +            elseif +              db String,  StringEnde +            endif +strdefnext: +       endif +     endif + +   endm + +; +; *************************************************************************** +; + +DefKey macro Status, Port, Modul, String + +   ifdef Status_Port_Modul_Tab +     ifndef Status_Port_Modul_TEnd +strdef:   db strdefnext - strdef +          db String,StringEnde +strdefnext: +Key_Counter  set  Key_Counter + 1 +     endif +   endif + +   endm + +; +; *************************************************************************** +; + +DefMsg  macro Modul, MsgName, ParamCount, ParamPattern + +; --------------------------------------------------------------------------- +; Definition der Message-Nummern + +      ifndef MsgName +MsgName        equ  Modul_NextMsg +Modul_NextMsg  set  Modul_NextMsg + 1 + +        SHARED  MsgName + +      endif +; --------------------------------------------------------------------------- +; Aufbau der Tabelle fuer den Message-Handler + +  ifdef Modul_MsgCall_Tab +    ifndef Modul_MsgCall_Tend +      if (Modul_MsgCall_Tab + (2 * MsgName) - $) < 0 +          Fatal "Msg-Call Tabelle inkonsistent" +        elseif +          org Modul_MsgCall_Tab + (2 * MsgName) +        endif + +        db Adr_MsgName # 256 +        db Adr_MsgName / 256 +      endif +    endif + +; --------------------------------------------------------------------------- +; Aufbau der Stringtabelle + +  ifdef MsgStr_Tab +    ifndef MsgStr_TEnd + +strdef: db Modul, strdefnext - strdef, MsgName, "MSGNAME", StringEnde, ParamCount, ParamPattern +        db strdefnext - strdef +strdefnext: +      endif +    endif + +        endm +; +; *************************************************************************** + + diff --git a/tests/t_mic51/net_lcd.inc b/tests/t_mic51/net_lcd.inc new file mode 100644 index 0000000..6a0cabc --- /dev/null +++ b/tests/t_mic51/net_lcd.inc @@ -0,0 +1,33 @@ +; D:\USER\MEM\NET_LCD.ASM-Includefile fr Assembler-Programm +LCD_HOME equ 0108H +LCD_CR equ 0126H +LCD_LF equ 0172H +LCD_CLEAR equ 01C0H +LCD_WRITE_CHAR equ 01DEH +LCD_WRITE_STRING equ 01FAH +LCD_SET_DD_RAM_ADDRESS equ 022AH +LCD_STATUS equ 0248H +LCD_CURSER_ONOFF equ 025BH +SET_MY_ADRESS equ 061DH +SET_CALLBACK_ADRESS equ 0622H +READ_STATUS equ 0629H +READ_MESSAGE equ 063AH +READ_SPECIAL_MESSAGE equ 0662H +SEND_MESSAGE equ 0693H +INT0_VEKTOR equ 0FF00H +ICT0_VEKTOR equ 0FF03H +INT1_VEKTOR equ 0FF06H +ICT1_VEKTOR equ 0FF09H +ICT2_VEKTOR equ 0FF0CH +AD_I_VEKTOR equ 0FF0FH +INT2_VEKTOR equ 0FF12H +INT3_VEKTOR equ 0FF15H +INT4_VEKTOR equ 0FF18H +INT5_VEKTOR equ 0FF1BH +INT6_VEKTOR equ 0FF1EH +DATA_START equ 03CH +X_DATA_START equ 010H +I_DATA_START equ 080H +BIT_DATA_START equ 0BH +CODE_START equ 01000H +; Ende Includefile fr Assembler-Programm diff --git a/tests/t_mic51/t_mic51.asm b/tests/t_mic51/t_mic51.asm new file mode 100644 index 0000000..ce29ab1 --- /dev/null +++ b/tests/t_mic51/t_mic51.asm @@ -0,0 +1,2197 @@ +;Program:               TEACH-IN EINHEIT +; +;Autor:                 Laurent Savary +; +;Datum:                 9.5.94 +; +;letze Aenderung:       23.6.94 +; +; +;Dateiname: TEACHIN.ASM +; +;------------------------------------------------------------------------------ + +Init_Vektor     macro Vektor,Routine + +;        mov Vektor+0,#(Routine/256)             ;der Interruptvektor wird +;        mov Vektor+1,#(Routine#256)             ;ins interne RAM geladen + +        push acc +        push dph +        push dpl +        mov dptr,#Vektor +        mov a,#00000010b                ; LJMP +        movx @dptr,a +        inc dptr +        mov a,#(Routine/256) +        movx @dptr,a +        inc dptr +        mov a,#(Routine#256) +        movx @dptr,a +        pop dpl +        pop dph +        pop acc +  +                endm + +DEC_DPTR        MACRO +                INC DPL +                DJNZ DPL,DEC_DPTR1 +                DEC DPH +DEC_DPTR1:      DEC DPL +                ENDM + + +INC_R0R1        MACRO +                INC     R0 +                INC     R0 +                DJNZ R0,INC_R0R1_End +                INC     R1 +INC_R0R1_End: +                ENDM + + +DEC_R0R1:       MACRO +                INC R0 +                DJNZ R0,DEC_R0R1_End +                DEC R1 +DEC_R0R1_End:   DEC R0 +                ENDM + +;--------------------------------------------------------------------- + +post_Message macro +        push acc +SEND_NET1: LCALL READ_STATUS +        JB ACC.1,SEND_NET1 +        pop acc +        LCALL SEND_MESSAGE +        endm + +Take_Message macro +        push acc +RECEIVE_NET1: LCALL READ_STATUS +        JNB ACC.0,RECEIVE_NET1 +        pop acc +        LCALL READ_MESSAGE +        endm + +;------------------------------------------------------------------------------ + +        cpu 80515 +        include stddef51.inc +        include net_lcd.inc +        include defint.inc +        include defgequ.inc +        include defmacro.inc + +        USING   0 + +;------------------------ Konstanten ------------------------------------------ + +Ass_Keyboard_Only       EQU     False           ; Wenn True, TI-Einheit lauft nur mit +                                                ; der Tastatur (kein Tastenfeld) + +Last_Code       EQU     0FFFFh  ; Endeadressen +Last_Bit_Data   EQU     07Fh    ; der Speicher- +Last_Data       EQU     07Fh    ; bereiche +Last_IData      EQU     0FFh    ; bestimmen +Last_XData      EQU     0FFFFh + +Kb_Max_Length   EQU     40                      ; Hoechstlaenge der anzuzeigenden Strings +TI_Sample_Valid_Time    EQU     30              ; Gueltige Druckdauer in ms + +ASCII_Space     EQU     32                      ; +ASCII_Left      EQU     19                      ; +ASCII_Right     EQU     4                       ; +ASCII_Up        EQU     5                       ; +ASCII_Down      EQU     24                      ; ASCII-Code fuer die +ASCII_CR        EQU     13                      ; Tastatur +ASCII_Esc       EQU     27                      ; +ASCII_DEL       EQU     127                     ; +ASCII_BkSpc     EQU     8                       ; +ASCII_LWord     EQU     1                       ; +ASCII_RWord     EQU     6                       ; +ASCII_Search    EQU     12                      ; + +KSS_Off         EQU     0 +KSS_Mod         EQU     1 +KSS_Mod_Top     EQU     2 +KSS_Mod_Bot     EQU     3 +KSS_Msg         EQU     4 +KSS_Msg_Top     EQU     5 +KSS_Msg_Bot     EQU     6 +KSS_Inc_Mod     EQU     7 +KSS_No_Choice   EQU     8 + +R0_Bk1          EQU     08h +R1_Bk1          EQU     09h +R2_Bk1          EQU     0Ah +R3_Bk1          EQU     0Bh +R4_Bk1          EQU     0Ch +R5_Bk1          EQU     0Dh +R6_Bk1          EQU     0Eh +R7_Bk1          EQU     0Fh + +;------------------------------------------------------------------------------ + +        segment data +        org Data_Start + +Save_P4         DB      ?               ; +Save_P5         DB      ?               ; +Old_P4          DB      ?               ; +Old_P5          DB      ?               ; +Temp_P4         DB      ?               ; benoetigte Variablen fuer +Temp_P5         DB      ?               ; Teach_In_Sampler +TI_On_P4        DB      ?               ; +TI_Off_P4       DB      ?               ; +TI_On_P5        DB      ?               ; +TI_Off_P5       DB      ?               ; +TI_Sample_Counter DB    ?               ; + +Text_Dec_Status DB      ? +Kb_Char_Buffer  DB      ? +Kb_Str_Pointer  DB      ? +Kb_Cursor       DB      ? +ASCII_Low_Byte  DB      ? +ASCII_High_Byte DB      ? +Rcv_Msg_Length  DB      ? +My_Slave_Adr    DB      ?               ; Physikalische Adresse dieses Moduls + +Kb_Search_Status DB     ?               ; +Kb_Search_DPL   DB      ?               ; +Kb_Search_DPH   DB      ?               ; Benoetigte Variablen fuer +KS_Actual_Word  DB      ?               ; Keyboard Search +KS_Actual_Module DB     ?               ; +KS_Cursor       DB      ?               ; + +Stat_Code       DB      ?               ; +Stat_Address    DB      ?               ; +Stat_Num_Param  DB      ?               ; Benoetigte Variablen fuer +Stat_Picture    DB      ?               ; Text_Decoder +Stat_Module     DB      ?               ; +Stat_Length     DB      ?               ; + +                if $ > Last_Data +                  then fatal "Data-Bereichgrenze ueberschritten" +                endif + + +;------------------------------------------------------------------------------ + +        segment xdata +        org X_Data_Start + +Kb_Str_Buffer   DB      Kb_Max_Length dup (?)   ; Text Buffer (fuer die Tastatur) +Token_Str       DB      Kb_Max_Length dup (?)   ; Ergebnis von Get_Token +Net_Rcv_Str     DB      Kb_Max_Length dup (?)   ; Empfangene Message vom Teach-In Modul + +                 if $ > Last_XData +                  then fatal "XData-Bereichgrenze ueberschritten" +                endif + +;------------------------------------------------------------------------------ + +        segment idata +        org I_Data_Start + +Msg_Registers   DB      8  dup (?)      ; Register-Buffer fur die zu sendenden Messages + +                 if $ > Last_IData +                  then fatal "IData-Bereichgrenze ueberschritten" +                endif + + +;------------------------------------------------------------------------------ + +        segment bitdata +        org Bit_Data_Start + +Kb_Str_Ready    DB      ?               ; -> Text_Decoder +Kb_Char_Ready   DB      ?               ; -> Keyb_Controller +TI_Sample_Chg_Flg DB    ?               ; -> TeachIn_Decoder +TD_Status_Ready DB      ?               ; -> LCD_Controller +TD_Send_Ready   DB      ?               ; -> Send_Manager +Receive_Ready   DB      ?               ; -> Receive_Manager +TD_Next_Flg     DB      ?               ; -> Kb_Controller +KS_Status_Ready DB      ?               ; -> LCD_Controller +KS_Active_Flg   DB      ?               ; -> KB_Search_Up / _Down +Kb_Dsp_Ready    DB      ?               ; -> LCD_Controller +Ext_Dsp_Ready   DB      ?               ; -> LCD_Controller +System_Error    DB      ? +Sys_Robot_Mode  DB      ? +Sys_Keyboard_Mode DB    ? +TID_Done_Flg    DB      ?               ; -> TeachIn_Sampler + +                if $ > Last_Bit_Data +                  then fatal "Bit_Data-Bereichgrenze ueberschritten" +                endif + + +;------------------------------------------------------------------------------ + +        segment code +        org Code_Start + +;====================== H A U P T P R O G R A M M ============================= + +        segment code + +Main_Prog:      CLR     EAL                     ;alle Interrupts sperren +                MOV     SP,#Stack-1             ;Stackpointer setzen + +                LCALL   Init_Data +                LCALL   Init_IData +                LCALL   Init_BitData +                LCALL   Init_XData +                LCALL   Init_Timer +                LCALL   Init_Mode +Main_Error:     JB      System_Error,Main_Error + +                LCALL   Init_Net +                LCALL   LCD_Clear +                MOV     A,#1 +                LCALL   LCD_Curser_OnOff +                LCALL   Init_Int +                SETB    EAL + +                CLR TESTBIT +                CLR MSG +                MOV Sp_MSG_Buffer,#0 +                CLR Sp_MSG +                LCALL INIT_TEACH +                LCALL INIT_RUN +                LCALL RESET_TEACH +                LCALL INIT_FRS + +Main_Loop:      LCALL   Main_Manager +                LCALL   Main_Event_Loop +                SJMP    Main_Loop + + +;------------------------------------------------------------------------------ + +Adr_Table:      Create_IncTab       ModulNetAdr, "defModul.inc" +Module_Table:   Create_IncOffsTab   ModulStr,    "defModul.inc" +Symbol_Table:   Create_IncOffsTab   ParamStr,    "defParam.inc" +Stat_Table:     Create_IncOffsTab   MsgStr,      "defMsg.inc" + +KOn_P4_Rob:     Create_IncKeyTab       On,  P4, TeachRob, "defKey.inc" +KOff_P4_Rob:    Create_IncKeyTab       Off, P4, TeachRob, "defKey.inc" +KOn_P5_Rob:     Create_IncKeyTab       On,  P5, TeachRob, "defKey.inc" +KOff_P5_Rob:    Create_IncKeyTab       Off, P5, TeachRob, "defKey.inc" +KOn_P4_Frs:     Create_IncKeyTab       On,  P4, TeachFrs, "defKey.inc" +KOff_P4_Frs:    Create_IncKeyTab       Off, P4, TeachFrs, "defKey.inc" +KOn_P5_Frs:     Create_IncKeyTab       On,  P5, TeachFrs, "defKey.inc" +KOff_P5_Frs:    Create_IncKeyTab       Off, P5, TeachFrs, "defKey.inc" + +;-------------------------------------------------------------------------- +        include t_mod1.asm              ; +;------------------------------------------------------------------------------ + +Main_Manager:   JNB     Kb_Char_Ready,MM_Txt_Dec +                LCALL   Keyb_Controller + +MM_Txt_Dec:     JNB     Kb_Str_Ready,MM_TI_Dec +                LCALL   Text_Decoder + +MM_TI_Dec:      JNB     TI_Sample_Chg_Flg,MM_Send_Mng +                LCALL   TeachIn_Decoder + +MM_Send_Mng:    JNB     TD_Send_Ready,MM_Receive_Mng +                LCALL   Send_Manager + +MM_Receive_Mng: JNB     Receive_Ready,MM_LCD_Ctrl +                LCALL   Receive_Manager + +MM_LCD_Ctrl:    JB      Ext_Dsp_Ready,MM_LCD_Ctrl2 +                JB      Kb_Dsp_Ready,MM_LCD_Ctrl2 +                JB      TD_Status_Ready,MM_LCD_Ctrl2 +                JB      KS_Status_Ready,MM_LCD_Ctrl2 +                SJMP    MM_End +MM_LCD_Ctrl2:   LCALL   LCD_Controller + +MM_End:         RET + +;-------------------------------------------------------------------------- + +Init_Data: +                MOV     Save_P4,#0FFh +                MOV     Save_P5,#0FFh +                MOV     Old_P4,#0FFh +                MOV     Old_P5,#0FFh +                MOV     Temp_P4,#0FFh +                MOV     Temp_P5,#0FFh +                MOV     TI_On_P4,#00 +                MOV     TI_Off_P4,#00 +                MOV     TI_On_P5,#00 +                MOV     TI_Off_P5,#00 +                MOV     TI_Sample_Counter,#00 +                MOV     Rcv_Msg_Length,#00 +                MOV     My_Slave_Adr,#00 + +                MOV     Text_Dec_Status,#00 +                MOV     Kb_Char_Buffer,#00 +                MOV     Kb_Str_Pointer,#00 +                MOV     Kb_Cursor,#00 +                MOV     ASCII_Low_Byte,#00 +                MOV     ASCII_High_Byte,#00 + +                MOV     Kb_Search_DPL,#00 +                MOV     Kb_Search_DPH,#00 +                MOV     KS_Actual_Word,#00 +                MOV     KS_Actual_Module,#00 +                MOV     KS_Cursor,#00 +                MOV     Kb_Search_Status,#00 + +                MOV     Stat_Code,#00 +                MOV     Stat_Address,#00 +                MOV     Stat_Num_Param,#00 +                MOV     Stat_Picture,#00 +                MOV     Stat_Module,#00 +                MOV     Stat_Length,#00 +                RET + + +Init_IData:     LCALL   Clr_Msg_Buffer +                RET + + +Init_XData:     PUSH    DPL +                PUSH    DPH +                PUSH    Acc + +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                LCALL   Clear_Str +                MOV     DPTR,#Token_Str +                MOV     A,#StringEnde +                LCALL   Clear_Str + +                POP     Acc +                POP     DPH +                POP     DPL +                RET + + +Init_BitData:   CLR     Kb_Str_Ready +                CLR     Kb_Char_Ready +                CLR     TI_Sample_Chg_Flg +                CLR     TD_Status_Ready +                CLR     TD_Send_Ready +                CLR     Receive_Ready +                SETB    TD_Next_Flg +                CLR     KS_Active_Flg +                CLR     KS_Status_Ready +                CLR     Kb_Dsp_Ready +                CLR     Ext_Dsp_Ready +                CLR     System_Error +                CLR     Sys_Robot_Mode +                CLR     Sys_Keyboard_Mode +                CLR     TID_Done_Flg +                RET + +;-------------------------------------------------------------------------- +; Routine            : Init_Mode +; Parameter          : - +; Rueckgabeparameter : Sys_Robot_Mode, Sys_Keyboard_Mode,System_Error +; +; entscheidet, ob das Programm im TI-Roboter, TI-Fraese oder TI-Tastatur +; laufen muss.                    (SRM /SKM)  (/SRM /SKM)    (SKM) + + +Init_Mode:      PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                CLR     System_Error + +        if Ass_Keyboard_Only +                SJMP    IM_Keyboard +        elseif +                CLR     Sys_Robot_Mode +                CLR     Sys_Keyboard_Mode +                LCALL   LCD_Clear +                MOV     DPTR,#Screen_Title +                LCALL   LCD_Write_String +                JNB     P3.5,IM_Robot +                JB      P3.4,IM_Error +                MOV     DPTR,#Screen_Drill +                SJMP    IM_End +        endif + +IM_Robot:       JNB     P3.4,IM_Keyboard +                SETB    Sys_Robot_Mode +                MOV     DPTR,#Screen_Robot +                SJMP    IM_End + +IM_Keyboard:    SETB    Sys_Keyboard_Mode +                MOV     DPTR,#Screen_Key +                SJMP    IM_End + +IM_Error:       SETB    System_Error +                MOV     DPTR,#Screen_Error + +IM_End:         LCALL   LCD_Write_String +                LCALL   Wait_2s + +                POP     DPH +                POP     DPL +                POP     PSW +                RET + +Screen_Title:   DB      "****       TEACH-IN UNIT v1.0       ****",00 +Screen_Drill:   DB      "               Drill mode",00 +Screen_Robot:   DB      "               Robot mode",00 +Screen_Key:     DB      "             Keyboard  mode",00 +Screen_Error:   DB      "   ERROR : Incorrect micro-controller",00 + +;-------------------------------------------------------------------------- + +Init_Int:       Init_Vektor     INT0_VEKTOR,Keyb_Sampler +                Init_Interrupt  INT0_VEKTOR,Falling_Edge,Param_On +                Init_Vektor     ICT0_VEKTOR,TeachIn_Sampler +                Init_Interrupt  ICT0_VEKTOR,Nope,Param_On +                RET + +;-------------------------------------------------------------------------- + + +Init_Net:       PUSH    Acc +                PUSH    DPL +                PUSH    DPH + +                MOV     DPTR,#MESSAGE_INTERRUPT         ;Receive_Sampler +                LCALL   Set_CallBack_Adress +                MOV     DPTR,#Adr_Table +                JB      Sys_Keyboard_Mode,Init_Net_Key +                JNB     Sys_Robot_Mode,Init_Net_Frs + +Init_Net_Rob:   MOV     A,#TeachRob +                SJMP    Init_Net_End + +Init_Net_Frs:   MOV     A,#TeachFrs +                SJMP    Init_Net_End + +Init_Net_Key:   MOV     A,#TeachKey + +Init_Net_End:   MOVC    A,@A+DPTR +                MOV     My_Slave_Adr,A +                LCALL   Set_My_Adress + +                POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +Init_Timer:     MOV     TH0,#00 +                MOV     TL0,#00 +                MOV     TMOD,#00110001b         ; T1 : Off, T0 : 16 Bit Timer +                SETB    TR0                     ; T0 einschalten +                RET + +;-------------------------------------------------------------------------- +; Routine            : LCD_Controller +; Parameter          : Ext_Dsp_Ready   -> DPTR +;                      TD_Status_Ready -> Text_Dec_Status +;                      KS_Status_Ready -> Kb_Search_Status +; Rueckgabeparameter : - +; wenn Ext_Dsp_Ready gesetzt wird, zeigt den mit DPTR gezeigten String +; auf den Bildschirm an. +; wenn TD_Status_Ready (bzw KS_Status_Ready) gesetzt wird, zeigt die +; entsprechende Meldung von Text_Dec_Status (bzw Kb_Search_Status) +; + +LCD_Controller: PUSH    PSW +                PUSH    Acc +                PUSH    AR0 +                PUSH    AR1 +                PUSH    DPL +                PUSH    DPH +                LCALL   LCD_Home + +                JNB     Ext_Dsp_Ready,LCD_Str_Buffer +                CLR     Ext_Dsp_Ready +                MOV     A,#40h +                LCALL   LCD_Set_DD_RAM_Address +                MOV     R1,#Kb_Max_Length + +LCD_Ext_Loop:   MOVX    A,@DPTR +                LCALL   LCD_Write_Char +                INC     DPTR +                DJNZ    R1,LCD_Ext_Loop +                LCALL   LCD_Home + +LCD_Str_Buffer: JNB     Kb_Dsp_Ready,LCD_TD_Status +                CLR     Kb_Dsp_Ready +                MOV     DPTR,#Kb_Str_Buffer +                MOV     R1,#Kb_Max_Length + +LCD_Str_Loop:   MOVX    A,@DPTR +                LCALL   LCD_Write_Char +                INC     DPTR +                DJNZ    R1,LCD_Str_Loop + +LCD_TD_Status:  JNB     TD_Status_Ready,LCD_KS_Status +                CLR     TD_Status_Ready + +                MOV     A,#40 +                LCALL   LCD_Set_DD_RAM_Address +                MOV     DPTR,#LCD_TD_Table +                MOV     R0,Text_Dec_Status +                CJNE    R0,#00,LCD_TD_Loop +                SJMP    LCD_TD_Cont + +LCD_TD_Loop:    MOV     A,#41 +                ADD     A,DPL +                MOV     DPL,A +                MOV     A,DPH +                ADDC    A,#00 +                MOV     DPH,A +                DJNZ    R0,LCD_TD_Loop + +LCD_TD_Cont:    LCALL   LCD_Write_String + +LCD_KS_Status:  JNB     KS_Status_Ready,LCD_End +                CLR     KS_Status_Ready + +                MOV     A,#40 +                LCALL   LCD_Set_DD_RAM_Address +                MOV     DPTR,#LCD_KS_Table +                MOV     R0,Kb_Search_Status +                CJNE    R0,#00,LCD_KS_Loop +                SJMP    LCD_KS_Cont + +LCD_KS_Loop:    MOV     A,#41 +                ADD     A,DPL +                MOV     DPL,A +                MOV     A,DPH +                ADDC    A,#00 +                MOV     DPH,A +                DJNZ    R0,LCD_KS_Loop + +LCD_KS_Cont:    LCALL   LCD_Write_String + +LCD_End:        MOV     A,Kb_Cursor +                LCALL   LCD_Set_DD_RAM_Address + +                POP     DPH +                POP     DPL +                POP     AR1 +                POP     AR0 +                POP     Acc +                POP     PSW +                RET + +LCD_TD_Table:   DB      "Edit OK : Sending                       ",00 +                DB      "Edit ERROR : message waited             ",00 +                DB      "Edit ERROR : incorrect message          ",00 +                DB      "Edit ERROR : more parameters waited     ",00 +                DB      "Edit ERROR : parameter range            ",00 +                DB      "Edit ERROR : module name waited         ",00 +                DB      "Edit ERROR : incorrect module name      ",00 +                DB      "Edit WARNING : too many parameters      ",00 + +LCD_KS_Table:   DB      "Text editing                            ",00 +                DB      "Search : Choose a module                ",00 +                DB      "Search : Choose a module, reached TOP   ",00 +                DB      "Search : Choose a module, reached BOTT. ",00 +                DB      "Search : Choose a message               ",00 +                DB      "Search : Choose a message, reached TOP  ",00 +                DB      "Search : Choose a message, reached BOTT.",00 +                DB      "Search : Incorrect module               ",00 +                DB      "Search : No choice available            ",00 + +;-------------------------------------------------------------------------- + +Keyb_Sampler: +                MOV     Kb_Char_Buffer,P1 +                SETB    Kb_Char_Ready +                RETI + +;-------------------------------------------------------------------------- +; Routine            : Keyb_Controller +; Parameter          : Kb_Char_Ready            ; (Buchstabe im Buffer) +;                      Kb_Char_Buffer           ; (zu verarbeitender Buchstabe) +;                      Kb_Cursor                ; (Cursorposition auf LCD) +;                      KS_Active_Flg            ; (Keyb. Search Modus) +;                      Kb_Str_Buffer            ; (Text Buffer f. Tastatur) +;                      TD_Next_Flg              ; Text_Decoder ist fertig +; Rueckgabeparameter : Kb_Cursor +;                      KS_Active_Flg +;                      Kb_Str_Buffer +;                      Kb_Str_Ready             ; (->Text_Decoder : String verarbeiten) +;                      Kb_Search_Status         ; (Keyb. Search Zustand) +;                      KS_Status_Ready          ; (-> LCD : Zustand anzeigen) +; +; Verwaltet Kb_Str_Buffer nach der Tastatur-Eingaben + + +Keyb_Controller: +                PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                CLR     Kb_Char_Ready +                MOV     A,Kb_Char_Buffer + +                JNB     TD_Next_Flg,Kb_Ctrl_UP +                CLR     TD_Next_Flg +Kb_Ctrl_Test1:  CJNE    A,#ASCII_Left,Kb_Ctrl_Test2 +                SJMP    Kb_Ctrl_Old +Kb_Ctrl_Test2:  CJNE    A,#ASCII_Right,Kb_Ctrl_Test3 +                SJMP    Kb_Ctrl_Old +Kb_Ctrl_Test3:  CJNE    A,#ASCII_BkSpc,Kb_Ctrl_Test4 +                SJMP    Kb_Ctrl_Old +Kb_Ctrl_Test4:  CJNE    A,#ASCII_CR,Kb_Ctrl_New + + +Kb_Ctrl_Old:    MOV     Kb_Search_Status,#KSS_Off +                SETB    KS_Status_Ready +                LJMP    Kb_Ctrl_Up + +Kb_Ctrl_New:    PUSH    Acc +                MOV     A,#ASCII_Space +                MOV     DPTR,#Kb_Str_Buffer +                LCALL   Clear_Str +                MOV     Kb_Cursor,#00 +                MOV     Kb_Search_Status,#KSS_Off +                SETB    KS_Status_Ready +                POP     Acc + +Kb_Ctrl_UP:     CJNE    A,#ASCII_Up,Kb_Ctrl_DOWN +                LCALL   Kb_Search_Up +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_DOWN:   CJNE    A,#ASCII_Down,Kb_Ctrl_RET +                LCALL   Kb_Search_Down +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_RET:    CLR     KS_Active_Flg +                CJNE    A,#ASCII_CR,Kb_Ctrl_LEFT +                SETB    Kb_Str_Ready +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_LEFT:   CJNE    A,#ASCII_Left,Kb_Ctrl_RIGHT +                LCALL   Exe_LEFT +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_RIGHT:  CJNE    A,#ASCII_Right,Kb_Ctrl_DEL +                LCALL   Exe_RIGHT +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_DEL:    CJNE    A,#ASCII_Del,Kb_Ctrl_BKSPC +                LCALL   Exe_DEL +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_BKSPC:  CJNE    A,#ASCII_BkSpc,Kb_Ctrl_ESC +                LCALL   Exe_LEFT +                LCALL   Exe_DEL +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_ESC:    CJNE    A,#ASCII_Esc,Kb_Ctrl_Alpha +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                LCALL   Clear_Str +                MOV     Kb_Cursor,#00 +                LJMP    Kb_Ctrl_End + +Kb_Ctrl_Alpha:  LCALL   Exe_Set_Actual_Letter +                MOV     A,Kb_Char_Buffer +                MOVX    @DPTR,A +                LCALL   Exe_RIGHT + +Kb_Ctrl_End:    SETB    Kb_Dsp_Ready +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +Exe_Set_Actual_Letter:                          ; laedt in DPTR die externale Adresse +                PUSH    Acc                     ; des vom Kb_Cursor gezeigten Zeichens +                PUSH    PSW +                MOV     A,Kb_Cursor +                MOV     DPTR,#Kb_Str_Buffer +                ADD     A,DPL +                MOV     DPL,A +                JNC     ESAL_End +                INC     DPH +ESAL_End:       POP     PSW +                POP     Acc +                RET + +Exe_LEFT:       PUSH    AR1                     ; dekr. Kb_Cursor +                DEC     Kb_Cursor +                MOV     R1,Kb_Cursor +                CJNE    R1,#0FFh,Exe_LEFT_End +                MOV     Kb_Cursor,#00 +Exe_LEFT_End:   POP     AR1 +                RET + +Exe_RIGHT:      PUSH    Acc                     ; inkr. Kb_Cursor +                PUSH    PSW +                INC     Kb_Cursor +                CLR     C +                MOV     A,#Kb_Max_Length-1 +                SUBB    A,Kb_Cursor +                JNC     Exe_RIGHT_End +                MOV     Kb_Cursor,#Kb_Max_Length-1 +Exe_RIGHT_End:  POP     PSW +                POP     Acc +                RET + +Exe_DEL:        PUSH    Acc                     ; loescht aktuelles Zeichen +                LCALL   Exe_Set_Actual_Letter +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Kb_Init_Search +; Parameter          : Kb_Str_Buffer +;                      Kb_Cursor +; Rueckgabeparameter : KS_Status_Ready +;                      Kb_Search_Status +;                      KS_Active_Flg +;                      KS_Actual_Module +;                      Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Cursor +; +; Sucht, auf welchem Wort der Cursor sich befindet und zeigt das erste ent- +; sprechende Element aus der Search-Menu-Tabelle (zB : wenn Cursor auf Message, +; sucht die erste Message fuer das schon eingetragene Modul). + + +Kb_Init_Search: PUSH    Acc +                PUSH    B +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                LCALL   Kb_Valid_Word +                MOV     A,KS_Actual_Word +                CJNE    A,#1,KIS_Msg                    ; Cursor auf 1. Wort -> Modul + +                MOV     Kb_Search_DPL,#(Module_Table # 256) +                MOV     Kb_Search_DPH,#(Module_Table / 256) +                LCALL   Search_Next_Module +                JC      KIS_No_Choice                   ; springt wenn noch kein Modul in der Tabelle +                MOV     DPTR,#Kb_Str_Buffer             ; +                MOV     A,#ASCII_Space                  ; loescht Kb_Str_Buffer +                LCALL   Clear_Str                       ; +                MOV     Kb_Cursor,#00                   ; +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                MOV     Kb_Search_Status,#KSS_Mod +                SJMP    KIS_Found + +KIS_Msg:        CJNE    A,#2,KIS_No_Choice +                MOV     Kb_Str_Pointer,#00              ; Cursor auf 2. Wort -> Message +                LCALL   Get_Token +                LCALL   Is_Token_Module +                JNC     KIS_Mod_Corr +                MOV     Kb_Search_Status,#KSS_Inc_Mod   ; erstes Wort kein Korrektes Modul +                SJMP    KIS_End + +KIS_Mod_Corr:   MOV     Kb_Cursor,Kb_Str_Pointer +                LCALL   Exe_Right                       ; ein Leerzeichen nach dem 1. Wort lassen +                MOV     KS_Actual_Module,A              ; Modulnummer abspeichern +                MOV     Kb_Search_DPL,#(Stat_Table # 256) +                MOV     Kb_Search_DPH,#(Stat_Table / 256) +                LCALL   Search_Next_Msg +                JC      KIS_No_Choice                   ; existiert Message fuer dieses Modul ? +                MOV     DPTR,#Kb_Str_Buffer             ; Ja -> Mess. in Textbuffer kopieren +                MOV     A,#ASCII_Space +                MOV     B,Kb_Cursor +                LCALL   Clear_Pos_Str                   ; Kb_Str_Buffer ab der Cursorposition loeschen +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                INC     DPTR +                MOV     Kb_Search_Status,#KSS_Msg +                SJMP    KIS_Found + +KIS_No_Choice:  MOV     Kb_Search_Status,#KSS_No_Choice ; Nein -> Fehlermeldung +                SJMP    KIS_End + +KIS_Found:      MOV     KS_Cursor,Kb_Cursor             ; kopiert das gefundene Element +                LCALL   Copy_Pos_Buffer                 ; in Kb_Str_Buffer ab KS_Cursor +                SETB    KS_Active_Flg                   ; + +KIS_End:        SETB    KS_Status_Ready +                POP     DPH +                POP     DPL +                POP     PSW +                POP     B +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Kb_Valid_Word +; Parameter          : Kb_Str_Buffer +;                      Kb_Cursor +; Rueckgabeparameter : KS_Actual_Word +; +; Sucht auf welchem Wort der Cursor sich befindet + + +Kb_Valid_Word:  PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                MOV     DPTR,#Kb_Str_Buffer +                MOV     Kb_Str_Pointer,#00 +                MOV     KS_Actual_Word,#00 + +KVW_Loop:       LCALL   Get_Token +                INC     KS_Actual_Word +                CLR     C +                MOV     A,Kb_Str_Pointer +                SUBB    A,Kb_Cursor             ; wenn Kb_Str_Pointer > Kb_Cursor +                JC      KVW_Loop                ; hat man das richtige Wort gefunden + +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Kb_Search_Up +; Parameter          : KS_Active_Flg +;                      Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Cursor +; Rueckgabeparameter : KS_Active_Flg +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Legt fest, ob die Search-Routinen initialisiert werden muessen, ob das vorhergehende +; Modul, oder Message, abgeholt werden muss. + + +Kb_Search_Up:   PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                JB      KS_Active_Flg,KSU_Choose        ; Schon im Search-Modus ? +                LCALL   Kb_Init_Search                  ; Nein -> Initialisierung +                SJMP    KSU_End + +KSU_Choose:     MOV     A,KS_Actual_Word                ; Ja -> auf welchem Wort liegt der Cursor ? +                CJNE    A,#1,KSU_Msg +                LCALL   Search_Prev_Module              ; 1. Wort -> sucht Modul +                JC      KSU_Mod_Top                     ; gefunden ? +                MOV     Kb_Search_Status,#KSS_Mod       ; Ja -> DPTR retten +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                SJMP    KSU_Show + +KSU_Mod_Top:    MOV     Kb_Search_Status,#KSS_Mod_Top   ; Nein -> Top of list +                SJMP    KSU_End + +KSU_Msg:        LCALL   Search_Prev_Msg                 ; 2. Wort -> sucht Message +                JC      KSU_Msg_Top                     ; gefunden ? +                MOV     Kb_Search_Status,#KSS_Msg       ; Ja -> DPTR retten +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                INC     DPTR +                SJMP    KSU_Show + +KSU_Msg_Top:    MOV     Kb_Search_Status,#KSS_Msg_Top   ; Nein -> Top of list +                SJMP    KSU_End + +KSU_Show:       MOV     Kb_Cursor,KS_Cursor             ; gefundenes Wort in Textbuffer +                PUSH    DPL                             ; kopieren +                PUSH    DPH +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                MOV     B,Kb_Cursor +                LCALL   Clear_Pos_Str +                POP     DPH +                POP     DPL +                LCALL   Copy_Pos_Buffer + +KSU_End:        SETB    KS_Status_Ready +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Kb_Search_Down +; Parameter          : KS_Active_Flg +;                      Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Cursor +; Rueckgabeparameter : KS_Active_Flg +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Legt fest, ob die Search-Routinen initialisiert werden muessen, ob das naechste +; Modul, oder Message, abgeholt werden muss. + + +Kb_Search_Down: PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                JB      KS_Active_Flg,KSD_Choose        ; schon im Search Modus ? +                LCALL   Kb_Init_Search                  ; Nein -> Initialisierung +                SJMP    KSD_End + +KSD_Choose:     MOV     A,KS_Actual_Word                ; Ja -> welches Wort ? +                CJNE    A,#1,KSD_Msg +                LCALL   Search_Next_Module              ; 1. Wort -> sucht naechstes Modul +                JC      KSD_Mod_Bot                     ; gefunden ? +                MOV     Kb_Search_Status,#KSS_Mod       ; Ja -> DPTR retten +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                SJMP    KSD_Show + +KSD_Mod_Bot:    MOV     Kb_Search_Status,#KSS_Mod_Bot   ; Nein -> bottom of list +                SJMP    KSD_End + +KSD_Msg:        LCALL   Search_Next_Msg                 ; 2. Wort -> sucht naechste Message +                JC      KSD_Msg_Bot                     ; gefunden ? +                MOV     Kb_Search_Status,#KSS_Msg       ; Ja -> DPTR retten +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                INC     DPTR +                INC     DPTR +                INC     DPTR +                SJMP    KSD_Show + +KSD_Msg_Bot:    MOV     Kb_Search_Status,#KSS_Msg_Bot   ; Nein -> bottom of list +                SJMP    KSD_End + +KSD_Show:       MOV     Kb_Cursor,KS_Cursor             ; gefundenes Wort in Textbuffer +                PUSH    DPL                             ; kopieren +                PUSH    DPH +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                MOV     B,Kb_Cursor +                LCALL   Clear_Pos_Str +                POP     DPH +                POP     DPL +                LCALL   Copy_Pos_Buffer + +KSD_End:        SETB    KS_Status_Ready +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Search_Next_Module +; Parameter          : Kb_Search_DPL +;                      Kb_Search_DPH +; Rueckgabeparameter : C  (gesetzt -> nicht gefunden) +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Sucht naechstes Modul ab aktueller Position in der Tabelle (durch KB_Search_DPL +; (DPH) gespeichert) + + +Search_Next_Module: +                PUSH    Acc +                PUSH    DPL +                PUSH    DPH + +                MOV     DPL,Kb_Search_DPL       ; aktuelle Pos. in DPTR laden +                MOV     DPH,Kb_Search_DPH +                MOV     A,#1 +                MOVC    A,@A+DPTR +                ADD     A,DPL                   ; DPTR mit Offset addieren +                MOV     DPL,A +                JNC     SNMod_Cont +                INC     DPH +SNMod_Cont:     CLR     C +                CLR     A +                MOVC    A,@A+DPTR +                XRL     A,#TableEnd +                JZ      SNMod_End               ; Ende der Tabelle ? +                MOV     Kb_Search_DPL,DPL       ; Nein -> DPTR retten +                MOV     Kb_Search_DPH,DPH +                CPL     C + +SNMod_End:      CPL     C                       ; Ja -> nicht gefunden +                POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Search_Prev_Module +; Parameter          : Kb_Search_DPL +;                      Kb_Search_DPH +; Rueckgabeparameter : C  (gesetzt -> nicht gefunden) +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Sucht vorhergehendes Modul ab aktueller Position in der Tabelle (durch KB_Search_DPL +; (DPH) gespeichert). Analog zu Search_Next_Module + + +Search_Prev_Module: +                PUSH    Acc +                PUSH    AR1 +                PUSH    DPL +                PUSH    DPH + +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH +                DEC_DPTR +                CLR     A +                MOVC    A,@A+DPTR +                INC     DPTR +                CLR     C +                MOV     R1,A +                MOV     A,DPL +                SUBB    A,R1 +                MOV     DPL,A +                JNC     SPMod_Cont +                DEC     DPH +SPMod_Cont:     CLR     C +                CLR     A +                MOVC    A,@A+DPTR +                XRL     A,#TableAnf +                JZ      SPMod_End +                MOV     Kb_Search_DPL,DPL +                MOV     Kb_Search_DPH,DPH +                CPL     C + +SPMod_End:      CPL     C +                POP     DPH +                POP     DPL +                POP     AR1 +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Search_Next_Msg +; Parameter          : Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Actual_Module +; Rueckgabeparameter : C  (gesetzt -> nicht gefunden) +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Sucht naechste Message ab aktueller Position in der Tabelle (durch KB_Search_DPL +; (DPH) gespeichert), die KS_Actual_Module entspricht + + +Search_Next_Msg: +                PUSH    Acc +                PUSH    DPL +                PUSH    DPH + +                MOV     DPL,Kb_Search_DPL       ; aktuelle Pos. in DPTR laden +                MOV     DPH,Kb_Search_DPH + +SNMsg_Loop:     MOV     A,#1 +                MOVC    A,@A+DPTR +                ADD     A,DPL                   ; DPTR und Offset addieren +                MOV     DPL,A +                JNC     SNMsg_Cont +                INC     DPH +SNMsg_Cont:     CLR     C +                CLR     A +                MOVC    A,@A+DPTR +                CJNE    A,#TableEnd,SNMsg_Mod   ; Ende der Tabelle ? +                SETB    C                       ; Ja -> nicht gefunden +                SJMP    SNMsg_End +SNMsg_Mod:      CJNE    A,KS_Actual_Module,SNMsg_Loop ; Nein -> Modulnummer korrekt ? +                                                      ;         Nein -> sucht weiter +                MOV     Kb_Search_DPL,DPL             ;         Ja -> DPTR retten +                MOV     Kb_Search_DPH,DPH +                CLR     C + +SNMsg_End:      POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Search_Prev_Msg +; Parameter          : Kb_Search_DPL +;                      Kb_Search_DPH +;                      KS_Actual_Module +; Rueckgabeparameter : C  (gesetzt -> nicht gefunden) +;                      Kb_Search_DPL +;                      Kb_Search_DPH +; +; Sucht vorhergehende Message ab aktueller Position in der Tabelle (durch KB_Search_DPL +; (DPH) gespeichert), die KS_Actual_Module entspricht. Analog zu Search_Next_Msg + + +Search_Prev_Msg: +                PUSH    Acc +                PUSH    DPL +                PUSH    DPH +                PUSH    AR1 + +                MOV     DPL,Kb_Search_DPL +                MOV     DPH,Kb_Search_DPH + +SPMsg_Loop:     DEC_DPTR +                CLR     A +                MOVC    A,@A+DPTR +                INC     DPTR +                CLR     C +                MOV     R1,A +                MOV     A,DPL +                SUBB    A,R1 +                MOV     DPL,A +                JNC     SPMsg_Cont +                DEC     DPH +SPMsg_Cont:     CLR     C +                CLR     A +                MOVC    A,@A+DPTR +                CJNE    A,#TableAnf,SPMsg_Mod +                SETB    C +                SJMP    SPMsg_End +SPMsg_Mod:      CJNE    A,KS_Actual_Module,SPMsg_Loop +                MOV     Kb_Search_DPL,DPL +                MOV     Kb_Search_DPH,DPH +                CLR     C + +SPMsg_End:      POP     AR1 +                POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine            : Text_Decoder +; Parameter          : Kb_Str_Buffer +; Rueckgabeparameter : Msg_Registers +;                      Text_Dec_Status +;                      TD_Status_Ready +;                      TD_Send_Ready +;                      Stat_Module +;                      Stat_Num_Param +;                      Stat_Picture +;                      Stat_Length +;                      Stat_Code +; +; Interpretiert den im Kb_Str_Buffer liegenden Text und legt die entsprechenden +; Werte in Msg_Registers und Stat_ Variablen ab. Wenn korrekter Text, setzt das +; TD_Send_Ready-Flag (ready to send). + + +Text_Decoder:   PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 +                PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH + +                LCALL   Clr_Msg_Buffer +                MOV     Stat_Length,#02 + +                CLR     Kb_Str_Ready +                MOV     Kb_Str_Pointer,#00 +                LCALL   Get_Token               ; sucht 1. Wort +                JNC     TD_Module               ; gefunden ? +                MOV     Text_Dec_Status,#5      ; Nein -> Fehler (fehlendes Modul) +                LJMP    TD_End + +TD_Module:      LCALL   Is_Token_Module         ; Ja -> ist das Modul korrekt ? +                JNC     TD_Statement +                MOV     Text_Dec_Status,#6      ; Nein -> Fehler (inkorrektes Modul) +                LJMP    TD_End + +TD_Statement:   MOV     Stat_Module,A           ; Ja -> Modulnummer abspeichern +                LCALL   Get_Token               ; sucht 2. Wort +                JNC     TD_Stat_Cont            ; gefunden ? +                MOV     Text_Dec_Status,#1      ; Nein -> Fehler (fehlende Message) +                LJMP    TD_End + +TD_Stat_Cont:   MOV     R0,#(Token_Str # 256)   ; Ja -> sucht Message in der Tabelle +                MOV     R1,#(Token_Str / 256) +                MOV     DPTR,#Stat_Table + +TD_Stat_Loop:   CLR     A                       ; +                MOVC    A,@A+DPTR               ; +                CJNE    A,#TableEnd,TD_Stat_Cont2 +                MOV     Text_Dec_Status,#2      ; nur die Messages der Tabelle, die +                LJMP    TD_End                  ; das aktuelle Modul entsprechen, muessen +                                                ; betrachtet werden +TD_Stat_Cont2:  XRL     A,Stat_Module           ; +                JZ      TD_Stat_Check           ; + +TD_Stat_Next:   MOV     A,#01                   ; +                MOVC    A,@A+DPTR               ; +                ADD     A,DPL                   ; sucht naechste Message in der +                MOV     DPL,A                   ; Tabelle +                JNC     TD_Stat_Loop            ; +                INC     DPH                     ; +                SJMP    TD_Stat_Loop            ; + +TD_Stat_Check:  INC     DPTR +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     Stat_Code,A +                INC     DPTR + +                LCALL   Compare_Str             ; Text und Message in der Tabelle +                JNC     TD_Parameters           ; vergleichen +                DEC_DPTR +                DEC_DPTR +                DEC_DPTR +                SJMP    TD_Stat_Next            ; nicht gleich -> next one ! + +TD_Parameters:  LCALL   Jump_Blank_Str          ; gleich -> Parameter dekodieren +                MOV     R0,#Msg_Registers +                MOV     @R0,Stat_Module + +                INC     R0 +                MOV     @R0,Stat_Code + +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     Stat_Num_Param,A +                MOV     R1,A +                JZ      TD_Send + +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     Stat_Picture,A +                INC     R0 + +TD_Par_Loop:    LCALL   Get_Token +                JNC     TD_Par_Symbol +                MOV     Text_Dec_Status,#3 +                LJMP    TD_End + +TD_Par_Symbol:  CLR     C +                LCALL   Is_Token_Symbol +                JC      TD_Par_Digit +                MOV     ASCII_Low_Byte,A +                MOV     ASCII_High_Byte,#00 +                SJMP    TD_Par_Load + +TD_Par_Digit:   CLR     C +                LCALL   ASCII_To_Bin +                JNC     TD_Par_Load +                MOV     Text_Dec_Status,#4 +                SJMP    TD_End + +TD_Par_Load:    MOV     A,Stat_Picture +                JB      Acc.0,TD_Par_Single +                MOV     @R0,ASCII_High_Byte +                MOV     ASCII_High_Byte,#00 +                INC     R0 +                INC     Stat_Length + +TD_Par_Single:  MOV     R2,ASCII_High_Byte +                CJNE    R2,#00,TD_Par_Error +                MOV     @R0,ASCII_Low_Byte +                INC     R0 +                INC     Stat_Length +                RR      A +                MOV     Stat_Picture,A +                DJNZ    R1,TD_Par_Loop + +TD_Send:        MOV     Text_Dec_Status,#0 +                SETB    TD_Send_Ready +                LCALL   Get_Token +                JC      TD_End +                MOV     Text_Dec_Status,#7 +                SJMP    TD_End + +TD_Par_Error:   MOV     Text_Dec_Status,#4 + +TD_End:         SETB    TD_Status_Ready +                SETB    TD_Next_Flg +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                POP     AR2 +                POP     AR1 +                POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Get_Token:      PUSH    Acc +                PUSH    P2 +                PUSH    DPL +                PUSH    DPH +                PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 + +                MOV     DPTR,#Token_Str +                CLR     A +                LCALL   Clear_Str +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#Kb_Max_Length        ; +                CLR     C                       ; +                SUBB    A,Kb_Str_Pointer        ; +                JNZ     GT_Cont                 ; R2 = Anzahl der noch +                SETB    C                       ; zuverarbeitenden +                SJMP    GT_End                  ; Buchstaben +                                                ; +GT_Cont:        MOV     R2,A                    ; +                MOV     A,DPL +                ADD     A,Kb_Str_Pointer +                MOV     DPL,A +                JNC     GT_Blank_Loop +                INC     DPH + +GT_Blank_Loop:  MOVX    A,@DPTR +                CJNE    A,#ASCII_Space,GT_Text +                INC     DPTR +                INC     Kb_Str_Pointer +                DJNZ    R2,GT_Blank_Loop +                SETB    C +                SJMP    GT_End + +GT_Text:        MOV     R0,#(Token_Str # 256) +                MOV     R1,#(Token_Str / 256) + +GT_Text_Loop:   MOVX    A,@DPTR +                CJNE    A,#ASCII_Space,GT_Text_Add +                CLR     C +                SJMP    GT_End + +GT_Text_Add:    LCALL   UpCase +                MOV     P2,R1 +                MOVX    @R0,A +                INC     Kb_Str_Pointer +                INC_R0R1 +                INC     DPTR +                DJNZ    R2,GT_Text_Loop +                CLR     C + +GT_End:         POP     AR2 +                POP     AR1 +                POP     AR0 +                POP     DPH +                POP     DPL +                POP     P2 +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +Compare_Str:    IRP     Source,Acc,P2,DPL,DPH,AR0,AR1,AR2,AR3 +                PUSH    Source +                ENDM + +                CLR     C +                MOV     R2,#Kb_Max_Length + +                CLR     A +                MOVC    A,@A+DPTR +                CJNE    A,#StringEnde,Comp_Loop +                SJMP    Comp_False + +Comp_Loop:      MOV     R3,A +                MOV     P2,R1 +                MOVX    A,@R0 +                XRL     A,R3 +                JNZ     Comp_False +                MOV     A,R3 +                JZ      Comp_End +                INC     DPTR +                INC_R0R1 +                CLR     A +                MOVC    A,@A+DPTR +                DJNZ    R2,Comp_Loop +                CPL     C + +Comp_False:     CPL     C + +Comp_End:       IRP     Target,AR3,AR2,AR1,AR0,DPH,DPL,P2,Acc +                POP     Target +                ENDM +                RET + +;-------------------------------------------------------------------------- +TeachIn_Sampler: +                PUSH    Acc +                PUSH    PSW +                PUSH    AR1 +                MOV     TH0,#0FCh + +                MOV     Temp_P4,P4 +                MOV     Temp_P5,P5 +                MOV     A,Temp_P4 +                XRL     A,Save_P4 +                JNZ     TI_Smp_Edge +                MOV     A,Temp_P5 +                XRL     A,Save_P5 +                JZ      TI_Smp_Inc + +TI_Smp_Edge:    MOV     TI_Sample_Counter,#00 +                MOV     Save_P4,Temp_P4 +                MOV     Save_P5,Temp_P5 +                SJMP    TI_Smp_End + +TI_Smp_Inc:     INC     TI_Sample_Counter +                MOV     A,TI_Sample_Counter +                CJNE    A,#TI_Sample_Valid_Time,TI_Smp_End +                MOV     TI_Sample_Counter,#00 +                MOV     A,Old_P4 +                XRL     A,Save_P4 +                JNZ     TI_Smp_Change +                MOV     A,Old_P5 +                XRL     A,Save_P5 +                JZ      TI_Smp_End + +TI_Smp_Change:  SETB    TI_Sample_Chg_Flg +                JNB     TID_Done_Flg,TISC_No_Init +                CLR     TID_Done_Flg +                MOV     TI_On_P4,#00 +                MOV     TI_Off_P4,#00 +                MOV     TI_On_P5,#00 +                MOV     TI_Off_P5,#00 + +TISC_No_Init:   MOV     A,Old_P4 +                XRL     A,Save_P4 +                MOV     R1,A                    ; R1 = Save_P4 +                MOV     A,Save_P4 +                CPL     A +                ANL     A,R1 +                ORL     A,TI_On_P4 +                MOV     TI_On_P4,A + +                MOV     A,Save_P4 +                ANL     A,R1 +                MOV     TI_Off_P4,A +                MOV     A,Old_P5 +                XRL     A,Save_P5 +                MOV     R1,A +                MOV     A,Save_P5 +                CPL     A +                ANL     A,R1 +                MOV     TI_On_P5,A +                MOV     A,Save_P5 +                ANL     A,R1 +                MOV     TI_Off_P5,A + +                MOV     Old_P4,Save_P4 +                MOV     Old_P5,Save_P5 + +TI_Smp_End:     POP     AR1 +                POP     PSW +                POP     Acc +                RETI + +;-------------------------------------------------------------------------- + +TeachIn_Decoder: +                PUSH    Acc +                PUSH    DPL +                PUSH    DPH + +                CLR     TI_Sample_Chg_Flg +                MOV     A,TI_On_P4 +                JZ      TID_Table2 +                JB      Sys_Robot_Mode,TID_T1_Rob +                MOV     DPTR,#KOn_P4_Frs +                LCALL   TID_Main +                SJMP    TID_Table2 + +TID_T1_Rob:     MOV     DPTR,#KOn_P4_Rob +                LCALL   TID_Main + +TID_Table2:     MOV     A,TI_Off_P4 +                JZ      TID_Table3 +                JB      Sys_Robot_Mode,TID_T2_Rob +                MOV     DPTR,#KOff_P4_Frs +                LCALL   TID_Main +                SJMP    TID_Table3 + +TID_T2_Rob:     MOV     DPTR,#KOff_P4_Rob +                LCALL   TID_Main + +TID_Table3:     MOV     A,TI_On_P5 +                JZ      TID_Table4 +                JB      Sys_Robot_Mode,TID_T3_Rob +                MOV     DPTR,#KOn_P5_Frs +                LCALL   TID_Main +                SJMP    TID_Table4 + +TID_T3_Rob:     MOV     DPTR,#KOn_P5_Rob +                LCALL   TID_Main + +TID_Table4:     MOV     A,TI_Off_P5 +                JZ      TID_End +                JB      Sys_Robot_Mode,TID_T4_Rob +                MOV     DPTR,#KOff_P5_Frs +                LCALL   TID_Main +                SJMP    TID_End + +TID_T4_Rob:     MOV     DPTR,#KOff_P5_Rob +                LCALL   TID_Main + +TID_End:        SETB    TID_Done_Flg + +                POP     DPH +                POP     DPL +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +TID_Main:       PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH +                PUSH    AR0 +                PUSH    AR1 + +                MOV     R1,#8 +TID_Main_Loop:  CLR     C +                RRC     A +                JNC     TID_Main_Next + +                PUSH    Acc +                MOV     A,#1 +                MOVC    A,@A+DPTR +                MOV     R0,A +                POP     Acc +                CJNE    R0,#StringEnde,TID_Main_Msg +                SJMP    TID_Main_Next + +TID_Main_Msg:   PUSH    DPL +                PUSH    DPH +                PUSH    Acc +                MOV     DPTR,#Kb_Str_Buffer +                MOV     A,#ASCII_Space +                LCALL   Clear_Str +                POP     Acc +                POP     DPH +                POP     DPL + +                INC     DPTR +                MOV     Kb_Cursor,#00 +                LCALL   Copy_Pos_Buffer +                SETB    Kb_Str_Ready +                SETB    Kb_Dsp_Ready +                CLR     KS_Active_Flg +                DEC_DPTR +                LCALL   Main_Manager + +TID_Main_Next:  PUSH    Acc +                CLR     A +                MOVC    A,@A+DPTR +                ADD     A,DPL +                MOV     DPL,A +                JNC     TIDM_Next_Cont +                INC     DPH + +TIDM_Next_Cont: POP     Acc +                DJNZ    R1,TID_Main_Loop + +                POP     AR1 +                POP     AR0 +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +Send_Manager:   PUSH    Acc +                PUSH    B +                PUSH    DPL +                PUSH    DPH +                PUSH    AR0 +                PUSH    PSW + +                CLR     TD_Send_Ready + +Send_Mng_Load:  MOV     R0,#Msg_Registers +                MOV     R0_Bk1,@R0 +                MOV     A,@R0                   ; logische Adresse +                INC     R0 +                MOV     R1_Bk1,@R0 +                INC     R0 +                MOV     R2_Bk1,@R0 +                INC     R0 +                MOV     R3_Bk1,@R0 +                INC     R0 +                MOV     R4_Bk1,@R0 +                INC     R0 +                MOV     R5_Bk1,@R0 +                INC     R0 +                MOV     R6_Bk1,@R0 +                INC     R0 +                MOV     R7_Bk1,@R0 + +                MOV     DPTR,#Adr_Table +                MOVC    A,@A+DPTR +                MOV     B,Stat_Length +                SETB    RS0 +                CLR     RS1 + +                Post_Message + +                POP     PSW +                POP     AR0 +                POP     DPH +                POP     DPL +                POP     B +                POP     Acc +                RET         +;-------------------------------------------------------------------------- + +Receive_Sampler: +                lcall MESSAGE_INTERRUPT +;                SETB    Receive_Ready +                RET + + +Receive_Manager: +                PUSH    Acc +                PUSH    B +                PUSH    PSW + +                CLR     Receive_Ready +                SETB    RS0 +                CLR     RS1 + +                Take_Message +                CLR     RS0 +                MOV     Rcv_Msg_Length,A +                MOV     DPTR,#Net_Rcv_Str +                MOV     A,#ASCII_Space +                LCALL   Clear_Str + +                MOV     A,R1_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R2_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R3_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R4_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R5_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R6_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A +                INC     DPTR + +                MOV     A,R7_Bk1 +                LCALL   Bin_To_ASCII +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,B +                MOVX    @DPTR,A +                INC     DPTR +                MOV     A,#ASCII_Space +                MOVX    @DPTR,A + +                MOV     DPTR,#Net_Rcv_Str +                SETB    Ext_Dsp_Ready + +                POP     PSW +                POP     B +                POP     Acc +                RET + +;=============================== Tools ==================================== + +Is_Token_Symbol: +                PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 +                PUSH    AR3 +                PUSH    DPL +                PUSH    DPH + +                CLR     C +                MOV     DPTR,#Symbol_Table +                MOV     R0,#(Token_Str # 256) +                MOV     R1,#(Token_Str / 256) + +Is_Symb_Loop:   CLR     A +                MOVC    A,@A+DPTR +                MOV     R3,A            ; Symbolwert +                XRL     A,#TableEnd +                JZ      Is_Symb_Not_Found + +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     R2,A            ; Offset + +                INC     DPTR +                LCALL   Compare_Str +                JNC     Is_Symb_Found + +                DEC_DPTR +                DEC_DPTR +                MOV     A,DPL +                ADD     A,R2 +                MOV     DPL,A +                JNC     Is_Symb_Loop +                INC     DPH +                SJMP    Is_Symb_Loop + +Is_Symb_Found:  MOV     A,R3 +                CLR     C +                SJMP    Is_Symb_End + +Is_Symb_Not_Found: +                SETB    C + +Is_Symb_End:    POP     DPH +                POP     DPL +                POP     AR3 +                POP     AR2 +                POP     AR1 +                POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Is_Token_Module: +                PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 +                PUSH    AR3 +                PUSH    DPL +                PUSH    DPH + +                CLR     C +                MOV     DPTR,#Module_Table +                MOV     R0,#(Token_Str # 256) +                MOV     R1,#(Token_Str / 256) + +Is_Mod_Loop:    CLR     A +                MOVC    A,@A+DPTR +                MOV     R3,A            ; Modulname +                XRL     A,#TableEnd +                JZ      Is_Mod_Not_Found + +                INC     DPTR +                CLR     A +                MOVC    A,@A+DPTR +                MOV     R2,A            ; Offset + +                INC     DPTR +                LCALL   Compare_Str +                JNC     Is_Mod_Found + +                DEC_DPTR +                DEC_DPTR +                MOV     A,DPL +                ADD     A,R2 +                MOV     DPL,A +                JNC     Is_Mod_Loop +                INC     DPH +                SJMP    Is_Mod_Loop + +Is_Mod_Found:   MOV     A,R3 +                CLR     C +                SJMP    Is_Mod_End + +Is_Mod_Not_Found: +                SETB    C + +Is_Mod_End:     POP     DPH +                POP     DPL +                POP     AR3 +                POP     AR2 +                POP     AR1 +                POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Bin_To_ASCII:   PUSH    AR0 +                PUSH    DPL +                PUSH    DPH + +                MOV     DPTR,#BTA_Table +                MOV     B,#16 +                DIV     AB +                MOVC    A,@A+DPTR +                MOV     R0,A +                MOV     A,B +                MOVC    A,@A+DPTR +                MOV     B,A +                MOV     A,R0 + +                POP     DPH +                POP     DPL +                POP     AR0 +                RET + +BTA_Table:      DB      "0123456789ABCDEF" + +;-------------------------------------------------------------------------- + +ASCII_To_Bin:   IRP     Source,Acc,P2,DPL,DPH,AR0,AR1,AR2,AR3 +                PUSH    Source +                ENDM + +                MOV     R0,#(Token_Str # 256) +                MOV     R1,#(Token_Str / 256) +                MOV     DPTR,#ATB_Table +                MOV     ASCII_Low_Byte,#00 +                MOV     ASCII_High_Byte,#00 +                MOV     R2,#00 + +ATB_Search:     INC_R0R1 +                INC     R2 +                MOV     P2,R1 +                MOVX    A,@R0 +                JNZ     ATB_Search + +                DEC_R0R1 + +ATB_Loop:       CLR     C +                MOV     P2,R1 +                MOVX    A,@R0 +                LCALL   Is_Digit +                JC      ATB_Not_Digit +                MOV     R3,A +                JZ      ATB_Next + +ATB_Add_Loop:   CLR     A +                MOVC    A,@A+DPTR +                CJNE    A,#0FFh,ATB_Add_Cont +                SJMP    ATB_False +ATB_Add_Cont:   ADD     A,ASCII_Low_Byte +                MOV     ASCII_Low_Byte,A +                MOV     A,#01 +                MOVC    A,@A+DPTR +                ADDC    A,ASCII_High_Byte +                JC      ATB_End +                MOV     ASCII_High_Byte,A +                DJNZ    R3,ATB_Add_Loop + +ATB_Next:       INC     DPTR +                INC     DPTR +                DEC_R0R1 +                DJNZ    R2,ATB_Loop + +                CLR     C                               ; +                MOV     A,ASCII_High_Byte               ; Overflow (+) ? +                MOV     C,Acc.7                         ; +                SJMP    ATB_End                         ; + +ATB_Not_Digit:  CJNE    A,#45,ATB_False +                CJNE    R2,#1,ATB_False +                CLR     C +                CLR     A +                SUBB    A,ASCII_Low_Byte +                MOV     ASCII_Low_Byte,A +                CLR     A +                SUBB    A,ASCII_High_Byte +                MOV     ASCII_High_Byte,A + +                CLR     C                               ; +                MOV     A,ASCII_High_Byte               ; +                MOV     C,Acc.7                         ; Overflow (-) ? +                CPL     C                               ; +                SJMP    ATB_End                         ; + +ATB_False:      SETB    C + +ATB_End:        IRP     Target,AR3,AR2,AR1,AR0,DPH,DPL,P2,Acc +                POP     Target +                ENDM +                RET + +ATB_Table:      DB      001h,000h +                DB      00Ah,000h +                DB      064h,000h +                DB      0E8h,003h +                DB      010h,027h +                DB      0FFh + +;-------------------------------------------------------------------------- + +Jump_Blank_Str: +                PUSH    Acc + +JB_Loop:        MOV     A,#00 +                MOVC    A,@A+DPTR +                JZ      JB_End +                INC     DPTR +                SJMP    JB_Loop + +JB_End:         POP     Acc +                RET + +;-------------------------------------------------------------------------- +;Routine :      Clear_Str +;Parameter:     A (Loeschzeichen) +;               DPTR (zu loeschender String) + +Clear_Str:      PUSH    DPL +                PUSH    DPH +                PUSH    AR1 +                MOV     R1,#Kb_Max_Length +Clear_Str_Loop: MOVX    @DPTR,A +                INC     DPTR +                DJNZ    R1,Clear_Str_Loop +                POP     AR1 +                POP     DPH +                POP     DPL +                RET + +;-------------------------------------------------------------------------- +;Routine :      Clear_Pos_Str  (loescht einen String von Startposition bis Ende) +;Parameter:     DPTR    (zu loeschender String) +;               A       (Loeschzeichen) +;               B       (Startposition) + + +Clear_Pos_Str:  PUSH    Acc +                PUSH    PSW +                PUSH    DPL +                PUSH    DPH +                PUSH    AR1 + +                MOV     R1,B +                CJNE    R1,#Kb_Max_Length,CPS_Cont +                SJMP    CPS_End +CPS_Cont:       PUSH    Acc +                MOV     A,B +                ADD     A,DPL +                MOV     DPL,A +                JNC     CPS_Cont2 +                INC     DPH + +CPS_Cont2:      CLR     C +                MOV     A,#Kb_Max_Length +                SUBB    A,B +                MOV     R1,A +                POP     Acc +                JC      CPS_End +CPS_Loop:       MOVX    @DPTR,A +                INC     DPTR +                DJNZ    R1,CPS_Loop + +CPS_End:        POP     AR1 +                POP     DPH +                POP     DPL +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- +; Routine :     Copy_Pos_Buffer  (kopiert einen String in Kb_Str_Buffer +;                                 ab Kb_Cursor; dieser zeigt dann nach +;                                 dem letzten Zeichen des Strings) +; Parameter:    DPTR (zu kopierender String) + + +Copy_Pos_Buffer: +                PUSH    Acc +                PUSH    PSW +                PUSH    P2 +                PUSH    DPL +                PUSH    DPH +                PUSH    AR0 +                PUSH    AR1 + +                MOV     R0,#(Kb_Str_Buffer # 256) +                MOV     R1,#(Kb_Str_Buffer / 256) +                MOV     A,R0 +                ADD     A,Kb_Cursor +                MOV     R0,A +                JNC     CPB_Loop +                INC     R1 + +CPB_Loop:       MOV     A,Kb_Cursor +                CJNE    A,#Kb_Max_Length,CPB_Loop_Cont +                DEC     Kb_Cursor +                SJMP    CPB_End + +CPB_Loop_Cont:  CLR     A +                MOVC    A,@A+DPTR +                JZ      CPB_End +                MOV     P2,R1 +                MOVX    @R0,A +                INC     DPTR +                INC     Kb_Cursor +                INC_R0R1 +                SJMP    CPB_Loop + +CPB_End:        POP     AR1 +                POP     AR0 +                POP     DPH +                POP     DPL +                POP     P2 +                POP     PSW +                POP     Acc +                RET + +;-------------------------------------------------------------------------- + +UpCase:         PUSH    PSW +                PUSH    AR0 + +                MOV     R0,A +                CLR     C +                SUBB    A,#97 +                JC      UpCase_Rest +                MOV     A,#122 +                SUBB    A,R0 +                JC      UpCase_Rest +                MOV     A,R0 +                SUBB    A,#32 +                SJMP    UpCase_End +UpCase_Rest:    MOV     A,R0 + +UpCase_End:     POP     AR0 +                POP     PSW +                RET + +;-------------------------------------------------------------------------- + +Is_Digit:       PUSH    AR0 + +                CLR     C +                MOV     R0,A +                SUBB    A,#48 +                JC      Is_Digit_Rest +                MOV     A,#57 +                SUBB    A,R0 +                JC      Is_Digit_Rest +                MOV     A,R0 +                SUBB    A,#48 +                SJMP    Is_Digit_End + +Is_Digit_Rest:  MOV     A,R0 + +Is_Digit_End:   POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Wait_2s:        PUSH    AR0 +                PUSH    AR1 +                PUSH    AR2 + +                MOV     R2,#12 +Wait_Loop2:     MOV     R1,#250 +Wait_Loop1:     MOV     R0,#250 +Wait_Loop0:     DJNZ    R0,Wait_Loop0 +                DJNZ    R1,Wait_Loop1 +                DJNZ    R2,Wait_Loop2 + +                POP     AR2 +                POP     AR1 +                POP     AR0 +                RET + +;-------------------------------------------------------------------------- + +Clr_Msg_Buffer: PUSH    AR0 +                PUSH    AR1 + +                MOV     R1,#8 +                MOV     R0,#Msg_Registers +Clr_Msg_Loop:   MOV     @R0,#00 +                INC     R0 +                DJNZ    R1,Clr_Msg_Loop + +                POP     AR1 +                POP     AR0 +                RET + +;------------------------------------------------------------------------------ + +;Stackarea in idata nach oben nur durch Prozessorram begrenzt!! +;Dieses Segment muá IMMER als letztes stehen!!! + +        segment idata + +Stack:          db ?                    ;ab hier liegt der Stack + +;------------------------------------------------------------------------------ + +                end diff --git a/tests/t_mic51/t_mic51.doc b/tests/t_mic51/t_mic51.doc new file mode 100644 index 0000000..94ba34e --- /dev/null +++ b/tests/t_mic51/t_mic51.doc @@ -0,0 +1,6 @@ ++----------------------  Test Application MIC51  ----------------------------+ +|                                                                            | +|  This is a student's program from RWTH Aachen's microprocessor course.  It | +|  tests the MCS51 (not 251!) codegenerator and makes heavy use of macros.   | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_mic51/t_mic51.inc b/tests/t_mic51/t_mic51.inc new file mode 100644 index 0000000..27d4051 --- /dev/null +++ b/tests/t_mic51/t_mic51.inc @@ -0,0 +1,165 @@ +; t_mic51.asm-Includefile für Assembler-Programm +ROB equ 10H +UC_ROB equ 1H +FRS equ 11H +UC_FRS equ 2H +TEACHROB equ 12H +UC_TEACH_ROB equ 3H +TEACHFRS equ 13H +UC_TEACH_FRS equ 4H +TEACHKEY equ 14H +UC_TEACH_KEY equ 5H +MEMROB equ 15H +UC_TEACH_ROB equ 3H +MEMFRS equ 16H +UC_TEACH_FRS equ 4H +PC_SIO equ 17H +UC_PC_SIO equ 0EH +ON equ 1H +OFF equ 0H +PLUS equ 1H +MINUS equ 0H +FAST equ 1H +SLOW equ 0H +SUPERSLOW equ 2H +QUEUE_WARNING equ 81H +QUEUE_FULL equ 61H +UNDEF_PAR equ 62H +UNDEF_PIECE_REF equ 63H +UNDEF_DRILL_REF equ 64H +UNDEF_KOORD_REF equ 65H +INTERNAL_ERROR equ 66H +END_X_PLUS equ 67H +END_Y_PLUS equ 68H +END_Z_PLUS equ 69H +END_V_PLUS equ 6AH +END_X_MINUS equ 70H +END_Y_MINUS equ 71H +END_Z_MINUS equ 72H +END_V_MINUS equ 73H +HARD_END_X_PLUS equ 74H +HARD_END_Y_PLUS equ 75H +HARD_END_Z_PLUS equ 76H +HARD_END_V_PLUS equ 77H +HARD_END_X_MINUS equ 78H +HARD_END_Y_MINUS equ 79H +HARD_END_Z_MINUS equ 7AH +HARD_END_V_MINUS equ 7BH +MOVEAB equ 1H +MOVEAS equ 2H +MOVEAE equ 3H +MOVEARW equ 4H +MOVEALW equ 5H +MOVEAH equ 6H +MOVEAPOS1 equ 7H +MOVEAPOS2 equ 8H +MOVERB equ 9H +MOVERS equ 0AH +MOVERE equ 0BH +MOVERRW equ 0CH +MOVERLW equ 0DH +MOVERH equ 0EH +MOVERPOS1 equ 0FH +MOVERPOS2 equ 10H +MOVECBL equ 11H +MOVECBR equ 12H +STOPCB equ 13H +MOVECSU equ 14H +MOVECSD equ 15H +STOPCS equ 16H +MOVECEU equ 17H +MOVECED equ 18H +STOPCE equ 19H +MOVECHU equ 1AH +MOVECHD equ 1BH +STOPCHP equ 1CH +MOVECHL equ 1DH +MOVECHR equ 1EH +STOPCHT equ 1FH +MOVECHO equ 20H +MOVECHC equ 21H +STOPCH equ 22H +ROBVELOCITY equ 23H +ROBGOHOME equ 24H +SETHOME equ 25H +GIBPOS1 equ 26H +GIBPOS2 equ 27H +ROBGIBREADY equ 28H +ROBINIT equ 29H +ROBDEINIT equ 2AH +INIT equ 1H +DEINIT equ 2H +MOVECX equ 3H +MOVECY equ 4H +MOVECZ equ 5H +MOVECV equ 6H +STOPCX equ 7H +STOPCY equ 8H +STOPCZ equ 9H +STOPCV equ 0AH +FRSVELOCITY equ 0BH +FRSVELOCITYDRAW equ 0CH +FRSGOHOME equ 0DH +REFFAHRT equ 0EH +SETDRILLREF equ 0FH +SETPIECEREF equ 10H +MOVEX equ 11H +MOVEY equ 12H +MOVEZ equ 13H +MOVEAPOS equ 14H +MOVERX equ 15H +MOVERY equ 16H +MOVERZ equ 17H +MOVERV equ 18H +MOVERPOS equ 19H +MOVEVOPEN equ 1AH +MOVEVCLOSE equ 1BH +MOVEV equ 1CH +GOPIECEREFPOS equ 1DH +MOVEPR equ 1EH +DRILL equ 1FH +SETMASTERADRESS equ 20H +GIBFRSPOS1 equ 21H +GIBFRSPOS2 equ 22H +GIBPOSP equ 23H +GIBSTATUS equ 24H +GIBREADY equ 25H +LOADROB equ 1H +SAVEROB equ 2H +STARTROBRUN equ 3H +STOREROBPOS equ 4H +STOREROBSYNC equ 5H +STOREROBREADY equ 6H +INITROBTEACH equ 7H +DEINITROBTEACH equ 8H +CLEARROBTEACH equ 9H +RESETROBTEACH equ 0AH +GETROBSYNC equ 0BH +GETROBREADY equ 0CH +ROBPOS1 equ 0DH +ROBPOS2 equ 0EH +DEBUGROB equ 0FH +LOADFRS equ 1H +SAVEFRS equ 2H +STARTFRSRUN equ 3H +STOREFRSPOS equ 4H +STOREFRSSYNC equ 5H +STOREFRSREADY equ 6H +STOREFRSPIECEREF equ 7H +STOREFRSTIEFE equ 8H +STOREFRSDRILL equ 9H +INITFRSTEACH equ 0AH +DEINITFRSTEACH equ 0BH +CLEARFRSTEACH equ 0CH +RESETFRSTEACH equ 0DH +GETFRSSYNC equ 0EH +GETFRSREADY equ 0FH +FRSPOS1 equ 10H +FRSPOS2 equ 11H +FRSPIECEREF equ 12H +FRSTIEFE equ 13H +GETFRSERROR equ 14H +GETFRSWARNING equ 15H +DEBUGFRS equ 16H +BUG equ 1H +; Ende Includefile für Assembler-Programm diff --git a/tests/t_mic51/t_mic51.ori b/tests/t_mic51/t_mic51.ori Binary files differnew file mode 100755 index 0000000..e9ce88f --- /dev/null +++ b/tests/t_mic51/t_mic51.ori diff --git a/tests/t_mic51/t_mod1.asm b/tests/t_mic51/t_mod1.asm new file mode 100644 index 0000000..fb91ac8 --- /dev/null +++ b/tests/t_mic51/t_mod1.asm @@ -0,0 +1,487 @@ + +; Aufgabe Nr.: Teach- In Einheit fuer uP- Praktikum II +;              --- Link- Modul --- +; Autor: Joerg Vollandt  +; erstellt am : 13.06.1994 +; letzte Aenderung am : 02.08.1994 +; Bemerkung : +; +; Dateiname : t_mod1.asm +; +;===================================================================== +        SEGMENT CODE +        USING 0 + +        INCLUDE MAKRO1.ASM +        INCLUDE TAST1.ASM +        INCLUDE MEM1.ASM +        INCLUDE TEACH1.ASM +        INCLUDE RUN1.ASM +        INCLUDE DEBUG.ASM +;===================================================================== +; Definitionen der Funktionen der Teach- In Einheit + +Adr_InitRobTeach   EQU    INIT_TEACH       ; Initialisieren der Teach- In Einheit +Adr_InitFrsTeach   EQU    INIT_TEACH       ; Initialisieren der Teach- In Einheit +Adr_DeinitRobTeach EQU     DEINIT_TEACH    ; Deinitialisieren der Teach- In Einheit +Adr_DeinitFrsTeach EQU     DEINIT_TEACH    ; Deinitialisieren der Teach- In Einheit +Adr_ClearRobTeach  EQU     CLEAR_TEACH     ; Speicher loeschen +Adr_ClearFrsTeach  EQU     CLEAR_TEACH     ; Speicher loeschen +Adr_ResetRobTeach  EQU     RESET_TEACH     ; Speicher zum lesen zuruecksetzen +Adr_ResetFrsTeach  EQU     RESET_TEACH     ; Speicher zum lesen zuruecksetzen +Adr_StoreRobPos    EQU     STORE_ROB       ; Position Roboter speichern +Adr_StoreFrsPos    EQU     STORE_FRAES     ; Position Fraese speichern +Adr_StoreRobSync   EQU     STORE_SYNC      ; Synchronisation speichern +Adr_StoreFrsSync   EQU     STORE_SYNC      ; Synchronisation speichern +Adr_StoreRobReady  EQU     STORE_READY     ; Warten auf Geraet speichern +Adr_StoreFrsReady  EQU     STORE_READY     ; Warten auf Geraet speichern +Adr_StoreFrsPieceRef EQU   STORE_PIECE_REF ; Werkstueck Nullpkt. festlegen +Adr_StoreFrsTiefe  EQU     STORE_TIEFE     ; Fraestiefe festlegen +Adr_StoreFrsDrill  EQU     STORE_DRILL     ; Fraesdatei bearbeiten +Adr_GetRobSync     EQU     GET_SYNC_MSG    ; Synchronisation empfangen +Adr_GetFrsSync     EQU     GET_SYNC_MSG    ; Synchronisation empfangen +Adr_GetRobReady    EQU     GET_READY_MSG   ; Ready empfangen +Adr_GetFrsReady    EQU     GET_READY_MSG   ; Ready empfangen +Adr_LoadRob        EQU     LOAD_ROB        ; Roboter Teach- In Datei von PC laden +Adr_LoadFrs        EQU     LOAD_FRAES      ; Fraese- Teach- In Datei von PC laden +Adr_SaveRob        EQU     SAVE_ROB        ; Roboter Teach- In Datei auf PC speichern +Adr_SaveFrs        EQU     SAVE_FRAES      ; Fraese- Teach- In Datei auf PC speichern + +Adr_RobPos1        EQU     FIRST_FROM_ROB  ; Position von Roboter 1. Teil +Adr_RobPos2        EQU     SECOND_FROM_ROB ; Position von Roboter 2. Teil +Adr_FrsPos1        EQU     FIRST_FROM_FRS  ; Position von Fraese 1. Teil +Adr_FrsPos2        EQU     SECOND_FROM_FRS ; Position von Fraese 2. Teil +Adr_FrsPieceRef    EQU     PIECE_REF_FROM_FRS ; Position von Fraese +Adr_FrsTiefe       EQU     TIEFE_FROM_FRS  ; Position von Fraese + +Adr_DebugRob       EQU     DEBUG_MEM       ; Position von Roboter 2. Teil +Adr_DebugFrs       EQU     DEBUG_MEM       ; Position von Roboter 2. Teil +Adr_StartRobRun    EQU     START_RUNNING   ; Runmanager starten +Adr_StartFrsRun    EQU     START_RUNNING   ; Runmanager starten + +Adr_GetFrsError    EQU     Get_Error_from_frs   ; +Adr_GetFrsWarning  EQU     Get_Warning_from_frs ; + + +MemRob_MsgCall_Tab: +        include defMsg.inc +MemRob_MsgCall_Tend: + +MemFrs_MsgCall_Tab: +        include defMsg.inc +MemFrs_MsgCall_Tend: + +;------------------------------------------------------------------------------ +; Speicherdefinitionen + + +        SEGMENT BITDATA + +MSG             DB      ? +Sp_MSG          DB      ? +READY           DB      ? +CRC             DB      ? + +TESTBIT         DB      ? +RUNNINGBIT      DB      ? +Sync_Waiting    DB      ? +Ready_Waiting   DB      ? +Drilling        DB      ? +Drill_down      DB      ? +PAUSE           DB      ? +FrsWarning      DB      ? +SingleStep      DB      ? +Break           DB      ? + +Ref_Flag        DB      ? +Tiefe_Flag      DB      ? + +        SEGMENT DATA + +Sp_MSG_Buffer     DB      ? +T_Sync_Counter    DB      ? +R_Sync_Counter    DB      ? +Queue_Counter     DB      ? + +Frs_Ref_x         DW      ? +Frs_Ref_y         DW      ? +Frs_Ref_z         DW      ? +Frs_Ref_Tiefe     DW      ? + +;--------------------------------------------------------------------- +        SEGMENT CODE +;--------------------------------------------------------------------- +; Funktion : CALL_BACK- Fkt. wird nach Empfang einer Message +;            aufgerufen. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +MESSAGE_BIT             BIT     ACC.0   ; Message Bits +SPECIAL_MESSAGE_BIT     BIT     ACC.2 +START_BIT               BIT     ACC.0   ; Special- Message Bits +STOP_BIT                BIT     ACC.1 +RESET_BIT               BIT     ACC.3 +PAUSE_BIT               BIT     ACC.2 +AUX1_BIT                BIT     ACC.4 +AUX2_BIT                BIT     ACC.5 + +MESSAGE_INTERRUPT: +        PUSH ACC +        LCALL READ_STATUS +        JNB SPECIAL_MESSAGE_BIT,MESSAGE_INTERRUPT1 +        LCALL READ_SPECIAL_MESSAGE              ; Special_Message lesen +        MOV Sp_MSG_Buffer,A                     ; und retten +        SETB Sp_MSG +        POP ACC +        RET + +MESSAGE_INTERRUPT1: +        JNB MESSAGE_BIT,MESSAGE_INTERRUPT2 +        SETB MSG                                ; Normale Msg.empfangen +MESSAGE_INTERRUPT2: +        POP ACC +        RET + + +;--------------------------------------------------------------------- +; Funktion : Message- Scheduler fuer Speichermodul. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; +; **************************************************************************** +; R0    Empf„nger (logische Adresse) +; R1    Message +; R2 - R7 Parameter +; **************************************************************************** + +Message_Handler MACRO   Modul + +        push PSW +        push ACC +        push DPH +        push DPL + +        mov  DPTR,#Msg_Hndl_Ret        ; Ruecksprungadresse vom indirekten +        push DPL                        ; Jump ergibt indirekten Call +        push DPH +        mov  DPTR,#Modul_MsgCall_Tab +        mov  A,AR1 +        clr  C +        rlc  A +        mov  AR1,A +        jnc  No_inc +        inc DPH +No_inc: movc A,@A+DPTR +        push ACC +        inc DPTR +        mov  A,AR1 +        movc A,@A+DPTR +        push ACC +        ret                             ; indireckter Sprung + +Msg_Hndl_Ret: +        pop  DPL +        pop  DPH +Msg_Ha_Exit: +        pop  ACC +        pop  PSW + +        ENDM + +;--------------------------------------------------------------------- +; Funktion : Message- Scheduler fuer PC- Messages. +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +MEM_SCHEDULER: +        PUSH PSW +        PUSH ACC +        CLR MSG +        MOV A,R0 +        IFCALL  02h,GET_FROM_PC         ; TI-Datei von PC an Roboter +        IFCALL  03h,GET_FROM_PC         ; TI-Datei von PC an Fraese +        IFCALL  01h,GET_WORKFR_FROM_PC  ; Fraesdatei von PC +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : Message auf die Module verteilen +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : - +; Stackbedarf : +; Zeitbedarf : +; + +Dispatch_Msg: +        PUSH PSW +        PUSH ACC +        MOV A,R0 +        CJNE A,#10h,Dis_Msg0            ; Msg.-Nr. <=10h sind von PC +Dis_Msg0: JC Dis_Msg01                  ; und werden von MEM_SCHEDULER +        LJMP Dis_Msg02                  ; bearbeitet +Dis_Msg01: +        LCALL MEM_SCHEDULER +        LJMP Dis_Msg_Ret + +Dis_Msg02: +        cjne A,#TeachRob,Dis_Msg10 +        LJMP Dis_Msg11 +Dis_Msg10: LJMP Dis_Msg2 +Dis_Msg11: +        ifdef TeachRob_MsgCall_Tab +          Message_Handler TeachRob +        endif +        ljmp Dis_Msg_Ret + +Dis_Msg2: cjne A,#TeachFrs,Dis_Msg20 +        LJMP Dis_Msg21 +Dis_Msg20: LJMP Dis_Msg3 +Dis_Msg21: +        ifdef TeachFrs_MsgCall_Tab +          Message_Handler TeachFrs +        endif +        ljmp Dis_Msg_Ret + +Dis_Msg3: cjne A,#Rob,Dis_Msg30 +        LJMP Dis_Msg31 +Dis_Msg30: LJMP Dis_Msg4 +Dis_Msg31: +        ifdef Rob_MsgCall_Tab +          Message_Handler Rob +        endif +        ljmp Dis_Msg_Ret + +Dis_Msg4: cjne A,#Frs,Dis_Msg40 +        LJMP Dis_Msg41 +Dis_Msg40: LJMP Dis_Msg5 +Dis_Msg41: +        ifdef Frs_MsgCall_Tab +          Message_Handler Frs +        endif +        ljmp Dis_Msg_Ret + +Dis_Msg5: cjne A,#MemFrs,Dis_Msg50 +        LJMP Dis_Msg51 +Dis_Msg50: LJMP Dis_Msg6 +Dis_Msg51: +        ifdef MemFrs_MsgCall_Tab +          Message_Handler MemFrs +        endif +        ljmp Dis_Msg_Ret + +Dis_Msg6: cjne A,#MemRob,Dis_Msg60 +        LJMP Dis_Msg61 +Dis_Msg60: LJMP Dis_Msg7 +Dis_Msg61: +        ifdef MemRob_MsgCall_Tab +          Message_Handler MemRob +        endif +        ljmp Dis_Msg_Ret + +Dis_Msg7: + +Dis_Msg_Ret: +        POP ACC +        POP PSW +        RET + +;--------------------------------------------------------------------- +; Funktion : START-Routine +; Aufrufparameter : Wird durch die globale Message "START" ausgeloesst +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +GLOBAL_START: +        ;LCD 40H,"START-Routine                           " +        LCALL START_RUNNING +        RET + +;--------------------------------------------------------------------- +; Funktion : NOTAUS-Routine +; Aufrufparameter : Wird durch die globale Message "STOP" ausgeloesst +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +GLOBAL_NOTAUS: +        LCD 40H,"NOTAUS!!! Abbruch.                      " +        CLR RUNNINGBIT +        LCALL INIT_TEACH +        LCALL RESET_TEACH +        RET + +;--------------------------------------------------------------------- +; Funktion : RESET-Routine +; Aufrufparameter : Wird durch die globale Message "RESET" ausgeloesst +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +GLOBAL_RESET: +        LCD 40H,"Teachin- u. Runmanager initialisiert.   " +        LCALL INIT_TEACH +        LCALL INIT_RUN +        LCALL RESET_TEACH +        LCALL INIT_FRS +        CLR TESTBIT + +        RET + +;--------------------------------------------------------------------- +; Funktion : PAUSE-Routine +; Aufrufparameter : Wird durch die globale Message "PAUSE" ausgeloesst +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +GLOBAL_PAUSE: +        JB RUNNINGBIT,GLOBAL_PAUSE_1 +        LJMP GLOBAL_PAUSE_ENDE +GLOBAL_PAUSE_1: +        CPL PAUSE +        JNB PAUSE,GLOBAL_PAUSE_AUS +        LCD 40H,"Pausemodus. Weiter mit <PAUSE>.         " +        RET +GLOBAL_PAUSE_AUS: +        LCD 40H,"Pausemodus aufgehoben.                  " +        RET +GLOBAL_PAUSE_ENDE: +        RET + +;--------------------------------------------------------------------- +; Funktion : AUX1-Routine +; Aufrufparameter : Wird durch die globale Message "AUX1" ausgeloesst +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +GLOBAL_AUX1: +        LCD 40H,"AUX1-Routine                            " +        SETB SingleStep +        JNB Ready_Waiting,GLOBAL_AUX1_ENDE +        SETB Break +GLOBAL_AUX1_ENDE +        RET + +;--------------------------------------------------------------------- +; Funktion : AUX2-Routine +; Aufrufparameter : Wird durch die globale Message "AUX2" ausgeloesst +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; +GLOBAL_AUX2: +        ;LCD 40H,"AUX2-Routine                            " +        LCD 40H,"Teachin- Datei wird gelaeden.           " +        LCALL LOAD_ROB +        LCALL LOAD_FRAES +        RET + +;--------------------------------------------------------------------- +; Funktion : Hauptprogramm fuer das Speichermodul +; Aufrufparameter : - +; Ruechgabeparameter : - +; Veraenderte Register : +; Stackbedarf : +; Zeitbedarf : +; + +Main_Event_Loop: +        JNB Sp_MSG,No_Sp_Msg +        LCALL Do_Sp_Msg +        JB Sp_MSG,Main_Event_Loop +No_Sp_Msg: +        JNB MSG,No_Msg +        LCALL Do_Msg +        JB MSG,Main_Event_Loop +No_Msg: +        JNB RUNNINGBIT,No_Runnig +        LCALL Do_Runnig +No_Runnig: +        JB Sp_MSG,Main_Event_Loop +        JB MSG,Main_Event_Loop + +        RET + + +Do_Msg: CLR MSG +        PUSH_ALL +        LCALL READ_MESSAGE +        LCALL Dispatch_Msg +        POP_ALL +        RET + +Do_Sp_Msg: +        CLR Sp_MSG +        PUSH ACC +        MOV A,Sp_MSG_Buffer +SM_START: JNB START_BIT,SM_NOTAUS       ; Special- Message Fkt. +        LCALL GLOBAL_START              ; aufrufen +        POP ACC +        RET +SM_NOTAUS: JNB STOP_BIT,SM_RESET +        LCALL GLOBAL_NOTAUS +        POP ACC +        RET +SM_RESET: JNB RESET_BIT,SM_PAUSE +        LCALL GLOBAL_RESET +        POP ACC +        RET +SM_PAUSE: JNB PAUSE_BIT,SM_AUX1 +        LCALL GLOBAL_PAUSE +        POP ACC +        RET +SM_AUX1: JNB AUX1_BIT,SM_AUX2 +        LCALL GLOBAL_AUX1 +        POP ACC +        RET +SM_AUX2: JNB AUX2_BIT,SM_ENDE +        LCALL GLOBAL_AUX2 +        POP ACC +        RET +SM_ENDE: POP ACC +        RET + +Do_Runnig: +        JB Drilling,Do_Drilling +        JB PAUSE,Do_Waiting +        JB Sync_Waiting,Do_Waiting +        JB Ready_Waiting,Do_Waiting +        LCALL RUN_MODUL +Do_Waiting: +        RET + +Do_Drilling: +        JNB FrsWarning,No_FrsWarning            ; Queue- Warnung von Frs +        PUSH_ALL +        post_message2 #Frs,#GibReady,#MemFrs,#GetFrsReady,#0 +        POP_ALL +        CLR FrsWarning +        SETB READY_WAITING +No_FrsWarning: +        RET + +;===================================================================== +;        END +;--------------------------------------------------------------------- + diff --git a/tests/t_msp/asflags b/tests/t_msp/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_msp/asflags diff --git a/tests/t_msp/t_msp.asm b/tests/t_msp/t_msp.asm new file mode 100644 index 0000000..c0bb12c --- /dev/null +++ b/tests/t_msp/t_msp.asm @@ -0,0 +1,116 @@ +        cpu     msp430 + +        include regmsp.inc + +ede     equ     0f016h +toni    equ     01114h + +        mov     r12,r7 +        mov     pc,r7 +        mov     sp,r7 +        mov     sr,r7 + +        mov     2(r5),6(r6) + +        mov     ede,toni + +        mov     &ede,&toni + +        mov     @r10,0(r11) + +        mov     @r10+,0(r11) + +        mov     #45,toni +        mov     #0,toni +        mov     #1,toni +        mov     #2,toni +        mov     #4,toni +        mov     #8,toni +        mov     #-1,toni + +        dadd    #45,r4 + +        rrc     r5 +        rra.b   toni +        push    pc +        swpb    &ede +        call    1234h +        sxt     @r5+ + +        reti + +        jmp     234h +        jne     $ +        jn      $+2 + +;---------------------------------- +; emulierte Befehle + +        adc     r6 +        adc.w   r6 +        adc.b   r6 +        dadc    @r4 +        dadc.w  @r4 +        dadc.b  @r4 +        dec     toni +        dec.w   toni +        dec.b   toni +        decd    &toni +        decd.w  &toni +        decd.b  &toni +        inc     ede +        inc.w   ede +        inc.b   ede +        incd    &ede +        incd.w  &ede +        incd.b  &ede +        sbc     55h(r9) +        sbc.w   55h(r9) +        sbc.b   55h(r9) + +        inv     @r6 +        inv.w   @r6 +        inv.b   @r6 +        rla     r5 +        rla.w   r5 +        rla.b   r5 +        rlc     @r14 +        rlc.w   @r14 +        rlc.b   @r14 + +        clr     0(r10) +        clr.w   0(r10) +        clr.b   0(r10) +        clrc +        clrn +        clrz +        pop     sr +        setc +        setn +        setz +        tst     toni +        tst.w   toni +        tst.b   toni + +        br      r5 +        dint +        eint +        nop +        ret + +        padding on +        .byte   1,2,3,4 +        .byte   "Hello world" +        .byte   "Hello world!" +        .word   1,2,3,4 +        .bss    20 +        .bss    21 + +        padding off +        .byte   1,2,3,4 +        .byte   "Hello world" +        .byte   "Hello world!" +        .word   1,2,3,4 +        .bss    20 +        .bss    21 + diff --git a/tests/t_msp/t_msp.doc b/tests/t_msp/t_msp.doc new file mode 100644 index 0000000..da3085d --- /dev/null +++ b/tests/t_msp/t_msp.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application MSP ----------------------------+ +|                                                                            | +|        This is a (synthetic) test of the MSP430 instruction set            | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_msp/t_msp.ori b/tests/t_msp/t_msp.ori Binary files differnew file mode 100644 index 0000000..4278619 --- /dev/null +++ b/tests/t_msp/t_msp.ori diff --git a/tests/t_parsys/asflags b/tests/t_parsys/asflags new file mode 100644 index 0000000..01f6552 --- /dev/null +++ b/tests/t_parsys/asflags @@ -0,0 +1 @@ +-c
\ No newline at end of file diff --git a/tests/t_parsys/float.i68 b/tests/t_parsys/float.i68 new file mode 100644 index 0000000..fbfc1e9 --- /dev/null +++ b/tests/t_parsys/float.i68 @@ -0,0 +1,1226 @@ +; FLOAT.I68 +;----------------------------------------------------------------------------- +;  Fliesskommaroutinen fuer den PC-PAR 68000, Version ohne 68881 +;  entnommen mc 11/88, c't... + +;----------------------------------------------------------------------------- +; Definitionen + +vorz		equ		0 +subflag		equ		1 +maxexpo		equ		255 +bias		equ		127 +extend          equ             $10 +e               equ             $402df854       ; exp(1) +ln2             equ             $3f317218       ; ln(2) +ln10            equ             $40135d8e       ; ln(10) +eins            equ             $3f800000       ; 1.0 +zwei            equ             $40000000       ; 2.0 +pi2             equ             $40c90fdb       ; Pi*2 +pi              equ             $40490fdb       ; Pi +pihalf          equ             $3fc90fdb       ; Pi/2 + +;----------------------------------------------------------------------------- +; Librarykopf: + + +S_FloatLib:     dc.l            S_floatlibend-S_floatlibstart ; Laenge +S_floatlibstart: +                dc.l            -1              ; Speicher fuer Zeiger +		dc.b            "FLOAT",0       ; Name +                ds              0 + + + +;----------------------------------------------------------------------------- +; Sprungtabelle: + +		bra.l		S_fadd +		bra.l		S_fsub +		bra.l		S_fmul +		bra.l		S_fdiv +		bra.l		S_fmul2 +		bra.l		S_fsqrt +                bra.l           S_fabs +                bra.l           S_floatlibnop +		bra.l		S_fcmp +		bra.l		S_fitof +		bra.l		S_fftoi +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +		bra.l		S_fexp +		bra.l		S_fsinh +		bra.l		S_fcosh +		bra.l		S_ftanh +		bra.l		S_fcoth +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +		bra.l		S_fln +		bra.l		S_flog +		bra.l		S_fasinh +		bra.l		S_facosh +		bra.l		S_fatanh +		bra.l		S_facoth +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +		bra.l		S_fsin +		bra.l		S_fcos +		bra.l		S_ftan +		bra.l		S_fcot +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +                bra.l           S_floatlibnop +		bra.l		S_fasin +		bra.l		S_facos +		bra.l		S_fatan +		bra.l		S_facot + + +;----------------------------------------------------------------------------- +; Konstanten : + +S_Const1        dc.s            1.0 + +;----------------------------------------------------------------------------- +; Nullprozedur : + +S_floatlibnop:  rts + +;----------------------------------------------------------------------------- +; Addition :  D0.S = D0.S + D1.S + +		ds		0 +S_fadd: +		addq.l		#1,_fadd_cnt.w +                movem.l		d1-d5,-(a7)	; benoetigte Register retten +		rol.l		#1,d0		; Operanden rotieren und in Form +		rol.l		#1,d1		; eeee eeee ffff ... fffs bringen +		move.l		d0,d2 +		sub.l		d1,d2		; Differenz beider Zahlen bilden +		bcc.s		fadd_1 +		exg		d0,d1		; ggf. vertauschen, so dass der +fadd_1:		move.b		d0,d3		; kleinere in Register D1 steht +		and.b		#1,d3     	; maskiere das Vorzeichenbit +		btst		#vorz,d2	; haben beide gleiches Vorzeichen ? +		beq.s		fadd_2		; bei verschiedenen Vorzeichen +		bset		#subflag,d3	; Flag fuer Subtraktion setzen +fadd_2:		rol.l		#8,d0		; Form: ffff ... fffs eeee eeee +		clr.w		d4		; Exponent der ersten Zahl +		move.b		d0,d4		; wird im Register D4 aufgebaut +		sne		d0		; falls ungleich Null, dann +		ror.l		#1,d0		; implizite Eins, sonst implizite +		clr.b		d0		; Null erzeugen, neu positionieren + +		rol.l		#8,d1		; jetzt das gleiche fuer den +		clr.w		d5		; zweiten Operanden, der Exponent +		move.b		d1,d5		; kommt ins Register D5 +		sne		d1 +		ror.l		#1,d1 +		clr.b		d1 + +; In den Registern D0 und D1 stehen jetzt nur noch die Mantissen +; im Format ffff ... ffff 0000 0000, also linksbuendig, wobei die +; ehemals implizite Null bzw. Eins nun explizit an erster Stelle steht. +; In den Registern D4 und D5 stehen die Exponenten der beiden Zahlen. +; Das Vorzeichen des Ergebnisses sowie die Subtraktionsflags sind im +; Register D3 zwischengespeichert. + +		move.w		d4,d2		; Jetzt Differenz der Exponenten +		sub.w		d5,d2		; berechnen +		cmp.w		#24,d2		; groesser als 24 ? +		bgt.s		fadd_rnd	; ja, --> Ergebnis ist groessere Zahl +		lsr.l		d2,d1		; Mantisse um (D2)-Bits verschieben +		btst		#subflag,d3	; Subtraktion oder Addition ? +		bne.s		fadd_subtr	; ggf. zur Subtraktion springen +		add.l		d1,d0		; die beiden Mantissen addieren +		bcc.s		fadd_rnd	; kein Ueberlauf --> zum Runden +		roxr.l		#1,d0		; Ueberlauf einschieben +		addq.w		#1,d4		; Exponent korrigieren +		bra.s		fadd_rnd	; und zum Runden + +fadd_subtr:	sub.l		d1,d0		; die beiden Mantissen subtrahieren +		beq.s		fadd_zero	; bei Null ist das Gesamtergebnis Null +		bmi.s		fadd_rnd	; bei fuehrender Eins zum Runden +fadd_nrm:	tst.w		d4		; Exponent ist schon Null ? +		beq.s		fadd_rnd	; dann ist Ergebnis denormalisiert +		subq.w		#1,d4		; Exponent erniedrigen +		lsl.l		#1,d0		; Mantisse normalisieren bis +		bpl.s		fadd_nrm	; fuehrende Eins auftaucht + +fadd_rnd:	add.l		#$80,d0		; jetzt Runden auf Bit hinter +		bcc.s		fadd_nov	; Mantisse +		roxr.l		#1,d0		; bei Ueberlauf Mantisse normalisieren +		addq.w		#1,d4		; und Exponent korrigieren +fadd_nov:	clr.b		d0		; Rest-Mantisse loeschen +		tst.l		d0		; Ist die Mantisse komplett Null ? +		beq.s		fadd_zero	; ja, dann ist Ergebnis auch Null +		cmp.w		#maxexpo,d4	; Exponent-Ueberlauf ? +		blt.s		fadd_nue +		move.w		#maxexpo,d4	; Unendlich Exponent = maxexpo +		clr.l		d0		; 	    Mantisse = Null +		bra.s		fadd_den + +fadd_nue:	tst.w		d4		; Exponent Null ( Zahl denormalisiert? ) +		beq.s		fadd_den	; ja --> +		lsl.l		#1,d0		; fuehrendes Bit wird nicht gespeichert +fadd_den:	move.b		d4,d0		; Exponent einsetzen +		ror.l		#8,d0		; Form: eeee eeee ffff ... fffx +		roxr.b		#1,d3		; Vorzeichen in Carry schieben +		roxr.l		#1,d0		; Form: seee eeee efff ... ffff + +fadd_zero: +		movem.l		(a7)+,d1-d5	; Register restaurieren +		rts				; Ende, Ergebnis steht in D0.L + +;----------------------------------------------------------------------------- +; Subtraktion :  D0.S = D0.S - D1.S + +		ds		0 +S_fsub: +		bchg		#31,d1		; Vorzeichen des zweiten Operanden +                bra             S_fadd          ; invertieren und zur Addition springen + + +;----------------------------------------------------------------------------- +; Multiplikation : D0.S = D0.S * D1.S + +		ds		0 +S_fmul: +		addq.l		#1,_fmul_cnt.w +		movem.l		d1-d5,-(a7)	; benoetigte Register retten +		move.l		d0,d2		; Operand 1 kopieren +		eor.l		d1,d2		; EXOR um Vorzeichen zu bestimmen + +		swap		d0		; Registerhaelften Operand 1 vertauschen +		move.l		d0,d3		; Operand 1 ab jetzt in Register D3 +		and.w		#$7f,d3		; Exponent und Vorzeichen loeschen +		and.w		#$7f80,d0	; Exponent maskieren +		beq.s		fmul_dn1	; gleich Null: Zahl ist denormalisiert +		bset		#7,d3		; implizite Eins einsetzen +		sub.w		#$0080,d0	; Bias kompensieren + +fmul_dn1:	swap		d1		; jetzt Operand 2 behandeln +		move.w		d1,d4 +		and.w		#$7f,d1 +		and.w		#$7f80,d4 +		beq.s		fmul_dn2 +		bset		#7,d1 +		sub.w		#$0080,d4       ; Bias kompensieren + +fmul_dn2:	add.w		d0,d4		; Exponenten addieren +		lsr.w		#7,d4		; richtig positionieren +		sub.w		#bias-3,d4	; Bias-3 subtrahieren +		cmp.w		#-24,d4		; totaler Unterlauf ? +		blt.s		fmul_zero	; ja, dann ist Ergebnis Null + +		move.w		d3,d0		; oberes Mantissenwort von Operand 1 +		mulu		d1,d0		; mal oberem Mantissenwort von Op2 +		swap		d0		; entspricht Verschiebung um 16 Bit + +; Das obere Wort von D0 ist nach der Multiplikation auf jeden Fall Null, +; da die oberen Mantissenworte nur im Bereich 0 ... 255 liegen. +; Das groete moegliche Ergebnis ist also 255 x 255 = 65025 = 0000FE01. +; Nach der Vertauschung erhalten wir also eine Zahl der xxxx 0000. +; Die untere Registerhaelfte von D0 koennen wir kurzzeitig als Zwischen- +; speicher verwenden. + +		move.w		d3,d0		; oberes Wort von Operand 1 merken +		swap		d3		; jetzt unteres Wort Op1 mal oberes Op2 +		move.w		d1,d5 +		mulu		d3,d5		; Ergebnis steht im D5 +		swap		d1		; jetzt unteres Wort Op1 mal unteres Op2 +		mulu		d1,d3		; Ergebnis steht im D3 +		swap		d3		; entspricht Verschiebung um 16 Bit +		mulu		d0,d1		; jetzt oberes Wort Op1 mal unteres Op2 + +		move.w		d3,d0		; zum ersten Zwischenergebnis dazu +		add.l		d5,d0		; jetzt alles aufaddieren +		add.l		d1,d0 +		beq.s		fmul_res	; falls Mantisse Null auch Ergebnis Null +		bmi.s		fmul_rnd	; fuehrende Eins? dann zum Runden + +; Im Register D0.L befinden sich die oberen 32 Bit des Produktes, +; im oberen Wort von D3 die restlichen 16 Bit. + +		tst.w		d4		; Exponent ist negativ ? +		bmi.s		fmul_unt	; ggf. Unterlauf behandeln + +fmul_nor:	tst.w		d4		; Exponent = Null ? +		beq.s		fmul_rnd	; falls Null, dann zum Runden +		roxl.l		#1,d3		; Im oberen Wort von D3 sind die +		roxl.l		#1,d0		; niedrigsten Bits des Produktes +		subq.w		#1,d4		; Exponent korrigieren +		tst.l		d0		; Mantisse testen +		bpl.s		fmul_nor	; bis fuehrende Eins auftaucht + +fmul_rnd:	add.l		#$80,d0		; Rundung +		bcc.s		fmul_nov +		roxr.l		#1,d0		; Ueberlauf einschieben +		addq.w		#1,d4           ; Exponent korrigieren +fmul_nov:	cmp.w		#maxexpo,d4	; Exponent-Ueberlauf ? +		blt.s		fmul_nue +fdiv_err:	move.w		#maxexpo,d4	; Ueberlauf: Exponent = Maxexpo +		clr.l		d0		;           Mantisse = Null +		bra.s		fmul_den + +fmul_nue:	tst.w		d4		; Exponent = Null ? +		beq.s		fmul_den	; falls Null, dann denormalisiert +		lsl.l		#1,d0		; fuehrende Eins wird nicht abgespeichert + +fmul_den:       move.b		d4,d0		; Exponent einsetzen +		ror.l		#8,d0		; Form: eeee eeee ffff ... fffx +		roxl.l		#1,d2		; Vorzeichen in Carry schieben +		roxr.l		#1,d0		; und ins Ergebnis einsetzen + +fmul_res:	movem.l		(a7)+,d1-d5	; Register restaurieren +		rts + +fmul_zero:	clr.l		d0		; Null erzeugen +		bra.s		fmul_res	; Ende, Ergebnis steht in D0.L + +fmul_unt:	cmp.w		#-24,d4		; totaler Unterlauf ? +		ble.s		fmul_zero	; Dann ist das Ergebnis auf jeden Fall Null +		neg.w		d4		; sonst Shift-Zaehler erzeugen +		lsr.l		d4,d0		; und Zahl denormalisieren +		clr.w		d4		; Exponent ist Null als Kennzeichen +		bra.s		fmul_rnd	; fuer eine denormalisierte Zahl + +;----------------------------------------------------------------------------- +; Division : D0.S = D0.S / D1.S + +		ds		0 +S_fdiv: +		addq.l		#1,_fdiv_cnt.w +		movem.l		d1-d5,-(a7)	; benoetigte Register retten +		move.l		d0,d2		; Operand 1 kopieren +		eor.l		d1,d2		; EXOR um Vorzeichen zu bestimmen + +		swap		d0		; Registerhaelften Operand 1 vertauschen +		move.l		d0,d3		; Operand 1 ab jetzt in Register D3 +		and.w		#$7f,d3		; Exponent und Vorzeichen loeschen +		and.w		#$7f80,d0	; Exponent maskieren +		beq.s		fdiv_dn1	; gleich Null: Zahl ist denormalisiert +		bset		#7,d3		; implizite Eins einsetzen +		sub.w		#$0080,d0	; Bias kompensieren + +fdiv_dn1:	swap		d1		; jetzt Operand 2 behandeln +		move.w		d1,d4 +		and.w		#$7f,d1 +		and.w		#$7f80,d4 +		beq.s		fdiv_dn2 +		bset		#7,d1 +		sub.w		#$0080,d4 + +fdiv_dn2:	sub.w		d4,d0		; Exponenten subtrahieren +		move.w		d0,d4		; Exponent nach D4 kopieren +		asr.w		#7,d4		; richtig positionieren +		add.w		#bias,d4	; Bias addieren +		cmp.w		#-24,d4		; totaler Ueberlauf ? +		blt.s		fmul_zero	; ja, dann ist Ergebnis Null + +		swap		d1		; Form: 0fff ... ffff 0000 0000 +		beq.s		fdiv_err	; falls Divisor Null, dann wird +		lsl.l		#7,d1		; als Ergebnis unendlich ausgegeben +		swap		d3 +		beq.s		fmul_zero	; falls Divident Null --> Ergebnis Null +		lsl.l		#7,d3 + +fdiv_nlp:	btst		#30,d1		; ist der Divisor normalisiert ? +		bne.s		fdiv_nor	; ja, --> +		addq.w		#1,d4		; nein, Exponent erhoehen +		lsl.l		#1,d1		; Divisor verschieben bis Form 01ff .. +		bra.s		fdiv_nlp + +fdiv_nor:	clr.l		d0		; Ergebnis vorbesetzen +		add.w		#25,d4		; Exponent ist nicht groesser als Null + +fdiv_lop:	move.l		d3,d5		; Divident zwischenspeichern +		sub.l		d1,d3		; Divisor abziehen +		eori		#extend,ccr	; X-Bit invertieren +		bcc.s		fdiv_one	; kein Carry: Divisor passt +		move.l		d5,d3           ; zurueckkopieren (X-Bit unveraendert!) +fdiv_one:	roxl.l		#1,d0		; Ergebnis aufbauen +		lsl.l		#1,d3		; Divident verschieben +		subq.w		#1,d4		; Exponent erniedrigen +		beq.s		fdiv_den	; falls Null, dann denormalisiert +		btst		#24,d0		; fuehrende Eins in Ergebnis-Mantisse? +		beq.s		fdiv_lop	; nein, weiter rechnen + +fdiv_den:	lsl.l		#7,d0		; Mantisse positionieren +		beq		fmul_res	; Null ? +		bra		fmul_rnd	; zum Runden +;----------------------------------------------------------------------------- +; Multiplikation mit einer Zweierpotenz: D0.S=D0.S * 2^(D1.W) + +		ds		0 +S_fmul2: +		addq.l		#1,_fmul_cnt.w +		movem.l         d1-d2,-(a7)	; Register retten +		move.l          d0,d2		; Vorzeichen in D2 Bit 31 merken +		lsl.l           #1,d0		; Vorzeichen rausschieben +		beq.s           fmul2_zero	; falls Null, dann ist Ergebnis Null +		rol.l           #8,d0		; Form: ffff ... fff0 eeee eeee +		clr.w           d2		; auf Wort vorbereiten +		move.b          d0,d2		; Exponent in D2 +                beq.s           fmul2_den +		tst.w           d1		; Multiplikation oder Division? +		bmi.s           fmul2_div	; (neg. Exponent entspr. Div.) + +		add.w           d1,d2		; Summe der Exponenten bilden +		cmp.w           #maxexpo,d2	; Ueberlauf? +		bge.s           fmul2_over	; ja, Ergebnis ist unendlich +fmul2_res:	move.b          d2,d0		; Ergebnisexponent einsetzen +		ror.l           #8,d0		; Form: eeee eeee ffff ... fffx +		roxl.l          #1,d2		; Vorzeichen ins X-Bit +		roxr.l          #1,d0		; und ins Ergebnis einschieben +fmul2_zero:	movem.l         (a7)+,d1-d2	; Register restaurieren +                rts + +fmul2_over:	move.w          #maxexpo,d2	; Unendlich: Exponent = maxexpo +		clr.l           d0		;            Mantisse = Null +                bra.s           fmul2_res + +fmul2_div:	add.w           d1,d2		; Summe der Exponenten bilden +		bgt.s           fmul2_res	; Unterlauf? nein --> Ergebnis +		ori             #Extend,ccr	; implizite Eins real machen +		roxr.l          #1,d0		; Form: 1fff ... ffff xxxx xxxx +fmul2_dnr:	tst.w           d2		; Exponent = Null ? +		beq.s           fmul2_res	; ja, Ergebnis ist denormalisiert +		lsr.l           #1,d0		; Mantisse denormalisieren +		beq.s           fmul2_zero	; totaler Unterlauf: Ergebnis ist Null +		addq.w          #1,d2		; Exponent korrigieren +                bra.s           fmul2_dnr +fmul2_ddd:	add.w           d1,d2		; Summe der Exponenten bilden +		bra.s           fmul2_dnr	; mit denormalisiereter Eingabe bearbeiten + +fmul2_den:	tst.w           d1		; Multiplikation oder Division +                bmi.s           fmul2_ddd +		clr.b           d0		; Form: ffff ... fff0 0000 0000 +fmul2_nor:	lsl.l           #1,d0		; Mantisse nach links schieben +		bcs.s           fmul2_stp	; bis fuehrende Eins auftaucht +		subq.w          #1,d1		; oder zweiter Exponent Null wird +                bne.s           fmul2_nor +		bra.s           fmul2_res	; Ergebnis abliefern +fmul2_stp:	add.w           d1,d2		; Rest zum Exponenten addieren +		bra.s           fmul2_res	; Bias stimmt auch ( jetzt 127 statt 126) + +;----------------------------------------------------------------------------- +; Vergleich zweier Zahlen: cmp d0,d1 + +S_fcmp: +		bclr		#31,d0		; Zahl 1 >=0 ? +		bne.s		fcmp_2 +fcmp_1: +		bclr		#31,d1		; Zahl 2 >=0 ? +		bne.s		fcmp_12 +fcmp_11: +		cmp.l		d1,d0		; beide Zahlen >=0 +		rts				; dann Betraege vergleichen +fcmp_12: +		moveq.l		#1,d0		; Zahl 1 >=0 und Zahl 2 <0 +                cmp.l           #-1,d0 +		rts +fcmp_2: +		bclr		#31,d1		; Zahl 2 >=0 ? +		bne.s		fcmp_22 +fcmp_21: +                moveq.l         #-1,d0          ; Zahl 1 <0 und Zahl 2 >=0 +		cmp.w		#1,d0		; dann kleiner +		rts +fcmp_22: +                neg.l           d0 +                neg.l           d1 +                cmp.l           d1,d0           ; beide Zahlen <0, dann ver- +		rts				; kehrtherum vergleichen + + +;----------------------------------------------------------------------------- +; Longint-->Gleitkomma +; D0.L --> D0.S + +S_fitof: +		movem.l		d1-d2,-(a7)	; Register retten +		tst.l		d0		; Integer ist Null ? +		beq.s		fitof_res; Ergebnis ist auch Null +		smi		d1		; Vorzeichen in D1 merken +		bpl.s           fitof_pos +		neg.l		d0		; ggf. Integer negieren +fitof_pos:	move.w		#bias+32,d2	; Exponent vorbesetzen +fitof_shift:	subq.w		#1,d2		; Mantisse verschieben +		lsl.l		#1,d0		; bis fuehrende Eins rausfliegt +		bcc.s		fitof_shift +		move.b		d2,d0		; Exponent einsetzen +		ror.l		#8,d0		; Zahl positionieren +		roxr.b		#1,d1		; Vorzeichen in X-Bit +		roxr.l		#1,d0		; und ins Ergebnis +fitof_res:	movem.l		(a7)+,d1-d2	; fertig +		rts + +;----------------------------------------------------------------------------- +; Gleitkomma --> Longint: +; D0.S --> D0.L + +S_fftoi: +		movem.l		d1-d2,-(a7)	; Register retten +		roxl.l		#1,d0		; Vorzeichen in Carry +		scs		d1		; in D1 merken +		rol.l		#8,d0		; Form: ffff ... fffx eeee eeee +		move.b		d0,d2		; Exponent extrahieren +		sub.b		#bias,d2	; Bias subtrahieren +		bmi.s		fftoi_zero	; kleiner Null -> Ergebnis = Null +		cmp.b		#31,d2		; Ueberlauf? +		bge.s		fftoi_over +		ori		#extend,ccr	; Implizite Eins explizit machen +		roxr.l		#1,d0 +		clr.b		d0		; Form: 1fff ... ffff 0000 0000 +fftoi_shft: +		lsr.l		#1,d0		; jetzt Verschiebung bis +		addq.b		#1,d2		; Exponent stimmt +		cmp.b		#31,d2 +		bne.s		fftoi_shft +		tst.b		d1		; Zahl negativ ? +		bpl.s		fftoi_pos +		neg.l		d0       	; ggf. Ergebnis negieren +fftoi_pos: +		movem.l		(a7)+,d1-d2	; Register wieder holen +		rts +fftoi_zero: +		clr.l		d0		; Unterlauf; Ergebnis ist Null +		bra.s		fftoi_pos +fftoi_over: +		move.l		#$7fffffff,d0	; Ueberlauf: Maxint zurueckgeben +		tst.b		d1		; positiv oder negativ ? +		bpl.s		fftoi_pos +		not.l		d0		; Einser-Komplement erzeugt Minint +		bra.s		fftoi_pos + +;----------------------------------------------------------------------------- +; Quadratwurzel : D0.S-->D0.S + +		ds		0 +fsqrt_domainerror: +		move.l		#$ffc00000,d0	; -NAN zurueckgeben +		movem.l		(a7)+,d1-d4 +		rts +fsqrt_sq0: +		clr.l		d0 +		movem.l		(a7)+,d1-d4 +		rts +S_fsqrt: +		addq.l          #1,_fsqrt_cnt.w +		movem.l		d1-d4,-(a7)	; D1-D4 werden sonst zerstoert +		move.l		d0,d4 +		bmi.s		fsqrt_domainerror ; Fehler bei negativem Argument +		swap		d4		; MSW des Arguments +		and.l		#$7f80,d4	; Exponent isolieren +		beq.s		fsqrt_sq0	; Zahl ist 0, wenn Exponent 0 +		and.l		#$007fffff,d0	; Mantisse isolieren +		sub.w		#$7f*$80,d4	; Exponent im Zweierkomplement +		bclr		#7,d4		; Exponent ungerade? (und LSB auf 0) +		beq.s		fsqrt_evenexp +		add.l		d0,d0		; ja: Mantisse * 2 +		add.l		#$01000000-$00800000,d0 ; Hidden Bit setzen, 1.Iteration + +fsqrt_evenexp: +		; 1. Iteration fuer geraden Exponenten: Hidden Bit nicht setzen +		asr.w		#1,d4		; Exponent/2 mit Vorzeichen +		add.w		#$7f*$80,d4	; Exponent wieder in Offset-Darst. +		swap		d4		; neuen Exponenten im MSW aufheben +		lsl.l		#7,d0		; x ausrichten +		move.l		#$40000000,d2	; xroot nach erster Iteration +		move.l		#$10000000,d3	; m2=2 << (MaxBit-1); +fsqrt_loop10: +		move.l		d0,d1		; xx2 = x +fsqrt_loop11: +		sub.l		d2,d1		; xx2 -= root +		lsr.l		#1,d2		; xroot >>= 1 +		sub.l		d3,d1		; x2 -= m2 +		bmi.s		fsqrt_dontset1 +		move.l		d1,d0		; x = xx2 +		or.l		d3,d2		; xroot += m2 +		lsr.l		#2,d3		; m2 >>= 2 +		bne.s		fsqrt_loop11 +		bra.s		fsqrt_d0d1same +fsqrt_dontset1: +		lsr.l		#2,d3		; m2 >>= 2 +		bne.s		fsqrt_loop10	; Schleife 15* abarbeiten +						; Bit 22..8 +		; 17. Iteration (Bit 7) mit separatem Code durchfuehren: +		move.l		d0,d1		; xx2 = x +fsqrt_d0d1same: +		sub.l		d2,d1		; xx2 -= root +		ror.l		#1,d2		; xroot >>= 1 mitsamt Carry... +		swap		d2		; auf neues Alignment umstellen +		subq.l		#1,d1		; Carry von 0-0x4000: x2 -= m2 +						; Teil 1 +		bmi.s		fsqrt_dontset7 +		or.l		#-$40000000,d1	; 0 - 0x4000: x2 -= m2, Teil 2 +		move.l		d1,d0		; x = xx2 +		or.w		#$4000,d2	; xroot += m2 +fsqrt_dontset7: +		swap		d0		; x auf neues Alignment umstellen + +		move.w		#$1000,d3	; m2 - Bit 16..31 bereits 0 +fsqrt_loop20: +		move.l		d0,d1		; xx2 = x +fsqrt_loop21: +		sub.l		d2,d1		; xx2 -= xroot +		lsr.l		#1,d2		; xroot >>= 1 +		sub.l		d3,d1		; x2 -= m2 +		bmi.s		fsqrt_dontset2 +		move.l		d1,d0		; x = xx2 +		or.w		d3,d2		; xroot += m2 +		lsr.w		#2,d3		; m2 >>= 2 +		bne.s		fsqrt_loop21 +		bra.s		fsqrt_finish +fsqrt_dontset2: +		lsr.w           #2,d3		; m2 >>= 2 +		bne.s		fsqrt_loop20	; Schleife 7 * abarbeiten (n=6..0) +fsqrt_finish: +		sub.l		d2,d0		; Aufrunden notwendig ? +                bls.s           fsqrt_noinc +		addq.l		#1,d2		; wenn ja, durchfuehren +fsqrt_noinc: +		bclr		#23,d2		; Hidden Bit loeschen +		or.l		d4,d2		; Exponent und Mantisse kombinieren +		move.l		d2,d0		; Ergebnis +		movem.l		(a7)+,d1-d4 +		rts				; Z-,S-, und V-Flag o.k. + +;----------------------------------------------------------------------------- +; Absolutbetrag: D0.S--> D0.S + +                ds      0 + +S_fabs:         bclr    #31,d0                  ; ganz einfach... +                rts + +;----------------------------------------------------------------------------- +; Exponentialfunktion: D0.S--> D0.S + +; Die "krummen" Konstanten legen wir als hex ab, damit es keine Vergleichs- +; fehler durch Rundungsvarianzen gibt. + +S_fexp_Const0:  dc.l $3FB8AA3B  ; ld(exp(1.0))    = ld(e) = 1/ln(2) +S_fexp_ConstA:  dc.l $3D0DF4E0  ; 0.034657359038  Polynomkonstanten +S_fexp_ConstB:  dc.l $411F4606  ; 9.9545957821 +S_fexp_ConstC:  dc.l $441A7E3A  ; 617.97226953 +S_fexp_ConstD:  dc.l $42AED5C2  ; 87.417498202 + +		ds		0 +S_fexp:         movem.l         d1-d5,-(sp) + +                bclr            #31,d0          ; Vorzeichen loeschen und nach D2 retten +                sne             d2 + +                move.l          S_fexp_Const0(pc),d1 ; auf 2erpotenz umrechnen +                bsr             S_fmul + +                move.l          d0,d3           ; in Ganzzahlanteil und Nach- +                bsr             S_fftoi         ; kommastellen (z) zerlegen +                move.l          d0,d4           ; Ganzzahlanteil nach D4 +                bsr             S_fitof +                move.l          d0,d1 +                move.l          d3,d0 +                bsr             S_fsub +                move.l          d0,d3 + +                move.l          d0,d1           ; z^2 berechnen +                bsr             S_fmul +                move.l          d0,d5           ; noch zu gebrauchen + +                move.l          S_fexp_ConstD(pc),d1 ; --> D+z^2 +                bsr             S_fadd +                move.l          d0,d1           ; --> C/(..) +                move.l          S_fexp_ConstC(pc),d0 +                bsr             S_fdiv +                move.l          d0,d1           ; --> B-(..) +                move.l          S_fexp_ConstB(pc),d0 +                bsr             S_fsub +                move.l          d3,d1           ; --> (..)-z +                bsr             S_fsub +                exg             d0,d5           ; Ergebnis retten +                move.l          S_fexp_ConstA(pc),d1 ; A*z^2 berechnen +                bsr             S_fmul +                move.l          d5,d1           ; ergibt Nenner +                bsr             S_fadd +                move.l          d0,d1           ; Quotient bilden +                move.l          d3,d0 +                bsr             S_fdiv +                moveq           #1,d1           ; verdoppeln +                bsr             S_fmul2 +                move.l          S_Const1(pc),d1 ; 1 addieren +                bsr             S_fadd +                move.l          d4,d1           ; Potenzieren +                bsr             S_fmul2 + +                tst.b           d2              ; war Argument negativ ? +                beq.s           S_fexp_ArgPos +                move.l          d0,d1           ; dann Kehrwert bilden +                move.l          S_Const1(pc),d0 +                bsr             S_fdiv + +Terminate: +S_fexp_ArgPos:  movem.l         (sp)+,d1-d5 + +		rts + +;------------------------------------------------------------------------------ +; Sinus hyperbolicus: D0.S-->D0.S + +S_fsinh: +		movem.l		d1-d2,-(a7)	; Register retten +		bsr		S_fexp		; exp(x) berechnen +		move.l		d0,d2		; in D2 merken +		move.l		d0,d1		; exp(-x)=1/exp(x) berechnen +		move.l		#eins,d0 +		bsr		S_fdiv +		move.l		d0,d1           ; Teilergebnisse subtrahieren +		move.l		d2,d0 +		bsr		S_fsub +		move.w		#-1,d1		; halbieren +		bsr		S_fmul2 +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts + +;------------------------------------------------------------------------------ +; Cosinus hyperbolicus: D0.S-->D0.S + +S_fcosh: +		movem.l		d1-d2,-(a7)	; Register retten +		bsr		S_fexp		; exp(x) berechnen +		move.l		d0,d2		; in D2 merken +		move.l		d0,d1		; exp(-x)=1/exp(x) berechnen +		move.l		#eins,d0 +		bsr		S_fdiv +		move.l		d2,d1           ; Teilergebnisse addieren +		bsr		S_fadd +		move.w		#-1,d1		; halbieren +		bsr		S_fmul2 +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Tangens hyperbolicus: D0.S-->D0.S + +S_ftanh: +		movem.l		d1-d3,-(a7)     ; Register sichern +		bsr		S_fexp		; exp(x) berechnen +		move.l		d0,d2		; in D2 merken +		move.l		d0,d1		; exp(-x)=1/exp(x) berechnen +		move.l		#eins,d0 +		bsr		S_fdiv +		move.l		d0,d3           ; in D3 merken +		move.l		d2,d1		; Summe=Nenner berechnen +		bsr		S_fadd +		exg		d0,d2		; jetzt exp(x) in D0, Nenner +		move.l		d3,d1		; in D2 +		bsr		S_fsub		; Zaehler berechnen +		move.l		d2,d1		; Quotient berechnen +		bsr		S_fdiv +		movem.l		(a7)+,d1-d3	; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Cotangens hyperbolicus: D0.S-->D0.S + +S_fcoth: +		tst.l		d0		; Argument Null ? +		beq.s		S_fcoth_valerr	; dann zur Fehlerroutine +		movem.l		d1-d3,-(a7)	; Register sichern +		bsr		S_fexp		; exp(x) berechnen +		move.l		d0,d2		; in D2 merken +		move.l		d0,d1		; exp(-x)=1/exp(x) berechnen +		move.l		#eins,d0 +		bsr		S_fdiv +		move.l		d0,d3           ; in D3 merken +		move.l		d0,d1		; Differenz=Nenner berechnen +		move.l		d2,d0 +		bsr		S_fsub +		exg		d0,d2		; jetzt exp(x) in D0, Nenner +		move.l		d3,d1		; in D2 +		bsr		S_fadd		; Zaehler berechnen +		move.l		d2,d1		; Quotient berechnen +		bsr		S_fdiv +		movem.l		(a7)+,d1-d3	; Register zurueck +		rts +S_fcoth_valerr: +		move.l		#$7f800000,d0	; +INF zurueckgeben +		rts + +;----------------------------------------------------------------------------- +; nat. Logarithmus: D0.S-->D0.S + +		ds		0 +S_fln: +		tst.l		d0		; Argument <=0 ? +		ble		S_fln_errval +                movem.l         d1-d7,-(a7)     ; Register retten +		move.l		d0,d3		; Argument sichern + +		move.l		#eins,d1	; Zahl>1? +		bsr		S_fsub		; ( dies ist sinnvoll bei +		tst.l           d0		;   Zahlen <<1 ); +                smi             d7              ; und die Vorzeichenumkehr merken +		bpl.s		S_fln_gr1	; ja-->o.k. +		move.l		d3,d1		; ansonsten Kehrwert bilden +		move.l		#eins,d0 +		bsr		S_fdiv +		move.l		d0,d3 + +S_fln_gr1: +		clr.l		d2		; Merker = Null +S_fln_nrm: +		move.l		d3,d0		; Zahl > 1 ? +		move.l		#eins,d1 +		bsr		S_fsub +		bmi.s		S_fln_isok +                beq.s           S_fln_isok +		sub.l		#$00800000,d3   ; ja-->Zahl durch 2 teilen... +		addq.w		#1,d2		; ...und Merker erhoehen +		bra.s		S_fln_nrm	; nochmal probieren +S_fln_isok: +		move.l		d0,d3		; Zahl um Eins erniedrigt abspeichern +		move.l		d0,d4		; yz:=y +		moveq.l		#1,d6		; zaehler:=1 +		clr.l		d5              ; Summe:=0 +                bchg            #31,d3          ; Multiplikator negativ +S_fln_loop: +		move.l          d6,d0		; Zaehler in Gleitkomma wandeln +		bsr		S_fitof +		move.l		d0,d1		; s:=s+yz/zaehler*vz +		move.l		d4,d0 +		bsr		S_fdiv +		move.l		d5,d1 +		bsr		S_fadd +		cmp.l           d5,d0		; noch signifikant ? +		beq.s		S_fln_loopend +		move.l		d0,d5 +		addq.w		#1,d6		; zaehler:=zaehler+1 +		cmp.w		#10,d6		; Schleife fertig ? +		beq.s		S_fln_loopend +		move.l		d4,d0		; yz:=yz*y +		move.l		d3,d1 +		bsr		S_fmul +		move.l		d0,d4 +		bra.s		S_fln_loop +S_fln_loopend: +		move.l		d2,d0		; Merker in Gleitkomma +		bsr		S_fitof +		move.l		#ln2,d1		; * ln(2) +		bsr 		S_fmul +		move.l		d5,d1		; s:=s+merker +		bsr		S_fadd + +                tst.b           d7              ; noch Vorzeichen tauschen ? +		beq.s		S_fln_end +                bchg            #31,d0 +S_fln_end: +                movem.l         (a7)+,d1-d7     ; Register zurueck +		rts +S_fln_errval: +		move.l		#$ffc00000,d0	; -NAN zurueckgeben +		rts + +;----------------------------------------------------------------------------- +; 10er-Logarithmus : D0.S --> D0.S + +S_flog: +		tst.l		d0		; Argument <=0 ? +                ble.s           S_flog_errval +		bsr		S_fln		; nat. Logarithmus bilden +		move.l		#ln10,d1	; umrechnen +		bsr		S_fdiv +		rts +S_flog_errval: +		move.l		#$ffc00000,d0	; -NAN zurueckgeben +		rts + +;----------------------------------------------------------------------------- +; Areasinus hyperbolicus: D0.S-->D0.S    == ln[x+sqrt(x*x+1)] + +S_fasinh: +		movem.l		d1-d2,-(a7) +		move.l		d0,d2		; Argument sichern +		move.l		d0,d1		; quadrieren +		bsr		S_fmul +		move.l		#eins,d1	; 1 addieren +		bsr		S_fadd +		bsr		S_fsqrt		; Wurzel ziehen +		move.l		d2,d1		; Argument addieren +		bsr		S_fadd +		bsr		S_fln		; Logarithmus des ganzen +		movem.l		(a7)+,d1-d2 +		rts + +;----------------------------------------------------------------------------- +; Areacosinus hyperbolicus: D0.S-->D0.S    == ln[x+sqrt(x*x-1)] + +S_facosh: +		movem.l		d1-d2,-(a7)	; Register sichern +		move.l		d0,d2		; Argument sichern +		move.l		#eins,d1	; Argument <1 ? +		bsr		S_fcmp +		bmi.s		S_facosh_errval +		move.l		d2,d0		; Argument zurueck +		move.l		d0,d1		; quadrieren +		bsr		S_fmul +		move.l		#eins,d1	; 1 abziehen +		bsr		S_fsub +		bsr		S_fsqrt		; Wurzel ziehen +		move.l		d2,d1		; Argument addieren +		bsr		S_fadd +		bsr		S_fln		; Logarithmus des ganzen +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts +S_facosh_errval: +		movem.l		(a7)+,d1-d2	; Register zurueck +		move.l		#$ffc00000,d0	; NAN zurueckgeben +		rts + +;----------------------------------------------------------------------------- +; Areatangens hyperbolicus: D0.S-->D0.S   == 0.5*ln((1+x)/(1-x)) + +S_fatanh: +		movem.l		d1-d2,-(a7)	; Register sichern +		move.l		d0,d2		; Argument sichern +		bclr		#31,d0		; Vorzeichen weg +		cmp.l		#eins,d0 +		beq.s		S_fatanh_inf	; =1-->INF +		bhi.s		S_fatanh_errval	; >1-->NAN +		move.l		d2,d1		; Nenner berechnen +		move.l		#eins,d0 +		bsr		S_fsub +		exg		d0,d2   	; Zaehler berechnen +		move.l		#eins,d1 +		bsr		S_fadd +		move.l		d2,d1		; Quotient daraus +		bsr		S_fdiv +		bsr		S_fln		; logarithmieren +		move.w		#-1,d1		; halbieren +		bsr		S_fmul2 +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts +S_fatanh_inf: +		move.l		#$ff000000,d0	; vorzeichenbehaftete Unend- +		roxr.l		#1,d0		; lichkeit +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts +S_fatanh_errval: +		move.l		#$7fc00000,d0	; NAN geben +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Areakotangens hyperbolicus: D0.S--> D0.S  ==  0.5*ln((1+x)/(x-1)) + +S_facoth: +		movem.l		d1-d2,-(a7)	; Register sichern +		move.l		d0,d2		; Argument sichern +		roxl.l		#1,d0		; Vorzeichen in X-Flag +		cmp.l		#eins*2,d0 +		beq.s		S_facoth_inf	; =1-->INF +		bmi.s		S_facoth_errval	; <1-->NAN +		move.l		d2,d0		; Nenner berechnen +		move.l		#eins,d1 +		bsr		S_fsub +		exg		d0,d2   	; Zaehler berechnen +		move.l		#eins,d1 +		bsr		S_fadd +		move.l		d2,d1		; Quotient daraus +		bsr		S_fdiv +		bsr		S_fln		; logarithmieren +		move.w		#-1,d1		; halbieren +		bsr		S_fmul2 +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts +S_facoth_inf: +		move.l		#$ff000000,d0	; vorzeichenbehaftete Unend- +		roxr.l		#1,d0		; lichkeit +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts +S_facoth_errval: +		move.l		#$7fc00000,d0	; NAN geben +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Kosinusfunktion: D0.S--> D0.S + +		ds		0 +S_fcos: +		movem.l		d1-d6,-(a7)	; Register retten +		bclr		#31,d0		; cos(-x)=cos(x) + +		move.l		#pi2,d1		; auf Bereich 0..2*Pi reduzieren +S_fcos_subtr: +		cmp.l		d1,d0           ; x>=2*Pi ? +		blo.s		S_fcos_subend     ; ja-->Ende +		bchg		#31,d1		; fuer Subtraktion +		bsr		S_fadd		; reduzieren +		bchg		#31,d1		; Subtrahend wieder richtig +		bra.s		S_fcos_subtr +S_fcos_subend: +		cmp.l		#pi,d0		; x>Pi ? +		blo.s		S_fcos_nosub +		exg		d0,d1		; ja-->cos(x)=cos(2*Pi-x) +		bsr		S_fsub +S_fcos_nosub: +		move.l		d0,d1		; wir brauchen nur x^2 +		bsr		S_fmul +		bset		#31,d0 +		move.l		d0,d3           ; -x^2 in D3 +		move.l		d0,d4		; D4 enthaelt laufende Potenz von x^2 +						; inkl. Vorzeichen +		move.l		#zwei,d5	; D5 enthaelt laufende Fakultaet +		move.l		#eins,d2	; D2 enthaelt Summe +		moveq.l		#2,d6		; D6 enthaelt Zaehler +S_fcos_loop: +		move.l		d5,d1		; s:=s+yz/zaehler +		move.l		d4,d0 +		bsr		S_fdiv +		move.l		d2,d1 +		bsr		S_fadd +		cmp.l		d2,d0		; Veraendert sich Summe noch ? +		beq.s		S_fcos_end +		move.l		d0,d2 +		addq.b		#2,d6		; i:=i+1 +		cmp.b		#22,d6		; i=11 ? +		beq.s		S_fcos_end +		move.w		d6,d0		; Fakultaet erhhen: *(2n-1)*(2n) +		mulu.w		d6,d0		; =4*n^2-2*n +		sub.w		d6,d0 +		bsr		S_fitof		; dazumultiplizieren +		move.l		d5,d1 +		bsr		S_fmul +		move.l		d0,d5 +		move.l		d4,d0		; yz:=yz*y +		move.l		d3,d1 +		bsr		S_fmul +		move.l		d0,d4 +		bra.s           S_fcos_loop +S_fcos_end: +						; Ergebnis bereits in D0 +		movem.l         (a7)+,d1-d6	; Register zurueck +		rts + +;---------------------------------------------------------------------------- +; Sinus : D0.S-->D0.S + +S_fsin: +		move.l		d1,-(a7)	; Register retten +		move.l		#pihalf,d1	; sin(x)=cos(x-pi/2) +		bsr		S_fsub +		bsr		S_fcos +		move.l		(a7)+,d1	; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Tangens: D0.S-->D0.S + +S_ftan: +                movem.l         d1-d4,-(a7)     ; Register retten +		tst.l		d0		; Vorzeichen merken +                smi             d4 +		bclr		#31,d0 +		move.l		#pi,d1		; auf Bereich 0..Pi reduzieren +S_ftan_subtr: +		cmp.l		d1,d0           ; x>=Pi ? +		blo.s		S_ftan_subend     ; ja-->Ende +		bchg		#31,d1		; fuer Subtraktion +		bsr		S_fadd		; reduzieren +		bchg		#31,d1		; Subtrahend wieder richtig +		bra.s		S_ftan_subtr +S_ftan_subend: +		move.l		d0,d2		; Argument merken +		bsr		S_fcos		; Nenner rechnen +		move.l		d0,d3		; Nenner merken +		move.l		d0,d1		; sqr(1-x^2) rechnen +		bsr		S_fmul +		move.l		d0,d1 +		move.l		#eins,d0 +		bsr		S_fsub +		bsr		S_fsqrt +		move.l		d3,d1 +		bsr		S_fdiv		; Quotient +                tst.b           d4              ; Vorzeichen dazu +		beq.s		S_ftan_noneg +		bchg		#31,d0 +S_ftan_noneg: +                movem.l         (a7)+,d1-d4     ; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Kotangens: D0.S-->D0.S + +S_fcot: +                movem.l         d1-d4,-(a7)     ; Register retten +		tst.l		d0		; Vorzeichen merken +                smi             d4 +		bclr		#31,d0 +		move.l		#pi,d1		; auf Bereich 0..Pi reduzieren +S_fcot_subtr: +		cmp.l		d1,d0           ; x>=Pi ? +		blo.s		S_fcot_subend     ; ja-->Ende +		bchg		#31,d1		; fuer Subtraktion +		bsr		S_fadd		; reduzieren +		bchg		#31,d1		; Subtrahend wieder richtig +		bra.s		S_fcot_subtr +S_fcot_subend: +		move.l		d0,d2		; Argument merken +		bsr		S_fcos		; Zaehler rechnen +		move.l		d0,d3		; Zaehler merken +		move.l		d0,d1		; sqr(1-x^2) rechnen +		bsr		S_fmul +		move.l		d0,d1 +		move.l		#eins,d0 +		bsr		S_fsub +		bsr		S_fsqrt +		move.l		d0,d1 +		move.l		d3,d0 +		bsr		S_fdiv		; Quotient +                tst.b           d4              ; Vorzeichen dazu +		beq.s		S_fcot_noneg +		bchg		#31,d0 +S_fcot_noneg: +                movem.l         (a7)+,d1-d4     ; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Arcustangens: D0.S-->D0.S + +S_fatan: +		movem.l		d1-d6,-(a7)	; Register sichern +                subq.l          #2,a7           ; Platz fuer Hilfsvariablen +		tst.l		d0		; Vorzeichen merken... +                smi             (a7) +		bclr		#31,d0		; ...und loeschen +		cmp.l		#eins,d0	; Argument>1 ? +                shi             1(a7)           ; ja : +		bls.s		S_fatan_no1	; nein : +		move.l		d0,d1		; ja : Kehrwert bilden +		move.l		#eins,d0 +		bsr		S_fdiv +S_fatan_no1: +		move.l		#3,d2		; Zaehler initialisieren +		move.l		d0,d5		; Summe initialisieren +		move.l		d0,d4		; laufende Potenz = x^1 +		move.l		d0,d1		; x^2 berechnen +		bsr		S_fmul +		move.l		d0,d3 +		bset		#31,d3		; immer mit -x^2 multiplizieren +S_fatan_loop: +		move.l		d4,d0		; naechste Potenz ausrechnen +		move.l		d3,d1 +		bsr		S_fmul +		move.l		d0,d4 +		move.l		d2,d0		; Nenner in Gleitkomma +		bsr		S_fitof +		move.l		d0,d1		; Division ausfuehren +		move.l		d4,d0 +		bsr		S_fdiv +		move.l		d5,d1		; zur Summe addieren +		bsr		S_fadd +		cmp.l		d0,d5		; noch signifikant ? +		beq.s		S_fatan_endloop	; nein-->Ende +		move.l		d0,d5 +		addq.l		#2,d2		; Zaehler erhoehen +		cmp.l		#61,d2		; fertig ? +		bne.s		S_fatan_loop +S_fatan_endloop: +		move.l          d5,d0		; Ergebnis in D0 bringen +                tst.b           1(a7)           ; war Argument < 1 ? +		beq.s		S_fatan_not2 +		bchg		#31,d0		; ja : Erg.=Pi/2-Erg +		move.l		#pihalf,d1 +		bsr		S_fadd +S_fatan_not2: +                tst.b           (a7)            ; Vorzeichen dazu +		beq.s		S_fatan_not1 +		bset		#31,d0 +S_fatan_not1: +                addq.l          #2,a7           ; Hilfsvar. abraeumen +		movem.l		(a7)+,d1-d6	; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Arcuskotangens: D0.S-->D0.S + +S_facot: +		move.l		d1,-(a7)	; Register sichern +		bsr		S_fatan		; acot(x)=pi/2-atan(x) +		bchg		#31,d0 +		move.l		#pihalf,d1 +		bsr		S_fadd +		move.l		(a7)+,d1	; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Arcussinus: D0.S --> D0.S + +S_fasin: +		movem.l		d1-d2,-(a7)	; Register retten +		move.l		d0,d2		; Argument merken +		move.l		d0,d1		; Quadrat berechnen +		bsr		S_fmul +		bset		#31,d0		; 1-x^2 bilden +		move.l		#eins,d1 +		bsr		S_fadd +		tst.l		d0		; Sonderfaelle abfangen +		bmi.s		S_fasin_errval	; <0 geht nicht +		beq.s		S_fasin_inf	; Endwerte +		bsr		S_fsqrt		; Wurzel ... +		move.l		d0,d1		; ... und Quotient +		move.l		d2,d0 +		bsr             S_fdiv +		bsr		S_fatan		; zuletzt das wichtigste +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts +S_fasin_errval: +		move.l		#$7fc00000,d0	; NAN zurueckgeben +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts +S_fasin_inf: +		move.l		#pihalf,d0	; +- pi/2 zurueckgeben +		and.l		#$80000000,d2	; Vorzeichen dazu +		or.l		d2,d0 +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts + +;----------------------------------------------------------------------------- +; Arcuskosinus: D0.S --> D0.S + +S_facos: +		tst.l		d0		; Argument=0 ? +		beq.s		S_facos_inf +		move.l		d0,d2		; Argument merken +		move.l		d0,d1		; Quadrat berechnen +		bsr		S_fmul +		bset		#31,d0		; 1-x^2 bilden +		move.l		#eins,d1 +		bsr		S_fadd +		tst.l		d0		; Sonderfaelle abfangen +		bmi.s		S_facos_errval	; <0 geht nicht +		bsr		S_fsqrt		; Wurzel ... +		move.l		d2,d1		; ... und Quotient +		bsr             S_fdiv +		bsr		S_fatan		; zuletzt das wichtigste +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts +S_facos_errval: +		move.l		#$7fc00000,d0	; NAN zurueckgeben +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts +S_facos_inf: +		move.l		#pihalf,d0	; +- pi/2 zurueckgeben +		and.l		#$80000000,d2	; Vorzeichen dazu +		or.l		d2,d0 +		movem.l		(a7)+,d1-d2	; Register zurueck +		rts + +S_floatlibend: diff --git a/tests/t_parsys/float81.i68 b/tests/t_parsys/float81.i68 new file mode 100644 index 0000000..ed5a3dc --- /dev/null +++ b/tests/t_parsys/float81.i68 @@ -0,0 +1,293 @@ +;---------------------------------------------------------------------------- +; Fliesskommaroutinen fuer den PcPar68000 - Version mit 68881 + +;----------------------------------------------------------------------------- +; Definitionen: + +CoConst1        equ             $32             ; Offsets im Konstantenrom +CoConstPi       equ             0               ; des 6888x + +;----------------------------------------------------------------------------- +; Librarykopf: + + +S_Float81Lib:   dc.l            S_float81libend-S_float81libstart ; Laenge +S_float81libstart: +                dc.l            -1              ; Speicher fuer Zeiger +		dc.b            "FLOAT",0       ; Name +                ds              0 + + +;----------------------------------------------------------------------------- +; Sprungtabelle: + +                bra.l           S_fadd_co68 +		bra.l		S_fsub_co68 +		bra.l		S_fmul_co68 +		bra.l		S_fdiv_co68 +		bra.l		S_fsqrt_co68 +                bra.l           S_float81libnop +                bra.l           S_float81libnop +                bra.l           S_fcmp_co68 +		bra.l		S_fitof_co68 +		bra.l		S_fftoi_co68 +                bra.l           S_fabs_co68 +                bra.l           S_float81libnop +                bra.l           S_float81libnop +                bra.l           S_float81libnop +                bra.l           S_float81libnop +		bra.l           S_fexp_co68 +		bra.l		S_fsinh_co68 +		bra.l		S_fcosh_co68 +		bra.l		S_ftanh_co68 +		bra.l		S_fcoth_co68 +                bra.l           S_float81libnop +                bra.l           S_float81libnop +                bra.l           S_float81libnop +		bra.l           S_fln_co68 +		bra.l		S_flog_co68 +		bra.l		S_fasinh_co68 +		bra.l		S_facosh_co68 +		bra.l		S_fatanh_co68 +		bra.l		S_facoth_co68 +                bra.l           S_float81libnop +                bra.l           S_float81libnop +		bra.l           S_fsin_co68 +		bra.l		S_fcos_co68 +		bra.l		S_ftan_co68 +		bra.l		S_fcot_co68 +                bra.l           S_float81libnop +                bra.l           S_float81libnop +		bra.l           S_float81libnop +                bra.l           S_float81libnop +		bra.l           S_fasin_co68 +		bra.l		S_facos_co68 +		bra.l		S_fatan_co68 +		bra.l		S_facot_co68 + +S_float81libnop: rts + +;---------------------------------------------------------------------------- + +                fpu             on +S_fadd_co68: +		addq.l          #1,_fadd_cnt.w +                fmove.s         d0,fp0 +                fadd.s          d1,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fsub_co68: +		addq.l          #1,_fadd_cnt.w +                fmove.s         d0,fp0 +                fsub.s          d1,fp0 +                fmove.s         fp0,d0 +                rts + + +S_fmul_co68: +		addq.l          #1,_fmul_cnt.w +                fmove.s         d0,fp0 +                fsglmul.s       d1,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fdiv_co68: +		addq.l          #1,_fdiv_cnt.w +                fmove.s         d0,fp0 +                fsgldiv.s       d1,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fmul2_co68: +		addq.l          #1,_fmul_cnt.w +                fmove.s         d0,fp0 +                fscale.w        d1,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fitof_co68: +                fmove.l         d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fftoi_co68: +                fmove.s         d0,fp0 +                fmove.l         fp0,d0 +                rts + + +S_fsqrt_co68: +                addq.l          #1,_fsqrt_cnt.w +                fsqrt.s         d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fabs_co68:    bclr    #31,d0                  ; ganz einfach... +                rts + + +S_fcmp_co68: +                fmove.s         d0,fp0 +                fcmp.s          d1,fp0 +                fbeq.l          S_fcmp_coeq     ; Variante 1:gleich +                fbgt.l          S_fcmp_cogt     ; Variante 2:groeer + +                moveq           #1,d0           ; Bedingung "kleiner" +                cmp.w           #2,d0           ; erzeugen +                rts +S_fcmp_cogt: +                moveq           #2,d0           ; Bedingung "groesser" +                cmp.w           #1,d0           ; erzeugen +                rts +S_fcmp_coeq: +                cmp.w           d0,d0           ; Bedingung "gleich" +                rts                             ; erzeugen + + +S_fexp_co68: +                fetox.s         d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fsinh_co68: +                fsinh.s         d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fcosh_co68: +                fcosh.s         d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_ftanh_co68: +                ftanh.s         d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fcoth_co68: +                fmove.s         d0,fp0 +                fsinh.x         fp0,fp1 +                fcosh.x         fp0 +                fsgldiv.x       fp1,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fln_co68: +                flogn.s         d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_flog_co68: +                flog10.s        d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fasinh_co68: +                fmove.s         d0,fp0 +                fmove.x         fp0,fp1 +                fmul.x          fp1,fp0 +                fmovecr.x       #CoConst1,fp2 +                fadd.x          fp2,fp0 +                fsqrt.x         fp0 +                fadd.x          fp1,fp0 +                flogn.x         fp0 +                fmove.s         fp0,d0 +                rts + + +S_facosh_co68: +                fmove.s         d0,fp0 +                fmove.x         fp0,fp1 +                fmul.x          fp1,fp0 +                fmovecr.x       #CoConst1,fp2 +                fsub.x          fp2,fp0 +                fsqrt.x         fp0 +                fadd.x          fp1,fp0 +                flogn.x         fp0 +                fmove.s         fp0,d0 +                rts + + +S_fatanh_co68: +                fatanh.s        d0,fp0 +                fmove.s         fp0,d0 +                rts + + +S_facoth_co68: +                fmovecr.x       #CoConst1,fp0 +                fdiv.s          d0,fp0 +                fatanh.x        fp0 +                fmove.s         fp0,d0 +                rts + + +S_fcos_co68: +                fcos.s          d0,fp0 +                fmove.x         fp0,d0 +                rts + + +S_fsin_co68: +                fsin.s          d0,fp0 +                fmove.s         fp0,d0 +                rts + + +S_ftan_co68: +                ftan.s          d0,fp0 +                fmove.s         fp0,d0 +                rts + + +S_fcot_co68: +                fsincos.s       d0,fp0:fp1 +                fsgldiv.x       fp1,fp0 +                fmove.s         fp0,d0 +                rts + + +S_fatan_co68: +                fatan.s         d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_facot_co68: +                fatan.s         d0,fp1 +                fmovecr.x       #CoConstPi,fp0 +                fscale.w        #-1,fp0 +                fsub.x          fp1,fp0 +                fmove.s         fp0,d0 +		rts + + +S_fasin_co68: +                fasin.s         d0,fp0 +                fmove.s         fp0,d0 +		rts + + +S_facos_co68: +                facos.s         d0,fp0 +                fmove.s         fp0,d0 +		rts + +S_float81libend: + +                fpu             off + diff --git a/tests/t_parsys/parsys.i68 b/tests/t_parsys/parsys.i68 new file mode 100644 index 0000000..e5a2569 --- /dev/null +++ b/tests/t_parsys/parsys.i68 @@ -0,0 +1,115 @@ +; Includedatei PcPar-System +; vor dem Programm mit include einbinden + +;---------------------------------------------------------------------------- +; offizieller Datenbereich: + +                shared          S_RegSave,S_MemEnd,S_ParNo,S_CPUNo +                shared          _fadd_cnt,_fmul_cnt,_fdiv_cnt,_fsqrt_cnt + +		org		$400 +S_MemEnd: +                ds.l            1               ; Speicherende ( Default 64K ) +S_SysStart: +		ds.l		1		; Anfang des Systemcodes +S_ParNo:        				; vom PC geschiebene Werte +                ds.w            1               ; Parallelrechneradresse +S_LibAdr:                                       ; Adresse der Library- +		ds.l            1               ; sprungtabelle +_fadd_cnt:                                      ; Anzahl ausgefuehrter Gleit- +                ds.l            1               ; kommaadditionen/subtraktion +_fmul_cnt:                                      ; dito Multiplikation +                ds.l            1 +_fdiv_cnt:                                      ; dito Division +                ds.l            1 +_fsqrt_cnt:                                     ; dito Quadratwurzel +                ds.l            1 +S_FreeMemEnd: +                ds.l            1               ; Ende freien Speichers +S_CPUNo: +                ds.w            1               ; CPU-Typ: 0 = 68008 +                                                ;          1 = 68000 +                                                ;          2 = 68010 +                                                ;          3 = 68020 +                                                ;          4 = 68030 +                                                ; Byte 1 : $01 = 68881 +                                                ;          $02 = 68882 +                                                ;          $10 = 68851 +                org             $600 + +S_SSPEnd: +		ds.l		1		; Anfang des Systemstacks +S_ResVecSave:					; Sicherung Resetvektor +		ds.l		1 +S_RegSave:                        		; Registersicherung +		ds.l		17		; wird vom PC veraendert +S_ExVec:                                        ; Exceptionvektor +                ds.w            1 +S_LibStart: +                ds.l            1               ; Anfang Librarykette +                org             $800 + +;----------------------------------------------------------------------------- +; Libraryoffsets : + +fadd            equ             $0000 +fsub            equ             $0004 +fmul            equ             $0008 +fdiv            equ             $000c +fmul2           equ             $0010 +fsqrt           equ             $0014 +fabs		equ		$0018 + +fcmp            equ             $0020 +fitof           equ             $0024 +fftoi           equ             $0028 + +fexp            equ             $0040 +fsinh           equ             $0044 +fcosh           equ             $0048 +ftanh           equ             $004c +fcoth           equ             $0050 + +fln             equ             $0060 +flog            equ             $0064 +fasinh          equ             $0068 +facosh          equ             $006c +fatanh          equ             $0070 +facoth          equ             $0074 + +fsin            equ             $0080 +fcos            equ             $0084 +ftan            equ             $0088 +fcot            equ             $008c + +fasin           equ             $00a0 +facos           equ             $00a4 +fatan           equ             $00a8 +facot           equ             $00ac + +;---------------------------------------------------------------------------- +; Konstanten fuer Betriebssystemaufrufe: + +TrapProgEnd     equ     15              ; Trap fuer Programmende + +TrapTglSStep    equ     14              ; Trap Einzelschritt an/aus + +TrapLibCtrl     equ     13              ; Trap Libraryverwaltung +LibCtrlInstall  equ     0 +LibCtrlGetAdr   equ     1 + +;---------------------------------------------------------------------------- +; andere Konstanten: + +S_Latch         equ     $fffffffe       ; Adresse der I/O-Latches + +is68008         equ     $00             ; Prozessorcode 68008 +is68000         equ     $01             ;      "        68000 +is68010         equ     $02             ;      "        68010 +is68020         equ     $03             ;      "        68020 +is68030         equ     $04             ;      "        68030 +has68881        equ     $01             ;      "        68881 +has68882        equ     $02             ;      "        68882 +hasMMU          equ     $10             ;      "        68851 +intMMU          equ     $20             ;      "        interne MMU + diff --git a/tests/t_parsys/t_parsys.asm b/tests/t_parsys/t_parsys.asm new file mode 100644 index 0000000..8afe6f3 --- /dev/null +++ b/tests/t_parsys/t_parsys.asm @@ -0,0 +1,994 @@ +                include         parsys.i68 + +                page            60 +                cpu             68000 + +;----------------------------------------------------------------------------- +; Die Exceptionvektoren: + +                supmode         on + +		org		$00000000	; Die Vektoren +		dc.l		0		; Adresse vom Stack (Dummy) +		dc.l		Start	        ; erster Start +		dc.l		ex_vec2		; Busfehler +		dc.l		ex_vec3		; Adressfehler +		dc.l		ex_vec4		; Illegaler Befehl +		dc.l		ex_vec5		; Division durch Null +		dc.l		ex_vec6		; Befehl CHK +		dc.l		ex_vec7		; Befehl TRAPV +		dc.l		ex_vec8         ; Privilegverletzung +		dc.l	        StepProc	; Ablaufverfolgung +		dc.l            ex_vec10        ; Line-A --> Gleitkomma +		dc.l		S_LineF		; Line-F --> 68881-Emulator +		dc.l		ex_vec12	; Reserviert +                dc.l            ex_vec13        ; Koprozessor-Protokollfehler +                dc.l            ex_vec14        ; illegaler FRESTORE-Frame +		dc.l		ex_vec15	; nicht initialisierter Unterbrechungsvektor +		dc.l		ex_vec16        ; Reserviert +		dc.l		ex_vec17        ; Reserviert +		dc.l		ex_vec18        ; Reserviert +		dc.l		ex_vec19        ; Reserviert +		dc.l		ex_vec20        ; Reserviert +		dc.l		ex_vec21        ; Reserviert +		dc.l		ex_vec22        ; Reserviert +		dc.l		ex_vec23        ; Reserviert +		dc.l		ex_vec24        ; Unechte Unterbrechung +		dc.l		ex_vec25        ; autovektoriell 1 +		dc.l		ex_vec26        ; autovektoriell 2 +		dc.l		ex_vec27        ; autovektoriell 3 +		dc.l		ex_vec28        ; autovektoriell 4 +		dc.l		ex_vec29        ; autovektoriell 5 +		dc.l		ex_vec30        ; autovektoriell 6 +		dc.l		ex_vec31        ; autovektoriell 7 +		dc.l		PcSysCall	; Trap #0 --> PC-Kommunikation +		dc.l		ex_vec33        ; Trap #1 +		dc.l		ex_vec34        ; Trap #2 +		dc.l		ex_vec35        ; Trap #3 +		dc.l		ex_vec36        ; Trap #4 +		dc.l		ex_vec37        ; Trap #5 +		dc.l		ex_vec38        ; Trap #6 +		dc.l		ex_vec39        ; Trap #7 +		dc.l		ex_vec40        ; Trap #8 +		dc.l		ex_vec41        ; Trap #9 +		dc.l		ex_vec42        ; Trap #10 +		dc.l		ex_vec43        ; Trap #11 +		dc.l		ex_vec44        ; Trap #12 +                dc.l            S_LibFun        ; Trap #13 --> Libraryverwaltung +		dc.l		S_StepTgl	; Trap #14 --> Trace an/aus +		dc.l		S_ProgEnd	; Trap #15 --> Programmende +                dc.l            ex_vec48        ; BSUN in FPU gesetzt +                dc.l            ex_vec49        ; FPU inexaktes Ergebnis +                dc.l            ex_vec50        ; FPU Division durch 0 +                dc.l            ex_vec51        ; FPU Unterlauf +                dc.l            ex_vec52        ; FPU Operandenfehler +                dc.l            ex_vec53        ; FPU Ueberlauf +                dc.l            ex_vec54        ; FPU signaling NAN +                dc.l            ex_vec55        ; reserviert +                dc.l            ex_vec56        ; MMU Konfigurationsfehler +                dc.l            ex_vec57        ; MMU Illegale Operation +                dc.l            ex_vec58        ; MMU Zugriffsfehler +                                                ; Vektoren 59..255 frei + +;---------------------------------------------------------------------------- +; Installationssequenz: + +                org     $800 +start: +                clr.w   S_Latch.w       ; Port nullen + +                and.b   #$fc,S_MemEnd+3.w ; Speichergroesse auf Lang- +                                        ; wortadresse ausrichten +                move.l  S_MemEnd.w,a7   ; SSP setzen + +                lea     -256(a7),a0     ; SSP-Anfang in A0 +                move.l  a0,S_SSPEnd.w   ; sichern + +                lea     S_End.w,a1      ; Codelaenge berechnen +                lea     S_Start.w,a2 +                sub.l   a2,a1           ; A1=Laenge Systemcode +                moveq   #4,d0           ; auf mehrfaches von 4 aus- +                sub.w   a1,d0           ; richten +                and.l   #3,d0 +                add.l   d0,a1 + +                sub.l   a1,a0           ; Start des Systemcodes rechnen +                move.l  a0,S_SysStart.w ; sichern +                move.l  a0,$4.w         ; =Programmstart + +                move.l  a1,d0           ; Systemcode umkopieren +                lsr.l   #2,d0           ; =Zahl Langworttransfers +                subq.w  #1,d0           ; wg. DBRA +S_SysCopy:      move.l  (a2)+,(a0)+ +                dbra    d0,S_SysCopy + +                sub.l   a2,a0           ; Verschiebedifferenz rechnen +                move.l  a0,d1 + +                lea     8.w,a1          ; alle Vektoren relozieren +                moveq   #45,d0 +S_RelVec:       add.l   d1,(a1)+ +                dbra    d0,S_RelVec + +                move.l  S_SysStart.w,a1 ; obere Speichergrenze in USP... +                move    a1,usp +                move.l  a1,S_FreeMemEnd.w ; und Variable + +                move.l  #-1,S_LibStart.w; Librarykette leer + +                lea     S_floatlib.w,a0 ; passende FloatLib installieren +                btst    #0,S_Latch+1.w  ; 68881 vorhanden ? +                bne.s   S_NoCo81 +                lea     S_float81lib.w,a0 ; ja-->andere Library +S_NoCo81:       moveq   #LibCtrlInstall,d0 ; einschreiben +                trap    #TrapLibCtrl + +                moveq   #LibCtrlGetAdr,d0 ; Adresse holen +                lea     S_LibName.w,a0 +                trap    #TrapLibCtrl +                move.l  d0,S_LibAdr.w + +                move.l  4*4.w,a4        ; Exceptionvektoren 4 und 11 retten +                move.l  11*4.w,a5 +                move.l  sp,a6           ; SP retten +                move.l  #S_NoCPU,4*4.w  ; neue Exceptionhandler einschreiben +                move.l  #S_NoMMU,11*4.w +                moveq   #is68008,d1     ; Prozessorcode loeschen + +                cpu     68030           ; fuer zus. Befehle + +                ori     #1,ccr          ; 68008 ausfiltern +                moveq   #is68000,d1 + +                movec   vbr,d0          ; geht erst ab 68010 +                moveq   #is68010,d1 + +                extb    d0              ; geht erst ab 68020 +                moveq   #is68020,d1 + +                cpu     68000           ; nicht mehr gebraucht +                fpu     on              ; dafuer dies + +S_NoCPU:        btst    #0,S_Latch+1.w  ; FPU vorhanden ? +                bne.s   S_NoFPU         ; nein--> +                or.w    #has68881,d1    ; ja : 68881 annehmen +                fnop                    ; FPU idle machen, damit im folgenden +                fsave   -(sp)           ; ein idle frame gespeichert wird +                cmp.b   #$18,1(sp)      ; Framelaenge=$18 fuer 68881, $38 fuer 882 +                beq.s   S_NoFPU +                add.w   #(has68882-has68881),d1 ; 68882 eintragen + +                fpu     off             ; FPU nicht mehr gebraucht +                pmmu    on              ; dafuer die MMU + +S_NoFPU:        move.l  a4,4*4.w        ; Exception 4 zuruecksetzen +                pflusha                 ; dies versteht auch die 68030-MMU +                add.w   #hasMMU,d1      ; gefunden: Flag dazu +                move.l  #S_SmallMMU,11*4.w ; testen ob Schmalspur-MMU +                psave   -(sp) +                bra.s   S_NoMMU         ; Ergebnis 68020/68851 + +S_SmallMMU:     move.b  #is68030,d1     ; 68030 eintragen (nicht MOVEQ!!) +                add.w   #(intMMU-hasMMU),d1 ; Code interne MMU + +S_NoMMU:        move.l  a5,11*4.w       ; Line-F-Vektor zuruecksetzen +                move.l  a6,sp           ; SP restaurieren +                move.w  d1,S_CPUNo.w    ; Ergebnis einschreiben + +                trap    #TrapProgEnd + +S_LibName:      dc.b    "FLOAT",0 + +;---------------------------------------------------------------------------- +; Gleitkommalibrary, ohne 68881: + +                supmode         off + +                include         float.i68 + +;---------------------------------------------------------------------------- +; Gleitkommalibrary, mit 68881: + +                supmode         off + +                include         float81.i68 + +;---------------------------------------------------------------------------- +; Die Startsequenz: + +                supmode         on + +S_Start:        clr.w           S_Latch.w       ; Ports loeschen +                clr.l           _fadd_cnt.w     ; Zielvariablen loeschen +                clr.l           _fmul_cnt.w +                clr.l           _fdiv_cnt.w +                clr.l           _fsqrt_cnt.w + +		move.l          S_MemEnd.w,d0	; SSP an Speicherende legen +		move.l		d0,$0.w		; Neben Resetvekor vermerken +		move.l		d0,a7		; SSP setzen +                move.l          S_FreeMemEnd.w,a0 ; USP liegt am Speicherende +		move		a0,usp + +		andi		#$dfff,sr	; In Usermodus schalten +                jmp             Start.w         ; zum Programmstart + +;---------------------------------------------------------------------------- +; Die Ausnahmebehandlungsprozeduren: + +ex_vec2: +		move.w  	#2,S_ExVec.w +		bra.l		ex_handle +ex_vec3: +		move.w  	#3,S_ExVec.w +		bra.l		ex_handle +ex_vec4: +		move.w  	#4,S_ExVec.w +		bra.l		ex_handle +ex_vec5: +		move.w  	#5,S_ExVec.w +		bra.l		ex_handle +ex_vec6: +		move.w  	#6,S_ExVec.w +		bra.l		ex_handle +ex_vec7: +		move.w  	#7,S_ExVec.w +		bra.l		ex_handle +ex_vec8: +		move.w  	#8,S_ExVec.w +		bra.l		ex_handle +ex_vec10: +		move.w  	#10,S_ExVec.w +		bra.l		ex_handle +ex_vec11: +		move.w		#0,S_Control+S_Response.w ; FPU resetten +		move.w  	#11,S_ExVec.w +		bra.l		ex_handle +ex_vec12: +		move.w  	#12,S_ExVec.w +		bra.l		ex_handle +ex_vec13: +		move.w  	#13,S_ExVec.w +		bra.l		ex_handle +ex_vec14: +		move.w  	#14,S_ExVec.w +		bra.l		ex_handle +ex_vec15: +		move.w  	#15,S_ExVec.w +		bra.l		ex_handle +ex_vec16: +		move.w  	#16,S_ExVec.w +		bra.l		ex_handle +ex_vec17: +		move.w  	#17,S_ExVec.w +		bra.l		ex_handle +ex_vec18: +		move.w  	#18,S_ExVec.w +		bra.l		ex_handle +ex_vec19: +		move.w  	#19,S_ExVec.w +		bra.l		ex_handle +ex_vec20: +		move.w  	#20,S_ExVec.w +		bra.l		ex_handle +ex_vec21: +		move.w  	#21,S_ExVec.w +		bra.l		ex_handle +ex_vec22: +		move.w  	#22,S_ExVec.w +		bra.l		ex_handle +ex_vec23: +		move.w  	#23,S_ExVec.w +		bra.l		ex_handle +ex_vec24: +		move.w  	#24,S_ExVec.w +		bra.l		ex_handle +ex_vec25: +		move.w  	#25,S_ExVec.w +		bra.l		ex_handle +ex_vec26: +		move.w  	#26,S_ExVec.w +		bra.l		ex_handle +ex_vec27: +		move.w  	#27,S_ExVec.w +                bra.l           ex_handle +ex_vec28: +		move.w  	#28,S_ExVec.w +                bra.l           ex_handle +ex_vec29: +		move.w  	#29,S_ExVec.w +                bra.l           ex_handle +ex_vec30: +		move.w  	#30,S_ExVec.w +                bra.l           ex_handle +ex_vec31: +		move.w  	#31,S_ExVec.w +                bra.l           ex_handle +ex_vec33: +		move.w  	#33,S_ExVec.w +                bra.l           ex_handle +ex_vec34: +		move.w  	#34,S_ExVec.w +                bra.l           ex_handle +ex_vec35: +		move.w  	#35,S_ExVec.w +                bra.l           ex_handle +ex_vec36: +		move.w  	#36,S_ExVec.w +                bra.l           ex_handle +ex_vec37: +		move.w  	#37,S_ExVec.w +                bra.l           ex_handle +ex_vec38: +		move.w  	#38,S_ExVec.w +                bra.l           ex_handle +ex_vec39: +		move.w  	#39,S_ExVec.w +                bra.l           ex_handle +ex_vec40: +		move.w  	#40,S_ExVec.w +                bra.l           ex_handle +ex_vec41: +		move.w  	#41,S_ExVec.w +                bra.l           ex_handle +ex_vec42: +		move.w  	#42,S_ExVec.w +                bra.l           ex_handle +ex_vec43: +		move.w  	#43,S_ExVec.w +                bra.l           ex_handle +ex_vec44: +                move.w          #44,S_ExVec.w +                bra.l           ex_handle +ex_vec48: +                move.w          #48,S_ExVec.w +                bra.l           ex_handle +ex_vec49: +                move.w          #49,S_ExVec.w +                bra.l           ex_handle +ex_vec50: +                move.w          #50,S_ExVec.w +                bra.l           ex_handle +ex_vec51: +                move.w          #51,S_ExVec.w +                bra.l           ex_handle +ex_vec52: +                move.w          #52,S_ExVec.w +                bra.l           ex_handle +ex_vec53: +                move.w          #53,S_ExVec.w +                bra.l           ex_handle +ex_vec54: +                move.w          #54,S_ExVec.w +                bra.l           ex_handle +ex_vec55: +                move.w          #55,S_ExVec.w +                bra.l           ex_handle +ex_vec56: +                move.w          #56,S_ExVec.w +                bra.l           ex_handle +ex_vec57: +                move.w          #57,S_ExVec.w +                bra.l           ex_handle +ex_vec58: +                move.w          #58,S_ExVec.w + +ex_handle: +		movem.l		d0-d7/a0-a7,S_RegSave.w ; Wert der Register abspeichern +		move		usp,a0 +		move.l		a0,S_RegSave+64.w +		lea		S_Latch.w,a0 +		move.w		S_ExVec.w,d0	; Vektornr. holen +		move.b		d0,1(a0)	; Fehlernr. ausgeben +ex_infinite: +		move.b		d0,d1		; Die LED n-mal blinken lassen						; Die LED n-mal blinken lassen +ex_blink: +		bset		#0,(a0)		; LED an +                bsr.s           ex_wait +		bclr		#0,(a0) 	; LED aus +		bsr.s		ex_wait +		subq.b		#1,d1 +		bne.s		ex_blink +		move.b          #$05,d1		; eine Pause einlegen +ex_pause: +		bsr.s		ex_wait +		subq.b		#1,d1 +		bne.s		ex_pause +		bra.s		ex_handle	; und alles von vorne + +ex_wait: +		move.l		d0,-(a7)   	; Register retten +		move.l		#$50000,d0	; ungefaehr 1/2 Sekunde +ex_wloop:                          		; Register herunterzaehlen +		subq.l		#1,d0 +		bne.s		ex_wloop +		move.l		(a7)+,d0	; D0 wieder zurueck +		rts + +;---------------------------------------------------------------------------- +; Einzelschrittverfolgung: + +StepProc: +		clr.b		S_Latch+1.w +		movem.l		d0-d7/a0-a7,S_RegSave.w ; Register retten +		move		usp,a0 +		move.l		a0,S_RegSave+64.w +		move.l		$4.w,S_ResVecSave.w ; Resetvektor sichern +		lea		S_Restart(pc),a0    ; am Punkt S_StepBack wacht +		move.l		a0,$4.w		    ; der PcPar wieder auf +		move.b		#9,S_Latch+1.w      ; ParMon-Aufruf ausgeben +                stop            #$2000              ; hier geht es nur mit einem +                                                    ; Reset weiter + +;---------------------------------------------------------------------------- +; Routinen zur Kommunikation mit dem PC  (Trap 0) + +PcSysCall: +		clr.b		S_Latch+1.w +		movem.l		d0-d7/a0-a7,S_RegSave.w ; Register retten +		move		usp,a0 +		move.l		a0,S_RegSave+64.w +		move.l		$4.w,S_ResVecSave.w ; Resetvektor sichern +		lea		S_Restart(pc),a0    ; am Punkt S_Restart wacht +		move.l		a0,$4.w		    ; der PcPar wieder auf +		move.b		#$40,S_Latch+1.w    ; PC-Aufruf ausgeben +                stop            #$2000              ; hier geht es nur mit einem + +S_Restart: +		clr.b		S_Latch+1.w	    ; Systemanfrage loeschen +		move.l		S_ResVecSave.w,$4.w ; Resetvektor zurueck +		move.l		S_RegSave+64.w,a0 +		move		a0,usp +		movem.l		S_RegSave.w,d0-d7/a0-a7 ; Register zurueckholen +		rte				        ; das war's + +;---------------------------------------------------------------------------- +; Libraryverwaltung :   Trap #13 +; +; Struktur einer Library : +; +; Adresse 0:    Laenge in Bytes  (1 <= Laenge <= 256k) +; Adresse 4:    Dummyzeiger =-1 (vom System verwendet)  \ +; Adresse 8:    Libraryname als ASCIIZ-String           | kopierter Block +; Adresse n:    Sprungtabelle                           | +; Adresse m:    Librarycode, private Daten              / +; +; der gesamte Librarycode muss lageunabhaengig geschrieben sein ! +; +; definierte Unterfunktionen: +; +;     D0.L=0 : Library installieren +;     D0.L=1 : Libraryzeiger holen +; +;---------------------------------------------------------------------------- + +; Subfunktion 0: Library von Adresse 0 installieren: +; Eingabe: A0=Startadresse der Library +; Ausgabe: keine + +S_LibFun:       movem.l d1-d2/a1-a2,-(a7)  ; Register sichern +                tst.l   d0              ; ist es Funktion 0 ? +                bne.s   S_LibFun1       ; nein-->bei Funktion 1 weitertesten + +                move.l  (a0),d0         ; Laenge Library holen +                addq.l  #3,d0           ; auf Doppelworte aufrunden +                and.b   #$fc,d0 +                moveq   #1,d1 +                cmp.l   #$40000,d0      ; Maximalgroesse ueberschritten ? +                bge.l   S_LibErr        ; ja-->Ende mit Fehler Nr.1 + +                move    usp,a1          ; Userstack holen +                move.l  S_FreeMemEnd.w,d2 ; mom. belegte Stackmenge berechnen +                sub.l   a1,d2 +                move.l  a1,a2           ; neue Untergrenze in A2 rechnen +                sub.l   d0,a2 +                moveq   #2,d1 +                cmp.l   #$800,a2        ; unter abs. Untergrenze gesunken ? +                ble.l   S_LibErr        ; ja-->Ende mit Fehler Nr.2 + +                move    a2,usp          ; neuen Userstack einschreiben +                lsr.l   #1,d2           ; Stackgroesse in Worten +                bra.s   S_LibStckEnd    ; damit Ende, falls kein Stack belegt + +S_LibStckCpy:   move.w  (a1)+,(a2)+     ; Userstack umkopieren +S_LibStckEnd:   dbra    d2,S_LibStckCpy + +                move.l  S_FreeMemEnd.w,a1 ; Startadresse der Library rechnen +                sub.l   d0,a1           ; =altes Speicherende-Laenge +                addq.l  #4,a0           ; Quellzeiger weitersetzen +                move.l  S_LibStart.w,d1 ; bisheriges Ende der Kette holen +                move.l  d1,(a0)         ; in neue Library eintragen +                move.l  a1,S_FreeMemEnd.w ; Speichergrenze heruntersetzen +                move.l  a1,S_LibStart.w ; neuen Kettenanfang eintragen + +                lsr.l   #2,d0           ; Laenge in Doppelworte umrechnen +                subq.w  #1,d0           ; wg. DBRA + +S_LibInstLoop:  move.l  (a0)+,(a1)+     ; Library umkopieren +                dbra    d0,S_LibInstLoop + +                bra.l   S_LibOK         ; Ende ohne Fehler + +; Subfunktion 1: Library finden, deren Name ab (A0) als ASCIIZ steht: +; Eingabe: A0=Startadresse des ASCIIZ-Strings +; Ausgabe: D0=Startadresse der Sprungtabelle + +S_LibFun1:      subq.l  #1,d0           ; ist es Funktion 1 ? +                bne.s   S_LibFun2       ; nein-->bei Funktion 2 weitertesten + +                move.l  S_LibStart.w,a2 ; Wurzelzeiger der Kette holen + +S_LibGetLoop:   moveq   #3,d1           ; Kettenende erreicht ? +                move.l  a2,d0 +                addq.l  #1,d0           ; wird durch -1 angezeigt +                beq.l   S_LibErr        ; ja-->Ende mit Fehler + +                move.l  a0,d0           ; Startadresse Vergleichsstring retten +                lea     4(a2),a1        ; A1 zeigt auf zu testenden Namen +S_LibGetComp:   cmpm.b  (a0)+,(a1)+     ; ein Zeichen vergleichen +                bne.s   S_LibGetNext    ; ungleich-->weiter in Kette +                tst.b   -1(a0)          ; War das das Ende ? +                beq.s   S_LibGetFnd     ; ja-->Heureka! +                bra.s   S_LibGetComp    ; ansonsten naechstes Zeichen vergleichen + +S_LibGetNext:   move.l  (a2),a2         ; weiter auf Nachfolger in Kette +                move.l  d0,a0           ; A0 auf Referenzstringanfang +                bra.s   S_LibGetLoop + +S_LibGetFnd:    move.l  a1,d0           ; Libraryadresse gerade machen +                addq.l  #1,d0 +                bclr    #0,d0 + +                bra.l   S_LibOK         ; Ende ohne Fehler + +S_LibFun2:      moveq   #127,d1         ; unbekannte Funktion: +                bra.l   S_LibErr + +S_LibErr:       move.l  d1,d0           ; Fehlercode in D0 holen +                movem.l (a7)+,d1-d2/a1-a2  ; Register zurueck +                or.b    #1,1(a7)        ; Carry setzen +                rte + +S_LibOK:        movem.l (a7)+,d1-d2/a1-a2  ; Register zurueck +                and.b   #$fe,1(a7)      ; Carry loeschen +                rte + +;---------------------------------------------------------------------------- +; Tracemode ein/aus: + +S_StepTgl: +		andi		#$7fff,sr	; bitte hier kein Trace! +		bclr		#7,(a7)		; altes T-Flag loeschen +		btst		#0,1(a7) +		bne.s		S_StepOn        ; C=1-->Tracemodus an +		rte				; C=0-->fertig +S_StepOn: +		bset		#7,(a7)		; T-Flag setzen +		rte + +;---------------------------------------------------------------------------- +; Programmende (Trap 15) + +S_ProgEnd:      lea		S_Start(pc),a0	; Startvektor zurueck +		move.l		a0,4.w +		move.b		#$ff,S_Latch+1.w ; "Ich bin fertig" +                stop            #$2000          ; und Ende + +;---------------------------------------------------------------------------- +; Line-F-Exception + +S_Response	equ		$fffffe00	; In a6 (Coprozessor-Register) +S_Control	equ		$02		; Alle weiteren Register relativ +S_Save		equ		$04		; zu "Response" +S_Restore	equ		$06 +S_Command	equ		$0a		; in a5 +S_Condition	equ		$0e +S_Operand	equ		$10		; in a4 +S_Reg_Selec	equ		$14 +S_Ins_Add	equ		$18 + +                supmode         on + +S_LineF:	btst		#0,S_Latch+1.w	; Ist ein Koprozessor vorhanden ? +		bne		ex_vec11	; nein-->normaler Line-F + +		movem.l		d0-d7/a0-a6,S_RegSave.w	; Register retten +		move.l		usp,a0		; USP retten +		move.l		a0,S_RegSave+60.w ; (geht nur ueber Umweg) +		lea		S_Response.w,a6	; #response nach A6 +		lea		S_Command(a6),a5 ; #command nach A5 +		lea		S_Operand(a6),a6 ; #operand nach A4 +		lea		S_RegSave.w,a3	; #dregs nach A3 +		move.l		2(a7),a0	; PC nach A0 +		move.w		(a0),d1		; Kommando nach D1 +S_again:					; Einsprung fuer weitere FPU-Befehle +		and.w		#%0000000111000000,d1 ; Spezialteil ausmaskieren +		bne		S_spezial	; Ein Bit gesetzt-->Spezialbefehl +		move.w		2(a0),d1	; zweiten Befehlsteil in D1 merken +		move.w		d1,(a5)		; Befehl in FPU schr. (A5==#command) +S_do_ca:					; Einsprung fuer weitere Nachfragen an FPU +		move.w		(a6),d0		; Response lesen +		btst		#12,d0		; Erstes Modusbit testen +		bne		S_rw_1x		; ==1 --> springen +		btst		#11,d0		; Zweites Modusbit testen +                beq.s           S_rw_00         ; ==0 --> springen +; ----- %xxx01, Null-Primitive/Transfer Single CPU Register +		btst		#10,d0		; Register uebertragen ? +		bne.s		S_rw_sngl	; Ja--> Transfer Single CPU-Register +		btst		#15,d0		; CA (Come Again) gesetzt ? +		bne.s		S_do_ca		; Ja--> weiter fragen, sonst fertig +		addq.l		#4,a0		; A0 um reine Befehlslaenge weiter +						; ( alles andere wurde in calc_add erledigt ) +		move.w		(a0),d1		; erstes Befehlswort holen +		move.w		d1,d0		; und nach D0 +		and.w		#$f000,d0	; Wieder COP-Befehl ? +		eor.w		#$f000,d0 +		beq.s		S_again		; Ja-->direkt weitermachen +		move.l		a0,2(a7)	; Neuen PC eintragen +		move.l		S_RegSave+60.w,a0 ; USP wiederherstellen +		move.l		a0,usp		; (geht nur ueber Umweg) +		movem.l		(a3),d0-a6	; Register wiederherstellen +		rte				; Trap beenden +S_rw_sngl: +		and.w		#%1110000,d1	; Registernummer ausmaskieren ( nur Dn ) +		lsr.w		#2,d1		; D1=Nummer*4 +		move.l		0(a3,d1.w),(a4)	; Register uebertragen (a4==#operand, a3==#dregs) +		bra.s		S_do_ca		; danach kommt immer noch etwas +;-----%xxx00, Transfer multiple coprocessor Reg. +S_rw_00: +		bsr		S_calc_add	; Operandenadresse nach A1 holen +		move.w		S_Reg_Selec(a6),d4 ; Registerliste nach D4 holen +		btst		#13,d0		; Dr-Bit testen +		beq.s		S_w_00		; ==0--> Daten in FPU schreiben +		btst		#12,d0		; Predekrementmodus ? +		beq.s		S_r_pred	; ==0--> Ja,springen +		moveq		#7,d0		; Schleifenzaehler fuer 8 Bits +S_11: +		lsl.w		#1,d4		; Ein Bit ins Carry +		bcc.s		S_21		; nur bei Bit==1 etwas machen +		move.l		(a4),(a1)+	; 1 (A4==#operand) +		move.l		(a4),(a1)+	; 2 +		move.l		(a4),(a1)+	; 3 Langworte fuer jedes Register +S_21: +		dbra		d0,S_11		; Fuer alle 8 Bits +                bra.s           S_do_ca         ; Nochmal FPU befragen +S_r_Pred: +		moveq		#7,d0           ; Schleifenzaehler fuer 8 Bits +S_12: +		lsl.w		#1,d4		; Ein Bit ins Carry +		bcc.s		S_22		; nur bei Bit=1 etwas machen +		move.l		(a4),(a1)+	; 1 (A4==#operand) +		move.l		(a4),(a1)+	; 2 +		move.l		(a4),(a1)+	; 3 Langworte fuer jedes Register +		suba.w		#24,a1		; Dekrement durchfuehren +S_22: +		dbra		d0,S_12		; Fuer alle 8 Bits +		adda.w		#12,a1		; A1 wieder auf letztes Register +		move.l		a1,(a2)		; A1 als Registerinhalt abspeichern +		bra		S_do_ca		; Nochmal FPU befragen +S_w_00: +		move.w		(a0),d0		; erstes Befehlswort holen +		and.b		#%111000,d0	; Adressierungsart maskieren +		cmp.b		#%011000,d0	; Gleich (An)+ ? +		beq.s		S_w_Post	; Ja-->Postinkrementiermodus +		moveq		#7,d0		; Schleifenzaehler fuer 8 Bits +S_13: +		lsl.w		#1,d4		; Ein Bit ins Carry +		bcc.s		S_23		; Nur bei Bit==1 etwas machen +		move.l		(a1)+,(a4)	; 1 (A4==#operand) +		move.l		(a1)+,(a4)	; 2 +		move.l		(a1)+,(a4)	; 3 Langworte fuer jedes Register +S_23: +		dbra		d0,S_13		; Fuer alle 8 Bits +		bra		S_do_ca		; Nochmal FPU befragen +S_w_Post: +		suba.w		#12,a1		; Inkrement von calc_add aufheben +		moveq		#7,d0		; Schleifenzaehler fuer 8 Bits +S_14: +		lsl.w		#1,d4		; Ein Bit ins Carry +		bcc.s		S_24		; nur bei Bit==1 etwas machen +		move.l		(a1)+,(a4)	; 1 (A4==#operand) +		move.l		(a1)+,(a4)	; 2 +		move.l		(a1)+,(a4)	; 3 Langworte fuer jedes Register +S_24: +		dbra		d0,S_14		; Fuer alle 8 Bits +		move.l		a1,(a2)		; A1 als Registerinhalt abspeichern +		bra		S_do_ca		; Nochmal FPU befragen + +S_rw_1x: +		btst		#11,d0		; zweites Modusbit testen +		bne.s		S_rw_11		; ==1 --> springen (Trap,Error) +		btst		#13,d0		; DR-Bit testen +		beq.s		S_w_10		; ==0 --> Daten an FPU schreiben +;----- %xx110, evaluate effective adress and transfer data +		bsr		S_calc_add	; Operandenadresse berechnen +						; A1=Operandenadresse, d1.l=Operandenl„nge +		cmp.w		#2,d1		; Laenge-2 +		ble.s		S_r_bw		; <=2 --> Wort-oder-Byteoperand +S_r_11: +		move.l		(a4),(a1)+	; ein Langwort lesen (A4==#operand) +		subq.l		#4,d1		; und runterzaehlen +		bgt.s		S_r_11		; >0 --> weiter uebertragen +		bra		S_do_ca		; Nochmal FPU befragen +S_r_bw: +		btst		#0,d1		; Byte ? +		bne.s		S_r_byte	; Ja! +		move.w		(a4),(a1)	; Wort-Operand lesen (A4==#operand) +		bra		S_do_ca		; Nochmal FPU befragen +S_r_byte: +		move.b		(a4),(a1)	; Byte-Operand lesen (A4==#operand) +                bra.l           S_do_ca         ; Nochmal FPU befragen + +;----- %xx101, evaluate effective adress and transfer data +S_w_10: +		bsr		S_calc_add	; Operandenadresse berechnen +						; A1=Operandenadresse, d1.l=Operandenl„nge +		cmp.w		#2,d1		; Laenge-2 +		ble.s		S_w_bw		; <=2 --> Wort-oder-Byteoperand +S_w_11: +		move.l		(a1)+,(a4)	; ein Langwort lesen (A4==#operand) +		subq.l		#4,d1		; und runterzaehlen +		bgt.s		S_w_11		; >0 --> weiter uebertragen +		bra		S_do_ca		; Nochmal FPU befragen +S_w_bw: +		btst		#0,d1		; Byte ? +		bne.s		S_w_byte	; Ja! +		move.w		(a1),(a4)	; Wort-Operand lesen (A4==#operand) +		bra		S_do_ca		; Nochmal FPU befragen +S_w_byte: +		move.b		(a1),(a4)	; Byte-Operand lesen (A4==#operand) +                bra.l           S_do_ca         ; Nochmal FPU befragen + +;----- %xxx11, take pre-instruction exception +S_rw_11: +		bra		ex_vec11	; Error-Handler anspringen +;		( hier koennte man eine genauere Fehleranalyse machen ) + +S_spezial:                                      ; Sprungbefehle etc. +		cmp.w		#%001000000,d1	; FScc,FDBcc oder FTRAPcc +		beq.s		S_s_trap +		cmp.w		#%010000000,d1	; Branch mit 16-Bit-Offset +                beq.l           S_s_br16 +		cmp.w		#%011000000,d1	; Branch mit 32-Bit-Offset +                beq.l           S_s_br32 +		bra		ex_vec11	; FSAVE/FRESTORE nicht unterstuetzt +S_s_trap: +		move.w		(a0),d0		; Erstes Befehlswort nach D0 +		move.w		d0,d1		; und nach D1 retten +		and.w		#%111000,d0	; Wichtige Bits ausmaskieren +		cmp.w		#%001000,d0	; FDBcc ? +		beq.s		S_s_fdbcc	; Ja-->springen +		cmp.w		#%111000,d0	; FTRAP ? +		beq		ex_vec11	; Ja-->Fehler (nicht unterstuetzt) +						; sonst FScc +		move.w		2(a0),S_condition(a6) ; Bedingung an FPU schicken +		moveq		#1,d0		; Operandenlaenge=1 (fuer calc_add) +		bsr		S_calc_add	; Operandenadresse berechnen +S_15: +		move.w		(a6),d0		; Response lesen +		btst		#8,d0		; IA-Bit testen +		beq.s		S_25		; ==0 --> fertig +		and.w		#%1100000000000,d0 ; Bits 11 und 12 ausmaskieren +		eor.w		#%1100000000000,d0 ; Beide gesetzt ? +		bne.s		S_15		; Nicht beide==1 --> warten +		bra		ex_vec11	; Sonst ist Exception aufgetreten +S_25: +		btst		#0,d0		; Antwortbit testen +		sne		(a1)		; Je nach Bit setzen/loeschen +		bra		S_do_ca		; Nochmal FPU befragen +S_s_fdbcc: +		move.w		2(a0),S_condition(a6) ; Bedingung an FPU schicken +		and.w		#%111,d1	; Registernummer maskieren (D1=(A0)) +		lsl.w		#2,d1		; D1=Nummer*4 +		lea		0(a3,d1.w),a1	; A1 enthaelt Adresse des Datenreg. +		move.l		(a1),d1		; Dn holen +		subq.w		#1,d1		; Dn=Dn-1 +		move.l		d1,(a1)		; Dn zurueckschreiben +		move.l		a0,a2           ; alten PC nach A2 holen +		addq.l		#2,a0		; PC 2 weiter ( fuer "nicht springen") +S_16: +		move.w		(a6),d0		; Response lesen +		btst		#8,d0		; IA-Bit testen +		beq.s		S_26		; ==0 --> fertig +		and.w		#%1100000000000,d0 ; Bits 11 und 12 ausmaskieren +		eor.w		#%1100000000000,d0 ; Beide gesetzt ? +		bne.s		S_16		; Nicht beide==1 --> warten +		bra		ex_vec11	; Sonst ist Exception aufgetreten +S_26: +		btst		#0,d0		; Antwortbit testen +		bne		S_do_ca		; True-->das war's schon +		adda.w		2(a2),a2	; 16-Bit-Sprungdist. add. (A2=PC) +		addq.w		#1,d1		; Dn=-1 ? +		beq		S_do_ca		; Ja-->kein Sprung (Schleifenende) +		move.l		a2,a0		; Sonst "Sprung" (neuen PC laden) +		bra		S_do_ca		; nochmal FPU befragen +S_s_br16: +		move.w		(a0),S_Condition(a6) ; Bedingung an FPU schicken +S_17: +		move.w		(a6),d0		; Response lesen +		btst		#8,d0		; IA-Bit testen +		beq.s		S_27		; ==0 --> fertig +		and.w		#%1100000000000,d0 ; Bits 11 und 12 ausmaskieren +		eor.w		#%1100000000000,d0 ; Beide gesetzt ? +		bne.s		S_17		; Nicht beide==1 --> warten +		bra		ex_vec11	; Sonst ist Exception aufgetreten +S_27: +		btst		#0,d0		; Antwortbit testen +		beq		S_do_ca		; False--> das war's schon +		adda.w		2(a0),a0	; 16-Bit-Sprungdistanz addieren +		subq.l		#2,a0		; Ein Wort zurueck ( weil spaeter +		; noch 4 addiert wird und und nur 2 addiert werden muesste ) +		bra		S_do_ca		; Nochmal FPU befragen +S_s_br32: +		move.w		(a0),S_Condition(a6) ; Bedingung an FPU schicken +S_18: +		move.w		(a6),d0		; Response lesen +		btst		#8,d0		; IA-Bit testen +		beq.s		S_28	; ==0 --> fertig +		and.w		#%1100000000000,d0 ; Bits 11 und 12 ausmaskieren +		eor.w		#%1100000000000,d0 ; Beide gesetzt ? +		bne.s		S_18	; Nicht beide==1 --> warten +		bra		ex_vec11	; Sonst ist Exception aufgetreten +S_28: +		addq.l          #2,a0		; Befehl ist 3 Worte lang +						; (jetzt : (A0)=Distanz) +		btst		#0,d0		; Antwortbit testen +		beq		S_do_ca		; False--> das war's schon +		adda.l		(a0),a0		; 32-Bit-Sprungdistanz addieren +		subq.l		#4,a0		; Zwei Worte zurueck ( weil spaeter +		; noch 4 addiert wird, 2 wurden schon addiert ) +		bra		S_do_ca		; Nochmal FPU befragen +S_calc_add: +		; Operandenadresse berechnen. A0 muss die Adresse des Line-F- +		; Befehls enthalten, D0 im unteren Byte die Operandenlaenge. +		; die zu berechnende Adresse wird in A1 abgelegt. A0 wird +		; um die Laenge der zusaetzlichen Daten erhaelt. +		; Zusaetzlich wird in D1 die Laenge des Operanden zurueckge- +		; geben (in Bytes, als Langwort). D2,D3,A3 werden zerstoert. +		; Bei den Adressierungsarten -(An),(An)+ steht in A2 ein +		; Zeiger auf die Stelle, in der der Inhalt des Adressregisters +		; gisters An steht (wird fuer FMOVEM gebraucht). + +		clr.l		d1		; Laenge als Langwort loeschen +		move.b		d0,d1		; und Byte umkopieren +		move.w		(a0),d2		; erstes Befehlswort nach D2 +		move.w		d2,d3		; und D3 retten +		and.w		#%111000,d3	; Adressierungsart ausmaskieren +		lsr.w		#1,d3		; D3=Adressierungsart*4 (Langworte) +                lea             S_cs_tab(pc),a1 ; Sprungtabellenadresse nach A1 +		move.l		0(a1,d3.w),a1	; Adresse der Routine nach A1 +		jmp		(a1)		; und Routine anspringen +S_c_drd:	; %000  Data Register Direct:			    Dn +S_c_ard:	; %001  Address Register Direct:        	    An +		lea		(a3),a1		; A1 auf Registerfeld +		and.w		#%1111,d2	; Registernummer ausmaskieren +;		( und ein Bit vom Modus, 0 fuer Daten-,1 fuer Adressregister ) +		lsl.w		#2,d2		; D2="Registernummer"*4 (+Modusbit) +		addq.w		#4,d2		; +4 (fuer Operandenlaenge) +		sub.w		d1,d2		; Wahre Laenge abziehen +		adda.w		d2,a1		; Offset auf Registerfeldanfang add. +		rts +S_c_ari:	; %010  Address Register indirect:		    (An) +		and.w		#%111,d2	; Registernummer ausmaskieren +		lsl.w		#2,d2		; D2=Registernummer*4 +		move.l		32(a3,d2.w),a1	; Adresse nach A1 +		rts +S_c_arpo:	; %011	Adressregister indirect with Postincrement: (An)+ +		and.w		#%111,d2	; Registernummer ausmaskieren +		lsl.w		#2,d2		; D2=Registernummer*4 +		lea		32(a3,d2.w),a2	; Adresse Adressregister nach A2 +		move.l		(a2),a1		; Adresse (Inhalt A.-Reg.) nach A1 +		btst		#0,d1		; D1 ungerade ? (Byteoperand) +		bne.s		S_29		; Ja-->Spezialbehandlung +S_19: +		add.l		d1,(a2)		; Inkrement durchfuehren +		rts +S_29: +		cmp.w		#4*7,d2		; Ist A7 gemeint ? +		bne.s		S_19		; nein-->normal vorgehen +		addq.l		#2,(a2)		; Sonst (bei Byte) 2 addieren, +		rts				; damit Stack gerade bleibt! +S_c_arpr:	; %100  Adressregister Indirect with Predekrement:  -(An) +		and.w		#%111,d2	; Registernummer ausmaskieren +		lsl.w		#2,d2		; D2=Registernummer*4 +		lea		32(a3,d2.w),a2	; Adresse des Adressreg. nach A2 +		btst		#0,d1		; D1 ungerade? (Byteoperand) +		bne.s		S_210		; Ja-->Spezialbehandlung +S_110: +		sub.l		d1,(a2)		; Dekrement durchfuehren +		move.l		(a2),a1		; Adresse (Inhalt des A.-Reg) nach A1 +		rts +S_210: +		cmp.w		#4*7,d2		; Ist A7 gemeint? +		bne.s		S_110		; nein-->normal vorgehen +		subq.l		#2,(a2)		; Sonst (bei Byte) 2 addieren, +						; damit Stack gerade bleibt ! +		move.l		(a2),a1		; Adresse (Inhalt des A.-Reg) nach A1 +		rts +S_c_ar16:	; %101  Addressregister Indirect with Displacement: d16(An) +		and.w		#%111,d2	; Registernummer ausmaskieren +		lsl.w		#2,d2		; D2=Registernummer*4 +		move.l		32(a3,d2.w),a1	; Adresse nach A1 +		move.w		4(a0),d2	; 3.Befehlswort nach D2 (Offset) +		adda.w		d2,a1		; Offset auf Adresse addieren +		addq.l		#2,a0		; A0 ein Wort (d16) weiter +		rts +S_c_ar08:	; %110  Addressregister Indirect with Index : 	    d8(An,Xn) +		and.w		#%111,d2	; Registernummer ausmaskieren +		lsl.w		#2,d2		; D2=Registernummer*4 +		move.l		32(a3,d2.w),a1	; Adresse nach A1 +		move.w		4(a0),d2	; 3.Befehlswort nach D2 (Byte-Offset) +		move.w		d2,d3		; und nach D3 +		and.w		#$ff,d3		; Byte ausmaskieren (Byte-Offset) +		adda.w		d3,a1		; Offset auf Adresse addieren +		btst		#11,d2		; 1=long; 0=word +		bne.s		S_c_ar81 +		and.w		#%1111000000000000,d2 ; Nummer von Dn und Modusbit +		lsr.w		#5,d2		; maskieren +		lsr.w		#5,d2		; D2=Registernummer*4 (und modusbit) +		adda.w		2(a3,d2.w),a1	; 16-Bit-Index auf A1 addieren +		addq.l		#2,a0		; A0 ein Wort (Kram & d8) weiter +		rts +S_c_ar81: +		and.w		#%1111000000000000,d2 ; Nummer von Dn und Modusbit +		lsr.w		#5,d2		; maskieren +		lsr.w		#5,d2		; D2=Registernummer*4 (und modusbit) +		adda.w		0(a3,d2.w),a1	; 32-Bit-Index auf A1 addieren +		addq.l		#2,a0		; A0 ein Wort (Kram & d8) weiter +		rts +S_c_pc:		; %111  absolut short/long, PC-relativ (ohne/mit Index) \ oder direkt +		btst		#2,d2		; Immidiate ? +		bne.s		S_immi		; <>0 --> Ja! +		btst		#1,d2		; PC-relativ ? +		bne.s		S_pc_rel	; <>0 --> Ja! +		btst		#0,d2		; Long ? +		bne.s		S_c_long	; <>0 --> Ja! +						; sonst short +		move.w		4(a0),d2	; Wortadresse holen +		ext.l		d2		; Auf Langwort erweitern +		move.l		d2,a1		; und als Operandenadresse merken +		addq.l		#2,a0		; A0 ein Wort (Short-A.) weiter +		rts +S_c_long: +		move.l		4(a0),a1	; Langwortadresse holen +		addq.l		#4,a0		; A0 zwei Worte (Long-A.) weiter +		rts +S_immi: +		move.l		a0,a1		; Befehlsadresse nach A1 +		add.l		d1,a0		; A0 ueber Operand hinwegsetzen +		rts +S_pc_rel: +		btst		#0,d2		; mit Index ? +		bne.s		S_pc_idx	; <>0 --> Ja! +		move.l		a0,a1		; PC nach A1 +		adda.w		4(a0),a1	; Offset addieren +		addq.l		#4,a1		; +4 fuer Laenge des FPU-Befehls +		addq.l		#2,a0		; A0 zwei (16-Bit-Offset) weiter +		rts +S_pc_idx: +		move.l		a0,a1		; PC nach A1 +		clr.w		d2		; Oberes Byte loeschen +		move.b		5(a0),d2	; Offset nach D2 +		adda.w		d2,a1		; und addieren +		addq.l		#4,a1		; +4 fuer Laenge des FPU-Befehls +		move.b		4(a0),d2	; D2=Registernummer*16 und Modusbit +						; ( high-Byte ist noch 0 ) +		btst		#3,d2		; Long-Bit testen +		bne.s		S_pc_i_l	; <>0 -->Long-Index +		and.b		#%11110000,d2	; Registerinformation ausblenden +		lsr.w		#2,d2		; D2=Registernummer*4 (und Modusbit) +		adda.w		2(a3,d2.w),a1	; Word-Index addieren +		addq.l		#2,a0		; A0 zwei (8-Bit-Offset & Kram) weiter +		rts +S_pc_i_l: +		and.b		#%11110000,d2	; Restinformation ausblenden +		lsr.w		#2,d2		; D2=Registernummer*4 (und Modusbit) +		adda.l		0(a3,d2.w),a1	; Long-Index addieren +		addq.l		#2,a0		; A0 zwei (8-Bit-Offset & Kram) weiter +		rts				; Ende von S_calc_add + +S_cs_tab: +		dc.l		S_c_drd,S_c_ard,S_c_ari,S_c_arpo ; Sprungtabelle fuer +		dc.l		S_c_arpr,S_c_ar16,S_c_ar08,S_c_pc ; Adressierungsarten +S_End: + diff --git a/tests/t_parsys/t_parsys.doc b/tests/t_parsys/t_parsys.doc new file mode 100644 index 0000000..10d31c7 --- /dev/null +++ b/tests/t_parsys/t_parsys.doc @@ -0,0 +1,8 @@ ++----------------------  Test Application PARSYS ----------------------------+ +|                                                                            | +| Back to the roots!  This is the "operating system" of my 68000-based par-  | +| allel computer I built several years ago and which was the main reason to  | +| write my own assembler because the original one from RDK was too buggy to  | +| work reliably with it.  Contains also a lot of FPU orders.                 | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_parsys/t_parsys.inc b/tests/t_parsys/t_parsys.inc new file mode 100644 index 0000000..7ffd805 --- /dev/null +++ b/tests/t_parsys/t_parsys.inc @@ -0,0 +1,10 @@ +(* tests/t_parsys/t_parsys.asm-Includefile für CONST-Sektion *) +S_RegSave = $608; +S_MemEnd = $400; +S_ParNo = $408; +S_CPUNo = $422; +_fadd_cnt = $40E; +_fmul_cnt = $412; +_fdiv_cnt = $416; +_fsqrt_cnt = $41A; +(* Ende Includefile für CONST-Sektion *) diff --git a/tests/t_parsys/t_parsys.ori b/tests/t_parsys/t_parsys.ori Binary files differnew file mode 100644 index 0000000..d26be99 --- /dev/null +++ b/tests/t_parsys/t_parsys.ori diff --git a/tests/t_scmp/asflags b/tests/t_scmp/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_scmp/asflags diff --git a/tests/t_scmp/t_scmp.asm b/tests/t_scmp/t_scmp.asm new file mode 100644 index 0000000..0fdc8ca --- /dev/null +++ b/tests/t_scmp/t_scmp.asm @@ -0,0 +1,59 @@ +	cpu	sc/mp + +        lde +        xae +        ane +        ore +        xre +        dae +        ade +        cae + +        sio +        sr +        srl +        rr +        rrl + +        halt +        ccl +        scl +        dint +        ien +        csa +        cas +        nop + +        ldi	0x12 +        ani	0x23 +        ori	0x34 +        xri	0x45 +        dai	0x56 +        adi	0x67 +        cai	0x78 +        dly	0x89 + +        xpal	pc +        xpah	p2 +        xppc	p1 + +	ld	e(pc) +        st	@e(p2) +        and	10(p1) +        or	@-20(p3) +        xor	vari +vari:	dad	-30(p2) +	add	@40(p1) +        cad	vari + +	jmp	vari +        jp	10(p2) +        jz	vari +        jnz	vari + +        ild	vari +        dld	-5(p2) + +;        org     0xfff +;        ldi     0x20 + diff --git a/tests/t_scmp/t_scmp.doc b/tests/t_scmp/t_scmp.doc new file mode 100644 index 0000000..8c863b8 --- /dev/null +++ b/tests/t_scmp/t_scmp.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application SCMP ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the SC/MP code generator                | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_scmp/t_scmp.ori b/tests/t_scmp/t_scmp.ori Binary files differnew file mode 100755 index 0000000..75684f1 --- /dev/null +++ b/tests/t_scmp/t_scmp.ori diff --git a/tests/t_secdrive/asflags b/tests/t_secdrive/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_secdrive/asflags diff --git a/tests/t_secdrive/lowlevel.inc b/tests/t_secdrive/lowlevel.inc new file mode 120000 index 0000000..968acf7 --- /dev/null +++ b/tests/t_secdrive/lowlevel.inc @@ -0,0 +1 @@ +wd1003at.inc
\ No newline at end of file diff --git a/tests/t_secdrive/secparam.inc b/tests/t_secdrive/secparam.inc new file mode 100644 index 0000000..8bf8381 --- /dev/null +++ b/tests/t_secdrive/secparam.inc @@ -0,0 +1,1619 @@ +;***************************************************************************** +;* Sekund„rlaufwerkstreiber, Modul SecParam                                  * +;* liefert Laufwerksparameter, falls fehlend im Bootsektor                   * +;* stellt das ganze Formatiermen zur Verfgung                              * +;***************************************************************************** + +                section SecParam + +;***************************************************************************** +;* gemeinsam benutzte Meldungen                                              * +;***************************************************************************** + +TrackMsg        db      "Spur (0..Spurzahl-1) : $" +HeadMsg         db      "Kopf (0..Kopfzahl-1) : $" +ConfirmMsg      db      "Sind Sie sicher ?$" +InterleaveMsg   db     "Interleave (1..Sektorzahl-1) : $" + +;***************************************************************************** +;* Routine BreakOnESC                                                        * +;* schaut nach, ob ESC gedrckt wurde                                        * +;* Ausgabe:     C=1, falls ja                                                * +;***************************************************************************** + +                GlobProc BreakOnESC + +                push    ax              ; Register retten +                mov     ah,1            ; Tastaturpuffer antesten +                int     INT_Keyboard +                clc                     ; Annahme nicht gedrckt +                jz      Ende +                mov     ah,0            ; Zeichen da: dies abholen +                int     INT_Keyboard +                cmp     al,ESC          ; ist es ESC ? +                clc                     ; Annahme nein +                jne     Ende +                stc                     ; jawoll! +Ende:           pop     ax              ; Register zurck +                ret + +                endp + +;***************************************************************************** +;* Routine YesNo                                                             * +;* fragt nach Ja oder Nein                                                   * +;* Ausgabe:     C=0, falls ja                                                * +;***************************************************************************** + +                proc    YesNo + +                push    ax              ; Register retten + +QueryLoop:      mov     ah,DOS_RdChar   ; ein Zeichen lesen +                int     INT_DOS + +                cmp     al,'a'          ; Kleinbuchstaben ? +                jb      Upper +                cmp     al,'z' +                ja      Upper +                add     al,'A' +                sub     al,'a' +Upper: +                cmp     al,'J'          ; akzeptierte Zeichen fr Ja +                clc +                je      YNDone +                cmp     al,'Y' +                clc +                je      YNDone +                cmp     al,'N'          ; akzeptierte Zeichen fr Nein +                stc +                je      YNDone + +                PrChar  BEL             ; alles andere anmeckern +                jmp     QueryLoop + +YNDone:         PrChar  al              ; Zeichen als Echo ausgeben +                PrChar  CR              ; Zeilenvorschub +                PrChar  LF +                pop     ax              ; Register zurck + +                ret + +                endp + +;***************************************************************************** +;* Routine ReadNumber                                                        * +;* liest einen Wert von 0..n in AX ein                                       * +;* Eingabe:     AX = Maximalwert                                             * +;*              DI = Zeiger auf Meldung                                      * +;* Ausgabe:     AX = eingelesene Zahl                                        * +;***************************************************************************** + +                proc    ReadNumber + +                push    bx              ; Register retten +                push    cx +                push    dx +                push    si + +                mov     si,ax           ; Maximalwert retten +InLoop:         mov     dx,di           ; Meldung ausgeben +                mov     ah,DOS_WrString +                int     INT_DOS +                lea     dx,[KeyBuffer]  ; Zahl als String einlesen +                mov     ah,DOS_RdString +                int     INT_DOS +                PrChar  CR +                PrChar  LF +                mov     ax,0            ; jetzt Zeichen verarbeiten +                mov     cl,[KeyBuffer+1] +                mov     ch,0 +                lea     bx,[KeyBuffer+2] +                jcxz    InvFormat       ; Nullschleife abfangen +ConvLoop:       mov     dx,10           ; bisheriges Ergebnis hochmultiplizieren +                mul     dx +                mov     dl,[bx]         ; ein Zeichen holen +                inc     bx +                sub     dl,'0'          ; ASCII-Offset abziehen +                jc      InvFormat       ; bei Formatfehler abbrechen +                cmp     dl,9            ; nur 0..9 erlaubt +                ja      InvFormat +                add     al,dl           ; dazuaddieren +                adc     ah,0 +                loop    ConvLoop +                jmp     ChkRange        ; fertig: weiter zur Bereichsprfung +InvFormat:      PrMsg   InvMsg          ; wenn fehlerhaft, meckern +                jmp     InLoop          ; und nochmal versuchen +ChkRange:       cmp     ax,si           ; auáerhalb Bereich ? +                jbe     OK +                PrMsg   OverMsg         ; ja: meckern... +                jmp     InLoop          ; ...und auf ein neues + +OK:             pop     si              ; Register zurck +                pop     dx +                pop     cx +                pop     bx + +                ret + +KeyBufferLen    equ     30              ; 30 Zeichen sollten fr Zahlen reichen... +KeyBuffer       db      KeyBufferLen    ; Maimall„nge fr DOS +                db      0               ; effektive L„nge Eingabe +                db      KeyBufferLen dup (0) ; Platz fr Eingabe +InvMsg          db      "Ungltiges Zahlenformat",CR,LF,'$' +OverMsg         db      "Bereichsberschreitung",CR,LF,'$' + +                endp + +;****************************************************************************** +;* eine Anzahl Leerzeichen ausgeben                                           * +;*              In  :   CX = Anzahl                                           * +;****************************************************************************** + +                globproc WriteSpc + +                push    dx              ; Register retten + +                jcxz    NULL            ; Nullschleife abfangen +Loop:           mov     ah,DOS_WrChar +                mov     dl,' ' +                int     INT_DOS +                loop    Loop + +NULL:           pop     dx              ; Register zurck +                ret + +                endp + +;****************************************************************************** +;* vorzeichenlose Zahl dezimal ausgeben                                       * +;*              In  :   AX = Zahl                                             * +;*                      CL = min. Stellenzahl                                 * +;****************************************************************************** + +                globproc WriteDec + +                push    di              ; Register retten +                push    cx +                push    dx + +                mov     ch,0            ; CH z„hlt effektive Zeichenzahl +InLoop:         sub     dx,dx           ; Stellendivision +                mov     di,10           ; gewnschtes Zahlensystem +                div     di +                mov     di,ax           ; war es vorher 0 ? +                or      di,dx           ; (wenn Quotient & Rest 0) +                jnz     NZero           ; nein-->normal ausgeben +                or      ch,ch           ; noch erste Stelle ? +                jz      NZero           ; dann auf jeden Fall 0 ausgeben +                mov     dl,0f0h         ; ansonsten Leerzeichen fr leading 0 +NZero:          push    dx              ; Zeichen speichern... +                inc     ch              ; ...und mitz„hlen +                cmp     ch,cl           ; Mindestzahl ausgegeben ? +                jb      InLoop          ; nein-->weiter +                or      ax,ax           ; ansonsten: 0 ? +                jnz     InLoop          ; nein, weitermachen + +                shr     cx,8            ; effektive Zahl nach CX +OLoop:          pop     dx              ; ein Zeichen runterholen +                add     dl,'0'          ; in ASCII konvertieren +                mov     ah,DOS_WrChar   ; ber DOS ausgeben +                int     INT_DOS +                loop    OLoop + +                pop     dx +                pop     cx +                pop     di              ; Register zurck +                ret + +                endp + +;****************************************************************************** +;* vorzeichenlose Zahl hexadezimal ausgeben                                   * +;*              In  :   AX = Zahl                                             * +;*                      CL = min. Stellenzahl                                 * +;****************************************************************************** + +                globproc WriteHex + +                push    di              ; Register retten +                push    cx +                push    dx + +                mov     ch,0            ; CH z„hlt effektive Zeichenzahl +InLoop:         sub     dx,dx           ; Stellendivision +                mov     di,16           ; gewnschtes Zahlensystem +                div     di +                mov     di,ax           ; war es vorher 0 ? +                or      di,dx           ; (wenn Quotient & Rest 0) +                jnz     NZero           ; nein-->normal ausgeben +                or      ch,ch           ; noch erste Stelle ? +                jz      NZero           ; dann auf jeden Fall 0 ausgeben +                mov     dl,0f0h         ; ansonsten Leerzeichen fr leading 0 +NZero:          push    dx              ; Zeichen speichern... +                inc     ch              ; ...und mitz„hlen +                cmp     ch,cl           ; Mindestzahl ausgegeben ? +                jb      InLoop          ; nein-->weiter +                or      ax,ax           ; ansonsten: 0 ? +                jnz     InLoop          ; nein, weitermachen + +                shr     cx,8            ; effektive Zahl nach CX +OLoop:          pop     dx              ; ein Zeichen runterholen +                add     dl,'0'          ; in ASCII konvertieren +                cmp     dl,'9' +                jbe     NoHex +                add     dl,7 +NoHex:          mov     ah,DOS_WrChar   ; ber DOS ausgeben +                int     INT_DOS +                loop    OLoop + +                pop     dx +                pop     cx +                pop     di              ; Register zurck +                ret + +                endp + +;***************************************************************************** +;* Routine GeometryDefined - stellt fest, ob Geometrie fr ei Laufwerk defi- * +;* niert ist                                                                 * +;* Eingabe:     AL = Laufwerksnummer                                         * +;* Ausgabe:     C  = 0, falls OK                                             * +;***************************************************************************** + +                proc    GeometryDefined + +                push    di              ; Register retten +                call    GetPTabAdr      ; Tabellenadresse bilden +                cmp     word ptr[di+DrPar_Cyls],0 ; Zylinderzahl 0 ? +                stc +                je      Fin +                cmp     byte ptr[di+DrPar_Heads],0 ; Kopfzahl 0 ? +                stc +                je      Fin +                cmp     byte ptr[di+DrPar_NSecs],0 ; Sektorzahl 0 ? +                stc +                je      Fin +                clc                     ; alles OK +Fin:            pop     di              ; Register zurck +                ret + +                endp + +;***************************************************************************** +;* Routine QueryRedefine - fragt nach, ob Geometrie neu definert werden soll * +;* Eingabe:     AL = Laufwerk                                                * +;* Ausgabe:     C = 0, falls ja                                              * +;***************************************************************************** + +                proc    QueryRedefine + +                add     al,'1'          ; Laufwerksnummer in ASCII umrechnen +                mov     [UndefMsg2],al  ; in Meldung einschreiben +                PrMsg   UndefMsg +                PrMsg   DoQueryMsg      ; nachfragen, ob Definition erwnscht +                call    YesNo +                ret + +UndefMsg        db      "Geometrie fr Laufwerk " +UndefMsg2       db      "  undefiniert.",CR,LF,"$" +DoQueryMsg      db      "Geometrie neu definieren ? $" + +                endp + +;***************************************************************************** +;* Routine ReadGeomety - liest Laufwerksgeometrie vom Benutzer ein           * +;* Eingabe:     AL = phys. Laufwerksnummer                                   * +;***************************************************************************** + +                proc    ReadGeometry + +                push    ax              ; Register retten +                push    si +                push    di + +                call    GetPTabAdr      ; Zeiger auf Parametertabelle holen +                mov     si,di + +                lea     di,[CylInpMsg]  ; Zylinderzahl erfragen +                mov     ax,1024 +                call    ReadNumber +                mov     [si+DrPar_Cyls],ax + +                lea     di,[HeadInpMsg] ; Kopfzahl erfragen +                mov     ax,16 +                call    ReadNumber +                mov     [si+DrPar_Heads],al + +                lea     di,[RWCInpMsg]  ; RWC-Zylinder erfragen +                mov     ax,65535 +                call    ReadNumber +                mov     [si+DrPar_RedWr],ax + +                lea     di,[PreInpMsg]  ; Pr„kompensations-Zylinder erfragen +                mov     ax,65535 +                call    ReadNumber +                mov     [si+DrPar_PrComp],ax + +                lea     di,[ECCInpMsg]  ; ECC-L„nge erfragen +                mov     ax,11 +                call    ReadNumber +                mov     [si+DrPar_ECCLen],ax + +                mov     al,[si+DrPar_Heads] ; Steuerbyte Bit 3=1, falls Platte +                dec     al +                and     al,8            ; mehr als 8 K”pfe hat +                mov     [si+DrPar_CByte],al + +                mov     al,0            ; Timeouts unbenutzt +                mov     [si+DrPar_TOut],al +                mov     [si+DrPar_FTOut],al +                mov     [si+DrPar_CTOut],al + +                mov     ax,[si+DrPar_Cyls] ; Parkzylinder=Zylinderzahl+1 +                inc     ax +                mov     [si+DrPar_LZone],ax + +                lea     di,[SecInpMsg]  ; Sektorzahl erfragen +                mov     ax,255 +                call    ReadNumber +                mov     [si+DrPar_NSecs],al + +                pop     di              ; Register zurck +                pop     si +                pop     ax +                ret + +CylInpMsg       db      "Anzahl Zylinder (max. 1024) : $" +HeadInpMsg      db      "Anzahl K”pfe (max. 16) : $" +RWCInpMsg       db      "Startzylinder fr reduzierten Schreibstrom (max. 65535) : $" +PreInpMsg       db      "Startzylinder fr Pr„kompensation (max. 65535) : $" +ECCInpMsg       db      "max. ECC-Fehlerburstl„nge (5 oder 11) : $" +SecInpMsg       db      "Sektorzahl (max. 255) : $" + +                endp + +;***************************************************************************** +;* Routine WriteGeoToDisk - schreibt Laufwerksgeometrie auf Platte           * +;* Eingabe:     AL = phys. Laufwerksnummer                                   * +;* Ausgabe:     C+AX = Fehlerstatus                                          * +;***************************************************************************** + +                proc    WriteGeoToDisk + +                push    bx              ; Register retten +                push    cx +                push    dx +                push    si +                push    di +                push    es + +                mov     dx,ds           ; alles im folgenden im Datensegment +                mov     es,dx + +                mov     dl,al           ; Laufwerksnummer retten +                mov     ah,0            ; Kopf 0, +                sub     bx,bx           ; Spur 0, +                mov     cx,0101h        ; Sektor 1 lesen +                lea     di,[SectorBuffer] +                call    ReadSectors +                jc      GeoError        ; Abbruch bei Fehler + +                mov     al,dl           ; Geometrietabelle adressieren +                call    GetPTabAdr +                mov     si,di           ; selbige in MBR einschreiben +                lea     di,[SectorBuffer+DrPar_Offset] +                mov     cx,DrPar_Len/2 +                cld +                rep     movsw + +                mov     al,dl           ; jetzt den ganzen Kram zurckschreiben +                mov     ah,0 +                sub     bx,bx +                mov     cx,0101h +                lea     si,[SectorBuffer] +                call    WriteSectors +                jc      GeoError + +Fin:            pop     es              ; Register zurck +                pop     di +                pop     si +                pop     dx +                pop     cx +                pop     bx +                ret + +GeoError:       mov     ah,bl           ; Fehlerausgabe +                call    WrErrorCode +                jmp     Fin + +                endp + +;***************************************************************************** +;* Routine QueryParams                                                       * +;* Eingabe:     AL = Laufwerksnummer                                         * +;*              AH = 1, falls Rckschreiben erlaubt                          * +;* Ausgabe:     AL = 0: Laufwerk vergessen                                   * +;*              AL = 1: Mastersektor neu lesen                               * +;*              AL = 2: Tabelle nur transient eingetragen, kein Neulesen     * +;***************************************************************************** + +                globproc QueryParams + +                push    bx              ; Register retten +                push    cx +                push    dx +                push    si +                push    di +                push    es + +                mov     bx,ax           ; Laufwerksnummer retten +                call    QueryRedefine   ; nachfragen, ob Neudefinition erwnscht +                mov     al,0            ; Abbruch bei Nein +                ljc     Terminate + +                mov     al,bl           ; Geometrie einlesen +                call    ReadGeometry + +                shr     bh,1            ; Rckschreiben erlaubt ? +                cmc                     ; C=1-->verboten +                jc      NoWriteBack + +                PrMsg   WriteBackMsg    ; nachfragen, ob Rckschreiben erwnscht +                call    YesNo +NoWriteBack:    mov     al,2            ; Neulesen bei Nein verhindern +                jc      Terminate + +                mov     al,bl +                call    WriteGeoToDisk +                jc      WrError + +                mov     al,1            ; Ergebnis: MBR-Lesen wiederholen +                jmp     Terminate +WrError:        mov     al,0            ; Schreibfehler: Laufwerk ignorieren + +Terminate:      pop     es              ; Register zurck +                pop     di +                pop     si +                pop     dx +                pop     cx +                pop     bx + +                ret + +WriteBackMsg    db      "Parametersatz zurckschreiben ? $" + +                endp + +;**************************************************************************** +;* Laufwerksnummer einlesen                                                 * +;* Ausgabe:     AL = Laufwerksnummer                                        * +;**************************************************************************** + +                proc    InputDrive + +                push    dx              ; Register retten + +RdLoop:         PrMsg   PromptMsg       ; Anfrage ausgeben +                mov     ah,DOS_RdChar   ; ein Zeichen holen +                int     INT_DOS +                mov     dl,al           ; Zeichen retten +                PrChar  dl              ; Laufwerk als Echo zurckgeben +                PrChar  CR +                PrChar  LF +                sub     dl,'1'          ; nur 1 oder 2 erlaubt +                jc      RdLoop +                cmp     dl,MaxPDrives +                jae     RdLoop +                mov     al,dl           ; Laufwerk in AL zurckgeben + +                pop     dx              ; Register zurck +                ret + +PromptMsg       db      "Laufwerksnummer (1 oder 2) : $" + +                endp + +;**************************************************************************** +;* Men fr Plattenfunktionen                                               * +;**************************************************************************** + +                proc    SelectDisk + +                push    ax              ; Register sichern +                push    bx +                push    cx +                push    dx +                push    si +                push    di +                push    es + +                mov     dh,ah           ; Rckschreibeflag sichern +                call    InputDrive +                mov     dl,al           ; Laufwerksnummer sichern + +                mov     al,dl           ; Geometrie noch undefiniert ? +                call    GeometryDefined +                jnc     IsOK            ; Nein, alles in Butter + +                mov     al,dl           ; nicht definiert: versuchen, +                mov     ah,0            ; Geometrie vom MBR zu lesen +                mov     bx,ds +                mov     es,bx +                sub     bx,bx +                mov     cx,0101h +                lea     di,[SectorBuffer] +                call    ReadSectors +                jnc     CopyTable       ; kein Fehler->Tabelle auslesen +                mov     dh,0            ; wenn Fehler, nie zurckschreiben +                jmp     ReadManual      ; und manuell probieren +CopyTable:      lea     si,[SectorBuffer+DrPar_Offset] +                mov     al,dl +                call    GetPTabAdr +                mov     cx,DrPar_Len/2 +                cld +                rep     movsw +                mov     al,dl           ; Geometrie jetzt da ? +                call    GeometryDefined +                jnc     IsOK            ; falls ja, Ende + +ReadManual:     mov     al,dl           ; fragen, ob Redefinition erwnscht +                call    QueryRedefine +                jc      NotOK           ; falls nein, Abbruch +                mov     al,dl           ; ansonsten einlesen +                call    ReadGeometry +                shr     dh,1            ; zurckschreiben ? +                jnc     IsOK +                mov     al,dl           ; ja... +                call    WriteGeoToDisk  ; Fehler ignorieren + +IsOK:           mov     [MomDrive],dl   ; Laufwerk akzeptiert + +NotOK:          pop     es              ; Register zurck +                pop     di +                pop     si +                pop     dx +                pop     cx +                pop     bx +                pop     ax + +                ret + +                endp + +;---------------------------------------------------------------------------- + +                proc    ChangeGeometry + +                cmp     [MomDrive],-1   ; Laufwerk berhaupt schon definiert ? +                jne     DriveDefined +                call    InputDrive      ; nein: lesen & einschreiben +                mov     [MomDrive],al +DriveDefined:   mov     al,[MomDrive]   ; neue Geometrie einlesen +                call    ReadGeometry +                mov     al,[MomDrive] +                call    WriteGeoToDisk  ; die auch gleich zu schreiben versuchen + +                ret + +                endp + +;---------------------------------------------------------------------------- + +                proc    VerifyDisk + +                pusha                   ; restlos alles... + +                mov     al,[MomDrive]   ; erstmal sicherstellen, daá der +                call    SetDriveParams  ; Kontroller die Geometrie kennt + +                mov     al,[MomDrive]   ; die Geometrie brauchen wir auch +                call    GetPTabAdr + +                PrMsg   ESCMsg +                sub     bp,bp           ; Fehlerz„hler +                mov     si,bp           ; Zylinderz„hler +                mov     dx,bp           ; Folgefehlerz„hler +CylLoop:        mov     dl,0            ; Kopfz„hler +HeadLoop:       PrMsg   CylMsg          ; zu testende Spur ausgeben +                mov     ax,si +                mov     cl,4 +                call    WriteDec +                PrMsg   HeadMsg +                mov     al,dl +                mov     ah,0 +                mov     cl,2 +                call    WriteDec +                PrChar  CR + +                mov     al,[MomDrive]   ; eine Spur testen +                mov     ah,dl +                mov     bx,si +                mov     cl,[di+DrPar_NSecs] +                mov     ch,1 +                call    VeriSectors + +                jnc     NoError         ; evtl. Fehlerbehandlung +                push    ax +                PrChar  LF +                pop     ax +                mov     ah,[MomDrive] +                call    WrErrorCode +                inc     bp              ; Fehlerz„hler rauf +                inc     dh +                test    dh,7            ; alle 8 Fehler in Reihe nachfragen +                jnz     NextTrack +                PrMsg   GoOnMsg +                call    YesNo +                jc      Terminate +                jmp     NextTrack +NoError:        mov     dh,0            ; eine Spur gut->Folgenz„hler l”schen +NextTrack:      call    BreakONESC      ; Abbruch ? +                jc      Terminate +                inc     dl              ; n„chster Kopf +                cmp     dl,[di+DrPar_Heads] +                jb      HeadLoop +                inc     si              ; n„chster Zylinder +                cmp     si,[di+DrPar_Cyls] +                ljb     CylLoop + +Terminate:      mov     ax,bp           ; Fehlerzahl ausgeben +                mov     cl,5 +                call    WriteDec +                PrMsg   ErrorMsg + +                popa                    ; Register zurck + +                ret + +EscMsg          db      "Verifizieren..",CR,LF,"Abbruch mit <ESC>",CR,LF,'$' +CylMsg          db      "Zylinder $" +HeadMsg         db      ", Kopf $" +GoOnMsg         db      "Test fortsetzen? $" +ErrorMsg:       db      " Fehler gefunden     ",CR,LF,'$' + +                endp + +;---------------------------------------------------------------------------- + +                proc    FormatDisk + +                push    ax              ; Register retten +                push    bx +                push    cx +                push    di +                push    es + +                mov     al,[MomDrive]   ; erstmal sicherstellen, daá der +                call    SetDriveParams  ; Kontroller die Geometrie kennt + +                mov     al,[MomDrive] +                call    GetPTabAdr +InterLoop:      mov     al,[di+DrPar_NSecs] ; Maximum=Sektorzahl-1 +                dec     al +                mov     ah,0 +                lea     di,[InterleaveMsg] ; Interleave erfragen +                call    ReadNumber +                or      ax,ax           ; Null wollen wir nicht +                jz      InterLoop +                mov     bl,al           ; Interleave retten +                PrMsg   ConfirmMsg      ; sicherheitshalber nachfragen +                call    YesNo +                jc      Fin +                PrMsg   NewLine +                PrMsg   FormatMsg +                mov     ah,bl           ; Interleave zurck +                mov     al,[MomDrive] +                call    FormatUnit +                jc      FormatError     ; Fehler beim Formatieren ? + +NoFormatError:  PrMsg   WriteMsg +                lea     di,[SectorBuffer] ; MBR erzeugen +                cld +                mov     cx,SecSize/2-1  ; letztes Wort anders! +                mov     ax,ds +                mov     es,ax +                sub     ax,ax           ; prinzipiell erstmal alles Nullen +                rep     stosw +                mov     word ptr[di],0aa55h ; Gltigkeitsflag am Ende +                mov     al,[MomDrive]   ; Geometrietabelle eintragen +                call    GetPTabAdr +                mov     si,di +                lea     di,[SectorBuffer+DrPar_Offset] +                mov     cx,DrPar_Len/2 +                rep     movsw +                mov     al,[MomDrive]   ; Sektor schreiben +                mov     ah,0            ; MBR auf Kopf 0, +                mov     bx,0            ; Spur 0, +                mov     cx,0101h        ; Sektor 1 +                lea     si,[SectorBuffer] +                call    WriteSectors +                jc      FormatError     ; Fehler beim Schreiben ? + +Fin:            pop     es              ; Register zurck +                pop     di +                pop     cx +                pop     bx +                pop     ax +                ret + +FormatError:    cmp     al,DErr_UserTerm ; Abbruch durch Benutzer ? +                je      Fin             ; dann nicht meckern +                push    ax              ; Fehlercode retten +                pushf +                PrMsg   NewLine +                popf +                pop     ax +                mov     ah,[MomDrive]   ; Fehlermeldung ausgeben +                call    WrErrorCode +                jmp     Fin + +FormatMsg        db     "Formatieren...",CR,LF,'$' +WriteMsg         db     "MBR schreiben...",CR,LF,'$' + +                endp + +;---------------------------------------------------------------------------- + +                proc    BadTrack + +                push    bx +                push    si +                push    di + +                mov     al,[MomDrive]   ; Zeiger auf Geometrietabelle +                call    GetPTabAdr      ; holen +                mov     si,di + +                lea     di,[TrackMsg]   ; Spurnummer abfragen +                mov     ax,[si+DrPar_Cyls] +                dec     ax +                call    ReadNumber +                mov     bx,ax +                lea     di,[HeadMsg]    ; Kopfnummer abfragen +                mov     ax,[si+DrPar_Heads] +                dec     ax +                call    ReadNumber +                mov     ah,al +                push    ax              ; sicherheitshalber noch best„tigen +                PrMsg   ConfirmMsg +                call    YesNo +                pop     ax +                jc      NoError +                mov     al,[MomDrive]   ; Spur markieren +                call    MarkBad       +                jnc     NoError +                push    ax              ; Fehlercode retten +                pushf +                PrMsg   NewLine +                popf +                pop     ax +                mov     ah,[MomDrive] +                call    WrErrorCode +NoError: +                pop     di +                pop     si +                pop     bx + +                ret + +                endp + +;---------------------------------------------------------------------------- + +                proc    FormTrack + +                push    bx +                push    si +                push    di + +                mov     al,[MomDrive]   ; Zeiger auf Geometrietabelle +                call    GetPTabAdr      ; holen +                mov     si,di + +                lea     di,[TrackMsg]   ; Spurnummer abfragen +                mov     ax,[si+DrPar_Cyls] +                dec     ax +                call    ReadNumber +                mov     bx,ax +                lea     di,[HeadMsg]    ; Kopfnummer abfragen +                mov     ax,[si+DrPar_Heads] +                dec     ax +                call    ReadNumber +                mov     ah,al +                push    ax              ; Kopf retten +InterLoop:      mov     al,[si+DrPar_NSecs] ; Interleave-Maximum=Sektorzahl-1 +                dec     al +                mov     ah,0 +                lea     di,[InterleaveMsg] ; Interleave erfragen +                call    ReadNumber +                or      ax,ax           ; Null wollen wir nicht +                jz      InterLoop +                mov     cl,al           ; Interleave passend ablegen +                PrMsg   ConfirmMsg      ; nochmal nachfragen +                call    YesNo +                pop     ax +                jc      NoError +                mov     al,[MomDrive]   ; Kopf zurck +                call    FormatTrack +                jnc     NoError +                push    ax              ; Fehlercode retten +                pushf +                PrMsg   NewLine +                popf +                pop     ax +                mov     ah,[MomDrive] +                call    WrErrorCode +NoError: +                pop     di +                pop     si +                pop     bx + +                ret + +                endp + +;---------------------------------------------------------------------------- + +; packt eine Sektorkoordinate ins BIOS-Format +; -->Zylinder=BX, Kopf=AH, Sektor=AL +; <--Zylinder/Sektor=BX, Kopf=AH + +                proc    PackCoordinate + +                shl     bh,6 +                or      bh,al +                xchg    bl,bh +                ret + +                endp + +                proc    UnpackCoordinate + +                xchg    bh,bl           ; Zylinderbytes in richtige Reihenfolge +                mov     al,bh           ; Sektor ausmaskieren +                and     al,00111111b +                shr     bh,6            ; Zylinder korrigieren + +                ret + +                endp + +; berechnet aus einer Sektorkoordinate die lineare Sektornummer +; -->Zylinder/Sektor=BX, Kopf=AH, Geometriezeiger=SI +; <--Sektornummer=DX/AX + +                proc    LinearizeCoordinate + +                push    bx +                push    cx + +                mov     cx,ax           ; Kopf retten +                mov     al,bh           ; Zylinder rekonstruieren +                mov     ah,bl +                shr     ah,6 +                mov     dl,[si+DrPar_Heads] +                mov     dh,0 +                mul     dx              ; = Anzahl Spuren bis Zylinderbeginn +                add     al,ch           ; Startkopf dazuaddieren +                adc     ah,0            ; bisher hoffentlich nur 16 Bit... +                mov     dl,[si+DrPar_NSecs] +                mov     dh,0 +                mul     dx              ; = Anzahl Spuren bis Spurbeginn +                and     bl,3fh          ; letztendlich Sektor-1 dazu +                dec     bl +                add     al,bl +                adc     ah,0 +                adc     dx,0 + +                pop     cx +                pop     bx + +                ret + +                endp + +                proc    MakePart + +                push    bx +                push    cx +                push    dx +                push    si +                push    di +                push    es + +                PrMsg   ConfirmMsg      ; sind wir sicher ? +                call    YesNo +                ljc     End + +                mov     al,[MomDrive]   ; Laufwerk rekalibrieren +                call    Recalibrate +                ljc     PartError + +                mov     al,[MomDrive]   ; alten MBR auslesen +                mov     ah,0 +                mov     bx,0 +                mov     cx,0101h +                mov     si,ds +                mov     es,si +                lea     di,[SectorBuffer] +                call    ReadSectors +                ljc     PartError + +                mov     al,[MomDrive]   ; Plattengeometrie holen +                call    GetPTabAdr +                mov     si,di + +                lea     di,[SectorBuffer+ParTab_Offset] ; an erste Tabelle schreiben +                mov     byte ptr [di+ParTab_BFlag],80h ; Partition aktiv +                cmp     byte ptr[si+DrPar_Heads],1 ; nur ein Kopf ? +                ja      MoreHeads +                mov     bx,1            ; ja: Start auf Zyl. 1, Kopf 0 +                mov     ah,0 +                jmp     WriteStart +MoreHeads:      sub     bx,bx           ; nein: Start auf Zyl. 0, Kopf 1 +                mov     ah,1 +WriteStart:     mov     al,01h          ; Startsektor immer 1 +                call    PackCoordinate +                mov     [di+ParTab_FHead],ah +                mov     [di+ParTab_FSecCyl],bx +                call    LinearizeCoordinate ; linearen Start schreiben +                mov     [di+ParTab_LinSec],ax +                mov     [di+ParTab_LinSec+2],dx +                push    dx +                push    ax +                mov     bx,[si+DrPar_Cyls] ; Ende: Zylinder n-2, Kopf n-1, Sektor n +                sub     bx,2 +                mov     ah,[si+DrPar_Heads] +                dec     ah +                mov     al,[si+DrPar_NSecs] +                call    PackCoordinate +                mov     [di+ParTab_LHead],ah +                mov     [di+ParTab_LSecCyl],bx +                call    LinearizeCoordinate ; Sektorzahl berechnen +                pop     bx              ; dazu Start abziehen +                sub     ax,bx +                pop     bx +                sbb     dx,bx +                add     ax,1            ; !!! L„nge=Stop-Start+1 +                adc     dx,0 +                mov     [di+ParTab_NSecs],ax +                mov     [di+ParTab_NSecs+2],dx +                or      dx,dx            ; falls >64K Sektoren, +                jz      NoBigDOS        ; eine BigDOS-Partition +                mov     bl,6 +                jmp     TypeFound +NoBigDOS:       cmp     ax,32679        ; ab 32680 Sektoren 16-Bit-FAT +                jb      NoFAT16 +                mov     bl,04 +                jmp     TypeFound +NoFAT16:        mov     bl,1            ; kleine 12-Bit-Partition +TypeFound:      mov     [di+ParTab_Type],bl +                add     di,ParTab_Len   ; die anderen 3 Partitionen l”schen +                mov     cx,3*(ParTab_Len/2) +                sub     ax,ax +                cld +                rep     stosw + +                mov     al,[MomDrive]   ; neuen MBR schreiben +                mov     ah,0 +                mov     bx,0 +                mov     cx,0101h +                lea     si,[SectorBuffer] +                call    WriteSectors +                ljc     PartError + +End:            pop     es +                pop     di +                pop     si +                pop     dx +                pop     cx +                pop     bx + +                ret + +PartError:      push    ax              ; Fehlercode retten +                pushf +                PrMsg   NewLine +                popf +                pop     ax +                mov     ah,[MomDrive]   ; Fehlermeldung ausgeben +                call    WrErrorCode +                jmp     End + +ConfirmMsg:     db      "ACHTUNG! Alle bisherigen Partitionen auf der",CR,LF +                db      "Festplatte werden gel”scht! Fortfahren? $" + +                endp + +;---------------------------------------------------------------------------- + +                proc    FormatPart + +                pusha + +                mov     ax,ds           ; wir arbeiten nur im Datensegment +                mov     es,ax + +                PrMsg   ConfirmMsg      ; vorher nachfragen +                call    YesNo +                ljc     Ende + +                mov     al,[MomDrive]   ; Laufwerk rekalibrieren +                call    Recalibrate +                ljc     LFormError + +; Schritt 1: MBR lesen + +                mov     al,[MomDrive]   ; MBR auslesen, um Partitions- +                mov     ah,0            ; daten zu bekommen +                mov     bx,0 +                mov     cx,0101h +                lea     di,[SectorBuffer] +                call    ReadSectors +                ljc     LFormError + +; Schritt 2: Partitionsdaten in BPB kopieren + +                lea     di,[SectorBuffer+ParTab_Offset] ; auf Partitionsdaten +                mov     al,[di+ParTab_Type] ; muá prim„re Partition sein +                cmp     al,1            ; DOS 2.x FAT12? +                je      ParTypeOK +                cmp     al,4            ; DOS 3.x FAT16? +                je      ParTypeOK +                cmp     al,6            ; DOS 4.x BIGDOS? +                je      ParTypeOK +                PrMsg   InvParTypeMsg   ; nichts dergleichen: Abbruch +                jmp     Ende +ParTypeOK:      mov     word ptr[BPB_SysID],'AF' ; FAT-Kennung in BPB eintragen +                mov     word ptr[BPB_SysID+2],'1T' ; FAT12/FAT16 +                mov     word ptr[BPB_SysID+5],'  ' +                mov     ah,'2'          ; Annahme FAT12 +                cmp     al,1 +                je      ParIsFAT12      ; wenn Typ=1, OK +                mov     ah,'6'          ; ansonsten FAT16 +ParIsFAT12:     mov     byte ptr[BPB_SysID+4],ah +                mov     ax,[di+ParTab_NSecs] ; Sektorzahl in BPB schreiben +                mov     dx,[di+ParTab_NSecs+2] +                mov     word ptr[BPB_NumSecs32],ax +                mov     word ptr[BPB_NumSecs32+2],dx +                or      dx,dx           ; falls < 64K Sektoren, +                jz      ParIsNotBig     ; Gr”áe auch unten eintragen, +                sub     ax,ax           ; ansonsten 0 +ParIsNotBig:    mov     [BPB_NumSecs16],ax +                mov     ax,word ptr[di+ParTab_LinSec] ; Startsektor umkopieren +                mov     dx,word ptr[di+ParTab_LinSec+2] +                mov     word ptr[BPB_LinStart],ax +                mov     word ptr[BPB_LinStart+2],dx + +; Schritt 3: Partitionsdaten in Partitionstabelle kopieren, damit wir die +; linearen Schreib/Lesefunktionen nutzen k”nnen + +                mov     [DrCnt],1       ; nur ein Laufwerk belegt +                mov     ah,[di+ParTab_FHead] ; Startkoordinate ablegen +                mov     bx,[di+ParTab_FSecCyl] +                call    UnpackCoordinate +                mov     [DrTab+DrTab_StartHead],ah +                mov     word ptr [DrTab+DrTab_StartCyl],bx +                mov     [DrTab+DrTab_StartSec],al +                mov     ax,[di+ParTab_LinSec] +                mov     word ptr [DrTab+DrTab_LinStart],ax +                mov     ax,[di+ParTab_LinSec+2] +                mov     word ptr [DrTab+DrTab_LinStart+2],ax +                mov     ax,[di+ParTab_NSecs] +                mov     word ptr [DrTab+DrTab_SecCnt],ax +                mov     ax,[di+ParTab_NSecs+2] +                mov     word ptr [DrTab+DrTab_SecCnt+2],ax +                mov     al,[MomDrive]   ; Laufwerk einschreiben +                mov     [DrTab+DrTab_Drive],al +                mov     byte ptr[DrTab+DrTab_BPB],0 ; kein BPB + +; Schritt 4: konstante Felder in BPB eintragen + +                mov     [BPB_SecSize],SecSize ; Sektorgr”áe konstant 512 Byte +                mov     [BPB_ResvdSecs],1 ; nur Bootsektor reserviert +                mov     [BPB_NumFATs],2 ; 2 FATs ist DOS-Standard +                mov     [BPB_MediaID],0f8h ; Media-Byte fr Platten konstant +                mov     al,[MomDrive] +                call    GetPTabAdr +                mov     ah,0 +                mov     al,[di+DrPar_NSecs]; Plattenzylinder und -k”pfe +                mov     [BPB_SecsPerTrk],ax +                mov     al,[di+DrPar_Heads] +                mov     [BPB_Heads],ax +                mov     al,[MomDrive]   ; Plattennummer+80h +                add     al,80h +                mov     [BPB_PhysNo],ax +                mov     [BPB_ExtID],29h ; Erkennung, daá erw. BPB gltig +                mov     ah,0            ; Seriennummer=Uhrzeit +                int     INT_Clock +                mov     word ptr[BPB_SerialNo],cx +                mov     word ptr[BPB_SerialNo+2],dx +                lea     di,[BPB_Name]   ; Name ist leer +                mov     cx,11 +                mov     al,' ' +                cld +                rep     stosb + +; Schritt 5: einige Sachen vom Anwender erfragen + +DirEntLoop:     mov     ax,1024         ; mehr ist wohl kaum sinnvoll +                lea     di,[DirEntriesMsg] +                call    ReadNumber +                cmp     ax,SecSize/32   ; weniger als ein Sektor ergibt +                jb      DirEntLoop      ; keinen Sinn +                mov     [BPB_DirLen],ax ; Anzahl in BPB eintragen +                mov     dx,0            ; Directory-Sektorzahl berechnen +                mov     bx,SecSize/32 +                div     bx +                or      dx,dx           ; ggfs. aufrunden +                jz      DirLenEven +                inc     ax +DirLenEven:     mov     [DirLen],ax + +; Schritt 6: Clusterl„nge berechnen + +                mov     ax,word ptr[BPB_NumSecs32]  ; # Sektoren in Datenfeld +                mov     dx,word ptr[BPB_NumSecs32+2] ; und FATs berechnen +                sub     ax,[BPB_ResvdSecs] +                sbb     dx,0 +                sub     ax,[DirLen] +                sbb     dx,0 +                mov     bl,1 ; Annahme: m”glichst wenig Sektoren pro Cluster +ClusterLoop:    or      dx,dx           ; wenn noch mehr als 64K Cluster, +                jnz     ClusterNxtLoop  ; auf jeden Fall zu groá +                cmp     ax,4080         ; bei weniger als 4K Clustern +                jb      ClusterEndLoop  ; auf jeden Fall OK +                cmp     [BPB_SysID+4],'2' ; sonst bei FAT12 +                je      ClusterNxtLoop  ; auf jeden Fall zu viel +                cmp     ax,65510        ; bei FAT16 Vergleich auf 64K +                jb      ClusterEndLoop +ClusterNxtLoop: shl     bl,1            ; zu viel: Cluster verdoppeln +                js      ClusterEndLoop  ; bei 128 Sektoren/Cluster abbrechen +                shr     dx,1            ; Clusterzahl halbiert sich +                rcr     ax,1 +                jmp     ClusterLoop +ClusterEndLoop: mov     [BPB_SecsPerClust],bl ; Ergebnis einschreiben +                add     ax,2            ; Dummy-Eintr„ge in FAT +                adc     dx,0 +                mov     bx,341          ; Anzahl FAT-Sektoren berechnen +                cmp     [BPB_SysID+4],'2' +                jz      Cluster12 +                mov     bx,256 +Cluster12:      div     bx +                or      dx,dx           ; Sektorzahl aufrunden +                jz      FATLenEven +                inc     ax +FATLenEven:     mov     [BPB_SecsPerFAT],ax ; Anzahl FAT-Sektoren einschreiben + +; Schritt 7: Bootsektor aufbauen + +                PrMsg   WrBootSectMsg +                lea     di,[SectorBuffer] +                cld +                mov     al,0ebh         ; Dummy-Sprung einschreiben +                stosb +                mov     al,0feh +                stosb +                mov     al,90h +                stosb +                mov     ax,'ES'         ; OEM-ID einschreiben +                stosw +                mov     ax,'DC' +                stosw +                mov     ax,'IR' +                stosw +                mov     ax,'EV' +                stosw +                lea     si,[BPBBuffer]  ; BPB einschreiben +                mov     cx,BPB_Length +                rep     movsb +                mov     cx,SectorBuffer+SecSize ; Rest vom Bootsektor nullen +                sub     cx,di +                mov     al,0 +                rep     stosb +                mov     ax,0            ; Bootsektor ist log. Sektor 0 +                mov     dx,ax +                mov     bl,0            ; Partition 0 +                call    TranslateParams +                mov     cl,1            ; nur ein Sektor +                lea     si,[SectorBuffer] +                call    WriteSectors +                ljc     LFormError + +; Schritt 8: Directory & FATs ausnullen + +                lea     di,[SectorBuffer] ; Sektorpuffer wird benutzt +                mov     cx,SecSize/2 +                cld +                sub     ax,ax +                rep     stosw +                PrMsg   WrFATMsg +                mov     ax,[BPB_ResvdSecs] ; Startsektor FATs holen +                sub     dx,dx +                lea     si,[SectorBuffer] +                mov     cx,[BPB_SecsPerFAT] +                add     cx,cx           ; beide FATs nullen +FATZeroLoop:    push    ax              ; Sektornummer und -zahl retten +                push    cx +                push    dx +                mov     bl,0 +                call    TranslateParams +                mov     cl,1 +                call    WriteSectors +                pop     dx +                pop     cx +                pop     ax +                ljc     LFormError +                add     ax,1            ; n„chster Sektor +                adc     dx,0 +                loop    FATZeroLoop +                push    ax              ; !!! PrMsg zerst”rt AX-Register +                PrMsg   WrDirMsg +                pop     ax +                mov     cx,[DirLen]     ; dito fr Directory +DirZeroLoop:    push    ax               +                push    cx +                push    dx +                mov     bl,0 +                call    TranslateParams +                mov     cl,1 +                call    WriteSectors +                pop     dx +                pop     cx +                pop     ax +                ljc     LFormError +                add     ax,1            ; n„chster Sektor +                adc     dx,0 +                loop    DirZeroLoop + +; Schritt 9: Sektoren testen und FAT initialisieren + +                mov     ax,[BPB_ResvdSecs] ; Datensektorbeginn berechnen +                sub     dx,dx +                mov     [FAT1Pos],ax    ; Beginn 1. FAT hinter Bootsektor +                mov     [FAT1Pos+2],dx +                add     ax,[BPB_SecsPerFAT] ; Beginn 2. FAT hinter 1. FAT +                adc     dx,0 +                mov     [FAT2Pos],ax +                mov     [FAT2Pos+2],dx +                add     ax,[BPB_SecsPerFAT] +                adc     dx,0 +                add     ax,[DirLen]     ; Datenbeginn hinter Directory +                adc     dx,0 +                mov     [DataPos],ax    ; diesen Startsektor retten +                mov     [DataPos+2],dx + +                mov     ax,word ptr[BPB_NumSecs32] ; Anzahl Cluster berechnen +                mov     dx,word ptr[BPB_NumSecs32+2] +                sub     ax,[DataPos] +                sbb     dx,[DataPos+2] +                mov     bl,[BPB_SecsPerClust]      ; / SecsPerCluster +                mov     bh,0 +                div     bx +                mov     [ClusterCnt],ax + +                call    ClearFATBuffer  ; erste Elemente in FAT schreiben +                mov     ah,0ffh +                mov     al,[BPB_MediaID] +                call    WriteFAT +                mov     al,0ffh +                call    WriteFAT +                PrMsg   ESCMsg +                mov     ax,[DataPos]    ; Schleifenvorbereitung +                mov     dx,[DataPos+2] +                mov     cx,[ClusterCnt] +VerifyLoop:     push    ax              ; Z„hler retten +                mov     bp,cx +                push    dx +                mov     bl,0            ; immer Laufwerk 0 +                call    TranslateParams ; Cluster testlesen +                mov     cl,[BPB_SecsPerClust] +                test    bp,15           ; nur alle 16 Cluster schreiben +                jnz     NoWriteVeri +                push    ax              ; Clusternummer ausgeben +                push    cx +                PrMsg   ClusterMsg +                mov     ax,[ClusterCnt] +                sub     ax,bp +                add     ax,2            ; erster Datencluster hat Nummer 2 +                mov     cl,5 +                call    WriteDec +                PrChar  CR +                pop     cx +                pop     ax +NoWriteVeri:    call    VeriSectors +                mov     ax,0            ; Annahme OK (SUB wrde C l”schen...) +                jnc     Verify_OK +                mov     ax,0fff7h +Verify_OK:      call    WriteFAT +                pop     dx              ; Z„hler zurck +                mov     cx,bp +                pop     ax +                add     al,[BPB_SecsPerClust] +                adc     ah,0 +                adc     dx,0 +                call    BreakOnESC      ; Abbruch durch Benutzer ? +                jc      Ende +                loop    VerifyLoop +                cmp     [FATBufferFill],0 ; Puffer rausschreiben +                je      NoFATFlush +                call    FlushFATBuffer +NoFATFlush: + +Ende:           PrMsg   NewLine +                mov     [DrCnt],0       ; sonst kommt jemand ins Schleudern... +                popa +                ret + +LFormError:     push    ax              ; Fehlercode retten +                pushf +                PrMsg   NewLine +                popf +                pop     ax +                mov     ah,[MomDrive]   ; Fehlermeldung ausgeben +                call    WrErrorCode +                jmp     Ende + +WriteFAT:       push    bx              ; einen FAT-Eintrag schreiben +                mov     bx,ax +                call    WriteFATNibble  ; Bit 0..3 schreiben +                mov     al,bl           ; Bit 4..7 schreiben +                shr     al,4 +                call    WriteFATNIbble +                mov     al,bh           ; Bit 8..11 schreiben +                call    WriteFATNibble +                cmp     [BPB_SysID+4],'2' ; evtl. Bit 12..15 schreiben +                je      WriteFAT12 +                mov     al,bh +                shr     al,4 +                call    WriteFATNibble +WriteFAT12:     pop     bx +                ret + +WriteFATNibble: push    bx +                and     al,15           ; Bit 0..3 ausmaskieren +                jz      SkipWriteNibble ; Nullen brauchen wir nicht schreiben +                mov     [MustFlushFAT],1 ; vermerken, daá Puffer nicht genullt ist +                mov     bx,[FATBufferFill]  ; Bit 1.. enthalten Adresse +                shr     bx,1 +                jnc     WriteFATLower   ; oben oder unten schreiben +                shl     al,4 +WriteFATLower:  or      FATBuffer[bx],al +SkipWriteNibble:inc     [FATBufferFill] +                cmp     [FATBufferFill],SecSize*2 ; Sektor voll ? +                jne     WriteFAT_NFlush +                call    FlushFATBuffer +WriteFAT_NFlush:pop     bx +                ret + +FlushFATBuffer: push    bx +                push    cx +                push    dx +                push    si +                cmp     [MustFlushFAT],0 ; nix zu tun ? +                je      SkipFlushDisk +                mov     ax,[FAT1Pos]    ; erste FAT schreiben +                mov     dx,[FAT1Pos+2] +                mov     bl,0 +                call    TranslateParams +                mov     cl,1 +                lea     si,[FATBuffer] +                call    WriteSectors +                mov     ax,[FAT2Pos]    ; zweite FAT schreiben +                mov     dx,[FAT2Pos+2] +                mov     bl,0 +                call    TranslateParams +                mov     cl,1 +                lea     si,[FATBuffer] +                call    WriteSectors +SkipFlushDisk:  call    ClearFATBuffer  ; Zeiger wieder auf 0 +                add     [FAT1Pos],1     ; FAT-Sektornummern weiterz„hlen +                adc     [FAT1Pos+2],0 +                add     [FAT2Pos],1 +                adc     [FAT2Pos+2],0 +                pop     si +                pop     dx +                pop     cx +                pop     bx +                ret + + +ClearFATBuffer: push    cx +                push    di +                cld +                lea     di,[FATBuffer] +                mov     cx,SecSize/2 +                sub     ax,ax +                rep     stosw +                pop     di +                pop     cx +                mov     [FATBufferFill],ax +                mov     [MustFlushFAT],al +                ret + +ConfirmMsg      db      "ACHTUNG! Alle Daten gehen verloren! Fortfahren? $" +InvParTypeMsg   db      CR,LF,"Partition 1 hat ungltigen Typ oder ist undefiniert!",CR,LF,'$' +DirEntriesMsg   db      "Anzahl Eintr„ge im Wurzelverzeichnis (16..1024) : $" +WrBootSectMsg   db      "Schreibe Boot-Sektor...",CR,LF,'$' +WrFATMsg        db      "Initialisiere FATs...",CR,LF,'$' +WrDirMsg        db      "Initialisiere Wurzelverzeichnis...",CR,LF,'$' +ESCMsg          db      "Abbruch mit <ESC>",CR,LF,'$' +ClusterMsg      db      "Teste Cluster $" + +DirLen          dw      ?               ; # Directory-Sektoren +ClusterCnt      dw      ? +FAT1Pos         dw      2 dup (?)       ; speichern Sektorz„hler w„hrend Test +FAT2Pos         dw      2 dup (?) +DataPos         dw      2 dup (?) + +BPBBuffer:                              ; Zwischenspeicher fr BPB +BPB_SecSize     dw      ?               ; Sektorgr”áe in Bytes +BPB_SecsPerClust db     ?               ; Sektoren pro Cluster +BPB_ResvdSecs   dw      ?               ; reservierte Sektoren (Bootsektor) +BPB_NumFATs     db      ?               ; Anzahl FATs +BPB_DirLen      dw      ?               ; Anzahl Eintr„ge im Directory +BPB_NumSecs16   dw      ?               ; Anzahl Sektoren, falls <32 MByte +BPB_MediaID     db      ?               ; Media-Erkennungsbyte +BPB_SecsPerFAT  dw      ?               ; Sektoren pro FAT +BPB_SecsPerTrk  dw      ?               ; Sektoren pro Spur +BPB_Heads       dw      ?               ; Anzahl K”pfe +BPB_LinStart    dd      ?               ; linearer Startsektor auf Laufwerk +BPB_NumSecs32   dd      ?               ; Anzahl Sektoren, falls >=32 MByte +BPB_PhysNo      dw      ?               ; physikalische Laufwerks-Nummer +BPB_ExtID       db      ?               ; Erkennung, daá es ein erweiterter Boot-Record ist +BPB_SerialNo    dd      ?               ; Seriennummer +BPB_Name        db      11 dup (?)      ; Name +BPB_SysID       db      7 dup (?)       ; Systemerkennung +BPB_Length      equ     $-BPBBuffer     ; L„nge BPB + +FATBuffer       db      SecSize dup (?) ; Puffer, um FATs aufzubauen +MustFlushFAT    db      ?               ; Flag, ob FAT-Puffer geschrieben werden muá +FATBufferFill   dw      ?               ; Anzahl Nibbles in FAT-Puffer + +                endp + +;---------------------------------------------------------------------------- + +                globproc DiskMenu + +                push    ax              ; Register retten +                push    cx +                push    di + +                mov     [spsave],sp     ; Stack umschalten +                mov     [sssave],ss +                mov     ax,cs +                mov     ss,ax +                lea     sp,[Stack] + +MenuLoop:       mov     al,[MomDrive]   ; Festplatten-Nr. in Kopfmeldung einschreiben +                add     al,'1' +                cmp     al,'0' +                jnz     DrivePresent    ; falls Laufwerk noch undefiniert, - ausgeben +                mov     al,'-' +DrivePresent:   mov     [MenuMsg_Drv],al +                PrMsg   MenuMsg +                mov     al,[MomDrive] +                cmp     al,-1           ; falls <>-1, Geometrie ausgeben +                je      NoDrivePresent +                call    GetPTabAdr      ; dazu Tabelle holen +                mov     ax,[di+DrPar_Cyls] +                mov     cl,5 +                call    WriteDec +                PrMsg   CylMsg +                mov     al,[di+DrPar_Heads] +                mov     ah,0 +                mov     cl,3 +                call    WriteDec +                PrMsg   HeadMsg +                mov     al,[di+DrPar_NSecs] +                mov     ah,0 +                mov     cl,3 +                call    WriteDec +                PrMsg   SecMsg +NoDrivePresent: +                PrMsg   MenuList +                mov     ah,DOS_RdChar +                int     INT_DOS +                push    ax +                PrChar  al +                PrMsg   TwoLines +                pop     ax + +                cmp     al,'0'          ; 0 = Men verlassen +                lje     MenuEnd + +                cmp     al,'1'          ; 1 = Platte wechseln +                jne     NoSelectDisk +                mov     ah,1            ; Rckschreiben erlaubt +                call    SelectDisk +                jmp     MenuLoop +NoSelectDisk: +                cmp     al,'2'          ; 2 = Geometrie wechseln +                jne     NoChangeGeometry +                call    ChangeGeometry +                jmp     MenuLoop +NoChangeGeometry: +                cmp     [MomDrive],-1   ; fr alles weitere muá Platte gesetzt sein +                jne     DiskIsSelected +                push    ax +                shl     ax,8            ; Annahme: Geometrie nicht zurckschreiben +                cmp     ah,'3' +                je      NoWriteBack +                inc     al              ; fr alles auáer low-level schon +NoWriteBack:    call    SelectDisk      ; implizit Laufwerk erfragen +                PrMsg   NewLine +                pop     ax +                cmp     [MomDrive],-1 +                lje     MenuLoop        ; wenn immer noch nicht gesetzt, Abbruch +DiskIsSelected: +                cmp     al,'3'          ; 3 = Platte low-leveln +                jne     NoFormatDisk +                call    FormatDisk +                jmp     MenuLoop +NoFormatDisk: +                cmp     al,'4'          ; 4 = Spur formatieren +                jne     NoFormTrack +                call    FormTrack +                jmp     MenuLoop +NoFormTrack: +                cmp     al,'5'          ; 5 = Platte prflesen +                jne     NoBadTrack +                call    BadTrack +                jmp     MenuLoop +NoBadTrack: +                cmp     al,'6'          ; 6 = Platte verifizieren +                jne     NoVerifyDisk +                call    VerifyDisk +                jmp     MenuLoop +NoVerifyDisk: +                cmp     al,'7'          ; 7 = Partition anlegen +                jne     NoMakePart +                call    MakePart +                jmp     MenuLoop +NoMakePart: +                cmp     al,'8'          ; 8 = Partition formatieren +                jne     NoFormatPart +                call    FormatPart +                jmp     MenuLoop +NoFormatPart:   PrChar  BEL             ; alle anderen Angaben anmeckern +                jmp     MenuLoop +MenuEnd:        mov     ss,[sssave]     ; Stack zurck +                mov     sp,[spsave] + +                pop     di +                pop     cx +                pop     ax              ; Register zurck + +                ret + +MenuMsg         db      CR,LF,"SECDRIVE Men      Platte:" +MenuMsg_Drv     db      '-',CR,LF,'$' +CylMsg          db      " Zylinder,$" +HeadMsg         db      " K”pfe,$" +SecMsg          db      " Sektoren",CR,LF,'$' +MenuList        db      CR,LF +                db      "1 = Platte wechseln",CR,LF +                db      "2 = Geometrie neu definieren",CR,LF +                db      "3 = Platte formatieren",CR,LF +                db      "4 = Spur formatieren",CR,LF +                db      "5 = Defekte Spuren markieren",CR,LF +                db      "6 = Platte verifizieren",CR,LF +                db      "7 = Partition erstellen",CR,LF +                db      "8 = Partition log. formatieren",CR,LF +                db      "------------------------",CR,LF +                db      "0 = Men verlassen",CR,LF,'$' +spsave          dw      ? +sssave          dw      ? + +                db      1024 dup (?)    ; Programmstack +Stack: + +                endp + +MomDrive        db      -1 +TwoLines:       db      CR,LF +NewLine:        db      CR,LF,'$' + +                endsection diff --git a/tests/t_secdrive/t_secdrive.asm b/tests/t_secdrive/t_secdrive.asm new file mode 100644 index 0000000..4fc82c9 --- /dev/null +++ b/tests/t_secdrive/t_secdrive.asm @@ -0,0 +1,1476 @@ +;****************************************************************************** +;*                                                                            * +;* SECDRIVE - Treiber fr einen 2. HD-Kontroller im PC                        * +;*                                                                            * +;* Historie:  12. 8.1993  Grundsteinlegung, Definitionen                      * +;*            16. 8.1993  Dispatcher                                          * +;*                        Basislesefunktionen                                 * +;*            17. 8.1993  Partitionsinformationen zusammenkratzen             * +;*            18. 8.1993  Laufwerksparameter initialisieren                   * +;*            19. 8.1993  Zylinder/Sektorregister setzen                      * +;*                        Partitiossektorbaum durchgehen                      * +;*            24. 8.1993  BPB aufbauen                                        * +;*            25. 8.1993  Parameterbersetzung				      * +;*                        Einlesen                                            * +;*                        Sektoren schreiben                                  * +;*            26. 8.1993  Fehlerbehandlung                                    * +;*                        Verify                                              * +;*                        1. Restore-Versuch mit Seek                         * +;*             7. 9.1993  Versuch Version 1.39 mit Proc's                     * +;*            28. 9.1993  etwas gekrzt                                       * +;*            27.12.1994  leichte Korrekturen im Restore                      * +;*            28.12.1994  Trennung Low-Level-Routinen begonnen                * +;*            19. 1.1995  Fehlermeldungen im Klartext                         * +;*                                                                            * +;****************************************************************************** + +;****************************************************************************** +;* globale Definitionen                                                       * +;****************************************************************************** + +; A C H T U N G : Mono.SYS muá fr Debugging geladen sein !!!! + +debug           equ     0 +debug2          equ     0 + +                include bitfuncs.inc + +                cpu     80186           ; WD 1003 fordert min. 80286 + +Diag_NoError    equ     01h             ; Selbstdiagnosecodes: kein Fehler +Diag_ContError  equ     02h             ; Controller-Fehler +Diag_SBufError  equ     03h             ; Sektorpuffer defekt +Diag_ECCError   equ     04h             ; Fehlerkorrektor defekt +Diag_ProcError  equ     05h             ; Steuerprozessor defekt +Diag_Timeout    equ     06h             ; Controller antwortet nicht + +ParTab		struct +BFlag		 db	?		; Partitionseintrag: Partition aktiv ? +FHead		 db	?		; Startkopf +FSecCyl		 dw	?		; Startzylinder/sektor +Type		 db	?		; Partitionstyp +LHead		 db	?		; Endkopf +LSecCyl  	 dw     ?		; Endzylinder/sektor +LinSec   	 dd     ?		; Anzahl Sektoren +NSecs    	 dd     ?		; linearer Startsektor +		endstruct + +DErr_WrProtect  equ     00h             ; Treiberfehlercodes: Schreibschutz +DErr_InvUnit    equ     01h             ; unbekannte Ger„tenummer +DErr_NotReady   equ     02h             ; Laufwerk nicht bereit +DErr_Unknown    equ     03h             ; Unbekannes Treiberkommando +DErr_CRCError   equ     04h             ; Prfsummenfehler +DErr_InvBlock   equ     05h             ; ungltiger Request-Header +DErr_TrkNotFnd  equ     06h             ; Spur nicht gefunden +DErr_InvMedia   equ     07h             ; Unbekanntes Tr„gerformat +DErr_SecNotFnd  equ     08h             ; Sektor nicht gefunden +DErr_PaperEnd   equ     09h             ; Papierende im Drucker +DErr_WrError    equ     0ah             ; allg. Schreibfehler +DErr_RdError    equ     0bh             ; allg. Schreibfehler +DErr_GenFail    equ     0ch             ; allg. Fehler +DErr_InvChange  equ     0fh             ; unerlaubter Diskettenwechsel + +DErr_UserTerm   equ     0ffh            ; Fehlercode Abbruch durch Benutzer + +SecSize         equ     512             ; Sektorgr”áe in Bytes +MaxPDrives      equ     2               ; Maximalzahl physikalischer Laufwerke +MaxDrives       equ     10              ; Maximalzahl verwaltbarer Laufwerke +MaxParts	equ	4		; Maximalzahl Partitionen in einem Sektor +MaxRetry        equ     2               ; max. 2 Lese/Schreibversuche +StackSize       equ     512             ; etwas mehr wg. Rekursion + +DrPar_Offset    equ     1aeh            ; Offset Parametertabelle im Part.-Sektor +ParTab_Offset	equ	1beh		; Offset Partitionstabelle "   "     " +ParSecID_Offset	equ	1feh		; Offset Partitionssektorflag (55aa) +BPBOfs          equ     11              ; Offset BPB im Bootsektor + +INT_DOS         equ     21h             ; DOS-Funktionsaufruf +INT_Mono        equ     60h             ; Haken zum VT100-Treiber +INT_Clock       equ     1ah             ; BIOS-Uhreneinstieg +INT_Keyboard    equ     16h             ; BIOS-Tastatureinstieg + +DOS_WrString    equ     9               ; DOS-Funktionen +DOS_WrChar      equ     6 +DOS_RdString    equ     10 +DOS_RdChar      equ     8 + +HD_ID           equ     0f8h            ; Media-ID fr Festplatten + +CR              equ     13 +LF              equ     10 +BEL             equ     7 +ESC             equ     27 + +;****************************************************************************** +; Makros                                                                      * +;****************************************************************************** + +;jmp             macro adr +;                !jmp long adr +;                endm + +beep            macro +                push    ax +                mov     ax,0e07h +                int     10h +                pop     ax +                endm + +PrMsg           macro   Adr             ; Meldung ausgeben +                push    dx              ; Register retten +                lea     dx,[Adr] +                mov     ah,DOS_WrString +                int     INT_DOS +                pop     dx              ; Register zurck +                endm + +PrChar          macro   Zeichen         ; Zeichen ausgeben +                push    dx              ; Register retten +                push    ax +                mov     dl,Zeichen +                mov     ah,DOS_WrChar +                int     INT_DOS +                pop     ax +                pop     dx              ; Register zurck +                endm + +;------------------------------------------------------------------------------ + +btst            macro   op,bit          ; ein einzelnes Bit testen +		test	op,(1<<bit) +		endm + +;------------------------------------------------------------------------------ + +ljnz            macro   adr             ; lange Sprnge +                jz      Next +                jmp     adr +Next: +                endm + +ljne            macro   adr +                je      Next +                jmp     adr +Next: +                endm + +ljc             macro   adr +                jnc     Next +                jmp     adr +Next: +                endm + +lje             macro   adr +                jne     Next +                jmp     adr +Next: +                endm + +ljz             macro   adr +                jnz     Next +                jmp     adr +Next: +                endm + +ljb             macro   adr +                jnb     Next +                jmp     adr +Next: +                endm + +;------------------------------------------------------------------------------ + +proc            macro   name +                section name +                public  name:parent +name            label   $ +                endm + +globproc        macro   name +                section name +                public  name +name            label   $ +                endm + +endp            macro +                endsection +                endm + +;------------------------------------------------------------------------------ +; Fehlermakro + +JmpOnError      macro   Drv,Adr +                jnc     GoOn            ; kein Fehler, weitermachen +                mov     ah,Drv +                call    WrErrorCode     ; Fehler-->ausgeben... +                jmp     Adr             ; ...Abbruch +GoOn: +                endm + +;****************************************************************************** +;* Treiberkopf                                                                * +;****************************************************************************** + +  +              assume  cs:code,ds:nothing,ss:nothing,es:nothing + +                org     0 + +DriverHead:     dd      -1              ; Zeiger auf Nachfolger +                dw      0000100000000010b ; Attribut +;                       ^   ^         ^ +;                       ³   ³         ÀÄ kann 32-Bit-Setornummern verarbeiten +;                       ³   ÀÄÄÄÄÄÄÄÄÄÄÄ kennt Close/Open/Removeable +;                       ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Blocktreiber +                dw      StrategyProc    ; Zeiger auf Strategieroutine +                dw      InterruptProc   ; Zeiger auf eigentlichen Treibercode +NrOfVols:       db      0               ; Zahl log. Laufwerke +                db      "SECDRIV"       ; bei Blocktreibern unbenutzt + +;****************************************************************************** +;* residente Daten                                                            * +;****************************************************************************** + +Rh_Ptr          dd      ?               ; Speicher fr Request-Header + +JmpTable        dw      Init            ; Sprungtabelle: Initialisierung +                dw      MediaCheck      ; Medium gewechselt ? +                dw      BuildBPB        ; Parameterblock laden +                dw      IOCTLRead       ; Steuerdaten vom Treiber +                dw      Read            ; Daten lesen +                dw      ND_Read         ; Lesen, ohne Pufferstatus zu „ndern +                dw      InputStatus     ; Daten im Eingabepuffer ? +                dw      InputFlush      ; Eingabepuffer l”schen +                dw      Write           ; Daten schreiben +                dw      Write_Verify    ; Daten mit Prflesen schreiben +                dw      OutputStat      ; Ausgabepuffer leer ? +                dw      OutputFlush     ; Ausgabepuffer l”schen +                dw      IOCTLWrite      ; Steuerdaten zum Treiber +                dw      DeviceOpen      ; DOS hat eine Datei darauf ge”ffnet +                dw      DeviceClose     ; DOS hat eine Datei darauf geschlossen +                dw      Removeable      ; Ist Datentr„ger wechselbar ? +                dw      OutputTillBusy  ; Ausgabe, bis Puffer voll +                dw      GenIOCTL        ; genormtes IOCTL +                dw      GetLogical      ; Laufwerkszuordnung lesen +                dw      SetLogical      ; Laufwerkszuordnung setzen +                dw      IOCTLQuery      ; Abfrage, ob GenIOCTL untersttzt + +SectorBuffer:   db      SecSize dup (?) ; Sektorpuffer fr Treiber selber + +                db      StackSize dup (?) ; Treiberstack +DriverStack: + +BPBSize         equ     36 +DrTab		struct			; Laufwerkstabelle: +StartHead	 db     ?		;  Startkopf +StartCyl	 dw	?		;  Startzylinder +StartSec	 db	?		;  Startsektor +LinStart	 dd	?		;  lin. Startsektor +SecCnt		 dd	?		;  Gesamtsektorzahl +Drive		 db	?		;  Laufwerk +BPB		 db	BPBSize dup (?)	;  BPB +		endstruct + +DrTab           db      DrTab_Len*MaxDrives dup (?) +DrTab_BPBs      dd      2*MaxDrives dup (?) +DrCnt           db      0               ; Anzahl gefundener Laufwerke +DrOfs           db      0               ; erster freier Laufwerksbuchstabe + +DrPar		struct			; Plattenparametersatz:  +Cyls		 dw	?		;  Zylinderzahl +Heads		 db	?		;  Kopfzahl +RedWr		 dw	?		;  Startzylinder reduzierter Schreibstrom +PrComp		 dw	?		;  Startzylinder Pr„kompensation +ECCLen		 db	?		;  max. korrigierbarer Fehlerburst (Bits) +CByte		 db	?		;  Wert frs Plattensteuerregister +TOut		 db	?		;  genereller Timeout +FTOut		 db	?		;  Timeout Formatierung +CTOut		 db	?		;  Timeout fr Prfung +LZone		 dw	?		;  Landezylinder +NSecs		 db	?		;  Sektorzahl +Dummy		 db	?		;  unbenutzt +		endstruct + +DrPars          db      DrPar_Len*MaxPDrives dup (0) + +;****************************************************************************** +;* Strategieroutine                                                           * +;****************************************************************************** + +StrategyProc:   mov     word ptr [Rh_Ptr],bx ; Zeiger speichern +                mov     word ptr [Rh_Ptr+2],es +                retf + +;****************************************************************************** +;* Treiberdispatcher                                                          * +;****************************************************************************** + +Rh		struct +Size		 db	?		; gemeinsame Headerteile: L„nge Block +Unit		 db	?		; angesprochenes Laufwerk +Func		 db	?		; Treibersubfunktion +Status		 dw	?		; Ergebnis +Resvd		 db	8 dup (?)	; unbenutzt +		endstruct + +InterruptProc:  pusha                   ; alle Register retten + +                cli                     ; Stack umschalten +                mov     si,ss           ; alten zwischenspeichern +                mov     di,sp +                mov     ax,cs           ; neuen setzen +                mov     ss,ax +                lea     sp,[DriverStack] +                push    di              ; alten auf neuem (!) speichern +                push    si +                sti + +                mov     ax,cs           ; DS auf Treibersegment +                mov     ds,ax +                assume  ds:code + +                les     bx,[Rh_Ptr]     ; Zeiger laden +                mov     word ptr es:[bx+Rh_Status],0 ; Status l”schen + +                mov     al,es:[bx+Rh_Func] ; Subfunktion ausrechnen +                if      debug +                 call   PrByte +                endif +                mov     ah,0 +                add     ax,ax +                mov     si,ax +                jmp     JmpTable[si] + +                jmp     Init + +;****************************************************************************** +;* gemeinsames Ende                                                           * +;****************************************************************************** + +StateError:     btst    al,1            ; Bit 1: Spur 0 nicht gefunden +                jz      StateError_N1 +                mov     al,DErr_TrkNotFnd +                jmp     StateError_End +StateError_N1:  btst    al,2            ; Bit 2: abgebrochenes Kommando +                jz      StateError_N2 +                btst    ah,5            ; Bit S5: Schreibfehler +                jz      StateError_N21 +                mov     al,DErr_WrError +                jmp     StateError_End +StateError_N21: btst    ah,4            ; Bit S4: Positionierung nicht vollst„ndig +                jnz     StateError_N22 +                mov     al,DErr_TrkNotFnd +                jmp     StateError_End +StateError_N22: btst    ah,6            ; Bit S6: Laufwerk nicht bereit +                jnz     StateError_N23 +                mov     al,DErr_NotReady +                jmp     StateError_End +StateError_N23: mov     al,DErr_GenFail ; Notnagel 1 +                jmp     StateError_End +StateError_N2:  test    al,11h          ; Bit 0/4: Sektor nicht gefunden +                jz      StateError_N3 +                mov     al,DErr_SecNotFnd +                jmp     StateError_End +StateError_N3:  btst    al,6            ; Bit 6: Prfsummenfehler +                jz      StateError_N4 +                mov     al,DErr_CRCError +                jmp     StateError_End +StateError_N4:  mov     al,DErr_GenFail ; Notnagel 2 +StateError_End: les     bx,[Rh_Ptr]     ; Code einspeichern +                mov     es:[bx+Rh_Status],al +                jmp     Error + +Unknown:        les     bx,[Rh_Ptr] +                mov     byte ptr es:[bx+Rh_Status],DErr_Unknown ; unbek. Funktion + +Error:          or      byte ptr es:[bx+Rh_Status+1],80h ; Fehler-Flag setzen +                jmp     Done + +Busy:           les     bx,[Rh_Ptr] +                or      byte ptr es:[bx+Rh_Status+1],2  ; Busy-Flag setzen + +Done:           les     bx,[Rh_Ptr] +                or      byte ptr es:[bx+Rh_Status+1],1  ; Done-Flag setzen + +                if      debug +                 call   NxtLine +                endif + +                cli                     ; Stack zurckschalten +                pop     si +                pop     di              ; alten in SI:DI laden +                mov     sp,di           ; einschreiben +                mov     ss,si +                sti + +                popa                    ; Register zurck +                retf + +;****************************************************************************** +;* Debugginghilfe                                                             * +;****************************************************************************** + +                if      debug||debug2 + +HexTab          db      "0123456789ABCDEF" + +PrByte:         push    es              ; Register retten +                push    di +                push    bx +                push    ax + +                lea     bx,[HexTab] + + +                db      0d4h,10h        ; AAM 16 +                push    ax +                mov     al,ah +                xlat +                mov     ah,0eh +                int     10h +                pop     ax +                xlat +                mov     ah,0eh +                int     10h + +                pop     ax              ; Register zurck +                pop     bx +                pop     di +                pop     es +                ret + +PrWord:         xchg    ah,al           ; Hi-Byte +                call    PrByte +                xchg    ah,al +                call    PrByte +                ret + +PrChar:         push    ax +                mov     ah,0eh +                int     10h +                pop     ax +                ret + +NxtLine:        push    ax              ; Register retten +                push    bx +                push    dx + +                mov     ax,0e0dh +                int     10h +                mov     ax,0e0ah +                int     10h + +                pop     dx              ; Register zurck +                pop     bx +                pop     ax + +                endif + +;****************************************************************************** +;* residente Subfunktionen                                                    * +;****************************************************************************** + +;****************************************************************************** +;* eine logische Laufwerksnummer berprfen                                   * +;*              In  :   AL = Laufwerk                                         * +;*              Out :   C  = 1, falls Fehler                                  * +;****************************************************************************** + +                proc    ChkDrive + +                cmp     al,[DrCnt]      ; C=1, falls < (d.h. OK) +                cmc                     ; Deshalb noch einmal drehen +                jnc     OK              ; C=0, alles in Butter +                les     bx,[Rh_Ptr]     ; ansonsten Fehlerstatus setzen +                mov     byte ptr es:[bx+Rh_Status],DErr_InvUnit +OK:             ret + +                endp + +;****************************************************************************** +;* Adresse der phys. Laufwerkstabelle errechnen                               * +;*              In  :   AL = Laufwerk                                         * +;*              Out :   DI = Adresse                                          * +;****************************************************************************** + +                proc    GetPTabAdr + +                mov     ah,DrPar_Len	; relative Adresse berechnen +                mul     ah +                lea     di,[DrPars]     ; Offset dazu +                add     di,ax +                ret + +                endp + +;****************************************************************************** +;* Adresse eines Partitionsdeskriptors errechnen                              * +;*              In  :   AL = log. Laufwerk                                    * +;*              Out :   DI = Adresse                                          * +;****************************************************************************** + +                proc    GetTabAdr + +                mov     ah,DrTab_Len    ; relative Adresse berechnen +                mul     ah +                lea     di,[DrTab]      ; Offset dazu +                add     di,ax +                ret + +                endp + +;****************************************************************************** +;* logische Parameter in physikalische bersetzen                             * +;*              In  :   BL = log. Laufwerk                                    * +;*                      DX:AX = relative Sektornummer			      * +;*              Out :   AL = phys. Laufwerk                                   * +;*                      AH = Kopf                                             * +;*                      BX = Zylinder                                         * +;*                      CH = Sektor                                           *  +;****************************************************************************** + +                proc    TranslateParams + +                push    di              ; Register retten + +		xchg	bx,ax		; Adresse Parametertabelle holen +		call	GetTabAdr	 + +		add	bx,[di+DrTab_LinStart]   ; in absolute Sektornummer +		adc	dx,[di+DrTab_LinStart+2] ; umrechnen +		mov	al,[di+DrTab_Drive]      ; phys. Laufwerksnummer holen +		push	ax		; bis zum Ende retten +		 +		call	GetPTabAdr	; von dieser phys. Platte die Tabelle holen +		mov	ax,bx		; Sektor# wieder nach DX:AX +		mov	bl,[di+DrPar_NSecs] ; Sektorzahl auf 16 Bit +		mov	bh,0		; aufblasen +		div	bx +		mov	ch,dl		; Modulo-Rest ist Sektornummer auf +		inc	ch		; Spur: Vorsicht, Numerierung ab 1 !!! +		sub	dx,dx		; wieder auf 32 Bit erweitern +		mov	bl,[di+DrPar_Heads] ; Kopfnummer herausfummeln +		div	bx +		mov	bx,ax		; Quotient ist Zylinder +		pop	ax		; Laufwerk zurck +		mov	ah,dl		; Rest ist Kopf + +		pop	di		; Register zurck +		ret + +                endp + +;****************************************************************************** +;* Einbindung Low-Level-Routinen                                              * +;****************************************************************************** + +; definiert werden mssen: + +; LowLevelIdent:  Meldung ber untersttzte Hardware ausgeben +; ContDiag:       Kontroller-Selbsttest durchfhren +;                 Ergebniskode in AL +; Recalibrate:    Laufwerk [AL] auf Zylinder 0 fahren +;                 Fehlerflag in C, Fehlerkode in AX +; SetDriveParams: dem Kontroller die Geometrie fr Laufwerk [AL] einbleuen +;                 Fehlerflag in C +; ReadSectors:    von Laufwerk [AL] ab Zylinder [BX], Kopf [AH], Sektor [CH] +;                 [CL] Sektoren in Puffer ab ES:DI lesen +;                 Fehlerflag in C, Fehlerkode in AX +; WriteSectors:   auf Laufwerk [AL] ab Zylinder [BX], Kopf [AH], Sektor [CH] +;                 [CL] Sektoren von Puffer ab ES:SI schreiben +;                 Fehlerflag in C, Fehlerkode in AX +; VeriSectors:    auf Laufwerk [AL] ab Zylinder [BX], Kopf [AH], Sektor [CH] +;                 [CL] Sektoren verifizieren +;                 Fehlerflag in C, Fehlerkode in AX +; FormatUnit:     Laufwerk [AL] mit Interleave [AH] formatieren, Fehlerkode +;                 in AX +; FormatTrack:    Zylinder [BX], Kopf [AH] auf Laufwerk [AL] mit Interleave +;                 [CL] formatieren, Fehlerkode in AX +; MarkBad:        Zylinder [BX], Kopf [AH] auf Laufwerk [AL] als defekt +;                 markieren, Fehlerkode in AX + +                include "lowlevel.inc" + +;****************************************************************************** +;* Bootsektor eines log. Laufwerkes lesen                                     * +;*              In  :   AL = Laufwerksnummer                                  * +;*              Out :   C+AX = Fehlerstatus                                   * +;****************************************************************************** + +                proc    ReadBootSec + +                push    es              ; Register retten +                push    bx +                push    cx +                push    di + +                call    GetTabAdr       ; Eintrag in Laufwerkstabelle ermitteln +                mov     al,[di+DrTab_Drive] ; davon ersten Sektor lesen +                mov     ah,[di+DrTab_StartHead] +                mov     bx,[di+DrTab_StartCyl] +                mov     cl,1 +                mov     ch,[di+DrTab_StartSec] +                mov     di,cs +                mov     es,di +                lea     di,[SectorBuffer] +                call    ReadSectors + +                pop     di              ; Register zurck +                pop     cx +                pop     bx +                pop     es +                ret + +                endp + +;****************************************************************************** +;* Funktion 1: Test, ob Medium gewechselt                                     * +;****************************************************************************** + +                proc    MediaCheck + +Rh_MediaID      equ     Rh_Resvd+8      ; erwartetes Media-ID +Rh_Return       equ     Rh_MediaID+1    ; Ergebnis-Flag +Rh_VolName      equ     Rh_Return+1     ; Adresse alter Laufwerksname + +                cmp     byte ptr es:[bx+Rh_MediaID],HD_ID ; gltige ID ? +                je      OK +                mov     byte ptr es:[bx+Rh_Status],DErr_InvMedia ; nein... +                jmp     Error +OK:             mov     byte ptr es:[bx+Rh_Return],1 ; nie gewechselt +                jmp     Done + +                endp + +;****************************************************************************** +;* Funktion 2: BPB aufbauen                                                   * +;****************************************************************************** + +                proc    BuildBPB + +Rh2		struct +		 db	Rh_Len dup (?) +MediaID          db	?		; erwartetes Media-ID +FATSector	 dd	?		; Pufferadresse 1. FAT-Sektor +BPBAddress	 dd	?		; Adresse neuer BPB +		endstruct + +                mov     al,es:[bx+Rh_Unit] +		call    ChkDrive        ; Laufwerksnummer gltig ? +                ljc     Error           ; nein-->Fehler & Ende + +                call    ReadBootSec     ; Bootsektor lesen +                ljc     StateError      ; bei Fehlern Ende + +                les     bx,[Rh_Ptr]        ; Zeiger neu laden +		mov	al,es:[bx+Rh_Unit] ; Tabellenadresse aufbauen +		call	GetTabAdr +		lea	di,[di+DrTab_BPB]  ; DI auf BPB-Speicher +                mov     es:[bx+Rh2_BPBAddress],di ; BPB-Zeiger abspeichern +                mov     es:[bx+Rh2_BPBAddress+2],cs +		 +                mov     si,cs              ; BPB umkopieren +                mov     es,si +		lea	si,[SectorBuffer+BPBOfs] +		cld +		mov	cx,BPBSize +		rep	movsb + +                jmp     Done + +                endp + +;****************************************************************************** + +IOCTLRead:      jmp     Unknown + +;****************************************************************************** +;* Funktion 4: Sektoren lesen                                                 * +;****************************************************************************** + +Rh4		struct +		 db	Rh_len dup (?) +MediaID		 db	?		; Media-ID Laufwerk +BufOfs		 dw	?		; Adresse Datenpuffer +BufSeg		 dw	? +NSecs		 dw	?		; Anzahl zu lesender Bl”cke +FirstSec	 dw	?		; Startsektor bzw. $FFFF fr 32-Bit-Nummern +VolID		 dd	?		; Adresse Laufwerksname +LFirstSec	 dw	?		; lange Startsektornummer +HFirstSec	 dw	? +		endstruct + +Read:           mov	al,es:[bx+Rh_Unit] ; Laufwerksnummer prfen +		call	ChkDrive +		ljc	Error + +                mov     ch,al                   ; Laufwerksnummer retten +                mov     ax,es:[bx+Rh4_FirstSec] ; Sektor holen (BIGDOS beachten) +                sub     dx,dx +                cmp     ax,-1 +                jne     Read_SmallSec +                mov     ax,es:[bx+Rh4_LFirstSec] +                mov     dx,es:[bx+Rh4_HFirstSec] +Read_SmallSec:  mov     cl,es:[bx+Rh4_NSecs]    ; Sektorzahl laden (muá <=128 sein) +                les     di,es:[bx+Rh4_BufOfs]   ; Zieladresse laden +                mov     bl,ch                   ; Laufwerksnummer nach BL + +                if      debug +                 push   ax +                 push   cx +                 mov    cx,ax +                 mov    al,' ' +                 call   PrChar +                 mov    al,bl           ; Laufwerksnummer +                 call   PrByte +                 mov    al,' ' +                 call   PrChar +                 mov    ax,dx           ; Startsektor +                 call   PrWord +                 mov    ax,cx +                 call   PrWord +                 mov    al,' ' +                 call   PrChar +                 pop    cx +                 mov    al,cl           ; Sektorzahl +                 call   PrByte +                 mov    al,' ' +                 call   PrChar +                 mov    ax,es           ; Startadresse +                 call   PrWord +                 mov    al,':' +                 call   PrChar +                 mov    ax,di +                 call   PrWord +                 pop    ax +                endif + +                call    TranslateParams         ; umrechnen lassen +                call    ReadSectors             ; der eigentliche Lesevorgang + +                ljc     StateError              ; bei Fehlern... +                jmp     Done                    ; ansonsten o.k. + +;****************************************************************************** + +ND_Read:        jmp     Unknown + +InputStatus:    jmp     Unknown + +InputFlush:     jmp     Unknown + +;****************************************************************************** +;* Funktion 8: Sektoren schreiben                                             * +;****************************************************************************** + +Rh8		struct +		 db	Rh_len dup (?) +MediaID		 db	?		; Media-ID Laufwerk +BufOfs		 dw	?		; Adresse Datenpuffer +BufSeg		 dw	? +NSecs		 dw	?		; Anzahl zu lesender Bl”cke +FirstSec	 dw	?		; Startsektor bzw. $FFFF fr 32-Bit-Nummern +VolID		 dd	?		; Adresse Laufwerksname +LFirstSec	 dw	?		; lange Startsektornummer +HFirstSec	 dw	? +		endstruct + +DoWrite:        if      debug2 +                 mov    al,es:[bx+Rh_Unit] +                 call   PrByte +                 mov    al,' ' +                 call   PrChar +                 mov    ax,es:[bx+Rh8_FirstSec] +                 call   PrWord +                 mov    al,' ' +                 mov    ax,es:[bx+Rh8_HFirstSec] +                 call   PrWord +                 mov    ax,es:[bx+Rh8_LFirstSec] +                 call   PrWord +                 call   NxtLine +                endif + +                mov     al,es:[bx+Rh_Unit] +                mov     ch,al                   ; Laufwerksnummer retten +                mov     ax,es:[bx+Rh8_FirstSec] ; Sektor holen (BIGDOS beachten) +                sub     dx,dx +                cmp     ax,-1 +                jne     DWrite_SmallSec +                mov     ax,es:[bx+Rh8_LFirstSec] +                mov     dx,es:[bx+Rh8_HFirstSec] +DWrite_SmallSec:mov     cl,es:[bx+Rh8_NSecs]    ; Sektorzahl laden (muá <=128 sein) +                les     si,es:[bx+Rh8_BufOfs]   ; Zieladresse laden +                mov     bl,ch                   ; Laufwerksnummer nach BL + +                if      debug +                 push   ax +                 push   cx +                 mov    cx,ax +                 mov    al,' ' +                 call   PrChar +                 mov    al,bl           ; Laufwerksnummer +                 call   PrByte +                 mov    al,' ' +                 call   PrChar +                 mov    ax,dx           ; Startsektor +                 call   PrWord +                 mov    ax,cx +                 call   PrWord +                 mov    al,' ' +                 call   PrChar +                 pop    cx +                 mov    al,cl           ; Sektorzahl +                 call   PrByte +                 mov    al,' ' +                 call   PrChar +                 mov    ax,es           ; Startadresse +                 call   PrWord +                 mov    al,':' +                 call   PrChar +                 mov    ax,si +                 call   PrWord +                 pop    ax +                endif + +                call    TranslateParams         ; umrechnen lassen +                call    WriteSectors            ; der eigentliche Lesevorgang + +                ret + +Write:          mov     al,es:[bx+Rh_Unit] ; Laufwerksnummer prfen +		call	ChkDrive +		ljc	Error + +                call    DoWrite + +                ljc     StateError              ; bei Fehlern... +                jmp     Done                    ; ansonsten o.k. + + +;****************************************************************************** +;* Funktion 9: Sektoren schreiben mit šberprfung                             * +;****************************************************************************** + +Rh9		struct +		 db	Rh_len dup (?) +MediaID		 db     ?		; Media-ID Laufwerk +BufOfs		 dw     ?		; Adresse Datenpuffer +BufSeg		 dw     ? +NSecs		 dw     ?		; Anzahl zu lesender Bl”cke +FirstSec	 dw     ?		; Startsektor bzw. $FFFF fr 32-Bit-Nummern +VolID		 dd     ?		; Adresse Laufwerksname +LFirstSec	 dw     ?		; lange Startsektornummer +HFirstSec	 dw     ? +		endstruct + +Write_Verify:   mov     al,es:[bx+Rh_Unit] ; Laufwerksnummer prfen +		call	ChkDrive +		ljc	Error + +                call    DoWrite         ; schreiben + +                ljc     StateError      ; bei Fehlern vorher abbrechen +                 +                les     bx,[Rh_Ptr]     ; Parameter nochmal fr Verify laden +                mov     al,es:[bx+Rh_Unit] +                mov     ch,al +                mov     ax,es:[bx+Rh9_FirstSec] +                sub     dx,dx +                cmp     ax,-1 +                jne     VWrite_SmallSec +                mov     ax,es:[bx+Rh9_LFirstSec] +                mov     dx,es:[bx+Rh9_HFirstSec] +VWrite_SmallSec:mov     cl,es:[bx+Rh9_NSecs] +                mov     bl,ch + +                call    TranslateParams ; nochmal umrechen... +                call    VeriSectors     ; und prflesen + +                jmp     Done            ; alles gut gegangen + +;****************************************************************************** + +OutputStat:     jmp     Unknown + +OutputFlush:    jmp     Unknown + +IOCTLWrite:     jmp     Unknown + +;****************************************************************************** +;* kein Device wechselbar, ™ffnen/Schleáen interessiert nicht                 * +;****************************************************************************** + +DeviceOpen:     jmp     Done + +DeviceClose:    jmp     Done + +Removeable:     jmp     Done + +;****************************************************************************** + +OutputTillBusy: jmp     Unknown + +GenIOCTL:       jmp     Unknown + +GetLogical:     jmp     Unknown + +SetLogical:     jmp     Unknown + +IOCTLQuery:     jmp     Unknown + +;****************************************************************************** +;* Funktion 0: Initialisierung                                                * +;****************************************************************************** + +                include "secparam.inc" + +Rh0		struct +		 db	Rh_len dup (?) +Units		 db     ?		; Zahl bedienter Laufwerke +EndOfs		 dw     ?		; Endadresse Offset +EndSeg		 dw     ?		; Endadresse Segment +ParamOfs	 dw     ?		; Parameter Offsetadresse +ParamSeg	 dw     ?		; Parameter Segmentadresse +FirstDrive	 db     ?		; erstes freies Laufwerk +MsgFlag		 db     ?		; Flag, ob DOS Fehler ausgeben darf +		endstruct + +Init:           PrMsg   HelloMsg        ; Meldung ausgeben +                call    LowLevelIdent   ; Startmeldung des Low-Level-Treibers + +                mov     byte ptr es:[bx+Rh0_Units],0 ; noch keine Laufwerke + +                mov     al,es:[bx+Rh0_FirstDrive] ; Startlaufwerk retten +                mov     [DrOfs],al + +                mov     ax,cs           ; ES auf gem. Segment +                mov     es,ax + +; Schritt 1: Controller prfen + +                PrMsg   DiagMsg0 +                call    ContDiag        ; Diagnose ausfhren +                sub     al,Diag_NoError +                cmp     al,6            ; auáerhalb ? +                jae     Diag_Over +                add     al,al           ; Meldung ausrechnen +                mov     ah,0 +                mov     si,ax +                mov     dx,DiagMsgTable[si] +                mov     ah,9 +                int     INT_DOS +                or      si,si           ; fehlerfrei ? +                ljnz    Init_Err        ; Nein, Fehler +                jmp     Init_ChkDrives  ; Ja, weiter zum Laufwerkstest + +Diag_Over:      push    ax +                PrMsg   UndefDiagMsg    ; undefinierter Fehlercode +                pop     ax +                add     al,Diag_NoError ; Meldung rckkorrigieren +                db      0d4h,10h        ; AAM 16 +                add     ax,'00' +                push    ax +                mov     al,ah +                mov     ah,14 +                int     10h +                pop     ax +                mov     ah,14 +                int     10h +                PrChar  CR +                PrChar  LF +                jmp     Init_Err + + +; Schritt 2: Laufwerke testen + +; Menaufruf? + +Init_ChkDrives: mov     ax,40h          ; CTRL gedrckt ? +                mov     es,ax +                btst    byte ptr es:[17h],2 +                jz      Init_Menu +                call    DiskMenu + +; Schritt 2a: Laufwerk rekalibrieren + +Init_Menu:      mov     al,[MomDrive] +                call    Recalibrate +                ljc     Init_NextDrive  ; Fehler: Laufwerk berspringen + +; Schritt 2b: Masterpartitionssektor lesen + +ReadMaster:     mov     al,[MomDrive] +		mov	ah,0		; Kopf...  +		sub	bx,bx		; ...Zylinder... +		mov	cx,0101h	; ...ein Sektor ab Sektor 1 +                mov     di,ds +                mov     es,di +                lea     di,[SectorBuffer] ; in den Sektorpuffer +		call	ReadSectors +                JmpOnError [MomDrive],Init_NextDrive ; Fehler ? + +; Schritt 2c: Laufwerksparameter initialisieren + +                lea     si,[SectorBuffer+DrPar_Offset] ; Quelladresse im Sektor +                mov     al,[MomDrive]   ; Zieladresse ausrechnen +                call    GetPTabAdr +                mov     cx,DrPar_Len +                cld +                rep     movsb + +                sub     di,DrPar_Len    ; Laufwerk nicht initialisiert ? +                cmp     word ptr[di+DrPar_Cyls],0 +                je      DoQuery +                cmp     byte ptr[di+DrPar_Heads],0 +                je      DoQuery +                cmp     byte ptr[di+DrPar_NSecs],0 +                jne     NoQuery +DoQuery:        mov     al,[MomDrive]   ; wenn ja, dann nachfragen +                mov     ah,1            ; Rckschreiben hier erlaubt +                call    QueryParams +                or      al,al           ; =0-->Laufwerk ignorieren +                jz      Init_NextDrive +                dec     al              ; =1-->nochmal lesen +                jz      ReadMaster      ; ansonsten weitermachen + +NoQuery:        mov     al,[MomDrive]   ; Laufwerksparameter ausgeben... +                call    PrintPDrive +                mov     al,[MomDrive]   ; ...und dem Controller einbleuen +                call    SetDriveParams +                JmpOnError [MomDrive],Init_NextDrive +                mov     al,[MomDrive] +                call    Recalibrate +                JmpOnError [MomDrive],Init_NextDrive + +; Schritt 2d: durch die Partitionssektoren hangeln + +		mov	al,[MomDrive]	; Laufwerk : momentanes +		cbw			; Kopf : 0 +		push	ax +		sub	ax,ax +		push	ax		; Zylinder : 0 +		inc	ax		; Sektor : 1 +		push	ax +		dec	ax +		push	ax		; lin. Sektornummer 0 +		push	ax +		call	ScanParts + +Init_NextDrive: inc     [MomDrive]      ; Z„hler weitersetzen +		cmp	[MomDrive],MaxPDrives +                ljb     Init_ChkDrives + +                cmp     [DrCnt],0       ; keine Partitionen gefunden ? +                jne     Init_PDrives +                PrMsg   ErrMsgNoDrives  ; ja: meckern +                jmp     Init_Err + +Init_PDrives:   PrMsg   LDriveMsg +                mov     [MomDrive],0    ; Parameter der Partitionen ausgeben +                lea     bp,[DrTab_BPBs] ; und BPB-Tabelle aufbauen +                cld + +Init_PLDrives:  mov     al,[MomDrive] +                call    PrintLDrive + +                mov     al,[MomDrive]   ; Bootsdektor lesen +                call    ReadBootSec +                lea     si,[SectorBuffer+BPBOfs] ; BPB rauskopieren +                mov     al,[MomDrive] +                call    GetTabAdr +                lea     di,[di+DrTab_BPB] +                mov     ax,cs +                mov     es,ax +                mov     ds:[bp],di      ; Adresse nebenbei ablegen +                add     bp,2 +                mov     cx,BPBSize +                rep     movsb + +                inc     [MomDrive] +                mov     al,[MomDrive] +                cmp     al,[DrCnt] +                jb      Init_PLDrives + +                PrChar  LF              ; sieht besser aus... + +                les     bx,[Rh_Ptr]     ; Zeiger auf BPB-Zeiger einschreiben +                lea     ax,[DrTab_BPBs] +                mov     es:[bx+Rh0_ParamOfs],ax +                mov     es:[bx+Rh0_ParamSeg],cs +                jmp     Init_OK         ; Initialisierung erfolgeich zu Ende + +Init_Err:       PrMsg   WKeyMsg +                xor     ah,ah           ; damit Meldung lesbar bleibt +                int     16h +                sub     ax,ax           ; Treiber aus Speicher entfernen +                jmp     Init_End + +Init_OK:        mov     al,[DrCnt]      ; Laufwerkszahl holen +                les     bx,[Rh_Ptr] +                mov     es:[bx+Rh0_Units],al ; im Request Header eintragen +                mov     [NrOfVols],al   ; im Treiberkopf eintragen +                lea     ax,[Init]       ; residenten Teil installieren + +Init_End:       les     bx,[Rh_Ptr] +                mov     es:[bx+Rh0_EndOfs],ax ; Endadresse setzen +                mov     es:[bx+Rh0_EndSeg],cs + +                jmp     Done + +;****************************************************************************** +;* transiente Unterroutinen                                                   * +;****************************************************************************** + +;****************************************************************************** +;* Partitionsbaum durchgehen                                                  * +;*              In  :   dw Kopf/Laufwerk                                      * +;*                      dw Zylinder                                           * +;*			dw Sektor					      * +;*			dd lineare Nummer des Sektors			      * +;****************************************************************************** + +ScParts_DrHd	equ	12		; Parameteradressen auf Stack +ScParts_Cyl	equ	10 +ScParts_Sec	equ	8 +ScParts_LinSec	equ	4 +ScParts_ParTab  equ     0-(MaxParts*ParTab_Len)   ; Kopie Partitionstabelle +ScParts_LocSize equ     0-ScParts_ParTab          ; belegter Stack + +ScanParts:      enter	ScParts_LocSize,0 + +; Partitionssektor lesen + +		mov	ax,[bp+ScParts_DrHd] +		mov	bx,[bp+ScParts_Cyl] +		mov	ch,[bp+ScParts_Sec] +		mov	cl,1 +		mov	di,cs +		mov	es,di +		lea	di,[SectorBuffer] +                call    ReadSectors +                JmpOnError [MomDrive],ScanParts_End + +; Partitionssektorkennung o.k. ? + +		cmp	word ptr SectorBuffer[ParSecID_Offset],0aa55h +                ljne    ScanParts_End + +; Partitionstabelle auslesen + +		lea	si,[SectorBuffer+ParTab_Offset] ; Quelladresse +		mov	di,ss		; Zieladresse auf Stack +		mov	es,di +                lea     di,[bp+ScParts_ParTab] +		mov	cx,MaxParts*ParTab_Len  ; L„nge +		cld +		rep	movsb + +; Partitionstabelle durchgehen + +                mov     si,ScParts_ParTab       ; vorne anfangen +		mov	cx,MaxParts		; alle durchgehen +ScanParts_Scan:	push	cx + +		mov	al,[bp+si+ParTab_Type]	; Typ der Partition lesen +                lea     bx,[AccPartTypes-1]     ; auf Suchtabelle +ScanParts_LAcc: inc     bx                      ; einen Eintrag weiter +                cmp     byte ptr [bx],0         ; Tabellenende ? +		je	ScanParts_Next		; ja-->war nix +		cmp	al,[bx]			; gefunden ? +		jne	ScanParts_LAcc		;  + +		mov	bx,[bp+si+ParTab_LinSec] ; linearen Startsektor ausrechnen +		mov	cx,[bp+si+ParTab_LinSec+2] +                add     bx,[bp+ScParts_LinSec]  ; in CX:BX +                adc     cx,[bp+ScParts_LinSec+2] + +		cmp	al,5			; extended partition ? +		jne	ScanParts_Enter + +		push	si			; ja: Zeiger fr Rekursion retten +		mov	al,[bp+ScParts_DrHd]	; Laufwerk & Kopf zusammenbauen +		mov	ah,[bp+si+ParTab_FHead] +		push	ax +		mov	ax,[bp+si+ParTab_FSecCyl] ; Zylinder ausfiltern +                xchg    ah,al +		shr	ah,6 +		push	ax +                mov     al,[bp+si+ParTab_FSecCyl] ; Sektor ausfiltern +		and	ax,63 +		push	ax +		push	cx +		push	bx +		call	ScanParts +		pop	si			; Zeiger zurck +		jmp	ScanParts_Next + +ScanParts_Enter:mov	al,[DrCnt]		; Partition in Tabelle eintragen +		call	GetTabAdr		; dazu Adresse neuen Eintrags holen +		cld +		mov	ax,cs			; Ziel im Segment +		mov	es,ax +		mov	al,[bp+si+ParTab_FHead] ; Kopf kopieren +		stosb	 +		mov	ax,[bp+si+ParTab_FSecCyl] ; Zylinder kopieren +                xchg    ah,al +		shr	ah,6 +		stosw +                mov     al,[bp+si+ParTab_FSecCyl] ; Sektor kopieren +		and	al,63 +		stosb +		mov	ax,bx			; linearen Startsektor kopieren +		stosw +		mov	ax,cx +		stosw +		mov	ax,[bp+si+ParTab_NSecs]	; Sektorzahl kopieren +		stosw +		mov	ax,[bp+si+ParTab_NSecs+2] +		stosw +		mov	al,[bp+ScParts_DrHd]	; Laufwerksnummer kopieren +		stosb +		inc	[DrCnt]			; ein log. Laufwerk mehr + +ScanParts_Next:	add	si,ParTab_Len		; auf n„chste Partition +		pop	cx +                dec     cx +                ljnz    ScanParts_Scan + +ScanParts_End:  leave +		ret	10 + +;****************************************************************************** +;* Daten eines physikalischen Laufwerks ausgeben                              * +;*              In  :   AL = Laufwerk                                         * +;****************************************************************************** + +                proc    PrintPDrive + +                push    cx              ; Register retten +                push    dx +                push    di + +                cbw                     ; AH l”schen +                push    ax              ; Laufwerk ausgeben +                PrMsg   PDriveMsg1 +                pop     ax +                push    ax +                inc     ax +                mov     cl,1 +                call    WriteDec +                PrMsg   PDriveMsg2 + +                pop     ax              ; Adresse Laufwerkstabelle berechnen +                call    GetPTabAdr + +                mov     ax,[di+DrPar_Cyls] ; Zylinder ausgeben +                mov     cl,5 +                call    WriteDec +                PrMsg   PDriveMsg3 + +                mov     al,[di+DrPar_Heads] ; K”pfe ausgeben +                mov     ah,0 +                mov     cl,3 +                call    WriteDec +                PrMsg   PDriveMsg4 + +                mov     al,[di+DrPar_NSecs] ; Sektoren ausgeben +                mov     ah,0 +                mov     cl,4 +                call    WriteDec +                PrMsg   PDriveMsg5 + +                mov     al,[di+DrPar_Heads] ; Gesamtsektorzahl berechnen +                mul     byte ptr [di+DrPar_NSecs] +                mul     word ptr [di+DrPar_Cyls] +		call	WriteMBytes +                PrMsg   PDriveMsg6 + +                pop     di              ; Register zurck +                pop     dx +                pop     cx +                ret + +                endp + +;****************************************************************************** +;* Daten eines logischen Laufwerks ausgeben                                   * +;*              In  :   AL = Laufwerk                                         * +;****************************************************************************** + +                proc    PrintLDrive + +                push    cx              ; Register retten +                push    dx +                push    di + +                mov     dx,ax           ; Laufwerk retten +                push    dx +                mov     cx,3            ; ausgeben +                call    WriteSpc +                add     dl,[DrOfs] +                add     dl,'A' +                mov     ah,DOS_WrChar +                int     INT_DOS +                PrChar  ':' + +                pop     ax              ; Tabelle holen +                call    GetTabAdr + +                mov     al,[di+DrTab_Drive] ; Laufwerk ausgeben... +                inc     al +                cbw +                mov     cl,9 +                call    WriteDec + +                mov     ax,[di+DrTab_StartCyl] ; ...Zylinder... +                mov     cl,10 +                call    WriteDec + +                mov     al,[di+DrTab_StartHead] ; ...Kopf... +                cbw +                mov     cl,7 +                call    WriteDec + +                mov     al,[di+DrTab_StartSec] ; ...Sektor... +                cbw +                mov     cl,8 +                call    WriteDec + +                mov     cx,2 +                call    WriteSpc +                mov     ax,[di+DrTab_SecCnt] ; ...Gr”áe +                mov     dx,[di+DrTab_SecCnt+2] +                call    WriteMBytes + +                PrMsg   PDriveMsg6      ; Meldung wiederverwertet... + +                pop     di              ; Register zurck +                pop     dx +                pop     cx +                ret + +                endp + +;****************************************************************************** +;* Fehlercode eines Laufwerks ausgeben                                        * +;*              In :    AL = Fehlercode                                       * +;*                      AH = Laufwerksnummer (0,1...)                         * +;****************************************************************************** + +                proc    WrErrorCode + +                push    bx              ; Register retten +                push    cx +                push    dx + +                add     ah,'1'          ; LW-Nummer in ASCII umrechnen... +                mov     [DrvErrorMsg2],ah ; ...und einschreiben +                mov     ch,al           ; Kode sichern +                PrMsg   DrvErrorMsg +                mov     cl,7            ; bei Bit 0 anfangen +ErrLoop:        rol     ch,1            ; fagl. Bit in Carry +                jnc     NoErrBit +                mov     bl,cl           ; Bit gefunden: Index ausrechnen +                mov     bh,0 +                add     bx,bx +                mov     dx,[bx+Pointers] +                mov     ah,DOS_WrString +                int     INT_DOS +NoErrBit:       dec     cl              ; n„chstes Bit +                jnz     ErrLoop + +                pop     dx              ; Register zurck +                pop     cx +                pop     bx + +                ret + +DrvErrorMsg:    db      "Fehler auf Festplatte " +DrvErrorMsg2:   db      "0:",CR,LF,'$' + +Pointers        dw      Msg0,Msg1,Msg2,Msg3,Msg4,Msg5,Msg6,Msg7 +Msg0            db      "  Adreámarke nicht gefunden",CR,LF,'$' +Msg1            db      "  Spur 0 nicht gefunden",CR,LF,'$' +Msg2            db      "  Kommandoabbruch",CR,LF,'$' +Msg3            db      "$" +Msg4            db      "  Sektor nicht gefunden",CR,LF,'$' +Msg5            db      "$" +Msg6            db      "  Datenfehler",CR,LF,'$' +Msg7            db      "  Sektor als defekt markiert",CR,LF,'$' + +                endp + +;****************************************************************************** +;* Sektorenzahl als MBytes ausgeben                                           * +;*              In:     DX:AX = Sektorzahl                                    * +;****************************************************************************** + +                proc    WriteMBytes + +SecsPerMByte    equ     (2^20)/SecSize + +                push    cx              ; Register retten +		push	dx + +                add     ax,SecsPerMByte/20 ; wg. Rundung +                adc     dx,0 + +                mov     cx,SecsPerMByte ; durch 2048 teilen = MByte +                div     cx +                push    dx              ; Nachkommastellen retten +                mov     cl,6 +                call    WriteDec + +                PrChar  '.'             ; Nachkommastelle +                pop     ax              ; holen +                cwd +                mov     cx,SecsPerMByte/10 ; Sektoren pro 100 KByte +		div	cx +		mov	cl,1		; ausgeben +		call	WriteDec + +		pop	dx		; Register zurck +		pop	cx +		ret + +                endp + +;****************************************************************************** +;* transiente Daten                                                           * +;****************************************************************************** + +HelloMsg:       db      CR,LF,"Sekund„rlaufwerkstreiber V0.4",CR,LF,'$' + +ErrMsgNoDrives: db      CR,LF,"Fehler: keine Partitionen gefunden",CR,LF,'$' + +DiagMsg0:       db      CR,LF,"Controller-Selbsttest: ",'$' +DiagMsg1:       db      "OK",CR,LF,'$' +DiagMsg2:       db      "Controller fehlerhaft",CR,LF,'$' +DiagMsg3:       db      "Sektorpuffer defekt",CR,LF,'$' +DiagMsg4:       db      "Fehlerkorrektur defekt",CR,LF,'$' +DiagMsg5:       db      "Steuerprozessor defekt",CR,LF,'$' +DiagMsg6:       db      "Timeout",CR,LF,'$' +DiagMsgTable    dw      DiagMsg1,DiagMsg2,DiagMsg3,DiagMsg4,DiagMsg5,DiagMsg6 +UndefDiagMsg    db      "Unbekannter Fehlercode #$" +WKeyMsg:        db      "Weiter mit beliebiger Taste...",CR,LF,'$' + +PDriveMsg1:     db      "Festplatte $" +PDriveMsg2:     db      " :$" +PDriveMsg3:     db      " Zylinder,$" +PDriveMsg4:     db      " K”pfe,$" +PDriveMsg5:     db      " Sektoren,$" +PDriveMsg6:     db      " MByte",CR,LF,'$' + +LDriveMsg:      db      CR,LF,"vorhandene Partitionen:",CR,LF +                db      "Laufwerk  Platte  Zylinder  Kopf" +                db      "  Sektor      Kapazit„t",CR,LF,'$' + +AccPartTypes	db	1		; akzeptierte Partitionstypen: DOS 2.x FAT12 +                db      4               ; DOS 3.x FAT16 +		db	5		; DOS 3.3 extended +                db      6               ; DOS 3.31 >32 MByte +		db	0		; Tabellenende + +MomDrive	db	0		; momentan gescanntes Laufwerk + +                end diff --git a/tests/t_secdrive/t_secdrive.doc b/tests/t_secdrive/t_secdrive.doc new file mode 100644 index 0000000..0aece08 --- /dev/null +++ b/tests/t_secdrive/t_secdrive.doc @@ -0,0 +1,9 @@ ++----------------------- Test Application SECDRIVE --------------------------+ +|                                                                            | +|   YUCK!  8086/MSDOS-Code ;-)                                               | +|   This is a MSDOS driver for a secondary MFM/RLL/ESDI/IDE controller I     | +|   wrote a few years ago - just to get another 40MB of storage (which was   | +|   a lot at that time...)                                                   | +|   This app also demonstrates the usage of the newly introduced structures. | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_secdrive/t_secdrive.ori b/tests/t_secdrive/t_secdrive.ori Binary files differnew file mode 100755 index 0000000..0538002 --- /dev/null +++ b/tests/t_secdrive/t_secdrive.ori diff --git a/tests/t_secdrive/wd1002xt.inc b/tests/t_secdrive/wd1002xt.inc new file mode 100644 index 0000000..7dd1268 --- /dev/null +++ b/tests/t_secdrive/wd1002xt.inc @@ -0,0 +1,773 @@ +;****************************************************************************** +;*                                                                            * +;*  Includedatei fr SECMAIN.ASM                                              * +;*  liefert low-level-Routinen fr SecMain                                    * +;*  Version hier fr WD1002XT-kompatible Kontroller:                          * +;*  MFM, RLL (?)                                                              * +;*                                                                            * +;*  Historie: 28.12.1994                                                      * +;*            26. 3.1994 Formatierroutinen                                    * +;*             8. 4.1994 defekte Spuren markieren                             * +;*                                                                            * +;****************************************************************************** + +                section wd1002xt + +;------------------------------------------------------------------------------ +; Portadressen + +Port_Base       equ     320h            ; prim„re Basisadresse +Port_Data       equ     Port_Base+0     ; Datenregister (R+W) +Port_Status     equ     Port_Base+1     ; Statusregister (R) +Port_Reset      equ     Port_Base+1     ; Reset ausl”sen (W) +Port_Config     equ     Port_Base+2     ; Jumper auslesen (R) +Port_Select     equ     Port_Base+2     ; Kontroller selektieren (W) +Port_IRQDRQ     equ     Port_Base+3     ; IRQ/DRQ-Leitungen freigeben (W) + +;------------------------------------------------------------------------------ +; Kommandocodes + +Cmd_Diagnose    equ     0e4h            ; Kommando: Kontroller-Selbsttest +Cmd_GetStatus   equ     003h            ; Status letzter Operation lesen +Cmd_TestReady   equ     000h            ; Test, ob Laufwerk bereit +Cmd_Restore     equ     001h            ; Laufwerk rekalibrieren +Cmd_SetParams   equ     00ch            ; Laufwerksparameter setzen +Cmd_Seek        equ     00bh            ; Spur anfahren +Cmd_Read        equ     008h            ; Sektoren lesen +Cmd_Write       equ     00ah            ; Sektoren schreiben +Cmd_Verify      equ     005h            ; Sektoren auf Lesbarkeit prfen +Cmd_WriteBuffer equ     00fh            ; Sektorpuffer beschreiben +Cmd_FormatDisk  equ     004h            ; Laufwerk formatieren +Cmd_FormatTrack equ     006h            ; Spur formatieren +Cmd_FormatBad   equ     007h            ; Spur als defekt markieren + +;------------------------------------------------------------------------------ +; I/O-Bremse + +IODelay         macro +                jmp     $+2 +                endm + +;------------------------------------------------------------------------------ +; Puffer + +CmdBufSize      equ     6               ; enth„lt Kommandoblock fr WD1002 +CmdBuf          db      CmdBufSize dup (0) + +StatBufSize     equ     4               ; enth„lt Statusinfo vom WD1002 +StatBuf         db      StatBufSize dup (0) + +GeomBufSize     equ     8               ; enth„lt Parametertabelle fr Laufwerk +GeomBuf         db      GeomBufSize dup (0) + +;****************************************************************************** +;* Kommandopuffer initialisieren                                              * +;****************************************************************************** + +                proc    InitCmdBuf + +                push    ax              ; Register retten + +                sub     ax,ax           ; mit Nullen initialisieren +                mov     word ptr[CmdBuf],ax +                mov     word ptr[CmdBuf+2],ax +                mov     ah,45h          ; Retry on, 70us Steprate +                mov     word ptr[CmdBuf+4],ax + +                pop     ax              ; Register zurck + +                ret + +                endp + +;****************************************************************************** +;* einen Datenblock an den Kontroller schicken                                * +;*              In  :   ES:SI = Datenblock                                    * +;*                      CX = Anzahl Bytes                                     * +;*              Out :   C=1 bei Protokollfehler                               * +;****************************************************************************** + +                proc    SendBlock + +                push    ax              ; Register retten +                push    cx +                push    dx +                push    si + +                mov     dx,Port_Status +                jcxz    ZeroLoop        ; Nullschleife abfangen +                cld                     ; !!! +OutLoop:        in      al,dx           ; Status lesen +                btst    al,0            ; warten, bis REQ-Bit auf 1 +                jz      OutLoop +                btst    al,1            ; IO-Bit muá 0 sein +                stc +                jnz     ErrEnd +                mov     dl,Lo(Port_Data); ein Byte auf Datenport ausgeben +                seges +                outsb +                mov     dl,Lo(Port_Status) ; zurck fr n„chsten Durchlauf +                loop    OutLoop +ZeroLoop:       clc                     ; Ende ohne Fehler +ErrEnd: +                pop     si              ; Register zurck +                pop     dx +                pop     cx +                pop     ax + +                ret + +                endp + +;****************************************************************************** +;* einen Datenblock vom Kontroller lesen                                      * +;*              In  :   ES:DI = Datenblock                                    * +;*                      CX = Anzahl Bytes                                     * +;*              Out :   C=1 bei Protokollfehler                               * +;****************************************************************************** + +                proc    RecvBlock + +                push    ax              ; Register retten +                push    cx +                push    dx +                push    di + +                mov     dx,Port_Status +                jcxz    ZeroLoop        ; Nullschleife abfangen +                cld                     ; !!! +InLoop:         in      al,dx           ; Status lesen +                btst    al,0            ; warten, bis REQ-Bit auf 1 +                jz      InLoop +                btst    al,1            ; IO-Bit muá 1 sein +                stc +                jz      ErrEnd +                mov     dl,Lo(Port_Data); ein Byte von Datenport einlesen +                insb +                mov     dl,Lo(Port_Status) ; zurck fr n„chsten Durchlauf +                loop    InLoop +ZeroLoop:       clc                     ; Ende ohne Fehler +ErrEnd: +                pop     di              ; Register zurck +                pop     dx +                pop     cx +                pop     ax + +                ret + +                endp + +;****************************************************************************** +;* Status bilden                                                              * +;*              Out : C+AX = Status                                           *  +;****************************************************************************** + +                proc    BuildStatus + +                push    dx              ; Register retten + +                mov     dx,Port_Status  ; auf Datum warten +Loop:           in      al,dx +                btst    al,0            ; bis REQ=1 +                jz      Loop +                btst    al,1            ; und IO=1 +                jz      Loop +                mov     dl,Lo(Port_Data); CCB auslesen +                in      al,dx +                mov     ah,al           ; retten fr Fehlerabfrage +                and     al,2            ; Bit 1 ausmaskieren +                clc +                ljz      End             ; wenn = 0, kein Fehler und AL=0 + +                push    cx              ; zus„tzliche Register retten +                push    si +                push    di +                push    es + +                call    InitCmdBuf      ; ansonsten Kommando absetzen, um +                mov     [CmdBuf],Cmd_GetStatus ; Status zu lesen +                and     ah,20h          ; Status fr korr. Laufwerk abfragen +                mov     [CmdBuf+1],ah +                mov     dx,Port_Status +WaitNBusy:      in      al,dx +                btst    al,3 +                jnz     WaitNBusy +                mov     ax,ds           ; NICHT ExecCmd benutzen, da sonst +                mov     es,ax           ; Rekursion ! +                lea     si,[CmdBuf] +                mov     cx,CmdBufSize +                mov     dl,Lo(Port_Select) +                out     dx,al +                call    SendBlock +                lea     di,[StatBuf]    ; 4 Statusbytes auslesen +                mov     cx,StatBufSize +                call    RecvBlock +                mov     dl,Lo(Port_Status); CCB nicht vergessen!! +Loop2:          in      al,dx +                btst    al,0            ; bis REQ=1 +                jz      Loop2 +                btst    al,1            ; und IO=1 +                jz      Loop2 +                mov     dl,Lo(Port_Data) +                in      al,dx +                mov     al,[StatBuf]    ; Fehlercode = 1.Byte, +                and     al,7fh          ; Bit 0..6 +                stc                     ; Carry signalisiert Fehler +                pop     es              ; zus„tzliche Register zurck +                pop     di +                pop     si +                pop     cx + +End:            mov     ah,0            ; MSB ohne Bedeutung +                pop     dx              ; Register zurck +                ret + +                endp + +;****************************************************************************** +;* XT- in AT-Fehlerkode umsetzen                                              * +;* Eingabe:     AL = XT-Fehlerkode                                            * +;* Ausgabe:     C+AX = AT-Fehlerstatus                                        * +;****************************************************************************** + +                proc    TranslateStatus + +                push    bx +                push    si + +                mov     bl,al          ; alten Status sichern +                mov     bh,-1 +                lea     si,[TransTable] +                cld +TransLoop:      lodsw                   ; einen Eintrag laden +                cmp     al,bh           ; Tabellenende? +                je      TransEnd +                cmp     al,bl           ; Treffer? +                jne     TransLoop       ; nein, weitersuchen +                mov     al,ah           ; bersetzten Code laden +                cmp     al,0            ; Code fr kein Fehler? +                clc +                je      Ende            ; ja, C=0 +                jmp     TransErr        ; ansonsten C=1 +TransEnd:       mov     al,04h          ; Aborted Command annehmen +TransErr:       stc                     ; Fehlerflag setzen + +Ende:           pop     si              ; Register zurck +                pop     bx + +                ret + +TransTable:     db      00h,00h         ; kein Fehler +                db      02h,02h         ; kein Seek Complete-Signal +                db      03h,04h         ; Write Fault +                db      04h,04h         ; Laufwerk nicht bereit +                db      06h,02h         ; Spur 0 nicht gefunden +                db      08h,02h         ; Laufwerk positioniert noch +                db      11h,40h         ; unkorrigierbarer Datenfehler +                db      12h,01h         ; Adreámarke nicht gefunden +                db      15h,10h         ; Positionierfehler +                db      18h,00h         ; korrigierbarer Fehler (ignoriert) +                db      19h,80h         ; Spur als defekt markiert +                db      -1,-1           ; Tabellenende + +                endp + +;****************************************************************************** +;* ein Kommando ausfhren                                                     * +;*              In  :   AL = Kommando                                         * +;****************************************************************************** + +                proc    ExecCmd + +                push    cx              ; Register retten +                push    ax +                push    dx +                push    si +                push    es + +                mov     [CmdBuf],al     ; Kommandokode in Datenblock einschreiben +                mov     dx,Port_Status  ; warten, bis Kontroller frei +WaitNBusy:      in      al,dx +                btst    al,3 +                jnz     WaitNBusy +                mov     dx,Port_Select  ; Kontroller selektieren +                out     dx,al +                mov     ax,ds           ; Adresse Kommandoblock +                mov     es,ax +                lea     si,[CmdBuf] +                mov     cx,CmdBufSize   ; L„nge Kommandoblock +                call    SendBlock       ; Kommandoblock abschicken + +                pop     es              ; Register zurck +                pop     si +                pop     dx +                pop     ax +                pop     cx + +                ret + +                endp + +;****************************************************************************** +;* Laufwerk und Sonderwerte in Kommandoblock einprogrammieren                 * +;*              In  :   AL = Laufwerk                                         * +;*                      AH = Kopf                                             * +;****************************************************************************** + +                proc    SetDriveEnv + +                push    ax              ; Register retten + +  +                shl     al,5            ; Laufwerksbit an Stelle 5 +                or      al,ah +                mov     [CmdBuf+1],al   ; als 2. Byte im Kommandopuffer schreiben + +                pop     ax              ; Register zurck + +                ret + +                endp + +;****************************************************************************** +;* Zylinder- und Sektorparameter an Kontroller ausgeben                       * +;*              In  :   BX = Startzylinder                                    * +;*                      CL = Sektorzahl/Interleave                            * +;*                      CH = Startsektor                                      * +;****************************************************************************** + +                proc    SetTransParams + +                push    ax              ; Register retten + +                mov     [CmdBuf+3],bl   ; LSB Startzylinder +                mov     al,bh           ; MSB Startzylinder +                shl     al,6            ; in Bit 6..7 schieben +                add     al,ch           ; Sektor dazu +                dec     al              ; !!! Sektoren ab 0 +                mov     [CmdBuf+2],al +                mov     [CmdBuf+4],cl   ; Sektorzahl + +                pop     ax             ; Register zurck +                ret + +                endp + +;****************************************************************************** +;* Begráungsmeldung ausgeben:                                                * +;****************************************************************************** + +                globproc LowLevelIdent + +                push    ax              ; Register retten + +                PrMsg   IdentMsg + +                pop     ax + +                ret + +IdentMsg        db      "Low-Level-Routinen fr WD1002S-WX2 und kompatible Controller",CR,LF,'$' + +                endp + +;****************************************************************************** +;* Controller-Diagnose:                                                       * +;*              Out :  AL = Diagnosecode                                      * +;****************************************************************************** + +                globproc ContDiag + +                push    cx              ; Register retten +                push    bx +                push    dx + +                sub     cx,cx +                mov     dx,Port_Status  ; auf Status +BWait:          in      al,dx +                btst    al,3            ; auf NOT BUSY warten +                loopnz  BWait           ; oder bis 64K Durchl„ufe durch +                or      cx,cx           ; Timeout ? +                jne     NTOut +                mov     al,Diag_Timeout ; ja: Fehlercode setzen... +                jmp     End             ; ...und Feierabend + +NTOut:          call    InitCmdBuf      ; Kommando Selbsttest ausfhren +                mov     al,Cmd_Diagnose +                call    ExecCmd +                call    BuildStatus     ; Status holen + +                cmp     al,5            ; WD1002 definiert nur Code 0..5 +                jb      DoTrans +                mov     al,7            ; "undefinierter Code" +                jmp     End +DoTrans:        lea     bx,[TransTbl]   ; ansonsten umsetzen +                xlat + +End:            pop     dx              ; Register zurck +                pop     bx +                pop     cx +                ret + +TransTbl:       db      Diag_NoError    ; Code 0: kein Fehler +                db      Diag_ContError  ; Code 1: WD1010 fehlerhaft +                db      Diag_ECCError   ; Code 2: WD11C00 fehlerhaft +                db      Diag_SBufError  ; Code 3: Sektorpuffer defekt +                db      Diag_ProcError  ; Code 4: WD1015 RAM defekt +                db      Diag_ProcError  ; Code 5: WD1015 ROM defekt + +  +                endp + +;****************************************************************************** +;* Laufwerk rekalibrieren, gleichzeitig Test, ob vorhanden                    * +;*              In  :  AL = Laufwerk                                          * +;*              Out :  C + AX = Status                                        * +;****************************************************************************** + +  +                globproc Recalibrate + +                push    ax              ; Register retten +                push    cx + +                call    InitCmdBuf      ; testen, ob Laufwerk bereit +                mov     ah,0            ; Kopf dafr unwichtig +                call    SetDriveEnv +                mov     dl,al           ; Laufwerksnummer retten, gleichzeitig +                mov     dh,0            ; Kopf auf 0 setzen +                mov     al,Cmd_TestReady +                call    ExecCmd +                call    BuildStatus +                jc      TotEnde         ; C=1 --> Ende mit Fehler + +                call    InitCmdBuf      ; sanfte Tour: Spur 0 mit Seek anfahren +                mov     ax,dx +                call    SetDriveEnv +                mov     al,0            ; Zylinder lo=0 +                mov     [CmdBuf+3],al +                inc     al              ; Zylinder Hi=0, Startsektor=1 +                mov     [CmdBuf+2],al +                mov     al,Cmd_Seek +                call    ExecCmd +                call    BuildStatus +                jnc     TotEnde         ; kein Fehler, alles in Butter + +                call    InitCmdBuf      ; ansonsten echtes Restore versuchen +                mov     ax,dx +                call    SetDriveEnv +                mov     al,Cmd_Restore +                call    ExecCmd +                call    BuildStatus +                call    TranslateStatus + +TotEnde:        pop     dx              ; Register zurck +                pop     ax + +                ret + +                endp + +;****************************************************************************** +;* Dem Kontroller die Laufwerksgeometrie mitteilen                            * +;*              In  :   AL = Laufwerk                                         * +;*              Out :   C  = 1-->Fehler                                       * +;****************************************************************************** + +                globproc SetDriveParams + +                push    cx              ; Register retten +                push    si +                push    es + +                call    GetPTabAdr      ; Adresse Parametertabelle holen +                call    InitCmdBuf      ; Kommando anstoáen +                call    SetDriveEnv +                mov     al,Cmd_SetParams +                call    ExecCmd + +  +                mov     ax,[di+DrPar_Cyls] ; Parametertabelle aufbauen +                xchg    ah,al +                mov     word ptr [GeomBuf],ax +                mov     al,[di+DrPar_Heads] +                mov     byte ptr[GeomBuf+2],al +                mov     ax,[di+DrPar_RedWr] +                xchg    ah,al +                mov     word ptr[GeomBuf+3],ax +                mov     ax,[di+DrPar_PrComp] +                xchg    ah,al +                mov     word ptr[GeomBuf+5],ax +                mov     al,[di+DrPar_ECCLen] +                mov     byte ptr[GeomBuf+7],al +                lea     si,[GeomBuf]    ; Block abschicken +                mov     cx,GeomBufSize +                mov     ax,ds +                mov     es,ax +                call    SendBlock +                call    BuildStatus +                call    TranslateStatus + +                pop     es              ; Register zurck +                pop     si +                pop     cx + +                ret + +                endp + +;****************************************************************************** +;* Sektor(en) lesen                                                           * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Startkopf                                         * +;*                     BX = Startzylinder                                     * +;*                     CL = Sektorzahl                                        * +;*                     CH = Startsektor                                       * +;*                     ES:DI = Zeiger auf Datenpuffer                         * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc ReadSectors + +                push    bx              ; Register retten +                push    cx +                push    dx +                push    di +                push    es + +                call    InitCmdBuf      ; Puffer initialisieren +                call    SetDriveEnv +                call    SetTransParams +                mov     al,Cmd_Read     ; Lesen triggern +                PrChar  '1' +                call    ExecCmd +                PrChar  '2' + +SecLoop:        mov     dx,Port_Status  ; warten, bis Request-Bit gesetzt +RLoop:          in      al,dx +                btst    al,0 +                jz      RLoop +                btst    al,2            ; Daten oder Status ? +                jnz     ErrEnd          ; wenn jetzt Status, ist etwas schief gelaufen +                push    cx              ; ansonsten Sektor auslesen +                mov     cx,SecSize +                PrChar  '3' +                call    RecvBlock +                PrChar  '4' +                pop     cx +                dec     cl +                add     di,SecSize +                jnz     RLoop           ; und n„chsten Sektor verarbeiten + +ErrEnd:         PrChar  '5' +                call    BuildStatus +                PrChar  '6' +                call    TranslateStatus + +                pop     es              ; Register zurck +                pop     di +                pop     dx +                pop     cx +                pop     bx + +                ret + +                endp + +;****************************************************************************** +;* Sektor(en) verifizieren                                                    * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Startkopf                                         * +;*                     BX = Startzylinder                                     * +;*                     CL = Sektorzahl                                        * +;*                     CH = Startsektor                                       * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc VeriSectors + +                push    bx              ; Register retten +                push    cx +                push    dx + +                call    InitCmdBuf      ; Puffer initialisieren +                call    SetDriveEnv +                call    SetTransParams +                mov     al,Cmd_Verify   ; Verifikation triggern +                call    ExecCmd + +                call    BuildStatus +                call    TranslateStatus + +                pop     dx              ; Register zurck +                pop     cx +                pop     bx + +                ret + +                endp + +;****************************************************************************** +;* Sektor(en) schreiben                                                       * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Startkopf                                         * +;*                     BX = Startzylinder                                     * +;*                     CL = Sektorzahl                                        * +;*                     CH = Startsektor                                       * +;*                     ES:SI = Zeiger auf Datenpuffer                         * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc WriteSectors + +                push    bx              ; Register retten +                push    cx +                push    dx +                push    si +                push    es + +  +                call    InitCmdBuf      ; Puffer initialisieren +                call    SetDriveEnv +                call    SetTransParams +                mov     al,Cmd_Write    ; Lesen triggern +                call    ExecCmd + +SecLoop:        mov     dx,Port_Status  ; warten, bis Request-Bit gesetzt +WLoop:          in      al,dx +                btst    al,0 +                jz      WLoop +                btst    al,2            ; Daten oder Status ? +                jnz     ErrEnd          ; wenn jetzt Status, ist etwas schief gelaufen +                push    cx              ; ansonsten Sektor auslesen +                mov     cx,SecSize +                call    SendBlock +                pop     cx +                dec     cl +                add     si,SecSize +                jnz     WLoop           ; und n„chsten Sektor verarbeiten + +ErrEnd:         call    BuildStatus +                call    TranslateStatus + +                pop     es              ; Register zurck +                pop     si +                pop     dx +                pop     cx +                pop     bx + +                ret + +                endp + +;****************************************************************************** +;* Laufwerk formatieren                                                       * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Interleave                                        * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc FormatUnit + +                push    bx              ; Register retten +                push    cx +                push    dx +                push    si +                push    di +                push    es +  +                mov     bx,ax           ; Interleave & Laufwerk retten +                 +                mov     ax,ds           ; vorher noch den Sektorpuffer im +                mov     es,ax           ; Controller ausnullen +                lea     di,[SectorBuffer] +                mov     cx,SecSize/2 +                sub     ax,ax +                rep     stosw +                call    InitCmdBuf +                mov     al,Cmd_WriteBuffer +                call    ExecCmd +                lea     si,[SectorBuffer] +                mov     cx,SecSize +                call    SendBlock +                call    BuildStatus +                jc      End             ; unwahrscheinlich, aber... + +                call    InitCmdBuf      ; Puffer initialisieren +                mov     al,bl           ; Laufwerk wieder zurck +                mov     ah,0            ; Startkopf ist 0 +                call    SetDriveEnv +                mov     [CmdBuf+4],bh   ; Interleave einschreiben +                mov     al,Cmd_FormatDisk ; Formatieren triggern +                call    ExecCmd + +ErrEnd:         call    BuildStatus +End:            call    TranslateStatus + +                pop     es              ; Register zurck +                pop     di +                pop     si +                pop     dx +                pop     cx +                pop     bx + +                ret + +                endp + +;****************************************************************************** +;* Spur formatieren                                                           * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Kopf                                              * +;*                     BX = Zylinder                                          * +;*                     CL = Interleave                                        * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc FormatTrack + +                push    bx +                push    cx + +                call    InitCmdBuf      ; Parameter einschreiben +                call    SetDriveEnv +                mov     ch,1            ; Sektorinformation muá nur gltig sein +                call    SetTransParams +                mov     al,Cmd_FormatTrack +                call    ExecCmd +                call    BuildStatus + +                pop     cx +                pop     bx +                ret + +                endp + +;****************************************************************************** +;* Spur als defekt markieren                                                  * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Kopf                                              * +;*                     BX = Zylinder                                          * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc MarkBad + +                push    bx +                push    cx + +                call    InitCmdBuf      ; Parameter einschreiben +                call    SetDriveEnv +                mov     cx,0103h        ; Sektorinformation muá nur gltig sein +                call    SetTransParams +                mov     al,Cmd_FormatBad +                call    ExecCmd +                call    BuildStatus + +                pop     cx +                pop     bx +                ret + +                endp + +                endsection diff --git a/tests/t_secdrive/wd1003at.inc b/tests/t_secdrive/wd1003at.inc new file mode 100644 index 0000000..7714eec --- /dev/null +++ b/tests/t_secdrive/wd1003at.inc @@ -0,0 +1,952 @@ +;****************************************************************************** +;*                                                                            * +;*  Includedatei fr SECMAIN.ASM                                              * +;*  liefert low-level-Routinen fr SecMain                                    * +;*  Version hier fr WD1003-kompatible Kontroller:                            * +;*  MFM, RLL, ESDI, AT-Bus                                                    * +;*                                                                            * +;*  Historie: 28.12.1994 herberkopiert aus Hauptmodul                        * +;*            30.12.1994 LowLevelIdent                                        * +;*            19. 1.1995 Workaround fr LCS6220                               * +;****************************************************************************** + +                section wd1003at + +Base1           equ     170h            ; Basisadresse Task-File +Base2           equ     370h            ; Basisadresse Floppy-Teil +Task_Data       equ     Base1+0         ; Datentransferregister (R/W) +Task_Error      equ     Base1+1         ; genauerer Fehlercode (R) +Task_PreComp    equ     Base1+1         ; erster Zylinder Pr„komp. (/4, nur W) +Task_SecCnt     equ     Base1+2         ; Zahl zu transferierender Sektoren (R/W) +Task_SecNum     equ     Base1+3         ; Startsektor (R/W) +Task_CylLo      equ     Base1+4         ; Startzylinder Bit 0..7 (R/W) +Task_CylHi      equ     Base1+5         ; Startzylinder Bit 8..n (R/W) +Task_DrHead     equ     Base1+6         ; Laufwerk/Startkopf (R/W) +Task_Status     equ     Base1+7         ; Status Laufwerk & Controller (R) +Task_Command    equ     Base1+7         ; Kommando Controller (W) +Task_FDiskReg   equ     Base2+6         ; Bit 3=1: >8 K”pfe + +Cmd_Restore     equ     10h             ; Kommando: Rekalibrieren +Cmd_Seek        equ     70h             ; Kommando: Zylinder anfahren +Cmd_Read        equ     20h             ; Kommando: Sektoren lesen +Cmd_Write       equ     30h             ; Kommando: Sektoren schreiben +Cmd_Format      equ     50h             ; Kommando: Spur formatieren +Cmd_Verify      equ     40h             ; Kommando: Sektoren auf Lesbarkeit prfen +Cmd_Diagnose    equ     90h             ; Kommando: Selbsttest +Cmd_SetParams   equ     91h             ; Kommando: Laufwerksparameter setzen + +                proc    WriteParams + +                mov     [axsave],ax +                mov     [cxsave],cx +                PrChar  ' ' +                mov     ax,bx +                mov     cl,5 +                call    WriteDec +                PrChar  ' ' +                mov     al,byte ptr[axsave+1] +                mov     ah,0 +                mov     cl,2 +                call    WriteDec +                PrChar  ' ' +                mov     al,byte ptr[cxsave+1] +                mov     ah,0 +                mov     cl,2 +                call    WriteDec +                PrChar  ' ' +                mov     al,byte ptr[cxsave] +                mov     ah,0 +                mov     cl,2 +                call    WriteDec +                PrChar  ' ' +                mov     ax,es +                mov     cl,4 +                call    WriteHex +                PrChar  ':' +                mov     ax,bp +                mov     cl,4 +                call    WriteHex +                mov     ax,[axsave] +                mov     cx,[cxsave] +                ret + +cxsave          dw      ? +axsave          dw      ? + +                endp + +;****************************************************************************** +;* Workaround fr LCS6220: Wird direkt nach dem Einschalten ein Seek ausge-   * +;* fhrt, gibt der Kontroller f„lschlicherweise Daten aus und blockiert alle  * +;* weiteren Kommandos.  Diese Routine r„umt einfach den Puffer leer...        * +;****************************************************************************** + +                proc    ClearBuffer + +                push    dx              ; Register retten +                push    ax + +RdLoop:         mov     dx,Task_Status  ; Bit 3 noch gesetzt ? +                in      al,dx +                btst    al,3 +                jz      RdLoopEnd       ; nein --> fertig +                mov     dx,Task_Data +                in      ax,dx +                jmp     RdLoop +RdLoopEnd: +                pop     ax              ; Register zurck +                pop     dx + +                ret + +                endp + +;****************************************************************************** +;* Interleave-Tabelle berechnen                                               * +;*            In    :   AL = Sektorzahl                                       * +;*                      AH = Interleave                                       * +;*                      DH = Bad-Flag                                         * +;****************************************************************************** + +                proc    SetInterleaveBuffer + +                pusha                   ; Register retten +                push    es + +                push    ax              ; Sektorpuffer initialisieren +                mov     ax,ds +                mov     es,ax +                sub     ax,ax +                lea     di,[SectorBuffer] +                mov     cx,SecSize/2 +                cld +                rep     stosw +                pop     ax + +                sub     di,di           ; DI=Adresse in Puffer=(phys. Sektor-1)*2 +                mov     dl,dh           ; DL = Bad-Flag +                mov     dh,1            ; DH=log. Sektornummer +                mov     cl,al           ; CX=Schleifenz„hler +                mov     ch,0 +                mov     bl,al           ; Sektorzahl*2 nach BX +                mov     bh,0 +                add     bx,bx +                mov     si,ax           ; Interleave*2 nach SI +                shr     si,8 +                add     si,si +InterLoop:      cmp     byte ptr SectorBuffer[di],0 ; Eintrag frei ? +                je      Inter_FreeFound ; ja, beenden +                add     di,2            ; nein, linear weitersuchen +                cmp     di,bx +                jb      InterLoop +                mov     di,0            ; Wrap-Around bercksichtigen +                jmp     InterLoop +Inter_FreeFound:mov     word ptr SectorBuffer[di],dx ; Sektor einschreiben +                add     di,si           ; Interleave-Sprung dazu +                cmp     di,bx           ; Modulo Sektorzahl +                jb      Inter_NoWrap +                sub     di,bx +Inter_NoWrap:   inc     dh              ; n„chster log. Sektor +                loop    InterLoop + +                pop     es              ; Register zurck +                popa + +                ret + +                endp + +;****************************************************************************** +;* Laufwerk und Sonderwerte einprogrammieren                                  * +;*              In  :   AL = Laufwerk                                         * +;*                      AH = Kopf                                             * +;****************************************************************************** + +                proc    SetDriveEnv + +                push    di              ; Register retten +                push    dx +                mov     dx,ax           ; Laufwerk/Kopf retten + +                call    GetPTabAdr      ; Tabellenadresse holen + +                mov     al,dl           ; Laufwerk und Kopf zusammenbauen +                shl     al,4 +                or      al,dh +                or      al,0a0h +                mov     dx,Task_DrHead +                out     dx,al +                mov     ax,[di+DrPar_PrComp] ; Startzylinder Pr„kompensation +                shr     ax,2 +                mov     dl,Lo(Task_PreComp) +                out     dx,al +                mov     al,[di+DrPar_CByte] ; Wert fr Fixed Disk Register +                mov     dx,Task_FDiskReg +                out     dx,al +                call    WaitBusy + +                clc                     ; Ende ohne Fehler +                pop     dx +                pop     di +                ret + +                endp + +;****************************************************************************** +;* Zylinder- und Sektorparameter an Kontroller ausgeben                       * +;*              In  :   BX = Startzylinder                                    * +;*                      CL = Sektorzahl                                       * +;*                      CH = Startsektor                                      * +;****************************************************************************** + +                proc    SetTransParams + +                push    dx              ; Register retten + +                mov     dx,Task_CylLo   ; Startzylinder programmieren +                mov     al,bl +                out     dx,al +                mov     dx,Task_CylHi ;*** +                mov     al,bh +                out     dx,al +                mov     dx,Task_SecNum ; Startsektor... ;*** +                mov     al,ch +                out     dx,al +                mov     dx,Task_SecCnt ; ...und Sektorzahl ;*** +                mov     al,cl +                out     dx,al + +                pop     dx             ; Register zurck +                ret + +                endp + +;****************************************************************************** +;* warten, bis Controller bereit oder Fehler                                  * +;*              Out :   AL = letzter Status                                   * +;****************************************************************************** + +                proc    WaitBusy + +                push    dx              ; Register retten +                mov     dx,Task_Status  ; auf Statusregister +Loop:           in      al,dx           ; Status lesen +                btst    al,7            ; Bit 7 noch gesetzt ? +                jnz     Loop            ; ja--> weiter pollen +                pop     dx              ; Register zurck +                ret + +                endp + +;****************************************************************************** +;* warten, bis Laufwerk bereit                                                * +;*              Out :   AL = letzter Status                                   * +;****************************************************************************** + +                proc    WaitDrive + +                push    dx              ; Register retten +                mov     dx,Task_Status  ; auf Statusregister +Loop:           in      al,dx           ; Status lesen +                btst    al,7            ; Bit 7 = 0 ? ( Controller Busy ) +                jnz     Loop +                btst    al,6            ; Bit 6 = 1 ? ( Drive not Ready ) +                jz      Loop +                btst    al,4            ; Bit 4 = 1 ? ( Seek not complete ) +                jz      Loop +                pop     dx +                ret + +                endp + +;****************************************************************************** +;* warten, bis Datentransfer erforderlich                                     * +;*              Out :   AL = letzter Status                                   * +;*                      C = 1, falls Fehler                                   * +;****************************************************************************** + +                proc    WaitData + +                push    dx              ; Register retten +                mov     dx,Task_Status  ; auf Statusregister +Loop:           in      al,dx           ; Status lesen +                btst    al,7            ; Bit 7 = 0 ? +                jnz     Loop +                btst    al,3            ; Bit 3 = 1 ? +                jz      Loop +                pop     dx              ; Register zurck +                ret + +                endp + +;****************************************************************************** +;* Status bilden                                                              * +;*              Out : C+AX = Status                                           *  +;****************************************************************************** + +                proc    BuildError + +                push    dx              ; Register retten + +                mov     dx,Task_Status  ; Statusregister lesen +                in      al,dx +                mov     ah,al +                btst    ah,0            ; Fehlerflag gesetzt ? +                clc +                jz      End             ; kein Fehler +                 +                mov     dx,Task_Error   ; ja: Error-Register lesen ;*** +                in      al,dx +                stc + +End:            pop     dx              ; Register zurck +                ret + +                endp + +;****************************************************************************** +;* Begráungsmeldung ausgeben:                                                * +;****************************************************************************** + +                globproc LowLevelIdent + +                push    ax              ; Register retten + +                PrMsg   IdentMsg + +                pop     ax + +                ret + +IdentMsg        db      "Low-Level-Routinen fr WD1003-WAH und kompatible Controller",CR,LF,'$' + +                endp + +;****************************************************************************** +;* Controller-Diagnose:                                                       * +;*              Out :  AL = Diagnosecode                                      * +;****************************************************************************** + +                globproc ContDiag + +                push    cx              ; Register retten +                push    dx + +                mov     dx,Task_Status  ; das erste Mal mit Timeout warten +                sub     cx,cx +BWait:          in      al,dx +                btst    al,7            ; auf NOT BUSY warten +                loopnz  BWait           ; oder bis 64K Durchl„ufe durch +                or      cx,cx           ; Timeout ? +                jne     NTOut +                mov     al,Diag_Timeout ; ja: Fehlercode setzen... +                jmp     End             ; ...und Feierabend + +NTOut:          mov     al,CMD_Diagnose ; Selbsttest starten +                mov     dl,Lo(Task_Command) +                out     dx,al +                call    WaitBusy        ; auf Fertigstellung warten +                mov     dl,Lo(Task_Error) ; Ergebnis laden +                in      al,dx + +End:            pop     dx              ; Register zurck +                pop     cx +                ret + +                endp + +;****************************************************************************** +;* Dem Kontroller die Laufwerksgeometrie mitteilen                            * +;*              In  :   AL = Laufwerk                                         * +;*              Out :   C  = 1-->Fehler                                       * +;****************************************************************************** + +                globproc SetDriveParams + +                push    di              ; Register retten +                push    dx +                mov     dl,al           ; Laufwerk retten + +                call    GetPTabAdr      ; Adresse Parametertabelle holen + +                call    WaitBusy        ; Kontroller muá frei sein + +                mov     al,dl           ; Kopfzahl/Laufwerk vorbesetzen +                shl     al,4 +                mov     ah,[di+DrPar_Heads] +                dec     ah              ; Maximalnummer anstelle Gesamtzahl +                or      al,ah +                or      al,0a0h +                mov     dx,Task_DrHead +                out     dx,al +                mov     dl,Lo(Task_SecCnt) ; Sektorzahl setzen +                mov     al,[di+DrPar_NSecs] +                out     dx,al + +                mov     dl,Lo(Task_Command) ; Parameter bertragen +                mov     al,Cmd_SetParams +                out     dx,al + +                call    WaitBusy        ; auf Fertigstellung warten + +                clc                     ; Ende ohne Fehler +                pop     dx +                pop     di +                ret + +                endp + +;****************************************************************************** +;* Laufwerk rekalibrieren, gleichzeitig Test, ob vorhanden                    * +;*              In  :  AL = Laufwerk                                          * +;*              Out :  C + AX = Status                                        * +;****************************************************************************** + +                globproc Recalibrate + +                push    cx              ; Register retten +                push    dx + +                mov     cx,ax           ; Laufwerk retten +                call    WaitBusy        ; warten, bis Controller frei + +                mov     dx,Task_DrHead  ; Laufwerk eintragen +                mov     al,cl +                shl     al,4 +                add     al,0a0h +                out     dx,al + +                mov     dl,Lo(Task_Status) ; Laufwerk muss jetzt bereit sein, +                in      al,dx           ; da sich einige Kontroller sonst im +                and     al,50h          ; folgenden aufh„ngen, falls +                cmp     al,50h          ; keine Platte angeschlossen ist. +                stc                     ; falls nicht bereit, Fehler simulieren +                mov     al,4            ; "Aborted Command" +                jne     TotEnde +                mov     al,0 +                mov     dl,Lo(Task_CylLo) ; erstmal auf die sanfte Tour: +                out     dx,al           ; Spur 0 anfahren +                mov     dl,Lo(Task_CylHi) +                out     dx,al +                mov     dl,Lo(Task_Command) +                mov     al,Cmd_Seek +                out     dx,al +                call    WaitBusy +                call    BuildError +                jnc     Ende            ; wenn OK: fertig + +                call    ClearBuffer     ; falls sich der Longshine verheddert... +                mov     dl,Lo(Task_Command) ; 2. Anlauf: echtes Restore +                mov     al,Cmd_Restore +                out     dx,al + +                call    WaitBusy        ; auf Controller warten + +Ende:           call    BuildError      ; Status einlesen +TotEnde: +                pop     dx              ; Register zurck +                pop     cx +                ret + +                endp + +;****************************************************************************** +;* Sektor(en) lesen                                                           * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Startkopf                                         * +;*                     BX = Startzylinder                                     * +;*                     CL = Sektorzahl                                        * +;*                     CH = Startsektor                                       * +;*                     ES:DI = Zeiger auf Datenpuffer                         * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc ReadSectors + +                push    si              ; Register sichern +                push    dx +                push    bp + +                if      debug +                 PrChar  'R' +                 mov     bp,di +                 call    WriteParams +                endif + +                sub     bp,bp           ; Fehlerz„hler auf 0 + +Retry:          push    ax              ; Parameter sichern +                push    bx +                push    cx +                push    di + +                mov     si,ax           ; Laufwerk/Kopf retten +                call    WaitBusy        ; warten, bis Ruhe im Wald + +                mov     ax,si +                call    SetDriveEnv     ; Laufwerk jetzt schon setzen, damit +                                        ; korr. Ready-Signal abgefragt wird +                call    WaitDrive       ; bis Laufwerk bereit + +                call    SetTransParams  ; restliche Parameter ausgeben + +                mov     ch,0            ; Sektorzahl nach SI +                mov     si,cx +                mov     dx,Task_Command     ; Kommando triggern +                mov     al,Cmd_Read      +                out     dx,al + +                mov     dx,Task_Data    ; Vorbereitung fr INSW +                cld +Loop:           call    WaitBusy        ; auf gelesenen Sektor warten +                btst    al,0            ; Fehler ? +                jnz     Again           ; -->neu aufsetzen +                call    WaitData         +                btst    al,0 +                jnz     Again +                call    WaitDrive +                btst    al,0 +                jnz     Again +                mov     cx,SecSize/2    ; Daten transferieren +                rep     insw            ; bagger, schaufel +                dec     si              ; n„chster Sektor +                jnz     Loop + +End:            pop     di              ; Parameter nicht mehr gebraucht +                pop     cx +                pop     bx +                pop     ax +Term:           if      debug +                 PrChar  CR +                 PrChar  LF +                endif +                call    BuildError +                pop     bp +                pop     dx +                pop     si + +                ret + +Again:          inc     bp              ; Fehlerz„hler rauf +                cmp     bp,MaxRetry     ; zu oft aufgetreten ? +                jae     End + +                pop     di              ; nein: Parameter vom Stack +                pop     cx +                pop     bx +                pop     ax +                mov     si,ax           ; Laufwerk retten +                call    Recalibrate     ; auf Spur 0 zurck +                jc      Term            ; bei erneutem Fehler Abbruch +                mov     ax,si +                call    SetDriveParams  ; Parameter neu initialisieren +                mov     ax,si +                jmp     Retry           ; neuer Versuch + +  +              endp + +;****************************************************************************** +;* Sektor(en) verifizieren                                                    * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Startkopf                                         * +;*                     BX = Startzylinder                                     * +;*                     CL = Sektorzahl                                        * +;*                     CH = Startsektor                                       * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc VeriSectors + +                push    si              ; Register sichern +                push    dx +                push    bp + +                if      debug +                 PrChar  'V' +                 mov     bp,0 +                 call    WriteParams +                endif + +                sub     bp,bp           ; Fehlerz„hler auf 0 + +Retry:          push    ax              ; Parameter sichern +                push    bx +                push    cx + +                mov     si,ax           ; Laufwerk/Kopf retten +                call    WaitBusy        ; warten, bis Ruhe im Wald + +                mov     ax,si +                call    SetDriveEnv     ; Laufwerk jetzt schon setzen, damit +                                        ; korr. Ready-Signal abgefragt wird +                call    WaitDrive       ; bis Laufwerk bereit + +                call    SetTransParams  ; restliche Parameter ausgeben + +                mov     dx,Task_Command ; Kommando triggern +                mov     al,Cmd_Verify +                out     dx,al + +                call    WaitBusy        ; auf Fertigstellung warten +                mov     cx,16           ; einige Kontroller brauchen +DelStat:        loop    DelStat         ; etwas fr das Fehlerflag +                mov     dx,Task_Status +                in      al,dx +                btst    al,0            ; Fehler ? +                jnz     Again           ; -->neu aufsetzen +                call    WaitDrive +                btst    al,0 +                jnz     Again + +Ende:           pop     cx              ; Parameter nicht mehr gebraucht +                pop     bx +                pop     ax +Term:           if      debug +                 PrChar  CR +                 PrChar  LF +                endif +                call    BuildError +                pop     bp +                pop     dx +                pop     si + +                ret + +Again:          inc     bp             ; Fehlerz„hler rauf +                cmp     bp,MaxRetry    ; zu oft aufgetreten ? +                jae     Ende + +                pop     cx              ; nein: Parameter vom Stack +                pop     bx +                pop     ax +                mov     si,ax           ; Laufwerk retten +                call    Recalibrate     ; auf Spur 0 zurck +                jc      Term            ; bei erneutem Fehler Abbruch +                mov     ax,si +                call    SetDriveParams  ; Parameter neu initialisieren +                mov     ax,si +                jmp     Retry           ; neuer Versuch +                mov     ax,si +                endp + +;****************************************************************************** +;* Sektor(en) schreiben                                                       * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Startkopf                                         * +;*                     BX = Startzylinder                                     * +;*                     CL = Sektorzahl                                        * +;*                     CH = Startsektor                                       * +;*                     ES:SI = Zeiger auf Datenpuffer                         * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc WriteSectors + +                push    di              ; Register sichern +                push    dx +                push    bp + +                if      debug +                 PrChar  'W' +                 mov     bp,si +                 call    WriteParams +                endif + +                xor     bp,bp           ; Fehlerz„hler auf 0 + +Retry:          push    ax              ; Parameter sichern +                push    bx +                push    cx +                push    si + +                mov     di,ax           ; Laufwerk/Kopf retten +                call    WaitBusy        ; warten, bis Ruhe im Wald + +                mov     ax,di +                call    SetDriveEnv     ; Laufwerk jetzt schon setzen, damit +                                        ; korr. Ready-Signal abgefragt wird +                call    WaitDrive       ; bis Laufwerk bereit + +                call    SetTransParams  ; restliche Parameter ausgeben + +                mov     ch,0            ; Sektorzahl nach DI +                mov     di,cx +                mov     dx,Task_Command ; Kommando triggern +                mov     al,Cmd_Write +                out     dx,al + +                mov     dx,Task_Data    ; Vorbereitung fr OUTSW +                cld +Loop:           call    WaitBusy        ; auf Datenbereitschaft warten +                btst    al,0            ; Fehler ? +                jnz     Again           ; ja-->neu aufsetzen +                call    WaitData +                btst    al,0 +                jnz     Again +                call    WaitDrive +                btst    al,0 +                jnz     Again +                mov     cx,SecSize/2    ; Daten transferieren +                seges +                rep     outsw           ; bagger, schaufel +                call    WaitBusy        ; warten, bis Transfer fertig +                btst    al,0 +                jnz     Again +                dec     di              ; n„chster Sektor +                jnz     Loop + +End:            pop     si              ; Parameter nicht mehr gebraucht +                pop     cx +                pop     bx +                pop     ax +Term:           if      debug +                 PrChar  CR +                 PrChar  LF +                endif +                call    BuildError +                pop     bp +                pop     dx +                pop     di + +                ret + +Again:          inc     bp              ; Fehlerz„hler rauf +                cmp     bp,MaxRetry     ; zu oft aufgetreten ? +                jae     End + +                pop     si              ; nein: Parameter vom Stack +                pop     cx +                pop     bx +                pop     ax +                mov     di,ax           ; Laufwerk retten +                call    Recalibrate     ; auf Spur 0 zurck +                jc      Term            ; bei erneutem Fehler Abbruch +                mov     ax,di +                call    SetDriveParams  ; Parameter neu initialisieren +                mov     ax,di +                jmp     Retry           ; neuer Versuch + +                endp + +;****************************************************************************** +;* Laufwerk formatieren                                                       * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Interleave                                        * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc FormatUnit + +                push    bx +                push    cx +                push    dx +                push    si +                push    di +                push    bp + +                mov     bx,ax           ; Interleave retten +                PrMsg   ESCMsg +                mov     ax,bx +                call    GetPTabAdr      ; Parametertabelle->DI +                mov     ax,bx +                mov     dh,0            ; gute Spuren schreiben +                mov     al,[di+DrPar_NSecs] +                call    SetInterleaveBuffer ; Tabelle berechnen +                mov     ax,bx +                call    Recalibrate     ; Kontroller reinitialisieren +                jc      Fin +                mov     ax,bx +                mov     bp,[di+DrPar_Cyls] ; Zylinderz„hler in BP (abw„rts) +                dec     bp +                mov     dl,al           ; Laufwerk in DL +                cld +CylLoop:        mov     dh,0            ; Kopf in dh +HeadLoop:       call    WaitBusy        ; warten, bis WD1003 frei +                call    WriteCoords     ; Bildschirmausgabe +                mov     ax,dx           ; Laufwerk+Kopf progr. +                call    SetDriveEnv +                mov     bx,bp           ; Zylinder+Sektor progr. +                mov     cl,[di+DrPar_NSecs] +                mov     ch,1 +                call    SetTransParams +                mov     bx,dx +                mov     dx,Task_Command +                mov     al,Cmd_Format +                out     dx,al +                call    WaitData        ; Sektortabelle schicken +                mov     cx,SecSize/2 +                mov     dx,Task_Data +                lea     si,[SectorBuffer] +                rep     outsw +                call    WaitBusy        ; warten, bis Kontroller fertig +                shr     al,1            ; Fehlerbit in Carry laden +                jnc     GoOn +                PrMsg   ErrorMsg        ; falls Fehler, Meldung ausgeben +                mov     dx,bx +                call    WriteCoords +                PrChar  LF +GoOn:           mov     dx,bx           ; Laufwerk und Kopf zurck +                call    BreakOnESC      ; will der Benutzer abbrechen ? +                jc      UserTerm        ; ja, Abbruch +                inc     dh              ; n„chster Kopf +                cmp     dh,[di+DrPar_Heads] +                jb      HeadLoop +                dec     bp              ; n„chster Zylinder +                jns     CylLoop +TermLoop:       mov     al,dl           ; damit die Seek-Rate wieder stimmt +                call    Recalibrate + +Fin:            push    ax              ; Fehlerstatus halten +                pushf +                PrChar  LF +                popf                    ; Fehlerstatus zurck +                pop     ax +                pop     bp +                pop     di +                pop     si +                pop     dx +                pop     cx +                pop     bx +                ret + +UserTerm:       mov     al,dl           ; Abbruch durch Benutzer: noch schnell +                call    Recalibrate     ; rekalibrieren +                jc      Fin             ; Fehler dabei ? +                stc                     ; Ansonsten Sonderfehlercode +                mov     al,DErr_UserTerm +                jmp     Fin + +WriteCoords:    push    ax              ; Kopf/Zylinder ausgeben +                push    cx + +                PrMsg   CylMsg +                mov     ax,bp +                mov     cl,6 +                call    WriteDec +                PrMsg   HeadMsg +                mov     al,dh +                mov     ah,0 +                mov     cl,3 +                call    WriteDec +                PrChar  CR + +                pop     cx +                pop     ax +                ret + +ESCMsg:         db      "Abbruch mit <ESC>",CR,LF,'$' +CylMsg:         db      "Zylinder $" +HeadMsg:        db      ", Kopf $" +ErrorMsg:       db      "Formatierfehler auf $" + +                endp + +;****************************************************************************** +;* Spur formatieren                                                           * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Kopf                                              * +;*                     BX = Zylinder                                          * +;*                     CL = Interleave                                        * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc FormatTrack + +                push    bx              ; Register retten +                push    cx +                push    dx +                push    si +                push    di +                push    bp + +                mov     bp,ax           ; Laufwerk & Kopf retten +                call    Recalibrate     ; Laufwerk sicherheitshalber rekalibrieren +                mov     ax,bp +                call    GetPTabAdr      ; Sektortabelle aufbauen +                mov     dh,0            ; fehlerhafte Sektoren schreiben +                mov     ah,cl           ; Interleave vorgeben +                mov     al,[di+DrPar_NSecs] +                call    SetInterleaveBuffer +                mov     ax,bp           ; Laufwerk und Kopf zurck +                call    SetDriveEnv     ; in Kontroller einprogrammieren +                mov     cl,[di+DrPar_NSecs] ; Sektor& Zylinder einschreiben +                mov     ch,1 +                call    SetTransParams +                mov     dx,Task_Command ; Kommando schicken +                mov     al,Cmd_Format +                out     dx,al +                call    WaitData        ; Sektortabelle schicken +                mov     cx,SecSize/2 +                mov     dx,Task_Data +                lea     si,[SectorBuffer] +                rep     outsw +                call    WaitBusy        ; warten, bis Kontroller fertig +                jc      Fin             ; Abbruch bei Fehler +                mov     ax,bp           ; Laufwerk nochmal rekalibrieren +                call    Recalibrate     ; damit Steprate stimmt + +Fin:            pop     bp +                pop     di +                pop     si +                pop     dx +                pop     cx +                pop     bx +                ret + +                endp + +;****************************************************************************** +;* Spur als defekt markieren                                                  * +;*              In  :  AL = Laufwerk                                          * +;*                     AH = Kopf                                              * +;*                     BX = Zylinder                                          * +;*              Out :  C+AX = Fehlerstatus                                    * +;****************************************************************************** + +                globproc MarkBad + +                push    bx      ; Register retten +                push    cx +                push    dx +                push    si +                push    di +                push    bp + +                mov     bp,ax   ; Laufwerk & Kopf retten +                call    Recalibrate ; Laufwerk sicherheitshalber rekalibrieren +                mov     ax,bp +                call    GetPTabAdr ;Sektortabelle aufbauen +                mov     dh,80h  ; fehlerhafte Sektoren schreiben +                mov     ah,3    ; Interleave ist ziemlich egal... +                mov     al,[di+DrPar_NSecs] +                call    SetInterleaveBuffer +                mov     ax,bp   ; Laufwerk und Kopf zurck +                call    SetDriveEnv ; in Kontroller einprogrammieren +                mov     cl,[di+DrPar_NSecs] ; Sektor& Zylinder einschreiben +                mov     ch,1 +                call    SetTransParams +                mov     dx,Task_Command ; Kommando schicken +                mov     al,Cmd_Format +                out     dx,al +                call    WaitData        ; Sektortabelle schicken +                mov     cx,SecSize/2 +                mov     dx,Task_Data +                lea     si,[SectorBuffer] +                rep     outsw +                call    WaitBusy        ; warten, bis Kontroller fertig +                jc      Fin             ; Abbruch bei Fehler +                mov     ax,bp           ; Laufwerk nochmal rekalibrieren +                call    Recalibrate     ; damit Steprate stimmt + +Fin:            pop     bp +                pop     di +                pop     si +                pop     dx +                pop     cx +                pop     bx +                ret + +                endp + +                endsection diff --git a/tests/t_st6/asflags b/tests/t_st6/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_st6/asflags diff --git a/tests/t_st6/t_st6.asm b/tests/t_st6/t_st6.asm new file mode 100755 index 0000000..7cbdc2b --- /dev/null +++ b/tests/t_st6/t_st6.asm @@ -0,0 +1,82 @@ +        cpu     st6225 + +        nop +        ret +        reti +        stop +        wait + +        jrz     pc +        jrnz    pc+1 +        jrc     pc+2 +        jrnc    pc+3 + +        ld      a,v +        ld      a,w +        ld      a,x +        ld      a,y +        ld      a,12h +        ld      a,(x) +        ld      a,(y) +        ld      v,a +        ld      12h,a +        ld      (x),a +        ld      (y),a + +        ldi     a,12h +        ldi     v,12h +        ldi     12h,12h + +        jp      123h +        call    123h + +        add     a,v +        add     a,12h +        add     a,(x) +        add     a,(y) + +        and     a,v +        and     a,12h +        and     a,(x) +        and     a,(y) + +        cp     a,v +        cp     a,12h +        cp     a,(x) +        cp     a,(y) + +        sub     a,v +        sub     a,12h +        sub     a,(x) +        sub     a,(y) + +        addi    a,12h +        andi    a,12h +        cpi     a,12h +        subi    a,12h + +        clr     a +        clr     v +        clr     12h + +        com     a +        rlc     a +        sla     a + +        inc     a +        inc     v +        inc     12h +        inc     (x) +        inc     (y) + +        dec     a +        dec     v +        dec     12h +        dec     (x) +        dec     (y) + +        set     3,v +        res     5,12h + +        jrs     3,v,pc +        jrr     5,12h,pc+1 diff --git a/tests/t_st6/t_st6.doc b/tests/t_st6/t_st6.doc new file mode 100644 index 0000000..311bc51 --- /dev/null +++ b/tests/t_st6/t_st6.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application ST6 -----------------------------+ +|                                                                            | +|          This is a (synthetic) test of the ST6's instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_st6/t_st6.ori b/tests/t_st6/t_st6.ori Binary files differnew file mode 100755 index 0000000..c7e305a --- /dev/null +++ b/tests/t_st6/t_st6.ori diff --git a/tests/t_st7/asflags b/tests/t_st7/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_st7/asflags diff --git a/tests/t_st7/t_st7.asm b/tests/t_st7/t_st7.asm new file mode 100644 index 0000000..c371c84 --- /dev/null +++ b/tests/t_st7/t_st7.asm @@ -0,0 +1,561 @@ +	cpu	st7 +        page	0 + +        halt +        iret +        nop +        rcf +        ret +        rim +        rsp +        scf +        sim +        trap +        wfi + +        adc	a,#$15 +        adc	a,$12 +        adc	a,$12.w +        adc	a,$1234 +        adc	a,(x) +        adc	a,($12,x) +        adc	a,($12.w,x) +        adc	a,($1234,x) +        adc	a,(y) +        adc	a,($12,y) +        adc	a,($12.w,y) +        adc	a,($1234,y) +	adc	a,[$12] +        adc	a,[$12.w] +        adc	a,([$12],x) +        adc	a,([$12.w],x) +        adc	a,([$12],y) +        adc	a,([$12.w],y) + +        add	a,#$15 +        add	a,$12 +        add	a,$12.w +        add	a,$1234 +        add	a,(x) +        add	a,($12,x) +        add	a,($12.w,x) +        add	a,($1234,x) +        add	a,(y) +        add	a,($12,y) +        add	a,($12.w,y) +        add	a,($1234,y) +	add	a,[$12] +        add	a,[$12.w] +        add	a,([$12],x) +        add	a,([$12.w],x) +        add	a,([$12],y) +        add	a,([$12.w],y) + +        and	a,#$15 +        and	a,$12 +        and	a,$12.w +        and	a,$1234 +        and	a,(x) +        and	a,($12,x) +        and	a,($12.w,x) +        and	a,($1234,x) +        and	a,(y) +        and	a,($12,y) +        and	a,($12.w,y) +        and	a,($1234,y) +	and	a,[$12] +        and	a,[$12.w] +        and	a,([$12],x) +        and	a,([$12.w],x) +        and	a,([$12],y) +        and	a,([$12.w],y) + +        bcp	a,#$15 +        bcp	a,$12 +        bcp	a,$12.w +        bcp	a,$1234 +        bcp	a,(x) +        bcp	a,($12,x) +        bcp	a,($12.w,x) +        bcp	a,($1234,x) +        bcp	a,(y) +        bcp	a,($12,y) +        bcp	a,($12.w,y) +        bcp	a,($1234,y) +	bcp	a,[$12] +        bcp	a,[$12.w] +        bcp	a,([$12],x) +        bcp	a,([$12.w],x) +        bcp	a,([$12],y) +        bcp	a,([$12.w],y) + +        or	a,#$15 +        or	a,$12 +        or	a,$12.w +        or	a,$1234 +        or	a,(x) +        or	a,($12,x) +        or	a,($12.w,x) +        or	a,($1234,x) +        or	a,(y) +        or	a,($12,y) +        or	a,($12.w,y) +        or	a,($1234,y) +	or	a,[$12] +        or	a,[$12.w] +        or	a,([$12],x) +        or	a,([$12.w],x) +        or	a,([$12],y) +        or	a,([$12.w],y) + +        sbc	a,#$15 +        sbc	a,$12 +        sbc	a,$12.w +        sbc	a,$1234 +        sbc	a,(x) +        sbc	a,($12,x) +        sbc	a,($12.w,x) +        sbc	a,($1234,x) +        sbc	a,(y) +        sbc	a,($12,y) +        sbc	a,($12.w,y) +        sbc	a,($1234,y) +	sbc	a,[$12] +        sbc	a,[$12.w] +        sbc	a,([$12],x) +        sbc	a,([$12.w],x) +        sbc	a,([$12],y) +        sbc	a,([$12.w],y) + +        sub	a,#$15 +        sub	a,$12 +        sub	a,$12.w +        sub	a,$1234 +        sub	a,(x) +        sub	a,($12,x) +        sub	a,($12.w,x) +        sub	a,($1234,x) +        sub	a,(y) +        sub	a,($12,y) +        sub	a,($12.w,y) +        sub	a,($1234,y) +	sub	a,[$12] +        sub	a,[$12.w] +        sub	a,([$12],x) +        sub	a,([$12.w],x) +        sub	a,([$12],y) +        sub	a,([$12.w],y) + +        xor	a,#$15 +        xor	a,$12 +        xor	a,$12.w +        xor	a,$1234 +        xor	a,(x) +        xor	a,($12,x) +        xor	a,($12.w,x) +        xor	a,($1234,x) +        xor	a,(y) +        xor	a,($12,y) +        xor	a,($12.w,y) +        xor	a,($1234,y) +	xor	a,[$12] +        xor	a,[$12.w] +        xor	a,([$12],x) +        xor	a,([$12.w],x) +        xor	a,([$12],y) +        xor	a,([$12.w],y) + +        call	$12 +        call	$12.w +        call	$1234 +        call	(x) +        call	($12,x) +        call	($12.w,x) +        call	($1234,x) +        call	(y) +        call	($12,y) +        call	($12.w,y) +        call	($1234,y) +	call	[$12] +        call	[$12.w] +        call	([$12],x) +        call	([$12.w],x) +        call	([$12],y) +        call	([$12.w],y) + +        jp	$12 +        jp	$12.w +        jp	$1234 +        jp	(x) +        jp	($12,x) +        jp	($12.w,x) +        jp	($1234,x) +        jp	(y) +        jp	($12,y) +        jp	($12.w,y) +        jp	($1234,y) +	jp	[$12] +        jp	[$12.w] +        jp	([$12],x) +        jp	([$12.w],x) +        jp	([$12],y) +        jp	([$12.w],y) + +        clr	a +        clr	x +        clr	y +        clr	$12 +        clr	(x) +        clr	($12,x) +        clr	(y) +        clr	($12,y) +        clr	[$12] +        clr	([$12],x) +        clr	([$12],y) + +        cpl	a +        cpl	x +        cpl	y +        cpl	$12 +        cpl	(x) +        cpl	($12,x) +        cpl	(y) +        cpl	($12,y) +        cpl	[$12] +        cpl	([$12],x) +        cpl	([$12],y) + +        dec	a +        dec	x +        dec	y +        dec	$12 +        dec	(x) +        dec	($12,x) +        dec	(y) +        dec	($12,y) +        dec	[$12] +        dec	([$12],x) +        dec	([$12],y) + +        inc	a +        inc	x +        inc	y +        inc	$12 +        inc	(x) +        inc	($12,x) +        inc	(y) +        inc	($12,y) +        inc	[$12] +        inc	([$12],x) +        inc	([$12],y) + +        neg	a +        neg	x +        neg	y +        neg	$12 +        neg	(x) +        neg	($12,x) +        neg	(y) +        neg	($12,y) +        neg	[$12] +        neg	([$12],x) +        neg	([$12],y) + +        rlc	a +        rlc	x +        rlc	y +        rlc	$12 +        rlc	(x) +        rlc	($12,x) +        rlc	(y) +        rlc	($12,y) +        rlc	[$12] +        rlc	([$12],x) +        rlc	([$12],y) + +        rrc	a +        rrc	x +        rrc	y +        rrc	$12 +        rrc	(x) +        rrc	($12,x) +        rrc	(y) +        rrc	($12,y) +        rrc	[$12] +        rrc	([$12],x) +        rrc	([$12],y) + +        sla	a +        sla	x +        sla	y +        sla	$12 +        sla	(x) +        sla	($12,x) +        sla	(y) +        sla	($12,y) +        sla	[$12] +        sla	([$12],x) +        sla	([$12],y) + +        sll	a +        sll	x +        sll	y +        sll	$12 +        sll	(x) +        sll	($12,x) +        sll	(y) +        sll	($12,y) +        sll	[$12] +        sll	([$12],x) +        sll	([$12],y) + +        sra	a +        sra	x +        sra	y +        sra	$12 +        sra	(x) +        sra	($12,x) +        sra	(y) +        sra	($12,y) +        sra	[$12] +        sra	([$12],x) +        sra	([$12],y) + +        srl	a +        srl	x +        srl	y +        srl	$12 +        srl	(x) +        srl	($12,x) +        srl	(y) +        srl	($12,y) +        srl	[$12] +        srl	([$12],x) +        srl	([$12],y) + +        swap	a +        swap	x +        swap	y +        swap	$12 +        swap	(x) +        swap	($12,x) +        swap	(y) +        swap	($12,y) +        swap	[$12] +        swap	([$12],x) +        swap	([$12],y) + +        tnz	a +        tnz	x +        tnz	y +        tnz	$12 +        tnz	(x) +        tnz	($12,x) +        tnz	(y) +        tnz	($12,y) +        tnz	[$12] +        tnz	([$12],x) +        tnz	([$12],y) + +        cp      a,#$12 +        cp      a,$12 +        cp      a,$12.w +        cp      a,$1234 +        cp      a,(x) +        cp      a,($12,x) +        cp      a,($12.w,x) +        cp      a,($1234,x) +        cp      a,(y) +        cp      a,($12,y) +        cp      a,($12.w,y) +        cp      a,($1234,y) +        cp      a,[$12] +        cp      a,[$12.w] +        cp      a,([$12],x) +        cp      a,([$12.w],x) +        cp      a,([$12],y) +        cp      a,([$12.w],y) +        cp      x,#$12 +        cp      x,$12 +        cp      x,$12.w +        cp      x,$1234 +        cp      x,(x) +        cp      x,($12,x) +        cp      x,($12.w,x) +        cp      x,($1234,x) +        cp      x,[$12] +        cp      x,[$12.w] +        cp      x,([$12],x) +        cp      x,([$12.w],x) +        cp      y,#$12 +        cp      y,$12 +        cp      y,$12.w +        cp      y,$1234 +        cp      y,(y) +        cp      y,($12,y) +        cp      y,($12.w,y) +        cp      y,($1234,y) +        cp      y,[$12] +        cp      y,[$12.w] +        cp      y,([$12],y) +        cp      y,([$12.w],y) + +        ld      a,#$12 +        ld      a,$12 +        ld      a,$12.w +        ld      a,$1234 +        ld      a,(x) +        ld      a,($12,x) +        ld      a,($12.w,x) +        ld      a,($1234,x) +        ld      a,(y) +        ld      a,($12,y) +        ld      a,($12.w,y) +        ld      a,($1234,y) +        ld      a,[$12] +        ld      a,[$12.w] +        ld      a,([$12],x) +        ld      a,([$12.w],x) +        ld      a,([$12],y) +        ld      a,([$12.w],y) +        ld      a,x +        ld      a,y +        ld      a,s +        ld      x,#$12 +        ld      x,$12 +        ld      x,$12.w +        ld      x,$1234 +        ld      x,(x) +        ld      x,($12,x) +        ld      x,($12.w,x) +        ld      x,($1234,x) +        ld      x,[$12] +        ld      x,[$12.w] +        ld      x,([$12],x) +        ld      x,([$12.w],x) +        ld      x,a +        ld      x,y +        ld      x,s +        ld      y,#$12 +        ld      y,$12 +        ld      y,$12.w +        ld      y,$1234 +        ld      y,(y) +        ld      y,($12,y) +        ld      y,($12.w,y) +        ld      y,($1234,y) +        ld      y,[$12] +        ld      y,[$12.w] +        ld      y,([$12],y) +        ld      y,([$12.w],y) +        ld      y,a +        ld      y,x +        ld      y,s +        ld      s,a +        ld      s,x +        ld      s,y +        ld      $12,a +        ld      $12.w,a +        ld      $1234,a +        ld      (x),a +        ld      ($12,x),a +        ld      ($12.w,x),a +        ld      ($1234,x),a +        ld      (y),a +        ld      ($12,y),a +        ld      ($12.w,y),a +        ld      ($1234,y),a +        ld      [$12],a +        ld      [$12.w],a +        ld      ([$12],x),a +        ld      ([$12.w],x),a +        ld      ([$12],y),a +        ld      ([$12.w],y),a +        ld      $12,x +        ld      $12.w,x +        ld      $1234,x +        ld      (x),x +        ld      ($12,x),x +        ld      ($12.w,x),x +        ld      ($1234,x),x +        ld      [$12],x +        ld      [$12.w],x +        ld      ([$12],x),x +        ld      ([$12.w],x),x +        ld      $12,y +        ld      $12.w,y +        ld      $1234,y +        ld      (y),y +        ld      ($12,y),y +        ld      ($12.w,y),y +        ld      ($1234,y),y +        ld      [$12],y +        ld      [$12.w],y +        ld      ([$12],y),y +        ld      ([$12.w],y),y + +        bres    $12,#5 +        bres    [$12],#2 +        bset    $12,#5 +        bset    [$12],#2 + +        btjf    $12,#5,pc +        btjf    [$12],#2,pc +        btjt    $12,#5,pc +        btjt    [$12],#2,pc + +        callr   pc +        jra     pc +        jrc     pc +        jreq    pc +        jrf     pc +        jrh     pc +        jrih    pc +        jril    pc +        jrm     pc +        jrmi    pc +        jrnc    pc +        jrne    pc +        jrnh    pc +        jrnm    pc +        jrpl    pc +        jrt     pc +        jruge   pc +        jrugt   pc +        jrule   pc +        jrult   pc + +        callr   [$12] +        jra     [$12] +        jrc     [$12] +        jreq    [$12] +        jrf     [$12] +        jrh     [$12] +        jrih    [$12] +        jril    [$12] +        jrm     [$12] +        jrmi    [$12] +        jrnc    [$12] +        jrne    [$12] +        jrnh    [$12] +        jrnm    [$12] +        jrpl    [$12] +        jrt     [$12] +        jruge   [$12] +        jrugt   [$12] +        jrule   [$12] +        jrult   [$12] + +        mul     x,a +        mul     y,a + +        push    a +        push    x +        push    y +        push    cc +        pop     a +        pop     x +        pop     y +        pop     cc + + diff --git a/tests/t_st7/t_st7.doc b/tests/t_st7/t_st7.doc new file mode 100644 index 0000000..d318126 --- /dev/null +++ b/tests/t_st7/t_st7.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application ST7 -----------------------------+ +|                                                                            | +|          This is a (synthetic) test of the ST7's instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_st7/t_st7.ori b/tests/t_st7/t_st7.ori Binary files differnew file mode 100644 index 0000000..8813d35 --- /dev/null +++ b/tests/t_st7/t_st7.ori diff --git a/tests/t_st9/asflags b/tests/t_st9/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_st9/asflags diff --git a/tests/t_st9/t_st9.asm b/tests/t_st9/t_st9.asm new file mode 100644 index 0000000..f2a3714 --- /dev/null +++ b/tests/t_st9/t_st9.asm @@ -0,0 +1,1243 @@ +        cpu     st9040 +        page	0 + +        include regst9 + +        ccf +        di +        ei +        halt +        iret +        nop +        rcf +        ret +        scf +        sdm +        spm +        wfi + +;---------------------------------------- + +        adc	r5,r13 +	adc	r7,(r12) +        adc	R100,R130 +        adc	r7,R22 +        adc	R70,r11 +        adc	(r7),R32 +        adc	(r7),r11 + +        adc	R32,(r5) +        adc	R13,(rr4) +        adc	r13,(rr4) +        adc	R13,(rr4)+ +        adc	r13,(rr4)+ +        adc	R13,-(rr4) +        adc	r13,-(rr4) +        adc	r10,rr12(rr6) +        adc	R11,123(rr8) +        adc	r11,123(rr8) +	adc	r3,1234h +        adc	R11,1234(rr8) +        adc	r11,1234(rr8) + +        adc	(rr4),R13 +        adc	(rr4),r13 +        adc	(rr4)+,R13 +        adc	(rr4)+,r13 +        adc	-(rr4),R13 +        adc	-(rr4),r13 +        adc	rr12(rr6),r10 +        adc	123(rr8),R11 +        adc	123(rr8),r11 +        adc	1234h,r3 +        adc	1234(rr8),R11 +        adc	1234(rr8),r11 + +        adc	(RR4),(rr8) +        adc	(rr4),(rr8) + +        adc	R14,#12h +        adc	r14,#12h +        adc	(rr6),#12h +        adc	1234h,#12h + + +        adcw    rr4,rr12 +        adcw	RR100,RR130 +        adcw	rr6,RR22 +        adcw	RR70,rr10 +        adcw	(r7),RR32 +        adcw	(r7),rr10 +        adcw	RR32,(r5) +        adcw	rr6,(r12) + +        adcw	rr12,(rr4) +        adcw	RR12,(rr4) +        adcw	RR12,(rr4)+ +        adcw	rr12,(rr4)+ +        adcw	RR12,-(rr4) +        adcw	rr12,-(rr4) +        adcw    rr10,rr12(rr6) +        adcw	RR10,123(rr8) +        adcw	rr10,123(rr8) +	adcw	rr2,1234h +        adcw	RR10,1234(rr8) +        adcw	rr10,1234(rr8) + +        adcw	(rr4),rr12 +        adcw	(rr4),RR12 +        adcw	(rr4)+,RR12 +        adcw	(rr4)+,rr12 +        adcw	-(rr4),RR12 +        adcw	-(rr4),rr12 +        adcw	rr12(rr6),rr10 +        adcw	123(rr8),RR10 +        adcw	123(rr8),rr10 +        adcw	1234h,rr2 +        adcw	1234(rr8),RR10 +        adcw	1234(rr8),rr10 + +        adcw	(rr4),(rr8) + +        adcw	RR14,#1234h +        adcw	rr14,#1234h +        adcw	(rr6),#1234h +        adcw	123(rr6),#1234h +        adcw	1234(rr6),#1234h +        adcw	1234h,#1234h + +;--------------------------------------------- + +        add	r5,r13 +	add	r7,(r12) +        add	R100,R130 +        add	r7,R22 +        add	R70,r11 +        add	(r7),R32 +        add	(r7),r11 +        add	R32,(r5) + +        add	R13,(rr4) +        add	r13,(rr4) +        add	R13,(rr4)+ +        add	r13,(rr4)+ +        add	R13,-(rr4) +        add	r13,-(rr4) +        add	r10,rr12(rr6) +        add	R11,123(rr8) +        add	r11,123(rr8) +	add	r3,1234h +        add	R11,1234(rr8) +        add	r11,1234(rr8) + +        add	(rr4),R13 +        add	(rr4),r13 +        add	(rr4)+,R13 +        add	(rr4)+,r13 +        add	-(rr4),R13 +        add	-(rr4),r13 +        add	rr12(rr6),r10 +        add	123(rr8),R11 +        add	123(rr8),r11 +        add	1234h,r3 +        add	1234(rr8),R11 +        add	1234(rr8),r11 + +        add	(RR4),(rr8) +        add	(rr4),(rr8) + +        add	R14,#12h +        add	r14,#12h +        add	(rr6),#12h +        add	1234h,#12h + + +        addw    rr4,rr12 +        addw	RR100,RR130 +        addw	rr6,RR22 +        addw	RR70,rr10 +        addw	(r7),RR32 +        addw	(r7),rr10 +        addw	RR32,(r5) +        addw	rr6,(r12) + +        addw	rr12,(rr4) +        addw	RR12,(rr4) +        addw	RR12,(rr4)+ +        addw	rr12,(rr4)+ +        addw	RR12,-(rr4) +        addw	rr12,-(rr4) +        addw    rr10,rr12(rr6) +        addw	RR10,123(rr8) +        addw	rr10,123(rr8) +	addw	rr2,1234h +        addw	RR10,1234(rr8) +        addw	rr10,1234(rr8) + +        addw	(rr4),rr12 +        addw	(rr4),RR12 +        addw	(rr4)+,RR12 +        addw	(rr4)+,rr12 +        addw	-(rr4),RR12 +        addw	-(rr4),rr12 +        addw	rr12(rr6),rr10 +        addw	123(rr8),RR10 +        addw	123(rr8),rr10 +        addw	1234h,rr2 +        addw	1234(rr8),RR10 +        addw	1234(rr8),rr10 + +        addw	(rr4),(rr8) + +        addw	RR14,#1234h +        addw	rr14,#1234h +        addw	(rr6),#1234h +        addw	123(rr6),#1234h +        addw	1234(rr6),#1234h +        addw	1234h,#1234h + +;--------------------------------------------- + +        and	r5,r13 +	and	r7,(r12) +        and	R100,R130 +        and	r7,R22 +        and	R70,r11 +        and	(r7),R32 +        and	(r7),r11 +        and	R32,(r5) + +        and	R13,(rr4) +        and	r13,(rr4) +        and	R13,(rr4)+ +        and	r13,(rr4)+ +        and	R13,-(rr4) +        and	r13,-(rr4) +        and	r10,rr12(rr6) +        and	R11,123(rr8) +        and	r11,123(rr8) +	and	r3,1234h +        and	R11,1234(rr8) +        and	r11,1234(rr8) + +        and	(rr4),R13 +        and	(rr4),r13 +        and	(rr4)+,R13 +        and	(rr4)+,r13 +        and	-(rr4),R13 +        and	-(rr4),r13 +        and	rr12(rr6),r10 +        and	123(rr8),R11 +        and	123(rr8),r11 +        and	1234h,r3 +        and	1234(rr8),R11 +        and	1234(rr8),r11 + +        and	(RR4),(rr8) +        and	(rr4),(rr8) + +        and	R14,#12h +        and	r14,#12h +        and	(rr6),#12h +        and	1234h,#12h + + +        andw    rr4,rr12 +        andw	RR100,RR130 +        andw	rr6,RR22 +        andw	RR70,rr10 +        andw	(r7),RR32 +        andw	(r7),rr10 +        andw	RR32,(r5) +        andw	rr6,(r12) + +        andw	rr12,(rr4) +        andw	RR12,(rr4) +        andw	RR12,(rr4)+ +        andw	rr12,(rr4)+ +        andw	RR12,-(rr4) +        andw	rr12,-(rr4) +        andw    rr10,rr12(rr6) +        andw	RR10,123(rr8) +        andw	rr10,123(rr8) +	andw	rr2,1234h +        andw	RR10,1234(rr8) +        andw	rr10,1234(rr8) + +        andw	(rr4),rr12 +        andw	(rr4),RR12 +        andw	(rr4)+,RR12 +        andw	(rr4)+,rr12 +        andw	-(rr4),RR12 +        andw	-(rr4),rr12 +        andw	rr12(rr6),rr10 +        andw	123(rr8),RR10 +        andw	123(rr8),rr10 +        andw	1234h,rr2 +        andw	1234(rr8),RR10 +        andw	1234(rr8),rr10 + +        andw	(rr4),(rr8) + +        andw	RR14,#1234h +        andw	rr14,#1234h +        andw	(rr6),#1234h +        andw	123(rr6),#1234h +        andw	1234(rr6),#1234h +        andw	1234h,#1234h + +;--------------------------------------------- + +        cp	r5,r13 +	cp	r7,(r12) +        cp	R100,R130 +        cp	r7,R22 +        cp	R70,r11 +        cp	(r7),R32 +        cp	(r7),r11 +        cp	R32,(r5) + +        cp	R13,(rr4) +        cp	r13,(rr4) +        cp	R13,(rr4)+ +        cp	r13,(rr4)+ +        cp	R13,-(rr4) +        cp	r13,-(rr4) +        cp	r10,rr12(rr6) +        cp	R11,123(rr8) +        cp	r11,123(rr8) +	cp	r3,1234h +        cp	R11,1234(rr8) +        cp	r11,1234(rr8) + +        cp	(rr4),R13 +        cp	(rr4),r13 +        cp	(rr4)+,R13 +        cp	(rr4)+,r13 +        cp	-(rr4),R13 +        cp	-(rr4),r13 +        cp	rr12(rr6),r10 +        cp	123(rr8),R11 +        cp	123(rr8),r11 +        cp	1234h,r3 +        cp	1234(rr8),R11 +        cp	1234(rr8),r11 + +        cp	(RR4),(rr8) +        cp	(rr4),(rr8) + +        cp	R14,#12h +        cp	r14,#12h +        cp	(rr6),#12h +        cp	1234h,#12h + + +        cpw	rr4,rr12 +        cpw	RR100,RR130 +        cpw	rr6,RR22 +        cpw	RR70,rr10 +        cpw	(r7),RR32 +        cpw	(r7),rr10 +        cpw	RR32,(r5) +        cpw	rr6,(r12) + +        cpw	rr12,(rr4) +        cpw	RR12,(rr4) +        cpw	RR12,(rr4)+ +        cpw	rr12,(rr4)+ +        cpw	RR12,-(rr4) +        cpw	rr12,-(rr4) +        cpw	rr10,rr12(rr6) +        cpw	RR10,123(rr8) +        cpw	rr10,123(rr8) +	cpw	rr2,1234h +        cpw	RR10,1234(rr8) +        cpw	rr10,1234(rr8) + +        cpw	(rr4),rr12 +        cpw	(rr4),RR12 +        cpw	(rr4)+,RR12 +        cpw	(rr4)+,rr12 +        cpw	-(rr4),RR12 +        cpw	-(rr4),rr12 +        cpw	rr12(rr6),rr10 +        cpw	123(rr8),RR10 +        cpw	123(rr8),rr10 +        cpw	1234h,rr2 +        cpw	1234(rr8),RR10 +        cpw	1234(rr8),rr10 + +        cpw	(rr4),(rr8) + +        cpw	RR14,#1234h +        cpw	rr14,#1234h +        cpw	(rr6),#1234h +        cpw	123(rr6),#1234h +        cpw	1234(rr6),#1234h +        cpw	1234h,#1234h + +;--------------------------------------------- + +        or	r5,r13 +	or	r7,(r12) +        or	R100,R130 +        or	r7,R22 +        or	R70,r11 +        or	(r7),R32 +        or	(r7),r11 +        or	R32,(r5) + +        or	R13,(rr4) +        or	r13,(rr4) +        or	R13,(rr4)+ +        or	r13,(rr4)+ +        or	R13,-(rr4) +        or	r13,-(rr4) +        or	r10,rr12(rr6) +        or	R11,123(rr8) +        or	r11,123(rr8) +	or	r3,1234h +        or	R11,1234(rr8) +        or	r11,1234(rr8) + +        or	(rr4),R13 +        or	(rr4),r13 +        or	(rr4)+,R13 +        or	(rr4)+,r13 +        or	-(rr4),R13 +        or	-(rr4),r13 +        or	rr12(rr6),r10 +        or	123(rr8),R11 +        or	123(rr8),r11 +        or	1234h,r3 +        or	1234(rr8),R11 +        or	1234(rr8),r11 + +        or	(RR4),(rr8) +        or	(rr4),(rr8) + +        or	R14,#12h +        or	r14,#12h +        or	(rr6),#12h +        or	1234h,#12h + + +        orw	rr4,rr12 +        orw	RR100,RR130 +        orw	rr6,RR22 +        orw	RR70,rr10 +        orw	(r7),RR32 +        orw	(r7),rr10 +        orw	RR32,(r5) +        orw	rr6,(r12) + +        orw	rr12,(rr4) +        orw	RR12,(rr4) +        orw	RR12,(rr4)+ +        orw	rr12,(rr4)+ +        orw	RR12,-(rr4) +        orw	rr12,-(rr4) +        orw	rr10,rr12(rr6) +        orw	RR10,123(rr8) +        orw	rr10,123(rr8) +	orw	rr2,1234h +        orw	RR10,1234(rr8) +        orw	rr10,1234(rr8) + +        orw	(rr4),rr12 +        orw	(rr4),RR12 +        orw	(rr4)+,RR12 +        orw	(rr4)+,rr12 +        orw	-(rr4),RR12 +        orw	-(rr4),rr12 +        orw	rr12(rr6),rr10 +        orw	123(rr8),RR10 +        orw	123(rr8),rr10 +        orw	1234h,rr2 +        orw	1234(rr8),RR10 +        orw	1234(rr8),rr10 + +        orw	(rr4),(rr8) + +        orw	RR14,#1234h +        orw	rr14,#1234h +        orw	(rr6),#1234h +        orw	123(rr6),#1234h +        orw	1234(rr6),#1234h +        orw	1234h,#1234h + +;--------------------------------------------- + +        sbc	r5,r13 +	sbc	r7,(r12) +        sbc	R100,R130 +        sbc	r7,R22 +        sbc	R70,r11 +        sbc	(r7),R32 +        sbc	(r7),r11 +        sbc	R32,(r5) + +        sbc	R13,(rr4) +        sbc	r13,(rr4) +        sbc	R13,(rr4)+ +        sbc	r13,(rr4)+ +        sbc	R13,-(rr4) +        sbc	r13,-(rr4) +        sbc	r10,rr12(rr6) +        sbc	R11,123(rr8) +        sbc	r11,123(rr8) +	sbc	r3,1234h +        sbc	R11,1234(rr8) +        sbc	r11,1234(rr8) + +        sbc	(rr4),R13 +        sbc	(rr4),r13 +        sbc	(rr4)+,R13 +        sbc	(rr4)+,r13 +        sbc	-(rr4),R13 +        sbc	-(rr4),r13 +        sbc	rr12(rr6),r10 +        sbc	123(rr8),R11 +        sbc	123(rr8),r11 +        sbc	1234h,r3 +        sbc	1234(rr8),R11 +        sbc	1234(rr8),r11 + +        sbc	(RR4),(rr8) +        sbc	(rr4),(rr8) + +        sbc	R14,#12h +        sbc	r14,#12h +        sbc	(rr6),#12h +        sbc	1234h,#12h + + +        sbcw	rr4,rr12 +        sbcw	RR100,RR130 +        sbcw	rr6,RR22 +        sbcw	RR70,rr10 +        sbcw	(r7),RR32 +        sbcw	(r7),rr10 +        sbcw	RR32,(r5) +        sbcw	rr6,(r12) + +        sbcw	rr12,(rr4) +        sbcw	RR12,(rr4) +        sbcw	RR12,(rr4)+ +        sbcw	rr12,(rr4)+ +        sbcw	RR12,-(rr4) +        sbcw	rr12,-(rr4) +        sbcw	rr10,rr12(rr6) +        sbcw	RR10,123(rr8) +        sbcw	rr10,123(rr8) +	sbcw	rr2,1234h +        sbcw	RR10,1234(rr8) +        sbcw	rr10,1234(rr8) + +        sbcw	(rr4),rr12 +        sbcw	(rr4),RR12 +        sbcw	(rr4)+,RR12 +        sbcw	(rr4)+,rr12 +        sbcw	-(rr4),RR12 +        sbcw	-(rr4),rr12 +        sbcw	rr12(rr6),rr10 +        sbcw	123(rr8),RR10 +        sbcw	123(rr8),rr10 +        sbcw	1234h,rr2 +        sbcw	1234(rr8),RR10 +        sbcw	1234(rr8),rr10 + +        sbcw	(rr4),(rr8) + +        sbcw	RR14,#1234h +        sbcw	rr14,#1234h +        sbcw	(rr6),#1234h +        sbcw	123(rr6),#1234h +        sbcw	1234(rr6),#1234h +        sbcw	1234h,#1234h + +;--------------------------------------------- + +        sub	r5,r13 +	sub	r7,(r12) +        sub	R100,R130 +        sub	r7,R22 +        sub	R70,r11 +        sub	(r7),R32 +        sub	(r7),r11 +        sub	R32,(r5) + +        sub	R13,(rr4) +        sub	r13,(rr4) +        sub	R13,(rr4)+ +        sub	r13,(rr4)+ +        sub	R13,-(rr4) +        sub	r13,-(rr4) +        sub	r10,rr12(rr6) +        sub	R11,123(rr8) +        sub	r11,123(rr8) +	sub	r3,1234h +        sub	R11,1234(rr8) +        sub	r11,1234(rr8) + +        sub	(rr4),R13 +        sub	(rr4),r13 +        sub	(rr4)+,R13 +        sub	(rr4)+,r13 +        sub	-(rr4),R13 +        sub	-(rr4),r13 +        sub	rr12(rr6),r10 +        sub	123(rr8),R11 +        sub	123(rr8),r11 +        sub	1234h,r3 +        sub	1234(rr8),R11 +        sub	1234(rr8),r11 + +        sub	(RR4),(rr8) +        sub	(rr4),(rr8) + +        sub	R14,#12h +        sub	r14,#12h +        sub	(rr6),#12h +        sub	1234h,#12h + + +        subw	rr4,rr12 +        subw	RR100,RR130 +        subw	rr6,RR22 +        subw	RR70,rr10 +        subw	(r7),RR32 +        subw	(r7),rr10 +        subw	RR32,(r5) +        subw	rr6,(r12) + +        subw	rr12,(rr4) +        subw	RR12,(rr4) +        subw	RR12,(rr4)+ +        subw	rr12,(rr4)+ +        subw	RR12,-(rr4) +        subw	rr12,-(rr4) +        subw	rr10,rr12(rr6) +        subw	RR10,123(rr8) +        subw	rr10,123(rr8) +	subw	rr2,1234h +        subw	RR10,1234(rr8) +        subw	rr10,1234(rr8) + +        subw	(rr4),rr12 +        subw	(rr4),RR12 +        subw	(rr4)+,RR12 +        subw	(rr4)+,rr12 +        subw	-(rr4),RR12 +        subw	-(rr4),rr12 +        subw	rr12(rr6),rr10 +        subw	123(rr8),RR10 +        subw	123(rr8),rr10 +        subw	1234h,rr2 +        subw	1234(rr8),RR10 +        subw	1234(rr8),rr10 + +        subw	(rr4),(rr8) + +        subw	RR14,#1234h +        subw	rr14,#1234h +        subw	(rr6),#1234h +        subw	123(rr6),#1234h +        subw	1234(rr6),#1234h +        subw	1234h,#1234h + +;--------------------------------------------- + +        tcm	r5,r13 +	tcm	r7,(r12) +        tcm	R100,R130 +        tcm	r7,R22 +        tcm	R70,r11 +        tcm	(r7),R32 +        tcm	(r7),r11 +        tcm	R32,(r5) + +        tcm	R13,(rr4) +        tcm	r13,(rr4) +        tcm	R13,(rr4)+ +        tcm	r13,(rr4)+ +        tcm	R13,-(rr4) +        tcm	r13,-(rr4) +        tcm	r10,rr12(rr6) +        tcm	R11,123(rr8) +        tcm	r11,123(rr8) +	tcm	r3,1234h +        tcm	R11,1234(rr8) +        tcm	r11,1234(rr8) + +        tcm	(rr4),R13 +        tcm	(rr4),r13 +        tcm	(rr4)+,R13 +        tcm	(rr4)+,r13 +        tcm	-(rr4),R13 +        tcm	-(rr4),r13 +        tcm	rr12(rr6),r10 +        tcm	123(rr8),R11 +        tcm	123(rr8),r11 +        tcm	1234h,r3 +        tcm	1234(rr8),R11 +        tcm	1234(rr8),r11 + +        tcm	(RR4),(rr8) +        tcm	(rr4),(rr8) + +        tcm	R14,#12h +        tcm	r14,#12h +        tcm	(rr6),#12h +        tcm	1234h,#12h + + +        tcmw	rr4,rr12 +        tcmw	RR100,RR130 +        tcmw	rr6,RR22 +        tcmw	RR70,rr10 +        tcmw	(r7),RR32 +        tcmw	(r7),rr10 +        tcmw	RR32,(r5) +        tcmw	rr6,(r12) + +        tcmw	rr12,(rr4) +        tcmw	RR12,(rr4) +        tcmw	RR12,(rr4)+ +        tcmw	rr12,(rr4)+ +        tcmw	RR12,-(rr4) +        tcmw	rr12,-(rr4) +        tcmw	rr10,rr12(rr6) +        tcmw	RR10,123(rr8) +        tcmw	rr10,123(rr8) +	tcmw	rr2,1234h +        tcmw	RR10,1234(rr8) +        tcmw	rr10,1234(rr8) + +        tcmw	(rr4),rr12 +        tcmw	(rr4),RR12 +        tcmw	(rr4)+,RR12 +        tcmw	(rr4)+,rr12 +        tcmw	-(rr4),RR12 +        tcmw	-(rr4),rr12 +        tcmw	rr12(rr6),rr10 +        tcmw	123(rr8),RR10 +        tcmw	123(rr8),rr10 +        tcmw	1234h,rr2 +        tcmw	1234(rr8),RR10 +        tcmw	1234(rr8),rr10 + +        tcmw	(rr4),(rr8) + +        tcmw	RR14,#1234h +        tcmw	rr14,#1234h +        tcmw	(rr6),#1234h +        tcmw	123(rr6),#1234h +        tcmw	1234(rr6),#1234h +        tcmw	1234h,#1234h + +;--------------------------------------------- + +        tm	r5,r13 +	tm	r7,(r12) +        tm	R100,R130 +        tm	r7,R22 +        tm	R70,r11 +        tm	(r7),R32 +        tm	(r7),r11 +        tm	R32,(r5) + +        tm	R13,(rr4) +        tm	r13,(rr4) +        tm	R13,(rr4)+ +        tm	r13,(rr4)+ +        tm	R13,-(rr4) +        tm	r13,-(rr4) +        tm	r10,rr12(rr6) +        tm	R11,123(rr8) +        tm	r11,123(rr8) +	tm	r3,1234h +        tm	R11,1234(rr8) +        tm	r11,1234(rr8) + +        tm	(rr4),R13 +        tm	(rr4),r13 +        tm	(rr4)+,R13 +        tm	(rr4)+,r13 +        tm	-(rr4),R13 +        tm	-(rr4),r13 +        tm	rr12(rr6),r10 +        tm	123(rr8),R11 +        tm	123(rr8),r11 +        tm	1234h,r3 +        tm	1234(rr8),R11 +        tm	1234(rr8),r11 + +        tm	(RR4),(rr8) +        tm	(rr4),(rr8) + +        tm	R14,#12h +        tm	r14,#12h +        tm	(rr6),#12h +        tm	1234h,#12h + + +        tmw	rr4,rr12 +        tmw	RR100,RR130 +        tmw	rr6,RR22 +        tmw	RR70,rr10 +        tmw	(r7),RR32 +        tmw	(r7),rr10 +        tmw	RR32,(r5) +        tmw	rr6,(r12) + +        tmw	rr12,(rr4) +        tmw	RR12,(rr4) +        tmw	RR12,(rr4)+ +        tmw	rr12,(rr4)+ +        tmw	RR12,-(rr4) +        tmw	rr12,-(rr4) +        tmw	rr10,rr12(rr6) +        tmw	RR10,123(rr8) +        tmw	rr10,123(rr8) +	tmw	rr2,1234h +        tmw	RR10,1234(rr8) +        tmw	rr10,1234(rr8) + +        tmw	(rr4),rr12 +        tmw	(rr4),RR12 +        tmw	(rr4)+,RR12 +        tmw	(rr4)+,rr12 +        tmw	-(rr4),RR12 +        tmw	-(rr4),rr12 +        tmw	rr12(rr6),rr10 +        tmw	123(rr8),RR10 +        tmw	123(rr8),rr10 +        tmw	1234h,rr2 +        tmw	1234(rr8),RR10 +        tmw	1234(rr8),rr10 + +        tmw	(rr4),(rr8) + +        tmw	RR14,#1234h +        tmw	rr14,#1234h +        tmw	(rr6),#1234h +        tmw	123(rr6),#1234h +        tmw	1234(rr6),#1234h +        tmw	1234h,#1234h + +;--------------------------------------------- + +        xor	r5,r13 +	xor	r7,(r12) +        xor	R100,R130 +        xor	r7,R22 +        xor	R70,r11 +        xor	(r7),R32 +        xor	(r7),r11 +        xor	R32,(r5) + +        xor	R13,(rr4) +        xor	r13,(rr4) +        xor	R13,(rr4)+ +        xor	r13,(rr4)+ +        xor	R13,-(rr4) +        xor	r13,-(rr4) +        xor	r10,rr12(rr6) +        xor	R11,123(rr8) +        xor	r11,123(rr8) +	xor	r3,1234h +        xor	R11,1234(rr8) +        xor	r11,1234(rr8) + +        xor	(rr4),R13 +        xor	(rr4),r13 +        xor	(rr4)+,R13 +        xor	(rr4)+,r13 +        xor	-(rr4),R13 +        xor	-(rr4),r13 +        xor	rr12(rr6),r10 +        xor	123(rr8),R11 +        xor	123(rr8),r11 +        xor	1234h,r3 +        xor	1234(rr8),R11 +        xor	1234(rr8),r11 + +        xor	(RR4),(rr8) +        xor	(rr4),(rr8) + +        xor	R14,#12h +        xor	r14,#12h +        xor	(rr6),#12h +        xor	1234h,#12h + + +        xorw	rr4,rr12 +        xorw	RR100,RR130 +        xorw	rr6,RR22 +        xorw	RR70,rr10 +        xorw	(r7),RR32 +        xorw	(r7),rr10 +        xorw	RR32,(r5) +        xorw	rr6,(r12) + +        xorw	rr12,(rr4) +        xorw	RR12,(rr4) +        xorw	RR12,(rr4)+ +        xorw	rr12,(rr4)+ +        xorw	RR12,-(rr4) +        xorw	rr12,-(rr4) +        xorw	rr10,rr12(rr6) +        xorw	RR10,123(rr8) +        xorw	rr10,123(rr8) +	xorw	rr2,1234h +        xorw	RR10,1234(rr8) +        xorw	rr10,1234(rr8) + +        xorw	(rr4),rr12 +        xorw	(rr4),RR12 +        xorw	(rr4)+,RR12 +        xorw	(rr4)+,rr12 +        xorw	-(rr4),RR12 +        xorw	-(rr4),rr12 +        xorw	rr12(rr6),rr10 +        xorw	123(rr8),RR10 +        xorw	123(rr8),rr10 +        xorw	1234h,rr2 +        xorw	1234(rr8),RR10 +        xorw	1234(rr8),rr10 + +        xorw	(rr4),(rr8) + +        xorw	RR14,#1234h +        xorw	rr14,#1234h +        xorw	(rr6),#1234h +        xorw	123(rr6),#1234h +        xorw	1234(rr6),#1234h +        xorw	1234h,#1234h + +;--------------------------------------------- + +        ld      r13,R230 +        ld      r4,r12 +        ld      R123,r5 +        ld      (r6),r12 +        ld      r12,(r6) +        ld      (r9),R56 +        ld      (r10),r11 +        ld      R100,(r7) +        ld      72(r5),r8 +        ld      r8,72(r5) +        ld      R120,R130 + +        ld      r10,(rr12) +        ld      (r4)+,(rr6)+ +        ld      R240,(rr2)+ +        ld      r10,(rr2)+ +        ld      R4,-(rr6) +        ld      r4,-(rr6) +        ld      R230,(rr8) +        ld      r2,rr6(rr4) +        ld      R14,123(rr6) +        ld      r14,123(rr6) +        ld      r12,1234h +        ld      R12,1234(rr8) +        ld      r12,1234(rr8) + +        ld      (rr4)+,(r6)+ +        ld      (rr12),(r10) +        ld      (rr2)+,R240 +        ld      (rr2)+,r10 +        ld      -(rr6),R4 +        ld      -(rr6),r4 +        ld      (rr8),R230 +        ld      rr6(rr4),r2 +        ld      123(rr6),R14 +        ld      123(rr6),r14 +        ld      1234h,r12 +        ld      1234(rr8),R12 +        ld      1234(rr8),r12 + +        ld      (RR4),(rr6) +        ld      (rr4),(rr6) + +        ld      r8,#242 +        ld      R8,#123 +        ld      (rr6),#23h +        ld      1234h,#56h + + +        ldw     rr10,rr14 +        ldw     (r7),RR128 +        ldw     (r9),rr4 +        ldw     RR40,(r5) +        ldw     rr6,(r5) +        ldw     123(r7),rr8 +        ldw     rr10,123(r5) +        ldw     RR40,RR120 +        ldw     rr12,RR136 +        ldw     RR136,rr12 + +        ldw     rr8,(rr6) +        ldw     RR20,(rr10)+ +        ldw     rr12,(rr10)+ +        ldw     RR124,-(rr2) +        ldw     rr4,-(rr2) +        ldw     RR8,(rr6) +        ldw     rr10,rr2(rr6) +        ldw     RR20,123(rr8) +        ldw     rr8,123(rr8) +        ldw     rr4,1234h +        ldw     RR20,1234(rr8) +        ldw     rr8,1234(rr8) + +        ldw     (rr6),rr8 +        ldw     (rr10)+,RR20 +        ldw     (rr10)+,rr12 +        ldw     -(rr2),RR124 +        ldw     -(rr2),rr4 +        ldw     (rr6),RR8 +        ldw     rr2(rr6),rr10 +        ldw     123(rr8),RR20 +        ldw     123(rr8),rr8 +        ldw     1234h,rr4 +        ldw     1234(rr8),RR20 +        ldw     1234(rr8),rr8 + +        ldw     (rr6),(rr10) + +        ldw     rr8,#2345h +        ldw     RR100,#4268 +        ldw     (rr6),#1234h +        ldw     123(rr6),#1234h +        ldw     1234(rr6),#1234h +        ldw     1234h,#1234h + +;----------------------------------- + +        clr     R32 +        clr     r2 +        clr     (R32) +        clr     (r2) + +        cpl     R32 +        cpl     r2 +        cpl     (R32) +        cpl     (r2) + +        da      R32 +        da      r2 +        da      (R32) +        da      (r2) + +        dec     R32 +        dec     r2 +        dec     (R32) +        dec     (r2) + +        inc     R32 +        inc     r2 +        inc     (R32) +        inc     (r2) + +        pop     R32 +        pop     r2 +        pop     (R32) +        pop     (r2) + +        popu    R32 +        popu    r2 +        popu    (R32) +        popu    (r2) + +        rlc     R32 +        rlc     r2 +        rlc     (R32) +        rlc     (r2) + +        rol     R32 +        rol     r2 +        rol     (R32) +        rol     (r2) + +        ror     R32 +        ror     r2 +        ror     (R32) +        ror     (r2) + +        rrc     R32 +        rrc     r2 +        rrc     (R32) +        rrc     (r2) + +        sra     R32 +        sra     r2 +        sra     (R32) +        sra     (r2) + +        swap     R32 +        swap     r2 +        swap     (R32) +        swap     (r2) + +        decw    RR32 +        decw    rr2 + +        ext     RR10 +        ext     rr10 + +        incw    RR32 +        incw    rr2 + +        popuw   RR32 +        popuw   rr2 + +        popw    RR32 +        popw    rr2 + +        rlcw    RR32 +        rlcw    rr2 + +        rrcw    RR32 +        rrcw    rr2 + +        sraw    RR32 +        sraw    rr2 + +;------------------------------ + +        band    r4.5,r8.2 +        band    r4.5,r8.!2 + +        bld     r4.5,r8.!2 +        bld     r4.5,r8.2 + +        bor     r4.5,r8.2 +        bor     r4.5,r8.!2 + +        bxor    r4.5,r8.2 +        bxor    r4.5,r8.!2 + +;------------------------------ + +        bcpl    r4.5 + +        bres    r4.5 + +        bset    r4.5 + +        btset   r4.5 +        btset   (rr4).5 + +        btjf    r10.2,pc +        btjt    r10.2,pc + +;------------------------------ + +        call    (RR30) +        call    (rr6) +        call    3521h + +        jp      (RR30) +        jp      (rr6) +        jp      1024 + +        jpeq    1024 + +        jreq    pc + +;------------------------------ + +        cpjfi   r2,(rr14),pc +        cpjti   r2,(rr14),pc + +        djnz    r6,pc +        dwjnz   RR6,pc +        dwjnz   rr6,pc + +;------------------------------ + +        div     rr8,r6 +        mul     rr6,r8 +        divws   rr6,rr8,RR10 + +;------------------------------ + +        ldpp    (rr8)+,(rr12)+ +        lddp    (rr8)+,(rr12)+ +        ldpd    (rr8)+,(rr12)+ +        lddd    (rr8)+,(rr12)+ + +;------------------------------ + +        pea     16(RR32) +        pea     16(rr2) +        pea     1600(RR32) +        pea     1600(rr2) + +        peau    16(RR32) +        peau    16(rr2) +        peau    1600(RR32) +        peau    1600(rr2) + +;------------------------------ + +        push    R32 +        push    r2 +        push    (R32) +        push    (r2) +        push    #23h + +        pushu   R32 +        pushu   r2 +        pushu   (R32) +        pushu   (r2) +        pushu   #23h + +        pushuw  RR32 +        pushuw  rr2 +        pushuw  #1234h + +        pushw   RR32 +        pushw   rr2 +        pushw   #1234h + +;------------------------------ + +        sla     r6 +        sla     R6 +        sla     (rr6) + +        slaw    rr4 +        slaw    RR4 +        slaw    (rr4) + +;------------------------------ + +        spp     #5 +        srp     #3 +        srp0    #3 +        srp1    #3 + +;------------------------------ + +        xch     r2,r4 + +dvar    equ     1234h,data +cvar    label   2345h + +        assume  dp:0 +;        ld      r0,dvar +        ld      r0,cvar +        assume  dp:1 +        ld      r0,dvar +;        ld      r0,cvar + +bit1    bit     r5.1 +bit2    bit     r6.!7 +bit3    bit     bit1 +bit4    bit     bit1+1 + +        bld     r0.0,bit3 +        bld     r0.1,!bit3 + diff --git a/tests/t_st9/t_st9.doc b/tests/t_st9/t_st9.doc new file mode 100644 index 0000000..8068250 --- /dev/null +++ b/tests/t_st9/t_st9.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application ST9 -----------------------------+ +|                                                                            | +|          This is a (synthetic) test of the ST9's instruction set           | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_st9/t_st9.ori b/tests/t_st9/t_st9.ori Binary files differnew file mode 100755 index 0000000..b2bc395 --- /dev/null +++ b/tests/t_st9/t_st9.ori diff --git a/tests/t_tms7/asflags b/tests/t_tms7/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_tms7/asflags diff --git a/tests/t_tms7/t_tms7.asm b/tests/t_tms7/t_tms7.asm new file mode 100755 index 0000000..efd4e0a --- /dev/null +++ b/tests/t_tms7/t_tms7.asm @@ -0,0 +1,364 @@ +        cpu     tms70c08
 +
 +        page    0
 +
 +        include reg7000
 +
 +; additional syntax options marked with ***
 +
 +	adc	b,a
 +        adc	r10,a
 +        adc	r20,b
 +        adc	r30,r40
 +        adc	%20,a
 +        adc	#20,a		; ***
 +        adc	%30,b
 +        adc	#30,b           ; ***
 +        adc	%40,r50
 +        adc	#40,r50         ; ***
 +
 +	add	b,a
 +        add	r10,a
 +        add	r20,b
 +        add	r30,r40
 +        add	%20,a
 +        add	#20,a		; ***
 +        add	%30,b
 +        add	#30,b           ; ***
 +        add	%40,r50
 +        add	#40,r50         ; ***
 +
 +	and	b,a
 +        and	r10,a
 +        and	r20,b
 +        and	r30,r40
 +        and	%20,a
 +        and	#20,a		; ***
 +        and	%30,b
 +        and	#30,b           ; ***
 +        and	%40,r50
 +        and	#40,r50         ; ***
 +	andp	a,p20
 +        and	a,p20		; ***
 +        andp	b,p30
 +        and	b,p30		; ***
 +        andp	#50,p40
 +        and	#50,p40		; ***
 +
 +	btjo	b,a,$
 +        btjo	r10,a,$
 +        btjo	r20,b,$
 +        btjo	r30,r40,$
 +        btjo	%20,a,$
 +        btjo	#20,a,$		; ***
 +        btjo	%30,b,$
 +        btjo	#30,b,$         ; ***
 +        btjo	%40,r50,$
 +        btjo	#40,r50,$       ; ***
 +	btjop	a,p20,$
 +        btjo	a,p20,$		; ***
 +        btjop	b,p30,$
 +        btjo	b,p30,$		; ***
 +        btjop	#50,p40,$
 +        btjo	#50,p40,$	; ***
 +
 +	btjz	b,a,$
 +        btjz	r10,a,$
 +        btjz	r20,b,$
 +        btjz	r30,r40,$
 +        btjz	%20,a,$
 +        btjz	#20,a,$		; ***
 +        btjz	%30,b,$
 +        btjz	#30,b,$         ; ***
 +        btjz	%40,r50,$
 +        btjz	#40,r50,$       ; ***
 +	btjzp	a,p20,$
 +        btjz	a,p20,$		; ***
 +        btjzp	b,p30,$
 +        btjz	b,p30,$		; ***
 +        btjzp	#50,p40,$
 +        btjz	#50,p40,$	; ***
 +
 +	br	@1234h
 +        br	1234h		; ***
 +        br	@1234h(b)
 +        br	1234h(b)	; ***
 +        br	*r30
 +
 +	call	@1234h
 +        call	1234h		; ***
 +        call	@1234h(b)
 +        call	1234h(b)	; ***
 +        call	*r30
 +
 +        clr	a
 +        clr	b
 +        clr	r10
 +
 +        clrc
 +
 +	cmp	b,a
 +        cmp	r10,a
 +        cmp	r20,b
 +        cmp	r30,r40
 +        cmp	%20,a
 +        cmp	#20,a		; ***
 +        cmp	%30,b
 +        cmp	#30,b           ; ***
 +        cmp	%40,r50
 +        cmp	#40,r50         ; ***
 +	cmpa	@1234h
 +        cmpa	1234h		; ***
 +        cmp	@1234h,a	; ***
 +        cmp	1234h,a		; ***
 +	cmpa	@1234h(b)
 +        cmpa	1234h(b)	; ***
 +        cmp	@1234h(b),a	; ***
 +        cmp	1234h(b),a	; ***
 +	cmpa	*r60
 +        cmp	*r60,a		; ***
 +
 +	dac	b,a
 +        dac	r10,a
 +        dac	r20,b
 +        dac	r30,r40
 +        dac	%20,a
 +        dac	#20,a		; ***
 +        dac	%30,b
 +        dac	#30,b           ; ***
 +        dac	%40,r50
 +        dac	#40,r50         ; ***
 +
 +        dec	a
 +        dec	b
 +        dec	r10
 +
 +        decd	a
 +        decd	b
 +        decd	r10
 +
 +        dint
 +
 +        djnz	a,$
 +        djnz	b,$
 +        djnz	r10,$
 +
 +	dsb	b,a
 +        dsb	r10,a
 +        dsb	r20,b
 +        dsb	r30,r40
 +        dsb	%20,a
 +        dsb	#20,a		; ***
 +        dsb	%30,b
 +        dsb	#30,b           ; ***
 +        dsb	%40,r50
 +        dsb	#40,r50         ; ***
 +
 +        eint
 +
 +        idle
 +
 +        inc	a
 +        inc	b
 +        inc	r10
 +
 +        inv	a
 +        inv	b
 +        inv	r10
 +
 +        jmp	$
 +        jc	$
 +        jeq	$
 +        jhs	$
 +        jl	$
 +        jn	$
 +        jnc	$
 +        jne	$
 +        jnz	$
 +        jp	$
 +        jpz	$
 +        jz	$
 +
 +        lda	@1234h
 +        lda	1234h		; ***
 +        mov	@1234h,a	; ***
 +        mov	1234h,a		; ***
 +        lda	@1234h(b)
 +        lda	1234h(b)	; ***
 +        mov	@1234h(b),a	; ***
 +        mov	1234h(b),a	; ***
 +	lda	*r10
 +        mov	*r10,a		; ***
 +
 +        ldsp
 +
 +        mov	a,b
 +        mov	a,r10
 +        mov	b,a
 +        mov	b,r20
 +        mov	r30,a
 +        mov	r40,b
 +        mov	r50,r60
 +        mov	%10,a
 +        mov	#10,a		; ***
 +        mov	%20,b
 +        mov	#20,b		; ***
 +        mov	%30,r70
 +        mov	#30,r70		; ***
 +
 +        movd	%1234h,r10
 +        movd	#1234h,r10	; ***
 +        movd	%1234h(b),r20
 +        movd	#1234h(b),r20   ; ***
 +        movd	r30,r40
 +
 +        movw	%1234h,r10      ; ***
 +        movw	#1234h,r10	; ***
 +        movw	%1234h(b),r20   ; ***
 +        movw	#1234h(b),r20   ; ***
 +        movw	r30,r40         ; ***
 +
 +        movp	a,p10
 +        mov	a,p10		; ***
 +        movp	b,p20
 +        mov	b,p20		; ***
 +        movp	%10,p30
 +        movp	#10,p30		; ***
 +        mov	%10,p30		; ***
 +        mov	#10,p30		; ***
 +        movp	p40,a
 +        mov	p40,a		; ***
 +        movp	p50,b
 +        mov	p50,b		; ***
 +
 +	mpy	b,a
 +        mpy	r10,a
 +        mpy	r20,b
 +        mpy	r30,r40
 +        mpy	%20,a
 +        mpy	#20,a		; ***
 +        mpy	%30,b
 +        mpy	#30,b           ; ***
 +        mpy	%40,r50
 +        mpy	#40,r50         ; ***
 +
 +	nop
 +
 +	or	b,a
 +        or	r10,a
 +        or	r20,b
 +        or	r30,r40
 +        or	%20,a
 +        or	#20,a		; ***
 +        or	%30,b
 +        or	#30,b           ; ***
 +        or	%40,r50
 +        or	#40,r50         ; ***
 +	orp	a,p20
 +        or	a,p20		; ***
 +        orp	b,p30
 +        or	b,p30		; ***
 +        orp	#50,p40
 +        or	#50,p40		; ***
 +
 +        pop	a
 +        pop	b
 +        pop	r10
 +        pop	st
 +
 +        push	a
 +        push	b
 +        push	r10
 +        push	st
 +
 +        reti
 +        rti			; ***
 +
 +        rets
 +        rts			; ***
 +
 +        rl	a
 +        rl	b
 +        rl	r10
 +
 +        rlc	a
 +        rlc	b
 +        rlc	r10
 +
 +        rr	a
 +        rr	b
 +        rr	r10
 +
 +        rrc	a
 +        rrc	b
 +        rrc	r10
 +
 +	sbb	b,a
 +        sbb	r10,a
 +        sbb	r20,b
 +        sbb	r30,r40
 +        sbb	%20,a
 +        sbb	#20,a		; ***
 +        sbb	%30,b
 +        sbb	#30,b           ; ***
 +        sbb	%40,r50
 +        sbb	#40,r50         ; ***
 +
 +        setc
 +
 +        sta	@1234h
 +        sta	1234h		; ***
 +        mov	a,@1234h	; ***
 +        mov	a,1234h		; ***
 +        sta	@1234h(b)
 +        sta	1234h(b)	; ***
 +        mov	a,@1234h(b)	; ***
 +        mov	a,1234h(b)	; ***
 +	sta	*r10
 +        mov	a,*r10		; ***
 +
 +        stsp
 +
 +	sub	b,a
 +        sub	r10,a
 +        sub	r20,b
 +        sub	r30,r40
 +        sub	%20,a
 +        sub	#20,a		; ***
 +        sub	%30,b
 +        sub	#30,b           ; ***
 +        sub	%40,r50
 +        sub	#40,r50         ; ***
 +
 +        swap	a
 +        swap	b
 +        swap	r10
 +
 +        trap	0
 +        trap	23
 +
 +        tsta
 +        tst	a		; ***
 +        tstb
 +        tst	b		; ***
 +
 +        xchb	a
 +        xchb	b		; ***
 +        xchb	r10
 +
 +	xor	b,a
 +        xor	r10,a
 +        xor	r20,b
 +        xor	r30,r40
 +        xor	%20,a
 +        xor	#20,a		; ***
 +        xor	%30,b
 +        xor	#30,b           ; ***
 +        xor	%40,r50
 +        xor	#40,r50         ; ***
 +	xorp	a,p20
 +        xor	a,p20		; ***
 +        xorp	b,p30
 +        xor	b,p30		; ***
 +        xorp	#50,p40
 +        xor	#50,p40		; ***
 diff --git a/tests/t_tms7/t_tms7.doc b/tests/t_tms7/t_tms7.doc new file mode 100644 index 0000000..8729cc7 --- /dev/null +++ b/tests/t_tms7/t_tms7.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application TMS7 ---------------------------+ +|                                                                            | +|      This is a (synthetic) test of the TMS7000 instruction set             | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_tms7/t_tms7.ori b/tests/t_tms7/t_tms7.ori Binary files differnew file mode 100755 index 0000000..c8d60c7 --- /dev/null +++ b/tests/t_tms7/t_tms7.ori diff --git a/tests/t_xa/asflags b/tests/t_xa/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_xa/asflags diff --git a/tests/t_xa/t_xa.asm b/tests/t_xa/t_xa.asm new file mode 100644 index 0000000..68800d2 --- /dev/null +++ b/tests/t_xa/t_xa.asm @@ -0,0 +1,603 @@ +        cpu     xag3 + +        page	0 + +        include stddefxa + +        segment io + +port1   ds.b    1 +port2   ds.b    1 + +        segment code + +        supmode on + +regbit1	bit	r3l.4 +regbit2	bit	sp.5 +regbit3	bit	r5h.5 +regbit4	bit	sp.14 +membit1	bit	22h.5 +membit2	bit	50023h.5 +iobit1	bit	port1.2 +regbit5	bit	regbit4+1 + +        add.b   r4h,r1l +        add.w   r5,r3 +        add.b   r5l,[r6] +        add.w   r4,[sp] +        add.b   [r6],r5l +        add.w   [sp],r4 +        add.b   r3h,[r6+2] +        add.w   r4,[r3+100] +        add.b   [r6+2],r3h +        add.w   [r3+100],r4 +        add.b   r3h,[r6+200] +        add.w   r4,[r3+1000] +        add.b   [r6+200],r3h +        add.w   [r3+1000],r4 +        add.b   r4h,[r1+] +        add.w   r5,[r6+] +        add.b   [r1+],r4h +        add.w   [r6+],r5 +        add.b   200h,r2l +        add.w   123h,r6 +        add.b   r2l,200h +        add.w   r6,123h +        add.b   r5h,#34h +        add.w   r3,#1234h +        add.b   [r5],#34h +        add.w   [r3],#1234h +        add.b   [r5+],#34h +        add.w   [r3+],#1234h +        add.b   [r5+2],#34h +        add.w   [r3+100],#1234h +        add.b   [r5+200],#34h +        add.w   [r3+1000],#1234h +        add.b   200h,#34h +        add.w   123h,#1234h + +        addc.b  r4h,r1l +        addc.w  r5,r3 +        addc.b  r5l,[r6] +        addc.w  r4,[sp] +        addc.b  [r6],r5l +        addc.w  [sp],r4 +        addc.b  r3h,[r6+2] +        addc.w  r4,[r3+100] +        addc.b  [r6+2],r3h +        addc.w  [r3+100],r4 +        addc.b  r3h,[r6+200] +        addc.w  r4,[r3+1000] +        addc.b  [r6+200],r3h +        addc.w  [r3+1000],r4 +        addc.b  r4h,[r1+] +        addc.w  r5,[r6+] +        addc.b  [r1+],r4h +        addc.w  [r6+],r5 +        addc.b  200h,r2l +        addc.w  123h,r6 +        addc.b  r2l,200h +        addc.w  r6,123h +        addc.b  r5h,#34h +        addc.w  r3,#1234h +        addc.b  [r5],#34h +        addc.w  [r3],#1234h +        addc.b  [r5+],#34h +        addc.w  [r3+],#1234h +        addc.b  [r5+2],#34h +        addc.w  [r3+100],#1234h +        addc.b  [r5+200],#34h +        addc.w  [r3+1000],#1234h +        addc.b  200h,#34h +        addc.w  123h,#1234h + +        adds.b  r5h,#3 +        adds.w  r6,#5 +        adds.b  [r4],#3 +        adds.w  [sp],#5 +        adds.b  [r4+],#3 +        adds.w  [sp+],#5 +        adds.b  [r4+20],#3 +        adds.w  [sp+20],#5 +        adds.b  [r4-200],#3 +        adds.w  [sp-200],#5 +        adds.b  200h,#3 +        adds.w  123h,#5 + +        and.b   r4h,r1l +        and.w   r5,r3 +        and.b   r5l,[r6] +        and.w   r4,[sp] +        and.b   [r6],r5l +        and.w   [sp],r4 +        and.b   r3h,[r6+2] +        and.w   r4,[r3+100] +        and.b   [r6+2],r3h +        and.w   [r3+100],r4 +        and.b   r3h,[r6+200] +        and.w   r4,[r3+1000] +        and.b   [r6+200],r3h +        and.w   [r3+1000],r4 +        and.b   r4h,[r1+] +        and.w   r5,[r6+] +        and.b   [r1+],r4h +        and.w   [r6+],r5 +        and.b   200h,r2l +        and.w   123h,r6 +        and.b   r2l,200h +        and.w   r6,123h +        and.b   r5h,#34h +        and.w   r3,#1234h +        and.b   [r5],#34h +        and.w   [r3],#1234h +        and.b   [r5+],#34h +        and.w   [r3+],#1234h +        and.b   [r5+2],#34h +        and.w   [r3+100],#1234h +        and.b   [r5+200],#34h +        and.w   [r3+1000],#1234h +        and.b   200h,#34h +        and.w   123h,#1234h + +	anl	c,regbit1 +        anl	c,/iobit1 +        anl	c,r5.12 +        anl	c,/r4h.1 + +        asl.b	r4h,r1l +        asl.w	r6,r3h +        asl.d	r2,r4l +        asl.b	r4h,#6 +        asl.w	r6,#12 +        asl.d	r2,#24 + +        asr.b	r4h,r1l +        asr.w	r6,r3h +        asr.d	r2,r4l +        asr.b	r4h,#6 +        asr.w	r6,#12 +        asr.d	r2,#24 + +	bcc	label1 +        nop +        bcc	label2 +        nop +        bcs	label1 +        beq	label1 +        bg	label1 +        bge	label1 +        bgt	label1 +        ble	label1 +        blt	label1 +        bmi	label1 +        bne	label1 +        bnv	label1 +        bov	label1 +        bpl	label1 +        br	label1 + +        call	label1 +        call	label1 +        call	[r4] + +        cjne	r5l,123h,label1 +        cjne	r6,456h,label1 +        cjne	r5l,#34h,label1 +        cjne	r6,#1234h,label1 +        cjne.b	[r6],#34h,label1 +	cjne.w	[r6],#1234h,label1 + +label1:	nop +label2:	nop + +	clr     regbit1 + +        cmp.b   r4h,r1l +        cmp.w   r5,r3 +        cmp.b   r5l,[r6] +        cmp.w   r4,[sp] +        cmp.b   [r6],r5l +        cmp.w   [sp],r4 +        cmp.b   r3h,[r6+2] +        cmp.w   r4,[r3+100] +        cmp.b   [r6+2],r3h +        cmp.w   [r3+100],r4 +        cmp.b   r3h,[r6+200] +        cmp.w   r4,[r3+1000] +        cmp.b   [r6+200],r3h +        cmp.w   [r3+1000],r4 +        cmp.b   r4h,[r1+] +        cmp.w   r5,[r6+] +        cmp.b   [r1+],r4h +        cmp.w   [r6+],r5 +        cmp.b   200h,r2l +        cmp.w   123h,r6 +        cmp.b   r2l,200h +        cmp.w   r6,123h +        cmp.b   r5h,#34h +        cmp.w   r3,#1234h +        cmp.b   [r5],#34h +        cmp.w   [r3],#1234h +        cmp.b   [r5+],#34h +        cmp.w   [r3+],#1234h +        cmp.b   [r5+2],#34h +        cmp.w   [r3+100],#1234h +        cmp.b   [r5+200],#34h +        cmp.w   [r3+1000],#1234h +        cmp.b   200h,#34h +        cmp.w   123h,#1234h + +	cpl	r4l +        cpl	sp + +        da	r4l + +        div.w	r4,r1h +        div.w	r5,#23 +        div.d	r2,r5 +        div.d	r6,#1234h + +        divu.b	r4l,r5l +        divu.b	r4l,#23 +        divu.w	r4,r1h +        divu.w	r5,#23 +        divu.d	r2,r5 +        divu.d	r6,#1234h + +d1:     djnz	r5l,d1 +d2:     djnz.b	123h,d2 +d3:     djnz	r5,d3 +d4:     djnz.w	123h,d4 + +	fcall	123456h + +        fjmp	123456h + +        jb	regbit1,d1 +        jbc	regbit1,d2 + +        jmp	1234h +        jmp	[r3] +        jmp	[a+dptr] +        jmp	[[r5+]] + +        jnb	regbit1,d3 + +        jnz	d3 + +        jz	d3 + +        lea	r5,r4+4 +        lea	r6,r1+1000 + +        lsr.b	r4h,r1l +        lsr.w	r6,r3h +        lsr.d	r2,r4l +        lsr.b	r4h,#6 +        lsr.w	r6,#12 +        lsr.d	r2,#24 + +	mov	c,regbit1 +        mov	regbit1,c +        mov	usp,r4 +        mov	sp,usp +        mov.b   r4h,r1l +        mov.w   r5,r3 +        mov.b   r5l,[r6] +        mov.w   r4,[sp] +        mov.b   [r6],r5l +        mov.w   [sp],r4 +        mov.b   r3h,[r6+2] +        mov.w   r4,[r3+100] +        mov.b   [r6+2],r3h +        mov.w   [r3+100],r4 +        mov.b   r3h,[r6+200] +        mov.w   r4,[r3+1000] +        mov.b   [r6+200],r3h +        mov.w   [r3+1000],r4 +        mov.b   r4h,[r1+] +        mov.w   r5,[r6+] +        mov.b   [r1+],r4h +        mov.w   [r6+],r5 +        mov.b	[r3+],[r4+] +        mov.w	[r3+],[r4+] +        mov.b   200h,r2l +        mov.w   123h,r6 +        mov.b   r2l,200h +        mov.w   r6,123h +        mov.b	123h,[r5] +        mov.w	456h,[sp] +        mov.b	[r5],123h +        mov.w	[sp],456h +        mov.b   r5h,#34h +        mov.w   r3,#1234h +        mov.b   [r5],#34h +        mov.w   [r3],#1234h +        mov.b   [r5+],#34h +        mov.w   [r3+],#1234h +        mov.b   [r5+2],#34h +        mov.w   [r3+100],#1234h +        mov.b   [r5+200],#34h +        mov.w   [r3+1000],#1234h +        mov.b   200h,#34h +        mov.w   123h,#1234h +	mov.b	123h,200h +	mov.w	123h,200h + +        movc	r4l,[r5+] +        movc	r4,[r5+] +        movc	a,[a+dptr] +        movc	a,[a+pc] + +        movs.b  r5h,#3 +        movs.w  r6,#5 +        movs.b  [r4],#3 +        movs.w  [sp],#5 +        movs.b  [r4+],#3 +        movs.w  [sp+],#5 +        movs.b  [r4+20],#3 +        movs.w  [sp+20],#5 +        movs.b  [r4-200],#3 +        movs.w  [sp-200],#5 +        movs.b  200h,#3 +        movs.w  123h,#5 + +        movx    r3l,[r6] +        movx    r3,[sp] +        movx    [r6],r3l +        movx    [sp],r3 + +        mul     r0,r5 +        mul     r6,#1234h + +        mulu    r3l,r4h +        mulu    r5l,#100 +        mulu    r0,r5 +        mulu    r6,#1234h + +        neg     r4l +        neg     sp + +        nop + +        norm.b  r4h,r1l +        norm.w  r6,r3h +        norm.d  r2,r4l + +        or.b    r4h,r1l +        or.w    r5,r3 +        or.b    r5l,[r6] +        or.w    r4,[sp] +        or.b    [r6],r5l +        or.w    [sp],r4 +        or.b    r3h,[r6+2] +        or.w    r4,[r3+100] +        or.b    [r6+2],r3h +        or.w    [r3+100],r4 +        or.b    r3h,[r6+200] +        or.w    r4,[r3+1000] +        or.b    [r6+200],r3h +        or.w    [r3+1000],r4 +        or.b    r4h,[r1+] +        or.w    r5,[r6+] +        or.b    [r1+],r4h +        or.w    [r6+],r5 +        or.b    200h,r2l +        or.w    123h,r6 +        or.b    r2l,200h +        or.w    r6,123h +        or.b    r5h,#34h +        or.w    r3,#1234h +        or.b    [r5],#34h +        or.w    [r3],#1234h +        or.b    [r5+],#34h +        or.w    [r3+],#1234h +        or.b    [r5+2],#34h +        or.w    [r3+100],#1234h +        or.b    [r5+200],#34h +        or.w    [r3+1000],#1234h +        or.b    200h,#34h +        or.w    123h,#1234h + +        orl     c,regbit1 +        orl     c,/iobit1 +        orl     c,r5.12 +        orl     c,/r4h.1 + +        pop.b   123h +        pop.w   200h +        pop     r2l +        pop     r2l,r3l +        pop     r4h +        pop     r4h,r5h +        pop     r2l,r3l,r4h,r5h +        pop     r1 +        pop     r2,r5;,sp + +        popu.b  123h +        popu.w  200h +        popu    r2l +        popu    r2l,r3l +        popu    r4h +        popu    r4h,r5h +        popu    r2l,r3l,r4h,r5h +        popu    r1 +        popu    r2,r5,sp + +        push.b  123h +        push.w  200h +        push    r2l +        push    r2l,r3l +        push    r4h +        push    r4h,r5h +        push    r2l,r3l,r4h,r5h +        push    r1 +        push    r2,r5,sp + +        pushu.b 123h +        pushu.w 200h +        pushu   r2l +        pushu   r2l,r3l +        pushu   r4h +        pushu   r4h,r5h +        pushu   r2l,r3l,r4h,r5h +        pushu   r1 +        pushu   r2,r5,sp + +        reset + +        ret + +        reti + +        rl      r3h,#3 +        rl      r5,#12 + +        rlc     r3h,#3 +        rlc     r5,#12 + +        rr      r3h,#3 +        rr      r5,#12 + +        rrc     r3h,#3 +        rrc     r5,#12 + +        setb    regbit1 + +        sext    r1l +        sext    r2 + +        sub.b   r4h,r1l +        sub.w   r5,r3 +        sub.b   r5l,[r6] +        sub.w   r4,[sp] +        sub.b   [r6],r5l +        sub.w   [sp],r4 +        sub.b   r3h,[r6+2] +        sub.w   r4,[r3+100] +        sub.b   [r6+2],r3h +        sub.w   [r3+100],r4 +        sub.b   r3h,[r6+200] +        sub.w   r4,[r3+1000] +        sub.b   [r6+200],r3h +        sub.w   [r3+1000],r4 +        sub.b   r4h,[r1+] +        sub.w   r5,[r6+] +        sub.b   [r1+],r4h +        sub.w   [r6+],r5 +        sub.b   200h,r2l +        sub.w   123h,r6 +        sub.b   r2l,200h +        sub.w   r6,123h +        sub.b   r5h,#34h +        sub.w   r3,#1234h +        sub.b   [r5],#34h +        sub.w   [r3],#1234h +        sub.b   [r5+],#34h +        sub.w   [r3+],#1234h +        sub.b   [r5+2],#34h +        sub.w   [r3+100],#1234h +        sub.b   [r5+200],#34h +        sub.w   [r3+1000],#1234h +        sub.b   200h,#34h +        sub.w   123h,#1234h + +        subb.b  r4h,r1l +        subb.w  r5,r3 +        subb.b  r5l,[r6] +        subb.w  r4,[sp] +        subb.b  [r6],r5l +        subb.w  [sp],r4 +        subb.b  r3h,[r6+2] +        subb.w  r4,[r3+100] +        subb.b  [r6+2],r3h +        subb.w  [r3+100],r4 +        subb.b  r3h,[r6+200] +        subb.w  r4,[r3+1000] +        subb.b  [r6+200],r3h +        subb.w  [r3+1000],r4 +        subb.b  r4h,[r1+] +        subb.w  r5,[r6+] +        subb.b  [r1+],r4h +        subb.w  [r6+],r5 +        subb.b  200h,r2l +        subb.w  123h,r6 +        subb.b  r2l,200h +        subb.w  r6,123h +        subb.b  r5h,#34h +        subb.w  r3,#1234h +        subb.b  [r5],#34h +        subb.w  [r3],#1234h +        subb.b  [r5+],#34h +        subb.w  [r3+],#1234h +        subb.b  [r5+2],#34h +        subb.w  [r3+100],#1234h +        subb.b  [r5+200],#34h +        subb.w  [r3+1000],#1234h +        subb.b  200h,#34h +        subb.w  123h,#1234h + +        trap    #5 + +        xch     r3h,r5l +        xch     r5l,r3h +        xch     r3,r5 +        xch     r5,r3 +        xch     r3h,[r5] +        xch     [r5],r3h +        xch     r3,[r5] +        xch     [r5],r3 +        xch     r3h,123h +        xch     123h,r3h +        xch     r3,200h +        xch     200h,r3 + +        xor.b   r4h,r1l +        xor.w   r5,r3 +        xor.b   r5l,[r6] +        xor.w   r4,[sp] +        xor.b   [r6],r5l +        xor.w   [sp],r4 +        xor.b   r3h,[r6+2] +        xor.w   r4,[r3+100] +        xor.b   [r6+2],r3h +        xor.w   [r3+100],r4 +        xor.b   r3h,[r6+200] +        xor.w   r4,[r3+1000] +        xor.b   [r6+200],r3h +        xor.w   [r3+1000],r4 +        xor.b   r4h,[r1+] +        xor.w   r5,[r6+] +        xor.b   [r1+],r4h +        xor.w   [r6+],r5 +        xor.b   200h,r2l +        xor.w   123h,r6 +        xor.b   r2l,200h +        xor.w   r6,123h +        xor.b   r5h,#34h +        xor.w   r3,#1234h +        xor.b   [r5],#34h +        xor.w   [r3],#1234h +        xor.b   [r5+],#34h +        xor.w   [r3+],#1234h +        xor.b   [r5+2],#34h +        xor.w   [r3+100],#1234h +        xor.b   [r5+200],#34h +        xor.w   [r3+1000],#1234h +        xor.b   200h,#34h +        xor.w   123h,#1234h + +        mov.b   [r5+],[r5+] +        xch     r4l,r4l +        pop     r7 +        norm.b  r4l,r4l +        norm.w  r4,r4h +        norm.d  r4,r5l +        mov     [r4+],r4l +        mov     r4h,[r4+] +        movc    r4h,[r4+] +        add     [r4+],r4l +        add     r4h,[r4+] +        mov     r5,[r5+] + diff --git a/tests/t_xa/t_xa.doc b/tests/t_xa/t_xa.doc new file mode 100644 index 0000000..3a7edf8 --- /dev/null +++ b/tests/t_xa/t_xa.doc @@ -0,0 +1,5 @@ ++--------------------------- Test Application XA ----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the Philips XA instruction set          | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_xa/t_xa.ori b/tests/t_xa/t_xa.ori Binary files differnew file mode 100644 index 0000000..edfa696 --- /dev/null +++ b/tests/t_xa/t_xa.ori diff --git a/tests/t_z380/asflags b/tests/t_z380/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_z380/asflags diff --git a/tests/t_z380/t_z380.asm b/tests/t_z380/t_z380.asm new file mode 100644 index 0000000..a681044 --- /dev/null +++ b/tests/t_z380/t_z380.asm @@ -0,0 +1,677 @@ +	cpu	z380 +        include regz380 + +        extmode on + +        page    0 +        relaxed on + +	ddir	w +	ddir	ib,w +	ddir	iw,w +	ddir	ib +	ddir	lw +	ddir	ib,lw +	ddir	iw,lw +	ddir	iw + +	cpl +	cpl	a +	neg +	neg	a + +	ei +	ei	$40 +	di +	di	$bf + +	btest +	exall +	exxx +	exxy +	indw +	indrw +	iniw +	inirw +	lddw +	lddrw +	ldiw +	ldirw +	mtest +	otdrw +	otirw +	outdw +	outiw +	retb + +	cplw +        cplw	hl +        negw +        negw	hl + +        ret +        ret	nz +        ret	z +        ret	nc +        ret	c +        ret	po +        ret	nv +        ret	pe +        ret	v +        ret	p +        ret	ns +        ret	m +        ret	s + +        jp	1234h +        jp	123456h +        ddir	ib +        jp	123456h +        ddir	iw +        jp	123456h +	ddir	w +        jp	123456h +        ddir	lw +        jp	123456h +        ddir	w,iw +        jp	123456h +        jp	12345678h +        ddir	lw +        jp	12345678h +        jp	z,4321h +        jp	nc,654321h +        jp	pe,87654321h +        jp	(hl) +        jp	(ix) +        jp	(iy) + +        call	$1234 +	call	$123456 +        call	$12345678 +        call	nz,$4321 +        call	m,$654321 +        call	po,$87654321 + +        jr	$+20 +        jr	c,$-20 +        jr	$-200 +        jr	z,$+200 +        jr	$+$200000 +        jr	nc,$-$200000 + +        calr	$+20 +        calr	c,$-20 +        calr	$-200 +        calr	z,$+200 +        calr	$+$200000 +        calr	nc,$-$200000 + +        djnz	$+20 +        djnz	$-200 +        djnz	$+$200000 + +        exts	a +        exts +        extsw	hl +        extsw + +        and	a +        and	a,b +        and	a,c +	and	a,d +        and	a,e +        and	a,h +        and	a,l +        and	a,ixl +        and	a,ixu +        and	a,iyl +        and	a,iyu +        and	a,$55 +        and	a,(hl) +        and	a,(ix+20) +        and	a,(iy-300) +        and	a,(ix+100000) + +        andw	ix +        andw	hl,ix +        andw	hl,iy +        andw	hl,bc +        andw	hl,de +        andw	hl,hl +        andw	hl,(ix+5) +        andw	hl,(iy-200) +	andw	hl,55aah + +        cp	a +        cp	a,b +        cp	a,c +	cp	a,d +        cp	a,e +        cp	a,h +        cp	a,l +        cp	a,ixl +        cp	a,ixu +        cp	a,iyl +        cp	a,iyu +        cp	a,$34 +        cp	a,(hl) +        cp	a,(ix-20) +        cp	a,(iy+$300) +        cp	a,(ix+100000h) + +        cpw	ix +        cpw	hl,ix +        cpw	hl,iy +        cpw	hl,bc +        cpw	hl,de +        cpw	hl,hl +        cpw	hl,(ix+17) +        cpw	hl,(iy-200) +	cpw	hl,$aa55 + +        or	a +        or	a,b +        or	a,c +	or	a,d +        or	a,e +        or	a,h +        or	a,l +        or	a,ixl +        or	a,ixu +        or	a,iyl +        or	a,iyu +        or	a,$34 +        or	a,(hl) +        or	a,(ix-20) +        or	a,(iy+$300) +        or	a,(ix+100000h) + +        orw	ix +        orw	hl,ix +        orw	hl,iy +        orw	hl,bc +        orw	hl,de +        orw	hl,hl +        orw	hl,(ix+17) +        orw	hl,(iy-200) +	orw	hl,$aa55 + +        xor	a +        xor	a,b +        xor	a,c +	xor	a,d +        xor	a,e +        xor	a,h +        xor	a,l +        xor	a,ixl +        xor	a,ixu +        xor	a,iyl +        xor	a,iyu +        xor	a,$34 +        xor	a,(hl) +        xor	a,(ix-20) +        xor	a,(iy+$300) +        xor	a,(ix+100000h) + +        xorw	ix +        xorw	hl,ix +        xorw	hl,iy +        xorw	hl,bc +        xorw	hl,de +        xorw	hl,hl +        xorw	hl,(ix+17) +        xorw	hl,(iy-200) +	xorw	hl,$aa55 + +        sub	a +        sub	a,b +        sub	a,c +	sub	a,d +        sub	a,e +        sub	a,h +        sub	a,l +        sub	a,ixl +        sub	a,ixu +        sub	a,iyl +        sub	a,iyu +        sub	a,$34 +        sub	a,(hl) +        sub	a,(ix-20) +        sub	a,(iy+$300) +        sub	a,(ix+100000h) + +        sub	hl,(1234h) +        sub	hl,(123456h) +        sub	hl,(12345678h) +        sub	sp,3412o + +	subw	ix +        subw	hl,ix +        subw	hl,iy +        subw	hl,bc +        subw	hl,de +        subw	hl,hl +        subw	hl,(ix+17) +	subw	hl,(iy-200) +	subw	hl,$aa55 + +	add	a,b +        add	a,iyu +        add	a,' ' +        add	a,(hl) +	add	a,(ix+10) +        add	a,(ix+1000) +	add	hl,bc +	add	ix,de +	add	iy,iy +	add	ix,sp +	add	hl,(12345678h) +	add	sp,3412o + +	addw	bc +	addw	hl,hl +	addw	hl,iy +	addw	hl,2314h +	addw	hl,(ix+128) + +	adc	a,h +	adc	a,ixu +	adc     a,20 +	adc	a,(hl) +	adc	a,(ix-500) +	adc	hl,sp + +	adcw	hl,bc +	adcw	hl,iy +	adcw	hl,$abcd +	adcw	hl,(iy-30) + +	sbc	a,d +	sbc	a,iyl +	sbc     a,20h +	sbc	a,(hl) +	sbc	a,(ix+500) +	sbc	hl,sp + +	sbcw	hl,bc +	sbcw	hl,iy +	sbcw	hl,$abcd +	sbcw	hl,(iy-30) + +	dec	a +	dec	(hl) +	dec	ixu +	dec	(ix+35) + +	decw	de +	dec	iy + +	inc	a +	inc	(hl) +	inc	ixu +	inc	(ix+35) + +	incw	de +	inc	iy + +	rl	d +	rl	(hl) +	rl	(ix+200) +	rlw	ix +	rlw	iy +	rlw	de +	rlw	hl +	rlw	(hl) +	rlw	(iy+$100000) + +	rlc	d +	rlc	(hl) +	rlc	(ix+200) +	rlcw	ix +	rlcw	iy +	rlcw	de +	rlcw	hl +	rlcw	(hl) +	rlcw	(iy+$100000) + +	rr	d +	rr	(hl) +	rr	(ix+200) +	rrw	ix +	rrw	iy +	rrw	de +	rrw	hl +	rrw	(hl) +	rrw	(iy+$100000) + +	rrc	d +	rrc	(hl) +	rrc	(ix+200) +	rrcw	ix +	rrcw	iy +	rrcw	de +	rrcw	hl +	rrcw	(hl) +	rrcw	(iy+$100000) + +	sla	d +	sla	(hl) +	sla	(ix+200) +	slaw	ix +	slaw	iy +	slaw	de +	slaw	hl +	slaw	(hl) +	slaw	(iy+$100000) + +	sra	d +	sra	(hl) +	sra	(ix+200) +	sraw	ix +	sraw	iy +	sraw	de +	sraw	hl +	sraw	(hl) +	sraw	(iy+$100000) + +	srl	d +	srl	(hl) +	srl	(ix+200) +	srlw	ix +	srlw	iy +	srlw	de +	srlw	hl +	srlw	(hl) +	srlw	(iy+$100000) + +	bit	5,a +	bit	6,(hl) +	bit	3,(ix+67) + +	res	5,a +	res	6,(hl) +	res	3,(ix+67) + +	set	5,a +	set	6,(hl) +	set	3,(ix+67) + +	mlt	bc +	mlt	hl +	mlt	sp + +	ld	a,c +	ld	a,h +	ld	a,iyu +	ld      a,ixl +	ld	a,(hl) +	ld	a,(ix+20) +	ld	a,(iy-300) +	ld	a,(bc) +	ld	a,(de) +	ld	a,'A' +	ld	a,(2000h) +	ld	a,(10000h) +	ld	a,r +	ld	a,i +	ld	d,a +	ld	d,e +	ld	d,ixl +	ld	d,(hl) +	ld	d,(iy+15) +	ld	d,'D' +	ld	ixl,a +	ld	iyu,'I' +	ld	iyl,iyu +	ld	ixu,ixl +	ld	ixl,e +	ld	(hl),a +	ld	(hl),c +	ld	(ix+100),a +	ld	(iy-200),d +	ld	(hl),'H' +	ld	(ix),'X' +	ld	(hl),hl +	ld	(hl),de +	ld	(hl),bc +	ld	(hl),ix +	ld	(hl),iy +	ld	(ix),hl +	ld	(ix),de +	ld	(ix),bc +	ld	(iy),hl +	ld	(iy),de +	ld	(iy),bc +	ld	(iy),ix +	ld	(ix+123456h),iy +	ld	sp,hl +	ld	sp,iy +	ddir	lw +	ld	sp,123456h +	ld	sp,(6) +	ld	bc,(hl) +	ld	de,(hl) +	ld	hl,(hl) +	ld	bc,(ix) +	ld	de,(ix) +	ld	hl,(ix) +	ld	bc,(iy) +	ld	de,(iy) +	ld	hl,(iy) +	ld	bc,hl +	ld	de,bc +	ld	de,ix +	ld	hl,iy +	ld	de,(bc) +	ld	hl,(de) +	ld	hl,2000h +	ddir	lw +	ld	hl,12345687h +	ld	hl,(2000h) +	ld	de,(20000h) +	ld	hl,(sp+5) +	ld	de,(sp-200) +	ld	ix,(hl) +	ld	iy,(hl) +	ld	ix,(iy) +	ld	iy,(ix) +	ld	iy,hl +	ld	ix,bc +	ld	ix,iy +	ld	iy,ix +	ld	ix,(bc) +	ld	iy,(de) +	ddir	lw +	ld	ix,123456h +	ld	iy,0 +	ld	ix,(2000h) +	ld	iy,(87654321h) +	ld	ix,(sp) +	ld	(bc),a +	ld	(de),a +	ld	(bc),de +	ld	(de),hl +	ld	(de),iy +	ld	($20001),a +	ld	(123456h),hl +	ld	(123456h),ix +	ld	(123456h),de +        ld      (123456h),sp +        ld      i,a +	ld	i,hl +	ld	r,a +	ld	hl,i +	ld	(sp),de +	ld	(sp),ix +	ld	(hl),10 +	ldw	(hl),1000 +	ddir	lw +	ldw	(hl),100000 +	ldw	(bc),30 +	ldw	(de),40 + +	pop	af +	pop	sr +	pop	bc +	pop	de +	pop	hl +	pop	ix +	pop	iy +	push	af +	push	sr +	push	300 +	push	bc +	push	de +	push	hl +	push	ix +	push	iy + +	ex	af,af' +	ex	(sp),hl +	ex	hl,(sp) +	ex	(sp),ix +	ex	ix,(sp) +	ex	(sp),iy +	ex	iy,(sp) +	ex	de,hl +	ex	hl,de +	ex	a,a' +	ex	c,c' +	ex	a,h +	ex	d,a +	ex	a,(hl) +	ex	(hl),a +	ex	bc,de +	ex	bc,hl +	ex	bc,ix +	ex	bc,iy +	ex	de,bc +	ex	de,hl +	ex	de,ix +	ex	de,iy +	ex	hl,bc +	ex	hl,de +	ex	hl,ix +	ex	hl,iy +	ex	ix,bc +	ex	ix,de +	ex	ix,hl +	ex	ix,iy +	ex	iy,bc +	ex	iy,de +	ex	iy,hl +	ex	iy,ix +	ex	bc,bc' +	ex	de,de' +	ex	hl,hl' +	ex	ix,ix' +	ex	iy,iy' + +	im	0 +	im	1 +	im	2 +	im	3 + +	in	a,(12h) +	out	(12h),a +	in	c,(c) +	out	(c),c +	out	(c),12h + +	inw	bc,(c) +	outw	(c),bc +	inw	de,(c) +	outw	(c),de +	inw	hl,(c) +	outw	(c),hl +	outw	(c),$2002 + +	in0	d,(20h) +	in0	(20h) +	out0	(20h),e + +	ina	a,(12h) +	inaw	hl,(1234h) +	outa	(123456h),a +	outaw	(12345678h),hl + +	tstio	1<<7 + +	tst	a +	tst	(hl) +	tst	33h + +	divuw	(ix+5) +	multw	hl,(iy-3) +	multuw	hl,(iy+100) +	divuw	hl,bc +	multw	hl,de +	multuw	hl,hl +	divuw	hl,ix +	multw	hl,iy +	multuw	hl,ix +	divuw	hl,10 +	multw	hl,100 +	multuw	hl,1000 + +        ldctl	sr,a +        ldctl	xsr,a +        ldctl	a,xsr +        ldctl	dsr,a +        ldctl	a,dsr +        ldctl	ysr,a +        ldctl	a,ysr +        ldctl	sr,20h +        ldctl	xsr,31h +        ldctl	dsr,42h +        ldctl	ysr,53h +        ldctl	sr,hl +        ldctl	hl,sr + +        resc	lw +        setc	lw +        resc	lck +        setc	lck +        setc	xm + +        swap	bc +        swap	de +        swap	hl +        swap	ix +        swap	iy + +        out     (c),0 + +        cpu     z80undoc + +        slia    d +        slia    (ix+5) +        slia    (hl) +        slia    a +        inc     ixl +        inc     iyu +        dec     ixu +        dec     iyl +        ld      iyl,'a' +        ld      b,ixl +        ld      ixu,c +        ld      iyl,iyu +        add     a,ixl +        adc     a,ixu +        sub     a,iyl +        sbc     a,iyu +        and     a,ixl +        xor     a,ixu +        or      a,iyl +        cp      a,iyu +        rlc     (ix+3) +        rrc     b,(iy-3) +        slia    a,(ix-100) +        res     5,h +        set     6,(ix+6) +        bit     3,(hl) +        res     c,4,(ix-1) +        set     l,6,(iy+17) +        out     (c),0 +        in      (c) +        tsti diff --git a/tests/t_z380/t_z380.doc b/tests/t_z380/t_z380.doc new file mode 100644 index 0000000..b9b1af3 --- /dev/null +++ b/tests/t_z380/t_z380.doc @@ -0,0 +1,5 @@ ++------------------------- Test Application Z380 ----------------------------+ +|                                                                            | +|    This is a (synthetic) test of the Z80/Z380/Z80UNDOC instruction set     | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_z380/t_z380.ori b/tests/t_z380/t_z380.ori Binary files differnew file mode 100644 index 0000000..83a5d92 --- /dev/null +++ b/tests/t_z380/t_z380.ori diff --git a/tests/t_z8/asflags b/tests/t_z8/asflags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/t_z8/asflags diff --git a/tests/t_z8/t_z8.asm b/tests/t_z8/t_z8.asm new file mode 100644 index 0000000..a2f46c7 --- /dev/null +++ b/tests/t_z8/t_z8.asm @@ -0,0 +1,116 @@ +	cpu	z8601 + +	ccf +	rcf +	scf + +	di +	ei + +	halt +	stop + +	wdh +	wdt + +	iret +	ret + +	nop + +	and	r7,r13 +	and	r5,vari +	and	vari,r4 + +	and	r3,@r14 +	and	r2,@vari +	and	vari,@r6 + +	and	r3,#5 +	and	vari,#77 +	and	@r9,#35h +	and	@vari,#10011b + +	add	2,5 +	adc	r5,#4 +	sub	@r0,#20 +	sbc	r7,vari +	or	vari,@r5 +	tcm	r0,@r8 +	tm	@vari,#00001000b +	cp	vari,#20 +	xor	r5,#255 + +	inc	r5 +	inc	@r12 +	inc	vari + +	dec	r6 +	dec	vari +	dec	@r5 +	dec	@vari +	decw	rr6 +	decw	vari +	decw	@r5 +	decw	@vari +	decw	@r5 + +test1:	jr	test1 +	jr	f,test1 +	jr	uge,test1 + +	djnz	r5,test1 + +	call	test1 +	call	@vari +	call	@rr10 + +	jp	test1 +	jp	c,test1 +	jp	@vari +	jp	@rr6 + + +	ld	r3,r4 +	ld	r5,vari +	ld	r6,@r7 +	ld	r8,@vari +	ld	r9,vari(r10) +	ld	r11,#45 + +	ld	vari,r12 +	ld	vari,vari +	ld	vari,@r13 +	ld	vari,@vari +	ld	vari,#67 + +	ld	@r14,r15 +	ld	@r0,vari +	ld	@r1,#89 + +	ld	@vari,r2 +	ld	@vari,vari +	ld	@vari,#01 + +	ld	vari(r3),r4 + + +	ldc	r5,@rr6 +	ldc	@rr8,r7 +	lde	r9,@rr10 +	lde	@rr12,r11 + +	ldci	@r13,@rr14 +	ldci	@rr0,@r15 +	ldei	@r1,@rr2 +	ldei	@rr4,@r3 + + +	srp	#0 + + +	segment	data + +	org	0aah +vari: + diff --git a/tests/t_z8/t_z8.doc b/tests/t_z8/t_z8.doc new file mode 100644 index 0000000..c6cc2b5 --- /dev/null +++ b/tests/t_z8/t_z8.doc @@ -0,0 +1,5 @@ ++-------------------------- Test Application Z8 -----------------------------+ +|                                                                            | +|      This is a (synthetic) test of the Z8 instruction set                  | +|                                                                            | ++----------------------------------------------------------------------------+ diff --git a/tests/t_z8/t_z8.ori b/tests/t_z8/t_z8.ori Binary files differnew file mode 100644 index 0000000..ffe9e81 --- /dev/null +++ b/tests/t_z8/t_z8.ori diff --git a/tests/testall b/tests/testall new file mode 100755 index 0000000..15bb2d1 --- /dev/null +++ b/tests/testall @@ -0,0 +1,38 @@ +#!/bin/sh + +echo executing self tests... +echo "=================================================================" > ../testlog +echo "Summaric results:" >> ../testlog +SUMPASS="0" +SUMFAIL="0" +if [ "$1" = "" ]; then + SUBDIRS=t_* +else + SUBDIRS="$1" +fi +for t in $SUBDIRS; do + cd $t + cat $t.doc + ../../asl `cat asflags` -i ../../include $t.asm | tee $t.log + ../../p2bin -k -l 0 -r 0x-0x $t + echo +---------------------------------------------------------------+ + if cmp $t.ori $t.bin; then +  echo "Test $t succeeded!" +  SUMPASS=`expr $SUMPASS + 1` +  echo "$t : OK" >> ../../testlog + else +  echo "Test $t failed!" +  SUMFAIL=`expr $SUMFAIL + 1` +  echo "$t : failed" >> ../../testlog + fi + grep assembly $t.log >> ../../testlog + grep Assemblierzeit $t.log >> ../../testlog + echo +---------------------------------------------------------------+ + rm -f $t.bin + rm -f $t.log + rm -f $t.h + cd .. +done +echo "successes: $SUMPASS" >> ../testlog +echo "failures : $SUMFAIL" >> ../testlog +cat ../testlog diff --git a/tests/testall.bat b/tests/testall.bat new file mode 100644 index 0000000..8d81cc8 --- /dev/null +++ b/tests/testall.bat @@ -0,0 +1,117 @@ +@echo off
 +if "%1"=="" goto main
 +
 +cd %1
 +type %1.doc | ..\..\addcr
 +set ASCMD=@asflags
 +..\..\asl -i ..\..\include -L +t 31 %1.asm
 +set ASCMD=
 +..\..\p2bin -k -l 0 -r $-$ %1
 +..\..\bincmp %1.bin %1.ori
 +if errorlevel 1 goto errcond
 +echo Test %1 succeeded!
 +set SUMPASS=%SUMPASS%!
 +echo %1 : OK >> ..\..\testlog
 +:goon
 +echo +---------------------------------------------------------------+
 +type %1.lst | find "assembly" >> ..\..\testlog
 +type %1.lst | find "Assemblierzeit" >> ..\..\testlog
 +if exist %1.lst del %1.lst >nul
 +if exist %1.inc del %1.inc >nul
 +if exist %1.bin del %1.bin >nul
 +cd ..
 +goto end
 +
 +:errcond
 +echo Test %1 failed!
 +set SUMFAIL=%SUMFAIL%-
 +echo %1 : failed >> ..\..\testlog
 +goto goon
 +
 +:main
 +if exist ..\addcr.exe goto nocomp
 +bcc -e..\addcr.exe -ml ..\addcr.c
 +del addcr.obj +:nocomp
 +if exist ..\bincmp.exe goto nocomp2
 +bcc -e..\bincmp.exe -ml ..\bincmp.c
 +del bincmp.obj +:nocomp2
 +echo executing self tests...
 +echo ================================================================= >..\testlog
 +echo Summaric results: >> ..\testlog
 +set SUMPASS=
 +set SUMFAIL=
 +call testall t_166
 +call testall t_16c5x
 +call testall t_16c84
 +call testall t_17c42
 +call testall t_251
 +call testall t_296
 +call testall t_29k
 +call testall t_32
 +call testall t_3201x
 +call testall t_3203x
 +call testall t_3205x
 +call testall t_3206x
 +call testall t_370
 +call testall t_4004
 +call testall t_403
 +call testall t_4500
 +call testall t_47c00
 +call testall t_48
 +call testall t_56000
 +call testall t_56300
 +call testall t_65
 +call testall t_6502u
 +call testall t_6804
 +call testall t_68040
 +call testall t_6805
 +call testall t_6808
 +call testall t_6812
 +call testall t_6816
 +call testall t_7000
 +call testall t_75k0
 +call testall t_7700
 +call testall t_7720
 +call testall t_77230
 +call testall t_7725
 +call testall t_78c1x
 +call testall t_78k0
 +call testall t_85
 +call testall t_87c800
 +call testall t_8X30x
 +call testall t_96
 +call testall t_960
 +call testall t_97c241
 +call testall t_9900
 +call testall t_ace
 +call testall t_avr
 +call testall t_bas52
 +call testall t_buf32
 +call testall t_cop8
 +call testall t_f2mc8l +call testall t_fl90
 +call testall t_fl900
 +call testall t_full09
 +call testall t_h8_3
 +call testall t_h8_5
 +call testall t_m16c
 +call testall t_mcore
 +call testall t_mic51
 +call testall t_msp
 +call testall t_parsys
 +call testall t_scmp
 +call testall t_secdri
 +call testall t_st6
 +call testall t_st7
 +call testall t_st9
 +call testall t_tms7
 +call testall t_xa
 +call testall t_z380
 +call testall t_z8
 +echo successes: %SUMPASS% >> ..\testlog
 +echo failures: %SUMFAIL% >> ..\testlog
 +type ..\testlog
 +
 +:end
 diff --git a/tests/testall.cmd b/tests/testall.cmd new file mode 100644 index 0000000..667dc39 --- /dev/null +++ b/tests/testall.cmd @@ -0,0 +1,117 @@ +@echo off +if "%1"=="" goto main + +cd %1 +type %1.doc | ..\..\addcr +set ASCMD=@asflags +..\..\asl -i ..\..\include -L +t 31 %1.asm +set ASCMD= +..\..\p2bin -k -l 0 -r $-$ %1 +..\..\bincmp %1.bin %1.ori +if errorlevel 1 goto errcond +echo Test %1 succeeded! +set SUMPASS=%SUMPASS%+ +echo %1 : OK >> ..\..\testlog +:goon +echo +---------------------------------------------------------------+ +type %1.lst | find "assembly" >> ..\..\testlog +type %1.lst | find "Assemblierzeit" >> ..\..\testlog +if exist %1.lst del %1.lst >nul +if exist %1.inc del %1.inc >nul +if exist %1.bin del %1.bin >nul +cd .. +goto end + +:errcond +echo Test %1 failed! +set SUMFAIL=%SUMFAIL%- +echo %1 : failed >> ..\..\testlog +goto goon + +:main +if exist ..\addcr.exe goto nocomp +echo Compiling 'addcr'... +gcc -o ..\addcr.exe ..\addcr.c +:nocomp +if exist ..\bincmp.exe goto nocomp2 +echo Compiling 'bincmp'... +gcc -o ..\bincmp.exe ..\bincmp.c +:nocomp2 +echo executing self tests... +echo "=================================================================" >..\testlog +echo Summaric results: >> ..\testlog +set SUMPASS= +set SUMFAIL= +call testall t_166 +call testall t_16c5x +call testall t_16c84 +call testall t_17c42 +call testall t_251 +call testall t_296 +call testall t_29k +call testall t_32 +call testall t_3201x +call testall t_3203x +call testall t_3205x +call testall t_3206x +call testall t_370 +call testall t_4004 +call testall t_403 +call testall t_4500 +call testall t_47c00 +call testall t_48 +call testall t_56000 +call testall t_56300 +call testall t_65 +call testall t_6502u +call testall t_6804 +call testall t_68040 +call testall t_6805 +call testall t_6808 +call testall t_6812 +call testall t_6816 +call testall t_7000 +call testall t_75k0 +call testall t_7700 +call testall t_7720 +call testall t_77230 +call testall t_7725 +call testall t_78c1x +call testall t_78k0 +call testall t_85 +call testall t_87c800 +call testall t_8X30x +call testall t_96 +call testall t_960 +call testall t_97c241 +call testall t_9900 +call testall t_ace +call testall t_avr +call testall t_bas52 +call testall t_buf32 +call testall t_cop8 +call testall t_f2mc8l +call testall t_fl90 +call testall t_fl900 +call testall t_full09 +call testall t_h8_3 +call testall t_h8_5 +call testall t_m16c +call testall t_mcore +call testall t_mic51 +call testall t_msp +call testall t_parsys +call testall t_scmp +call testall t_secdrive +call testall t_st6 +call testall t_st7 +call testall t_st9 +call testall t_tms7 +call testall t_xa +call testall t_z380 +call testall t_z8 +echo successes: %SUMPASS% >> ..\testlog +echo failures: %SUMFAIL% >> ..\testlog +type ..\testlog + +:end diff --git a/tests/warnlog.DE b/tests/warnlog.DE new file mode 100644 index 0000000..f75bc00 --- /dev/null +++ b/tests/warnlog.DE @@ -0,0 +1,35 @@ +t_166.asm(175) : Warnung  : moegliche Pipelining-Effekte +t_166.asm(181) : Warnung  : moegliche Pipelining-Effekte +t_166.asm(181) : Warnung  : moegliche Pipelining-Effekte +t_166.asm(185) : Warnung  : moegliche Pipelining-Effekte +t_166.asm(226) : Warnung  : Seite moeglicherweise nicht adressierbar +t_166.asm(231) : Warnung  : Seite moeglicherweise nicht adressierbar +t_16c84.asm(9) : Warnung  : veralteter Befehl +t_16c84.asm(50) : Warnung  : veralteter Befehl +t_3203x.asm(259) : Warnung  : mehrfache Adressregisterbenutzung in einer Anweisung +t_3203x.asm(259) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_3203x.asm(261) : Warnung  : mehrfache Adressregisterbenutzung in einer Anweisung +t_7000.asm(95) : Warnung  : moegliche Pipelining-Effekte +t_7000.asm(96) : Warnung  : moegliche Pipelining-Effekte +t_7000.asm(97) : Warnung  : moegliche Pipelining-Effekte +t_7000.asm(98) : Warnung  : moegliche Pipelining-Effekte +t_7000.asm(99) : Warnung  : moegliche Pipelining-Effekte +t_75k0.asm(186) : Warnung  : Seite moeglicherweise nicht adressierbar +t_87c800.asm(134) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_87c800.asm(135) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_87c800.asm(167) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_96.asm(155) : Warnung  : kurzer Sprung moeglich +t_96.asm(159) : Warnung  : kurzer Sprung moeglich +t_cop8.asm(112) : Warnung  : Distanz 0 nicht bei Kurzsprung erlaubt (NOP erzeugt) +t_xa.asm(591) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(592) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(593) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(594) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(595) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(596) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(597) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(598) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(599) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(600) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(601) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung +t_xa.asm(602) : Warnung  : nicht vorhersagbare Ausfuehrung dieser Anweisung diff --git a/tests/warnlog.EN b/tests/warnlog.EN new file mode 100644 index 0000000..5e7afe3 --- /dev/null +++ b/tests/warnlog.EN @@ -0,0 +1,35 @@ +t_166.asm(175) : warning  : possible pipelining effects +t_166.asm(181) : warning  : possible pipelining effects +t_166.asm(181) : warning  : possible pipelining effects +t_166.asm(185) : warning  : possible pipelining effects +t_166.asm(226) : warning  : page might not be addressable +t_166.asm(231) : warning  : page might not be addressable +t_16c84.asm(9) : warning  : obsolete instruction, usage discouraged +t_16c84.asm(50) : warning  : obsolete instruction, usage discouraged +t_3203x.asm(259) : warning  : multiple use of address register in one instruction +t_3203x.asm(259) : warning  : unpredictable execution of this instruction +t_3203x.asm(261) : warning  : multiple use of address register in one instruction +t_7000.asm(95) : warning  : possible pipelining effects +t_7000.asm(96) : warning  : possible pipelining effects +t_7000.asm(97) : warning  : possible pipelining effects +t_7000.asm(98) : warning  : possible pipelining effects +t_7000.asm(99) : warning  : possible pipelining effects +t_75k0.asm(186) : warning  : page might not be addressable +t_87c800.asm(134) : warning  : unpredictable execution of this instruction +t_87c800.asm(135) : warning  : unpredictable execution of this instruction +t_87c800.asm(167) : warning  : unpredictable execution of this instruction +t_96.asm(155) : warning  : short jump possible +t_96.asm(159) : warning  : short jump possible +t_cop8.asm(112) : warning  : distance of 0 not allowed for short jump (NOP created instead) +t_xa.asm(591) : warning  : unpredictable execution of this instruction +t_xa.asm(592) : warning  : unpredictable execution of this instruction +t_xa.asm(593) : warning  : unpredictable execution of this instruction +t_xa.asm(594) : warning  : unpredictable execution of this instruction +t_xa.asm(595) : warning  : unpredictable execution of this instruction +t_xa.asm(596) : warning  : unpredictable execution of this instruction +t_xa.asm(597) : warning  : unpredictable execution of this instruction +t_xa.asm(598) : warning  : unpredictable execution of this instruction +t_xa.asm(599) : warning  : unpredictable execution of this instruction +t_xa.asm(600) : warning  : unpredictable execution of this instruction +t_xa.asm(601) : warning  : unpredictable execution of this instruction +t_xa.asm(602) : warning  : unpredictable execution of this instruction  | 
