* 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 * * ********************************************************************************