2018-07-04 11:26:33 +00:00
|
|
|
; AUTO-GENERATED SYMBOL LIST
|
|
|
|
|
2018-07-15 09:20:35 +00:00
|
|
|
########################################################################
|
|
|
|
|
|
|
|
_align 6
|
|
|
|
IntExternal0
|
|
|
|
mfsprg r1, 0 ; Init regs and increment ctr
|
2018-07-15 11:59:56 +00:00
|
|
|
stw r0, KDP.r0(r1)
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r2, KDP.r2(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
lwz r2, KDP.NKInfo.ExternalIntCount(r1)
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r3, KDP.r3(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
addi r2, r2, 1
|
|
|
|
stw r2, KDP.NKInfo.ExternalIntCount(r1)
|
|
|
|
|
|
|
|
mfmsr r2 ; Save a self-ptr to FF880000... why?
|
|
|
|
lis r3, 0xFF88
|
|
|
|
_bset r0, r2, bitMsrDR
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r4, KDP.r4(r1)
|
|
|
|
stw r5, KDP.r5(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
mfsrr0 r4
|
|
|
|
mfsrr1 r5
|
|
|
|
mtmsr r0
|
|
|
|
stw r3, 0(r3)
|
|
|
|
mtmsr r2
|
|
|
|
mtsrr0 r4
|
2018-07-15 09:34:52 +00:00
|
|
|
mtsrr1 r5
|
2018-07-15 10:30:41 +00:00
|
|
|
lwz r4, KDP.r4(r1)
|
|
|
|
lwz r5, KDP.r5(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
|
|
|
|
lwz r2, KDP.DebugIntPtr(r1) ; Query the shared mem (debug?) for int num
|
|
|
|
mfcr r0
|
|
|
|
lha r2, 0(r2)
|
2018-07-15 11:13:45 +00:00
|
|
|
lwz r3, KDP.EmuIntLevelPtr(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
rlwinm. r2, r2, 0, 0x80000007
|
|
|
|
ori r2, r2, 0x8000
|
|
|
|
sth r2, 0(r3)
|
|
|
|
mfsprg r2, 2
|
2018-07-15 10:30:41 +00:00
|
|
|
lwz r3, KDP.r3(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
mtlr r2
|
2018-07-15 11:59:56 +00:00
|
|
|
beq @clear ; 0 -> clear interrupt
|
|
|
|
bgt @return ; negative -> no interrupt flag
|
2018-07-15 09:20:35 +00:00
|
|
|
; positive -> post interrupt
|
|
|
|
|
|
|
|
lwz r2, KDP.PostIntMaskInit(r1) ; Post an interrupt via Cond Reg
|
|
|
|
or r0, r0, r2
|
|
|
|
|
|
|
|
@return
|
|
|
|
mtcr r0 ; Set CR and return
|
2018-07-15 10:30:41 +00:00
|
|
|
lwz r0, KDP.r0(r1)
|
|
|
|
lwz r2, KDP.r2(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
mfsprg r1, 1
|
|
|
|
rfi
|
|
|
|
|
|
|
|
@clear
|
|
|
|
lwz r2, KDP.ClearIntMaskInit(r1) ; Clear an interrupt via Cond Reg
|
|
|
|
and r0, r0, r2
|
|
|
|
b @return
|
|
|
|
|
|
|
|
########################################################################
|
|
|
|
|
|
|
|
_align 6
|
|
|
|
IntLookupTable
|
2018-07-15 11:29:31 +00:00
|
|
|
dc.b 0, 1, 2, 2, 4, 4, 4, 4
|
|
|
|
dc.b 3, 3, 3, 3, 4, 4, 4, 4
|
|
|
|
dc.b 4, 4, 4, 4, 4, 4, 4, 4
|
|
|
|
dc.b 4, 4, 4, 4, 4, 4, 4, 4
|
|
|
|
dc.b 7, 7, 7, 7, 7, 7, 7, 7
|
|
|
|
dc.b 7, 7, 7, 7, 7, 7, 7, 7
|
|
|
|
dc.b 7, 7, 7, 7, 7, 7, 7, 7
|
|
|
|
dc.b 7, 7, 7, 7, 7, 7, 7, 7
|
2018-07-15 09:20:35 +00:00
|
|
|
|
|
|
|
_align 6
|
|
|
|
IntExternal1
|
|
|
|
mfsprg r1, 0 ; Init regs and increment ctr
|
2018-07-15 11:59:56 +00:00
|
|
|
stw r0, KDP.r0(r1)
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r2, KDP.r2(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
lwz r2, KDP.NKInfo.ExternalIntCount(r1)
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r3, KDP.r3(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
addi r2, r2, 1
|
|
|
|
stw r2, KDP.NKInfo.ExternalIntCount(r1)
|
|
|
|
|
|
|
|
lis r2, 0x50F3 ; Query OpenPIC at 50F2A000
|
2018-07-15 11:59:56 +00:00
|
|
|
mfmsr r3
|
|
|
|
_bset r0, r3, bitMsrDR
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r4, KDP.r4(r1)
|
|
|
|
stw r5, KDP.r5(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
mfsrr0 r4
|
|
|
|
mfsrr1 r5
|
|
|
|
mtmsr r0
|
|
|
|
li r0, 0xC0
|
|
|
|
stb r0, -0x6000(r2)
|
|
|
|
eieio
|
|
|
|
lbz r0, -0x6000(r2)
|
2018-07-15 11:59:56 +00:00
|
|
|
mtmsr r3
|
2018-07-15 09:20:35 +00:00
|
|
|
mtsrr0 r4
|
2018-07-15 09:34:52 +00:00
|
|
|
mtsrr1 r5
|
2018-07-15 10:30:41 +00:00
|
|
|
lwz r4, KDP.r4(r1)
|
|
|
|
lwz r5, KDP.r5(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
|
2018-07-15 11:13:45 +00:00
|
|
|
lwz r3, KDP.NKCodePtr(r1) ; Loop that number up in the table
|
2018-07-15 09:20:35 +00:00
|
|
|
rlwimi r3, r0, 0, 0x0000003F
|
|
|
|
lbz r2, IntLookupTable-NKTop(r3)
|
|
|
|
mfcr r0
|
2018-07-15 11:13:45 +00:00
|
|
|
lwz r3, KDP.EmuIntLevelPtr(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
clrlwi. r2, r2, 29
|
|
|
|
sth r2, 0(r3)
|
|
|
|
mfsprg r2, 2
|
2018-07-15 10:30:41 +00:00
|
|
|
lwz r3, KDP.r3(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
mtlr r2
|
|
|
|
beq @clear ; 0 -> clear interrupt
|
|
|
|
; nonzero -> post interrupt
|
|
|
|
|
|
|
|
lwz r2, KDP.PostIntMaskInit(r1) ; Post an interrupt via Cond Reg
|
|
|
|
or r0, r0, r2
|
|
|
|
|
|
|
|
@return
|
|
|
|
mtcr r0 ; Set CR and return
|
2018-07-15 10:30:41 +00:00
|
|
|
lwz r0, KDP.r0(r1)
|
|
|
|
lwz r2, KDP.r2(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
mfsprg r1, 1
|
|
|
|
rfi
|
|
|
|
|
|
|
|
@clear
|
|
|
|
lwz r2, KDP.ClearIntMaskInit(r1) ; Clear an interrupt via Cond Reg
|
|
|
|
and r0, r0, r2
|
|
|
|
b @return
|
|
|
|
|
|
|
|
########################################################################
|
|
|
|
|
|
|
|
_align 6
|
|
|
|
IntExternal2
|
|
|
|
mfsprg r1, 0 ; Init regs and increment ctr
|
2018-07-15 11:59:56 +00:00
|
|
|
stw r0, KDP.r0(r1)
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r2, KDP.r2(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
lwz r2, KDP.NKInfo.ExternalIntCount(r1)
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r3, KDP.r3(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
addi r2, r2, 1
|
|
|
|
stw r2, KDP.NKInfo.ExternalIntCount(r1)
|
|
|
|
|
|
|
|
lis r2, 0xF300 ; Query OpenPIC at F3000028/C
|
2018-07-15 11:59:56 +00:00
|
|
|
mfmsr r0
|
|
|
|
_bset r3, r0, bitMsrDR
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r4, KDP.r4(r1)
|
|
|
|
stw r5, KDP.r5(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
mfsrr0 r4
|
|
|
|
mfsrr1 r5
|
|
|
|
mtmsr r3
|
|
|
|
lis r3, 0x8000
|
|
|
|
stw r3, 0x28(r2)
|
|
|
|
eieio
|
|
|
|
lwz r3, 0x2C(r2)
|
|
|
|
mtmsr r0
|
|
|
|
mtsrr0 r4
|
2018-07-15 09:34:52 +00:00
|
|
|
mtsrr1 r5
|
2018-07-15 10:30:41 +00:00
|
|
|
lwz r4, KDP.r4(r1)
|
|
|
|
lwz r5, KDP.r5(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
|
|
|
|
mfcr r0
|
|
|
|
; Interpret OpenPic result:
|
|
|
|
rlwinm. r2, r3, 0, 11, 11 ; bit 11 -> 7
|
|
|
|
li r2, 7
|
|
|
|
bne @gotnum
|
|
|
|
|
|
|
|
rlwinm r2, r3, 0, 15, 16 ; bit 15-16/21/31 -> 4
|
|
|
|
rlwimi. r2, r3, 0, 21, 31
|
|
|
|
li r2, 4
|
|
|
|
bne @gotnum
|
|
|
|
|
|
|
|
rlwinm. r2, r3, 0, 18, 18 ; bit 18 -> 3
|
|
|
|
li r2, 3
|
|
|
|
bne @gotnum
|
|
|
|
|
|
|
|
andis. r2, r3, 0x7FEA ; bit 1-10/12/14/19-20 -> 2
|
|
|
|
rlwimi. r2, r3, 0, 19, 20
|
|
|
|
li r2, 2
|
|
|
|
bne @gotnum
|
|
|
|
|
|
|
|
extrwi. r2, r3, 1, 13 ; bit 13 -> 1
|
|
|
|
; else -> 0
|
|
|
|
|
|
|
|
@gotnum
|
2018-07-15 11:13:45 +00:00
|
|
|
lwz r3, KDP.EmuIntLevelPtr(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
sth r2, 0(r3)
|
|
|
|
mfsprg r2, 2
|
2018-07-15 10:30:41 +00:00
|
|
|
lwz r3, KDP.r3(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
mtlr r2
|
|
|
|
beq @clear ; 0 -> clear interrupt
|
|
|
|
; nonzero -> post interrupt
|
|
|
|
|
|
|
|
lwz r2, KDP.PostIntMaskInit(r1) ; Post an interrupt via Cond Reg
|
|
|
|
or r0, r0, r2
|
|
|
|
|
|
|
|
@return
|
|
|
|
mtcr r0 ; Set CR and return
|
2018-07-15 10:30:41 +00:00
|
|
|
lwz r0, KDP.r0(r1)
|
|
|
|
lwz r2, KDP.r2(r1)
|
2018-07-15 09:20:35 +00:00
|
|
|
mfsprg r1, 1
|
|
|
|
rfi
|
|
|
|
|
|
|
|
@clear
|
|
|
|
lwz r2, KDP.ClearIntMaskInit(r1) ; Clear an interrupt via Cond Reg
|
|
|
|
and r0, r0, r2
|
|
|
|
b @return
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
########################################################################
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
; Increment the Sys/Alt CPU clocks, and the Dec-int counter
|
|
|
|
_align 6
|
2018-07-09 08:06:47 +00:00
|
|
|
IntDecrementerSystem
|
|
|
|
mfsprg r1, 0
|
2018-07-15 10:30:41 +00:00
|
|
|
stmw r2, KDP.r2(r1)
|
2018-07-09 08:06:47 +00:00
|
|
|
mfdec r31
|
2018-07-10 05:16:19 +00:00
|
|
|
lwz r30, KDP.OtherContextDEC(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
DecCommon ; DEC for Alternate=r30, System=r31
|
|
|
|
mfxer r29 ; we will do carries
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
lwz r28, KDP.ProcInfo.DecClockRateHz(r1)
|
|
|
|
stw r28, KDP.OtherContextDEC(r1)
|
|
|
|
mtdec r28 ; reset Sys and Alt decrementers
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
subf r31, r31, r28 ; System ticks actually elapsed
|
|
|
|
subf r30, r30, r28 ; Alternate ticks actually elapsed
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
lwz r28, KDP.NKInfo.SysContextCpuTime+4(r1)
|
|
|
|
lwz r27, KDP.NKInfo.SysContextCpuTime(r1)
|
|
|
|
addc r28, r28, r31
|
|
|
|
addze r27, r27
|
|
|
|
stw r28, KDP.NKInfo.SysContextCpuTime+4(r1)
|
|
|
|
stw r27, KDP.NKInfo.SysContextCpuTime(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
lwz r28, KDP.NKInfo.AltContextCpuTime+4(r1)
|
|
|
|
lwz r27, KDP.NKInfo.AltContextCpuTime(r1)
|
|
|
|
addc r28, r28, r30
|
|
|
|
addze r27, r27
|
|
|
|
stw r28, KDP.NKInfo.AltContextCpuTime+4(r1)
|
|
|
|
stw r27, KDP.NKInfo.AltContextCpuTime(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
mtxer r29
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r0, KDP.r0(r1)
|
2018-07-10 05:16:19 +00:00
|
|
|
mfsprg r31, 1
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r31, KDP.r1(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
lwz r31, KDP.NKInfo.DecrementerIntCount(r1)
|
|
|
|
addi r31, r31, 1
|
|
|
|
stw r31, KDP.NKInfo.DecrementerIntCount(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-15 10:30:41 +00:00
|
|
|
lmw r27, KDP.r27(r1)
|
2018-07-10 05:16:19 +00:00
|
|
|
mfsprg r1, 2
|
|
|
|
mtlr r1
|
|
|
|
mfsprg r1, 1
|
|
|
|
rfi
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
IntDecrementerAlternate
|
|
|
|
mfsprg r1, 0
|
2018-07-15 10:30:41 +00:00
|
|
|
stmw r2, KDP.r2(r1)
|
2018-07-10 05:16:19 +00:00
|
|
|
lwz r31, KDP.OtherContextDEC(r1)
|
|
|
|
mfdec r30
|
|
|
|
b DecCommon
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
########################################################################
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
_align 6
|
2018-07-04 11:26:33 +00:00
|
|
|
IntDSI
|
|
|
|
mfsprg r1, 0
|
2018-07-15 10:30:41 +00:00
|
|
|
stmw r2, KDP.r2(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
mfsprg r11, 1
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r0, KDP.r0(r1)
|
|
|
|
stw r11, KDP.r1(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
mfsrr0 r10
|
|
|
|
mfsrr1 r11
|
2018-07-04 11:26:33 +00:00
|
|
|
mfsprg r12, 2
|
|
|
|
mfcr r13
|
|
|
|
|
|
|
|
mfmsr r14
|
2018-07-09 08:06:47 +00:00
|
|
|
_bset r15, r14, bitMsrDR
|
2018-07-04 11:26:33 +00:00
|
|
|
mtmsr r15
|
2018-07-09 08:06:47 +00:00
|
|
|
lwz r27, 0(r10)
|
|
|
|
mtmsr r14
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
EmulateDataAccess
|
|
|
|
rlwinm. r18, r27, 18, 25, 29 ; r16 = 4 * rA (r0 wired to 0)
|
2018-07-15 11:13:45 +00:00
|
|
|
lwz r25, KDP.RetryCodePtr(r1)
|
2018-07-09 08:06:47 +00:00
|
|
|
li r21, 0
|
|
|
|
beq @r0
|
2018-07-04 11:26:33 +00:00
|
|
|
lwzx r18, r1, r18
|
2018-07-09 08:06:47 +00:00
|
|
|
@r0
|
|
|
|
andis. r26, r27, 0xec00
|
2018-07-10 05:16:19 +00:00
|
|
|
lwz r16, KDP.Flags(r1)
|
|
|
|
mfsprg r24, 3
|
2018-07-09 08:06:47 +00:00
|
|
|
rlwinm r17, r27, 0, 6, 15
|
2018-07-04 11:26:33 +00:00
|
|
|
rlwimi r16, r16, 27, 26, 26
|
2018-07-09 08:06:47 +00:00
|
|
|
bge @low_opcode
|
|
|
|
|
|
|
|
rlwimi r25, r27, 7, 26, 29 ; opcode >= 32
|
2018-07-04 11:26:33 +00:00
|
|
|
rlwimi r25, r27, 12, 25, 25
|
2018-07-09 08:06:47 +00:00
|
|
|
lwz r26, 0xb80(r25)
|
2018-07-04 11:26:33 +00:00
|
|
|
extsh r23, r27
|
|
|
|
rlwimi r25, r26, 26, 22, 29
|
|
|
|
mtlr r25
|
|
|
|
mtcr r26
|
|
|
|
add r18, r18, r23
|
2018-07-09 08:06:47 +00:00
|
|
|
rlwimi r17, r26, 6, 26, 5
|
2018-07-04 11:26:33 +00:00
|
|
|
blr
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
@low_opcode ; opcode <= 31
|
2018-07-04 11:26:33 +00:00
|
|
|
rlwimi r25, r27, 27, 26, 29
|
2018-07-09 08:06:47 +00:00
|
|
|
rlwimi r25, r27, 0, 25, 25
|
|
|
|
rlwimi r25, r27, 6, 23, 24
|
|
|
|
lwz r26, 0x800(r25)
|
2018-07-04 11:26:33 +00:00
|
|
|
rlwinm r23, r27, 23, 25, 29
|
|
|
|
rlwimi r25, r26, 26, 22, 29
|
|
|
|
mtlr r25
|
|
|
|
mtcr r26
|
|
|
|
lwzx r23, r1, r23
|
2018-07-09 08:06:47 +00:00
|
|
|
rlwimi r17, r26, 6, 26, 5
|
2018-07-04 11:26:33 +00:00
|
|
|
add r18, r18, r23
|
|
|
|
bclr BO_IF_NOT, 13
|
|
|
|
neg r23, r23
|
|
|
|
add r18, r18, r23
|
|
|
|
blr
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
########################################################################
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-10 05:16:19 +00:00
|
|
|
_align 6
|
2018-07-09 08:06:47 +00:00
|
|
|
IntAlignment
|
2018-07-04 11:26:33 +00:00
|
|
|
mfsprg r1, 0
|
2018-07-15 10:30:41 +00:00
|
|
|
stmw r2, KDP.r2(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-09 08:13:00 +00:00
|
|
|
lwz r11, KDP.NKInfo.MisalignmentCount(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
addi r11, r11, 1
|
2018-07-09 08:13:00 +00:00
|
|
|
stw r11, KDP.NKInfo.MisalignmentCount(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
mfsprg r11, 1
|
2018-07-15 10:30:41 +00:00
|
|
|
stw r0, KDP.r0(r1)
|
|
|
|
stw r11, KDP.r1(r1)
|
2018-07-09 08:06:47 +00:00
|
|
|
|
|
|
|
mfsrr0 r10
|
|
|
|
mfsrr1 r11
|
2018-07-04 11:26:33 +00:00
|
|
|
mfsprg r12, 2
|
|
|
|
mfcr r13
|
|
|
|
mfsprg r24, 3
|
2018-07-09 08:06:47 +00:00
|
|
|
mfdsisr r27
|
|
|
|
mfdar r18
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
extrwi. r21, r27, 2, 15 ; evaluate hi two bits of XO (or 0 for d-form?)
|
2018-07-15 11:13:45 +00:00
|
|
|
lwz r25, KDP.RetryCodePtr(r1)
|
2018-07-09 08:06:47 +00:00
|
|
|
rlwinm r17, r27, 16, 0x03FF0000
|
|
|
|
lwz r16, KDP.Flags(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
rlwimi r25, r27, 24, 23, 29 ; add constant fields from dsisr (*4) to FDP
|
2018-07-09 08:06:47 +00:00
|
|
|
rlwimi r16, r16, 27, 26, 26 ; copy FlagSE to Flag26
|
|
|
|
bne @X_form
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
; D- or DS-form (immediate-indexed) instruction
|
|
|
|
lwz r26, FDP_TableBase + 4*(0x40 + 0x20)(r25) ; use upper quarter of table
|
2018-07-04 11:26:33 +00:00
|
|
|
mfmsr r14
|
|
|
|
rlwimi r25, r26, 26, 22, 29 ; third byte of lookup value is a /4 code offset in FDP
|
|
|
|
mtlr r25 ; so get ready to go there
|
2018-07-09 08:06:47 +00:00
|
|
|
_bset r15, r14, bitMsrDR
|
2018-07-04 11:26:33 +00:00
|
|
|
mtcr r26
|
2018-07-09 08:06:47 +00:00
|
|
|
rlwimi r17, r26, 6, 26, 5 ; wrap some shite around the register values
|
2018-07-04 11:26:33 +00:00
|
|
|
blr
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
@X_form
|
2018-07-04 11:26:33 +00:00
|
|
|
; X-form (register-indexed) instruction
|
2018-07-09 08:06:47 +00:00
|
|
|
lwz r26, FDP_TableBase(r25)
|
2018-07-04 11:26:33 +00:00
|
|
|
mfmsr r14
|
|
|
|
rlwimi r25, r26, 26, 22, 29
|
|
|
|
mtlr r25
|
2018-07-09 08:06:47 +00:00
|
|
|
_bset r15, r14, bitMsrDR
|
2018-07-04 11:26:33 +00:00
|
|
|
mtcr r26
|
2018-07-09 08:06:47 +00:00
|
|
|
rlwimi r17, r26, 6, 26, 5
|
|
|
|
bclr BO_IF_NOT, 12
|
2018-07-04 11:26:33 +00:00
|
|
|
mtmsr r15
|
2018-07-09 08:06:47 +00:00
|
|
|
lwz r27, 0(r10)
|
2018-07-04 11:26:33 +00:00
|
|
|
mtmsr r14
|
|
|
|
blr
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
########################################################################
|
2018-07-10 05:16:19 +00:00
|
|
|
|
|
|
|
; FDP GOES HERE (0xC00)! (just include it as a file?)
|
|
|
|
; there are some big mistakes in the labels below!
|
|
|
|
_align 10
|
|
|
|
FDP
|
|
|
|
dcb.l (0x1874-0xC00)/4, 0x46445020 ; 'FDP '
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
########################################################################
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
IntISI
|
2018-07-04 11:26:33 +00:00
|
|
|
bl LoadInterruptRegisters
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
andis. r8, r11, 0x4020 ; what the hell are these MSR bits?
|
2018-07-04 11:26:33 +00:00
|
|
|
beq major_0x039dc_0x14
|
|
|
|
|
2018-07-15 10:30:41 +00:00
|
|
|
stmw r14, KDP.r14(r8)
|
2018-07-04 11:26:33 +00:00
|
|
|
mr r27, r10
|
2018-07-09 06:53:50 +00:00
|
|
|
bl PopulateHTAB
|
2018-07-09 08:06:47 +00:00
|
|
|
bne @not_in_htab
|
2018-07-04 11:26:33 +00:00
|
|
|
|
|
|
|
mfsprg r24, 3
|
|
|
|
mfmsr r14
|
2018-07-09 08:06:47 +00:00
|
|
|
_bset r15, r14, bitMsrDR
|
2018-07-15 10:10:37 +00:00
|
|
|
addi r23, r1, KDP.VecTblMemRetry
|
2018-07-04 11:26:33 +00:00
|
|
|
mtsprg 3, r23
|
|
|
|
mr r19, r10
|
|
|
|
mtmsr r15
|
2018-07-09 08:06:47 +00:00
|
|
|
lbz r23, 0(r19)
|
2018-07-04 11:26:33 +00:00
|
|
|
sync
|
|
|
|
mtmsr r14
|
|
|
|
mtsprg 3, r24
|
2018-07-15 11:59:56 +00:00
|
|
|
lmw r14, KDP.r14(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
b IntReturn
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
@not_in_htab
|
2018-07-15 11:59:56 +00:00
|
|
|
lmw r14, KDP.r14(r1)
|
2018-07-04 11:26:33 +00:00
|
|
|
li r8, ecInstPageFault
|
|
|
|
blt Exception
|
|
|
|
li r8, ecInstInvalidAddress
|
|
|
|
b Exception
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
major_0x039dc_0x14
|
|
|
|
andis. r8, r11, 0x800
|
2018-07-04 11:26:33 +00:00
|
|
|
li r8, ecInstSupAccessViolation
|
|
|
|
bne Exception
|
|
|
|
li r8, ecInstHardwareFault
|
|
|
|
b Exception
|
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
########################################################################
|
2018-07-04 11:26:33 +00:00
|
|
|
|
2018-07-09 08:06:47 +00:00
|
|
|
IntMachineCheck
|
2018-07-04 11:26:33 +00:00
|
|
|
bl LoadInterruptRegisters
|
|
|
|
li r8, ecMachineCheck
|
|
|
|
b Exception
|