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