ldc 5 ; @a
ldc 12 ; @b
bsr sumsquare
ajs -2 ; verwijder parameters
lds 5 ; resultaat op de stack
bra next
sumsquare:
link 1 ; 1 locale variabele
ldl -3 ; a
ldl -3 ; a
mul ; a*a
ldl -2 ; b
ldl -2 ; b
mul ; b*b
add ; a*a + b*b
stl 1 ; x
unlink 1
ret
next:
ldc 1 ; @a
ldc 2 ; @b
ldc 3 ; @c
ldc 4 ; @d
bsr complex_multiply
ldr RR
ldr 5
ldc -1 ; @a
ldc 1 ; @b
bsr complex_square
ldr RR
ldr 5
ldc 3 ; @a
ldc 4 ; @b
bsr pyth
ldr RR ; @c
annote SP -2 0 blue "pythagoras a^2 + b^2 = c^2"
ldc 11; @root
bsr sq
ldr 4 ; @square
bsr sqrt
ldr 4
bra exit
complex_square:
link
ldl -3
ldl -3
mul
ldl -2
ldl -2
mul
sub
str RR
ldl -3
ldl -2
mul
ldc 2
mul
str 5
unlink
ret
complex_multiply:
link
ldl -5
ldl -3
mul
ldl -4
ldl -2
mul
sub
str RR
ldl -5
ldl -2
mul
ldl -4
ldl -3
mul
add
str 5
unlink
ret
pyth:
lds -2 ; @a
bsr sq
ajs -1
ldr 4
lds -2 ; @b
bsr sq
ajs -1
ldr 4
add
bsr sqrt
ajs -1
ret
sqrt:
link 0
lds -2 ; @root take the number to sqrt from the stack
ldc 16 ; @i we will take a maximum of 16 itterations of newtons method
ldl 1 ; @p
sqrt_loop:
lds 0 ; take current trice
lds 0
mul ; multiply together
ldl 1 ; now take the sqrt we want
add ; add this and the square together
lds -1
ldc 2
mul
div
lds -1 ; @p_old
lds -1 ; @p_new
eq
brt sqrt_exit
sts -1 ; @p
ldl 2 ; Load iter count
ldc 1 ; 1
sub ; decrement iter count
stl 2 ; @i store iter count
ajs 1 ;
ldc 0
eq
brf sqrt_loop ; jump back if
sqrt_exit:
str 4 ; @
unlink
ret
sq:
lds -1
lds 0
mul
str 4
ret
ldc 12 ; @n
bsr factorial
ldr RR
halt
factorial:
lds -1
lds 0
factorial_loop:
lds -1
ldc 1
sub
lds 0
brt factorial_exit
lds 0
sts -3 ; @n
mul ; @f_n
bra factorial_loop
factorial_exit:
ajs -1
str RR
ajs -1
ret
exit: halt