mirror of
https://github.com/project-slippi/Nintendont.git
synced 2025-10-06 00:22:40 +02:00
-updated and compiled with the latest devkitppc r32, libogc 1.8.20 and devkitarm r49-1
-fixed potential issue in arstartdma (issue #595) -properly fixed mario party 4 crash (issue #437)
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
#define __NINTENDONT_VERSION_H__
|
||||
|
||||
#define NIN_MAJOR_VERSION 5
|
||||
#define NIN_MINOR_VERSION 483
|
||||
#define NIN_MINOR_VERSION 484
|
||||
|
||||
#define NIN_VERSION ((NIN_MAJOR_VERSION << 16) | NIN_MINOR_VERSION)
|
||||
|
||||
|
@@ -1,112 +1,110 @@
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 request
|
||||
# r4 owner don't care
|
||||
# r5 type
|
||||
# r6 prio don't care
|
||||
# r7 source
|
||||
# r8 dest
|
||||
# r9 length
|
||||
# r10 cb
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARQPostRequest:
|
||||
stwu %sp, -0x10(%sp)
|
||||
mflr %r0
|
||||
stw %r0, 8(%sp)
|
||||
|
||||
## fill updated ARQRequest
|
||||
li %r0, 0
|
||||
stw %r0, 0x00(%r3) # struct ARQRequest* next
|
||||
stw %r0, 0x18(%r3) # u32 length
|
||||
|
||||
stw %r4, 0x04(%r3) # u32 owner
|
||||
stw %r5, 0x08(%r3) # u32 type
|
||||
stw %r6, 0x0C(%r3) # u32 priority
|
||||
|
||||
add %r0, %r7, %r9
|
||||
stw %r0, 0x10(%r3) # u32 source
|
||||
|
||||
add %r0, %r8, %r9
|
||||
stw %r0, 0x14(%r3) # u32 dest
|
||||
|
||||
stw %r10, 0x1C(%r3) # ARQCallback callback
|
||||
|
||||
cmpwi %r9, 0
|
||||
beq callback
|
||||
|
||||
cmpwi %r5, 1
|
||||
bne MRAM_TO_ARAM
|
||||
|
||||
ARAM_TO_MRAM:
|
||||
rlwinm %r7, %r7, 0, 8, 26 # 0x00ffffe0
|
||||
oris %r7, %r7, 0x9000
|
||||
|
||||
rlwinm %r8, %r8, 0, 7, 26 # 0x01ffffe0
|
||||
oris %r8, %r8, 0x8000
|
||||
|
||||
b DCInvalidateRange
|
||||
|
||||
MRAM_TO_ARAM:
|
||||
rlwinm %r7, %r7, 0, 7, 26 # 0x01ffffe0
|
||||
oris %r7, %r7, 0x8000
|
||||
|
||||
rlwinm %r8, %r8, 0, 8, 26 # 0x00ffffe0
|
||||
oris %r8, %r8, 0x9000
|
||||
|
||||
DCInvalidateRange:
|
||||
srwi %r4, %r9, 5
|
||||
mtctr %r4
|
||||
mr %r4, %r7
|
||||
|
||||
li %r0, 0
|
||||
DCInvalidateRangeA:
|
||||
dcbi %r0, %r4
|
||||
addi %r4, %r4, 0x20
|
||||
bdnz DCInvalidateRangeA
|
||||
|
||||
memcpy_pre:
|
||||
mr %r4, %r9 # save length
|
||||
|
||||
lwz %r0, 0(%r7)
|
||||
stw %r0, 0(%r8)
|
||||
addic. %r9, %r9, -4
|
||||
|
||||
memcpy:
|
||||
lwzu %r0, 4(%r7)
|
||||
stwu %r0, 4(%r8)
|
||||
addic. %r9, %r9, -4
|
||||
bne memcpy
|
||||
|
||||
#restore offset
|
||||
addi %r8, %r8, 4
|
||||
sub %r8, %r8, %r4
|
||||
|
||||
#DCFlushRange
|
||||
srwi %r4, %r4, 5
|
||||
mtctr %r4
|
||||
mr %r4, %r8
|
||||
|
||||
li %r0, 0
|
||||
DCFlushRangeA:
|
||||
dcbf %r0, %r4
|
||||
addi %r4, %r4, 0x20
|
||||
bdnz DCFlushRangeA
|
||||
|
||||
callback:
|
||||
cmpwi %r10, 0
|
||||
beq end
|
||||
|
||||
mtctr %r10
|
||||
bctrl
|
||||
|
||||
end:
|
||||
|
||||
lwz %r0, 8(%sp)
|
||||
mtlr %r0
|
||||
addi %sp, %sp, 0x10
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 request
|
||||
# r4 owner don't care
|
||||
# r5 type
|
||||
# r6 prio don't care
|
||||
# r7 source
|
||||
# r8 dest
|
||||
# r9 length
|
||||
# r10 cb
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARQPostRequest:
|
||||
stwu %sp, -0x10(%sp)
|
||||
mflr r0
|
||||
stw r0, 8(%sp)
|
||||
|
||||
## fill updated ARQRequest
|
||||
li r0, 0
|
||||
stw r0, 0x00(r3) # struct ARQRequest* next
|
||||
stw r0, 0x18(r3) # u32 length
|
||||
|
||||
stw r4, 0x04(r3) # u32 owner
|
||||
stw r5, 0x08(r3) # u32 type
|
||||
stw r6, 0x0C(r3) # u32 priority
|
||||
|
||||
add r0, r7, r9
|
||||
stw r0, 0x10(r3) # u32 source
|
||||
|
||||
add r0, r8, r9
|
||||
stw r0, 0x14(r3) # u32 dest
|
||||
|
||||
stw r10, 0x1C(r3) # ARQCallback callback
|
||||
|
||||
cmpwi r9, 0
|
||||
beq callback
|
||||
|
||||
cmpwi r5, 1
|
||||
bne MRAM_TO_ARAM
|
||||
|
||||
ARAM_TO_MRAM:
|
||||
rlwinm r7, r7, 0, 8, 26 # 0x00ffffe0
|
||||
oris r7, r7, 0x9000
|
||||
|
||||
rlwinm r8, r8, 0, 7, 26 # 0x01ffffe0
|
||||
oris r8, r8, 0x8000
|
||||
|
||||
b DCInvalidateRange
|
||||
|
||||
MRAM_TO_ARAM:
|
||||
rlwinm r7, r7, 0, 7, 26 # 0x01ffffe0
|
||||
oris r7, r7, 0x8000
|
||||
|
||||
rlwinm r8, r8, 0, 8, 26 # 0x00ffffe0
|
||||
oris r8, r8, 0x9000
|
||||
|
||||
DCInvalidateRange:
|
||||
srwi r4, r9, 5
|
||||
mtctr r4
|
||||
mr r4, r7
|
||||
|
||||
DCInvalidateRangeA:
|
||||
dcbi 0, r4
|
||||
addi r4, r4, 0x20
|
||||
bdnz DCInvalidateRangeA
|
||||
|
||||
memcpy_pre:
|
||||
mr r4, r9 # save length
|
||||
|
||||
lwz r0, 0(r7)
|
||||
stw r0, 0(r8)
|
||||
addic. r9, r9, -4
|
||||
|
||||
memcpy:
|
||||
lwzu r0, 4(r7)
|
||||
stwu r0, 4(r8)
|
||||
addic. r9, r9, -4
|
||||
bne memcpy
|
||||
|
||||
#restore offset
|
||||
addi r8, r8, 4
|
||||
sub r8, r8, r4
|
||||
|
||||
#DCFlushRange
|
||||
srwi r4, r4, 5
|
||||
mtctr r4
|
||||
mr r4, r8
|
||||
|
||||
DCFlushRangeA:
|
||||
dcbf 0, r4
|
||||
addi r4, r4, 0x20
|
||||
bdnz DCFlushRangeA
|
||||
|
||||
callback:
|
||||
cmpwi r10, 0
|
||||
beq end
|
||||
|
||||
mtctr r10
|
||||
bctrl
|
||||
|
||||
end:
|
||||
|
||||
lwz r0, 8(%sp)
|
||||
mtlr r0
|
||||
addi %sp, %sp, 0x10
|
||||
|
||||
blr
|
||||
|
@@ -1,111 +1,111 @@
|
||||
#include <asm.h>
|
||||
|
||||
.set AR_DMA_CNT, 0xCC005028
|
||||
|
||||
.set OSReport, 0xC0001860
|
||||
.set AR_DBG, 0x930031A0
|
||||
|
||||
.set AR_MRAM_TO_ARAM, 0
|
||||
.set AR_ARAM_TO_MRAM, 1
|
||||
|
||||
#in
|
||||
# r3 u32 type
|
||||
# r4 u32 mainmem_addr
|
||||
# r5 u32 aram_addr
|
||||
# r6 u32 length
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARStartDMA:
|
||||
# lis %r7, OSReport@h
|
||||
# ori %r7, %r7, OSReport@l
|
||||
# stw %r4, 4(%r7)
|
||||
# stw %r5, 8(%r7)
|
||||
# stw %r6, 12(%r7)
|
||||
|
||||
# lis %r8, AR_DBG@h
|
||||
# ori %r8, %r8, AR_DBG@l
|
||||
# stw %r8, 0(%r7)
|
||||
#repeatprint:
|
||||
# lwz %r0, 0(%r7)
|
||||
# cmpw %r0, %r8
|
||||
# beq repeatprint
|
||||
|
||||
#adjust ARAM address for safety
|
||||
rlwinm %r5, %r5, 0, 6, 26 # 0x03ffffe0
|
||||
oris %r5, %r5, 0x9000
|
||||
|
||||
#add length onto ARAM address to see max
|
||||
add %r0, %r5, %r6
|
||||
#ARAM Max Address to ensure no overwriting
|
||||
lis %r7, 0x9100
|
||||
cmplw %r0, %r7
|
||||
#Fine as is, continue
|
||||
ble checkLength
|
||||
#Use in-bounds area as new length
|
||||
subf %r6, %r5, %r7
|
||||
checkLength:
|
||||
#make sure there is any input length
|
||||
cmpwi %r6, 0
|
||||
ble FakeTransfer
|
||||
|
||||
#adjust MEM1 address for safety
|
||||
rlwinm %r4, %r4, 0, 7, 26 # 0x01ffffe0
|
||||
oris %r4, %r4, 0x8000
|
||||
|
||||
cmpwi %r3, AR_MRAM_TO_ARAM
|
||||
beq memcpy32prep #we dont need to invalidate main mem
|
||||
|
||||
ARAM_TO_MRAM:
|
||||
mr %r0, %r4
|
||||
mr %r4, %r5
|
||||
mr %r5, %r0
|
||||
|
||||
memcpy32prep:
|
||||
li %r7, 0
|
||||
cmplwi %r6, 3
|
||||
ble memcpy16prep
|
||||
srwi %r0, %r6, 2 #32bit
|
||||
mtctr %r0
|
||||
memcpy32:
|
||||
lwzx %r0, %r4, %r7
|
||||
stwx %r0, %r5, %r7
|
||||
addi %r7, %r7, 4
|
||||
bdnz memcpy32
|
||||
|
||||
memcpy16prep:
|
||||
subf %r0, %r7, %r6
|
||||
cmpwi %r0, 1
|
||||
ble memcpy8prep
|
||||
memcpy16:
|
||||
lhzx %r0, %r4, %r7
|
||||
sthx %r0, %r5, %r7
|
||||
addi %r7, %r7, 2
|
||||
|
||||
memcpy8prep:
|
||||
subf %r0, %r7, %r6
|
||||
cmpwi %r0, 0
|
||||
ble DCStoreRangePrep
|
||||
memcpy8:
|
||||
lbzx %r0, %r4, %r7
|
||||
stbx %r0, %r5, %r7
|
||||
|
||||
DCStoreRangePrep:
|
||||
addi %r0, %r6, 0x1F
|
||||
srwi %r0, %r0, 5
|
||||
mtctr %r0
|
||||
|
||||
li %r0, 0
|
||||
DCStoreRange:
|
||||
dcbst %r0, %r5
|
||||
addi %r5, %r5, 0x20
|
||||
bdnz DCStoreRange
|
||||
sync
|
||||
|
||||
li %r6, 0
|
||||
FakeTransfer:
|
||||
lis %r3, AR_DMA_CNT@h
|
||||
stw %r6, AR_DMA_CNT@l(%r3)
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
.set AR_DMA_CNT, 0xCC005028
|
||||
|
||||
.set OSReport, 0xC0001860
|
||||
.set AR_DBG, 0x930031A0
|
||||
|
||||
.set AR_MRAM_TO_ARAM, 0
|
||||
.set AR_ARAM_TO_MRAM, 1
|
||||
|
||||
#in
|
||||
# r3 u32 type
|
||||
# r4 u32 mainmem_addr
|
||||
# r5 u32 aram_addr
|
||||
# r6 u32 length
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARStartDMA:
|
||||
# lis r7, OSReport@h
|
||||
# ori r7, r7, OSReport@l
|
||||
# stw r4, 4(r7)
|
||||
# stw r5, 8(r7)
|
||||
# stw r6, 12(r7)
|
||||
|
||||
# lis r8, AR_DBG@h
|
||||
# ori r8, r8, AR_DBG@l
|
||||
# stw r8, 0(r7)
|
||||
#repeatprint:
|
||||
# lwz r0, 0(r7)
|
||||
# cmpw r0, r8
|
||||
# beq repeatprint
|
||||
|
||||
#adjust ARAM address for safety
|
||||
rlwinm r5, r5, 0, 6, 26 # 0x03ffffe0
|
||||
oris r5, r5, 0x9000
|
||||
|
||||
#add length onto ARAM address to see max
|
||||
add r0, r5, r6
|
||||
#ARAM Max Address to ensure no overwriting
|
||||
lis r7, 0x9100
|
||||
cmplw r0, r7
|
||||
#Fine as is, continue
|
||||
ble checkLength
|
||||
#Use in-bounds area as new length
|
||||
subf r6, r5, r7
|
||||
checkLength:
|
||||
#make sure there is any input length
|
||||
cmpwi r6, 0
|
||||
ble EarlyIRQ
|
||||
|
||||
#adjust MEM1 address for safety
|
||||
rlwinm r4, r4, 0, 7, 26 # 0x01ffffe0
|
||||
oris r4, r4, 0x8000
|
||||
|
||||
cmpwi r3, AR_MRAM_TO_ARAM
|
||||
beq memcpy32prep #we dont need to invalidate main mem
|
||||
|
||||
ARAM_TO_MRAM:
|
||||
mr r0, r4
|
||||
mr r4, r5
|
||||
mr r5, r0
|
||||
|
||||
memcpy32prep:
|
||||
li r7, 0
|
||||
cmplwi r6, 3
|
||||
ble memcpy16prep
|
||||
srwi r0, r6, 2 #32bit
|
||||
mtctr r0
|
||||
memcpy32:
|
||||
lwzx r0, r4, r7
|
||||
stwx r0, r5, r7
|
||||
addi r7, r7, 4
|
||||
bdnz memcpy32
|
||||
|
||||
memcpy16prep:
|
||||
subf r0, r7, r6
|
||||
cmpwi r0, 1
|
||||
ble memcpy8prep
|
||||
memcpy16:
|
||||
lhzx r0, r4, r7
|
||||
sthx r0, r5, r7
|
||||
addi r7, r7, 2
|
||||
|
||||
memcpy8prep:
|
||||
subf r0, r7, r6
|
||||
cmpwi r0, 0
|
||||
ble DCStoreRangePrep
|
||||
memcpy8:
|
||||
lbzx r0, r4, r7
|
||||
stbx r0, r5, r7
|
||||
|
||||
DCStoreRangePrep:
|
||||
addi r0, r6, 0x1F
|
||||
srwi r0, r0, 5
|
||||
mtctr r0
|
||||
|
||||
DCStoreRange:
|
||||
dcbst 0, r5
|
||||
addi r5, r5, 0x20
|
||||
bdnz DCStoreRange
|
||||
sync
|
||||
|
||||
EarlyIRQ:
|
||||
li r6, 0
|
||||
FakeTransfer:
|
||||
lis r3, AR_DMA_CNT@h
|
||||
stw r6, AR_DMA_CNT@l(r3)
|
||||
|
||||
blr
|
||||
|
@@ -1,47 +1,47 @@
|
||||
#include <asm.h>
|
||||
|
||||
.set AR_DMA_SAVE, 0x931C0040
|
||||
|
||||
.set OSReport, 0xC0001860
|
||||
.set AR_DBG, 0x930031A0
|
||||
|
||||
#in
|
||||
# r29 u32 type
|
||||
# r28 u32 mainmem_addr
|
||||
# r30 u32 aram_addr
|
||||
# r31 u32 length
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARStartDMA:
|
||||
# stwu %sp, -0x20(%sp)
|
||||
# stw %r7, 0xC(%sp)
|
||||
# stw %r8, 0x10(%sp)
|
||||
|
||||
# lis %r7, OSReport@h
|
||||
# ori %r7, %r7, OSReport@l
|
||||
# stw %r28, 4(%r7)
|
||||
# stw %r30, 8(%r7)
|
||||
# stw %r31, 12(%r7)
|
||||
|
||||
# lis %r8, AR_DBG@h
|
||||
# ori %r8, %r8, AR_DBG@l
|
||||
# stw %r8, 0(%r7)
|
||||
#repeatprint:
|
||||
# lwz %r6, 0(%r7)
|
||||
# cmpw %r6, %r8
|
||||
# beq repeatprint
|
||||
|
||||
# lwz %r7, 0xC(%sp)
|
||||
# lwz %r8, 0x10(%sp)
|
||||
# addi %sp, %sp, 0x20
|
||||
|
||||
lis %r6, AR_DMA_SAVE@h
|
||||
stwu %r29, AR_DMA_SAVE@l(%r6)
|
||||
stwu %r28, 4(%r6)
|
||||
stwu %r30, 4(%r6)
|
||||
stw %r31, 4(%r6)
|
||||
|
||||
lis %r6, 0xCC00
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
.set AR_DMA_SAVE, 0x931C0040
|
||||
|
||||
.set OSReport, 0xC0001860
|
||||
.set AR_DBG, 0x930031A0
|
||||
|
||||
#in
|
||||
# r29 u32 type
|
||||
# r28 u32 mainmem_addr
|
||||
# r30 u32 aram_addr
|
||||
# r31 u32 length
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARStartDMA:
|
||||
# stwu %sp, -0x20(%sp)
|
||||
# stw r7, 0xC(%sp)
|
||||
# stw r8, 0x10(%sp)
|
||||
|
||||
# lis r7, OSReport@h
|
||||
# ori r7, r7, OSReport@l
|
||||
# stw r28, 4(r7)
|
||||
# stw r30, 8(r7)
|
||||
# stw r31, 12(r7)
|
||||
|
||||
# lis r8, AR_DBG@h
|
||||
# ori r8, r8, AR_DBG@l
|
||||
# stw r8, 0(r7)
|
||||
#repeatprint:
|
||||
# lwz r6, 0(r7)
|
||||
# cmpw r6, r8
|
||||
# beq repeatprint
|
||||
|
||||
# lwz r7, 0xC(%sp)
|
||||
# lwz r8, 0x10(%sp)
|
||||
# addi %sp, %sp, 0x20
|
||||
|
||||
lis r6, AR_DMA_SAVE@h
|
||||
stwu r29, AR_DMA_SAVE@l(r6)
|
||||
stwu r28, 4(r6)
|
||||
stwu r30, 4(r6)
|
||||
stw r31, 4(r6)
|
||||
|
||||
lis r6, 0xCC00
|
||||
blr
|
||||
|
@@ -1,107 +1,106 @@
|
||||
#include <asm.h>
|
||||
|
||||
.set AR_DMA_CNT, 0xCC005028
|
||||
|
||||
.set AR_MRAM_TO_ARAM, 0
|
||||
.set AR_ARAM_TO_MRAM, 1
|
||||
|
||||
#in
|
||||
# r3 u32 type
|
||||
# r4 u32 mainmem_addr
|
||||
# r5 u32 aram_addr
|
||||
# r6 u32 length
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARStartDMA:
|
||||
#adjust ARAM address for safety
|
||||
rlwinm %r5, %r5, 0, 6, 26 # 0x03ffffe0
|
||||
oris %r5, %r5, 0x9000
|
||||
|
||||
#add length onto ARAM address to see max
|
||||
add %r0, %r5, %r6
|
||||
#ARAM Max Address to ensure no overwriting
|
||||
lis %r7, 0x9100
|
||||
cmplw %r0, %r7
|
||||
#Fine as is, continue
|
||||
ble checkLength
|
||||
#Use in-bounds area as new length
|
||||
subf %r6, %r5, %r7
|
||||
checkLength:
|
||||
#make sure there is any input length
|
||||
cmpwi %r6, 0
|
||||
ble FakeTransfer
|
||||
|
||||
#adjust MEM1 address for safety
|
||||
rlwinm %r4, %r4, 0, 7, 26 # 0x01ffffe0
|
||||
oris %r4, %r4, 0x8000
|
||||
|
||||
cmpwi %r3, AR_MRAM_TO_ARAM
|
||||
beq memcpy32prep #we dont need to invalidate main mem
|
||||
|
||||
ARAM_TO_MRAM:
|
||||
mr %r0, %r4
|
||||
mr %r4, %r5
|
||||
mr %r5, %r0
|
||||
|
||||
memcpy32prep:
|
||||
li %r7, 0
|
||||
cmplwi %r6, 3
|
||||
ble memcpy16prep
|
||||
srwi %r0, %r6, 2 #32bit
|
||||
mtctr %r0
|
||||
memcpy32:
|
||||
lwzx %r0, %r4, %r7
|
||||
stwx %r0, %r5, %r7
|
||||
addi %r7, %r7, 4
|
||||
bdnz memcpy32
|
||||
|
||||
memcpy16prep:
|
||||
subf %r0, %r7, %r6
|
||||
cmpwi %r0, 1
|
||||
ble memcpy8prep
|
||||
memcpy16:
|
||||
lhzx %r0, %r4, %r7
|
||||
sthx %r0, %r5, %r7
|
||||
addi %r7, %r7, 2
|
||||
|
||||
memcpy8prep:
|
||||
subf %r0, %r7, %r6
|
||||
cmpwi %r0, 0
|
||||
ble DCStoreRangePrep
|
||||
memcpy8:
|
||||
lbzx %r0, %r4, %r7
|
||||
stbx %r0, %r5, %r7
|
||||
|
||||
DCStoreRangePrep:
|
||||
addi %r0, %r6, 0x1F
|
||||
srwi %r0, %r0, 5
|
||||
mtctr %r0
|
||||
|
||||
li %r0, 0
|
||||
DCStoreRange:
|
||||
dcbst %r0, %r5
|
||||
addi %r5, %r5, 0x20
|
||||
bdnz DCStoreRange
|
||||
sync
|
||||
|
||||
#Early Exception Numbers from:
|
||||
#https://code.google.com/p/dolphin-emu/source/browse/Source/Core/Core/HW/DSP.cpp#702
|
||||
|
||||
#ARAM Transfer Fake
|
||||
cmpwi %r6, 0x20
|
||||
bgt LateIRQ
|
||||
|
||||
EarlyIRQ:
|
||||
li %r6, 0
|
||||
b FakeTransfer
|
||||
|
||||
LateIRQ:
|
||||
srwi %r6, %r6, 5 #r6 / 0x20
|
||||
|
||||
FakeTransfer:
|
||||
lis %r3, AR_DMA_CNT@h
|
||||
stw %r6, AR_DMA_CNT@l(%r3)
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
.set AR_DMA_CNT, 0xCC005028
|
||||
|
||||
.set AR_MRAM_TO_ARAM, 0
|
||||
.set AR_ARAM_TO_MRAM, 1
|
||||
|
||||
#in
|
||||
# r3 u32 type
|
||||
# r4 u32 mainmem_addr
|
||||
# r5 u32 aram_addr
|
||||
# r6 u32 length
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARStartDMA:
|
||||
#adjust ARAM address for safety
|
||||
rlwinm r5, r5, 0, 6, 26 # 0x03ffffe0
|
||||
oris r5, r5, 0x9000
|
||||
|
||||
#add length onto ARAM address to see max
|
||||
add r0, r5, r6
|
||||
#ARAM Max Address to ensure no overwriting
|
||||
lis r7, 0x9100
|
||||
cmplw r0, r7
|
||||
#Fine as is, continue
|
||||
ble checkLength
|
||||
#Use in-bounds area as new length
|
||||
subf r6, r5, r7
|
||||
checkLength:
|
||||
#make sure there is any input length
|
||||
cmpwi r6, 0
|
||||
ble EarlyIRQ
|
||||
|
||||
#adjust MEM1 address for safety
|
||||
rlwinm r4, r4, 0, 7, 26 # 0x01ffffe0
|
||||
oris r4, r4, 0x8000
|
||||
|
||||
cmpwi r3, AR_MRAM_TO_ARAM
|
||||
beq memcpy32prep #we dont need to invalidate main mem
|
||||
|
||||
ARAM_TO_MRAM:
|
||||
mr r0, r4
|
||||
mr r4, r5
|
||||
mr r5, r0
|
||||
|
||||
memcpy32prep:
|
||||
li r7, 0
|
||||
cmplwi r6, 3
|
||||
ble memcpy16prep
|
||||
srwi r0, r6, 2 #32bit
|
||||
mtctr r0
|
||||
memcpy32:
|
||||
lwzx r0, r4, r7
|
||||
stwx r0, r5, r7
|
||||
addi r7, r7, 4
|
||||
bdnz memcpy32
|
||||
|
||||
memcpy16prep:
|
||||
subf r0, r7, r6
|
||||
cmpwi r0, 1
|
||||
ble memcpy8prep
|
||||
memcpy16:
|
||||
lhzx r0, r4, r7
|
||||
sthx r0, r5, r7
|
||||
addi r7, r7, 2
|
||||
|
||||
memcpy8prep:
|
||||
subf r0, r7, r6
|
||||
cmpwi r0, 0
|
||||
ble DCStoreRangePrep
|
||||
memcpy8:
|
||||
lbzx r0, r4, r7
|
||||
stbx r0, r5, r7
|
||||
|
||||
DCStoreRangePrep:
|
||||
addi r0, r6, 0x1F
|
||||
srwi r0, r0, 5
|
||||
mtctr r0
|
||||
|
||||
DCStoreRange:
|
||||
dcbst 0, r5
|
||||
addi r5, r5, 0x20
|
||||
bdnz DCStoreRange
|
||||
sync
|
||||
|
||||
#Early Exception Numbers from:
|
||||
#https://code.google.com/p/dolphin-emu/source/browse/Source/Core/Core/HW/DSP.cpp#702
|
||||
|
||||
#ARAM Transfer Fake
|
||||
cmpwi r6, 0x20
|
||||
bgt LateIRQ
|
||||
|
||||
EarlyIRQ:
|
||||
li r6, 0
|
||||
b FakeTransfer
|
||||
|
||||
LateIRQ:
|
||||
srwi r6, r6, 5 #r6 / 0x20
|
||||
|
||||
FakeTransfer:
|
||||
lis r3, AR_DMA_CNT@h
|
||||
stw r6, AR_DMA_CNT@l(r3)
|
||||
|
||||
blr
|
||||
|
@@ -1,104 +1,103 @@
|
||||
#include <asm.h>
|
||||
|
||||
.set AR_DMA_CNT, 0xCC005028
|
||||
|
||||
.set AR_MRAM_TO_ARAM, 0
|
||||
.set AR_ARAM_TO_MRAM, 1
|
||||
|
||||
#in
|
||||
# r3 u32 type
|
||||
# r4 u32 mainmem_addr
|
||||
# r5 u32 aram_addr
|
||||
# r6 u32 length
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARStartDMA:
|
||||
#adjust ARAM address for safety
|
||||
rlwinm %r5, %r5, 0, 6, 26 # 0x03ffffe0
|
||||
oris %r5, %r5, 0x9000
|
||||
|
||||
#add length onto ARAM address to see max
|
||||
add %r0, %r5, %r6
|
||||
#ARAM Max Address to ensure no overwriting
|
||||
lis %r7, 0x9100
|
||||
cmplw %r0, %r7
|
||||
#Fine as is, continue
|
||||
ble checkLength
|
||||
#Use in-bounds area as new length
|
||||
subf %r6, %r5, %r7
|
||||
checkLength:
|
||||
#make sure there is any input length
|
||||
cmpwi %r6, 0
|
||||
ble FakeTransfer
|
||||
|
||||
#adjust MEM1 address for safety
|
||||
rlwinm %r4, %r4, 0, 7, 26 # 0x01ffffe0
|
||||
oris %r4, %r4, 0x8000
|
||||
|
||||
cmpwi %r3, AR_MRAM_TO_ARAM
|
||||
beq memcpy32prep
|
||||
|
||||
ARAM_TO_MRAM:
|
||||
mr %r0, %r4
|
||||
mr %r4, %r5
|
||||
mr %r5, %r0
|
||||
|
||||
memcpy32prep:
|
||||
li %r7, 0
|
||||
cmplwi %r6, 3
|
||||
ble memcpy16prep
|
||||
srwi %r0, %r6, 2 #32bit
|
||||
mtctr %r0
|
||||
memcpy32:
|
||||
lwzx %r0, %r4, %r7
|
||||
stwx %r0, %r5, %r7
|
||||
addi %r7, %r7, 4
|
||||
bdnz memcpy32
|
||||
|
||||
memcpy16prep:
|
||||
subf %r0, %r7, %r6
|
||||
cmpwi %r0, 1
|
||||
ble memcpy8prep
|
||||
memcpy16:
|
||||
lhzx %r0, %r4, %r7
|
||||
sthx %r0, %r5, %r7
|
||||
addi %r7, %r7, 2
|
||||
|
||||
memcpy8prep:
|
||||
subf %r0, %r7, %r6
|
||||
cmpwi %r0, 0
|
||||
ble DCStoreRangePrep
|
||||
memcpy8:
|
||||
lbzx %r0, %r4, %r7
|
||||
stbx %r0, %r5, %r7
|
||||
|
||||
DCStoreRangePrep:
|
||||
addi %r0, %r6, 0x1F
|
||||
srwi %r0, %r0, 5
|
||||
mtctr %r0
|
||||
|
||||
li %r0, 0
|
||||
DCStoreRange:
|
||||
dcbst %r0, %r5
|
||||
addi %r5, %r5, 0x20
|
||||
bdnz DCStoreRange
|
||||
sync
|
||||
|
||||
#ARAM Transfer Fake
|
||||
cmplwi %r6, 0x1000
|
||||
bne LateIRQ
|
||||
|
||||
EarlyIRQ:
|
||||
li %r6, 0
|
||||
b FakeTransfer
|
||||
|
||||
LateIRQ:
|
||||
srwi %r6, %r6, 5 #r6 / 0x20
|
||||
|
||||
FakeTransfer:
|
||||
lis %r3, AR_DMA_CNT@h
|
||||
stw %r6, AR_DMA_CNT@l(%r3)
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
.set AR_DMA_CNT, 0xCC005028
|
||||
|
||||
.set AR_MRAM_TO_ARAM, 0
|
||||
.set AR_ARAM_TO_MRAM, 1
|
||||
|
||||
#in
|
||||
# r3 u32 type
|
||||
# r4 u32 mainmem_addr
|
||||
# r5 u32 aram_addr
|
||||
# r6 u32 length
|
||||
|
||||
#out
|
||||
# none
|
||||
|
||||
ARStartDMA:
|
||||
#adjust ARAM address for safety
|
||||
rlwinm r5, r5, 0, 6, 26 # 0x03ffffe0
|
||||
oris r5, r5, 0x9000
|
||||
|
||||
#add length onto ARAM address to see max
|
||||
add r0, r5, r6
|
||||
#ARAM Max Address to ensure no overwriting
|
||||
lis r7, 0x9100
|
||||
cmplw r0, r7
|
||||
#Fine as is, continue
|
||||
ble checkLength
|
||||
#Use in-bounds area as new length
|
||||
subf r6, r5, r7
|
||||
checkLength:
|
||||
#make sure there is any input length
|
||||
cmpwi r6, 0
|
||||
ble EarlyIRQ
|
||||
|
||||
#adjust MEM1 address for safety
|
||||
rlwinm r4, r4, 0, 7, 26 # 0x01ffffe0
|
||||
oris r4, r4, 0x8000
|
||||
|
||||
cmpwi r3, AR_MRAM_TO_ARAM
|
||||
beq memcpy32prep
|
||||
|
||||
ARAM_TO_MRAM:
|
||||
mr r0, r4
|
||||
mr r4, r5
|
||||
mr r5, r0
|
||||
|
||||
memcpy32prep:
|
||||
li r7, 0
|
||||
cmplwi r6, 3
|
||||
ble memcpy16prep
|
||||
srwi r0, r6, 2 #32bit
|
||||
mtctr r0
|
||||
memcpy32:
|
||||
lwzx r0, r4, r7
|
||||
stwx r0, r5, r7
|
||||
addi r7, r7, 4
|
||||
bdnz memcpy32
|
||||
|
||||
memcpy16prep:
|
||||
subf r0, r7, r6
|
||||
cmpwi r0, 1
|
||||
ble memcpy8prep
|
||||
memcpy16:
|
||||
lhzx r0, r4, r7
|
||||
sthx r0, r5, r7
|
||||
addi r7, r7, 2
|
||||
|
||||
memcpy8prep:
|
||||
subf r0, r7, r6
|
||||
cmpwi r0, 0
|
||||
ble DCStoreRangePrep
|
||||
memcpy8:
|
||||
lbzx r0, r4, r7
|
||||
stbx r0, r5, r7
|
||||
|
||||
DCStoreRangePrep:
|
||||
addi r0, r6, 0x1F
|
||||
srwi r0, r0, 5
|
||||
mtctr r0
|
||||
|
||||
DCStoreRange:
|
||||
dcbst 0, r5
|
||||
addi r5, r5, 0x20
|
||||
bdnz DCStoreRange
|
||||
sync
|
||||
|
||||
#ARAM Transfer Fake
|
||||
cmplwi r6, 0x1000
|
||||
bne LateIRQ
|
||||
|
||||
EarlyIRQ:
|
||||
li r6, 0
|
||||
b FakeTransfer
|
||||
|
||||
LateIRQ:
|
||||
srwi r6, r6, 5 #r6 / 0x20
|
||||
|
||||
FakeTransfer:
|
||||
lis r3, AR_DMA_CNT@h
|
||||
stw r6, AR_DMA_CNT@l(r3)
|
||||
|
||||
blr
|
||||
|
@@ -20,27 +20,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
CalcGXWidescreen:
|
||||
stwu %sp, -0x20(%sp)
|
||||
stw %r30, 0x4(%sp)
|
||||
stw %r4, 0x8(%sp)
|
||||
stw r30, 0x4(%sp)
|
||||
stw r4, 0x8(%sp)
|
||||
stfd %f31, 0xC(%sp)
|
||||
mflr %r30
|
||||
lfs %f0, 4(%r31)
|
||||
lfs %f31, 0x18(%r31)
|
||||
mflr r30
|
||||
lfs %f0, 4(r31)
|
||||
lfs %f31, 0x18(r31)
|
||||
fdivs %f0, %f31, %f0
|
||||
bl GetFloatBase
|
||||
.long 0x3faaaaab #4/3
|
||||
GetFloatBase:
|
||||
mflr %r4
|
||||
lfs %f31, 0(%r4)
|
||||
mflr r4
|
||||
lfs %f31, 0(r4)
|
||||
MulAspect:
|
||||
fmuls %f0, %f31, %f0
|
||||
end:
|
||||
lfs %f31, 0x18(%r31)
|
||||
lfs %f31, 0x18(r31)
|
||||
fdivs %f0, %f31, %f0
|
||||
stfs %f0, 4(%r31)
|
||||
mtlr %r30
|
||||
lwz %r30, 0x4(%sp)
|
||||
lwz %r4, 0x8(%sp)
|
||||
stfs %f0, 4(r31)
|
||||
mtlr r30
|
||||
lwz r30, 0x4(%sp)
|
||||
lwz r4, 0x8(%sp)
|
||||
lfd %f31, 0xC(%sp)
|
||||
addi %sp, %sp, 0x20
|
||||
nop #original instruction
|
||||
|
@@ -21,21 +21,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
CalcWidescreen:
|
||||
nop #original instruction
|
||||
stwu %sp, -0x20(%sp)
|
||||
stw %r30, 0x4(%sp)
|
||||
stw %r31, 0x8(%sp)
|
||||
stw r30, 0x4(%sp)
|
||||
stw r31, 0x8(%sp)
|
||||
stfd %f31, 0xC(%sp)
|
||||
mflr %r30
|
||||
mflr r30
|
||||
bl GetFloatBase
|
||||
.long 0x3faaaaab #4/3
|
||||
GetFloatBase:
|
||||
mflr %r31
|
||||
lfs %f31, 0(%r31)
|
||||
mflr r31
|
||||
lfs %f31, 0(r31)
|
||||
MulAspect:
|
||||
fmuls %f3, %f31, %f3 #gets replaced with float we want
|
||||
end:
|
||||
mtlr %r30
|
||||
lwz %r30, 0x4(%sp)
|
||||
lwz %r31, 0x8(%sp)
|
||||
mtlr r30
|
||||
lwz r30, 0x4(%sp)
|
||||
lwz r31, 0x8(%sp)
|
||||
lfd %f31, 0xC(%sp)
|
||||
addi %sp, %sp, 0x20
|
||||
nop #b original code
|
||||
|
@@ -21,21 +21,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
CalcWidescreen:
|
||||
nop #original instruction
|
||||
stwu %sp, -0x20(%sp)
|
||||
stw %r30, 0x4(%sp)
|
||||
stw %r31, 0x8(%sp)
|
||||
stw r30, 0x4(%sp)
|
||||
stw r31, 0x8(%sp)
|
||||
stfd %f31, 0xC(%sp)
|
||||
mflr %r30
|
||||
mflr r30
|
||||
bl GetFloatBase
|
||||
.long 0x3f400000 #3/4
|
||||
GetFloatBase:
|
||||
mflr %r31
|
||||
lfs %f31, 0(%r31)
|
||||
mflr r31
|
||||
lfs %f31, 0(r31)
|
||||
MulAspect:
|
||||
fmuls %f3, %f31, %f3 #gets replaced with float we want
|
||||
end:
|
||||
mtlr %r30
|
||||
lwz %r30, 0x4(%sp)
|
||||
lwz %r31, 0x8(%sp)
|
||||
mtlr r30
|
||||
lwz r30, 0x4(%sp)
|
||||
lwz r31, 0x8(%sp)
|
||||
lfd %f31, 0xC(%sp)
|
||||
addi %sp, %sp, 0x20
|
||||
nop #b original code
|
||||
|
@@ -22,19 +22,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#r3 gets overwritten later
|
||||
|
||||
CheckTestMenu:
|
||||
lis %r3, IN_TESTMENU@h
|
||||
cmpwi %r0, 0
|
||||
lis r3, IN_TESTMENU@h
|
||||
cmpwi r0, 0
|
||||
bne DoCheck
|
||||
b end #No Test Menu, just exit
|
||||
DoCheck: #Test Menu requested, make sure it wasnt loaded
|
||||
lwz %r0, IN_TESTMENU@l(%r3)
|
||||
cmpwi %r0, 0
|
||||
lwz r0, IN_TESTMENU@l(r3)
|
||||
cmpwi r0, 0
|
||||
bne Disallow
|
||||
Allow: #Not loaded previously, enter test menu
|
||||
li %r0, 1
|
||||
li r0, 1
|
||||
b end
|
||||
Disallow: #Test Menu previously loaded so disallow
|
||||
li %r0, 0
|
||||
li r0, 0
|
||||
end: #Always save current status for next time
|
||||
stw %r0, IN_TESTMENU@l(%r3)
|
||||
stw r0, IN_TESTMENU@l(r3)
|
||||
blr
|
||||
|
@@ -23,21 +23,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
CheckTestMenuGP:
|
||||
#original instruction
|
||||
clrlwi %r0, %r26, 24
|
||||
clrlwi r0, r26, 24
|
||||
|
||||
lis %r26, IN_TESTMENU@h
|
||||
cmpwi %r0, 0
|
||||
lis r26, IN_TESTMENU@h
|
||||
cmpwi r0, 0
|
||||
bne DoCheck
|
||||
b end #No Test Menu, just exit
|
||||
DoCheck: #Test Menu requested, make sure it wasnt loaded
|
||||
lwz %r0, IN_TESTMENU@l(%r26)
|
||||
cmpwi %r0, 0
|
||||
lwz r0, IN_TESTMENU@l(r26)
|
||||
cmpwi r0, 0
|
||||
bne Disallow
|
||||
Allow: #Not loaded previously, enter test menu
|
||||
li %r0, 1
|
||||
li r0, 1
|
||||
b end
|
||||
Disallow: #Test Menu previously loaded so disallow
|
||||
li %r0, 0
|
||||
li r0, 0
|
||||
end: #Always save current status for next time
|
||||
stw %r0, IN_TESTMENU@l(%r26)
|
||||
stw r0, IN_TESTMENU@l(r26)
|
||||
blr
|
||||
|
@@ -23,21 +23,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
CheckTestMenu:
|
||||
#original instruction
|
||||
srwi %r0, %r0, 5
|
||||
srwi r0, r0, 5
|
||||
|
||||
lis %r6, IN_TESTMENU@h
|
||||
cmpwi %r0, 0
|
||||
lis r6, IN_TESTMENU@h
|
||||
cmpwi r0, 0
|
||||
bne DoCheck
|
||||
b end #No Test Menu, just exit
|
||||
DoCheck: #Test Menu requested, make sure it wasnt loaded
|
||||
lwz %r0, IN_TESTMENU@l(%r6)
|
||||
cmpwi %r0, 0
|
||||
lwz r0, IN_TESTMENU@l(r6)
|
||||
cmpwi r0, 0
|
||||
bne Disallow
|
||||
Allow: #Not loaded previously, enter test menu
|
||||
li %r0, 1
|
||||
li r0, 1
|
||||
b end
|
||||
Disallow: #Test Menu previously loaded so disallow
|
||||
li %r0, 0
|
||||
li r0, 0
|
||||
end: #Always save current status for next time
|
||||
stw %r0, IN_TESTMENU@l(%r6)
|
||||
stw r0, IN_TESTMENU@l(r6)
|
||||
blr
|
||||
|
@@ -23,21 +23,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
CheckTestMenu:
|
||||
#original instruction
|
||||
extrwi %r0, %r0, 8,19
|
||||
extrwi r0, r0, 8,19
|
||||
|
||||
lis %r6, IN_TESTMENU@h
|
||||
cmpwi %r0, 0
|
||||
lis r6, IN_TESTMENU@h
|
||||
cmpwi r0, 0
|
||||
bne DoCheck
|
||||
b end #No Test Menu, just exit
|
||||
DoCheck: #Test Menu requested, make sure it wasnt loaded
|
||||
lwz %r0, IN_TESTMENU@l(%r6)
|
||||
cmpwi %r0, 0
|
||||
lwz r0, IN_TESTMENU@l(r6)
|
||||
cmpwi r0, 0
|
||||
bne Disallow
|
||||
Allow: #Not loaded previously, enter test menu
|
||||
li %r0, 1
|
||||
li r0, 1
|
||||
b end
|
||||
Disallow: #Test Menu previously loaded so disallow
|
||||
li %r0, 0
|
||||
li r0, 0
|
||||
end: #Always save current status for next time
|
||||
stw %r0, IN_TESTMENU@l(%r6)
|
||||
stw r0, IN_TESTMENU@l(r6)
|
||||
blr
|
||||
|
@@ -20,27 +20,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.include "constants.inc"
|
||||
|
||||
DVDLowAudioBufferConfig:
|
||||
mtctr %r5
|
||||
lis %r5, REAL_STREAMING@h
|
||||
cmpwi %r3, 0
|
||||
mtctr r5
|
||||
lis r5, REAL_STREAMING@h
|
||||
cmpwi r3, 0
|
||||
beq StopStream
|
||||
|
||||
StartStream:
|
||||
lhz %r3, REAL_STREAMING@l(%r5)
|
||||
cmpwi %r3, 0x40
|
||||
lhz r3, REAL_STREAMING@l(r5)
|
||||
cmpwi r3, 0x40
|
||||
bne StartCB #dont start when not paused before
|
||||
|
||||
li %r3, 0x20
|
||||
li r3, 0x20
|
||||
b SaveValue
|
||||
|
||||
StopStream:
|
||||
lhz %r3, REAL_STREAMING@l(%r5)
|
||||
cmpwi %r3, 0x20
|
||||
lhz r3, REAL_STREAMING@l(r5)
|
||||
cmpwi r3, 0x20
|
||||
bne StartCB #dont pause when not even streaming
|
||||
|
||||
li %r3, 0x40
|
||||
li r3, 0x40
|
||||
SaveValue:
|
||||
sth %r3, REAL_STREAMING@l(%r5)
|
||||
sth r3, REAL_STREAMING@l(r5)
|
||||
StartCB:
|
||||
li %r3, 1 #for the cb that everything resulted ok
|
||||
li r3, 1 #for the cb that everything resulted ok
|
||||
bctr #will boot cb then return to original function, saves quite some code
|
||||
|
@@ -20,38 +20,38 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.include "constants.inc"
|
||||
|
||||
DVDLowAudioStream:
|
||||
mtctr %r6
|
||||
lis %r6, 1
|
||||
cmpw %r3, %r6
|
||||
lis %r6, STREAM_BASE@h
|
||||
mtctr r6
|
||||
lis r6, 1
|
||||
cmpw r3, r6
|
||||
lis r6, STREAM_BASE@h
|
||||
bne SetupStream
|
||||
|
||||
StopStream:
|
||||
li %r3, 0
|
||||
sth %r3, REAL_STREAMING@l(%r6)
|
||||
stw %r3, FAKE_STREAMING@l(%r6)
|
||||
stw %r3, STREAM_LENGTH@l(%r6)
|
||||
stw %r3, STREAM_START@l(%r6)
|
||||
stw %r3, STREAM_CURRENT@l(%r6)
|
||||
stw %r3, REALSTREAM_END@l(%r6)
|
||||
li r3, 0
|
||||
sth r3, REAL_STREAMING@l(r6)
|
||||
stw r3, FAKE_STREAMING@l(r6)
|
||||
stw r3, STREAM_LENGTH@l(r6)
|
||||
stw r3, STREAM_START@l(r6)
|
||||
stw r3, STREAM_CURRENT@l(r6)
|
||||
stw r3, REALSTREAM_END@l(r6)
|
||||
b StartCB
|
||||
|
||||
SetupStream:
|
||||
cmpwi %r4, 0
|
||||
cmpwi r4, 0
|
||||
bne StartStream
|
||||
li %r3, 0
|
||||
stw %r3, LOOP_ENABLED@l(%r6)
|
||||
li r3, 0
|
||||
stw r3, LOOP_ENABLED@l(r6)
|
||||
b StartCB
|
||||
|
||||
StartStream:
|
||||
stw %r4, STREAM_LENGTH@l(%r6)
|
||||
stw %r5, STREAM_START@l(%r6)
|
||||
stw %r5, STREAM_CURRENT@l(%r6)
|
||||
li %r3, 1
|
||||
stw %r3, LOOP_ENABLED@l(%r6)
|
||||
stw %r3, FAKE_STREAMING@l(%r6)
|
||||
stw %r3, STREAM_UPDATE@l(%r6)
|
||||
stw r4, STREAM_LENGTH@l(r6)
|
||||
stw r5, STREAM_START@l(r6)
|
||||
stw r5, STREAM_CURRENT@l(r6)
|
||||
li r3, 1
|
||||
stw r3, LOOP_ENABLED@l(r6)
|
||||
stw r3, FAKE_STREAMING@l(r6)
|
||||
stw r3, STREAM_UPDATE@l(r6)
|
||||
|
||||
StartCB:
|
||||
li %r3, 1 #for the cb that everything resulted ok
|
||||
li r3, 1 #for the cb that everything resulted ok
|
||||
bctr #will boot cb then return to original function, saves quite some code
|
||||
|
@@ -20,46 +20,46 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.include "constants.inc"
|
||||
|
||||
DVDLowRequestAudioStatus:
|
||||
mtctr %r4
|
||||
lis %r4, STREAM_BASE@h
|
||||
srwi %r3, %r3, 16 #cmd is in upper 16-bit
|
||||
cmpwi %cr5, %r3, 0
|
||||
mtctr r4
|
||||
lis r4, STREAM_BASE@h
|
||||
srwi r3, r3, 16 #cmd is in upper 16-bit
|
||||
cmpwi %cr5, r3, 0
|
||||
beq %cr5, Streaming
|
||||
cmpwi %cr5, %r3, 1
|
||||
cmpwi %cr5, r3, 1
|
||||
beq %cr5, CurrentOffset
|
||||
cmpwi %cr5, %r3, 2
|
||||
cmpwi %cr5, r3, 2
|
||||
beq %cr5, StartOffset
|
||||
|
||||
StartLength:
|
||||
lwz %r3, STREAM_LENGTH@l(%r4)
|
||||
lwz r3, STREAM_LENGTH@l(r4)
|
||||
b SetDI_IMM
|
||||
|
||||
Streaming:
|
||||
lwz %r3, REALSTREAM_END@l(%r4)
|
||||
cmpwi %cr5, %r3, 0
|
||||
lwz r3, REALSTREAM_END@l(r4)
|
||||
cmpwi %cr5, r3, 0
|
||||
beq %cr5, FakeStreaming
|
||||
#stream ended, did a new one begin already
|
||||
lwz %r3, STREAM_UPDATE@l(%r4)
|
||||
cmpwi %cr5, %r3, 1
|
||||
lwz r3, STREAM_UPDATE@l(r4)
|
||||
cmpwi %cr5, r3, 1
|
||||
beq %cr5, FakeStreaming
|
||||
#real stream ended, no update
|
||||
li %r3, 0
|
||||
li r3, 0
|
||||
b SetDI_IMM
|
||||
FakeStreaming:
|
||||
lwz %r3, FAKE_STREAMING@l(%r4)
|
||||
lwz r3, FAKE_STREAMING@l(r4)
|
||||
b SetDI_IMM
|
||||
|
||||
CurrentOffset:
|
||||
lwz %r3, STREAM_CURRENT@l(%r4)
|
||||
lwz r3, STREAM_CURRENT@l(r4)
|
||||
b ShiftOffset
|
||||
|
||||
StartOffset:
|
||||
lwz %r3, STREAM_START@l(%r4)
|
||||
lwz r3, STREAM_START@l(r4)
|
||||
ShiftOffset:
|
||||
srwi %r3, %r3, 2
|
||||
srwi r3, r3, 2
|
||||
|
||||
SetDI_IMM:
|
||||
lis %r4, DI_IMM@h
|
||||
stw %r3, DI_IMM@l(%r4)
|
||||
li %r3, 1 #for the cb that everything resulted ok
|
||||
lis r4, DI_IMM@h
|
||||
stw r3, DI_IMM@l(r4)
|
||||
li r3, 1 #for the cb that everything resulted ok
|
||||
bctr #will boot cb then return to original function, saves quite some code
|
||||
|
@@ -20,10 +20,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.include "constants.inc"
|
||||
|
||||
DVDSendCMDEncrypted:
|
||||
lis %r6, DI_BASE@h
|
||||
ori %r6, %r6, DI_BASE@l
|
||||
rotrwi %r3, %r3, 8 #GC Norm
|
||||
stw %r3, 0x08(%r6) #DI_CMD_0
|
||||
stw %r4, 0x0C(%r6) #DI_CMD_1
|
||||
stw %r5, 0x10(%r6) #DI_CMD_2
|
||||
lis r6, DI_BASE@h
|
||||
ori r6, r6, DI_BASE@l
|
||||
rotrwi r3, r3, 8 #GC Norm
|
||||
stw r3, 0x08(r6) #DI_CMD_0
|
||||
stw r4, 0x0C(r6) #DI_CMD_1
|
||||
stw r5, 0x10(r6) #DI_CMD_2
|
||||
blr
|
||||
|
@@ -4,9 +4,9 @@
|
||||
.set DATEL_TIMER, 0x00009C00 # 0x6800 * 3 / 2
|
||||
|
||||
DatelTimer:
|
||||
li %r0, DATEL_TIMER@h
|
||||
ori %r0, %r0, DATEL_TIMER@l
|
||||
mtctr %r0
|
||||
li r0, DATEL_TIMER@h
|
||||
ori r0, r0, DATEL_TIMER@l
|
||||
mtctr r0
|
||||
DatelTimerWait:
|
||||
bdnz DatelTimerWait
|
||||
|
||||
|
@@ -1,60 +1,60 @@
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
# r4 data
|
||||
# r5 len
|
||||
# r6 mode
|
||||
# r7 cb
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
.include "constants.inc"
|
||||
|
||||
.set CH0_MASK, 0x60
|
||||
.set CH1_MASK, 0xC
|
||||
.set CH_LENGTH, 0x38
|
||||
|
||||
EXIDMA:
|
||||
lis %r8, 0x803F
|
||||
addi %r8, %r8, 0x0CB4
|
||||
cmpwi %r3, 1
|
||||
bne CallbackSet
|
||||
addi %r8, %r8, CH_LENGTH #mult instead? break channel2?
|
||||
CallbackSet:
|
||||
stw %r7, 0x4(%r8) # callback
|
||||
|
||||
lis %r8, CH0_MASK
|
||||
cmpwi %r3, 1
|
||||
bne MaskSet
|
||||
lis %r8, CH1_MASK
|
||||
MaskSet:
|
||||
lis %r7, 0xD302
|
||||
lis %r0, 0x1200
|
||||
|
||||
slwi %r3, %r3, 20
|
||||
slwi %r6, %r6, 16
|
||||
|
||||
or %r0, %r0, %r3
|
||||
or %r0, %r0, %r5
|
||||
or %r0, %r0, %r6
|
||||
|
||||
stw %r4, EXI_CMD_1@l(%r7)
|
||||
|
||||
## IRQ function call
|
||||
lis %r3, 0x8000
|
||||
lwz %r4, 0xC4(%r3)
|
||||
|
||||
andc %r4, %r4, %r8
|
||||
|
||||
stw %r4, 0xC4(%r3)
|
||||
|
||||
stw %r0, EXI_CMD_0@l(%r7)
|
||||
ready_loop:
|
||||
lwz %r3, EXI_CMD_0@l(%r7)
|
||||
cmpw %r3, %r0
|
||||
beq ready_loop
|
||||
|
||||
li %r3, 1
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
# r4 data
|
||||
# r5 len
|
||||
# r6 mode
|
||||
# r7 cb
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
.include "constants.inc"
|
||||
|
||||
.set CH0_MASK, 0x60
|
||||
.set CH1_MASK, 0xC
|
||||
.set CH_LENGTH, 0x38
|
||||
|
||||
EXIDMA:
|
||||
lis r8, 0x803F
|
||||
addi r8, r8, 0x0CB4
|
||||
cmpwi r3, 1
|
||||
bne CallbackSet
|
||||
addi r8, r8, CH_LENGTH #mult instead? break channel2?
|
||||
CallbackSet:
|
||||
stw r7, 0x4(r8) # callback
|
||||
|
||||
lis r8, CH0_MASK
|
||||
cmpwi r3, 1
|
||||
bne MaskSet
|
||||
lis r8, CH1_MASK
|
||||
MaskSet:
|
||||
lis r7, 0xD302
|
||||
lis r0, 0x1200
|
||||
|
||||
slwi r3, r3, 20
|
||||
slwi r6, r6, 16
|
||||
|
||||
or r0, r0, r3
|
||||
or r0, r0, r5
|
||||
or r0, r0, r6
|
||||
|
||||
stw r4, EXI_CMD_1@l(r7)
|
||||
|
||||
## IRQ function call
|
||||
lis r3, 0x8000
|
||||
lwz r4, 0xC4(r3)
|
||||
|
||||
andc r4, r4, r8
|
||||
|
||||
stw r4, 0xC4(r3)
|
||||
|
||||
stw r0, EXI_CMD_0@l(r7)
|
||||
ready_loop:
|
||||
lwz r3, EXI_CMD_0@l(r7)
|
||||
cmpw r3, r0
|
||||
beq ready_loop
|
||||
|
||||
li r3, 1
|
||||
blr
|
||||
|
@@ -1,52 +1,52 @@
|
||||
# EXIGetID(): Get the ID of an EXI device.
|
||||
# Input:
|
||||
# - r3: Channel number.
|
||||
# - r4: Device number.
|
||||
# - r5: ID buffer.
|
||||
# Output:
|
||||
# - r3: Device ID, or 0 if not valid.
|
||||
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
EXIGetID:
|
||||
# Check for device 0.
|
||||
# Slot A == Ch0,Dev0
|
||||
# Slot B == Ch1,Dev1
|
||||
cmpwi %r4, 0
|
||||
beq IsDev0
|
||||
End:
|
||||
# Not device 0.
|
||||
li %r3, 0
|
||||
blr
|
||||
|
||||
IsDev0:
|
||||
# Check for Slot A.
|
||||
cmpwi %r3, 0
|
||||
beq CardIsValid
|
||||
|
||||
# Check for Slot B.
|
||||
cmpwi %r3, 1
|
||||
bne End
|
||||
|
||||
# Is Slot B enabled?
|
||||
lis %r4, NinCfgConfig@h
|
||||
lwz %r4, NinCfgConfig@l(%r4)
|
||||
andis. %r4, %r4, NIN_CFG_MC_SLOTB@h # Check if a Slot B image was loaded.
|
||||
beq End
|
||||
|
||||
CardIsValid:
|
||||
# Store 0x00000080 in the ID buffer.
|
||||
# FIXME: This means Memory Card 2043?
|
||||
li %r4, 0x80
|
||||
stw %r4, 0x0(%r5)
|
||||
|
||||
# Return the Dolphin OS global value for this channel.
|
||||
# Slot A info is stored at 0x800030C0.
|
||||
# Slot B info is stored at 0x800030C4.
|
||||
slwi %r3, %r3, 2
|
||||
lis %r4, 0x8000
|
||||
or %r4, %r4, %r3 # r4 = 0x80000000 + (channel * 4)
|
||||
lwz %r3, 0x30C0(%r4)
|
||||
|
||||
blr
|
||||
# EXIGetID(): Get the ID of an EXI device.
|
||||
# Input:
|
||||
# - r3: Channel number.
|
||||
# - r4: Device number.
|
||||
# - r5: ID buffer.
|
||||
# Output:
|
||||
# - r3: Device ID, or 0 if not valid.
|
||||
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
EXIGetID:
|
||||
# Check for device 0.
|
||||
# Slot A == Ch0,Dev0
|
||||
# Slot B == Ch1,Dev1
|
||||
cmpwi r4, 0
|
||||
beq IsDev0
|
||||
End:
|
||||
# Not device 0.
|
||||
li r3, 0
|
||||
blr
|
||||
|
||||
IsDev0:
|
||||
# Check for Slot A.
|
||||
cmpwi r3, 0
|
||||
beq CardIsValid
|
||||
|
||||
# Check for Slot B.
|
||||
cmpwi r3, 1
|
||||
bne End
|
||||
|
||||
# Is Slot B enabled?
|
||||
lis r4, NinCfgConfig@h
|
||||
lwz r4, NinCfgConfig@l(r4)
|
||||
andis. r4, r4, NIN_CFG_MC_SLOTB@h # Check if a Slot B image was loaded.
|
||||
beq End
|
||||
|
||||
CardIsValid:
|
||||
# Store 0x00000080 in the ID buffer.
|
||||
# FIXME: This means Memory Card 2043?
|
||||
li r4, 0x80
|
||||
stw r4, 0x0(r5)
|
||||
|
||||
# Return the Dolphin OS global value for this channel.
|
||||
# Slot A info is stored at 0x800030C0.
|
||||
# Slot B info is stored at 0x800030C4.
|
||||
slwi r3, r3, 2
|
||||
lis r4, 0x8000
|
||||
or r4, r4, r3 # r4 = 0x80000000 + (channel * 4)
|
||||
lwz r3, 0x30C0(r4)
|
||||
|
||||
blr
|
||||
|
@@ -1,89 +1,89 @@
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
# r4 data
|
||||
# r5 len
|
||||
# r6 mode
|
||||
# r7 cb
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
.include "constants.inc"
|
||||
|
||||
EXIImm:
|
||||
mflr %r0
|
||||
stw %r0, 4(%sp)
|
||||
stwu %sp, -0x40(%sp)
|
||||
|
||||
mr %r8, %r7
|
||||
|
||||
lis %r7, 0xD302
|
||||
|
||||
lis %r0, 0x1100
|
||||
|
||||
slwi %r3, %r3, 20
|
||||
slwi %r6, %r6, 16
|
||||
|
||||
or %r0, %r0, %r3
|
||||
or %r0, %r0, %r5
|
||||
or %r0, %r0, %r6
|
||||
|
||||
cmpwi %r6, 0
|
||||
beq LdPtr
|
||||
|
||||
cmpwi %r5, 4
|
||||
bgt LdPtr
|
||||
|
||||
lwz %r3, 0(%r4)
|
||||
stw %r3, EXI_CMD_1@l(%r7)
|
||||
b NPtr
|
||||
|
||||
LdPtr:
|
||||
stw %r4, EXI_CMD_1@l(%r7)
|
||||
NPtr:
|
||||
stw %r0, EXI_CMD_0@l(%r7)
|
||||
ready_loop:
|
||||
lwz %r3, EXI_CMD_0@l(%r7)
|
||||
cmpw %r3, %r0
|
||||
beq ready_loop
|
||||
|
||||
cmpwi %r6, 0
|
||||
bne end
|
||||
|
||||
CopyResult:
|
||||
lwz %r3, EXI_CMD_1@l(%r7)
|
||||
cmpwi %r5, 1
|
||||
beq ByteWrite
|
||||
cmpwi %r5, 2
|
||||
beq HalfWrite
|
||||
cmpwi %r5, 4
|
||||
beq WordWrite
|
||||
b end
|
||||
ByteWrite:
|
||||
stb %r3, 0(%r4)
|
||||
b end
|
||||
HalfWrite:
|
||||
sth %r3, 0(%r4)
|
||||
b end
|
||||
WordWrite:
|
||||
stw %r3, 0(%r4)
|
||||
b end
|
||||
|
||||
end:
|
||||
cmpwi %r8, 0
|
||||
beq NoCB
|
||||
|
||||
mtctr %r8
|
||||
li %r3, 0
|
||||
li %r4, 0
|
||||
bctrl
|
||||
|
||||
NoCB:
|
||||
li %r3, 1
|
||||
|
||||
lwz %r0, 0x44(%sp)
|
||||
addi %sp, %sp, 0x40
|
||||
mtlr %r0
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
# r4 data
|
||||
# r5 len
|
||||
# r6 mode
|
||||
# r7 cb
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
.include "constants.inc"
|
||||
|
||||
EXIImm:
|
||||
mflr r0
|
||||
stw r0, 4(%sp)
|
||||
stwu %sp, -0x40(%sp)
|
||||
|
||||
mr r8, r7
|
||||
|
||||
lis r7, 0xD302
|
||||
|
||||
lis r0, 0x1100
|
||||
|
||||
slwi r3, r3, 20
|
||||
slwi r6, r6, 16
|
||||
|
||||
or r0, r0, r3
|
||||
or r0, r0, r5
|
||||
or r0, r0, r6
|
||||
|
||||
cmpwi r6, 0
|
||||
beq LdPtr
|
||||
|
||||
cmpwi r5, 4
|
||||
bgt LdPtr
|
||||
|
||||
lwz r3, 0(r4)
|
||||
stw r3, EXI_CMD_1@l(r7)
|
||||
b NPtr
|
||||
|
||||
LdPtr:
|
||||
stw r4, EXI_CMD_1@l(r7)
|
||||
NPtr:
|
||||
stw r0, EXI_CMD_0@l(r7)
|
||||
ready_loop:
|
||||
lwz r3, EXI_CMD_0@l(r7)
|
||||
cmpw r3, r0
|
||||
beq ready_loop
|
||||
|
||||
cmpwi r6, 0
|
||||
bne end
|
||||
|
||||
CopyResult:
|
||||
lwz r3, EXI_CMD_1@l(r7)
|
||||
cmpwi r5, 1
|
||||
beq ByteWrite
|
||||
cmpwi r5, 2
|
||||
beq HalfWrite
|
||||
cmpwi r5, 4
|
||||
beq WordWrite
|
||||
b end
|
||||
ByteWrite:
|
||||
stb r3, 0(r4)
|
||||
b end
|
||||
HalfWrite:
|
||||
sth r3, 0(r4)
|
||||
b end
|
||||
WordWrite:
|
||||
stw r3, 0(r4)
|
||||
b end
|
||||
|
||||
end:
|
||||
cmpwi r8, 0
|
||||
beq NoCB
|
||||
|
||||
mtctr r8
|
||||
li r3, 0
|
||||
li r4, 0
|
||||
bctrl
|
||||
|
||||
NoCB:
|
||||
li r3, 1
|
||||
|
||||
lwz r0, 0x44(%sp)
|
||||
addi %sp, %sp, 0x40
|
||||
mtlr r0
|
||||
blr
|
||||
|
@@ -1,12 +1,12 @@
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
EXILock:
|
||||
|
||||
li %r3, 1
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
EXILock:
|
||||
|
||||
li r3, 1
|
||||
blr
|
||||
|
@@ -1,49 +1,49 @@
|
||||
# EXIProbe(): Check if a device is present on the given EXI channel.
|
||||
# Input:
|
||||
# - r3: Channel number.
|
||||
# Output:
|
||||
# - r3: 1 if a device is present; 0 if no device is present.
|
||||
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
EXIProbe:
|
||||
lis %r4, NinCfgConfig@h
|
||||
lwz %r4, NinCfgConfig@l(%r4)
|
||||
andi. %r4, %r4, 0x8 # Check if memory card emulation is enabled.
|
||||
beq False # Memory card emulation is not enabled.
|
||||
|
||||
cmpwi %r3, 0 # Check if EXIProbe() was called for Slot A.
|
||||
beq True # If so, the card is definitely present.
|
||||
|
||||
cmpwi %r3, 1 # Check if EXIProbe() was called for Slot B.
|
||||
bne False # If not, the channel parameter is invalid.
|
||||
|
||||
lis %r4, NinCfgConfig@h
|
||||
lwz %r4, NinCfgConfig@l(%r4)
|
||||
andis. %r4, %r4, NIN_CFG_MC_SLOTB@h # Check if a Slot B image was loaded.
|
||||
bne True
|
||||
|
||||
False:
|
||||
# No EXI device is present on this channel.
|
||||
li %r3, 0
|
||||
blr
|
||||
|
||||
True:
|
||||
# An EXI device is present on this channel.
|
||||
# Set the Dolphin OS global variable.
|
||||
# Slot A info is stored at 0x800030C0.
|
||||
# Slot B info is stored at 0x800030C4.
|
||||
slwi %r3, %r3, 2
|
||||
lis %r4, 0x8000
|
||||
or %r4, %r4, %r3 # r4 = 0x80000000 + (channel * 4)
|
||||
|
||||
# Store the magic number 0xE2D383C1 in the OS Globals section
|
||||
# to indicate that a memory card is present.
|
||||
lis %r3, 0xE2D3
|
||||
ori %r3, %r3, 0x83C1
|
||||
stw %r3, 0x30C0(%r4)
|
||||
|
||||
# EXI device is present.
|
||||
li %r3, 1
|
||||
blr
|
||||
# EXIProbe(): Check if a device is present on the given EXI channel.
|
||||
# Input:
|
||||
# - r3: Channel number.
|
||||
# Output:
|
||||
# - r3: 1 if a device is present; 0 if no device is present.
|
||||
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
EXIProbe:
|
||||
lis r4, NinCfgConfig@h
|
||||
lwz r4, NinCfgConfig@l(r4)
|
||||
andi. r4, r4, 0x8 # Check if memory card emulation is enabled.
|
||||
beq False # Memory card emulation is not enabled.
|
||||
|
||||
cmpwi r3, 0 # Check if EXIProbe() was called for Slot A.
|
||||
beq True # If so, the card is definitely present.
|
||||
|
||||
cmpwi r3, 1 # Check if EXIProbe() was called for Slot B.
|
||||
bne False # If not, the channel parameter is invalid.
|
||||
|
||||
lis r4, NinCfgConfig@h
|
||||
lwz r4, NinCfgConfig@l(r4)
|
||||
andis. r4, r4, NIN_CFG_MC_SLOTB@h # Check if a Slot B image was loaded.
|
||||
bne True
|
||||
|
||||
False:
|
||||
# No EXI device is present on this channel.
|
||||
li r3, 0
|
||||
blr
|
||||
|
||||
True:
|
||||
# An EXI device is present on this channel.
|
||||
# Set the Dolphin OS global variable.
|
||||
# Slot A info is stored at 0x800030C0.
|
||||
# Slot B info is stored at 0x800030C4.
|
||||
slwi r3, r3, 2
|
||||
lis r4, 0x8000
|
||||
or r4, r4, r3 # r4 = 0x80000000 + (channel * 4)
|
||||
|
||||
# Store the magic number 0xE2D383C1 in the OS Globals section
|
||||
# to indicate that a memory card is present.
|
||||
lis r3, 0xE2D3
|
||||
ori r3, r3, 0x83C1
|
||||
stw r3, 0x30C0(r4)
|
||||
|
||||
# EXI device is present.
|
||||
li r3, 1
|
||||
blr
|
||||
|
@@ -1,32 +1,32 @@
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
# r4 device
|
||||
# r5 freq
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
.include "constants.inc"
|
||||
|
||||
EXISelect:
|
||||
lis %r7, 0xD302
|
||||
lis %r0, 0x1000
|
||||
|
||||
slwi %r4, %r4, 8
|
||||
slwi %r5, %r5, 16
|
||||
|
||||
or %r0, %r0, %r3
|
||||
or %r0, %r0, %r4
|
||||
or %r0, %r0, %r5
|
||||
|
||||
stw %r0, EXI_CMD_0@l(%r7)
|
||||
|
||||
ready_loop:
|
||||
lwz %r3, EXI_CMD_0@l(%r7)
|
||||
cmpw %r3, %r0
|
||||
beq ready_loop
|
||||
|
||||
lwz %r3, EXI_CMD_1@l(%r7)
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
# r4 device
|
||||
# r5 freq
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
.include "constants.inc"
|
||||
|
||||
EXISelect:
|
||||
lis r7, 0xD302
|
||||
lis r0, 0x1000
|
||||
|
||||
slwi r4, r4, 8
|
||||
slwi r5, r5, 16
|
||||
|
||||
or r0, r0, r3
|
||||
or r0, r0, r4
|
||||
or r0, r0, r5
|
||||
|
||||
stw r0, EXI_CMD_0@l(r7)
|
||||
|
||||
ready_loop:
|
||||
lwz r3, EXI_CMD_0@l(r7)
|
||||
cmpw r3, r0
|
||||
beq ready_loop
|
||||
|
||||
lwz r3, EXI_CMD_1@l(r7)
|
||||
blr
|
||||
|
@@ -1,15 +1,15 @@
|
||||
#include <asm.h>
|
||||
|
||||
FakeAIInterrupt:
|
||||
|
||||
lis %r3, 0xC000
|
||||
lwz %r4, 0x0054(%r3)
|
||||
li %r0, 0
|
||||
stw %r0, 0x0054(%r3)
|
||||
|
||||
lis %r3, 0xCC00
|
||||
lhz %r0, 0x500A(%r3)
|
||||
|
||||
or %r4, %r0, %r4
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
FakeAIInterrupt:
|
||||
|
||||
lis r3, 0xC000
|
||||
lwz r4, 0x0054(r3)
|
||||
li r0, 0
|
||||
stw r0, 0x0054(r3)
|
||||
|
||||
lis r3, 0xCC00
|
||||
lhz r0, 0x500A(r3)
|
||||
|
||||
or r4, r0, r4
|
||||
|
||||
blr
|
||||
|
@@ -5,35 +5,34 @@
|
||||
.set FLUSH_ADDR, 0xD3003428
|
||||
|
||||
FakeEntryLoad:
|
||||
lis %r3, RESET_STATUS@h
|
||||
li %r0, 0x4DEA
|
||||
stw %r0, RESET_STATUS@l(%r3)
|
||||
lis r3, RESET_STATUS@h
|
||||
li r0, 0x4DEA
|
||||
stw r0, RESET_STATUS@l(r3)
|
||||
wait_loop:
|
||||
lwz %r4, RESET_STATUS@l(%r3)
|
||||
cmplw %r4, %r0
|
||||
lwz r4, RESET_STATUS@l(r3)
|
||||
cmplw r4, r0
|
||||
beq wait_loop
|
||||
mtlr %r4
|
||||
mtlr r4
|
||||
|
||||
lwz %r4, FLUSH_LEN@l(%r3)
|
||||
mtctr %r4
|
||||
lwz r4, FLUSH_LEN@l(r3)
|
||||
mtctr r4
|
||||
|
||||
li %r0, 0
|
||||
lwz %r4, FLUSH_ADDR@l(%r3)
|
||||
lwz r4, FLUSH_ADDR@l(r3)
|
||||
InvalidateRange1:
|
||||
dcbi %r0, %r4
|
||||
icbi %r0, %r4
|
||||
addi %r4, %r4, 0x20
|
||||
dcbi 0, r4
|
||||
icbi 0, r4
|
||||
addi r4, r4, 0x20
|
||||
bdnz InvalidateRange1
|
||||
|
||||
li %r4, 0x100
|
||||
mtctr %r4
|
||||
lis %r4, 0x8000
|
||||
ori %r4, %r4, 0x1000
|
||||
li r4, 0x100
|
||||
mtctr r4
|
||||
lis r4, 0x8000
|
||||
ori r4, r4, 0x1000
|
||||
|
||||
InvalidateRange2:
|
||||
dcbi %r0, %r4
|
||||
icbi %r0, %r4
|
||||
addi %r4, %r4, 0x20
|
||||
dcbi 0, r4
|
||||
icbi 0, r4
|
||||
addi r4, r4, 0x20
|
||||
bdnz InvalidateRange2
|
||||
|
||||
sync
|
||||
|
@@ -1,31 +1,31 @@
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
FakeInterrupt:
|
||||
lwz %r31, 0x3000(%r3)
|
||||
andi. %r0, %r31, 0x4000 #check if IPC IRQ
|
||||
rlwinm %r31, %r31, 0, 18, 31 #relevant irqs
|
||||
beq end #if bit 14=0 then no need to check
|
||||
|
||||
lis %r3, 0xCD80
|
||||
li %r0, 0x22
|
||||
stw %r0, 4(%r3)
|
||||
lis %r0, 0x4000
|
||||
stw %r0, 0x30(%r3)
|
||||
|
||||
lis %r3, INT_BASE@h
|
||||
lwz %r0, RSW_INT@l(%r3)
|
||||
rlwimi %r31, %r0, 0, 30, 30 #0x2
|
||||
|
||||
lwz %r0, DI_INT@l(%r3)
|
||||
rlwimi %r31, %r0, 0, 29, 29 #0x4
|
||||
|
||||
lwz %r0, SI_INT@l(%r3)
|
||||
rlwimi %r31, %r0, 0, 28, 28 #0x8
|
||||
|
||||
lwz %r0, EXI_INT@l(%r3)
|
||||
rlwimi %r31, %r0, 0, 27, 27 #0x10
|
||||
|
||||
end:
|
||||
lis %r3, 0xCC00
|
||||
blr
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
FakeInterrupt:
|
||||
lwz r31, 0x3000(r3)
|
||||
andi. r0, r31, 0x4000 #check if IPC IRQ
|
||||
rlwinm r31, r31, 0, 18, 31 #relevant irqs
|
||||
beq end #if bit 14=0 then no need to check
|
||||
|
||||
lis r3, 0xCD80
|
||||
li r0, 0x22
|
||||
stw r0, 4(r3)
|
||||
lis r0, 0x4000
|
||||
stw r0, 0x30(r3)
|
||||
|
||||
lis r3, INT_BASE@h
|
||||
lwz r0, RSW_INT@l(r3)
|
||||
rlwimi r31, r0, 0, 30, 30 #0x2
|
||||
|
||||
lwz r0, DI_INT@l(r3)
|
||||
rlwimi r31, r0, 0, 29, 29 #0x4
|
||||
|
||||
lwz r0, SI_INT@l(r3)
|
||||
rlwimi r31, r0, 0, 28, 28 #0x8
|
||||
|
||||
lwz r0, EXI_INT@l(r3)
|
||||
rlwimi r31, r0, 0, 27, 27 #0x10
|
||||
|
||||
end:
|
||||
lis r3, 0xCC00
|
||||
blr
|
||||
|
@@ -1,31 +1,31 @@
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
FakeInterrupt_DBG:
|
||||
lwz %r29, 0x3000(%r3)
|
||||
andi. %r0, %r29, 0x4000 #check if IPC IRQ
|
||||
rlwinm %r29, %r29, 0, 18, 31 #relevant irqs
|
||||
beq end #if bit 14=0 then no need to check
|
||||
|
||||
lis %r3, 0xCD80
|
||||
li %r0, 0x22
|
||||
stw %r0, 4(%r3)
|
||||
lis %r0, 0x4000
|
||||
stw %r0, 0x30(%r3)
|
||||
|
||||
lis %r3, INT_BASE@h
|
||||
lwz %r0, RSW_INT@l(%r3)
|
||||
rlwimi %r29, %r0, 0, 30, 30 #0x2
|
||||
|
||||
lwz %r0, DI_INT@l(%r3)
|
||||
rlwimi %r29, %r0, 0, 29, 29 #0x4
|
||||
|
||||
lwz %r0, SI_INT@l(%r3)
|
||||
rlwimi %r29, %r0, 0, 28, 28 #0x8
|
||||
|
||||
lwz %r0, EXI_INT@l(%r3)
|
||||
rlwimi %r29, %r0, 0, 27, 27 #0x10
|
||||
|
||||
end:
|
||||
lis %r3, 0xCC00
|
||||
blr
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
FakeInterrupt_DBG:
|
||||
lwz r29, 0x3000(r3)
|
||||
andi. r0, r29, 0x4000 #check if IPC IRQ
|
||||
rlwinm r29, r29, 0, 18, 31 #relevant irqs
|
||||
beq end #if bit 14=0 then no need to check
|
||||
|
||||
lis r3, 0xCD80
|
||||
li r0, 0x22
|
||||
stw r0, 4(r3)
|
||||
lis r0, 0x4000
|
||||
stw r0, 0x30(r3)
|
||||
|
||||
lis r3, INT_BASE@h
|
||||
lwz r0, RSW_INT@l(r3)
|
||||
rlwimi r29, r0, 0, 30, 30 #0x2
|
||||
|
||||
lwz r0, DI_INT@l(r3)
|
||||
rlwimi r29, r0, 0, 29, 29 #0x4
|
||||
|
||||
lwz r0, SI_INT@l(r3)
|
||||
rlwimi r29, r0, 0, 28, 28 #0x8
|
||||
|
||||
lwz r0, EXI_INT@l(r3)
|
||||
rlwimi r29, r0, 0, 27, 27 #0x10
|
||||
|
||||
end:
|
||||
lis r3, 0xCC00
|
||||
blr
|
||||
|
@@ -3,38 +3,38 @@
|
||||
|
||||
FakeInterrupt:
|
||||
# could just use r9 and r28/r10 instead of backup/restore r3 and r31
|
||||
mr %r9, %r3
|
||||
mr %r28, %r31
|
||||
lis %r3, IRQ_STATUS@h
|
||||
ori %r3, %r3,IRQ_STATUS@l
|
||||
lwz %r31, 0x0000(%r3)
|
||||
andi. %r0, %r31, 0x4000 #check if IPC IRQ
|
||||
rlwinm %r31, %r31, 0, 18, 15 #relevant irqs # Datel requires bit 15 high
|
||||
mr r9, r3
|
||||
mr r28, r31
|
||||
lis r3, IRQ_STATUS@h
|
||||
ori r3, r3,IRQ_STATUS@l
|
||||
lwz r31, 0x0000(r3)
|
||||
andi. r0, r31, 0x4000 #check if IPC IRQ
|
||||
rlwinm r31, r31, 0, 18, 15 #relevant irqs # Datel requires bit 15 high
|
||||
beq end #if bit 14=0 then no need to check
|
||||
|
||||
lis %r3, 0xCD80
|
||||
li %r0, 0x22
|
||||
stw %r0, 4(%r3)
|
||||
lis %r0, 0x4000
|
||||
stw %r0, 0x30(%r3)
|
||||
lis r3, 0xCD80
|
||||
li r0, 0x22
|
||||
stw r0, 4(r3)
|
||||
lis r0, 0x4000
|
||||
stw r0, 0x30(r3)
|
||||
|
||||
lis %r3, INT_BASE@h
|
||||
lwz %r0, RSW_INT@l(%r3)
|
||||
rlwimi %r31, %r0, 0, 30, 30 #0x2
|
||||
lis r3, INT_BASE@h
|
||||
lwz r0, RSW_INT@l(r3)
|
||||
rlwimi r31, r0, 0, 30, 30 #0x2
|
||||
|
||||
lwz %r0, DI_INT@l(%r3)
|
||||
rlwimi %r31, %r0, 0, 29, 29 #0x4
|
||||
lwz r0, DI_INT@l(r3)
|
||||
rlwimi r31, r0, 0, 29, 29 #0x4
|
||||
|
||||
lwz %r0, SI_INT@l(%r3)
|
||||
rlwimi %r31, %r0, 0, 28, 28 #0x8
|
||||
lwz r0, SI_INT@l(r3)
|
||||
rlwimi r31, r0, 0, 28, 28 #0x8
|
||||
|
||||
lwz %r0, EXI_INT@l(%r3)
|
||||
rlwimi %r31, %r0, 0, 27, 27 #0x10
|
||||
lwz r0, EXI_INT@l(r3)
|
||||
rlwimi r31, r0, 0, 27, 27 #0x10
|
||||
|
||||
end:
|
||||
mr %r10, %r31
|
||||
mr %r3, %r9
|
||||
mr %r31, %r28
|
||||
mr %r28, %r10 # Some versions use r28, others r10
|
||||
# lis %r3, 0xCC00
|
||||
mr r10, r31
|
||||
mr r3, r9
|
||||
mr r31, r28
|
||||
mr r28, r10 # Some versions use r28, others r10
|
||||
# lis r3, 0xCC00
|
||||
blr
|
||||
|
@@ -2,12 +2,12 @@
|
||||
.include "constants.inc"
|
||||
|
||||
OSGetResetButtonState:
|
||||
lis %r5, INT_BASE@h
|
||||
lwz %r6, RSW_INT@l(%r5)
|
||||
cmpwi %r6, 0
|
||||
lis r5, INT_BASE@h
|
||||
lwz r6, RSW_INT@l(r5)
|
||||
cmpwi r6, 0
|
||||
beq end
|
||||
mr %r0, %r6
|
||||
mr r0, r6
|
||||
|
||||
end:
|
||||
rlwinm. %r0, %r0, 0, 15, 15
|
||||
rlwinm. r0, r0, 0, 15, 15
|
||||
blr
|
||||
|
@@ -1,17 +1,17 @@
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
__OSResetSWInterruptHandler:
|
||||
#original instruction
|
||||
stw %r0, 0x3000(%r3)
|
||||
|
||||
lis %r3, INT_BASE@h
|
||||
lwz %r0, RSW_INT@l(%r3)
|
||||
cmpwi %r0, 0
|
||||
beq end
|
||||
#keep something in RSW_INT for OSGetResetButtonState
|
||||
lis %r0, 0x2
|
||||
stw %r0, RSW_INT@l(%r3)
|
||||
|
||||
end:
|
||||
blr
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
__OSResetSWInterruptHandler:
|
||||
#original instruction
|
||||
stw r0, 0x3000(r3)
|
||||
|
||||
lis r3, INT_BASE@h
|
||||
lwz r0, RSW_INT@l(r3)
|
||||
cmpwi r0, 0
|
||||
beq end
|
||||
#keep something in RSW_INT for OSGetResetButtonState
|
||||
lis r0, 0x2
|
||||
stw r0, RSW_INT@l(r3)
|
||||
|
||||
end:
|
||||
blr
|
||||
|
@@ -1,70 +1,68 @@
|
||||
#include <asm.h>
|
||||
|
||||
GCAMSendCommand:
|
||||
mflr %r0
|
||||
stw %r0, 4(%sp)
|
||||
stwu %sp, -8(%sp)
|
||||
|
||||
lis %r4, 0 #gets replaced
|
||||
addi %r4, %r4, 0 #gets replaced
|
||||
addi %r6, %r4, 0x80
|
||||
|
||||
#flush DataIn
|
||||
clrrwi %r3, %r4, 5
|
||||
subf %r5, %r3, %r4
|
||||
addi %r5, %r5, 0x80 #static data length
|
||||
addi %r5, %r5, 0x1F
|
||||
srwi %r5, %r5, 5
|
||||
mtctr %r5
|
||||
|
||||
li %r0, 0
|
||||
DCFlushRange:
|
||||
dcbf %r0, %r3
|
||||
addi %r3, %r3, 0x20
|
||||
bdnz DCFlushRange
|
||||
sync
|
||||
|
||||
lis %r7, 0xD302
|
||||
lis %r0, 0x7000
|
||||
|
||||
stw %r0, 0x6100(%r7)
|
||||
stw %r4, 0x6104(%r7)
|
||||
stw %r6, 0x6108(%r7)
|
||||
|
||||
li %r0, 3
|
||||
stw %r0, 0x6118(%r7)
|
||||
|
||||
ready_loop:
|
||||
lwz %r0, 0x6118(%r7)
|
||||
cmpwi %r0, 3
|
||||
beq ready_loop
|
||||
|
||||
#invalidate DataOut
|
||||
clrrwi %r3, %r6, 5
|
||||
subf %r5, %r3, %r6
|
||||
addi %r5, %r5, 0x80 #static data length
|
||||
addi %r5, %r5, 0x1F
|
||||
srwi %r5, %r5, 5
|
||||
mtctr %r5
|
||||
|
||||
li %r0, 0
|
||||
DCInvalidateRange:
|
||||
dcbi %r0, %r3
|
||||
addi %r3, %r3, 0x20
|
||||
bdnz DCInvalidateRange
|
||||
sync
|
||||
|
||||
lis %r3, 0 #gets replaced
|
||||
addi %r3, %r3, 0 #gets replaced
|
||||
|
||||
mtctr %r3
|
||||
li %r3, 0
|
||||
li %r4, 0
|
||||
bctrl
|
||||
|
||||
li %r3, 1
|
||||
|
||||
lwz %r0, 12(%sp)
|
||||
addi %sp, %sp, 8
|
||||
mtlr %r0
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
GCAMSendCommand:
|
||||
mflr r0
|
||||
stw r0, 4(%sp)
|
||||
stwu %sp, -8(%sp)
|
||||
|
||||
lis r4, 0 #gets replaced
|
||||
addi r4, r4, 0 #gets replaced
|
||||
addi r6, r4, 0x80
|
||||
|
||||
#flush DataIn
|
||||
clrrwi r3, r4, 5
|
||||
subf r5, r3, r4
|
||||
addi r5, r5, 0x80 #static data length
|
||||
addi r5, r5, 0x1F
|
||||
srwi r5, r5, 5
|
||||
mtctr r5
|
||||
|
||||
DCFlushRange:
|
||||
dcbf 0, r3
|
||||
addi r3, r3, 0x20
|
||||
bdnz DCFlushRange
|
||||
sync
|
||||
|
||||
lis r7, 0xD302
|
||||
lis r0, 0x7000
|
||||
|
||||
stw r0, 0x6100(r7)
|
||||
stw r4, 0x6104(r7)
|
||||
stw r6, 0x6108(r7)
|
||||
|
||||
li r0, 3
|
||||
stw r0, 0x6118(r7)
|
||||
|
||||
ready_loop:
|
||||
lwz r0, 0x6118(r7)
|
||||
cmpwi r0, 3
|
||||
beq ready_loop
|
||||
|
||||
#invalidate DataOut
|
||||
clrrwi r3, r6, 5
|
||||
subf r5, r3, r6
|
||||
addi r5, r5, 0x80 #static data length
|
||||
addi r5, r5, 0x1F
|
||||
srwi r5, r5, 5
|
||||
mtctr r5
|
||||
|
||||
DCInvalidateRange:
|
||||
dcbi 0, r3
|
||||
addi r3, r3, 0x20
|
||||
bdnz DCInvalidateRange
|
||||
sync
|
||||
|
||||
lis r3, 0 #gets replaced
|
||||
addi r3, r3, 0 #gets replaced
|
||||
|
||||
mtctr r3
|
||||
li r3, 0
|
||||
li r4, 0
|
||||
bctrl
|
||||
|
||||
li r3, 1
|
||||
|
||||
lwz r0, 12(%sp)
|
||||
addi %sp, %sp, 8
|
||||
mtlr r0
|
||||
blr
|
||||
|
@@ -6,10 +6,10 @@
|
||||
#r6=entries
|
||||
|
||||
GXInitTlutObj:
|
||||
slwi %r0, %r5, 10
|
||||
stw %r0, 0(%r3)
|
||||
lis %r0, 0x6400
|
||||
rlwimi %r0, %r4, 27, 12, 31 #((addr>>5)&0xFFFFF)
|
||||
stw %r0, 4(%r3)
|
||||
sth %r6, 8(%r3)
|
||||
slwi r0, r5, 10
|
||||
stw r0, 0(r3)
|
||||
lis r0, 0x6400
|
||||
rlwimi r0, r4, 27, 12, 31 #((addr>>5)&0xFFFFF)
|
||||
stw r0, 4(r3)
|
||||
sth r6, 8(r3)
|
||||
blr
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#include <asm.h>
|
||||
|
||||
GXLoadTlut:
|
||||
lwz %r0, 4(%r30)
|
||||
rlwinm %r0, %r0, 0, 12, 7
|
||||
lwz r0, 4(r30)
|
||||
rlwinm r0, r0, 0, 12, 7
|
||||
blr
|
||||
|
@@ -29,8 +29,8 @@ MajoraLoadRegs:
|
||||
beq cmpstrm,end
|
||||
stw loc, AI_ADP_LOC@l(glob)
|
||||
end:
|
||||
lwz %r27, 0xC(%r1)
|
||||
lwz %r26, 0x8(%r1)
|
||||
lwz %r25, 0x4(%r1)
|
||||
addi %r1, %r1, 0x20
|
||||
lwz r27, 0xC(r1)
|
||||
lwz r26, 0x8(r1)
|
||||
lwz r25, 0x4(r1)
|
||||
addi r1, r1, 0x20
|
||||
blr
|
||||
|
@@ -27,10 +27,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
#they left the stack room but didnt use it, good for us
|
||||
MajoraSaveRegs:
|
||||
stw glob, 0x10(%r1)
|
||||
stw buf, 0xC(%r1)
|
||||
stw loc, 0x8(%r1)
|
||||
stw tmp, 0x4(%r1)
|
||||
stw glob, 0x10(r1)
|
||||
stw buf, 0xC(r1)
|
||||
stw loc, 0x8(r1)
|
||||
stw tmp, 0x4(r1)
|
||||
lis glob, STREAMING@h
|
||||
lwz tmp, STREAMING@l(glob)
|
||||
cmpwi cmpstrm,tmp, 0
|
||||
|
@@ -1,45 +1,45 @@
|
||||
#PREFIX = powerpc-gekko-
|
||||
PREFIX = $(DEVKITPPC)/bin/powerpc-eabi-
|
||||
#PREFIX = /home/megazig/Wii/bootmii-utils/bin/powerpc-elf-
|
||||
|
||||
AR = $(PREFIX)ar
|
||||
AS = $(PREFIX)as
|
||||
CC = $(PREFIX)gcc
|
||||
CXX = $(PREFIX)g++
|
||||
LD = $(PREFIX)ld
|
||||
OBJCOPY = $(PREFIX)objcopy
|
||||
RANLIB = $(PREFIX)ranlib
|
||||
STRIP = $(PREFIX)strip
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
BIN2H = ../bin2h/bin2h.exe
|
||||
else
|
||||
BIN2H = ../bin2h/bin2h
|
||||
endif
|
||||
|
||||
SFILES := $(wildcard *.S)
|
||||
DFILES := $(SFILES:.S=.d)
|
||||
ELFFILES := $(SFILES:.S=.elf)
|
||||
BINFILES := $(ELFFILES:.elf=.bin)
|
||||
HFILES := $(BINFILES:.bin=.h)
|
||||
|
||||
all: $(HFILES)
|
||||
|
||||
-include $(DFILES)
|
||||
.PRECIOUS: %.elf %.bin
|
||||
|
||||
%.elf: %.S
|
||||
@echo " ASSEMBLE $<"
|
||||
@$(AS) $< -MD $(@:.elf=.d) -o $@
|
||||
|
||||
%.bin: %.elf
|
||||
@echo " STRIP $<"
|
||||
@$(STRIP) $< -O binary -S -s -o $@
|
||||
|
||||
%.h: %.bin
|
||||
@echo " BIN2H $<"
|
||||
@$(BIN2H) $<
|
||||
|
||||
clean:
|
||||
@echo clean ...
|
||||
@rm -fr *.d *.h *.bin *.elf
|
||||
#PREFIX = powerpc-gekko-
|
||||
PREFIX = $(DEVKITPPC)/bin/powerpc-eabi-
|
||||
#PREFIX = /home/megazig/Wii/bootmii-utils/bin/powerpc-elf-
|
||||
|
||||
AR = $(PREFIX)ar
|
||||
AS = $(PREFIX)as
|
||||
CC = $(PREFIX)gcc
|
||||
CXX = $(PREFIX)g++
|
||||
LD = $(PREFIX)ld
|
||||
OBJCOPY = $(PREFIX)objcopy
|
||||
RANLIB = $(PREFIX)ranlib
|
||||
STRIP = $(PREFIX)strip
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
BIN2H = ../bin2h/bin2h.exe
|
||||
else
|
||||
BIN2H = ../bin2h/bin2h
|
||||
endif
|
||||
|
||||
SFILES := $(wildcard *.S)
|
||||
DFILES := $(SFILES:.S=.d)
|
||||
ELFFILES := $(SFILES:.S=.elf)
|
||||
BINFILES := $(ELFFILES:.elf=.bin)
|
||||
HFILES := $(BINFILES:.bin=.h)
|
||||
|
||||
all: $(HFILES)
|
||||
|
||||
-include $(DFILES)
|
||||
.PRECIOUS: %.elf %.bin
|
||||
|
||||
%.elf: %.S
|
||||
@echo " ASSEMBLE $<"
|
||||
@$(AS) $< -mregnames -MD $(@:.elf=.d) -o $@
|
||||
|
||||
%.bin: %.elf
|
||||
@echo " STRIP $<"
|
||||
@$(STRIP) $< -O binary -S -s -o $@
|
||||
|
||||
%.h: %.bin
|
||||
@echo " BIN2H $<"
|
||||
@$(BIN2H) $<
|
||||
|
||||
clean:
|
||||
@echo clean ...
|
||||
@rm -fr *.d *.h *.bin *.elf
|
||||
|
@@ -4,10 +4,10 @@ OSExceptionInit:
|
||||
#original instruction
|
||||
nop
|
||||
#r3 is the dest of this handler
|
||||
cmpwi %r3, 0xF00
|
||||
cmpwi r3, 0xF00
|
||||
#smaller or equal is actually ok
|
||||
ble end
|
||||
#everything above though...
|
||||
li %r3, 0xF00 #grab low mem!
|
||||
li r3, 0xF00 #grab low mem!
|
||||
end:
|
||||
blr
|
||||
|
@@ -4,25 +4,25 @@
|
||||
|
||||
OSReportDM:
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr %r0
|
||||
stw %r0, 0xC(%sp)
|
||||
stw %r9, 0x10(%sp)
|
||||
lis %r9, OSReport@h
|
||||
mflr r0
|
||||
stw r0, 0xC(%sp)
|
||||
stw r9, 0x10(%sp)
|
||||
lis r9, OSReport@h
|
||||
|
||||
stw %r4, 0x1864(%r9)
|
||||
stw %r5, 0x1868(%r9)
|
||||
stw %r6, 0x186C(%r9)
|
||||
stw %r7, 0x1870(%r9)
|
||||
stw %r8, 0x1874(%r9)
|
||||
stw r4, 0x1864(r9)
|
||||
stw r5, 0x1868(r9)
|
||||
stw r6, 0x186C(r9)
|
||||
stw r7, 0x1870(r9)
|
||||
stw r8, 0x1874(r9)
|
||||
|
||||
stw %r3, 0x1860(%r9)
|
||||
stw r3, 0x1860(r9)
|
||||
repeatcheck:
|
||||
lwz %r0, 0x1860(%r9)
|
||||
cmpw %r0, %r3
|
||||
lwz r0, 0x1860(r9)
|
||||
cmpw r0, r3
|
||||
beq repeatcheck
|
||||
|
||||
lwz %r0, 0xC(%sp)
|
||||
lwz %r9, 0x10(%sp)
|
||||
lwz r0, 0xC(%sp)
|
||||
lwz r9, 0x10(%sp)
|
||||
addi %sp, %sp, 0x20
|
||||
mtlr %r0
|
||||
mtlr r0
|
||||
blr
|
||||
|
@@ -2,18 +2,18 @@
|
||||
.include "constants.inc"
|
||||
|
||||
PADControlAllMotors:
|
||||
lis %r4, PadRumble@h
|
||||
ori %r4, %r4, PadRumble@l #chan0 base
|
||||
lis r4, PadRumble@h
|
||||
ori r4, r4, PadRumble@l #chan0 base
|
||||
|
||||
li %r5, 3
|
||||
li r5, 3
|
||||
|
||||
repeat:
|
||||
slwi %r6, %r5, 2
|
||||
lwzx %r0, %r6, %r3
|
||||
stwx %r0, %r6, %r4
|
||||
cmpwi %r5, 0
|
||||
slwi r6, r5, 2
|
||||
lwzx r0, r6, r3
|
||||
stwx r0, r6, r4
|
||||
cmpwi r5, 0
|
||||
beq exit
|
||||
subi %r5, %r5, 1
|
||||
subi r5, r5, 1
|
||||
b repeat
|
||||
|
||||
exit:
|
||||
|
@@ -2,15 +2,15 @@
|
||||
.include "constants.inc"
|
||||
|
||||
PADControlMotor:
|
||||
cmpwi %r3, 0
|
||||
cmpwi r3, 0
|
||||
blt exit
|
||||
cmpwi %r3, 3
|
||||
cmpwi r3, 3
|
||||
bgt exit
|
||||
|
||||
lis %r0, PadRumble@h
|
||||
ori %r0, %r0, PadRumble@l #chan0 base
|
||||
slwi %r3, %r3, 2
|
||||
stwx %r4, %r3, %r0
|
||||
lis r0, PadRumble@h
|
||||
ori r0, r0, PadRumble@l #chan0 base
|
||||
slwi r3, r3, 2
|
||||
stwx r4, r3, r0
|
||||
|
||||
exit:
|
||||
blr
|
||||
|
@@ -3,28 +3,28 @@
|
||||
|
||||
PADControlMotorGP:
|
||||
#original instruction
|
||||
lbz %r4, 0x2F(%r31)
|
||||
lbz r4, 0x2F(r31)
|
||||
#load control motor base into r3
|
||||
lis %r3, PadRumble@h
|
||||
ori %r3, %r3, PadRumble@l
|
||||
lis r3, PadRumble@h
|
||||
ori r3, r3, PadRumble@l
|
||||
#start by checking if rumble was active
|
||||
lbz %r5, 0(%r3)
|
||||
cmpwi %r5, 0
|
||||
lbz r5, 0(r3)
|
||||
cmpwi r5, 0
|
||||
beq checkRumble
|
||||
#was active, extend rumble
|
||||
subi %r5, %r5, 1
|
||||
stb %r5, 0(%r3)
|
||||
subi r5, r5, 1
|
||||
stb r5, 0(r3)
|
||||
b rumbleOn
|
||||
checkRumble:
|
||||
#was not active so check now
|
||||
li %r0, 0
|
||||
cmpwi %r4, 0
|
||||
li r0, 0
|
||||
cmpwi r4, 0
|
||||
beq saveRumble
|
||||
#did not rumble before, set up
|
||||
li %r5, 15
|
||||
stb %r5, 0(%r3)
|
||||
li r5, 15
|
||||
stb r5, 0(r3)
|
||||
rumbleOn:
|
||||
li %r0, 1
|
||||
li r0, 1
|
||||
saveRumble:
|
||||
stb %r0, 3(%r3)
|
||||
stb r0, 3(r3)
|
||||
blr
|
||||
|
@@ -2,17 +2,17 @@
|
||||
.include "constants.inc"
|
||||
|
||||
PADIsBarrel:
|
||||
cmpwi %r3, 0
|
||||
cmpwi r3, 0
|
||||
blt invalid
|
||||
cmpwi %r3, 3
|
||||
cmpwi r3, 3
|
||||
bgt invalid
|
||||
|
||||
lis %r0, 0xD300
|
||||
ori %r0, %r0, 0x3130 #chan0 base
|
||||
slwi %r3, %r3, 2
|
||||
lwzx %r3, %r3, %r0
|
||||
lis r0, 0xD300
|
||||
ori r0, r0, 0x3130 #chan0 base
|
||||
slwi r3, r3, 2
|
||||
lwzx r3, r3, r0
|
||||
blr
|
||||
|
||||
invalid:
|
||||
li %r3, 0
|
||||
li r3, 0
|
||||
blr
|
||||
|
@@ -1,40 +1,40 @@
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
PADRead:
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr %r0
|
||||
stw %r0, 0xC(%sp)
|
||||
stw %r31, 0x10(%sp)
|
||||
mr %r31, %r3
|
||||
|
||||
#to stub instead of arm
|
||||
lis %r3, PadStub@h
|
||||
ori %r3, %r3, PadStub@l
|
||||
mtctr %r3
|
||||
bctrl
|
||||
|
||||
lis %r5, PadBuff@h
|
||||
ori %r5, %r5, PadBuff@l
|
||||
|
||||
#original code
|
||||
li %r4, 0x30
|
||||
|
||||
memcpy:
|
||||
lwz %r6, 0(%r5)
|
||||
lwz %r7, 4(%r5)
|
||||
lwz %r8, 8(%r5)
|
||||
addi %r5, %r5, 0xC
|
||||
stw %r6, 0(%r31)
|
||||
stw %r7, 4(%r31)
|
||||
stw %r8, 8(%r31)
|
||||
addi %r31, %r31, 0xC
|
||||
subi %r4, %r4, 0xC
|
||||
cmpwi %r4, 0
|
||||
bne memcpy
|
||||
|
||||
lwz %r0, 0xC(%sp)
|
||||
lwz %r31, 0x10(%sp)
|
||||
addi %sp, %sp, 0x20
|
||||
mtlr %r0
|
||||
blr
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
PADRead:
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr r0
|
||||
stw r0, 0xC(%sp)
|
||||
stw r31, 0x10(%sp)
|
||||
mr r31, r3
|
||||
|
||||
#to stub instead of arm
|
||||
lis r3, PadStub@h
|
||||
ori r3, r3, PadStub@l
|
||||
mtctr r3
|
||||
bctrl
|
||||
|
||||
lis r5, PadBuff@h
|
||||
ori r5, r5, PadBuff@l
|
||||
|
||||
#original code
|
||||
li r4, 0x30
|
||||
|
||||
memcpy:
|
||||
lwz r6, 0(r5)
|
||||
lwz r7, 4(r5)
|
||||
lwz r8, 8(r5)
|
||||
addi r5, r5, 0xC
|
||||
stw r6, 0(r31)
|
||||
stw r7, 4(r31)
|
||||
stw r8, 8(r31)
|
||||
addi r31, r31, 0xC
|
||||
subi r4, r4, 0xC
|
||||
cmpwi r4, 0
|
||||
bne memcpy
|
||||
|
||||
lwz r0, 0xC(%sp)
|
||||
lwz r31, 0x10(%sp)
|
||||
addi %sp, %sp, 0x20
|
||||
mtlr r0
|
||||
blr
|
||||
|
@@ -1,32 +1,31 @@
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
PADReadF:
|
||||
#only update player 1
|
||||
cmplwi %r28, 0
|
||||
bne end
|
||||
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr %r0
|
||||
stw %r0, 0xC(%sp)
|
||||
|
||||
#to stub instead of arm
|
||||
lis %r3, PadStub@h
|
||||
ori %r3, %r3, PadStub@l
|
||||
mtctr %r3
|
||||
bctrl
|
||||
|
||||
lis %r3, PadBuff@h
|
||||
ori %r3, %r3, PadBuff@l
|
||||
li %r0, 0
|
||||
#store player data for ARM JVSIO.c
|
||||
dcbf %r0, %r3
|
||||
|
||||
lwz %r0, 0xC(%sp)
|
||||
mtlr %r0
|
||||
addi %sp, %sp, 0x20
|
||||
|
||||
end:
|
||||
#original instruction
|
||||
mr %r3, %r31
|
||||
blr
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
PADReadF:
|
||||
#only update player 1
|
||||
cmplwi r28, 0
|
||||
bne end
|
||||
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr r0
|
||||
stw r0, 0xC(%sp)
|
||||
|
||||
#to stub instead of arm
|
||||
lis r3, PadStub@h
|
||||
ori r3, r3, PadStub@l
|
||||
mtctr r3
|
||||
bctrl
|
||||
|
||||
lis r3, PadBuff@h
|
||||
ori r3, r3, PadBuff@l
|
||||
#store player data for ARM JVSIO.c
|
||||
dcbf 0, r3
|
||||
|
||||
lwz r0, 0xC(%sp)
|
||||
mtlr r0
|
||||
addi %sp, %sp, 0x20
|
||||
|
||||
end:
|
||||
#original instruction
|
||||
mr r3, r31
|
||||
blr
|
||||
|
@@ -1,28 +1,27 @@
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
PADReadGP:
|
||||
#original instruction
|
||||
mr %r31, %r3
|
||||
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr %r0
|
||||
stw %r0, 0xC(%sp)
|
||||
|
||||
#to stub instead of arm
|
||||
lis %r3, PadStub@h
|
||||
ori %r3, %r3, PadStub@l
|
||||
mtctr %r3
|
||||
bctrl
|
||||
|
||||
lis %r3, PadBuff@h
|
||||
ori %r3, %r3, PadBuff@l
|
||||
li %r0, 0
|
||||
#store player data for ARM JVSIO.c
|
||||
dcbf %r0, %r3
|
||||
|
||||
lwz %r0, 0xC(%sp)
|
||||
mtlr %r0
|
||||
|
||||
addi %sp, %sp, 0x20
|
||||
blr
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
PADReadGP:
|
||||
#original instruction
|
||||
mr r31, r3
|
||||
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr r0
|
||||
stw r0, 0xC(%sp)
|
||||
|
||||
#to stub instead of arm
|
||||
lis r3, PadStub@h
|
||||
ori r3, r3, PadStub@l
|
||||
mtctr r3
|
||||
bctrl
|
||||
|
||||
lis r3, PadBuff@h
|
||||
ori r3, r3, PadBuff@l
|
||||
#store player data for ARM JVSIO.c
|
||||
dcbf 0, r3
|
||||
|
||||
lwz r0, 0xC(%sp)
|
||||
mtlr r0
|
||||
|
||||
addi %sp, %sp, 0x20
|
||||
blr
|
||||
|
@@ -1,28 +1,27 @@
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
PADReadVS:
|
||||
#original instruction
|
||||
mr %r28, %r3
|
||||
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr %r0
|
||||
stw %r0, 0xC(%sp)
|
||||
|
||||
#to stub instead of arm
|
||||
lis %r3, PadStub@h
|
||||
ori %r3, %r3, PadStub@l
|
||||
mtctr %r3
|
||||
bctrl
|
||||
|
||||
lis %r3, PadBuff@h
|
||||
ori %r3, %r3, PadBuff@l
|
||||
li %r0, 0
|
||||
#store player data for ARM JVSIO.c
|
||||
dcbf %r0, %r3
|
||||
|
||||
lwz %r0, 0xC(%sp)
|
||||
mtlr %r0
|
||||
addi %sp, %sp, 0x20
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
PADReadVS:
|
||||
#original instruction
|
||||
mr r28, r3
|
||||
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr r0
|
||||
stw r0, 0xC(%sp)
|
||||
|
||||
#to stub instead of arm
|
||||
lis r3, PadStub@h
|
||||
ori r3, r3, PadStub@l
|
||||
mtctr r3
|
||||
bctrl
|
||||
|
||||
lis r3, PadBuff@h
|
||||
ori r3, r3, PadBuff@l
|
||||
#store player data for ARM JVSIO.c
|
||||
dcbf 0, r3
|
||||
|
||||
lwz r0, 0xC(%sp)
|
||||
mtlr r0
|
||||
addi %sp, %sp, 0x20
|
||||
|
||||
blr
|
||||
|
@@ -3,26 +3,25 @@
|
||||
|
||||
PADReadVS3:
|
||||
#original instruction
|
||||
mr %r27, %r3
|
||||
mr r27, r3
|
||||
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr %r0
|
||||
stw %r0, 0xC(%sp)
|
||||
mflr r0
|
||||
stw r0, 0xC(%sp)
|
||||
|
||||
#to stub instead of arm
|
||||
lis %r3, PadStub@h
|
||||
ori %r3, %r3, PadStub@l
|
||||
mtctr %r3
|
||||
lis r3, PadStub@h
|
||||
ori r3, r3, PadStub@l
|
||||
mtctr r3
|
||||
bctrl
|
||||
|
||||
lis %r3, PadBuff@h
|
||||
ori %r3, %r3, PadBuff@l
|
||||
li %r0, 0
|
||||
lis r3, PadBuff@h
|
||||
ori r3, r3, PadBuff@l
|
||||
#store player data for ARM JVSIO.c
|
||||
dcbf %r0, %r3
|
||||
dcbf 0, r3
|
||||
|
||||
lwz %r0, 0xC(%sp)
|
||||
mtlr %r0
|
||||
lwz r0, 0xC(%sp)
|
||||
mtlr r0
|
||||
addi %sp, %sp, 0x20
|
||||
|
||||
blr
|
||||
|
@@ -10,40 +10,39 @@
|
||||
#r5=Source
|
||||
|
||||
ReadROM:
|
||||
lis %r0, IPL_ROM_END_OFFSET@h
|
||||
ori %r0, %r0, IPL_ROM_END_OFFSET@l
|
||||
cmpw %r5, %r0
|
||||
lis r0, IPL_ROM_END_OFFSET@h
|
||||
ori r0, r0, IPL_ROM_END_OFFSET@l
|
||||
cmpw r5, r0
|
||||
bge exit
|
||||
lis %r0, IPL_ROM_FONT_SJIS@h
|
||||
ori %r0, %r0, IPL_ROM_FONT_SJIS@l
|
||||
cmpw %r5, %r0
|
||||
lis r0, IPL_ROM_FONT_SJIS@h
|
||||
ori r0, r0, IPL_ROM_FONT_SJIS@l
|
||||
cmpw r5, r0
|
||||
blt exit
|
||||
|
||||
sub %r5, %r5, %r0
|
||||
sub r5, r5, r0
|
||||
|
||||
lis %r6, FontBuf@h
|
||||
ori %r6, %r6, FontBuf@l
|
||||
add %r6, %r6, %r5
|
||||
lis r6, FontBuf@h
|
||||
ori r6, r6, FontBuf@l
|
||||
add r6, r6, r5
|
||||
|
||||
srwi %r0, %r4, 5
|
||||
mtctr %r0
|
||||
mr %r7, %r6
|
||||
srwi r0, r4, 5
|
||||
mtctr r0
|
||||
mr r7, r6
|
||||
|
||||
li %r0, 0
|
||||
DCInvalidateRange:
|
||||
dcbi %r0, %r7
|
||||
addi %r7, %r7, 0x20
|
||||
dcbi 0, r7
|
||||
addi r7, r7, 0x20
|
||||
bdnz DCInvalidateRange
|
||||
sync
|
||||
|
||||
memcpy32prep:
|
||||
li %r7, 0
|
||||
srwi %r0, %r4, 2
|
||||
mtctr %r0
|
||||
li r7, 0
|
||||
srwi r0, r4, 2
|
||||
mtctr r0
|
||||
memcpy32:
|
||||
lwzx %r0, %r6, %r7
|
||||
stwx %r0, %r3, %r7
|
||||
addi %r7, %r7, 4
|
||||
lwzx r0, r6, r7
|
||||
stwx r0, r3, r7
|
||||
addi r7, r7, 4
|
||||
bdnz memcpy32
|
||||
|
||||
exit:
|
||||
|
@@ -22,14 +22,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set AX_DEST, 0x803CF6F0
|
||||
|
||||
RestoreSettingsAX:
|
||||
lis %r3, AX_BACKUP@h
|
||||
ori %r3, %r3, AX_BACKUP@l
|
||||
lis %r4, AX_DEST@h
|
||||
ori %r4, %r4, AX_DEST@l
|
||||
li %r5, 0x2A
|
||||
lis r3, AX_BACKUP@h
|
||||
ori r3, r3, AX_BACKUP@l
|
||||
lis r4, AX_DEST@h
|
||||
ori r4, r4, AX_DEST@l
|
||||
li r5, 0x2A
|
||||
memcpy:
|
||||
subic. %r5, %r5, 1
|
||||
lbzx %r0, %r3, %r5
|
||||
stbx %r0, %r4, %r5
|
||||
subic. r5, r5, 1
|
||||
lbzx r0, r3, r5
|
||||
stbx r0, r4, r5
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -22,14 +22,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set AX_DEST, 0x803CFBD0
|
||||
|
||||
RestoreSettingsAX:
|
||||
lis %r3, AX_BACKUP@h
|
||||
ori %r3, %r3, AX_BACKUP@l
|
||||
lis %r4, AX_DEST@h
|
||||
ori %r4, %r4, AX_DEST@l
|
||||
li %r5, 0x2A
|
||||
lis r3, AX_BACKUP@h
|
||||
ori r3, r3, AX_BACKUP@l
|
||||
lis r4, AX_DEST@h
|
||||
ori r4, r4, AX_DEST@l
|
||||
li r5, 0x2A
|
||||
memcpy:
|
||||
subic. %r5, %r5, 1
|
||||
lbzx %r0, %r3, %r5
|
||||
stbx %r0, %r4, %r5
|
||||
subic. r5, r5, 1
|
||||
lbzx r0, r3, r5
|
||||
stbx r0, r4, r5
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -22,14 +22,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set AX_DEST, 0x803D0150
|
||||
|
||||
RestoreSettingsAX:
|
||||
lis %r3, AX_BACKUP@h
|
||||
ori %r3, %r3, AX_BACKUP@l
|
||||
lis %r4, AX_DEST@h
|
||||
ori %r4, %r4, AX_DEST@l
|
||||
li %r5, 0x2A
|
||||
lis r3, AX_BACKUP@h
|
||||
ori r3, r3, AX_BACKUP@l
|
||||
lis r4, AX_DEST@h
|
||||
ori r4, r4, AX_DEST@l
|
||||
li r5, 0x2A
|
||||
memcpy:
|
||||
subic. %r5, %r5, 1
|
||||
lbzx %r0, %r3, %r5
|
||||
stbx %r0, %r4, %r5
|
||||
subic. r5, r5, 1
|
||||
lbzx r0, r3, r5
|
||||
stbx r0, r4, r5
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -21,15 +21,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set VS3_BACKUP, 0xD3003500
|
||||
|
||||
RestoreSettingsVS:
|
||||
lis %r3, VS3_BACKUP@h
|
||||
ori %r3, %r3, VS3_BACKUP@l
|
||||
lwz %r4, -0xB1C(%r13)
|
||||
lwz %r5, -0x1408(%r13)
|
||||
li %r6, 0x12
|
||||
lis r3, VS3_BACKUP@h
|
||||
ori r3, r3, VS3_BACKUP@l
|
||||
lwz r4, -0xB1C(r13)
|
||||
lwz r5, -0x1408(r13)
|
||||
li r6, 0x12
|
||||
memcpy:
|
||||
subic. %r6, %r6, 1
|
||||
lbzx %r0, %r3, %r6
|
||||
stbx %r0, %r4, %r6
|
||||
stbx %r0, %r5, %r6
|
||||
subic. r6, r6, 1
|
||||
lbzx r0, r3, r6
|
||||
stbx r0, r4, r6
|
||||
stbx r0, r5, r6
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -21,15 +21,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set VS4_BACKUP, 0xD3003500
|
||||
|
||||
RestoreSettingsVS:
|
||||
lis %r3, VS4_BACKUP@h
|
||||
ori %r3, %r3, VS4_BACKUP@l
|
||||
lwz %r4, -0x2D44(%r13)
|
||||
lwz %r5, -0x2CA8(%r13)
|
||||
li %r6, 0x2B
|
||||
lis r3, VS4_BACKUP@h
|
||||
ori r3, r3, VS4_BACKUP@l
|
||||
lwz r4, -0x2D44(r13)
|
||||
lwz r5, -0x2CA8(r13)
|
||||
li r6, 0x2B
|
||||
memcpy:
|
||||
subic. %r6, %r6, 1
|
||||
lbzx %r0, %r3, %r6
|
||||
stbx %r0, %r4, %r6
|
||||
stbx %r0, %r5, %r6
|
||||
subic. r6, r6, 1
|
||||
lbzx r0, r3, r6
|
||||
stbx r0, r4, r6
|
||||
stbx r0, r5, r6
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -21,15 +21,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set VS4_BACKUP, 0xD3003500
|
||||
|
||||
RestoreSettingsVS:
|
||||
lis %r3, VS4_BACKUP@h
|
||||
ori %r3, %r3, VS4_BACKUP@l
|
||||
lwz %r4, -0x14C4(%r13)
|
||||
lwz %r5, -0x1428(%r13)
|
||||
li %r6, 0x2B
|
||||
lis r3, VS4_BACKUP@h
|
||||
ori r3, r3, VS4_BACKUP@l
|
||||
lwz r4, -0x14C4(r13)
|
||||
lwz r5, -0x1428(r13)
|
||||
li r6, 0x2B
|
||||
memcpy:
|
||||
subic. %r6, %r6, 1
|
||||
lbzx %r0, %r3, %r6
|
||||
stbx %r0, %r4, %r6
|
||||
stbx %r0, %r5, %r6
|
||||
subic. r6, r6, 1
|
||||
lbzx r0, r3, r6
|
||||
stbx r0, r4, r6
|
||||
stbx r0, r5, r6
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -21,15 +21,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set VS4_BACKUP, 0xD3003500
|
||||
|
||||
RestoreSettingsVS:
|
||||
lis %r3, VS4_BACKUP@h
|
||||
ori %r3, %r3, VS4_BACKUP@l
|
||||
lwz %r4, -0xEE4(%r13)
|
||||
lwz %r5, -0xE40(%r13)
|
||||
li %r6, 0x2B
|
||||
lis r3, VS4_BACKUP@h
|
||||
ori r3, r3, VS4_BACKUP@l
|
||||
lwz r4, -0xEE4(r13)
|
||||
lwz r5, -0xE40(r13)
|
||||
li r6, 0x2B
|
||||
memcpy:
|
||||
subic. %r6, %r6, 1
|
||||
lbzx %r0, %r3, %r6
|
||||
stbx %r0, %r4, %r6
|
||||
stbx %r0, %r5, %r6
|
||||
subic. r6, r6, 1
|
||||
lbzx r0, r3, r6
|
||||
stbx r0, r4, r6
|
||||
stbx r0, r5, r6
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -21,15 +21,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set VS4_BACKUP, 0xD3003500
|
||||
|
||||
RestoreSettingsVS:
|
||||
lis %r3, VS4_BACKUP@h
|
||||
ori %r3, %r3, VS4_BACKUP@l
|
||||
lwz %r4, -0xCDC(%r13)
|
||||
lwz %r5, -0xC38(%r13)
|
||||
li %r6, 0x2E
|
||||
lis r3, VS4_BACKUP@h
|
||||
ori r3, r3, VS4_BACKUP@l
|
||||
lwz r4, -0xCDC(r13)
|
||||
lwz r5, -0xC38(r13)
|
||||
li r6, 0x2E
|
||||
memcpy:
|
||||
subic. %r6, %r6, 1
|
||||
lbzx %r0, %r3, %r6
|
||||
stbx %r0, %r4, %r6
|
||||
stbx %r0, %r5, %r6
|
||||
subic. r6, r6, 1
|
||||
lbzx r0, r3, r6
|
||||
stbx r0, r4, r6
|
||||
stbx r0, r5, r6
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -22,14 +22,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set YAK_DEST, (0x803D3D0C+0xE8)
|
||||
|
||||
RestoreSettingsYAKRVB:
|
||||
lis %r3, YAK_BACKUP@h
|
||||
ori %r3, %r3, YAK_BACKUP@l
|
||||
lis %r4, YAK_DEST@h
|
||||
ori %r4, %r4, YAK_DEST@l
|
||||
li %r5, (0xF5-0xE8)
|
||||
lis r3, YAK_BACKUP@h
|
||||
ori r3, r3, YAK_BACKUP@l
|
||||
lis r4, YAK_DEST@h
|
||||
ori r4, r4, YAK_DEST@l
|
||||
li r5, (0xF5-0xE8)
|
||||
memcpy:
|
||||
subic. %r5, %r5, 1
|
||||
lbzx %r0, %r3, %r5
|
||||
stbx %r0, %r4, %r5
|
||||
subic. r5, r5, 1
|
||||
lbzx r0, r3, r5
|
||||
stbx r0, r4, r5
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -22,14 +22,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
.set YAK_DEST, (0x803D67AC+0xE8)
|
||||
|
||||
RestoreSettingsYAKRVB:
|
||||
lis %r3, YAK_BACKUP@h
|
||||
ori %r3, %r3, YAK_BACKUP@l
|
||||
lis %r4, YAK_DEST@h
|
||||
ori %r4, %r4, YAK_DEST@l
|
||||
li %r5, (0x100-0xE8)
|
||||
lis r3, YAK_BACKUP@h
|
||||
ori r3, r3, YAK_BACKUP@l
|
||||
lis r4, YAK_DEST@h
|
||||
ori r4, r4, YAK_DEST@l
|
||||
li r5, (0x100-0xE8)
|
||||
memcpy:
|
||||
subic. %r5, %r5, 1
|
||||
lbzx %r0, %r3, %r5
|
||||
stbx %r0, %r4, %r5
|
||||
subic. r5, r5, 1
|
||||
lbzx r0, r3, r5
|
||||
stbx r0, r4, r5
|
||||
bne memcpy
|
||||
blr
|
||||
|
@@ -1,32 +1,31 @@
|
||||
#include <asm.h>
|
||||
|
||||
.set SI_GC_CONTROLLER, 0x09000000
|
||||
.set SI_ERROR_NO_RESPONSE, 0x08
|
||||
.set PAD_USED_BASE, 0x93003020
|
||||
|
||||
#
|
||||
#
|
||||
# r3 channel
|
||||
|
||||
SIGetType:
|
||||
lis %r4, PAD_USED_BASE@h
|
||||
ori %r4, %r4, PAD_USED_BASE@l
|
||||
|
||||
li %r0, 0
|
||||
DCInvalidateRange:
|
||||
dcbi %r0, %r4
|
||||
sync
|
||||
|
||||
lwz %r0, 4(%r4)
|
||||
li %r4, 1
|
||||
slw %r4, %r4, %r3
|
||||
and %r4, %r0, %r4
|
||||
cmpwi %r4, 0
|
||||
beq NoPad
|
||||
|
||||
lis %r3, SI_GC_CONTROLLER@h
|
||||
blr
|
||||
|
||||
NoPad:
|
||||
li %r3, SI_ERROR_NO_RESPONSE@l
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
.set SI_GC_CONTROLLER, 0x09000000
|
||||
.set SI_ERROR_NO_RESPONSE, 0x08
|
||||
.set PAD_USED_BASE, 0x93003020
|
||||
|
||||
#
|
||||
#
|
||||
# r3 channel
|
||||
|
||||
SIGetType:
|
||||
lis r4, PAD_USED_BASE@h
|
||||
ori r4, r4, PAD_USED_BASE@l
|
||||
|
||||
DCInvalidateRange:
|
||||
dcbi 0, r4
|
||||
sync
|
||||
|
||||
lwz r0, 4(r4)
|
||||
li r4, 1
|
||||
slw r4, r4, r3
|
||||
and r4, r0, r4
|
||||
cmpwi r4, 0
|
||||
beq NoPad
|
||||
|
||||
lis r3, SI_GC_CONTROLLER@h
|
||||
blr
|
||||
|
||||
NoPad:
|
||||
li r3, SI_ERROR_NO_RESPONSE@l
|
||||
blr
|
||||
|
@@ -3,10 +3,10 @@
|
||||
.set SI_INITED, 0x93003060
|
||||
|
||||
SIInitStore:
|
||||
lis %r5, SI_INITED@h
|
||||
li %r4, 1
|
||||
stwu %r4, SI_INITED@l(%r5)
|
||||
li %r4, 0
|
||||
dcbf %r4, %r5
|
||||
lis r5, SI_INITED@h
|
||||
li r4, 1
|
||||
stwu r4, SI_INITED@l(r5)
|
||||
li r4, 0
|
||||
dcbf r4, r5
|
||||
sync
|
||||
blr
|
||||
|
@@ -1,12 +1,12 @@
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
SIIntrruptHandler:
|
||||
#original instruction
|
||||
stw %r0, 4(%sp)
|
||||
|
||||
li %r0, 0
|
||||
lis %r8, INT_BASE@h
|
||||
stw %r0, SI_INT@l(%r8)
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
SIIntrruptHandler:
|
||||
#original instruction
|
||||
stw r0, 4(%sp)
|
||||
|
||||
li r0, 0
|
||||
lis r8, INT_BASE@h
|
||||
stw r0, SI_INT@l(r8)
|
||||
|
||||
blr
|
||||
|
@@ -1,116 +1,114 @@
|
||||
#include <asm.h>
|
||||
|
||||
# issue read command
|
||||
#
|
||||
# r3 channel
|
||||
# r4 inData
|
||||
# r5 inLen
|
||||
# r6 outData
|
||||
# r7 outLen
|
||||
# r8 cb
|
||||
# r9 0?
|
||||
# r10 timeout?
|
||||
|
||||
|
||||
SITransfer:
|
||||
|
||||
mflr %r0
|
||||
stw %r0, 4(%sp)
|
||||
stwu %sp, -0x60(%sp)
|
||||
stmw %r19, 0x2C(%sp)
|
||||
|
||||
mr %r19, %r3
|
||||
mr %r10, %r4
|
||||
bl OSDisableInterrupts
|
||||
|
||||
mr %r21, %r3
|
||||
mr %r4, %r10
|
||||
|
||||
lis %r9, 0xD302
|
||||
lis %r0, 0x5000
|
||||
or %r0, %r0, %r19
|
||||
|
||||
stw %r0, 0x6100(%r9)
|
||||
|
||||
stw %r4, 0x6104(%r9)
|
||||
stw %r5, 0x6108(%r9)
|
||||
stw %r6, 0x610C(%r9)
|
||||
stw %r7, 0x6110(%r9)
|
||||
|
||||
#flush DataIn
|
||||
clrrwi %r3, %r4, 5
|
||||
subf %r4, %r3, %r4
|
||||
add %r4, %r4, %r5
|
||||
addi %r4, %r4, 0x1F
|
||||
srwi %r4, %r4, 5
|
||||
mtctr %r4
|
||||
|
||||
li %r0, 0
|
||||
DCFlushRange:
|
||||
dcbf %r0, %r3
|
||||
addi %r3, %r3, 0x20
|
||||
bdnz DCFlushRange
|
||||
sync
|
||||
|
||||
li %r0, 3
|
||||
stw %r0, 0x6118(%r9)
|
||||
|
||||
ready_loop:
|
||||
lwz %r0, 0x6118(%r9)
|
||||
cmpwi %r0, 3
|
||||
beq ready_loop
|
||||
|
||||
#invalidate DataOut
|
||||
clrrwi %r3, %r6, 5
|
||||
subf %r4, %r3, %r6
|
||||
add %r4, %r4, %r7
|
||||
addi %r4, %r4, 0x1F
|
||||
srwi %r4, %r4, 5
|
||||
mtctr %r4
|
||||
|
||||
li %r0, 0
|
||||
DCInvalidateRange:
|
||||
dcbi %r0, %r3
|
||||
addi %r3, %r3, 0x20
|
||||
bdnz DCInvalidateRange
|
||||
sync
|
||||
|
||||
cmpwi %r8, 0
|
||||
beq skip_cb
|
||||
mtctr %r8
|
||||
li %r3, 0
|
||||
li %r4, 0
|
||||
bctrl
|
||||
|
||||
skip_cb:
|
||||
|
||||
mr %r3, %r21
|
||||
bl OSRestoreInterrupts
|
||||
|
||||
li %r3, 1
|
||||
|
||||
lmw %r19, 0x2C(%sp)
|
||||
lwz %r0, 0x64(%sp)
|
||||
addi %sp, %sp, 0x60
|
||||
mtlr %r0
|
||||
blr
|
||||
|
||||
OSDisableInterrupts:
|
||||
mfmsr %r3
|
||||
rlwinm %r4, %r3, 0,17,15
|
||||
mtmsr %r4
|
||||
extrwi %r3, %r3, 1,16
|
||||
blr
|
||||
|
||||
OSRestoreInterrupts:
|
||||
cmpwi %r3, 0
|
||||
mfmsr %r4
|
||||
beq loc_8001EA58
|
||||
ori %r5, %r4, 0x8000
|
||||
b loc_8001EA5C
|
||||
loc_8001EA58:
|
||||
rlwinm %r5, %r4, 0,17,15
|
||||
loc_8001EA5C:
|
||||
mtmsr %r5
|
||||
extrwi %r3, %r4, 1,16
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
# issue read command
|
||||
#
|
||||
# r3 channel
|
||||
# r4 inData
|
||||
# r5 inLen
|
||||
# r6 outData
|
||||
# r7 outLen
|
||||
# r8 cb
|
||||
# r9 0?
|
||||
# r10 timeout?
|
||||
|
||||
|
||||
SITransfer:
|
||||
|
||||
mflr r0
|
||||
stw r0, 4(%sp)
|
||||
stwu %sp, -0x60(%sp)
|
||||
stmw r19, 0x2C(%sp)
|
||||
|
||||
mr r19, r3
|
||||
mr r10, r4
|
||||
bl OSDisableInterrupts
|
||||
|
||||
mr r21, r3
|
||||
mr r4, r10
|
||||
|
||||
lis r9, 0xD302
|
||||
lis r0, 0x5000
|
||||
or r0, r0, r19
|
||||
|
||||
stw r0, 0x6100(r9)
|
||||
|
||||
stw r4, 0x6104(r9)
|
||||
stw r5, 0x6108(r9)
|
||||
stw r6, 0x610C(r9)
|
||||
stw r7, 0x6110(r9)
|
||||
|
||||
#flush DataIn
|
||||
clrrwi r3, r4, 5
|
||||
subf r4, r3, r4
|
||||
add r4, r4, r5
|
||||
addi r4, r4, 0x1F
|
||||
srwi r4, r4, 5
|
||||
mtctr r4
|
||||
|
||||
DCFlushRange:
|
||||
dcbf 0, r3
|
||||
addi r3, r3, 0x20
|
||||
bdnz DCFlushRange
|
||||
sync
|
||||
|
||||
li r0, 3
|
||||
stw r0, 0x6118(r9)
|
||||
|
||||
ready_loop:
|
||||
lwz r0, 0x6118(r9)
|
||||
cmpwi r0, 3
|
||||
beq ready_loop
|
||||
|
||||
#invalidate DataOut
|
||||
clrrwi r3, r6, 5
|
||||
subf r4, r3, r6
|
||||
add r4, r4, r7
|
||||
addi r4, r4, 0x1F
|
||||
srwi r4, r4, 5
|
||||
mtctr r4
|
||||
|
||||
DCInvalidateRange:
|
||||
dcbi 0, r3
|
||||
addi r3, r3, 0x20
|
||||
bdnz DCInvalidateRange
|
||||
sync
|
||||
|
||||
cmpwi r8, 0
|
||||
beq skip_cb
|
||||
mtctr r8
|
||||
li r3, 0
|
||||
li r4, 0
|
||||
bctrl
|
||||
|
||||
skip_cb:
|
||||
|
||||
mr r3, r21
|
||||
bl OSRestoreInterrupts
|
||||
|
||||
li r3, 1
|
||||
|
||||
lmw r19, 0x2C(%sp)
|
||||
lwz r0, 0x64(%sp)
|
||||
addi %sp, %sp, 0x60
|
||||
mtlr r0
|
||||
blr
|
||||
|
||||
OSDisableInterrupts:
|
||||
mfmsr r3
|
||||
rlwinm r4, r3, 0,17,15
|
||||
mtmsr r4
|
||||
extrwi r3, r3, 1,16
|
||||
blr
|
||||
|
||||
OSRestoreInterrupts:
|
||||
cmpwi r3, 0
|
||||
mfmsr r4
|
||||
beq loc_8001EA58
|
||||
ori r5, r4, 0x8000
|
||||
b loc_8001EA5C
|
||||
loc_8001EA58:
|
||||
rlwinm r5, r4, 0,17,15
|
||||
loc_8001EA5C:
|
||||
mtmsr r5
|
||||
extrwi r3, r4, 1,16
|
||||
blr
|
||||
|
@@ -4,11 +4,11 @@
|
||||
|
||||
SonicRidersCopy:
|
||||
#original instruction
|
||||
mr %r31, %r7
|
||||
mr r31, r7
|
||||
#7 might be enough too, going safe
|
||||
slwi %r5, %r5, 8
|
||||
slwi r5, r5, 8
|
||||
waitLoop:
|
||||
subi %r5, %r5, 1
|
||||
cmplwi %r5, 0
|
||||
subi r5, r5, 1
|
||||
cmplwi r5, 0
|
||||
bne waitLoop
|
||||
blr
|
||||
|
@@ -4,24 +4,24 @@
|
||||
.set PRS_EXTRACT, 0xD31C0020
|
||||
|
||||
SwitcherPrs:
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr %r0
|
||||
stw %r0, 8(%sp)
|
||||
stw %r31, 0x10(%sp)
|
||||
|
||||
lis %r31, PRS_EXTRACT@h
|
||||
lwz %r0, PRS_EXTRACT@l(%r31) #offset saved from Patch.c
|
||||
mtlr %r0
|
||||
|
||||
blrl #extracts switcher
|
||||
|
||||
lis %r31, PRS_DOL@h
|
||||
lwz %r0, PRS_DOL@l(%r31) #FakeEntryLoad
|
||||
stw %r0, 0xE0(%r28) #modify dol entry
|
||||
|
||||
lwz %r31, 0x10(%sp)
|
||||
lwz %r0, 8(%sp)
|
||||
mtlr %r0
|
||||
addi %sp, %sp, 0x20
|
||||
|
||||
blr
|
||||
stwu %sp, -0x20(%sp)
|
||||
mflr r0
|
||||
stw r0, 8(%sp)
|
||||
stw r31, 0x10(%sp)
|
||||
|
||||
lis r31, PRS_EXTRACT@h
|
||||
lwz r0, PRS_EXTRACT@l(r31) #offset saved from Patch.c
|
||||
mtlr r0
|
||||
|
||||
blrl #extracts switcher
|
||||
|
||||
lis r31, PRS_DOL@h
|
||||
lwz r0, PRS_DOL@l(r31) #FakeEntryLoad
|
||||
stw r0, 0xE0(r28) #modify dol entry
|
||||
|
||||
lwz r31, 0x10(%sp)
|
||||
lwz r0, 8(%sp)
|
||||
mtlr r0
|
||||
addi %sp, %sp, 0x20
|
||||
|
||||
blr
|
||||
|
@@ -1,12 +1,12 @@
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
TCIntrruptHandler:
|
||||
#original instruction
|
||||
stw %r0, 4(%sp)
|
||||
|
||||
li %r0, 0
|
||||
lis %r8, INT_BASE@h
|
||||
stw %r0, EXI_INT@l(%r8)
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
.include "constants.inc"
|
||||
|
||||
TCIntrruptHandler:
|
||||
#original instruction
|
||||
stw r0, 4(%sp)
|
||||
|
||||
li r0, 0
|
||||
lis r8, INT_BASE@h
|
||||
stw r0, EXI_INT@l(r8)
|
||||
|
||||
blr
|
||||
|
@@ -8,85 +8,84 @@
|
||||
.set AR_DMA_LEN, 0x931C004C
|
||||
|
||||
__ARHandler:
|
||||
lis %r3, AR_DMA_MODE@h
|
||||
lwz %r6, AR_DMA_LEN@l(%r3)
|
||||
li %r7, 0
|
||||
stw %r7, AR_DMA_LEN@l(%r3)
|
||||
lis r3, AR_DMA_MODE@h
|
||||
lwz r6, AR_DMA_LEN@l(r3)
|
||||
li r7, 0
|
||||
stw r7, AR_DMA_LEN@l(r3)
|
||||
|
||||
#adjust ARAM address for safety
|
||||
lwz %r5, AR_DMA_MEM2@l(%r3)
|
||||
rlwinm %r5, %r5, 0, 6, 26 # 0x03ffffe0
|
||||
oris %r5, %r5, 0x9000
|
||||
lwz r5, AR_DMA_MEM2@l(r3)
|
||||
rlwinm r5, r5, 0, 6, 26 # 0x03ffffe0
|
||||
oris r5, r5, 0x9000
|
||||
|
||||
#add length onto ARAM address to see max
|
||||
add %r0, %r5, %r6
|
||||
add r0, r5, r6
|
||||
#ARAM Max Address to ensure no overwriting
|
||||
lis %r7, 0x9100
|
||||
cmplw %r0, %r7
|
||||
lis r7, 0x9100
|
||||
cmplw r0, r7
|
||||
#Fine as is, continue
|
||||
ble checkLength
|
||||
#Use in-bounds area as new length
|
||||
subf %r6, %r5, %r7
|
||||
subf r6, r5, r7
|
||||
checkLength:
|
||||
#make sure there is any input length
|
||||
cmpwi %r6, 0
|
||||
cmpwi r6, 0
|
||||
ble end
|
||||
|
||||
#adjust MEM1 address for safety
|
||||
lwz %r4, AR_DMA_MEM1@l(%r3)
|
||||
rlwinm %r4, %r4, 0, 7, 26 # 0x01ffffe0
|
||||
oris %r4, %r4, 0x8000
|
||||
lwz r4, AR_DMA_MEM1@l(r3)
|
||||
rlwinm r4, r4, 0, 7, 26 # 0x01ffffe0
|
||||
oris r4, r4, 0x8000
|
||||
|
||||
lwz %r0, AR_DMA_MODE@l(%r3)
|
||||
cmpwi %r0, AR_MRAM_TO_ARAM
|
||||
lwz r0, AR_DMA_MODE@l(r3)
|
||||
cmpwi r0, AR_MRAM_TO_ARAM
|
||||
beq memcpy32prep
|
||||
|
||||
ARAM_TO_MRAM:
|
||||
mr %r0, %r4
|
||||
mr %r4, %r5
|
||||
mr %r5, %r0
|
||||
mr r0, r4
|
||||
mr r4, r5
|
||||
mr r5, r0
|
||||
|
||||
memcpy32prep:
|
||||
li %r7, 0
|
||||
cmplwi %r6, 3
|
||||
li r7, 0
|
||||
cmplwi r6, 3
|
||||
ble memcpy16prep
|
||||
srwi %r0, %r6, 2 #32bit
|
||||
mtctr %r0
|
||||
srwi r0, r6, 2 #32bit
|
||||
mtctr r0
|
||||
memcpy32:
|
||||
lwzx %r0, %r4, %r7
|
||||
stwx %r0, %r5, %r7
|
||||
addi %r7, %r7, 4
|
||||
lwzx r0, r4, r7
|
||||
stwx r0, r5, r7
|
||||
addi r7, r7, 4
|
||||
bdnz memcpy32
|
||||
|
||||
memcpy16prep:
|
||||
subf %r0, %r7, %r6
|
||||
cmpwi %r0, 1
|
||||
subf r0, r7, r6
|
||||
cmpwi r0, 1
|
||||
ble memcpy8prep
|
||||
memcpy16:
|
||||
lhzx %r0, %r4, %r7
|
||||
sthx %r0, %r5, %r7
|
||||
addi %r7, %r7, 2
|
||||
lhzx r0, r4, r7
|
||||
sthx r0, r5, r7
|
||||
addi r7, r7, 2
|
||||
|
||||
memcpy8prep:
|
||||
subf %r0, %r7, %r6
|
||||
cmpwi %r0, 0
|
||||
subf r0, r7, r6
|
||||
cmpwi r0, 0
|
||||
ble DCStoreRangePrep
|
||||
memcpy8:
|
||||
lbzx %r0, %r4, %r7
|
||||
stbx %r0, %r5, %r7
|
||||
lbzx r0, r4, r7
|
||||
stbx r0, r5, r7
|
||||
|
||||
DCStoreRangePrep:
|
||||
addi %r0, %r6, 0x1F
|
||||
srwi %r0, %r0, 5
|
||||
mtctr %r0
|
||||
addi r0, r6, 0x1F
|
||||
srwi r0, r0, 5
|
||||
mtctr r0
|
||||
|
||||
li %r0, 0
|
||||
DCStoreRange:
|
||||
dcbst %r0, %r5
|
||||
addi %r5, %r5, 0x20
|
||||
dcbst 0, r5
|
||||
addi r5, r5, 0x20
|
||||
bdnz DCStoreRange
|
||||
sync
|
||||
|
||||
end:
|
||||
cmplwi %r12, 0
|
||||
cmplwi r12, 0
|
||||
blr
|
||||
|
@@ -1,11 +1,11 @@
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
__CARDClearStatus:
|
||||
li %r3, 0
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
__CARDClearStatus:
|
||||
li r3, 0
|
||||
blr
|
||||
|
@@ -1,17 +1,17 @@
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
# r4 Status buffer (byte)
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
__CARDReadStatus:
|
||||
|
||||
li %r3, 0x41 # unlock | ready
|
||||
stb %r3, 0x0(%r4)
|
||||
|
||||
li %r3, 0
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
#in
|
||||
# r3 channel
|
||||
# r4 Status buffer (byte)
|
||||
|
||||
#out
|
||||
# r3 res
|
||||
|
||||
__CARDReadStatus:
|
||||
|
||||
li r3, 0x41 # unlock | ready
|
||||
stb r3, 0x0(r4)
|
||||
|
||||
li r3, 0
|
||||
|
||||
blr
|
||||
|
@@ -33,164 +33,161 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#note:r3 and r12 will get overwritten, safe to use
|
||||
|
||||
__DSPHandler:
|
||||
lis %r12, STREAMING@h
|
||||
lwz %r3, STREAMING@l(%r12)
|
||||
lis %r12, AI_CR@h
|
||||
lwz %r12, AI_CR@l(%r12)
|
||||
and. %r3, %r3, %r12
|
||||
lis r12, STREAMING@h
|
||||
lwz r3, STREAMING@l(r12)
|
||||
lis r12, AI_CR@h
|
||||
lwz r12, AI_CR@l(r12)
|
||||
and. r3, r3, r12
|
||||
bne startcp
|
||||
cmpwi %r0, 0
|
||||
cmpwi r0, 0
|
||||
blr
|
||||
|
||||
startcp:
|
||||
stwu %r1, -0x20(%r1)
|
||||
stw %r4, 0x0(%r1)
|
||||
stw %r5, 0x4(%r1)
|
||||
stw %r6, 0x8(%r1)
|
||||
stw %r7, 0xC(%r1)
|
||||
stw %r8, 0x10(%r1)
|
||||
stw %r9, 0x14(%r1)
|
||||
stw %r0, 0x18(%r1)
|
||||
mflr %r0
|
||||
stw %r0, 0x1C(%r1)
|
||||
stwu r1, -0x20(r1)
|
||||
stw r4, 0x0(r1)
|
||||
stw r5, 0x4(r1)
|
||||
stw r6, 0x8(r1)
|
||||
stw r7, 0xC(r1)
|
||||
stw r8, 0x10(r1)
|
||||
stw r9, 0x14(r1)
|
||||
stw r0, 0x18(r1)
|
||||
mflr r0
|
||||
stw r0, 0x1C(r1)
|
||||
|
||||
#extract from AI directly
|
||||
lis %r12, AI_DMA_ADDR@h
|
||||
lwz %r9, AI_DMA_ADDR@l(%r12)
|
||||
rlwinm %r9, %r9, 0, 7, 26 # 0x01ffffe0
|
||||
oris %r9, %r9, 0x8000
|
||||
lhz %r8, AI_DMA_SIZE@l(%r12)
|
||||
rlwinm %r8, %r8, 5, 12, 31 # 0x000fffe0
|
||||
lis r12, AI_DMA_ADDR@h
|
||||
lwz r9, AI_DMA_ADDR@l(r12)
|
||||
rlwinm r9, r9, 0, 7, 26 # 0x01ffffe0
|
||||
oris r9, r9, 0x8000
|
||||
lhz r8, AI_DMA_SIZE@l(r12)
|
||||
rlwinm r8, r8, 5, 12, 31 # 0x000fffe0
|
||||
|
||||
lis %r12, AI_ADP_LOC@h
|
||||
lwz %r4, AI_ADP_LOC@l(%r12)
|
||||
li %r3, 0xC40
|
||||
slwi %r3, %r3, 4 #BUFSIZE=0xC400
|
||||
cmplw %r4, %r3
|
||||
lis r12, AI_ADP_LOC@h
|
||||
lwz r4, AI_ADP_LOC@l(r12)
|
||||
li r3, 0xC40
|
||||
slwi r3, r3, 4 #BUFSIZE=0xC400
|
||||
cmplw r4, r3
|
||||
blt buf1
|
||||
buf2:
|
||||
slwi %r3, %r3, 1 #MAXBUF=0x18800
|
||||
slwi r3, r3, 1 #MAXBUF=0x18800
|
||||
buf1:
|
||||
lis %r6, AI_ADP_BUF@h
|
||||
lis r6, AI_ADP_BUF@h
|
||||
|
||||
srwi %r7, %r8, 5
|
||||
mtctr %r7
|
||||
mr %r5, %r6
|
||||
add %r5, %r5, %r4
|
||||
li %r0, 0
|
||||
srwi r7, r8, 5
|
||||
mtctr r7
|
||||
mr r5, r6
|
||||
add r5, r5, r4
|
||||
DCInvalidateRange1:
|
||||
dcbi %r0, %r5
|
||||
addi %r5, %r5, 0x20
|
||||
dcbi 0, r5
|
||||
addi r5, r5, 0x20
|
||||
bdnz DCInvalidateRange1
|
||||
|
||||
li %r5, 0
|
||||
li r5, 0
|
||||
startcopy:
|
||||
lis %r12, AI_VR@h
|
||||
lis r12, AI_VR@h
|
||||
#left audiostream
|
||||
lhax %r0, %r6, %r4
|
||||
lhax r0, r6, r4
|
||||
#calc volume
|
||||
lwz %r7, AI_VR@l(%r12)
|
||||
clrlwi %r7, %r7, 24
|
||||
mullw %r0, %r7, %r0
|
||||
srawi %r0, %r0, 8
|
||||
lwz r7, AI_VR@l(r12)
|
||||
clrlwi r7, r7, 24
|
||||
mullw r0, r7, r0
|
||||
srawi r0, r0, 8
|
||||
#left original
|
||||
lhax %r7, %r9, %r5
|
||||
lhax r7, r9, r5
|
||||
#combine streams
|
||||
bl combinebuffer
|
||||
#save new stream
|
||||
sthx %r7, %r9, %r5
|
||||
sthx r7, r9, r5
|
||||
|
||||
addi %r4, %r4, 2
|
||||
addi %r5, %r5, 2
|
||||
addi r4, r4, 2
|
||||
addi r5, r5, 2
|
||||
|
||||
#right audiostream
|
||||
lhax %r0, %r6, %r4
|
||||
lhax r0, r6, r4
|
||||
#calc volume
|
||||
lwz %r7, AI_VR@l(%r12)
|
||||
extrwi %r7, %r7, 8, 16
|
||||
mullw %r0, %r7, %r0
|
||||
srawi %r0, %r0, 8
|
||||
lwz r7, AI_VR@l(r12)
|
||||
extrwi r7, r7, 8, 16
|
||||
mullw r0, r7, r0
|
||||
srawi r0, r0, 8
|
||||
#right original
|
||||
lhax %r7, %r9, %r5
|
||||
lhax r7, r9, r5
|
||||
#combine streams
|
||||
bl combinebuffer
|
||||
#save new stream
|
||||
sthx %r7, %r9, %r5
|
||||
sthx r7, r9, r5
|
||||
|
||||
addi %r4, %r4, 2
|
||||
addi %r5, %r5, 2
|
||||
addi r4, r4, 2
|
||||
addi r5, r5, 2
|
||||
|
||||
cmplw %r4, %r3
|
||||
cmplw r4, r3
|
||||
beq changebuffer
|
||||
copy2:
|
||||
cmplw %r5, %r8
|
||||
cmplw r5, r8
|
||||
blt startcopy
|
||||
|
||||
srwi %r7, %r8, 5
|
||||
mtctr %r7
|
||||
mr %r5, %r9
|
||||
li %r0, 0
|
||||
srwi r7, r8, 5
|
||||
mtctr r7
|
||||
mr r5, r9
|
||||
DCFlushRange:
|
||||
dcbf %r0, %r5
|
||||
addi %r5, %r5, 0x20
|
||||
dcbf 0, r5
|
||||
addi r5, r5, 0x20
|
||||
bdnz DCFlushRange
|
||||
|
||||
exit:
|
||||
lis %r12, AI_ADP_LOC@h
|
||||
stw %r4, AI_ADP_LOC@l(%r12)
|
||||
lis r12, AI_ADP_LOC@h
|
||||
stw r4, AI_ADP_LOC@l(r12)
|
||||
|
||||
lwz %r0, 0x1C(%r1)
|
||||
mtlr %r0
|
||||
lwz %r4, 0x0(%r1)
|
||||
lwz %r5, 0x4(%r1)
|
||||
lwz %r6, 0x8(%r1)
|
||||
lwz %r7, 0xC(%r1)
|
||||
lwz %r8, 0x10(%r1)
|
||||
lwz %r9, 0x14(%r1)
|
||||
lwz %r0, 0x18(%r1)
|
||||
cmpwi %r0, 0
|
||||
addi %r1, %r1, 0x20
|
||||
lwz r0, 0x1C(r1)
|
||||
mtlr r0
|
||||
lwz r4, 0x0(r1)
|
||||
lwz r5, 0x4(r1)
|
||||
lwz r6, 0x8(r1)
|
||||
lwz r7, 0xC(r1)
|
||||
lwz r8, 0x10(r1)
|
||||
lwz r9, 0x14(r1)
|
||||
lwz r0, 0x18(r1)
|
||||
cmpwi r0, 0
|
||||
addi r1, r1, 0x20
|
||||
blr
|
||||
|
||||
changebuffer:
|
||||
li %r0, 1
|
||||
lis %r12, UPDATE_STREAM@h
|
||||
stw %r0, UPDATE_STREAM@l(%r12)
|
||||
li %r0, 0xC40
|
||||
slwi %r0, %r0, 4 #BUFSIZE=0xC400
|
||||
cmplw %r4, %r0
|
||||
li r0, 1
|
||||
lis r12, UPDATE_STREAM@h
|
||||
stw r0, UPDATE_STREAM@l(r12)
|
||||
li r0, 0xC40
|
||||
slwi r0, r0, 4 #BUFSIZE=0xC400
|
||||
cmplw r4, r0
|
||||
beq copy2
|
||||
cmplw %r5, %r8
|
||||
cmplw r5, r8
|
||||
beq resetbuffer #no need to invalidate if we are done anyways
|
||||
#invalidate buffer one
|
||||
sub %r7, %r8, %r5
|
||||
srwi %r7, %r7, 5
|
||||
mtctr %r7
|
||||
mr %r7, %r6
|
||||
li %r0, 0
|
||||
sub r7, r8, r5
|
||||
srwi r7, r7, 5
|
||||
mtctr r7
|
||||
mr r7, r6
|
||||
DCInvalidateRange3:
|
||||
dcbi %r0, %r7
|
||||
addi %r7, %r7, 0x20
|
||||
dcbi 0, r7
|
||||
addi r7, r7, 0x20
|
||||
bdnz DCInvalidateRange3
|
||||
resetbuffer:
|
||||
li %r4, 0
|
||||
li r4, 0
|
||||
b copy2
|
||||
|
||||
#the most simple linear compressor I could come up with
|
||||
combinebuffer:
|
||||
add %r7, %r7, %r0
|
||||
cmpwi %r7, 0x4CCC
|
||||
add r7, r7, r0
|
||||
cmpwi r7, 0x4CCC
|
||||
bgt compressPos
|
||||
cmpwi %r7, -0x4CCC
|
||||
cmpwi r7, -0x4CCC
|
||||
blt compressNeg
|
||||
blr
|
||||
compressPos:
|
||||
subi %r7, %r7, 0x4CCC
|
||||
srawi %r7, %r7, 2
|
||||
addi %r7, %r7, 0x4CCC
|
||||
subi r7, r7, 0x4CCC
|
||||
srawi r7, r7, 2
|
||||
addi r7, r7, 0x4CCC
|
||||
blr
|
||||
compressNeg:
|
||||
addi %r7, %r7, 0x4CCC
|
||||
srawi %r7, %r7, 2
|
||||
subi %r7, %r7, 0x4CCC
|
||||
addi r7, r7, 0x4CCC
|
||||
srawi r7, r7, 2
|
||||
subi r7, r7, 0x4CCC
|
||||
blr
|
||||
|
@@ -1,37 +1,37 @@
|
||||
#include <asm.h>
|
||||
|
||||
.set DI_BASE, 0xD3026000
|
||||
.set DI_INV_ADR, (DI_BASE+0x28)
|
||||
.set DI_INV_LEN, (DI_BASE+0x2C)
|
||||
|
||||
.set INT_BASE, 0xD3026500
|
||||
.set DI_INT, (INT_BASE+0x20)
|
||||
|
||||
__DVDInterruptHandler:
|
||||
li %r0, 0
|
||||
lis %r3, INT_BASE@h
|
||||
stw %r0, DI_INT@l(%r3)
|
||||
|
||||
lwz %r0, DI_INV_LEN@l(%r3)
|
||||
cmplwi %r0, 0
|
||||
beq end
|
||||
|
||||
InvalidatePrep:
|
||||
srwi %r0, %r0, 5
|
||||
mtctr %r0
|
||||
li %r0, 0
|
||||
stw %r0, DI_INV_LEN@l(%r3)
|
||||
|
||||
lwz %r3, DI_INV_ADR@l(%r3)
|
||||
InvalidateRange:
|
||||
dcbi %r0, %r3
|
||||
icbi %r0, %r3
|
||||
addi %r3, %r3, 0x20
|
||||
bdnz InvalidateRange
|
||||
|
||||
end:
|
||||
#original instructions
|
||||
nop
|
||||
lis %r3, DI_BASE@h
|
||||
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
.set DI_BASE, 0xD3026000
|
||||
.set DI_INV_ADR, (DI_BASE+0x28)
|
||||
.set DI_INV_LEN, (DI_BASE+0x2C)
|
||||
|
||||
.set INT_BASE, 0xD3026500
|
||||
.set DI_INT, (INT_BASE+0x20)
|
||||
|
||||
__DVDInterruptHandler:
|
||||
li r0, 0
|
||||
lis r3, INT_BASE@h
|
||||
stw r0, DI_INT@l(r3)
|
||||
|
||||
lwz r0, DI_INV_LEN@l(r3)
|
||||
cmplwi r0, 0
|
||||
beq end
|
||||
|
||||
InvalidatePrep:
|
||||
srwi r0, r0, 5
|
||||
mtctr r0
|
||||
li r0, 0
|
||||
stw r0, DI_INV_LEN@l(r3)
|
||||
|
||||
lwz r3, DI_INV_ADR@l(r3)
|
||||
InvalidateRange:
|
||||
dcbi 0, r3
|
||||
icbi 0, r3
|
||||
addi r3, r3, 0x20
|
||||
bdnz InvalidateRange
|
||||
|
||||
end:
|
||||
#original instructions
|
||||
nop
|
||||
lis r3, DI_BASE@h
|
||||
|
||||
blr
|
||||
|
@@ -1,42 +1,42 @@
|
||||
#include <asm.h>
|
||||
|
||||
__GXSetVAT:
|
||||
lwz %r5, 0(%r13) #GXData
|
||||
li %r3, 8
|
||||
li %r4, 0
|
||||
lbz %r6, 0x4F2(%r5)
|
||||
mr %r7, %r5 #Backup GXData
|
||||
lis %r8, 0xCC01 #GX Register
|
||||
lwz r5, 0(r13) #GXData
|
||||
li r3, 8
|
||||
li r4, 0
|
||||
lbz r6, 0x4F2(r5)
|
||||
mr r7, r5 #Backup GXData
|
||||
lis r8, 0xCC01 #GX Register
|
||||
|
||||
loop:
|
||||
clrlwi. %r0, %r6, 31
|
||||
clrlwi. r0, r6, 31
|
||||
beq checkNext
|
||||
|
||||
stb %r3, -0x8000(%r8)
|
||||
ori %r0, %r4, 0x70
|
||||
stb %r0, -0x8000(%r8)
|
||||
lwz %r0, 0x1C(%r5)
|
||||
stw %r0, -0x8000(%r8)
|
||||
stb r3, -0x8000(r8)
|
||||
ori r0, r4, 0x70
|
||||
stb r0, -0x8000(r8)
|
||||
lwz r0, 0x1C(r5)
|
||||
stw r0, -0x8000(r8)
|
||||
|
||||
stb %r3, -0x8000(%r8)
|
||||
ori %r0, %r4, 0x80
|
||||
stb %r0, -0x8000(%r8)
|
||||
lwz %r0, 0x3C(%r5)
|
||||
stw %r0, -0x8000(%r8)
|
||||
stb r3, -0x8000(r8)
|
||||
ori r0, r4, 0x80
|
||||
stb r0, -0x8000(r8)
|
||||
lwz r0, 0x3C(r5)
|
||||
stw r0, -0x8000(r8)
|
||||
|
||||
stb %r3, -0x8000(%r8)
|
||||
ori %r0, %r4, 0x90
|
||||
stb %r0, -0x8000(%r8)
|
||||
lwz %r0, 0x5C(%r5)
|
||||
stw %r0, -0x8000(%r8)
|
||||
stb r3, -0x8000(r8)
|
||||
ori r0, r4, 0x90
|
||||
stb r0, -0x8000(r8)
|
||||
lwz r0, 0x5C(r5)
|
||||
stw r0, -0x8000(r8)
|
||||
|
||||
checkNext:
|
||||
addi %r4, %r4, 1
|
||||
addi %r5, %r5, 4
|
||||
srwi. %r6, %r6, 1
|
||||
addi r4, r4, 1
|
||||
addi r5, r5, 4
|
||||
srwi. r6, r6, 1
|
||||
bne loop
|
||||
|
||||
li %r0, 0
|
||||
stb %r0, -0x8000(%r8)
|
||||
stb %r0, 0x4F2(%r7)
|
||||
li r0, 0
|
||||
stb r0, -0x8000(r8)
|
||||
stb r0, 0x4F2(r7)
|
||||
blr
|
||||
|
@@ -1,58 +1,58 @@
|
||||
#include <asm.h>
|
||||
|
||||
# - only works for patch_fwrite_A-C
|
||||
#in
|
||||
# r3 address
|
||||
# r4 size
|
||||
# r5 length
|
||||
|
||||
#out - patch_fwrite_A-C
|
||||
# r3 length written
|
||||
|
||||
patch_fwrite_GC:
|
||||
mullw. %r4, %r5, %r4
|
||||
ble end
|
||||
lis %r7, 0xCD00
|
||||
lis %r10, 0xCD00
|
||||
lis %r11, 0xCD00
|
||||
ori %r7, %r7, 0x6418
|
||||
ori %r10, %r10, 0x6428
|
||||
ori %r11, %r11, 0x6424
|
||||
li %r6, 0
|
||||
|
||||
outerloop:
|
||||
lbzx %r0, %r6, %r3
|
||||
rlwinm %r0, %r0, 20,0,11
|
||||
oris %r8, %r0, 0xB000
|
||||
|
||||
loop:
|
||||
li %r0, 0xD0
|
||||
stw %r0, 0(%r7)
|
||||
eieio
|
||||
stw %r8, 0(%r10)
|
||||
eieio
|
||||
li %r0, 0x19
|
||||
stw %r0, 0(%r11)
|
||||
eieio
|
||||
|
||||
NotDone:
|
||||
lwz %r0, 0(%r11)
|
||||
sync
|
||||
andi. %r9, %r0, 1
|
||||
bne NotDone
|
||||
|
||||
lwz %r0, 0(%r10)
|
||||
sync
|
||||
li %r9, 0
|
||||
stw %r9, 0(%r7)
|
||||
eieio
|
||||
andis. %r9, %r0, 0x400
|
||||
beq loop
|
||||
|
||||
addi %r6, %r6, 1
|
||||
cmpw cr7, %r6, %r4
|
||||
bne cr7, outerloop
|
||||
|
||||
end:
|
||||
mr %r3, %r5
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
# - only works for patch_fwrite_A-C
|
||||
#in
|
||||
# r3 address
|
||||
# r4 size
|
||||
# r5 length
|
||||
|
||||
#out - patch_fwrite_A-C
|
||||
# r3 length written
|
||||
|
||||
patch_fwrite_GC:
|
||||
mullw. r4, r5, r4
|
||||
ble end
|
||||
lis r7, 0xCD00
|
||||
lis r10, 0xCD00
|
||||
lis r11, 0xCD00
|
||||
ori r7, r7, 0x6418
|
||||
ori r10, r10, 0x6428
|
||||
ori r11, r11, 0x6424
|
||||
li r6, 0
|
||||
|
||||
outerloop:
|
||||
lbzx r0, r6, r3
|
||||
rlwinm r0, r0, 20,0,11
|
||||
oris r8, r0, 0xB000
|
||||
|
||||
loop:
|
||||
li r0, 0xD0
|
||||
stw r0, 0(r7)
|
||||
eieio
|
||||
stw r8, 0(r10)
|
||||
eieio
|
||||
li r0, 0x19
|
||||
stw r0, 0(r11)
|
||||
eieio
|
||||
|
||||
NotDone:
|
||||
lwz r0, 0(r11)
|
||||
sync
|
||||
andi. r9, r0, 1
|
||||
bne NotDone
|
||||
|
||||
lwz r0, 0(r10)
|
||||
sync
|
||||
li r9, 0
|
||||
stw r9, 0(r7)
|
||||
eieio
|
||||
andis. r9, r0, 0x400
|
||||
beq loop
|
||||
|
||||
addi r6, r6, 1
|
||||
cmpw cr7, r6, r4
|
||||
bne cr7, outerloop
|
||||
|
||||
end:
|
||||
mr r3, r5
|
||||
blr
|
||||
|
@@ -1,58 +1,57 @@
|
||||
#include <asm.h>
|
||||
|
||||
.set fwriteBuff, 0x93160000
|
||||
|
||||
#in - patch_fwrite_A-C
|
||||
# r3 address
|
||||
# r4 size
|
||||
# r5 length
|
||||
#in - patch_fwrite_D
|
||||
# r3 address
|
||||
# r4 length
|
||||
|
||||
#out - patch_fwrite_A-C
|
||||
# r3 length written
|
||||
#out - patch_fwrite_D
|
||||
# r3 ret =0
|
||||
|
||||
patch_fwrite_Log:
|
||||
|
||||
# mr. %r5, %r4 # - use instead for patch_fwrite_D
|
||||
mullw. %r4, %r5, %r4
|
||||
ble end
|
||||
lis %r7, fwriteBuff@h
|
||||
ori %r7, %r7, fwriteBuff@l
|
||||
|
||||
lwz %r6, 4(%r7)
|
||||
cmpwi %r6, 0
|
||||
bne end
|
||||
|
||||
#DCFlushRange
|
||||
srwi %r6, %r4, 5
|
||||
addi %r6, %r6, 2
|
||||
mtctr %r6
|
||||
mr %r6, %r3
|
||||
rlwinm %r6, %r6, 0,0,26
|
||||
|
||||
li %r0, 0
|
||||
DCFlushRange:
|
||||
dcbf %r0, %r6
|
||||
addi %r6, %r6, 0x20
|
||||
bdnz DCFlushRange
|
||||
|
||||
stw %r3, 0(%r7)
|
||||
stw %r4, 4(%r7)
|
||||
|
||||
dcbf %r0, %r7
|
||||
sync
|
||||
ready_loop:
|
||||
lwz %r6, 4(%r7)
|
||||
dcbi %r0, %r7
|
||||
sync
|
||||
cmpw %r4, %r6
|
||||
beq ready_loop
|
||||
|
||||
end:
|
||||
# li %r3, 0 #- use instead for patch_fwrite_D
|
||||
mr %r3, %r5
|
||||
blr
|
||||
#include <asm.h>
|
||||
|
||||
.set fwriteBuff, 0x93160000
|
||||
|
||||
#in - patch_fwrite_A-C
|
||||
# r3 address
|
||||
# r4 size
|
||||
# r5 length
|
||||
#in - patch_fwrite_D
|
||||
# r3 address
|
||||
# r4 length
|
||||
|
||||
#out - patch_fwrite_A-C
|
||||
# r3 length written
|
||||
#out - patch_fwrite_D
|
||||
# r3 ret =0
|
||||
|
||||
patch_fwrite_Log:
|
||||
|
||||
# mr. r5, r4 # - use instead for patch_fwrite_D
|
||||
mullw. r4, r5, r4
|
||||
ble end
|
||||
lis r7, fwriteBuff@h
|
||||
ori r7, r7, fwriteBuff@l
|
||||
|
||||
lwz r6, 4(r7)
|
||||
cmpwi r6, 0
|
||||
bne end
|
||||
|
||||
#DCFlushRange
|
||||
srwi r6, r4, 5
|
||||
addi r6, r6, 2
|
||||
mtctr r6
|
||||
mr r6, r3
|
||||
rlwinm r6, r6, 0,0,26
|
||||
|
||||
DCFlushRange:
|
||||
dcbf 0, r6
|
||||
addi r6, r6, 0x20
|
||||
bdnz DCFlushRange
|
||||
|
||||
stw r3, 0(r7)
|
||||
stw r4, 4(r7)
|
||||
|
||||
dcbf 0, r7
|
||||
sync
|
||||
ready_loop:
|
||||
lwz r6, 4(r7)
|
||||
dcbi 0, r7
|
||||
sync
|
||||
cmpw r4, r6
|
||||
beq ready_loop
|
||||
|
||||
end:
|
||||
# li r3, 0 #- use instead for patch_fwrite_D
|
||||
mr r3, r5
|
||||
blr
|
||||
|
@@ -27,7 +27,8 @@ INCLUDES := include ../fatfs
|
||||
# options for code generation
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
CFLAGS := -O3 -g -std=gnu89 \
|
||||
ASFLAGS := $(MACHDEP) -mregnames -D_LANGUAGE_ASSEMBLY
|
||||
CFLAGS := -O3 -g -std=gnu89 -Wno-format-truncation \
|
||||
-Wall $(MACHDEP) $(INCLUDE) -DDEBUG -DDEBUG_MODULE_PATCH -DARCH_IS_BIG_ENDIAN
|
||||
CXXFLAGS := $(CFLAGS)
|
||||
|
||||
|
@@ -21,6 +21,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#ifndef _TRI_H_
|
||||
#define _TRI_H_
|
||||
|
||||
u32 TRISetupGames(char *Path, u32 CurDICMD, u32 ISOShift);
|
||||
u32 TRISetupGames(char *Path, unsigned int CurDICMD, u32 ISOShift);
|
||||
|
||||
#endif
|
||||
|
@@ -4,7 +4,6 @@
|
||||
#include <gccore.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ogcsys.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.5 MiB |
@@ -44,7 +44,7 @@ static const char SETTINGS_VS4V06EXP[] = "/saves/VS4V06EXPsettings.bin";
|
||||
|
||||
extern bool wiiVCInternal;
|
||||
|
||||
static u32 DOLRead32(u32 loc, u32 DOLOffset, FIL *f, u32 CurDICMD)
|
||||
static u32 DOLRead32(u32 loc, u32 DOLOffset, FIL *f, unsigned int CurDICMD)
|
||||
{
|
||||
u32 BufAtOffset = 0;
|
||||
if(wiiVCInternal)
|
||||
@@ -64,7 +64,7 @@ static u32 DOLRead32(u32 loc, u32 DOLOffset, FIL *f, u32 CurDICMD)
|
||||
return BufAtOffset;
|
||||
}
|
||||
|
||||
u32 TRISetupGames(char *Path, u32 CurDICMD, u32 ISOShift)
|
||||
u32 TRISetupGames(char *Path, unsigned int CurDICMD, u32 ISOShift)
|
||||
{
|
||||
u32 res = 0;
|
||||
u32 DOLOffset = 0;
|
||||
|
@@ -504,7 +504,7 @@ typedef struct _devInitInfo_t
|
||||
|
||||
// Maximum init timeout, in seconds.
|
||||
// (0 = only try once)
|
||||
int timeout;
|
||||
time_t timeout;
|
||||
} devInitInfo_t;
|
||||
|
||||
static const devInitInfo_t devInitInfo[2] =
|
||||
|
@@ -21,7 +21,6 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <ogcsys.h>
|
||||
#include <network.h>
|
||||
#include <ogc/lwp_watchdog.h>
|
||||
|
||||
|
50
loader/source/jmp813.S
Normal file
50
loader/source/jmp813.S
Normal file
@@ -0,0 +1,50 @@
|
||||
|
||||
.extern __InitBATS
|
||||
.extern __InitPS
|
||||
.extern __InitFPRS
|
||||
.extern __InitCache
|
||||
.extern __InitSystem
|
||||
|
||||
.globl _jmp813
|
||||
_jmp813:
|
||||
bl __InitBATS # Initialize BATs to a clear and known state
|
||||
bl __initRegisters # Initialize the General Purpose Registers
|
||||
bl __InitPS # Initialize Paired Singles
|
||||
bl __InitFPRS # Initialize the FPR's
|
||||
bl __InitCache # Initialize the system caches
|
||||
bl __InitSystem # Initialize more cache aspects, clear a few SPR's, and disable interrupts.
|
||||
lis r3, 0x8130
|
||||
mtlr r3
|
||||
blr
|
||||
|
||||
__initRegisters:
|
||||
li r0,0
|
||||
li r3,0
|
||||
li r4,0
|
||||
li r5,0
|
||||
li r6,0
|
||||
li r7,0
|
||||
li r8,0
|
||||
li r9,0
|
||||
li r10,0
|
||||
li r11,0
|
||||
li r12,0
|
||||
li r14,0
|
||||
li r15,0
|
||||
li r16,0
|
||||
li r17,0
|
||||
li r18,0
|
||||
li r19,0
|
||||
li r20,0
|
||||
li r21,0
|
||||
li r22,0
|
||||
li r23,0
|
||||
li r24,0
|
||||
li r25,0
|
||||
li r26,0
|
||||
li r27,0
|
||||
li r28,0
|
||||
li r29,0
|
||||
li r30,0
|
||||
li r31,0
|
||||
blr
|
@@ -221,7 +221,7 @@ void changeToDefaultDrive()
|
||||
* @param BI2region [out,opt] bi2.bin region code.
|
||||
* @return 0 on success; non-zero on error.
|
||||
*/
|
||||
static u32 CheckForMultiGameAndRegion(u32 CurDICMD, u32 *ISOShift, u32 *BI2region)
|
||||
static u32 CheckForMultiGameAndRegion(unsigned int CurDICMD, u32 *ISOShift, u32 *BI2region)
|
||||
{
|
||||
char GamePath[260];
|
||||
|
||||
@@ -552,6 +552,7 @@ static u32 CheckForMultiGameAndRegion(u32 CurDICMD, u32 *ISOShift, u32 *BI2regio
|
||||
static char dev_es[] ATTRIBUTE_ALIGN(32) = "/dev/es";
|
||||
|
||||
extern vu32 FoundVersion;
|
||||
extern void _jmp813();
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
// Exit after 10 seconds if there is an error
|
||||
@@ -848,7 +849,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
//Init DI and set correct ID if needed
|
||||
u32 CurDICMD = 0;
|
||||
unsigned int CurDICMD = 0;
|
||||
if( memcmp(ncfg->GamePath, "di", 3) == 0 )
|
||||
{
|
||||
if(argsboot == false)
|
||||
@@ -999,7 +1000,7 @@ int main(int argc, char **argv)
|
||||
device = "DVD-R";
|
||||
break;
|
||||
default:
|
||||
snprintf(unkdev, sizeof(unkdev), "Unknown (CMD: 0x%02lX)", CurDICMD);
|
||||
snprintf(unkdev, sizeof(unkdev), "Unknown (CMD: 0x%02x)", CurDICMD);
|
||||
device = unkdev;
|
||||
break;
|
||||
}
|
||||
@@ -1591,11 +1592,8 @@ int main(int argc, char **argv)
|
||||
DCFlushRange((void*)0x81300000, multidol_ldr_bin_size);
|
||||
ICInvalidateRange((void*)0x81300000, multidol_ldr_bin_size);
|
||||
}
|
||||
asm volatile (
|
||||
"lis %r3, 0x8130\n"
|
||||
"mtlr %r3\n"
|
||||
"blr\n"
|
||||
);
|
||||
_jmp813();
|
||||
|
||||
//IRQ_Restore(level);
|
||||
|
||||
return 0;
|
||||
|
@@ -20,7 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <gccore.h>
|
||||
#include <ogcsys.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
|
@@ -45,7 +45,7 @@ distribution.
|
||||
#include <malloc.h>
|
||||
#include <time.h>
|
||||
#include <gcutil.h>
|
||||
#include <ogcsys.h>
|
||||
#include <gccore.h>
|
||||
#include <ogc/ipc.h>
|
||||
#include <ogc/machine/asm.h>
|
||||
#include <ogc/machine/processor.h>
|
||||
|
@@ -1,7 +1,6 @@
|
||||
#include <errno.h>
|
||||
#include <ogc/es.h>
|
||||
#include <ogc/lwp_watchdog.h>
|
||||
#include <ogcsys.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@@ -20,40 +20,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
#include "utils.h"
|
||||
#include "global.h"
|
||||
#include "cache.h"
|
||||
|
||||
void RAMInit(void)
|
||||
{
|
||||
u32 vmode = *(vu32*)0x800000CC;
|
||||
|
||||
_memset( (void*)0x80000020, 0, 0xE0 ); //Keep ISO Header
|
||||
_memset( (void*)0x80003000, 0, 0x100 );
|
||||
_memset( (void*)0x80003F00, 0, 0x11FC100 );
|
||||
_memset( (void*)0x81340000, 0, 0x3C );
|
||||
|
||||
_memset( (void*)0x80003000, 0, 0x12FD000 );
|
||||
sync_before_exec( (void*)0x80003000, 0x12FD000 );
|
||||
_memset( (void*)0x81310000, 0, 0x4F0000 );
|
||||
sync_before_exec( (void*)0x81340000, 0x4F0000 );
|
||||
*(vu32*)0x80000020 = 0x0D15EA5E;
|
||||
*(vu32*)0x80000028 = 0x01800000;
|
||||
*(vu32*)0x8000002C = *(vu32*)0xCC00302C >> 28; // console type
|
||||
*(vu32*)0x80000038 = 0x01800000;
|
||||
*(vu32*)0x800000CC = vmode; //Assuming it didnt change
|
||||
*(vu32*)0x800000F0 = 0x01800000;
|
||||
*(vu32*)0x800000EC = 0x81800000;
|
||||
|
||||
*(vu32*)0x80003100 = 0x01800000; //Physical MEM1 size
|
||||
*(vu32*)0x80003104 = 0x01800000; //Simulated MEM1 size
|
||||
*(vu32*)0x80003108 = 0x01800000;
|
||||
*(vu32*)0x8000310C = 0;
|
||||
*(vu32*)0x80003110 = 0;
|
||||
*(vu32*)0x80003114 = 0;
|
||||
*(vu32*)0x80003118 = 0; //Physical MEM2 size
|
||||
*(vu32*)0x8000311C = 0; //Simulated MEM2 size
|
||||
*(vu32*)0x80003120 = 0;
|
||||
*(vu32*)0x80003124 = 0x0000FFFF;
|
||||
*(vu32*)0x80003128 = 0;
|
||||
*(vu32*)0x80003130 = 0x0000FFFF; //IOS Heap Range
|
||||
*(vu32*)0x80003134 = 0;
|
||||
*(vu32*)0x80003138 = 0x11; //Hollywood Version
|
||||
*(vu32*)0x8000313C = 0;
|
||||
|
||||
*(vu32*)0x8000315C = 0x81;
|
||||
|
||||
*(vu16*)0xCC00501A = 156;
|
||||
}
|
||||
|
@@ -28,7 +28,7 @@ SECTIONS {
|
||||
|
||||
__stack_end = .;
|
||||
.stack : {
|
||||
. = . + 0x200;
|
||||
. = . + 0x2000;
|
||||
__stack_top = .;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user