;------------------------------------------------------- ; 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