*** empty log message ***
[h316.git] / programs / libtest / src / faculty.asm
diff --git a/programs/libtest/src/faculty.asm b/programs/libtest/src/faculty.asm
new file mode 100644 (file)
index 0000000..e002ff4
--- /dev/null
@@ -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