mirror of
https://github.com/alfishe/amiga-bootcamp.git
synced 2026-06-13 00:26:28 +00:00
107 lines
3.1 KiB
Markdown
107 lines
3.1 KiB
Markdown
|
|
[← Home](../README.md) · [Exec Kernel](README.md)
|
|||
|
|
|
|||
|
|
# Exception and Trap Handling — M68k on AmigaOS
|
|||
|
|
|
|||
|
|
## Overview
|
|||
|
|
|
|||
|
|
The M68k CPU provides a **256-entry exception vector table** starting at address `$000000`. AmigaOS manages these vectors through `exec.library`, allowing both the OS and user code to install handlers for hardware interrupts, bus errors, and software traps.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Exception Vector Table
|
|||
|
|
|
|||
|
|
| Vector | Address | Exception | AmigaOS Handler |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| 0 | `$000` | Reset: Initial SSP | (boot value) |
|
|||
|
|
| 1 | `$004` | Reset: Initial PC | ROM entry point |
|
|||
|
|
| 2 | `$008` | Bus Error | Guru Meditation / Enforcer |
|
|||
|
|
| 3 | `$00C` | Address Error | Guru Meditation |
|
|||
|
|
| 4 | `$010` | Illegal Instruction | Guru Meditation |
|
|||
|
|
| 5 | `$014` | Zero Divide | Alert |
|
|||
|
|
| 6 | `$018` | CHK Instruction | Alert |
|
|||
|
|
| 7 | `$01C` | TRAPV | Alert |
|
|||
|
|
| 8 | `$020` | Privilege Violation | Alert |
|
|||
|
|
| 9 | `$024` | Trace | Debug (wack/BareFoot) |
|
|||
|
|
| 10 | `$028` | Line-A Emulator | Unused (soft trap space) |
|
|||
|
|
| 11 | `$02C` | Line-F Emulator | 68040/060.library FPU emulation |
|
|||
|
|
| 12–14 | `$030–$038` | Reserved | — |
|
|||
|
|
| 15 | `$03C` | Uninitialised Interrupt | Alert |
|
|||
|
|
| 24 | `$060` | Spurious Interrupt | — |
|
|||
|
|
| 25–31 | `$064–$07C` | Auto-vector interrupts 1–7 | Exec interrupt dispatcher |
|
|||
|
|
| 32–47 | `$080–$0BC` | TRAP #0–#15 | User-installable traps |
|
|||
|
|
| 48–63 | `$0C0–$0FC` | Reserved (FPU) | 68881/68882 exception handlers |
|
|||
|
|
| 64–255 | `$100–$3FC` | User-defined vectors | User |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## TRAP Instructions — Software Interrupts
|
|||
|
|
|
|||
|
|
`TRAP #n` (n = 0–15) generates a software exception. AmigaOS uses:
|
|||
|
|
|
|||
|
|
| TRAP | User |
|
|||
|
|
|---|---|
|
|||
|
|
| `TRAP #0` | exec.library `Supervisor()` — switch to supervisor mode |
|
|||
|
|
| `TRAP #1–#14` | Available for user programs |
|
|||
|
|
| `TRAP #15` | Remote debugger breakpoint (BareFoot/wack) |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Installing an Exception Handler
|
|||
|
|
|
|||
|
|
```c
|
|||
|
|
/* Using exec.library SetExcept/SetTrapHandler (not recommended): */
|
|||
|
|
/* Direct vector patching in supervisor mode: */
|
|||
|
|
|
|||
|
|
APTR OldVector;
|
|||
|
|
|
|||
|
|
__asm void MyTrapHandler(void)
|
|||
|
|
{
|
|||
|
|
/* Save registers, examine stack frame */
|
|||
|
|
/* ... handle trap ... */
|
|||
|
|
rte
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* Install: */
|
|||
|
|
Supervisor(function() {
|
|||
|
|
OldVector = *(APTR *)0x0B0; /* TRAP #12 vector */
|
|||
|
|
*(APTR *)0x0B0 = MyTrapHandler;
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Guru Meditation
|
|||
|
|
|
|||
|
|
When a fatal exception occurs (Bus Error, Address Error), exec.library displays:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Software Failure. Press left mouse button to continue.
|
|||
|
|
Guru Meditation #XXYYYYYY.ZZZZZZZZ
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
| Field | Meaning |
|
|||
|
|
|---|---|
|
|||
|
|
| `XX` | Alert type: $00=recovery possible, $80=dead-end |
|
|||
|
|
| `YYYYYY` | Error code (subsystem + specific error) |
|
|||
|
|
| `ZZZZZZZZ` | Address where error occurred |
|
|||
|
|
|
|||
|
|
### Common Guru Codes
|
|||
|
|
|
|||
|
|
| Code | Meaning |
|
|||
|
|
|---|---|
|
|||
|
|
| `$80000003` | Address Error (dead-end) |
|
|||
|
|
| `$80000004` | Illegal instruction (dead-end) |
|
|||
|
|
| `$81000005` | exec: No memory |
|
|||
|
|
| `$82000005` | graphics: No memory |
|
|||
|
|
| `$87000007` | trackdisk: No disk |
|
|||
|
|
| `$04000001` | exec: Recoverable alert |
|
|||
|
|
| `$00000001` | No memory (recoverable) |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## References
|
|||
|
|
|
|||
|
|
- Motorola: *MC68000 Family Reference Manual* — exception processing
|
|||
|
|
- NDK39: `exec/alerts.h` — alert code definitions
|
|||
|
|
- RKRM: Exception chapter
|