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
33 ********************************************************************************
38 SUBR FACLTY,FAK EXPORT RECURSIVE ROUTINE
40 ORG '0 COUNT FROM ZERO
43 ********************************************************************************
48 MAIN CALL S$INIT INITIALIZE STACK POINTER
50 CALL F$W1 WRITE TO ASR
51 DAC BANR POINTER TO BANNER FORMAT
54 AGIN CALL F$W1 WRITE TO ASR
55 DAC FMT1 USING THIS FORMAT STRING
56 CALL F$CB CLOSE BUFFERS
58 CALL F$R1 READ FROM ASR
59 DAC FMT2 WITH THIS FORMAT
60 CALL F$AR ARGUMENT PROCESSING ROUTINE
61 DEC 1 NUMBER OF WORDS IN ARGUMENT
62 DAC NUM POINTER TO ARGUMENT
63 CALL F$CB CLOSE BUFFERS
66 JST FAK2 RUN RECURSIVE FACULTY ROUTINE
67 STA NUM SAVE RESULT BACK TO DATA
69 CALL F$W1 WRITE TO ASR
70 DAC FMT3 USING THIS FORMAT STRING
71 CALL F$AR ARGUMENT PROCESSING ROUTINE
72 DEC 1 NUMBER OF WORDS IN ARGUMENT
73 DAC NUM POINTER TO ARGUMENT
74 CALL F$CB CLOSE BUFFERS
77 DAC FMT4 READY MESSAGE
81 JMP AGIN DO IT AGAIN - AND AGAIN....
84 ********************************************************************************
87 **** RECURSIVE FACULTY CALCULATION!
93 LDA FAK RETURN ADDRESS!
102 JMP NDY WE ARE AT LEVEL 1, SO RETURN 1
103 JST FAK CALL RECURSIVELY!!!
104 CALL S$POPM RESTORE MEMORY
107 CALL M$11 NORMAL MULTIPLY
109 REST JMP* RET RETURN THROUGH ANOTHER DOOR
111 NDY CALL S$POPM RESTORE MEMORY
118 ********************************************************************************
121 **** RECURSIVE FACULTY CALCULATION! - ALTERNATIVE IMPLEMENTATION
130 JMP AGO A > 1 : DO IT AGAIN!
131 NOP A = 1 : RETURN WITH A=1
132 NOP A < 1 : RETURN WITH A=0
135 AGO LDA FAK2 LOAD RETURN ADDRESS
136 CALL S$PUSH PUSH IT TO THE STACK
137 LDA ARG LOAD ARGUMENT
138 CALL S$PUSH PUSH IT TO THE STACK
140 SUB =1 SUBSTRACT ONE.
141 JST FAK2 CALL RECURSIVELY!
143 CALL S$POPM RESTORE MEMORY
144 DAC RET COMFORTABLE REVERSE ORDER
145 DEC 2 COPY TWO WORDS FROM STACK
147 CALL M$11 CALL INTEGER MULTIPLICATION
148 DAC ARG THIS IS THE ORIGINAL ARG AGAIN.
149 JMP* RET RETURN THROUGH ANOTHER DOOR
152 ****************************************
155 **** VARIABLES AND CONSTANTS
158 RET DEC 0 RETURN ADDRESS BUFFER USED BY FAK
159 ARG DEC 0 ARGUMENT BUFFER USED BY FAK
161 NUM DEC 0 ARGUMENT BUFFER USED BY THE MAIN ROUTINE
163 BANR BCI 20,(34H0RECURSIVE FACULTY CALCULATION 1.0)
164 FMT1 BCI 10,(7H INPUT:) PROMPT FORMAT
166 FMT3 BCI 10,(7HRESULT:,I7) OUTPUT FORMAT
167 FMT4 BCI 10,(7H0READY.) END MESSAGE
170 ********************************************************************************
178 ********************************************************************************