X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=programs%2Flibtest%2Fsrc%2Ffaculty.asm;fp=programs%2Flibtest%2Fsrc%2Ffaculty.asm;h=e002ff4df8a2621ac701e088404c9285e7fb3c52;hb=8fac3a64e23edb8f2cd4cdc28631d603075de709;hp=0000000000000000000000000000000000000000;hpb=dece501660c059d108e0b4586de6806bfb5b8cf4;p=h316.git diff --git a/programs/libtest/src/faculty.asm b/programs/libtest/src/faculty.asm new file mode 100644 index 0000000..e002ff4 --- /dev/null +++ b/programs/libtest/src/faculty.asm @@ -0,0 +1,178 @@ +* 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