X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=lib%2Fhachti%2Fsrc%2Fstack.asm;fp=lib%2Fhachti%2Fsrc%2Fstack.asm;h=45d930f9b03f56ec8c22a34967ad29455b222790;hb=8fac3a64e23edb8f2cd4cdc28631d603075de709;hp=0000000000000000000000000000000000000000;hpb=dece501660c059d108e0b4586de6806bfb5b8cf4;p=h316.git diff --git a/lib/hachti/src/stack.asm b/lib/hachti/src/stack.asm new file mode 100644 index 0000000..45d930f --- /dev/null +++ b/lib/hachti/src/stack.asm @@ -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.