mirror of https://github.com/PCSX2/pcsx2.git
924 lines
26 KiB
C
924 lines
26 KiB
C
//[module] DMACMAN
|
|
//[processor] IOP
|
|
//[type] ELF-IRX
|
|
//[name] dmacman
|
|
//[version] 0x101
|
|
//[memory map] 0xBF801080,0xBF801084,0xBF801088, 00 mdec in
|
|
// 0xBF801090,0xBF801094,0xBF801098, 01 mdec out
|
|
// 0xBF8010A0,0xBF8010A4,0xBF8010A8, 02 gpu
|
|
// 0xBF8010B0,0xBF8010B4,0xBF8010B8, 03 cdrom/dvd
|
|
// 0xBF8010C0,0xBF8010C4,0xBF8010C8, 0xBF8010CC, 04 spu
|
|
// 0xBF8010D0,0xBF8010D4,0xBF8010D8, 05 pio
|
|
// 0xBF8010E0,0xBF8010E4,0xBF8010E8, 06 gpu otc
|
|
//
|
|
// 0xBF8010F0,0xBF8010F4,
|
|
//
|
|
// 0xBF801500,0xBF801504,0xBF801508, 07 SPU2
|
|
// 0xBF801510,0xBF801514,0xBF801518, 08
|
|
// 0xBF801520,0xBF801524,0xBF801528, 0xBF80152C, 09 SIF0
|
|
// 0xBF801530,0xBF801534,0xBF801538, 10 SIF1
|
|
// 0xBF801540,0xBF801544,0xBF801548, 11 SIO2in
|
|
// 0xBF801550,0xBF801554,0xBF801558, 12 SIO2out
|
|
//
|
|
// 0xBF801560,0xBF801564,0xBF801568, //sifman
|
|
// sif0 sif1 spu
|
|
//
|
|
// 0xBF801570, 0xBF801574,0xBF801578,0xBF80157C, //sifman
|
|
// 0xBF8015F0
|
|
//[handlers] -
|
|
//[entry point] dmacman_start, dmacman_stub
|
|
//[made by] [RO]man (roman_ps2dev@hotmail.com)
|
|
|
|
#include <tamtypes.h>
|
|
|
|
#include "kloadcore.h"
|
|
#include "kintrman.h"
|
|
#include "kdmacman.h"
|
|
|
|
|
|
int _start(int argc, char* argv[]);
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801080(unsigned int ch, int value){
|
|
*(int*)0xBF801080=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801090(unsigned int ch, int value){
|
|
*(int*)0xBF801090=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010A0(unsigned int ch, int value){
|
|
*(int*)0xBF8010A0=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010B0(unsigned int ch, int value){
|
|
*(int*)0xBF8010B0=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010C0(unsigned int ch, int value){
|
|
*(int*)0xBF8010C0=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010D0(unsigned int ch, int value){
|
|
*(int*)0xBF8010D0=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010E0(unsigned int ch, int value){
|
|
*(int*)0xBF8010E0=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801500(unsigned int ch, int value){
|
|
*(int*)0xBF801500=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801510(unsigned int ch, int value){
|
|
*(int*)0xBF801510=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801520(unsigned int ch, int value){
|
|
*(int*)0xBF801520=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801530(unsigned int ch, int value){
|
|
*(int*)0xBF801530=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801540(unsigned int ch, int value){
|
|
*(int*)0xBF801540=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801550(unsigned int ch, int value){
|
|
*(int*)0xBF801550=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801080(unsigned int ch){
|
|
return *(int*)0xBF801080;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801090(unsigned int ch){
|
|
return *(int*)0xBF801090;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010A0(unsigned int ch){
|
|
return *(int*)0xBF8010A0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010B0(unsigned int ch){
|
|
return *(int*)0xBF8010B0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010C0(unsigned int ch){
|
|
return *(int*)0xBF8010C0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010D0(unsigned int ch){
|
|
return *(int*)0xBF8010D0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010E0(unsigned int ch){
|
|
return *(int*)0xBF8010E0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801500(unsigned int ch){
|
|
return *(int*)0xBF801500;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801510(unsigned int ch){
|
|
return *(int*)0xBF801510;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801520(unsigned int ch){
|
|
return *(int*)0xBF801520;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801530(unsigned int ch){
|
|
return *(int*)0xBF801530;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801540(unsigned int ch){
|
|
return *(int*)0xBF801540;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801550(unsigned int ch){
|
|
return *(int*)0xBF801550;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801084(unsigned int ch, int value){
|
|
*(int*)0xBF801084=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801094(unsigned int ch, int value){
|
|
*(int*)0xBF801094=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010A4(unsigned int ch, int value){
|
|
*(int*)0xBF8010A4=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010B4(unsigned int ch, int value){
|
|
*(int*)0xBF8010B4=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010C4(unsigned int ch, int value){
|
|
*(int*)0xBF8010C4=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010D4(unsigned int ch, int value){
|
|
*(int*)0xBF8010D4=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010E4(unsigned int ch, int value){
|
|
*(int*)0xBF8010E4=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801504(unsigned int ch, int value){
|
|
*(int*)0xBF801504=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801514(unsigned int ch, int value){
|
|
*(int*)0xBF801514=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801524(unsigned int ch, int value){
|
|
*(int*)0xBF801524=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801534(unsigned int ch, int value){
|
|
*(int*)0xBF801534=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801544(unsigned int ch, int value){
|
|
*(int*)0xBF801544=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801554(unsigned int ch, int value){
|
|
*(int*)0xBF801554=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801084(unsigned int ch){
|
|
return *(int*)0xBF801084;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801094(unsigned int ch){
|
|
return *(int*)0xBF801094;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010A4(unsigned int ch){
|
|
return *(int*)0xBF8010A4;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010B4(unsigned int ch){
|
|
return *(int*)0xBF8010B4;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010C4(unsigned int ch){
|
|
return *(int*)0xBF8010C4;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010D4(unsigned int ch){
|
|
return *(int*)0xBF8010D4;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010E4(unsigned int ch){
|
|
return *(int*)0xBF8010E4;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801504(unsigned int ch){
|
|
return *(int*)0xBF801504;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801514(unsigned int ch){
|
|
return *(int*)0xBF801514;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801524(unsigned int ch){
|
|
return *(int*)0xBF801524;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801534(unsigned int ch){
|
|
return *(int*)0xBF801534;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801544(unsigned int ch){
|
|
return *(int*)0xBF801544;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801554(unsigned int ch){
|
|
return *(int*)0xBF801554;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801088(unsigned int ch, int value){
|
|
*(int*)0xBF801088=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801098(unsigned int ch, int value){
|
|
*(int*)0xBF801098=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010A8(unsigned int ch, int value){
|
|
*(int*)0xBF8010A8=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010B8(unsigned int ch, int value){
|
|
*(int*)0xBF8010B8=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010C8(unsigned int ch, int value){
|
|
*(int*)0xBF8010C8=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010D8(unsigned int ch, int value){
|
|
*(int*)0xBF8010D8=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF8010E8(unsigned int ch, int value){
|
|
*(int*)0xBF8010E8=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801508(unsigned int ch, int value){
|
|
*(int*)0xBF801508=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801518(unsigned int ch, int value){
|
|
*(int*)0xBF801518=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801528(unsigned int ch, int value){
|
|
*(int*)0xBF801528=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801538(unsigned int ch, int value){
|
|
*(int*)0xBF801538=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801548(unsigned int ch, int value){
|
|
*(int*)0xBF801548=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void _setBF801558(unsigned int ch, int value){
|
|
*(int*)0xBF801558=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801088(unsigned int ch){
|
|
return *(int*)0xBF801088;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801098(unsigned int ch){
|
|
return *(int*)0xBF801098;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010A8(unsigned int ch){
|
|
return *(int*)0xBF8010A8;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010B8(unsigned int ch){
|
|
return *(int*)0xBF8010B8;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010C8(unsigned int ch){
|
|
return *(int*)0xBF8010C8;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010D8(unsigned int ch){
|
|
return *(int*)0xBF8010D8;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF8010E8(unsigned int ch){
|
|
return *(int*)0xBF8010E8;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801508(unsigned int ch){
|
|
return *(int*)0xBF801508;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801518(unsigned int ch){
|
|
return *(int*)0xBF801518;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801528(unsigned int ch){
|
|
return *(int*)0xBF801528;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801538(unsigned int ch){
|
|
return *(int*)0xBF801538;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801548(unsigned int ch){
|
|
return *(int*)0xBF801548;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int _getBF801558(unsigned int ch){
|
|
return *(int*)0xBF801558;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetD_TADR(unsigned int ch, int value){
|
|
if (ch==DMAch_SPU)
|
|
*(int*)0xBF8010CC=value; else
|
|
if (ch==DMAch_SIF0)
|
|
*(int*)0xBF80152C=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetD_TADR(unsigned int ch){
|
|
if (ch==DMAch_SPU)
|
|
return *(int*)0xBF8010CC;
|
|
if (ch==DMAch_SIF0)
|
|
return *(int*)0xBF80152C;
|
|
return 0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSet_4_9_A(unsigned int ch, int value){
|
|
if (ch==DMAch_SPU)
|
|
*(int*)0xBF801568=value; else
|
|
if (ch==DMAch_SIF0)
|
|
*(int*)0xBF801560=value; else
|
|
if (ch==DMAch_SIF1)
|
|
*(int*)0xBF801564=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGet_4_9_A(unsigned int ch){
|
|
if (ch==DMAch_SPU)
|
|
return *(int*)0xBF801568;
|
|
if (ch==DMAch_SIF0)
|
|
return *(int*)0xBF801560;
|
|
if (ch==DMAch_SIF1)
|
|
return *(int*)0xBF801564;
|
|
return 0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetDPCR(int value){
|
|
*(int*)0xBF8010F0=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetDPCR(){
|
|
return *(int*)0xBF8010F0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetDPCR2(int value){
|
|
*(int*)0xBF801570=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetDPCR2(){
|
|
return *(int*)0xBF801570;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetDPCR3(int value){
|
|
*(int*)0xBF8015F0=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetDPCR3(){
|
|
return *(int*)0xBF8015F0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetDICR(int value){
|
|
*(int*)0xBF8010F4=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetDICR(){
|
|
return *(int*)0xBF8010F4;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetDICR2(int value){
|
|
*(int*)0xBF801574=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetDICR2(){
|
|
return *(int*)0xBF801574;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetBF80157C(int value){
|
|
*(int*)0xBF80157C=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetBF80157C(){
|
|
return *(int*)0xBF80157C;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetBF801578(int value){
|
|
*(int*)0xBF801578=value;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetBF801578(){
|
|
return *(int*)0xBF801578;
|
|
}
|
|
|
|
func setD_MADR[]={
|
|
(func)_setBF801080, (func)_setBF801090, (func)_setBF8010A0, (func)_setBF8010B0,
|
|
(func)_setBF8010C0, (func)_setBF8010D0, (func)_setBF8010E0,
|
|
(func)_setBF801500, (func)_setBF801510, (func)_setBF801520,
|
|
(func)_setBF801530, (func)_setBF801540, (func)_setBF801550, 0
|
|
};
|
|
|
|
func getD_MADR[]={
|
|
(func)_getBF801080, (func)_getBF801090, (func)_getBF8010A0, (func)_getBF8010B0,
|
|
(func)_getBF8010C0, (func)_getBF8010D0, (func)_getBF8010E0,
|
|
(func)_getBF801500, (func)_getBF801510, (func)_getBF801520,
|
|
(func)_getBF801530, (func)_getBF801540, (func)_getBF801550, 0
|
|
};
|
|
|
|
func setD_BCR[]={
|
|
(func)_setBF801084, (func)_setBF801094, (func)_setBF8010A4, (func)_setBF8010B4,
|
|
(func)_setBF8010C4, (func)_setBF8010D4, (func)_setBF8010E4,
|
|
(func)_setBF801504, (func)_setBF801514, (func)_setBF801524,
|
|
(func)_setBF801534, (func)_setBF801544, (func)_setBF801554, 0
|
|
};
|
|
|
|
func getD_BCR[]={
|
|
(func)_getBF801084, (func)_getBF801094, (func)_getBF8010A4, (func)_getBF8010B4,
|
|
(func)_getBF8010C4, (func)_getBF8010D4, (func)_getBF8010E4,
|
|
(func)_getBF801504, (func)_getBF801514, (func)_getBF801524,
|
|
(func)_getBF801534, (func)_getBF801544, (func)_getBF801554, 0
|
|
};
|
|
|
|
func setD_CHCR[]={
|
|
(func)_setBF801088, (func)_setBF801098, (func)_setBF8010A8, (func)_setBF8010B8,
|
|
(func)_setBF8010C8, (func)_setBF8010D8, (func)_setBF8010E8,
|
|
(func)_setBF801508, (func)_setBF801518, (func)_setBF801528,
|
|
(func)_setBF801538, (func)_setBF801548, (func)_setBF801558, 0
|
|
};
|
|
|
|
func getD_CHCR[]={
|
|
(func)_getBF801088, (func)_getBF801098, (func)_getBF8010A8, (func)_getBF8010B8,
|
|
(func)_getBF8010C8, (func)_getBF8010D8, (func)_getBF8010E8,
|
|
(func)_getBF801508, (func)_getBF801518, (func)_getBF801528,
|
|
(func)_getBF801538, (func)_getBF801548, (func)_getBF801558, 0
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetD_MADR(unsigned int ch, int value){
|
|
if (ch<13)
|
|
setD_MADR[ch](ch, value); //function call
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetD_MADR(unsigned int ch){
|
|
if (ch<13)
|
|
return getD_MADR[ch](ch); //function call
|
|
return 0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetD_BCR(unsigned int ch, int value){
|
|
if (ch<13)
|
|
setD_BCR[ch](ch, value); //function call
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetD_BCR(unsigned int ch){
|
|
if (ch<13)
|
|
return getD_BCR[ch](ch); //function call
|
|
return 0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacSetD_CHCR(unsigned int ch, int value){
|
|
if (ch<13)
|
|
setD_CHCR[ch](ch, value); //function call
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacGetD_CHCR(unsigned int ch){
|
|
if (ch<13)
|
|
return getD_CHCR[ch](ch); //function call
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacDeinit(){
|
|
int x;
|
|
register int ch, value;
|
|
|
|
CpuSuspendIntr(&x); //intrman
|
|
|
|
dmacSetBF801578(0);
|
|
for (ch=0; ch<13; ch++){
|
|
value=dmacGetD_CHCR(ch);
|
|
if (value & DMAf_TR) //sysmem
|
|
Kprintf("WARNING:DMA %dch has been continued until shutdown\n", ch);
|
|
dmacSetD_CHCR(ch, value & 0xFEFFFFFF);
|
|
}
|
|
|
|
CpuResumeIntr(x); //intrman
|
|
return 1;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacSetDMA(int ch, int address, int size, int count, int dir){
|
|
if (ch<13 && ch != DMAch_GPUotc){
|
|
dmacSetD_MADR(ch, 0x00FFFFFF & address);
|
|
dmacSetD_BCR (ch, (count << 16) | (size & 0xFFFF));
|
|
dmacSetD_CHCR(ch, (dir & DMAf_DR) | DMAf_CO |
|
|
(dir == 0 ? DMAf_30 : 0));
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacSetDMA_chainedSPU_SIF0(int ch, int size, int tadr){
|
|
if (ch != DMAch_SPU && ch != DMAch_SIF0)
|
|
return 0;
|
|
dmacSetD_BCR (ch, size & 0x0000FFFF);
|
|
dmacSetD_CHCR(ch, DMAf_LI | DMAf_CO | DMAf_DR); //0x601
|
|
dmacSetD_TADR (ch, tadr & 0x00FFFFFF);
|
|
return 1;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacSetDMA_SIF0(int ch, int size, int tadr){
|
|
if (ch != DMAch_SIF0)
|
|
return 0;
|
|
dmacSetD_BCR ( DMAch_SIF0, size & 0x0000FFFF);
|
|
dmacSetD_CHCR( DMAch_SIF0, DMAf_LI | DMAf_CO | DMAf_08 | DMAf_DR); //0x701
|
|
dmacSetD_TADR ( DMAch_SIF0, tadr & 0x00FFFFFF);
|
|
return 1;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
int dmacSetDMA_SIF1(int ch, int size){
|
|
if (ch != DMAch_SIF1)
|
|
return 0;
|
|
dmacSetD_BCR (DMAch_SIF1, size & 0x0000FFFF);
|
|
dmacSetD_CHCR(DMAch_SIF1, DMAf_30 | DMAf_CO | DMAf_08); //0x40000300
|
|
return 1;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
void dmacStartTransfer(int ch){
|
|
if (ch < 15)
|
|
dmacSetD_CHCR(ch, DMAf_TR | dmacGetD_CHCR(ch));
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// set 3-bit value of channel
|
|
void dmacSetVal(int ch, int value){
|
|
int x;
|
|
CpuSuspendIntr(&x); //intrman
|
|
|
|
switch (ch){
|
|
case DMAch_MDECin: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFFFFFF8) |
|
|
( value & 7)); break;
|
|
case DMAch_MDECout:dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFFFFF8F) |
|
|
(( value & 7) << 4)); break;
|
|
case DMAch_GPU: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFFFF8FF) |
|
|
(( value & 7) << 8)); break;
|
|
case DMAch_CD: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFFF8FFF) |
|
|
(( value & 7) << 12)); break;
|
|
case DMAch_SPU: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFF8FFFF) |
|
|
(( value & 7) << 16)); break;
|
|
case DMAch_PIO: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFF8FFFFF) |
|
|
(( value & 7) << 20)); break;
|
|
case DMAch_GPUotc:dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xF8FFFFFF) |
|
|
(( value & 7) << 24)); break;
|
|
case DMAch_SPU2:dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFFFFFF8) |
|
|
( value & 7)); break;
|
|
case DMAch_8: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFFFFF8F) |
|
|
(( value & 7) << 4)); break;
|
|
case DMAch_SIF0: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFFFF8FF) |
|
|
(( value & 7) << 8)); break;
|
|
case DMAch_SIF1: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFFF8FFF) |
|
|
(( value & 7) << 12)); break;
|
|
case DMAch_SIO2in: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFF8FFFF) |
|
|
(( value & 7) << 16)); break;
|
|
case DMAch_SIO2out:dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFF8FFFFF) |
|
|
(( value & 7) << 20)); break;
|
|
case DMAch_13: dmacSetDPCR3(
|
|
(dmacGetDPCR3() & 0xFFFFFFF8) |
|
|
( value & 7)); break;
|
|
case DMAch_14: dmacSetDPCR3(
|
|
(dmacGetDPCR3() & 0xFFFFFF8F) |
|
|
(( value & 7) << 4)); break;
|
|
case DMAch_15: dmacSetDPCR3(
|
|
(dmacGetDPCR3() & 0xFFFFF8FF) |
|
|
(( value & 7) << 8)); break;
|
|
case DMAch_67: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0x8FFFFFFF) |
|
|
(( value & 7) << 28)); break;
|
|
case DMAch_85: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xF8FFFFFF) |
|
|
(( value & 7) << 24)); break;
|
|
}
|
|
|
|
CpuResumeIntr(x); //intrman
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// set 4th bit of channel
|
|
void dmacEnableDMAch(int ch){
|
|
int x;
|
|
CpuSuspendIntr(&x); //intrman
|
|
|
|
switch (ch){
|
|
case DMAch_MDECin: dmacSetDPCR(
|
|
(dmacGetDPCR() | 0x00000008)); break;
|
|
case DMAch_MDECout:dmacSetDPCR(
|
|
(dmacGetDPCR() | 0x00000080)); break;
|
|
case DMAch_GPU: dmacSetDPCR(
|
|
(dmacGetDPCR() | 0x00000800)); break;
|
|
case DMAch_CD: dmacSetDPCR(
|
|
(dmacGetDPCR() | 0x00008000)); break;
|
|
case DMAch_SPU: dmacSetDPCR(
|
|
(dmacGetDPCR() | 0x00080000)); break;
|
|
case DMAch_PIO: dmacSetDPCR(
|
|
(dmacGetDPCR() | 0x00800000)); break;
|
|
case DMAch_GPUotc:dmacSetDPCR(
|
|
(dmacGetDPCR() | 0x08000000)); break;
|
|
case DMAch_SPU2: dmacSetDPCR2(
|
|
(dmacGetDPCR2() | 0x00000008)); break;
|
|
case DMAch_8: dmacSetDPCR2(
|
|
(dmacGetDPCR2() | 0x00000080)); break;
|
|
case DMAch_SIF0: dmacSetDPCR2(
|
|
(dmacGetDPCR2() | 0x00000800)); break;
|
|
case DMAch_SIF1: dmacSetDPCR2(
|
|
(dmacGetDPCR2() | 0x00008000)); break;
|
|
case DMAch_SIO2in:dmacSetDPCR2(
|
|
(dmacGetDPCR2() | 0x00080000)); break;
|
|
case DMAch_SIO2out:dmacSetDPCR2(
|
|
(dmacGetDPCR2() | 0x00800000)); break;
|
|
case DMAch_13: dmacSetDPCR3(
|
|
(dmacGetDPCR3() | 0x00000008)); break;
|
|
case DMAch_14: dmacSetDPCR3(
|
|
(dmacGetDPCR3() | 0x00000080)); break;
|
|
case DMAch_15: dmacSetDPCR3(
|
|
(dmacGetDPCR3() | 0x00000800)); break;
|
|
case DMAch_85: dmacSetDPCR2(
|
|
(dmacGetDPCR2() | 0x08000000)); break;
|
|
}
|
|
|
|
CpuResumeIntr(x); //intrman
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// reset 4th bit of channel
|
|
void dmacDisableDMAch(int ch){
|
|
int x;
|
|
CpuSuspendIntr(&x); //intrman
|
|
|
|
switch (ch){
|
|
case DMAch_MDECin: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFFFFFF7)); break;
|
|
case DMAch_MDECout:dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFFFFF7F)); break;
|
|
case DMAch_GPU: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFFFF7FF)); break;
|
|
case DMAch_CD: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFFF7FFF)); break;
|
|
case DMAch_SPU: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFFF7FFFF)); break;
|
|
case DMAch_PIO: dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xFF7FFFFF)); break;
|
|
case DMAch_GPUotc:dmacSetDPCR(
|
|
(dmacGetDPCR() & 0xF7FFFFFF)); break;
|
|
case DMAch_SPU2: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFFFFFF7)); break;
|
|
case DMAch_8: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFFFFF7F)); break;
|
|
case DMAch_SIF0: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFFFF7FF)); break;
|
|
case DMAch_SIF1: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFFF7FFF)); break;
|
|
case DMAch_SIO2in:dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFFF7FFFF)); break;
|
|
case DMAch_SIO2out:dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xFF7FFFFF)); break;
|
|
case DMAch_13: dmacSetDPCR3(
|
|
(dmacGetDPCR3() & 0xFFFFFFF7)); break;
|
|
case DMAch_14: dmacSetDPCR3(
|
|
(dmacGetDPCR3() & 0xFFFFFF7F)); break;
|
|
case DMAch_15: dmacSetDPCR3(
|
|
(dmacGetDPCR3() & 0xFFFFF7FF)); break;
|
|
case DMAch_85: dmacSetDPCR2(
|
|
(dmacGetDPCR2() & 0xF7FFFFFF)); break;
|
|
}
|
|
|
|
CpuResumeIntr(x); //intrman
|
|
}
|
|
|
|
void _retonly(){}
|
|
|
|
//////////////////////////////entrypoint///////////////////////////////
|
|
struct export dmacman_stub={
|
|
0x41C00000,
|
|
0,
|
|
VER(1, 2), // 1.2 => 0x102
|
|
0,
|
|
"dmacman",
|
|
(func)_start, // entrypoint
|
|
(func)_retonly,
|
|
(func)dmacDeinit,
|
|
(func)_retonly,
|
|
(func)dmacSetD_MADR,
|
|
(func)dmacGetD_MADR,
|
|
(func)dmacSetD_BCR,
|
|
(func)dmacGetD_BCR,
|
|
(func)dmacSetD_CHCR,
|
|
(func)dmacGetD_CHCR,
|
|
(func)dmacSetD_TADR,
|
|
(func)dmacGetD_TADR,
|
|
(func)dmacSet_4_9_A,
|
|
(func)dmacGet_4_9_A,
|
|
(func)dmacSetDPCR,
|
|
(func)dmacGetDPCR,
|
|
(func)dmacSetDPCR2,
|
|
(func)dmacGetDPCR2,
|
|
(func)dmacSetDPCR3,
|
|
(func)dmacGetDPCR3,
|
|
(func)dmacSetDICR,
|
|
(func)dmacGetDICR,
|
|
(func)dmacSetDICR2,
|
|
(func)dmacGetDICR2,
|
|
(func)dmacSetBF80157C,
|
|
(func)dmacGetBF80157C,
|
|
(func)dmacSetBF801578,
|
|
(func)dmacGetBF801578,
|
|
(func)dmacSetDMA,
|
|
(func)dmacSetDMA_chainedSPU_SIF0,
|
|
(func)dmacSetDMA_SIF0,
|
|
(func)dmacSetDMA_SIF1,
|
|
(func)dmacStartTransfer,
|
|
(func)dmacSetVal,
|
|
(func)dmacEnableDMAch,
|
|
(func)dmacDisableDMAch,
|
|
0
|
|
};
|
|
|
|
//////////////////////////////entrypoint///////////////////////////////
|
|
int _start(int argc, char* argv[]){
|
|
int x;
|
|
register int ch;
|
|
|
|
if (RegisterLibraryEntries(&dmacman_stub)) //loadcore
|
|
return 1;
|
|
|
|
CpuSuspendIntr(&x); //intrman
|
|
|
|
dmacSetDPCR(0x07777777);
|
|
dmacSetDPCR2(0x07777777);
|
|
dmacSetDPCR3(0x00000777);
|
|
for (ch=0; ch<13; ch++){
|
|
dmacSetD_MADR(ch, 0);
|
|
dmacSetD_BCR (ch, 0);
|
|
dmacSetD_CHCR(ch, 0);
|
|
}
|
|
dmacSetD_TADR( DMAch_SPU, 0);
|
|
dmacSetD_TADR( DMAch_SIF0,0);
|
|
dmacSet_4_9_A( DMAch_SPU, 0);
|
|
dmacSet_4_9_A( DMAch_SIF0,0);
|
|
dmacSet_4_9_A( DMAch_SIF1,0);
|
|
dmacSetBF801578(1);
|
|
|
|
CpuResumeIntr(x); //intrman
|
|
return 0;
|
|
}
|
|
|