-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:
FIX94
2018-08-26 02:15:39 +02:00
parent 10f52316a6
commit b967aab87b
88 changed files with 2075 additions and 2068 deletions

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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] =

View File

@@ -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
View 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

View File

@@ -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;

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;
}

View File

@@ -28,7 +28,7 @@ SECTIONS {
__stack_end = .;
.stack : {
. = . + 0x200;
. = . + 0x2000;
__stack_top = .;
}
}