Re: A86: Math program


[Prev][Next][Index][Thread]

Re: A86: Math program




You don't have to write that, unless it is just for experience.  The 85/86
have  a polynomial solver built-in.

At 10:36 AM 6/13/98 +0000, you wrote:
>
>I'm converting a math program I had written in Basic to ASM.
>It will do somethind like
>
>prompt A,B,C
>(-B+(sqrt)(B^2-4*A*C))/(2*A)->X
>(-B-(sqrt)(B^2-4*A*C))/(2*A)->X
>Disp X,Y
>-B/(2*A)->X
>-(B^2-4*A*C)/(4*A)->Y
>Disp X,Y
>
>However with some number like A=5 B=6 and C=5 I keep getting either ERROR 15
>MEMORY
>or 02 DIV BY ZERO or I get different numbers for the X and Y
>
>Can someone take a look at it?
>
>Also, I copied a prompt routine from a triangle tester program of Elroy
>(elroy@usa.net)
>and still dont understand it. 
>What is call _mov10b for? And (_asap_ind) ? And call _exec_pg3?
>
>Thanks
>
>
>
>
>#define equ .equ
>#define EQU .equ
>#define end .end
>
>
>
>_asm_exec_ram   equ     		0D748h
>_clrLCD         equ     		4A7Eh
>_runindicoff    equ     		4AB1h
>_clrWindow		equ				4A86h
>_puts           equ             4A37h
>_curRow         equ     		0C00Fh
>_homeUp			equ				4A95h
>_dispOP1		equ				515Bh
>_asap_ind		equ				0D623h
>_exec_pg3		equ				5714h
>_homeUp			equ				4A95h
>_ioprompt		equ				0C324h
>_mov10b			equ				427Bh
>_formReal   	equ 			5191h
>_getkey         equ             55AAh
>
>;------Floating Point Stack------
>
>_push_OP1 		equ 			4813h
>_push_OP2 		equ 			480Fh
>_push_OP3 		equ 			480Bh
>_push_OP4 		equ 			4807h
>_push_OP5 		equ 			4803h
>_push_OP6 		equ 			47FFh
>_pop_OP1 		equ 			47B7h
>_pop_OP2 		equ 			47B3h
>_pop_OP3 		equ 			47AFh
>_pop_OP4 		equ 			47ABh
>_pop_OP5 		equ 			47A7h
>_pop_OP6 		equ 			47A3h
>
>;-----------OPs--------------
>
>_OP1TOOP2       equ             4233h
>_OP1TOOP3       equ             421Fh
>_OP1TOOP4       equ     		4207h
>_OP1TOOP5       equ     		426Bh
>_OP1TOOP6       equ     		4263h
>_OP2TOOP1       equ             426Fh
>_OP3TOOP1       equ             424Bh
>_OP3TOOP2       equ             421Bh
>_OP4TOOP1       equ             4243h
>_OP4TOOP2       equ             4213h
>_OP5TOOP1       equ             4247h
>_OP5TOOP2       equ             4227h
>_OP6TOOP1       equ             423Fh
>_OP6TOOP2       equ             423Bh
>_ZEROOP1        equ     		436Bh
>_ZEROOP2        equ     		436Fh
>_ZEROOP3        equ     		4373h
>_OP1SET0        equ             435Fh
>_OP1SET2        equ             431Fh
>_OP1SET4        equ             4313h
>_OP2SET0        equ            435Bh
>_OP2SET4        equ             42FBh
>_CPOP1OP2		equ				41FBh
>
>;---------Math--------------
>
>_FPMULT         equ             548Ch
>_FPSQUARE       equ             5488h 
>_FPADD          equ             5478h 
>_SQROOT         equ             54ACh 
>_FPSUB          equ             5474h 
>_FPDIV          equ             54A8h 
>_MINUS1         equ             5470h
>
>
>
>.org _asm_exec_ram
>
>
>	call _clrLCD
>	call _homeUp
>	call _clrWindow
>	call _runindicoff
>	ld a,0
>	ld (nozero),a
>
>Input:
>	ld bc,$0004
>	ld (_curRow),bc
>	ld de,_ioprompt
>	ld hl,PergA
>	call Prompt
>	call _OP1TOOP4		;OP4 = A
>	ld de,_ioprompt
>	ld hl,PergB
>	call Prompt
>	call _OP1TOOP5		;OP5 = B
>	ld de,_ioprompt
>	ld hl,PergC
>	call Prompt
>	call _OP1TOOP6		;OP6 = C
>	call _ZEROOP1
>	call _ZEROOP2
>	call _ZEROOP3
>
>Calculo:
>	call _OP4TOOP1		;OP1 = A
>	call _OP6TOOP2		;OP2 = C
>	call _FPMULT		;A*C
>	call _OP2SET4		;OP2 = 4
>	call _FPMULT		;OP1 = 4*A*C
>	call _push_OP1		;FPS = 4*A*C
>	call _OP5TOOP1		;OP1 = B
>	call _FPSQUARE		;OP1 = B^2
>	call _pop_OP2		;OP2 = 4*A*C
>	call _FPSUB			;OP1 =B^2-4AC
>	call _push_OP1		;FPS = (B^2-4*A*C)
>	call _OP1TOOP2		;OP2= B^2-4AC
>	call _ZEROOP1		;OP1= 0
>	call _CPOP1OP2		;OP1-OP2
>	jp m,Exit			;If (OP1-OP2) < 0, Goto Exit
>	call _OP2TOOP1		;OP2 = B^2-4*A*C
>	call _SQROOT		;OP1 = (sqrt)(B^2-4AC)
>	call _push_OP1		;FPS = (B^2-4*A*C);((sqrt)(B^2-4*A*C))
>	call _OP1SET0		;OP1 = 0
>	call _MINUS1		;OP1 = -1
>	call _OP5TOOP2		;OP2 = B
>	call _FPMULT		;OP1 = -B
>	call _push_OP1		;FPS = (B^2-4*A*C);((sqrt)(B^2-4*A*C));-B
>	
>_Minus:
>	call _pop_OP1		;OP1 = -B
>	call _pop_OP2		;OP3 = (sqrt)(B^2-4*A*C)
>	call _push_OP2		;FPS = (B^2-4*A*C);((sqrt)(B^2-4*A*C))
>	call _push_OP1		;FPS = (B^2-4*A*C);((sqrt)(B^2-4*A*C));-B
>	call _FPSUB			;OP1 = -B - (sqrt)(B^2-4*A*C)
>	call _push_OP1		;fps = (B^2-4*A*C);((sqrt)(B^2-4*A*C));-B;-B -
>(sqrt)(B^2-4*A*C)
>	call _OP1SET2		;OP1 = 2
>	call _OP4TOOP2		;OP2 = A
>	call _FPMULT		;OP1 = 2*A
>	call _OP1TOOP2		;OP2 = 2*A
>	call _pop_OP1		;OP1 = -B -(srqt)(B^2 -4*A*C)
>	call _FPDIV			;OP1 = (-B -(sqrt)(B^2 -4*A*C))/(2*A)
>	call _push_OP1		;FPS = (B^2-4*A*C);((sqrt)(B^2-4*A*C));-B;Minus result
>
>_Plus:
>	call _pop_OP3		;OP3 = Minus result
>	call _pop_OP2		;OP2 = -B
>	call _pop_OP1		;OP1 = (sqrt)(B^2-4*A*C)
>	call _FPADD			;OP1 = -B + (sqrt)(B^2-4*A*C)
>	call _push_OP3  	;FPS = (B^2-4*A*C);Minus result	
>	call _push_OP1		;FPS = (B^2-4*A*C);Minus result; -B + (sqrt)(B^2-4*A*C)
>	call _OP1SET2		;OP1 = 2
>	call _OP4TOOP2		;OP2 = A
>	call _FPMULT		;OP1 = 2*A
>	call _OP1TOOP2		;OP2 = 2*A
>	call _pop_OP1		;OP1 = -B +(srqt)(B^2 -4*A*C)
>	call _FPDIV			;OP1 = (-B +(sqrt)(B^2 -4*A*C))/(2*A)
>	call _OP1TOOP2		;OP2 = Plus result
>	call _pop_OP1		;OP1 = Minus result
>
>Ordering:
>	call _push_OP6		;FPS = (B^2-4*A*C);C
>	call _push_OP5		;FPS = (B^2-4*A*C);C;B
>	call _push_OP4		;FPS = (B^2-4*A*C);C;B;A
>	call _push_OP2		;FPS = (B^2-4*A*C);C;B;A;Plus Result
>	call _push_OP1		;FPS = (B^2-4*A*C);C;B;A;Plus Result;Minus Result
>	call _CPOP1OP2		;OP1-OP2
>	jp p,Change
>	jr Displaying
>
>Change:
>	call _push_OP1
>	call _OP2TOOP1
>	call _pop_OP2
>	jr Displaying
>
>Exit:
>	ld a,1
>	ld (nozero),a
>
>Displaying:
>	call _clrLCD
>	call _clrWindow
>	ld hl,$0000
>	ld (_curRow),hl
>	ld hl,zeros
>	call _puts
>	ld a,(nozero)
>	ld b,a
>	ld a,0
>	cp b
>	jp nz,Wozeros
>	ld hl,$0001
>	ld (_curRow),hl
>	call _dispOP1
>	call _push_OP1
>	call _OP2TOOP1
>	call _pop_OP2
>	call _dispOP1
>	jr Vertice
>
>Wozeros:
>	ld hl,$0801
>	ld (_curRow),hl
>	ld hl,no_zero
>	call _puts
>
>Vertice:
>	ld hl,$0003
>	ld (_curRow),hl
>	ld hl,vertice
>	call _puts
>	call _pop_OP1		;FPS = (B^2-4*A*C);C;B;A;Plus Result
>	call _pop_OP1		;FPS = (B^2-4*A*C);C;B;A
>	call _pop_OP4		;FPS = (B^2-4*A*C);C;B
>	call _pop_OP5		;FPS = (B^2-4*A*C);C
>	call _pop_OP6		;FPS = (B^2-4*A*C)
>	call _OP1SET0		;OP1 = 0
>	call _MINUS1		;OP1 = -1
>	call _OP5TOOP2		;OP2 = B
>	call _FPMULT		;OP1 = -B
>	call _push_OP1		;FPS = (B^2-4*A*C);-B
>	call _OP1SET2		;OP1 = 2
>	call _OP4TOOP2		;OP2 = A
>	call _FPMULT		;OP1 = 2*A
>	call _OP1TOOP2		;OP2 = 2*A
>	call _pop_OP1		;OP1 = -B
>	call _FPDIV			;OP1 = -B/(2*A)
>	ld hl,$0004
>	ld (_curRow),hl
>	call _push_OP6
>	call _push_OP5
>	call _push_OP4		;FPS = (B^2-4*A*C);C;B;A
>	call _dispOP1
>	call _pop_OP4
>	call _pop_OP5
>	call _pop_OP6
>	call _OP1SET0
>	call _MINUS1		;OP1 = -1
>	call _pop_OP2		;OP2 = (B^2-4*A*C)
>	call _FPMULT		;OP1 = -(B^2-4*A*C)
>	call _push_OP1
>	call _OP1SET4
>	call _OP4TOOP2
>	call _FPMULT		;OP1 = 4*A
>	call _OP1TOOP2
>	call _pop_OP1
>	call _FPDIV
>	call _push_OP6
>	call _push_OP5
>	call _push_OP4		;FPS = C;B;A
>	ld hl,$0005
>	ld (_curRow),hl
>	call _dispOP1
>	ret
>
>Prompt:
>	call _mov10b		;move to prompt buffer, 10 bytes
>	ld a,0Dh
>	ld (_asap_ind),a
>	call _exec_pg3
>	ret
>
>no_zero:
>	.db "nao tem zeros",0
>nozero:
>	.db 0
>PergA:
>	.db "A=?",0
>PergB:
>	.db "B=?",0
>PergC
>	.db "C=?",0
>zeros:
>	.db "Zero(s)",0
>vertice:
>	.db "Vertice",0
>
>
>


// David Phillips
// mailto:electrum@tfs.net
// ICQ: 13811951
// AIM: electrum32


References: