; \FIB.XPL 7-Apr-2005 ; \Recursive Fibonacci Series ; ; inc D16Codes;\D16CODES.XPL Complete Set of Intrinsics ; ; code Abs=0, Ran=1, Rem=2, Reserve=3, ; Swap=4, Extend=5, Restart=6, Chin=7, ; ChOut=8, CrLf=9, IntIn=10, IntOut=11, ; Text=12, OpenI=13, OpenO=14, Close=15, ; Abort=16, Trap=17, Free=18, Rerun=19, ; GetHp=20, SetHp=21, GetErr=22, \Cursor=23,\ ; \FSet=24,\ SetRun=25, HexIn=26, HexOut=27, ; RanSeed=79; ; ; int II; ; ; 000000 INCL "D16RUN.ASM" 0005C4 PROGRM 0005C4 030E05F8 JMP L1 ;jump over Fib function to the ; Main procedure near the bottom 0005C6 L2 ; func Fib(N); ; int N; ;local variable = argument passed ; to function 0005C6 0041 PSX ;save IX on stack 0005C7 01203002 LDX (HP) ;save HP 0005C9 0041 PSX 0005CA 003E MXA ;reserve space for one local variable 0005CB 03050001 ADD 1 0005CD 01033002 STA (HP) ; begin 0005CF 03010001 LDA 1 0005D1 08070000 SUB (IX+0) 0005D3 031205DC JMI L4 0005D5 03010001 LDA 1 ;return 1 in AC 0005D7 0043 POX ;restore HP 0005D8 01223002 STX (HP) 0005DA 0043 POX ;restore IX 0005DB 002E RTN 0005DC L4 ; if N <= 1 then return 1; 0005DC 08010000 LDA (IX+0) ;N 0005DE 001B DEC ;-1 0005DF 01213002 LDY (HP) ;pass argument via heap 0005E1 09030000 STA (IY+0) 0005E3 031705C6 CSR L2 ;call Fib (recursively) 0005E5 0028 PSA ;save returned result 0005E6 08010000 LDA (IX+0) ;N 0005E8 03070002 SUB 2 ;-2 0005EA 01213002 LDY (HP) ;pass it 0005EC 09030000 STA (IY+0) 0005EE 031705C6 CSR L2 ;call Fib 0005F0 0A050000 ADD (SP+0) ;sum the returned values 0005F2 0037 INS ;increment SP to discard 0005F3 0043 POX ;restore HP 0005F4 01223002 STX (HP) 0005F6 0043 POX ;restore IX 0005F7 002E RTN ; return Fib(N-1) + Fib(N-2); ; end; \Fib ; 0005F8 L1 0005F8 01013002 LDA (HP) ;reserve space for II, etc. 0005FA 03050005 ADD 5 ;(the 1st 4 words are called 0005FC 01033002 STA (HP) ; global 0 and are used to ; begin \Main ; return floating point values) 0005FE 001F CLR 0005FF 01033230 STA (HEAPLO+4) ;II:= 0 000601 L5 ; for II:= 0, 15 do 000601 001F CLR 000602 0028 PSA 000603 01213002 LDY (HP) 000605 01013230 LDA (HEAPLO+4) 000607 09030000 STA (IY+0) 000609 031705C6 CSR L2 ;Fib 00060B 0317012A CSR INTR11 ;Intout 00060D 001F CLR 00060E 031700ED CSR INTR9 ;Crlf 000610 01013230 LDA (HEAPLO+4) ;II++ 000612 001A INC 000613 01033230 STA (HEAPLO+4) 000615 03070010 SUB 16 ;loop until II = 16 000617 03120601 JMI L5 ; [Intout(0, Fib(II)); Crlf(0)]; ; end \Main 000619 002E RTN 00322C ORG DATA 0000322C = HEAPLO EQU $ 000000 END