Skip to content

Instantly share code, notes, and snippets.

@thebird
Created December 6, 2010 20:48
Show Gist options
  • Save thebird/730917 to your computer and use it in GitHub Desktop.
Save thebird/730917 to your computer and use it in GitHub Desktop.
INCLUDE 'derivative.inc'
XREF MCU_init
XDEF Entry, _Startup, main
ORG $2000
ValueA ds.b 1
ValueB ds.b 1
ValueC ds.b 1
ValueA2 ds.b 1
ValueB2 ds.b 1
ValueC2 ds.b 1
ORG $2020
err ds.b 1
err1 ds.b 1
err2 ds.b 1
root11 ds.b 2
root12 ds.b 2
root21 ds.b 2
root22 ds.b 2
MY_EXTENDED_RAM: SECTION
Root1
Root2
MyCode: SECTION
main:
_Startup:
Entry:
LDS #$3600 ; initialize the stack pointer
LDAA ValueA
PSHA
LDAA #0
PSHA
LDAA ValueB
PSHA
LDAA #0
PSHA
LDAA ValueC
PSHA
LDAA #0
PSHA
JSR quad
LDAA err
STAA err1
PULY
PULX
STY root11
STX root12
LDAA ValueA2
PSHA
LDAA #0
PSHA
LDAA ValueB2
PSHA
LDAA #0
PSHA
LDAA ValueC2
PSHA
LDAA #0
PSHA
JSR quad
LDAA err
STAA err2
PULY
PULX
STY root21
STX root22
SWI
quad LEAS 2,SP ; remove reference from stack
LDAA #0 ; load 0 into A
LDAB 5,SP ; load inputA from stack into B
CBA ; compare A and B
LBEQ errorFlag ; if A=0 then run errorFlag
LDAA 3,SP ; load inputB from stack intp A
LDAB 3,SP ; load inputB from stack into B
MUL ; inputB * inputB
PSHD ; push D on stack
LDD 6,SP ; load inputA from stack into D
LDY 2,SP ; load inputC from stack into Y
EMULS ; inputA * inputC
LDY #4 ; load 4 into accum Y
EMULS ; result of last EMULS * 4
PSHD ; push D on stack
LDD 2,SP ; load D with B^2
SUBD 0,SP ; B^2 - 4AC
BEQ oneRoot ; if equal
BMI errorFlag ; if negative
BNE twoRoots ; if not equal and positive
oneRoot NEG 9,SP ; negate inputA from stack
BPL nonNeg ; if inputA is neg the goto nonNeg
LDD 10,SP ; load inputA from stack into D
LDY #2 ; load 2 into Y
EMULS ; multiply A*2
PSHD ; push result on  stack
LDD 10,SP ; load inputB from stack into D
LDAA #$FF ; load $FF into A
LDX 0,SP ; load A*2 into X
IDIVS ; divide D by X and store in D
BRA endOneRoot
nonNeg LDD 10,SP ; load inputA from stack into D
LDY #2 ; load 2 into Y
EMULS ; multiply A*2
PSHD ; push result on stack
LDD 10,SP ; load inputB from stack into D
LDAA #$00 ; load 0 into A
LDX 0,SP ; load A*2 into X
IDIVS ; divide D by X and store in D
BRA endOneRoot
endOneRoot MOVB #$00,err
LDAA err
LEAS 6,SP
PULY
PSHA
PSHX
PSHY
RTS
twoRoots JSR sqrt ; get sqrt of D
PSHD ; push D to stack
LDAB 11,SP ; load inputB from stack into B
NEGB ; negate B
ADDB 1,SP ; -B + sqrt
PSHD ; push result to stack
LDD 14,SP ; load inputA from stack into D
LDY #2 ; load 2 into Y
EMULS ; A * 2
PSHD ; push result to stack
LDAB 3,SP ; load -B + sqrt from stack into B
SEX B,D ; add 00 to beginning of B
LDX 0,SP ; load 2A from stack into X
IDIVS ; divide D by x
PSHX ; push root 1 on stack
LDAB 17,SP ; load inputB from stack into B
NEGB ; negate B
SUBB 7,SP ; -B - sqrt
PSHD ; push result to stack
LDD 20,SP ; load inputA from stack into D
LDY #2 ; load 2 into Y
EMULS ; A * 2
PSHD ; push result to stack
LDAB 3,SP ; load -B - sqrt from stack into B
SEX B,D ; add 00 to beginning of B
LDX 0,SP ; load 2A from stack into X
IDIVS ; divide D by x
MOVB #$00,err ; flag success
LEAS 4,SP ; clear unused stack info
PULY ; pull root1 into Y
LEAS 10,SP ; clear unused stack info
PULD
PSHX ; push root2 onto stack
PSHY ; push root1 onto stack
PSHD
RTS
sqrt PSHD
LDD #0
PSHD
sqrtloop CPD 2,SP
BHI donesqrt
ADDD 0,SP
INC 1,SP
ADDD 0,SP
BRA sqrtloop
donesqrt PULD
DECB
LEAS 2,SP
RTS
errorFlag LEAS 4,SP
MOVB #$FF,err
RTS
end SWI
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment