101 lines
2.5 KiB
Plaintext
101 lines
2.5 KiB
Plaintext
;-------------------------------------------------------
|
|
; useful equates
|
|
;-------------------------------------------------------
|
|
bdos equ 5 ; BDOS entry
|
|
cr equ 13 ; ASCII carriage return
|
|
lf equ 10 ; ASCII line feed
|
|
space equ 32 ; ASCII space char
|
|
conout equ 2 ; BDOS console output function
|
|
putstr equ 9 ; BDOS print string function
|
|
nterms equ 20 ; number of terms (max=24) to display
|
|
;-------------------------------------------------------
|
|
; main code begins here
|
|
;-------------------------------------------------------
|
|
org 100h
|
|
lxi h,0 ; save CP/M's stack
|
|
dad sp
|
|
shld oldstk
|
|
lxi sp,stack ; set our own stack
|
|
lxi d,signon ; print signon message
|
|
mvi c,putstr
|
|
call bdos
|
|
mvi a,0 ; start with Fib(0)
|
|
mloop: push a ; save our count
|
|
call fib
|
|
call putdec
|
|
mvi a,space ; separate the numbers
|
|
call putchr
|
|
pop a ; get our count back
|
|
inr a ; increment it
|
|
cpi nterms+1 ; have we reached our limit?
|
|
jnz mloop ; no, keep going
|
|
lhld oldstk ; all done; get CP/M's stack back
|
|
sphl ; restore it
|
|
ret ; back to command processor
|
|
;-------------------------------------------------------
|
|
; calculate nth Fibonacci number (max n = 24)
|
|
; entry: A = n
|
|
; exit: HL = Fib(n)
|
|
;-------------------------------------------------------
|
|
fib: mov c,a ; C holds n
|
|
lxi d,0 ; DE holds Fib(n-2)
|
|
lxi h,1 ; HL holds Fib(n-1)
|
|
ana a ; Fib(0) is a special case
|
|
jnz fib2 ; n > 0 so calculate normally
|
|
xchg ; otherwise return with HL=0
|
|
ret
|
|
fib2: dcr c
|
|
jz fib3 ; we're done
|
|
push h ; save Fib(n-1)
|
|
dad d ; HL = Fib(n), soon to be Fib(n-1)
|
|
pop d ; DE = old F(n-1), now Fib(n-2)
|
|
jmp fib2 ; ready for next pass
|
|
fib3: ret
|
|
;-------------------------------------------------------
|
|
; console output of char in A register
|
|
;-------------------------------------------------------
|
|
putchr: push h
|
|
push d
|
|
push b
|
|
mov e,a
|
|
mvi c,conout
|
|
call bdos
|
|
pop b
|
|
pop d
|
|
pop h
|
|
ret
|
|
;---------------------------------------------------------
|
|
; Output decimal number to console
|
|
; HL holds 16-bit unsigned binary number to print
|
|
;---------------------------------------------------------
|
|
putdec: push b
|
|
push d
|
|
push h
|
|
lxi b,-10
|
|
lxi d,-1
|
|
putdec2:
|
|
dad b
|
|
inx d
|
|
jc putdec2
|
|
lxi b,10
|
|
dad b
|
|
xchg
|
|
mov a,h
|
|
ora l
|
|
cnz putdec ; recursive call
|
|
mov a,e
|
|
adi '0'
|
|
call putchr
|
|
pop h
|
|
pop d
|
|
pop b
|
|
ret
|
|
;-------------------------------------------------------
|
|
; data area
|
|
;-------------------------------------------------------
|
|
signon: db 'Fibonacci number sequence:',cr,lf,'$'
|
|
oldstk: dw 0
|
|
stack equ $+128 ; 64-level stack
|
|
;
|
|
end
|