*** empty log message ***
[h316.git] / programs / libtest / src / faculty.asm
CommitLineData
8fac3a64 1* RECURSIVE FACULTY CALCULATION - RECURSIVE STACK DEMO
2*
3*
4* AUTHOR:
5*
6* PHILIPP HACHTMANN
7*
8*
9* VERSIONS:
10*
11* 1.0 - INITIAL AND FINAL VERSION (22.12.2007)
12*
13*
14* PURPOSE:
15*
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.
20*
21*
22* USAGE:
23*
24* JUST ASSEMBLE, LOAD AND EXECUTE.
25*
26* THE FACULTY ROUTINE CAN ALSO BE ACCESSED BY OTHER PROGRAMS. IT CAN
27* BE CALLED WITH
28* JST FACLTY
29* AND THE ARGUMENT IN THE A-REGISTER. THE RESULT WILL BE IN THE A-REGISTER
30* AFTERWARDS.
31*
ec6239e9 32*
8fac3a64 33*
34********************************************************************************
35*
36*
37**** GLOBAL SETTINGS
38*
39 SUBR FACLTY,FAK EXPORT RECURSIVE ROUTINE
40 REL RELOCATEABLE MODE
41 ORG '0 COUNT FROM ZERO
42*
43*
44********************************************************************************
45*
46*
47**** MAIN ROUTINE
48*
49MAIN CALL S$INIT INITIALIZE STACK POINTER
50*
51 CALL F$W1 WRITE TO ASR
52 DAC BANR POINTER TO BANNER FORMAT
53 CALL F$CB
54*
55AGIN CALL F$W1 WRITE TO ASR
56 DAC FMT1 USING THIS FORMAT STRING
57 CALL F$CB CLOSE BUFFERS
58*
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
65*
66 LDA NUM LOAD DATA
67 JST FAK2 RUN RECURSIVE FACULTY ROUTINE
68 STA NUM SAVE RESULT BACK TO DATA
69*
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
76*
77 CALL F$W1
78 DAC FMT4 READY MESSAGE
79 CALL F$CB
80*
81 HLT HALT SYSTEM
82 JMP AGIN DO IT AGAIN - AND AGAIN....
83*
84*
85********************************************************************************
86*
87*
88**** RECURSIVE FACULTY CALCULATION!
89*
90* CALL FAK
91*
92FAK DAC **
93 STA ARG1
94 LDA FAK RETURN ADDRESS!
95 STA RET SAVE :-)
96 CALL S$PUSM
97 DAC ARG1
98 DEC 2 2 WORDS TO SAVE
99*
100 LDA ARG1
101 SUB =1 MINUS 1
102 SNZ
103 JMP NDY WE ARE AT LEVEL 1, SO RETURN 1
104 JST FAK CALL RECURSIVELY!!!
105 CALL S$POPM RESTORE MEMORY
106 DAC ARG1
107 DEC 2
108 CALL M$11 NORMAL MULTIPLY
109 DAC ARG1
110REST JMP* RET RETURN THROUGH ANOTHER DOOR
111*
112NDY CALL S$POPM RESTORE MEMORY
113 DAC ARG1
114 DEC 2
115 LDA ARG1 SHOULD BE 1
116 JMP* RET
117*
118*
119********************************************************************************
120*
121*
122**** RECURSIVE FACULTY CALCULATION! - ALTERNATIVE IMPLEMENTATION
123*
124* CALL FAK
125*
126FAK2 DAC **
127 STA ARG
128*
129 LDA ARG
130 CAS =1 COMPARE
131 JMP AGO A > 1 : DO IT AGAIN!
132 NOP A = 1 : RETURN WITH A=1
133 NOP A < 1 : RETURN WITH A=0
134 JMP* FAK2 RETURN.
135*
136AGO 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
140*
141 SUB =1 SUBSTRACT ONE.
142 JST FAK2 CALL RECURSIVELY!
143*
144 CALL S$POPM RESTORE MEMORY
145 DAC RET COMFORTABLE REVERSE ORDER
146 DEC 2 COPY TWO WORDS FROM STACK
147*
148 CALL M$11 CALL INTEGER MULTIPLICATION
149 DAC ARG THIS IS THE ORIGINAL ARG AGAIN.
150 JMP* RET RETURN THROUGH ANOTHER DOOR
151*
152*
153****************************************
154*
155*
156**** VARIABLES AND CONSTANTS
157*
158ARG1 DEC 0
159RET DEC 0 RETURN ADDRESS BUFFER USED BY FAK
160ARG DEC 0 ARGUMENT BUFFER USED BY FAK
161*
162NUM DEC 0 ARGUMENT BUFFER USED BY THE MAIN ROUTINE
163*
164BANR BCI 20,(34H0RECURSIVE FACULTY CALCULATION 1.0)
165FMT1 BCI 10,(7H INPUT:) PROMPT FORMAT
166FMT2 BCI 10,(I1)
167FMT3 BCI 10,(7HRESULT:,I7) OUTPUT FORMAT
168FMT4 BCI 10,(7H0READY.) END MESSAGE
169*
170*
171********************************************************************************
172*
173*
174**** END OF PROGRAM
175*
176 END
177*
178*
179********************************************************************************