1 * RECURSIVE FACULTY CALCULATION - RECURSIVE STACK DEMO
11 * 1.0 - INITIAL AND FINAL VERSION (22.12.2007)
16 * TO DEMONSTRATE THE SOFTWARE STACK'S ABILITIES.
17 * THE PROGRAM RECURSIVELY CALCULATES THE FACULTY OF A NUMBER SUPPLIED
18 * BY THE USER. RETURN ADDRESSES AND LOCAL DATA OF THE RECURSIVE ROUTINE
19 * ARE PUSHED TO AND POPPED FROM THE STACK.
24 * JUST ASSEMBLE, LOAD AND EXECUTE.
26 * THE FACULTY ROUTINE CAN ALSO BE ACCESSED BY OTHER PROGRAMS. IT CAN
29 * AND THE ARGUMENT IN THE A-REGISTER. THE RESULT WILL BE IN THE A-REGISTER
34 ********************************************************************************
39 SUBR FACLTY,FAK EXPORT RECURSIVE ROUTINE
41 ORG '0 COUNT FROM ZERO
44 ********************************************************************************
49 MAIN CALL S$INIT INITIALIZE STACK POINTER
51 CALL F$W1 WRITE TO ASR
52 DAC BANR POINTER TO BANNER FORMAT
55 AGIN CALL F$W1 WRITE TO ASR
56 DAC FMT1 USING THIS FORMAT STRING
57 CALL F$CB CLOSE BUFFERS
59 CALL F$R1 READ FROM ASR
60 DAC FMT2 WITH THIS FORMAT
61 CALL F$AR ARGUMENT PROCESSING ROUTINE
62 DEC 1 NUMBER OF WORDS IN ARGUMENT
63 DAC NUM POINTER TO ARGUMENT
64 CALL F$CB CLOSE BUFFERS
67 JST FAK2 RUN RECURSIVE FACULTY ROUTINE
68 STA NUM SAVE RESULT BACK TO DATA
70 CALL F$W1 WRITE TO ASR
71 DAC FMT3 USING THIS FORMAT STRING
72 CALL F$AR ARGUMENT PROCESSING ROUTINE
73 DEC 1 NUMBER OF WORDS IN ARGUMENT
74 DAC NUM POINTER TO ARGUMENT
75 CALL F$CB CLOSE BUFFERS
78 DAC FMT4 READY MESSAGE
82 JMP AGIN DO IT AGAIN - AND AGAIN....
85 ********************************************************************************
88 **** RECURSIVE FACULTY CALCULATION!
94 LDA FAK RETURN ADDRESS!
103 JMP NDY WE ARE AT LEVEL 1, SO RETURN 1
104 JST FAK CALL RECURSIVELY!!!
105 CALL S$POPM RESTORE MEMORY
108 CALL M$11 NORMAL MULTIPLY
110 REST JMP* RET RETURN THROUGH ANOTHER DOOR
112 NDY CALL S$POPM RESTORE MEMORY
119 ********************************************************************************
122 **** RECURSIVE FACULTY CALCULATION! - ALTERNATIVE IMPLEMENTATION
131 JMP AGO A > 1 : DO IT AGAIN!
132 NOP A = 1 : RETURN WITH A=1
133 NOP A < 1 : RETURN WITH A=0
136 AGO LDA FAK2 LOAD RETURN ADDRESS
137 CALL S$PUSH PUSH IT TO THE STACK
138 LDA ARG LOAD ARGUMENT
139 CALL S$PUSH PUSH IT TO THE STACK
141 SUB =1 SUBSTRACT ONE.
142 JST FAK2 CALL RECURSIVELY!
144 CALL S$POPM RESTORE MEMORY
145 DAC RET COMFORTABLE REVERSE ORDER
146 DEC 2 COPY TWO WORDS FROM STACK
148 CALL M$11 CALL INTEGER MULTIPLICATION
149 DAC ARG THIS IS THE ORIGINAL ARG AGAIN.
150 JMP* RET RETURN THROUGH ANOTHER DOOR
153 ****************************************
156 **** VARIABLES AND CONSTANTS
159 RET DEC 0 RETURN ADDRESS BUFFER USED BY FAK
160 ARG DEC 0 ARGUMENT BUFFER USED BY FAK
162 NUM DEC 0 ARGUMENT BUFFER USED BY THE MAIN ROUTINE
164 BANR BCI 20,(34H0RECURSIVE FACULTY CALCULATION 1.0)
165 FMT1 BCI 10,(7H INPUT:) PROMPT FORMAT
167 FMT3 BCI 10,(7HRESULT:,I7) OUTPUT FORMAT
168 FMT4 BCI 10,(7H0READY.) END MESSAGE
171 ********************************************************************************
179 ********************************************************************************