TRAP exception handling list
Trap # | Description |
---|---|
0 | User defined |
1 | 〃(mpcm.x) |
2 | 〃(pcm8.x) |
3 | 〃(zmusic.x、zmsc3.x、middrv.r) |
4 | 〃(mxdrv.x、madrv.x、mld.x、mcdrv.x) |
5 | 〃 |
6 | 〃 |
7 | 〃 |
8 | Breakpoint(ROM Debugger) |
9 | 〃 (db.x、scd.x) |
10 | Reset/power off handling |
11 | BREAK key processing |
12 | COPY key processing |
13 | CTRL+C processing |
14 | Error handling |
15 | IOCS call |
<BOOKMARK:trap4>
trap #4 MXDRV
Args d0.l = Command
Command | Name | Function |
---|---|---|
0x00 | UNLINK | |
0x01 | ERROR | |
0x02 | LOADMML | Set MDX data Args: a1 = address d1 = length |
0x03 | LOADPCM | Set PDX data Args: a1 = address d1 = length |
0x04 | M_PLAY | Play with no muting. See 0x0F |
0x05 | M_END | Stop playback |
0x06 | M_STOP | Pause playback |
0x07 | M_CONT | Resume playback |
0x08 | MMLNAME | Get Title address |
0x09 | PCMNAME | Get PDX filename |
0x0A | VOLADD | |
0x0B | PCMCUT | |
0x0C | FADEOUT | Fade out Args: d1 = speed |
0x0D | AMPLAY | Set ignore keys Args: D1 = mask Return: d0 = old value |
0x0E | CHMASK | Set channel mask |
0x0F | M_PLAY2 | Play with channel mute mask Args: d1 = mask (1 = mute) |
0x10 | WORKS | Get FM buffer address |
0x11 | TIMSET | |
0x12 | M_STAT | Get playing flags Return: d0 = flags |
0x13 | KEYBCONT | |
0x14 | M_STAT2 | |
0x15 | EXMODE | (?) Dont check for Performance End command right after a loop end |
0x16 | TRACEMODE | Stop playback and disable timer writes depending Args: d1 = new value Return: d0 = old value |
0x17 | TRACESTEP | |
0x18 | PCM4WORKS | Get PCM buffer address |
0x19 | EXCHWORKS | (?)PCM Key On work |
0x1A | ||
0x1B | ||
0x1C | ||
0x1D | ||
0x1E | ||
0x1F |
<BOOKMARK:trap10>
trap #10 Reset/power off handling
Args d0.l = $58363801('X68'<<8+1) Power off by front switch $58363802('X68'<<8+2) Power off by external switch $58363803('X68'<<8+3) Power off with soft switch
Software reset other than above
It is called from the power off interrupt and keyboard processing or from the user program and performs power off and reset processing by software.
It is hooked at Human68k startup. It will not be executed immediately even if it is called during DOS call execution. It will be called after it ends.
<BOOKMARK:trap11>
trap #11 - BREAK key processing
Arg d0.b Shift key status
Called from the keyboard process when the BREAK key is pressed but ignored while executing disk related IOCS of $40 to $4F. It is hooked at Human68k startup, it will not be executed immediately even if it is called during DOS call execution. It will be called after it ends.
If you press the BREAK key without pressing SHIFT, trap #13 is also executed after trap #11.
Since multiple calls are noe made, there is no need to have a reentrant structure.
<BOOKMARK:trap12>
trap #12 - COPY key handling
Arg d0.b Shift key status
When the COPY key is pressed it is called from the keyboard process and performs the hard copy process of the screen.
Since multiple calls are not made there is no need to have a reentrant structure.
The following operations are performed depending on the shift key state.
- COPY Reduced copy (1 color)
- SHIFT + COPY Enlarged copy (1 color)
- CTRL + COPY Enlarged copy (4 colors)
- OPT.1 + COPY FF output.
- OPT.2 + COPY LF 〃
<BOOKMARK:trap13>
trap #13 - CTRL+C handling
Called from keyboard processing when CTRL+C and BREAK keys are entered.
Usually routines that do not do anything are registered, so they can be used by users.
<BOOKMARK:trap14>
trap #14 - Error handling
Arg d7.w Error number a5.l String address (only for d7.w = $??00)
When ROM is started it just restarts waiting for key input, but when Human68k starts up it is hooked and replaced with a routine that displays a white strip and waits for the users response.
If the system detects an error, set error number d7.w and trap #14. In this error handling routine, depending on the type of error, after outputting a message according to the type of error, it waits for input from the keyboard and sets d7.w to 1 (reexecution) or 2 (ignore) and return. If abort is specified (will not return).
Code | Description | Other info |
---|---|---|
$00xx | CPU Exception processing/unregistered interrupt (stop only). | The lower byte is the vector number, see table below. |
Code | Description |
---|---|
$0002 | Bus error |
$0003 | Address error |
$0004 | Invalid instruction |
$0005 | Divide by 0 |
$0006 | CHK instruction executed |
$0007 | TRAPV instruction executed |
$0008 | Privileged instruction executed |
$001f | Interrupt(NMI) switch pressed |
$01xx | Unregistered IOCS call |
Code | Description |
---|---|
$02xx~$0fxx | Reserved |
$10xx~$1fxx | Error (cancellation only) |
$20xx~$2fxx | Error (retry only) |
$30xx~$3fxx | Error (re-execute & cancel) |
$301f | Interrupt(NMI) switch pressed |
$40xx~$4fxx | Error (ignore only) |
$50xx~$5fxx | Error (ignore & cancel) |
$60xx~$6fxx | Error (ignore & rerun) |
$70xx~$7fxx | Error (ignore & re-execute & cancel) |
$80xx~$efxx | Reserved |
$f0xx~$fdxx | Interrupt other than F series DOS call (only stop) |
$fexx | Floating-point operation package not installed (abort only) |
Code | Description | Other info |
---|---|---|
$ffxx | Unregistered DOS call | In Human68k version 3.0x unregistered DOS call returns -1 and error handling is not called. When the interrupt switch is pressed the error numbers are two numbers, $001F and $003F. Usually the latter is used. |
For error numbers from $1000~$7FFF, bits 4, 5, and 6 of the high-order byte are cancelled. It corresponts to retry, ignore. The contents of the lower byte at this time are as follows.
Code | Description |
---|---|
$00 | User defined (put a string address in a5.l) |
$01 | An invalid unit number was specified. |
$02 | Disk is not inserted. |
$03 | Invalid command specified in the device driver. |
$04 | CRC error. |
$05 | Disk management area is destroyed. |
$06 | Seek error. |
$07 | Invalid media. |
$08 | Sector not found. |
$09 | Printer is not connected. |
$0A | Write error. |
$0B | Read error. |
$0C | Other error. |
$0D | Write protected (remove protect and put the same disk). |
$0E | Impossible to write. |
$0F | File sharing violation. |
If the low-order byte is 0 the user can specify the character string to be displayed. The address of the character string is passed in a5.l and the character string must not be more than the display witdh 52 digits. However, as the error code of the device driver, if the low byte (3rd byte from the head of the request header) is 0, it is handled as normal ternimation and it is impossible to pass the address of the character string, so this function can not be used.
<BOOKMARK:trap15>
trap #15 - IOCS processing
Arg d0.b IOCS call number
Execute IOCS. During execution, the IOCS call number is storedin one word from IOCS work area $A0E (upper byte is always 0). Arguments and return values other than d0.b differ depending on the call number.
To speed up the IOCS call, execute the shortcut call by the following method while in supervisor mode.
movea.l (IOCS call number*4+$400),a0 jsr (a0)
Each function of IOCS is created as a subroutine returning with rts. There is no problem in destroying a0.l (from the point of view of the user, there is no guarantee that it will be saved when shortcutting), do not destroy registers that do not pass other return values.
How handles vector base register VBR
In X68030 (ROM IOCS version 1.3), VBR can be enabled. After checking that the following vectors are standard vectors pointing inside the ROM, change the value obtained by subtracting 2 from each address. However, in some IOCS calls, routines in ROM can not deal with what is calling(?).
- trap #15(IOCS processing address table is also changed to VBR+$400)
- IOCS _FNTGET
- IOCS _OPMINTST
- IOCS _TIMERDST
- IOCS _VDISPST
- IOCS _CRTCRAS
- IOCS _HSYNCST
- IOCS _PRNINTST
- IOCS _B_INTVCS