* H316 SAFE SOFTWARE STACK, REV. 0.1 * * * AUTHOR: * * PHILIPP HACHTMANN, 2007 * * VERSIONS: * * 0.1 - INITIAL REVISION (22.12.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: * * INITIALISING 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.