|
|
1.1 root 1: |
2:
3: | interrupt wrapping routines; these should just save registers and call
4:
5: | the appropriate C handlers, unless speed is a major problem
6:
7: |
8:
9:
10:
11: |
12:
13: | first, utilities for setting processor status level
14:
15: |
16:
17: .globl _spl7, _spl
18:
19: _spl7:
20:
21: movew sr, d0
22:
23: oriw #0x0700, sr
24:
25: rts
26:
27: _spl:
28:
29: movew sp@(4), d0
30:
31: movew d0, sr
32:
33: rts
34:
35:
36:
37: .globl _mint_5ms
38:
39: .globl _mint_timer
40:
41: .globl _mint_vbl
42:
43: .globl _timeout | C time routine
44:
45: .globl _old_timer | old GEMDOS time vector
46:
47: .globl _old_vbl | old GEMDOS vbl vector
48:
49: .globl _old_5ms
50:
51: .globl _build_context
52:
53: .globl _restore_context
54:
55: .globl _proc_clock | controls process' allocation of CPU time
56:
57: .globl _curproc
58:
59: .globl _in_kernel
60:
61:
62:
63: | AKP: this code is hit once every 5ms; it updates the time fields of curproc.
64:
65: _mint_5ms:
66:
67: movel a0,sp@-
68:
69: movel _curproc,a0
70:
71: addw #0x364,a0 | $364 is offset to curproc->systime;
72:
73: tstw _in_kernel
74:
75: bne L_5a | usrtime is the branch-not-taken case
76:
77: addql #4,a0
78:
79: L_5a: addql #5,a0@
80:
81: movel sp@+,a0
82:
83: movel _old_5ms+8,sp@-
84:
85: rts
86:
87:
88:
89: _mint_timer:
90:
91: moveml d0-d2/a0-a2, sp@- | save C registers
92:
93: jsr _timeout
94:
95: moveml sp@+, d0-d2/a0-a2
96:
97: movel _old_timer+8, sp@- | jump to GEMDOS time vector
98:
99: rts
100:
101:
102:
103: _mint_vbl:
104:
105: tstw 0x59e | test longframe (AKP)
106:
107: beq L_short1
108:
109: clrw sp@- | yes, long frames: push a frame word
110:
111: L_short1:
112:
113: pea L_comeback | push fake PC
114:
115: movew sr, sp@- | push status register
116:
117: movel _old_vbl+8, sp@- | go service the interrupt
118:
119: rts
120:
121:
122:
123: L_comeback:
124:
125: tstw _proc_clock | has time expired yet?
126:
127: beq L_expired | yes -- maybe go switch processes
128:
129: L_out:
130:
131: rte | no -- just return
132:
133:
134:
135: L_expired:
136:
137: btst #13, sp@ | user mode?
138:
139: bne L_out | no -- switching is not possible
140:
141: L_switch:
142:
143: movel _curproc, sp@-
144:
145: addl #4, sp@ | to get &curproc->ctxt[SYSCALL]
146:
147: jsr _build_context | build context
148:
149: movel _curproc, a0
150:
151: movel a0@, sp | use curproc->sysstack
152:
153: jsr _enter_kernel | enter kernel
154:
155: jsr _preempt | yield processor
156:
157: oriw #0x0700, sr | spl7()
158:
159: jsr _leave_kernel | restore vectors
160:
161: movel _curproc, a0
162:
163: pea a0@(4)
164:
165: jsr _restore_context | back to user
166:
167: |
168:
169: | reset routine -- called on a warm boot. Note that TOS sends the
170:
171: | address to which we should return in register a6. Also note that
172:
173: | the stack pointer is in an unknown state, so we set up our own
174:
175: |
176:
177: .globl _reset
178:
179: .globl _tmpstack | see main.c
180:
181:
182:
183: _reset:
184:
185: movew #0x2700, sr | avoid interruption here
186:
187: movel sp, _tmpstack | save A7
188:
189: lea _tmpstack, sp | set up temporary stack
190:
191: lea sp@(256), sp
192:
193: moveml d0-d2/a0-a2, sp@- | save C registers
194:
195: jsr _restr_intr | restore interrupts
196:
197: moveml sp@+, d0-d2/a0-a2 | restore registers
198:
199: movel _tmpstack, sp
200:
201: jmp a6@ | reset again
202:
203:
204:
205: |
206:
207: | routine for doing a reboot
208:
209: |
210:
211: .globl _reboot
212:
213: _reboot:
214:
215: movew #0x2700, sr | avoid interrupts
216:
217: movel 0x00, sp | get sp after reboot
218:
219: movel 0x04, a6 | get new reboot address
220:
221: jmp _reset
222:
223:
224:
225: |
226:
227: | routine for mouse packet handling
228:
229: |
230:
231: .globl _newmvec
232:
233: _newmvec:
234:
235: movel a0, sp@-
236:
237: jsr _mouse_handler
238:
239: movel sp@+, a0
240:
241: rts
242:
243:
244:
245: |
246:
247: | new ikbd keyboard interrupt vector
248:
249: | kintr is a global variable that should be non-zero if a keyboard
250:
251: | event occured
252:
253: |
254:
255: .globl _new_ikbd
256:
257: _new_ikbd:
258:
259: movew #1, _kintr
260:
261: movel _old_ikbd+8, sp@-
262:
263: rts | jump to system interrupt routine
264:
265:
266:
267: |
268:
269: | simple signal handlers
270:
271: | global variables referenced:
272:
273: | in_kernel: (main.c): flag to indicate that we're in the MiNT kernel
274:
275: | sig_routine: (signal.c): pointer to which signal catching routine to
276:
277: | call (e.g. for SIGBUS, or whatever)
278:
279: |
280:
281: .globl _new_bus, _new_addr, _new_ill, _new_divzero, _new_priv
282:
283: .globl _new_trace
284:
285: .globl _in_kernel, _sig_routine
286:
287: _new_bus:
288:
289: movel #_sigbus, _sig_routine
290:
291: Do_sig:
292:
293: tstw _in_kernel | are we already in the kernel?
294:
295: bne Kernel | yes
296:
297: movel _curproc, sp@-
298:
299: addl #4, sp@ | push offset of save area
300:
301: jsr _build_context
302:
303: movel _curproc, a4
304:
305: movel a4@, sp | put us in the system stack
306:
307: jsr _enter_kernel | set up kernel vectors
308:
309: movel _sig_routine, a1 | get signal handling routine
310:
311: jsr a1@ | go do it
312:
313: oriw #0x0700, sr | spl7()
314:
315: jsr _leave_kernel | leave kernel
316:
317: lea a4@(4), a4 | get context save area address
318:
319: movel a4, sp@- | push it
320:
321: jsr _restore_context | restore the context
322:
323: |
324:
325: | here's what we do if we already were in the kernel
326:
327: |
328:
329: Kernel:
330:
331: moveml d0-d2/a0-a2, sp@- | save reggies
332:
333: movel _sig_routine, a1 | get handler
334:
335: jsr a1@ | go do it
336:
337: moveml sp@+, d0-d2/a0-a2
338:
339: rte
340:
341: _new_addr:
342:
343: movel #_sigaddr, _sig_routine
344:
345: bra Do_sig
346:
347: _new_ill:
348:
349: movel #_sigill, _sig_routine
350:
351: bra Do_sig
352:
353: _new_divzero:
354:
355: movel #_sigfpe, _sig_routine
356:
357: bra Do_sig
358:
359: _new_priv:
360:
361: movel #_sigpriv, _sig_routine
362:
363: bra Do_sig
364:
365: _new_trace:
366:
367: movel #_sigtrap, _sig_routine
368:
369: bra Do_sig
370:
371:
372:
373: |
374:
375: | BIOS disk vectors for pseudo-disks like U: and X:; these are present
376:
377: | just in case some program (foolishly) attempts to access these drives
378:
379: | directly and gets horribly confused
380:
381: |
382:
383: .globl _old_getbpb | old Getbpb vector
384:
385: .globl _old_mediach | old Mediach vector
386:
387: .globl _old_rwabs | old Rwabs vector
388:
389:
390:
391: .globl _new_getbpb
392:
393: _new_getbpb:
394:
395: movew sp@(4), d0 | check the drive
396:
397: cmpw #0x10, d0 | drive Q:?
398:
399: beq nobpb | yes, no BPB available
400:
401: cmpw #0x14, d0 | drive U:?
402:
403: beq nobpb | yes, no BPB available
404:
405: cmpw #0x15, d0 | drive V:?
406:
407: beq nobpb
408:
409: cmpw #0x17, d0 | drive X:?
410:
411: beq nobpb
412:
413: movel _old_getbpb+8, a0 | not our drive
414:
415: jmp a0@ | call the old vector for it
416:
417: nobpb:
418:
419: moveql #0, d0 | 0 means "no BPB read"
420:
421: rts
422:
423:
424:
425: .globl _new_mediach
426:
427: _new_mediach:
428:
429: movew sp@(4), d0 | check the drive
430:
431: cmpw #0x10, d0 | drive Q:?
432:
433: beq nochng | yes, no change
434:
435: cmpw #0x14, d0 | drive U:?
436:
437: beq nochng | yes, no change
438:
439: cmpw #0x15, d0 | drive V:?
440:
441: beq nochng
442:
443: cmpw #0x17, d0 | drive X:?
444:
445: beq nochng
446:
447: movel _old_mediach+8, a0 | not our drive
448:
449: jmp a0@ | call the old vector for it
450:
451: nochng:
452:
453: moveql #0, d0 | 0 means "definitely no change"
454:
455: rts
456:
457:
458:
459: .globl _new_rwabs
460:
461: _new_rwabs:
462:
463: movew sp@(0xe), d0 | check the drive
464:
465: cmpw #0x10, d0 | drive Q:?
466:
467: beq rwdone | yes, fake a successful I/O operation
468:
469: cmpw #0x14, d0 | drive U:?
470:
471: beq rwdone | yes, fake it
472:
473: cmpw #0x15, d0 | drive V:?
474:
475: beq rwdone
476:
477: cmpw #0x17, d0 | drive X:?
478:
479: beq rwdone
480:
481: movel _old_rwabs+8, a0 | not our drive
482:
483: jmp a0@ | call the old vector for it
484:
485: rwdone:
486:
487: moveql #0, d0 | 0 means "successful operation"
488:
489: rts
490:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.