mirror of
https://github.com/elliotnunn/powermac-rom.git
synced 2024-07-06 08:28:58 +00:00
494 lines
11 KiB
ArmAsm
Executable File
494 lines
11 KiB
ArmAsm
Executable File
MRCrash ; C00
|
|
bl SystemCrash
|
|
MRSecFail ; C04
|
|
b MRIOInstFail
|
|
|
|
########################################################################
|
|
|
|
MRPrimSTFSx ; C08
|
|
rlwinm r17, r17, 0,16,10
|
|
|
|
MRPrimSTFSUx ; C0C
|
|
crclr cr7_so
|
|
b MRDoTableSTFD
|
|
|
|
MRPrimSTFDx ; C14
|
|
rlwinm r17, r17, 0,16,10
|
|
|
|
MRPrimSTFDUx ; C18
|
|
crset cr7_so
|
|
|
|
MRDoTableSTFD ; C1C
|
|
; This table is of the form:
|
|
; stfd <reg>, KDP.FloatEmScratch(r1)
|
|
; b
|
|
|
|
clrrwi r19, r25, 10
|
|
rlwimi r19, r17, 14,24,28
|
|
addi r19, r19, STFDTable-MRTop
|
|
mtlr r19
|
|
rlwimi r14, r11, 0,18,18
|
|
mtmsr r14
|
|
blr
|
|
|
|
MRDoneTableSTFD ; c38
|
|
ori r11, r11, 0x2000
|
|
lwz r20, KDP.FloatEmScratch(r1)
|
|
lwz r21, KDP.FloatEmScratch+4(r1)
|
|
bso cr7, MRPrimUpdLoad
|
|
extrwi r23, r20, 11,1
|
|
cmpwi r23, 0x380
|
|
insrwi r20, r20, 27,2
|
|
inslwi r20, r21, 3,29
|
|
mr r21, r20
|
|
bgt MRPrimUpdLoad
|
|
cmpwi r23, 0x36A
|
|
clrrwi r21, r20, 31
|
|
blt MRPrimUpdLoad
|
|
oris r20, r20, 0x80
|
|
neg r23, r23
|
|
clrlwi r20, r20, 8
|
|
srw r20, r20, r23
|
|
rlwimi r21, r20, 31,9,31
|
|
b MRPrimUpdLoad
|
|
|
|
########################################################################
|
|
|
|
MRPrimSTWBRX ; C84
|
|
rlwinm r28, r17, 13,25,29
|
|
lwbrx r21, r1, r28
|
|
b MRPrimPlainLoad
|
|
|
|
MRPrimSTHBRX ; C90
|
|
rlwinm r28, r17, 13,25,29
|
|
addi r21, r1, 2
|
|
lhbrx r21, r21, r28
|
|
b MRPrimPlainLoad
|
|
|
|
########################################################################
|
|
|
|
MRPrimUpdStore ; CA0
|
|
rlwinm r28, r17, 13,25,29
|
|
lwzx r21, r1, r28
|
|
b MRPrimUpdLoad
|
|
|
|
MRPrimPlainStore ; CAC
|
|
rlwinm r28, r17, 13,25,29
|
|
lwzx r21, r1, r28
|
|
|
|
MRPrimPlainLoad ; CB4
|
|
rlwinm r17, r17, 0,16,10
|
|
|
|
MRPrimUpdLoad ; CB8
|
|
extrwi. r22, r17, 4,27
|
|
add r19, r18, r22
|
|
|
|
########################################################################
|
|
|
|
MRDoMemAccess ; CC0
|
|
clrrwi r25, r25, 10
|
|
insrwi r25, r19, 3,28
|
|
insrwi r25, r17, 4,24
|
|
lha r22, MRMemtab-MRTop(r25)
|
|
addi r23, r1, KDP.VecTblMemRetry
|
|
add r22, r22, r25
|
|
mtlr r22
|
|
mtsprg 3, r23
|
|
mtmsr r15
|
|
insrwi r25, r26, 8,22
|
|
bnelr
|
|
b MRDoneMemAccess
|
|
|
|
MRStore22Fast ; Fast return paths from MemAccess code
|
|
srwi r23, r21, 16
|
|
sth r23, -4(r19)
|
|
addi r17, r17, -4
|
|
sth r21, -2(r19)
|
|
b MRDoneMemAccess
|
|
MRLoad22Fast
|
|
lhz r23, -4(r19)
|
|
addi r17, r17, -4
|
|
insrwi r21, r23, 16,0
|
|
MRLoad2Fast
|
|
lhz r23, -2(r19)
|
|
insrwi r21, r23, 16,16
|
|
|
|
MRDoneMemAccess ; D18
|
|
sync
|
|
rlwinm. r28, r17, 18,25,29
|
|
mtlr r25
|
|
cror cr0_eq, cr0_eq, cr3_eq
|
|
mtmsr r14
|
|
mtsprg 3, r24
|
|
beqlr
|
|
crset cr3_so
|
|
stwx r18, r1, r28
|
|
blr
|
|
|
|
########################################################################
|
|
|
|
MRSecLoadExt ; D40
|
|
extsh r21, r21
|
|
|
|
MRSecLoad ; D44
|
|
rlwinm r28, r17, 13,25,29
|
|
crset cr3_so
|
|
stwx r21, r1, r28
|
|
|
|
########################################################################
|
|
|
|
MRExit ; D50
|
|
andi. r23, r16, 0x20
|
|
addi r10, r10, 4
|
|
mtsrr0 r10
|
|
mtsrr1 r11
|
|
bne @trace
|
|
mtlr r12
|
|
|
|
bns cr3, @otherway
|
|
|
|
mtcr r13
|
|
lmw r2, KDP.r2(r1)
|
|
lwz r0, KDP.r0(r1)
|
|
lwz r1, KDP.r1(r1)
|
|
rfi
|
|
|
|
@otherway
|
|
mtcr r13
|
|
lmw r10, KDP.r10(r1)
|
|
lwz r1, KDP.r1(r1)
|
|
rfi
|
|
|
|
@trace
|
|
mfsprg r24, 3
|
|
mtsprg 2, r12
|
|
rlwinm r16, r16, 0,27,25
|
|
lwz r12, VecTbl.Trace(r24)
|
|
stw r16, KDP.Flags(r1)
|
|
mtcr r13
|
|
mtlr r12
|
|
lmw r2, KDP.r2(r1)
|
|
lwz r0, KDP.r0(r1)
|
|
lwz r1, KDP.r1(r1)
|
|
mtsprg 1, r1
|
|
blrl
|
|
|
|
########################################################################
|
|
|
|
MRSecLHBRX ; DC0
|
|
slwi r21, r21, 16
|
|
|
|
MRSecLWBRX ; DC4
|
|
rlwinm r28, r17, 13,25,29
|
|
crset cr3_so
|
|
stwbrx r21, r1, r28
|
|
b MRExit
|
|
|
|
########################################################################
|
|
|
|
MRSecLFSu ; DD4
|
|
clrrwi r20, r21, 31
|
|
xor. r21, r20, r21
|
|
beq MRSecLFDu
|
|
rlwinm. r23, r21, 16,17,24
|
|
addi r23, r23, 0x80
|
|
rlwimi r20, r21, 29,5,31
|
|
extsh r23, r23
|
|
rlwimi r20, r21, 0,1,1
|
|
slwi r21, r21, 29
|
|
addi r23, r23, -0x4080
|
|
rlwimi r20, r23, 0,2,4
|
|
bne MRSecLFDu
|
|
srwi r21, r21, 20
|
|
insrwi r21, r20, 20,0
|
|
cntlzw r23, r21
|
|
slw r21, r21, r23
|
|
neg r23, r23
|
|
rlwimi r20, r21, 21,12,31
|
|
addi r23, r23, 0x380
|
|
slwi r21, r21, 21
|
|
insrwi r20, r23, 11,1
|
|
|
|
MRSecLFDu ; E28
|
|
; This table is of the form:
|
|
; lfd <reg>, KDP.FloatEmScratch(r1)
|
|
; b MRExit
|
|
rlwimi r23, r17, 14,24,28
|
|
addi r23, r23, LFDTable-MRTop
|
|
mtlr r23
|
|
stw r20, KDP.FloatEmScratch(r1)
|
|
stw r21, KDP.FloatEmScratch+4(r1)
|
|
rlwimi r14, r11, 0,18,18
|
|
mtmsr r14
|
|
ori r11, r11, 0x2000
|
|
blr
|
|
|
|
########################################################################
|
|
|
|
MRSecLMW ; E50
|
|
rlwinm. r28, r17, 13,25,29
|
|
rlwinm r23, r17, 18,25,29
|
|
cmpw cr7, r28, r23
|
|
addis r17, r17, 0x20
|
|
beq loc_E68
|
|
beq cr7, loc_E6C
|
|
|
|
loc_E68 ; E68
|
|
stwx r21, r1, r28
|
|
|
|
loc_E6C ; E6C
|
|
cmpwi r28, 0x7C
|
|
li r22, 9
|
|
insrwi r17, r22, 6,26
|
|
addi r19, r19, 4
|
|
bne MRDoMemAccess
|
|
b MRExit
|
|
|
|
MRSecSTMW ; E84
|
|
addis r17, r17, 0x20
|
|
rlwinm. r28, r17, 13,25,29
|
|
beq MRExit
|
|
lwzx r21, r1, r28
|
|
li r22, 8
|
|
insrwi r17, r22, 6,26
|
|
addi r19, r19, 4
|
|
b MRDoMemAccess
|
|
|
|
########################################################################
|
|
|
|
MRPrimDCBZ ; Zero four 8b chunks of the cache blk
|
|
clrrwi r19, r18, 5 ; r19 = address of chunk to zero
|
|
b MRComDCBZ ; (for use by this code only)
|
|
|
|
MRSecDCBZ ; EAC
|
|
andi. r22, r19, 0x18
|
|
clrrwi r19, r19, 3 ; MemAccess code decrements this reg
|
|
beq MRExit ; Zeroed all foun chunks -> done!
|
|
|
|
MRComDCBZ ; EB8
|
|
li r22, 0x10 ; Set 8 bytes (? set bit 27)
|
|
insrwi. r17, r22, 6,26
|
|
addi r19, r19, 8 ; Align ptr to right hand size of chunk
|
|
li r20, 0 ; Contents = zeros
|
|
li r21, 0
|
|
b MRDoMemAccess ; Go, then come back to MRSecDCBZ
|
|
|
|
########################################################################
|
|
|
|
MRSecLWARX ; ED0
|
|
rlwinm r28, r17, 13,25,29
|
|
crset cr3_so
|
|
stwx r21, r1, r28
|
|
stwcx. r21, r1, r28
|
|
b MRExit
|
|
|
|
MRSecSTWCX ; EE4
|
|
stwcx. r0, 0, r1
|
|
mfcr r23
|
|
rlwinm r23, r23, 0,3,1
|
|
rlwimi r13, r23, 0,0,3
|
|
b MRExit
|
|
|
|
########################################################################
|
|
|
|
MRSecCacheWang ; EF8
|
|
rlwinm r16, r16, 0,28,25
|
|
addi r10, r10, -4
|
|
stw r16, KDP.Flags(r1)
|
|
b MRExit
|
|
|
|
########################################################################
|
|
|
|
MRIOInstFail ; F08
|
|
li r8, ecDataInvalidAddress
|
|
b ExceptionMemRetried
|
|
|
|
########################################################################
|
|
|
|
MRPrimSTSWI ; F10
|
|
addi r22, r27, -0x800
|
|
extrwi r22, r22, 5,16
|
|
b loc_F2C
|
|
|
|
MRPrimSTSWX ; F1C
|
|
mfxer r22
|
|
andi. r22, r22, 0x7F
|
|
addi r22, r22, -1
|
|
beq MRExit
|
|
|
|
loc_F2C ; F2C
|
|
rlwimi r17, r22, 4,21,25
|
|
not r22, r22
|
|
insrwi r17, r22, 2,4
|
|
mr r19, r18
|
|
b loc_1008
|
|
|
|
MRSecStrStore ; F40
|
|
andi. r22, r17, 0x7C0
|
|
addis r28, r17, 0x20
|
|
rlwimi r17, r28, 0,6,10
|
|
addi r17, r17, -0x40
|
|
bne loc_1008
|
|
b MRExit
|
|
|
|
########################################################################
|
|
|
|
MRPrimLSWI ; F58
|
|
addi r22, r27, -0x800
|
|
extrwi r22, r22, 5,16
|
|
addis r28, r27, 0x3E0
|
|
rlwimi r17, r28, 22,16,20
|
|
b loc_F80
|
|
|
|
MRPrimLSWX ; F6C
|
|
mfxer r22
|
|
andi. r22, r22, 0x7F
|
|
rlwimi r17, r27, 0,16,20
|
|
addi r22, r22, -1
|
|
beq MRExit
|
|
|
|
loc_F80 ; F80
|
|
andis. r23, r17, 0x1F
|
|
rlwimi r17, r22, 4,21,25
|
|
not r22, r22
|
|
insrwi r17, r22, 2,4
|
|
mr r19, r18
|
|
bne loc_1070
|
|
rlwimi r17, r17, 5,11,15
|
|
b loc_1070
|
|
|
|
MRSecLSWix ; FA0
|
|
andi. r22, r17, 0x7C0
|
|
rlwinm r28, r17, 13,25,29
|
|
bne loc_1044
|
|
rlwinm r22, r17, 9,27,28
|
|
slw r21, r21, r22
|
|
b loc_1044
|
|
|
|
########################################################################
|
|
|
|
MRPrimUnknown ; FB8
|
|
mfxer r22
|
|
andi. r22, r22, 0x7F
|
|
rlwimi r17, r27, 0,16,20
|
|
insrwi r17, r27, 1,3
|
|
addi r22, r22, -1
|
|
beq MRExit
|
|
andis. r23, r17, 0x1F
|
|
rlwimi r17, r22, 4,21,25
|
|
not r22, r22
|
|
insrwi r17, r22, 2,4
|
|
mr r19, r18
|
|
bne loc_10C8
|
|
rlwimi r17, r17, 5,11,15
|
|
b loc_10C8
|
|
|
|
MRSecUnknown ; FF0
|
|
rlwinm. r22, r17, 28,25,29
|
|
rlwinm r28, r17, 13,25,29
|
|
bne loc_109C
|
|
rlwinm r23, r17, 9,27,28
|
|
|
|
loc_1000 ; 1000
|
|
slw r21, r21, r23
|
|
b loc_109C
|
|
|
|
loc_1008 ; 1008
|
|
andi. r23, r17, 0x7C0
|
|
rlwinm r28, r17, 13,25,29
|
|
lwzx r21, r1, r28
|
|
li r22, 8
|
|
insrwi r17, r22, 6,26
|
|
addi r19, r19, 4
|
|
bne MRDoMemAccess
|
|
rlwinm r22, r17, 9,27,28
|
|
srw r21, r21, r22
|
|
extrwi r22, r17, 2,4
|
|
neg r22, r22
|
|
add r19, r19, r22
|
|
addi r22, r22, 4
|
|
insrwi. r17, r22, 5,26
|
|
b MRDoMemAccess
|
|
|
|
loc_1044 ; 1044
|
|
rlwinm r23, r17, 18,25,29
|
|
cmpw cr7, r28, r23
|
|
rlwinm r23, r17, 23,25,29
|
|
cmpw cr6, r28, r23
|
|
beq cr7, loc_1060
|
|
beq cr6, loc_1060
|
|
stwx r21, r1, r28
|
|
|
|
loc_1060 ; 1060
|
|
addis r28, r17, 0x20
|
|
rlwimi r17, r28, 0,6,10
|
|
addi r17, r17, -0x40
|
|
beq MRExit
|
|
|
|
loc_1070 ; 1070
|
|
andi. r23, r17, 0x7C0
|
|
li r22, 9
|
|
insrwi r17, r22, 6,26
|
|
addi r19, r19, 4
|
|
bne MRDoMemAccess
|
|
extrwi r22, r17, 2,4
|
|
neg r22, r22
|
|
add r19, r19, r22
|
|
addi r22, r22, 4
|
|
insrwi. r17, r22, 5,26
|
|
b MRDoMemAccess
|
|
|
|
loc_109C ; 109C
|
|
rlwinm r23, r17, 18,25,29
|
|
cmpw cr7, r28, r23
|
|
rlwinm r23, r17, 23,25,29
|
|
cmpw cr6, r28, r23
|
|
beq cr7, loc_10B8
|
|
beq cr6, loc_10B8
|
|
stwx r21, r1, r28
|
|
|
|
loc_10B8 ; 10B8
|
|
addis r28, r17, 0x20
|
|
rlwimi r17, r28, 0,6,10
|
|
addi r17, r17, -0x40
|
|
beq MRExit
|
|
|
|
loc_10C8 ; 10C8
|
|
not r22, r22
|
|
rlwimi r22, r17, 6,30,31
|
|
li r28, 1
|
|
mfxer r23
|
|
extrwi r23, r23, 8,16
|
|
srwi r20, r21, 24
|
|
cmpw cr7, r20, r23
|
|
add. r22, r22, r28
|
|
beq cr7, loc_112C
|
|
beq loc_112C
|
|
extrwi r20, r21, 8,8
|
|
cmpw cr7, r20, r23
|
|
add. r22, r22, r28
|
|
beq cr7, loc_112C
|
|
beq loc_112C
|
|
extrwi r20, r21, 8,16
|
|
cmpw cr7, r20, r23
|
|
add. r22, r22, r28
|
|
beq cr7, loc_112C
|
|
beq loc_112C
|
|
clrlwi r20, r21, 24
|
|
cmpw cr7, r20, r23
|
|
add. r22, r22, r28
|
|
beq cr7, loc_112C
|
|
bne loc_1070
|
|
|
|
loc_112C ; 112C
|
|
rlwinm. r28, r17, 0,3,3
|
|
mfxer r23
|
|
add r22, r22, r23
|
|
insrwi r23, r22, 7,25
|
|
mtxer r23
|
|
beq MRExit
|
|
mfcr r23
|
|
clrlwi r23, r23, 30
|
|
insrwi r13, r23, 4,0
|
|
b MRExit
|