--- /dev/null
+* RECURSIVE FACULTY CALCULATION - RECURSIVE STACK DEMO
+*
+*
+* AUTHOR:
+*
+* PHILIPP HACHTMANN
+*
+*
+* VERSIONS:
+*
+* 1.0 - INITIAL AND FINAL VERSION (22.12.2007)
+*
+*
+* PURPOSE:
+*
+* TO DEMONSTRATE THE SOFTWARE STACK'S ABILITIES.
+* THE PROGRAM RECURSIVELY CALCULATES THE FACULTY OF A NUMBER SUPPLIED
+* BY THE USER. RETURN ADDRESSES AND LOCAL DATA OF THE RECURSIVE ROUTINE
+* ARE PUSHED TO AND POPPED FROM THE STACK.
+*
+*
+* USAGE:
+*
+* JUST ASSEMBLE, LOAD AND EXECUTE.
+*
+* THE FACULTY ROUTINE CAN ALSO BE ACCESSED BY OTHER PROGRAMS. IT CAN
+* BE CALLED WITH
+* JST FACLTY
+* AND THE ARGUMENT IN THE A-REGISTER. THE RESULT WILL BE IN THE A-REGISTER
+* AFTERWARDS.
+*
+*
+********************************************************************************
+*
+*
+**** GLOBAL SETTINGS
+*
+ SUBR FACLTY,FAK EXPORT RECURSIVE ROUTINE
+ REL RELOCATEABLE MODE
+ ORG '0 COUNT FROM ZERO
+*
+*
+********************************************************************************
+*
+*
+**** MAIN ROUTINE
+*
+MAIN CALL S$INIT INITIALIZE STACK POINTER
+*
+ CALL F$W1 WRITE TO ASR
+ DAC BANR POINTER TO BANNER FORMAT
+ CALL F$CB
+*
+AGIN CALL F$W1 WRITE TO ASR
+ DAC FMT1 USING THIS FORMAT STRING
+ CALL F$CB CLOSE BUFFERS
+*
+ CALL F$R1 READ FROM ASR
+ DAC FMT2 WITH THIS FORMAT
+ CALL F$AR ARGUMENT PROCESSING ROUTINE
+ DEC 1 NUMBER OF WORDS IN ARGUMENT
+ DAC NUM POINTER TO ARGUMENT
+ CALL F$CB CLOSE BUFFERS
+*
+ LDA NUM LOAD DATA
+ JST FAK2 RUN RECURSIVE FACULTY ROUTINE
+ STA NUM SAVE RESULT BACK TO DATA
+*
+ CALL F$W1 WRITE TO ASR
+ DAC FMT3 USING THIS FORMAT STRING
+ CALL F$AR ARGUMENT PROCESSING ROUTINE
+ DEC 1 NUMBER OF WORDS IN ARGUMENT
+ DAC NUM POINTER TO ARGUMENT
+ CALL F$CB CLOSE BUFFERS
+*
+ CALL F$W1
+ DAC FMT4 READY MESSAGE
+ CALL F$CB
+*
+ HLT HALT SYSTEM
+ JMP AGIN DO IT AGAIN - AND AGAIN....
+*
+*
+********************************************************************************
+*
+*
+**** RECURSIVE FACULTY CALCULATION!
+*
+* CALL FAK
+*
+FAK DAC **
+ STA ARG1
+ LDA FAK RETURN ADDRESS!
+ STA RET SAVE :-)
+ CALL S$PUSM
+ DAC ARG1
+ DEC 2 2 WORDS TO SAVE
+*
+ LDA ARG1
+ SUB =1 MINUS 1
+ SNZ
+ JMP NDY WE ARE AT LEVEL 1, SO RETURN 1
+ JST FAK CALL RECURSIVELY!!!
+ CALL S$POPM RESTORE MEMORY
+ DAC ARG1
+ DEC 2
+ CALL M$11 NORMAL MULTIPLY
+ DAC ARG1
+REST JMP* RET RETURN THROUGH ANOTHER DOOR
+*
+NDY CALL S$POPM RESTORE MEMORY
+ DAC ARG1
+ DEC 2
+ LDA ARG1 SHOULD BE 1
+ JMP* RET
+*
+*
+********************************************************************************
+*
+*
+**** RECURSIVE FACULTY CALCULATION! - ALTERNATIVE IMPLEMENTATION
+*
+* CALL FAK
+*
+FAK2 DAC **
+ STA ARG
+*
+ LDA ARG
+ CAS =1 COMPARE
+ JMP AGO A > 1 : DO IT AGAIN!
+ NOP A = 1 : RETURN WITH A=1
+ NOP A < 1 : RETURN WITH A=0
+ JMP* FAK2 RETURN.
+*
+AGO LDA FAK2 LOAD RETURN ADDRESS
+ CALL S$PUSH PUSH IT TO THE STACK
+ LDA ARG LOAD ARGUMENT
+ CALL S$PUSH PUSH IT TO THE STACK
+*
+ SUB =1 SUBSTRACT ONE.
+ JST FAK2 CALL RECURSIVELY!
+*
+ CALL S$POPM RESTORE MEMORY
+ DAC RET COMFORTABLE REVERSE ORDER
+ DEC 2 COPY TWO WORDS FROM STACK
+*
+ CALL M$11 CALL INTEGER MULTIPLICATION
+ DAC ARG THIS IS THE ORIGINAL ARG AGAIN.
+ JMP* RET RETURN THROUGH ANOTHER DOOR
+*
+*
+****************************************
+*
+*
+**** VARIABLES AND CONSTANTS
+*
+ARG1 DEC 0
+RET DEC 0 RETURN ADDRESS BUFFER USED BY FAK
+ARG DEC 0 ARGUMENT BUFFER USED BY FAK
+*
+NUM DEC 0 ARGUMENT BUFFER USED BY THE MAIN ROUTINE
+*
+BANR BCI 20,(34H0RECURSIVE FACULTY CALCULATION 1.0)
+FMT1 BCI 10,(7H INPUT:) PROMPT FORMAT
+FMT2 BCI 10,(I1)
+FMT3 BCI 10,(7HRESULT:,I7) OUTPUT FORMAT
+FMT4 BCI 10,(7H0READY.) END MESSAGE
+*
+*
+********************************************************************************
+*
+*
+**** END OF PROGRAM
+*
+ END
+*
+*
+********************************************************************************
\ No newline at end of file