TRAP exception handling list

Trap #Description
0User 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
8Breakpoint(ROM Debugger)
9〃 (db.x、scd.x)
10Reset/power off handling
11BREAK key processing
12COPY key processing
13CTRL+C processing
14Error handling
15IOCS call

<BOOKMARK:trap4>

trap #4 MXDRV

Args	d0.l = Command
CommandNameFunction
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.

<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).

CodeDescriptionOther info
$00xxCPU Exception processing/unregistered interrupt (stop only).The lower byte is the vector number, see table below.
CodeDescription
$0002Bus error
$0003Address error
$0004Invalid instruction
$0005Divide by 0
$0006CHK instruction executed
$0007TRAPV instruction executed
$0008Privileged instruction executed
$001fInterrupt(NMI) switch pressed
$01xxUnregistered IOCS call
CodeDescription
$02xx~$0fxxReserved
$10xx~$1fxxError (cancellation only)
$20xx~$2fxxError (retry only)
$30xx~$3fxxError (re-execute & cancel)
$301fInterrupt(NMI) switch pressed
$40xx~$4fxxError (ignore only)
$50xx~$5fxxError (ignore & cancel)
$60xx~$6fxxError (ignore & rerun)
$70xx~$7fxxError (ignore & re-execute & cancel)
$80xx~$efxxReserved
$f0xx~$fdxxInterrupt other than F series DOS call (only stop)
$fexxFloating-point operation package not installed (abort only)
CodeDescriptionOther info
$ffxxUnregistered DOS callIn 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.

CodeDescription
$00User defined (put a string address in a5.l)
$01An invalid unit number was specified.
$02Disk is not inserted.
$03Invalid command specified in the device driver.
$04CRC error.
$05Disk management area is destroyed.
$06Seek error.
$07Invalid media.
$08Sector not found.
$09Printer is not connected.
$0AWrite error.
$0BRead error.
$0COther error.
$0DWrite protected (remove protect and put the same disk).
$0EImpossible to write.
$0FFile 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(?).