1 * H316 SAFE SOFTWARE STACK, REV. 0.1
6 * PHILIPP HACHTMANN, 2007
10 * 0.1 - INITIAL REVISION (22.12.2007)
14 * TO PROVIDE A MULTI-PURPOSE STACK MECHANISM
15 * TO PROVIDE A SPECIAL-PURPOSE STACK MECHANISM FOR RECURSIVE
18 * THEORY OF OPERATION:
20 * THE STACK ROUTINES MAINTAIN AN UPWARDS GROWING STACK.
21 * EVERY USAGE CONTEXT OF THE STACK NEEDS TO RESERVE THE SPACE FOR
22 * ITS STACK'S DATA. THIS ENABLES THE PROGRAMMER TO CHOOSE THE STACK
23 * SIZE AND USE MULTIPLE STACKS IN MULTIPLE PLACES INDEPENDENTLY.
24 * ALL STACK RELATED ROUTINES TAKE A POINTER TO THE STACK'S INTERNAL
25 * DATA AS FIRST ARGUMENT.
27 * THE DATA LAYOUT OF THE STACK DATA IS AS FOLLOWING:
29 * SIZE OCT '1000 SIZE OF THE STACK IN MACHINE WORDS
30 * PTR DAC ** THE STACK POINTER
31 * FILL DAC ** THE FILL COUNTER
32 * OVER DAC OFL OPTIONAL POINTER TO OVERFLOW ERROR ROUTINE
33 * UNDR DAC UFL OPTIONAL POINTER TO UNDERFLOW ERROR ROUTINE
34 * STCK BSS '1000 THE STACK DATA
36 * IF CUSTOM ERROR HANDLING ROUTINES ARE NOT TO BE USED, SET THE TWO
37 * POINTER LOCATIONS TO ZERO. THEN, INTERNAL ERROR ROUTINES WILL BE
38 * USED. SIZE AND THE FUNCTION POINTERS HAVE TO BE INITIALISED. THE
39 * OTHER LOCATIONS ARE INITIALISED BY THE STACK ROUTINES.
43 * INITIALISING STACK POINTER:
46 * DAC SDATA STACK DATA
47 * OCT SSIZ DATA SIZE (NOT STACK DEPTH!!!)
49 * PUSHING AND POPPING THE A-REGISTER FROM AND TO THE STACK:
51 * CALL S$PUSH VALUE IN A REGISTER IS PUSHED.
54 * CALL $$POP VALUE FROM STACK IS POPPED INTO A-REGISTER.
57 * PUSHING AND POPPING ARBITRARY DATA FROM AND TO THE STACK:
70 * MAKING A RECURSIVE CALL FROM FORTRAN IV TO A FORTRAN IV OR OTHER ROUTINE:
72 * THE ROUTINE S$CALL SAVES A SET OF LOCAL VARIABLES ONTO THE STACK.
73 * IT ALSO SAVES THE RETURN ADDRESS AND ITS OWN PARAMETERS.
74 * S$LLAC DOES EVERYTHING IN REVERSE ORDER.
76 * HERE IS AN EXAMPLE HOW TO USE THE TWO ROUTINES IN FORTRAN IV:
78 * C LOCAL VARIABLES I(3),A,Z TO SAVE
80 * CALL S$CALL(3,I,3,A,2,Z,2)
81 * RETURN <-- FOR THE RETURN ADDRESS OF THE CURRENT ROUTINE
85 * ASSEMBLER CALLING SEQUENCE:
88 * DAC VARNO NO OF LOCAL VARIABLES TO SAVE ON THE STACK
89 * DAC VAR1 POINTER TO FIRST VARIABLE
90 * DAC SIZE1 WORD SIZE OF VARIABLE
92 * DAC VARN POINTER TO LAST VARIABLE
93 * DAC SIZEN WORD SIZE OF LAST VARIABLE
94 * DAC 0 FORTRAN IV COMPILER GENERATED
96 * JMP* PROC RETURN JUMP, GENERATED BY THE "RETURN" STATEMENT
104 ********************************************************************************
107 **** SYMBOL DECLARATIONS
109 SUBR STACK,SBUF JUST A LABEL FOR THE OBJECT TAPE
110 SUBR S$INIT,INIT INITITALISATION
111 SUBR S$PUSH,PUSH SINGLE WORD PUSH
112 SUBR S$POP,POP SINGLE WORD POP
113 SUBR S$PUSM,PUSM MEMORY RANGE PUSH
114 SUBR S$POPM,POPM MEMORY RANGE POP
115 SUBR S$PTR,SPTR STACK POINTER ACCESS
120 ********************************************************************************
123 REL RELOCATEABLE OBJECT
126 ********************************************************************************
128 * *** PUSH MEMORY RANGE TO STACK
130 PUSM DAC ** ENTRY POINT TO PUSH ROUTINE
131 STA ATM1 SAVE A-REGISTER
133 LDA* PUSM LOAD DATA BASE
135 STA DPT SAVE FOR LATER USE
137 LDA* PUSM LOAD POINTER
138 STA PTR STORE TO TRANSFER POINTER
139 IRS PUSM GO TO NEXT ARGUMENT
140 LDA* PUSM LOAD TRANSFER SIZE
141 IRS PUSM CORRECT RETURN ADDRESS
143 TCA NEGATE WORD COUNT
144 STA CNT STORE TO COUNTER
146 PULP LDA* PTR GET DATA
150 IRS PTR INCREMENT POINTER
151 IRS CNT INCREMENT BYTE COUNTER
152 JMP PULP DO IT AGAIN!
154 LDA ATM1 RESTORE A-REG
158 ********************************************************************************
161 **** POP MEMORY RANGE FROM STACK
163 POPM DAC ** ENTRY POINT TO PUSH ROUTINE
164 STA ATM1 SAVE A-REGISTER
166 LDA* POPM GET DATA POINTER
168 STA DPTR STORE FOR LATER USE
170 LDA* POPM LOAD POINTER
171 IRS POPM GO TO NEXT ARGUMENT
172 ADD* POPM ADD TRANSFER SIZE
173 SUB =1 SUBSTRACT 1 TO GET HIGH ADDRESS
174 STA PTR STORE TO TRANSFER POINTER
175 LDA* POPM LOAD TRANSFER SIZE
176 IRS POPM CORRECT RETURN ADDRESS
178 TCA NEGATE WORD COUNT
179 STA CNT STORE TO COUNTER
181 POLP JST POP POP DATA FROM THE STACK
188 IRS CNT INCREMENT BYTE COUNTER
189 JMP POLP DO IT AGAIN!
191 LDA ATM1 RESTORE A-REG
195 ********************************************************************************
198 **** PUSH SINGLE WORD ONTO STACK
201 PUSH DAC ** REAL PUSH ROUTINE - PUSH AC TO STACK.
203 STX XTM SAVE X REGISTER
204 STA ATM2 SAVE A REGISTER
206 LDX* PUSH LOAD INDEX REGISTER WITH DATA BASE
209 LDA FILL,1 LOAD FILL SIZE
210 CAS SSIZ,1 COMPARE STACK SIZE
215 STA* SPTR,1 NO OVERFLOW, PUT DATA ONTO STACK
216 IRS SPTR,1 INCREMENT STACK POINTER
217 IRS FILL,1 INCREMENT FILL SIZE
219 LDX XTM RESTORE X REGISTER
221 JMP* PUSH RETURN WITH A-REG UNALTERED.
224 ********************************************************************************
227 **** POP SINGLE WORD FROM STACK
229 POP DAC ** REAL POP ROUTINE - POP AC FROM STACK.
231 STX XTM SAVE X REGISTER
232 LDX* POP LOAD INDEX REGISTER WITH DATA BASE
237 JST UFLO NOTHING INSIDE? SKIP!
239 LDA SPTR,1 LOAD STACK POINTER
240 SUB =1 DECREMENT IT TO LAST USED LOCATION
241 STA SPTR,1 SAVE IT BACK
244 STA FILL,1 DECREMENT FILL SIZE
246 LDA* SPTR,1 LOAD VALUE FROM THE STACK
247 LDX XTM RESTORE INDEX REGISTER
251 ********************************************************************************
256 INIT DAC ** INITIALIZE STACK
262 LDA VARS SIZE OF MANAGEMENT VARIABLES
263 ADD* INIT BASE ADDRESS
264 STA SPTR,1 SAVE TO STACK POINTER
267 LDA* INIT LOAD DATA POOL SIZE
268 SUB VARS VARIABLE SIZE
269 STA SSIZ,1 SAVE TO STACK DEPTH
280 ********************************************************************************
283 **** ERROR HANDLING ROUTINES
286 OFLO DAC ** STACK OVERFLOW ROUTINE
287 LDA OMSP LOAD OVERFLOW MESSAGE POINTER
288 JST TYPE TYPE IT OUT.
290 HLT WHAT WE DO: HALT THE MACHINE.
291 JMP *-1 YOU CANNOT SIMPLY LEAVE THIS, IT'S SERIOUS!
294 ****************************************
298 UFLO DAC ** STACK OVERFLOW ROUTINE
299 LDA UMSP LOAD OVERFLOW MESSAGE POINTER
300 JST TYPE TYPE IT OUT.
302 HLT WHAT WE DO: HALT THE MACHINE.
303 JMP *-1 YOU CANNOT SIMPLY LEAVE THIS, IT'S SERIOUS!
306 ****************************************
311 SKS '104 TEST ASR READY
312 JMP *-1 WAIT TO BECOME READY
313 OCP '104 SET TO OUTPUT MODE
315 STA PTR STORE POINTER
317 TLOP LDA* PTR TYPE LOOP
326 SKS '104 ADDITIONAL TEST FOR READY
332 ********************************************************************************
338 PTR DEC 0 TRANSFER POINTER TO USER BUFFERS
339 CNT DEC 0 TRANSFER COUNTER
341 ATM1 DEC 0 A-REGISTER BACKUP
342 ATM2 DEC 0 A-REGISTER BACKUP
343 XTM DEC 0 X-REGISTER BACKUP
348 VARS DEC 3 SIZE OF VARIABLES AT BEGINNING OF DATA
354 OMSP DAC OMSG POINTER TO MESSAGE
355 UMSP DAC UMSG POINTER TO MESSAGE
356 OMSG OCT '006412 CR/LF CHARACTERS
357 BCI 16,STACK OVERFLOW, YOUR'RE SCREWED!
358 DEC 0 TERMINATION CHARACTER
359 UMSG OCT '006412 CR/LF CHARACTERS
360 BCI 17,STACK UNDERFLOW, YOUR'RE SCREWED!
361 DEC 0 TERMINATION CHARACTER
364 ********************************************************************************