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