2009-09-08 12:08:10 +00:00
|
|
|
/* PCSX2 - PS2 Emulator for PCs
|
2010-05-03 14:08:02 +00:00
|
|
|
* Copyright (C) 2002-2010 PCSX2 Dev Team
|
2010-04-25 00:31:27 +00:00
|
|
|
*
|
2009-09-08 12:08:10 +00:00
|
|
|
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
|
|
|
* of the GNU Lesser General Public License as published by the Free Software Found-
|
|
|
|
* ation, either version 3 of the License, or (at your option) any later version.
|
2009-02-09 21:15:56 +00:00
|
|
|
*
|
2009-09-08 12:08:10 +00:00
|
|
|
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE. See the GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with PCSX2.
|
|
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
2009-02-09 21:15:56 +00:00
|
|
|
*/
|
|
|
|
|
2009-09-08 12:08:10 +00:00
|
|
|
|
2009-02-09 21:15:56 +00:00
|
|
|
#include "PrecompiledHeader.h"
|
2009-03-13 04:49:23 +00:00
|
|
|
#include "IopCommon.h"
|
2009-11-14 12:02:56 +00:00
|
|
|
|
|
|
|
#include "Sio.h"
|
2009-05-16 00:43:46 +00:00
|
|
|
#include "sio_internal.h"
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
sio2Struct sio2;
|
|
|
|
|
|
|
|
/*
|
|
|
|
w [8268]=0x3bc sio2_start/sio2man
|
|
|
|
r [8270] padman_start/padman
|
|
|
|
padman->7480[00]=bit4;
|
|
|
|
padman->7480[13]=bit5;
|
|
|
|
packetExchange(&703F8);
|
|
|
|
w [8268]|=0x0C;
|
|
|
|
........
|
|
|
|
w [8268]|=0x01;
|
|
|
|
|
|
|
|
only recv2 & dataout influences padman
|
|
|
|
*/
|
|
|
|
|
|
|
|
// 0xBF808200,0xBF808204,0xBF808208,0xBF80820C,
|
|
|
|
// 0xBF808210,0xBF808214,0xBF808218,0xBF80821C, packet->sendArray3
|
|
|
|
// 0xBF808220,0xBF808224,0xBF808228,0xBF80822C, call12/13_s/getparams
|
|
|
|
// 0xBF808230,0xBF808234,0xBF808238,0xBF80823C,
|
|
|
|
|
|
|
|
// 0xBF808240,0xBF808248,0xBF808250,0xBF808258, packet->sendArray1/call_7/8
|
|
|
|
// 0xBF808244,0xBF80824C,0xBF808254,0xBF80825C, packet->sendArray2/call_9/10
|
|
|
|
|
|
|
|
// 0xBF808260, serial data/fifo in/out s/get8260_datain/out packet->sendbuf(nomem!)
|
|
|
|
// 0xBF808268, ctrl s/get8268_ctrl
|
|
|
|
|
|
|
|
// 0xBF80826C, packet->recv1/2/3 get826C_recv1, get8270_recv2, get8274_recv3
|
|
|
|
// 0xBF808270,0xBF808274,
|
|
|
|
|
|
|
|
// 0xBF808278,0xBF80827C, s/get8278, s/get827C
|
|
|
|
// 0xBF808280 interrupt related s/get8280_intr
|
|
|
|
|
|
|
|
|
|
|
|
void sio2Reset() {
|
2009-10-29 13:32:40 +00:00
|
|
|
DevCon.WriteLn( "Sio2 Reset" );
|
2009-09-23 12:53:32 +00:00
|
|
|
memzero(sio2);
|
2009-02-09 21:15:56 +00:00
|
|
|
sio2.packet.recvVal1 = 0x1D100; // Nothing is connected at start
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 sio2_getRecv1() {
|
2009-03-27 06:34:51 +00:00
|
|
|
PAD_LOG("Reading Recv1 = %x",sio2.packet.recvVal1);
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
return sio2.packet.recvVal1;
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 sio2_getRecv2() {
|
2009-03-27 06:34:51 +00:00
|
|
|
PAD_LOG("Reading Recv2 = %x",0xF);
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
return 0xf;
|
|
|
|
}//0, 0x10, 0x20, 0x10 | 0x20; bits 4 & 5
|
|
|
|
|
2010-04-25 00:31:27 +00:00
|
|
|
u32 sio2_getRecv3() {
|
2009-02-09 21:15:56 +00:00
|
|
|
if(sio2.packet.recvVal3 == 0x8C || sio2.packet.recvVal3 == 0x8b ||
|
|
|
|
sio2.packet.recvVal3 == 0x83)
|
|
|
|
{
|
2009-03-27 06:34:51 +00:00
|
|
|
PAD_LOG("Reading Recv3 = %x",sio2.packet.recvVal3);
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
sio.packetsize = sio2.packet.recvVal3;
|
|
|
|
sio2.packet.recvVal3 = 0; // Reset
|
|
|
|
return sio.packetsize;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-03-27 06:34:51 +00:00
|
|
|
PAD_LOG("Reading Recv3 = %x",sio.packetsize << 16);
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
return sio.packetsize << 16;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void sio2_setSend1(u32 index, u32 value){sio2.packet.sendArray1[index]=value;} //0->3
|
|
|
|
u32 sio2_getSend1(u32 index){return sio2.packet.sendArray1[index];} //0->3
|
|
|
|
void sio2_setSend2(u32 index, u32 value){sio2.packet.sendArray2[index]=value;} //0->3
|
|
|
|
u32 sio2_getSend2(u32 index){return sio2.packet.sendArray2[index];} //0->3
|
|
|
|
|
2010-04-25 00:31:27 +00:00
|
|
|
void sio2_setSend3(u32 index, u32 value)
|
2009-02-09 21:15:56 +00:00
|
|
|
{
|
|
|
|
// int i;
|
|
|
|
sio2.packet.sendArray3[index]=value;
|
|
|
|
// if (index==15){
|
|
|
|
// for (i=0; i<4; i++){PAD_LOG("0x%08X ", sio2.packet.sendArray1[i]);}PAD_LOG("\n");
|
|
|
|
// for (i=0; i<4; i++){PAD_LOG("0x%08X ", sio2.packet.sendArray2[i]);}PAD_LOG("\n");
|
|
|
|
// for (i=0; i<8; i++){PAD_LOG("0x%08X ", sio2.packet.sendArray3[i]);}PAD_LOG("\n");
|
|
|
|
// for ( ; i<16; i++){PAD_LOG("0x%08X ", sio2.packet.sendArray3[i]);}PAD_LOG("\n");
|
2009-03-27 06:34:51 +00:00
|
|
|
PAD_LOG("[%d] : 0x%08X", index,sio2.packet.sendArray3[index]);
|
2009-02-09 21:15:56 +00:00
|
|
|
// }
|
|
|
|
} //0->15
|
|
|
|
|
|
|
|
u32 sio2_getSend3(u32 index) {return sio2.packet.sendArray3[index];} //0->15
|
|
|
|
|
|
|
|
void sio2_setCtrl(u32 value){
|
|
|
|
sio2.ctrl=value;
|
|
|
|
if (sio2.ctrl & 1){ //recv packet
|
|
|
|
//handle data that had been sent
|
|
|
|
|
|
|
|
iopIntcIrq( 17 );
|
|
|
|
//SBUS
|
|
|
|
sio2.recvIndex=0;
|
|
|
|
sio2.ctrl &= ~1;
|
|
|
|
} else { // send packet
|
|
|
|
//clean up
|
|
|
|
sio2.packet.sendSize=0; //reset size
|
|
|
|
sio2.cmdport=0;
|
|
|
|
sio2.cmdlength=0;
|
|
|
|
sioWriteCtrl16(SIO_RESET);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
u32 sio2_getCtrl(){return sio2.ctrl;}
|
|
|
|
|
|
|
|
void sio2_setIntr(u32 value){sio2.intr=value;}
|
|
|
|
u32 sio2_getIntr(){
|
|
|
|
return sio2.intr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void sio2_set8278(u32 value){sio2._8278=value;}
|
|
|
|
u32 sio2_get8278(){return sio2._8278;}
|
|
|
|
void sio2_set827C(u32 value){sio2._827C=value;}
|
|
|
|
u32 sio2_get827C(){return sio2._827C;}
|
|
|
|
|
|
|
|
void sio2_serialIn(u8 value){
|
|
|
|
u16 ctrl=0x0002;
|
|
|
|
if (sio2.packet.sendArray3[sio2.cmdport] && (sio2.cmdlength==0))
|
|
|
|
{
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2009-02-09 21:15:56 +00:00
|
|
|
sio2.cmdlength=(sio2.packet.sendArray3[sio2.cmdport] >> 8) & 0x1FF;
|
|
|
|
ctrl &= ~0x2000;
|
|
|
|
ctrl |= (sio2.packet.sendArray3[sio2.cmdport] & 1) << 13;
|
|
|
|
//sioWriteCtrl16(SIO_RESET);
|
|
|
|
sioWriteCtrl16(ctrl);
|
2009-03-27 06:34:51 +00:00
|
|
|
PSXDMA_LOG("sio2_fifoIn: ctrl = %x, cmdlength = %x, cmdport = %d (%x)", ctrl, sio2.cmdlength, sio2.cmdport, sio2.packet.sendArray3[sio2.cmdport]);
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
sio2.cmdport++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sio2.cmdlength) sio2.cmdlength--;
|
|
|
|
sioWrite8(value);
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2009-02-09 21:15:56 +00:00
|
|
|
if (sio2.packet.sendSize > BUFSIZE) {//asadr
|
2009-10-29 13:32:40 +00:00
|
|
|
Console.Warning("*PCSX2*: sendSize >= %d", BUFSIZE);
|
2009-02-09 21:15:56 +00:00
|
|
|
} else {
|
|
|
|
sio2.buf[sio2.packet.sendSize] = sioRead8();
|
|
|
|
sio2.packet.sendSize++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
extern void SIODMAWrite(u8 value);
|
|
|
|
|
|
|
|
void sio2_fifoIn(u8 value){
|
|
|
|
u16 ctrl=0x0002;
|
|
|
|
if (sio2.packet.sendArray3[sio2.cmdport] && (sio2.cmdlength==0))
|
|
|
|
{
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2009-02-09 21:15:56 +00:00
|
|
|
sio2.cmdlength=(sio2.packet.sendArray3[sio2.cmdport] >> 8) & 0x1FF;
|
|
|
|
ctrl &= ~0x2000;
|
|
|
|
ctrl |= (sio2.packet.sendArray3[sio2.cmdport] & 1) << 13;
|
|
|
|
//sioWriteCtrl16(SIO_RESET);
|
|
|
|
sioWriteCtrl16(ctrl);
|
2009-03-27 06:34:51 +00:00
|
|
|
PSXDMA_LOG("sio2_fifoIn: ctrl = %x, cmdlength = %x, cmdport = %d (%x)", ctrl, sio2.cmdlength, sio2.cmdport, sio2.packet.sendArray3[sio2.cmdport]);
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
sio2.cmdport++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sio2.cmdlength) sio2.cmdlength--;
|
|
|
|
SIODMAWrite(value);
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2009-02-09 21:15:56 +00:00
|
|
|
if (sio2.packet.sendSize > BUFSIZE) {//asadr
|
Lots of new code maintenance stuffs:
* Completely new assertion macros: pxAssert, pxAssertMsg, and pxFail, pxAssertDev (both which default to using a message). These replace *all* wxASSERT, DevAssert, and jASSUME varieties of macros. New macros borrow the best of all assertion worlds: MSVCRT, wxASSERT, and AtlAssume. :)
* Rewrote the Console namespace as a structure called IConsoleWriter, and created several varieties of ConsoleWriters for handling different states of log and console availability (should help reduce overhead of console logging nicely).
* More improvements to the PersistentThread model, using safely interlocked "Do*" style callbacks for starting and cleaning up threads.
* Fixed console logs so that they're readable in Win32 notepad again (the log writer adds CRs to naked LFs).
* Added AppInit.cpp -- contains constructor, destructor, OnInit, and command line parsing mess.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1950 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-04 08:27:27 +00:00
|
|
|
Console.WriteLn("*PCSX2*: sendSize >= %d", BUFSIZE);
|
2009-02-09 21:15:56 +00:00
|
|
|
} else {
|
|
|
|
sio2.buf[sio2.packet.sendSize] = sioRead8();
|
|
|
|
sio2.packet.sendSize++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
u8 sio2_fifoOut(){
|
|
|
|
if (sio2.recvIndex <= sio2.packet.sendSize){
|
|
|
|
//PAD_LOG("READING %x\n",sio2.buf[sio2.recvIndex]);
|
|
|
|
return sio2.buf[sio2.recvIndex++];
|
|
|
|
} else {
|
Lots of new code maintenance stuffs:
* Completely new assertion macros: pxAssert, pxAssertMsg, and pxFail, pxAssertDev (both which default to using a message). These replace *all* wxASSERT, DevAssert, and jASSUME varieties of macros. New macros borrow the best of all assertion worlds: MSVCRT, wxASSERT, and AtlAssume. :)
* Rewrote the Console namespace as a structure called IConsoleWriter, and created several varieties of ConsoleWriters for handling different states of log and console availability (should help reduce overhead of console logging nicely).
* More improvements to the PersistentThread model, using safely interlocked "Do*" style callbacks for starting and cleaning up threads.
* Fixed console logs so that they're readable in Win32 notepad again (the log writer adds CRs to naked LFs).
* Added AppInit.cpp -- contains constructor, destructor, OnInit, and command line parsing mess.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1950 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-10-04 08:27:27 +00:00
|
|
|
Console.Error( "*PCSX2*: buffer overrun" );
|
2009-02-09 21:15:56 +00:00
|
|
|
}
|
|
|
|
return 0; // No Data
|
|
|
|
}
|
|
|
|
|
2009-09-16 17:23:02 +00:00
|
|
|
void SaveStateBase::sio2Freeze()
|
2009-02-09 21:15:56 +00:00
|
|
|
{
|
2009-03-19 04:16:24 +00:00
|
|
|
FreezeTag( "sio2" );
|
2009-02-09 21:15:56 +00:00
|
|
|
Freeze(sio2);
|
|
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////// DMA
|
|
|
|
/////////////////////////////////////////////////
|
2010-01-23 03:28:32 +00:00
|
|
|
#ifdef ENABLE_NEW_IOPDMA
|
|
|
|
|
2010-02-08 16:35:18 +00:00
|
|
|
static int dmaBlockSize = 0x24;
|
|
|
|
s32 CALLBACK sio2DmaStart(s32 channel, u32 madr, u32 bcr, u32 chcr)
|
|
|
|
{
|
|
|
|
dmaBlockSize = bcr & 0xFFFF;
|
|
|
|
return 0; // continue
|
|
|
|
}
|
|
|
|
|
2010-02-08 16:19:01 +00:00
|
|
|
s32 CALLBACK sio2DmaRead(s32 channel, u32* tdata, u32 bytesLeft, u32* bytesProcessed)
|
2010-01-23 03:28:32 +00:00
|
|
|
{
|
|
|
|
#ifdef ENABLE_NEW_IOPDMA_SIO
|
|
|
|
u8* data = (u8*)tdata;
|
|
|
|
|
|
|
|
if(channel!=12)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
sio2.recvIndex = 0; // Set To start; saqib
|
|
|
|
|
|
|
|
int read = 0;
|
|
|
|
|
2010-01-24 00:14:01 +00:00
|
|
|
// limit the burst length to avoid problems
|
|
|
|
//if(bytesLeft>2048) bytesLeft = 2048;
|
|
|
|
|
2010-04-25 00:31:27 +00:00
|
|
|
while (bytesLeft > 0)
|
2010-01-23 03:28:32 +00:00
|
|
|
{
|
|
|
|
(*(data++)) = sio2_fifoOut();
|
|
|
|
bytesLeft--;
|
|
|
|
read++;
|
|
|
|
if(sio2.recvIndex == sio2.packet.sendSize)
|
|
|
|
{
|
2010-01-23 22:42:49 +00:00
|
|
|
//read = bytesLeft;
|
2010-01-23 03:28:32 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*bytesProcessed = read;
|
|
|
|
#endif
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-02-08 16:19:01 +00:00
|
|
|
s32 CALLBACK sio2DmaWrite(s32 channel, u32* tdata, u32 bytesLeft, u32* bytesProcessed)
|
2010-01-23 03:28:32 +00:00
|
|
|
{
|
|
|
|
#ifdef ENABLE_NEW_IOPDMA_SIO
|
|
|
|
u8* data = (u8*)tdata;
|
|
|
|
|
|
|
|
if(channel!=11)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
//int available = sio2_getFifoInFree();
|
|
|
|
|
2010-01-24 00:14:01 +00:00
|
|
|
// limit the burst length to avoid problems
|
|
|
|
//if(bytesLeft>2048) bytesLeft = 2048;
|
|
|
|
|
2010-01-23 03:28:32 +00:00
|
|
|
int written = 0;
|
|
|
|
|
2010-02-08 16:35:18 +00:00
|
|
|
int bs = dmaBlockSize * 4;
|
|
|
|
int bc = bytesLeft / bs;
|
2010-02-03 03:59:21 +00:00
|
|
|
|
|
|
|
//assert(ts == bytesLeft);
|
2010-01-24 02:16:06 +00:00
|
|
|
|
|
|
|
for(int j=0;j<bc;j++)
|
2010-01-23 03:28:32 +00:00
|
|
|
{
|
|
|
|
sio.count = 1;
|
2010-02-10 14:40:14 +00:00
|
|
|
for(int i=0;i<bs;i++)
|
2010-01-23 03:28:32 +00:00
|
|
|
{
|
2010-01-24 02:16:06 +00:00
|
|
|
sio2_fifoIn(*(data++));
|
|
|
|
written++;
|
|
|
|
if((sio2.packet.sendSize == BUFSIZE))
|
|
|
|
{
|
|
|
|
//written = bytesLeft;
|
|
|
|
break;
|
|
|
|
}
|
2010-01-23 03:28:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*bytesProcessed = written;
|
|
|
|
#endif
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-02-08 16:19:01 +00:00
|
|
|
void CALLBACK sio2DmaInterrupt(s32 channel)
|
2010-01-23 03:28:32 +00:00
|
|
|
{
|
|
|
|
#ifdef ENABLE_NEW_IOPDMA_SIO
|
2010-01-24 03:00:41 +00:00
|
|
|
switch(channel) // Interrupts should always occur at the end
|
|
|
|
{
|
|
|
|
case 11: PSX_INT(IopEvt_Dma11,0); break;
|
|
|
|
case 12: PSX_INT(IopEvt_Dma12,0); break;
|
|
|
|
}
|
2010-01-23 03:28:32 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//#else
|
|
|
|
#endif
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
void psxDma11(u32 madr, u32 bcr, u32 chcr) {
|
|
|
|
unsigned int i, j;
|
|
|
|
int size = (bcr >> 16) * (bcr & 0xffff);
|
2009-03-27 06:34:51 +00:00
|
|
|
PSXDMA_LOG("*** DMA 11 - SIO2 in *** %lx addr = %lx size = %lx", chcr, madr, bcr);
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2009-02-09 21:15:56 +00:00
|
|
|
if (chcr != 0x01000201) return;
|
|
|
|
|
|
|
|
for(i = 0; i < (bcr >> 16); i++)
|
|
|
|
{
|
|
|
|
sio.count = 1;
|
|
|
|
for(j = 0; j < ((bcr & 0xFFFF) * 4); j++)
|
|
|
|
{
|
2009-02-27 18:12:59 +00:00
|
|
|
sio2_fifoIn(iopMemRead8(madr));
|
2009-02-09 21:15:56 +00:00
|
|
|
madr++;
|
|
|
|
if(sio2.packet.sendSize == BUFSIZE)
|
|
|
|
goto finished;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
finished:
|
|
|
|
HW_DMA11_MADR = madr;
|
|
|
|
PSX_INT(IopEvt_Dma11,(size>>2)); // Interrupts should always occur at the end
|
|
|
|
}
|
|
|
|
|
|
|
|
void psxDMA11Interrupt()
|
|
|
|
{
|
|
|
|
HW_DMA11_CHCR &= ~0x01000000;
|
|
|
|
psxDmaInterrupt2(4);
|
|
|
|
}
|
|
|
|
|
|
|
|
void psxDma12(u32 madr, u32 bcr, u32 chcr) {
|
|
|
|
int size = ((bcr >> 16) * (bcr & 0xFFFF)) * 4;
|
2009-03-27 06:34:51 +00:00
|
|
|
PSXDMA_LOG("*** DMA 12 - SIO2 out *** %lx addr = %lx size = %lx", chcr, madr, size);
|
2009-02-09 21:15:56 +00:00
|
|
|
|
|
|
|
if (chcr != 0x41000200) return;
|
|
|
|
|
|
|
|
sio2.recvIndex = 0; // Set To start; saqib
|
|
|
|
|
|
|
|
bcr = size;
|
|
|
|
while (bcr > 0) {
|
2009-02-27 18:12:59 +00:00
|
|
|
iopMemWrite8( madr, sio2_fifoOut() );
|
2009-02-09 21:15:56 +00:00
|
|
|
bcr--; madr++;
|
|
|
|
if(sio2.recvIndex == sio2.packet.sendSize) break;
|
|
|
|
}
|
|
|
|
HW_DMA12_MADR = madr;
|
|
|
|
PSX_INT(IopEvt_Dma12,(size>>2)); // Interrupts should always occur at the end
|
|
|
|
}
|
|
|
|
|
|
|
|
void psxDMA12Interrupt()
|
|
|
|
{
|
|
|
|
HW_DMA12_CHCR &= ~0x01000000;
|
|
|
|
psxDmaInterrupt2(5);
|
|
|
|
}
|
|
|
|
|
2010-01-23 03:28:32 +00:00
|
|
|
//#endif
|