*** empty log message ***
[h316.git] / lib / hachti / src / stack.asm
diff --git a/lib/hachti/src/stack.asm b/lib/hachti/src/stack.asm
new file mode 100644 (file)
index 0000000..45d930f
--- /dev/null
@@ -0,0 +1,256 @@
+* H316 SAFE SOFTWARE STACK, REV. 0.1
+*
+*
+* AUTHOR: 
+*       PHILIPP HACHTMANN, 2007
+* 
+* PURPOSE:
+*       TO PROVIDE A MULTI-PURPOSE STACK MECHANISM
+*       TO PROVIDE A SPECIAL-PURPOSE STACK MECHANISM FOR RECURSIVE
+*       PROGRAM CALLS
+*
+* WHAT:
+* 
+* THIS VARIANT OF THE STACK ROUTINE USES A FIXED SIZE MEMORY 
+* BUFFER FOR THE THE STACK. THE STACK USAGE IS MONITORED.
+* ON OVERFLOW, THE COMPUTER TYPES OUT AN ERROR MESSAGE AND HALTS.
+* 
+* USAGE:
+* 
+* INITIALIZING STACK POINTER:
+*       
+*       CALL S$INIT
+* 
+* PUSHING AND POPPING THE A-REGISTER FROM AND TO THE STACK:
+* 
+*       CALL    S$PUSH  VALUE IN A REGISTER IS PUSHED.
+*       CALL    $$PUSH  VALUE FROM STACK IS POPPED INTO A-REGISTER.
+* 
+* PUSHING AND POPPING ARBITRARY DATA FROM AND TO THE STACK:
+* 
+*       CALL    S$PUSM
+*       DAC     ADDRESS
+*       OCT     SIZE
+*  
+*       CALL    S$POPM
+*       DAC     ADDRESS
+*       OCT     SIZE
+* 
+* 
+********************************************************************************
+*
+* 
+**** SYMBOL DECLARATIONS
+* 
+       SUBR    STACK,SBUF      JUST A LABEL FOR THE OBJECT TAPE
+       SUBR    S$INIT,INIT     INITITALISATION
+       SUBR    S$PUSH,PUSH     SINGLE WORD PUSH
+       SUBR    S$POP,POP       SINGLE WORD POP
+       SUBR    S$PUSM,PUSM     MEMORY RANGE PUSH
+       SUBR    S$POPM,POPM     MEMORY RANGE POP
+       SUBR    S$PTR,SPTR      STACK POINTER ACCESS
+* 
+*      
+********************************************************************************
+* 
+*  
+SSIZ   EQU     '1000   512 WORDS DEFAULT STACK BUFFER SIZE
+* 
+       REL             RELOCATEABLE OBJECT
+       ORG     '0
+*  
+* 
+********************************************************************************
+* 
+* 
+**** PUSH MEMORY RANGE TO STACK
+* 
+PUSM   DAC     **      ENTRY POINT TO PUSH ROUTINE
+       STA     ATM1    SAVE A-REGISTER
+* 
+       LDA*    PUSM    LOAD POINTER
+       STA     PTR     STORE TO TRANSFER POINTER
+       IRS     PUSM    GO TO NEXT ARGUMENT
+       LDA*    PUSM    LOAD TRANSFER SIZE
+       IRS     PUSM    CORRECT RETURN ADDRESS
+* 
+       TCA             NEGATE WORD COUNT
+       STA     CNT     STORE TO COUNTER
+* 
+PULP   LDA*    PTR     GET DATA
+       JST     PUSH    PUSH IT!
+       IRS     PTR     INCREMENT POINTER
+       IRS     CNT     INCREMENT BYTE COUNTER
+       JMP     PULP    DO IT AGAIN!
+* 
+       LDA     ATM1    RESTORE A-REG
+       JMP*    PUSM    
+* 
+*
+********************************************************************************
+*
+* 
+**** POP MEMORY RANGE FROM STACK
+* 
+POPM   DAC     **      ENTRY POINT TO PUSH ROUTINE
+       STA     ATM1    SAVE A-REGISTER
+* 
+       LDA*    POPM    LOAD POINTER
+       IRS     POPM    GO TO NEXT ARGUMENT
+       ADD*    POPM    ADD TRANSFER SIZE
+       SUB     =1      SUBSTRACT 1 TO GET HIGH ADDRESS
+       STA     PTR     STORE TO TRANSFER POINTER
+       LDA*    POPM    LOAD TRANSFER SIZE
+       IRS     POPM    CORRECT RETURN ADDRESS
+* 
+       TCA             NEGATE WORD COUNT
+       STA     CNT     STORE TO COUNTER
+* 
+POLP   JST     POP     POP DATA FROM THE STACK
+       STA*    PTR     STORE IT.
+       LDA     PTR
+       SUB     =1      DECREMENT
+       STA     PTR     WRITE BACK
+       IRS     CNT     INCREMENT BYTE COUNTER
+       JMP     POLP    DO IT AGAIN!
+* 
+       LDA     ATM1
+       JMP*    POPM    
+* 
+*
+********************************************************************************
+*
+* 
+**** PUSH SINGLE WORD ONTO STACK
+* 
+PUSH   DAC     **      REAL PUSH ROUTINE - PUSH AC TO STACK.
+*      
+       STA     ATM2    SAVE A REGISTER
+* 
+       LDA     SPTR    LOAD STACK POINTER
+       SUB     MAX     TEST IF STACK FULL
+       SNZ
+       JST     OFLO    OVERFLOW OH! OH! OH!
+* 
+       LDA     ATM2
+       STA*    SPTR    NO OVERFLOW, PUT DATA ONTO STACK
+       IRS     SPTR    INCREMENT STACK POINTER
+* 
+       JMP*    PUSH    RETURN WITH A-REG UNALTERED.
+* 
+* 
+********************************************************************************
+* 
+* 
+**** POP SINGLE WORD FROM STACK
+* 
+POP    DAC     **      REAL POP ROUTINE - POP AC FROM STACK.
+* 
+       LDA     SPTR    LOAD STACK POINTER
+       SUB     MIN     TEST IF STACK EMPTY
+       SNZ
+       JST     UFLO    UNDERFLOW OH! OH! OH!
+* 
+       LDA     SPTR    LOAD STACK POINTER
+       SUB     =1      DECREMENT IT TO LAST USED LOCATION
+       STA     SPTR    SAVE IT BACK
+* 
+       LDA*    SPTR    LOAD VALUE FROM THE STACK
+       JMP*    POP     RETURN.
+* 
+* 
+******************************************************************************** 
+*
+* 
+**** INITIALIZATION
+* 
+INIT   DAC     **      INITIALIZE STACK POINTER
+       LDA     CPTR    LOAD INITIAL STACK POINTER
+       STA     SPTR    SET STACK POINTER
+       JMP*    INIT
+* 
+*
+********************************************************************************
+* 
+*  
+**** ERROR HANDLING ROUTINES
+* 
+OFLO   DAC     **      STACK OVERFLOW ROUTINE
+       LDA     OMSP    LOAD OVERFLOW MESSAGE POINTER
+       JST     TYPE    TYPE IT OUT.
+* 
+       HLT             WHAT WE DO: HALT THE MACHINE.
+       JMP     *-1     YOU CANNOT SIMPLY LEAVE THIS, IT'S SERIOUS!
+* 
+* 
+****************************************
+* 
+* 
+UFLO   DAC     **      STACK OVERFLOW ROUTINE
+       LDA     UMSP    LOAD OVERFLOW MESSAGE POINTER
+       JST     TYPE    TYPE IT OUT.
+* 
+       HLT             WHAT WE DO: HALT THE MACHINE.
+       JMP     *-1     YOU CANNOT SIMPLY LEAVE THIS, IT'S SERIOUS!
+* 
+* 
+****************************************
+* 
+* 
+TYPE   DAC     **
+       SKS     '104    TEST ASR READY
+       JMP     *-1     WAIT TO BECOME READY
+       OCP     '104    SET TO OUTPUT MODE
+* 
+       STA     PTR     STORE POINTER
+* 
+TLOP   LDA*    PTR     TYPE LOOP
+       SNZ             TEST FOR END
+       JMP*    TYPE    RETURN
+       ICA     
+       OTA     '4
+       JMP     *-1
+       ICA
+       OTA     '4
+       JMP     *-1
+       SKS     '104    ADDITIONAL TEST FOR READY
+       JMP     *-1
+       IRS     PTR     NEXT WORD.
+       JMP     TLOP
+* 
+* 
+********************************************************************************
+*
+* 
+***** VARIABLES
+* 
+SBUF   BSS     SSIZ    THE STACK BUFFER
+SPTR   DAC     SBUF    THE STACK POINTER
+* 
+PTR    DEC     0       TRANSFER POINTER TO USER BUFFERS
+CNT    DEC     0       TRANSFER COUNTER
+* 
+ATM1   DEC     0       A-REGISTER BACKUP
+ATM2   DEC     0       A-REGISTER BACKUP
+* 
+* 
+***** CONSTANTS
+* 
+CPTR   DAC     SBUF    STACK POINTER CONSTANT
+MAX    DAC     SBUF+SSIZ       FIRST ILLEGAL SPTR LOC BEFORE PUSH      
+MIN    DAC     SBUF            FIRST ILLEGAL SPTR LOC BEFORE POP  
+*
+OMSP   DAC     OMSG            POINTER TO MESSAGE
+UMSP   DAC     UMSG            POINTER TO MESSAGE
+OMSG   OCT     '006412         CR/LF CHARACTERS
+       BCI     16,STACK OVERFLOW, YOUR'RE SCREWED!
+       DEC     0               TERMINATION CHARACTER
+UMSG   OCT     '006412         CR/LF CHARACTERS
+       BCI     17,STACK UNDERFLOW, YOUR'RE SCREWED!
+       DEC     0               TERMINATION CHARACTER
+*       
+* 
+********************************************************************************
+*
+* 
+       END                     THAT'S IT.