*** empty log message ***
[h316.git] / lib / hachti / src / stack.asm
CommitLineData
8fac3a64 1* H316 SAFE SOFTWARE STACK, REV. 0.1
2*
3*
4* AUTHOR:
13f9c770 5*
8fac3a64 6* PHILIPP HACHTMANN, 2007
7*
13f9c770 8* VERSIONS:
9*
10* 0.1 - INITIAL REVISION (22.12.2007)
11*
8fac3a64 12* PURPOSE:
13f9c770 13*
8fac3a64 14* TO PROVIDE A MULTI-PURPOSE STACK MECHANISM
15* TO PROVIDE A SPECIAL-PURPOSE STACK MECHANISM FOR RECURSIVE
16* PROGRAM CALLS
17*
eabafcca 18* THEORY OF OPERATION:
8fac3a64 19*
eabafcca 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.
8fac3a64 26*
eabafcca 27* THE DATA LAYOUT OF THE STACK DATA IS AS FOLLOWING:
28*
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
35*
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.
13f9c770 40*
8fac3a64 41* USAGE:
42*
13f9c770 43* INITIALISING STACK POINTER:
8fac3a64 44*
eabafcca 45* CALL S$INIT
46* DAC SDATA STACK DATA
23208140 47* DAC SSIZ DATA SIZE (NOT STACK DEPTH!!!)
0b9cec69 48* DAC 0
49*
8fac3a64 50* PUSHING AND POPPING THE A-REGISTER FROM AND TO THE STACK:
51*
52* CALL S$PUSH VALUE IN A REGISTER IS PUSHED.
eabafcca 53* DAC SDATA
54*
55* CALL $$POP VALUE FROM STACK IS POPPED INTO A-REGISTER.
56* DAC SDATA
8fac3a64 57*
58* PUSHING AND POPPING ARBITRARY DATA FROM AND TO THE STACK:
59*
60* CALL S$PUSM
eabafcca 61* DAC SDATA
8fac3a64 62* DAC ADDRESS
63* OCT SIZE
64*
65* CALL S$POPM
eabafcca 66* DAC SDATA
8fac3a64 67* DAC ADDRESS
68* OCT SIZE
eabafcca 69*
70*
71* MAKING A RECURSIVE CALL FROM FORTRAN IV TO A FORTRAN IV OR OTHER ROUTINE:
8fac3a64 72*
eabafcca 73* THE ROUTINE S$CALL SAVES A SET OF LOCAL VARIABLES ONTO THE STACK.
74* IT ALSO SAVES THE RETURN ADDRESS AND ITS OWN PARAMETERS.
75* S$LLAC DOES EVERYTHING IN REVERSE ORDER.
76*
77* HERE IS AN EXAMPLE HOW TO USE THE TWO ROUTINES IN FORTRAN IV:
78*
79* C LOCAL VARIABLES I(3),A,Z TO SAVE
80*
81* CALL S$CALL(3,I,3,A,2,Z,2)
82* RETURN <-- FOR THE RETURN ADDRESS OF THE CURRENT ROUTINE
83* CALL MYROUTINE(...)
84* CALL S$LLAC
85*
86* ASSEMBLER CALLING SEQUENCE:
87*
88* JST S$CALL
89* DAC VARNO NO OF LOCAL VARIABLES TO SAVE ON THE STACK
90* DAC VAR1 POINTER TO FIRST VARIABLE
91* DAC SIZE1 WORD SIZE OF VARIABLE
92* ...
93* DAC VARN POINTER TO LAST VARIABLE
94* DAC SIZEN WORD SIZE OF LAST VARIABLE
95* DAC 0 FORTRAN IV COMPILER GENERATED
8fac3a64 96*
eabafcca 97* JMP* PROC RETURN JUMP, GENERATED BY THE "RETURN" STATEMENT
98*
99* JST MYROUTINE
100* ...
101*
102* JST S$LLAC
103*
104*
8fac3a64 105********************************************************************************
106*
107*
108**** SYMBOL DECLARATIONS
109*
110 SUBR STACK,SBUF JUST A LABEL FOR THE OBJECT TAPE
0b9cec69 111 SUBR S$INIT,INIT INITIALIZATION
8fac3a64 112 SUBR S$PUSH,PUSH SINGLE WORD PUSH
113 SUBR S$POP,POP SINGLE WORD POP
114 SUBR S$PUSM,PUSM MEMORY RANGE PUSH
115 SUBR S$POPM,POPM MEMORY RANGE POP
116 SUBR S$PTR,SPTR STACK POINTER ACCESS
eabafcca 117 SUBR S$CALL,CALL
118 SUBR S$LLAC,LLAC
8fac3a64 119*
120*
121********************************************************************************
122*
8fac3a64 123*
124 REL RELOCATEABLE OBJECT
8fac3a64 125*
126*
127********************************************************************************
eabafcca 128*
129* *** PUSH MEMORY RANGE TO STACK
8fac3a64 130*
131PUSM DAC ** ENTRY POINT TO PUSH ROUTINE
132 STA ATM1 SAVE A-REGISTER
eabafcca 133*
134 LDA* PUSM LOAD DATA BASE
135 IRS PUSM
136 STA DPT SAVE FOR LATER USE
8fac3a64 137*
138 LDA* PUSM LOAD POINTER
139 STA PTR STORE TO TRANSFER POINTER
140 IRS PUSM GO TO NEXT ARGUMENT
141 LDA* PUSM LOAD TRANSFER SIZE
142 IRS PUSM CORRECT RETURN ADDRESS
143*
144 TCA NEGATE WORD COUNT
145 STA CNT STORE TO COUNTER
146*
147PULP LDA* PTR GET DATA
148 JST PUSH PUSH IT!
eabafcca 149DPT DAC **
150*
8fac3a64 151 IRS PTR INCREMENT POINTER
152 IRS CNT INCREMENT BYTE COUNTER
153 JMP PULP DO IT AGAIN!
154*
155 LDA ATM1 RESTORE A-REG
eabafcca 156 JMP* PUSM RETURN
8fac3a64 157*
158*
159********************************************************************************
160*
161*
162**** POP MEMORY RANGE FROM STACK
163*
164POPM DAC ** ENTRY POINT TO PUSH ROUTINE
165 STA ATM1 SAVE A-REGISTER
166*
eabafcca 167 LDA* POPM GET DATA POINTER
168 IRS POPM
169 STA DPTR STORE FOR LATER USE
170*
8fac3a64 171 LDA* POPM LOAD POINTER
172 IRS POPM GO TO NEXT ARGUMENT
173 ADD* POPM ADD TRANSFER SIZE
174 SUB =1 SUBSTRACT 1 TO GET HIGH ADDRESS
175 STA PTR STORE TO TRANSFER POINTER
176 LDA* POPM LOAD TRANSFER SIZE
177 IRS POPM CORRECT RETURN ADDRESS
178*
179 TCA NEGATE WORD COUNT
180 STA CNT STORE TO COUNTER
181*
182POLP JST POP POP DATA FROM THE STACK
eabafcca 183DPTR DAC **
184*
8fac3a64 185 STA* PTR STORE IT.
186 LDA PTR
187 SUB =1 DECREMENT
188 STA PTR WRITE BACK
189 IRS CNT INCREMENT BYTE COUNTER
190 JMP POLP DO IT AGAIN!
191*
eabafcca 192 LDA ATM1 RESTORE A-REG
193 JMP* POPM RETURN
8fac3a64 194*
195*
196********************************************************************************
197*
198*
199**** PUSH SINGLE WORD ONTO STACK
200*
eabafcca 201 SUBR PUSH
8fac3a64 202PUSH DAC ** REAL PUSH ROUTINE - PUSH AC TO STACK.
eabafcca 203*
204 STX XTM SAVE X REGISTER
8fac3a64 205 STA ATM2 SAVE A REGISTER
206*
eabafcca 207 LDX* PUSH LOAD INDEX REGISTER WITH DATA BASE
208 IRS PUSH
8fac3a64 209*
eabafcca 210 LDA FILL,1 LOAD FILL SIZE
211 CAS SSIZ,1 COMPARE STACK SIZE
212 NOP
213 JST OFLO OVERFLOW!
214*
8fac3a64 215 LDA ATM2
eabafcca 216 STA* SPTR,1 NO OVERFLOW, PUT DATA ONTO STACK
217 IRS SPTR,1 INCREMENT STACK POINTER
218 IRS FILL,1 INCREMENT FILL SIZE
8fac3a64 219*
eabafcca 220 LDX XTM RESTORE X REGISTER
221 LDA ATM2
8fac3a64 222 JMP* PUSH RETURN WITH A-REG UNALTERED.
223*
224*
225********************************************************************************
226*
227*
228**** POP SINGLE WORD FROM STACK
229*
230POP DAC ** REAL POP ROUTINE - POP AC FROM STACK.
231*
eabafcca 232 STX XTM SAVE X REGISTER
233 LDX* POP LOAD INDEX REGISTER WITH DATA BASE
234 IRS POP
235*
236 LDA FILL,1 FILL SIZE
8fac3a64 237 SNZ
eabafcca 238 JST UFLO NOTHING INSIDE? SKIP!
8fac3a64 239*
eabafcca 240 LDA SPTR,1 LOAD STACK POINTER
8fac3a64 241 SUB =1 DECREMENT IT TO LAST USED LOCATION
eabafcca 242 STA SPTR,1 SAVE IT BACK
243 LDA FILL,1
244 SUB =1
245 STA FILL,1 DECREMENT FILL SIZE
8fac3a64 246*
eabafcca 247 LDA* SPTR,1 LOAD VALUE FROM THE STACK
248 LDX XTM RESTORE INDEX REGISTER
8fac3a64 249 JMP* POP RETURN.
250*
251*
252********************************************************************************
253*
254*
255**** INITIALIZATION
256*
eabafcca 257INIT DAC ** INITIALIZE STACK
258 STA ATM1
259 STX XTM
260*
261 LDX* INIT
262*
263 LDA VARS SIZE OF MANAGEMENT VARIABLES
264 ADD* INIT BASE ADDRESS
265 STA SPTR,1 SAVE TO STACK POINTER
266 IRS INIT
267*
23208140 268 LDA* INIT LOAD DATA POOL SIZE POINTER
269 STA PTR DEREFERENCE POINTER
270 LDA* PTR LOAD DATA POOL SIZE
eabafcca 271 SUB VARS VARIABLE SIZE
272 STA SSIZ,1 SAVE TO STACK DEPTH
273*
274 CRA
275 STA FILL,1
276*
277 LDA ATM1
278 LDX XTM
279 IRS INIT
23208140 280 IRS INIT FOR FORTRAN COMPATIBILITY
8fac3a64 281 JMP* INIT
282*
283*
284********************************************************************************
285*
286*
287**** ERROR HANDLING ROUTINES
288*
eabafcca 289 SUBR OFLO
8fac3a64 290OFLO DAC ** STACK OVERFLOW ROUTINE
291 LDA OMSP LOAD OVERFLOW MESSAGE POINTER
292 JST TYPE TYPE IT OUT.
293*
294 HLT WHAT WE DO: HALT THE MACHINE.
295 JMP *-1 YOU CANNOT SIMPLY LEAVE THIS, IT'S SERIOUS!
296*
297*
298****************************************
299*
300*
eabafcca 301 SUBR UFLO
8fac3a64 302UFLO DAC ** STACK OVERFLOW ROUTINE
303 LDA UMSP LOAD OVERFLOW MESSAGE POINTER
304 JST TYPE TYPE IT OUT.
305*
306 HLT WHAT WE DO: HALT THE MACHINE.
307 JMP *-1 YOU CANNOT SIMPLY LEAVE THIS, IT'S SERIOUS!
308*
309*
310****************************************
311*
312*
eabafcca 313 SUBR TYPE
8fac3a64 314TYPE DAC **
315 SKS '104 TEST ASR READY
316 JMP *-1 WAIT TO BECOME READY
317 OCP '104 SET TO OUTPUT MODE
318*
319 STA PTR STORE POINTER
320*
321TLOP LDA* PTR TYPE LOOP
322 SNZ TEST FOR END
323 JMP* TYPE RETURN
324 ICA
325 OTA '4
326 JMP *-1
327 ICA
328 OTA '4
329 JMP *-1
330 SKS '104 ADDITIONAL TEST FOR READY
331 JMP *-1
332 IRS PTR NEXT WORD.
333 JMP TLOP
334*
335*
336********************************************************************************
337*
338*
339***** VARIABLES
340*
8fac3a64 341*
342PTR DEC 0 TRANSFER POINTER TO USER BUFFERS
343CNT DEC 0 TRANSFER COUNTER
344*
345ATM1 DEC 0 A-REGISTER BACKUP
346ATM2 DEC 0 A-REGISTER BACKUP
eabafcca 347XTM DEC 0 X-REGISTER BACKUP
8fac3a64 348*
349*
350***** CONSTANTS
8fac3a64 351*
eabafcca 352VARS DEC 3 SIZE OF VARIABLES AT BEGINNING OF DATA
353*
354SSIZ EQU 0
355SPTR EQU 1
356FILL EQU 2
357*
8fac3a64 358OMSP DAC OMSG POINTER TO MESSAGE
359UMSP DAC UMSG POINTER TO MESSAGE
360OMSG OCT '006412 CR/LF CHARACTERS
361 BCI 16,STACK OVERFLOW, YOUR'RE SCREWED!
362 DEC 0 TERMINATION CHARACTER
363UMSG OCT '006412 CR/LF CHARACTERS
364 BCI 17,STACK UNDERFLOW, YOUR'RE SCREWED!
365 DEC 0 TERMINATION CHARACTER
366*
367*
368********************************************************************************
369*
370*
371 END THAT'S IT.