# HG changeset patch # User nkeynes # Date 1166521895 0 # Node ID 4c2b7291d3b0daa4a7969cae1d67790beb39c0e8 # Parent df1671d533bff8284277e315fbeba0fd8586c9db First cut of port 576890 (sysreset) and ide enable/disable --- a/src/asic.c Sat Dec 16 12:37:44 2006 +0000 +++ b/src/asic.c Tue Dec 19 09:51:35 2006 +0000 @@ -1,5 +1,5 @@ /** - * $Id: asic.c,v 1.20 2006-12-15 10:18:39 nkeynes Exp $ + * $Id: asic.c,v 1.21 2006-12-19 09:51:35 nkeynes Exp $ * * Support for the miscellaneous ASIC functions (Primarily event multiplexing, * and DMA). @@ -213,6 +213,13 @@ MMIO_WRITE( ASIC, reg, MMIO_READ(ASIC, reg)&~val ); asic_check_cleared_events(); break; + case SYSRESET: + if( val == 0x7611 ) { + dreamcast_reset(); + } else { + WARN( "Unknown value %08X written to SYSRESET port", val ); + } + break; case MAPLE_STATE: MMIO_WRITE( ASIC, reg, val ); if( val & 1 ) { @@ -279,6 +286,10 @@ MMIO_REGION_WRITE_FN( EXTDMA, reg, val ) { + if( !idereg.interface_enabled && IS_IDE_REGISTER(reg) ) { + return; /* disabled */ + } + switch( reg ) { case IDEALTSTATUS: /* Device control */ ide_write_control( val ); @@ -321,6 +332,15 @@ MMIO_WRITE( EXTDMA, reg, val ); asic_ide_dma_transfer( ); break; + case IDEACTIVATE: + if( val == 0x001FFFFF ) { + idereg.interface_enabled = TRUE; + /* Conventional wisdom says that this is necessary but not + * sufficient to enable the IDE interface. + */ + } else if( val == 0x000042FE ) { + idereg.interface_enabled = FALSE; + } default: MMIO_WRITE( EXTDMA, reg, val ); } @@ -329,6 +349,10 @@ MMIO_REGION_READ_FN( EXTDMA, reg ) { uint32_t val; + if( !idereg.interface_enabled && IS_IDE_REGISTER(reg) ) { + return 0xFFFFFFFF; /* disabled */ + } + switch( reg ) { case IDEALTSTATUS: val = idereg.status; --- a/src/asic.h Sat Dec 16 12:37:44 2006 +0000 +++ b/src/asic.h Tue Dec 19 09:51:35 2006 +0000 @@ -1,5 +1,5 @@ /** - * $Id: asic.h,v 1.13 2006-08-02 04:06:42 nkeynes Exp $ + * $Id: asic.h,v 1.14 2006-12-19 09:51:35 nkeynes Exp $ * * Support for the miscellaneous ASIC functions (Primarily event multiplexing, * and DMA). Includes MMIO definitions for the 5f6000 and 5f7000 regions, @@ -41,6 +41,7 @@ LONG_PORT( 0x884, PVRDMARGN, PORT_MRW, 0, "PVR DMA Dest region" ) LONG_PORT( 0x888, ASICUNKA, PORT_MRW, 0, "ASIC " ) LONG_PORT( 0x88C, G2STATUS, PORT_MR|PORT_NOTRACE, 0, "G2 Bus status" ) + LONG_PORT( 0x890, SYSRESET, PORT_W, 0, "System reset port" ) LONG_PORT( 0x89C, ASICUNKB, PORT_MRW, 0xB, "Unknown, always 0xB?" ) LONG_PORT( 0x8A0, ASICUNKC, PORT_MRW, 0, "ASIC " ) LONG_PORT( 0x8A4, ASICUNKD, PORT_MRW, 0, "ASIC " ) @@ -198,6 +199,8 @@ #define EVENT_PVR_MATRIX_ALLOC_FAIL 67 #define EVENT_PVR_BAD_INPUT 68 +#define IS_IDE_REGISTER(x) ( (x) <= IDEDMACTL2 ) + /** * Raise an ASIC event */