X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=boards%2Fsachen.c;h=ab57f3c30d4559b28330f29025fc239fac8626eb;hp=bcec3a9001e4fa12af02e91a27b954fde6c2f915;hb=386f5371eb984fb9c2860c83e740890a75cd45c1;hpb=d97315ac0bca825d2d50a44453bc5652946e2c67 diff --git a/boards/sachen.c b/boards/sachen.c index bcec3a9..ab57f3c 100644 --- a/boards/sachen.c +++ b/boards/sachen.c @@ -15,15 +15,15 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "mapinc.h" -static uint8 cmd; +static uint8 cmd, dip; static uint8 latch[8]; -static void MSync(uint8 mirr) +static void S74LS374MSync(uint8 mirr) { switch(mirr&3) { @@ -38,7 +38,7 @@ static void S74LS374NSynco(void) { setprg32(0x8000,latch[0]); setchr8(latch[1]|latch[3]|latch[4]); - MSync(latch[2]); + S74LS374MSync(latch[2]); } static DECLFW(S74LS374NWrite) @@ -50,9 +50,9 @@ static DECLFW(S74LS374NWrite) { switch(cmd) { - case 2:latch[3]=(V&1)<<3;break; + case 2:latch[0]=V&1; latch[3]=(V&1)<<3;break; case 4:latch[4]=(V&1)<<2;break; - case 5:latch[0]=V&0x7;break; + case 5:latch[0]=V&7;break; case 6:latch[1]=V&3;break; case 7:latch[2]=V>>1;break; } @@ -60,12 +60,32 @@ static DECLFW(S74LS374NWrite) } } +static DECLFR(S74LS374NRead) +{ + uint8 ret; + if((A&0x4100)==0x4100) +// ret=(X.DB&0xC0)|((~cmd)&0x3F); + ret=((~cmd)&0x3F)^dip; + else + ret=X.DB; + return ret; +} + static void S74LS374NPower(void) { + dip=0; latch[0]=latch[1]=latch[2]=latch[3]=latch[4]=0; S74LS374NSynco(); SetReadHandler(0x8000,0xFFFF,CartBR); SetWriteHandler(0x4100,0x7FFF,S74LS374NWrite); + SetReadHandler(0x4100,0x5fff,S74LS374NRead); +} + +static void S74LS374NReset(void) +{ + dip^=1; + latch[0]=latch[1]=latch[2]=latch[3]=latch[4]=0; + S74LS374NSynco(); } static void S74LS374NRestore(int version) @@ -76,16 +96,18 @@ static void S74LS374NRestore(int version) void S74LS374N_Init(CartInfo *info) { info->Power=S74LS374NPower; + info->Reset=S74LS374NReset; GameStateRestore=S74LS374NRestore; AddExState(latch, 5, 0, "LATC"); AddExState(&cmd, 1, 0, "CMD"); + AddExState(&dip, 1, 0, "DIP"); } static void S74LS374NASynco(void) { setprg32(0x8000,latch[0]); setchr8(latch[1]); - MSync(latch[2]); + S74LS374MSync(latch[2]); } static DECLFW(S74LS374NAWrite) @@ -104,7 +126,7 @@ static DECLFW(S74LS374NAWrite) case 6:latch[1]=(latch[1]&1)|latch[3]|((V&3)<<1);break; case 7:latch[2]=V&1;break; } - S74LS374NSynco(); + S74LS374NASynco(); } } @@ -126,7 +148,6 @@ void S74LS374NA_Init(CartInfo *info) } static int type; -//static int PPUbus; static void S8259Synco(void) { int x; @@ -159,7 +180,10 @@ static void S8259Synco(void) } } } - MSync(latch[7]>>1); + if(!(latch[7]&1)) + S74LS374MSync(latch[7]>>1); + else + setmirror(MI_V); } static DECLFW(S8259Write) @@ -230,12 +254,6 @@ void S8259D_Init(CartInfo *info) // Kevin's Horton 137 mapper static void(*WSync)(void); -static void SA0161MSynco() -{ - setprg32(0x8000,(latch[0]>>3)&1); - setchr8(latch[0]&7); -} - static DECLFW(SAWrite) { if(A&0x100) @@ -245,7 +263,7 @@ static DECLFW(SAWrite) } } -static void SAReset(void) +static void SAPower(void) { latch[0]=0; WSync(); @@ -253,116 +271,119 @@ static void SAReset(void) SetWriteHandler(0x4100,0x5FFF,SAWrite); } -static void SA0161MRestore(int version) +static void SARestore(int version) { - SA0161MSynco(); + WSync(); } -void SA0161M_Init(CartInfo *info) +static DECLFW(SADWrite) { - WSync=SA0161MSynco; - GameStateRestore=SA0161MRestore; - info->Power=SAReset; - AddExState(&latch[0], 1, 0, "LATC"); + latch[0]=V; + WSync(); } -static void SA72007Synco() +static void SADPower(void) { - setprg32(0x8000,0); - setchr8(latch[0]>>7); + latch[0]=0; + WSync(); + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x8000,0xFFFF,SADWrite); } -static void SA72007Restore(int version) +static void SA0161MSynco() { - SA72007Synco(); + setprg32(0x8000,(latch[0]>>3)&1); + setchr8(latch[0]&7); } -void SA72007_Init(CartInfo *info) +static void SA72007Synco() { - WSync=SA72007Synco; - GameStateRestore=SA72007Restore; - info->Power=SAReset; - AddExState(&latch[0], 1, 0, "LATC"); + setprg32(0x8000,0); + setchr8(latch[0]>>7); } -static void SA72008Synco() +static void SA009Synco() { - setprg32(0x8000,(latch[0]>>2)&1); - setchr8(latch[0]&3); + setprg32(0x8000,0); + setchr8(latch[0]&1); } -static void SA72008Restore(int version) +static void SA72008Synco() { - SA72008Synco(); + setprg32(0x8000,(latch[0]>>2)&1); + setchr8(latch[0]&3); } -void SA72008_Init(CartInfo *info) +void SA0161M_Init(CartInfo *info) { - WSync=SA72008Synco; - GameStateRestore=SA72008Restore; - info->Power=SAReset; + WSync=SA0161MSynco; + GameStateRestore=SARestore; + info->Power=SAPower; AddExState(&latch[0], 1, 0, "LATC"); } -static DECLFW(SADWrite) -{ - latch[0]=V; - WSync(); -} - -static void SADReset(void) +void SA72007_Init(CartInfo *info) { - latch[0]=0; - WSync(); - SetReadHandler(0x8000,0xFFFF,CartBR); - SetWriteHandler(0x8000,0xFFFF,SADWrite); + WSync=SA72007Synco; + GameStateRestore=SARestore; + info->Power=SAPower; + AddExState(&latch[0], 1, 0, "LATC"); } -static void SA0037Synco() +void SA72008_Init(CartInfo *info) { - setprg32(0x8000,(latch[0]>>3)&1); - setchr8(latch[0]&7); + WSync=SA72008Synco; + GameStateRestore=SARestore; + info->Power=SAPower; + AddExState(&latch[0], 1, 0, "LATC"); } -static void SA0037Restore(int version) +void SA009_Init(CartInfo *info) { - SA0037Synco(); + WSync=SA009Synco; + GameStateRestore=SARestore; + info->Power=SAPower; + AddExState(&latch[0], 1, 0, "LATC"); } void SA0036_Init(CartInfo *info) { WSync=SA72007Synco; - GameStateRestore=SA72007Restore; - info->Power=SADReset; + GameStateRestore=SARestore; + info->Power=SADPower; AddExState(&latch[0], 1, 0, "LATC"); } void SA0037_Init(CartInfo *info) { - WSync=SA0037Synco; - GameStateRestore=SA0037Restore; - info->Power=SADReset; + WSync=SA0161MSynco; + GameStateRestore=SARestore; + info->Power=SADPower; AddExState(&latch[0], 1, 0, "LATC"); } +// ----------------------------------------------- + static void TCU01Synco() { - setprg32(0x8000,(latch[0]>>2)&1); + setprg32(0x8000,((latch[0]&0x80)>>6)|((latch[0]>>2)&1)); setchr8((latch[0]>>3)&0xF); } -static DECLFW(TCWrite) +static DECLFW(TCU01Write) { if((A&0x103)==0x102) + { latch[0]=V; - TCU01Synco(); + TCU01Synco(); + } } -static void TCU01Reset(void) +static void TCU01Power(void) { latch[0]=0; SetReadHandler(0x8000,0xFFFF,CartBR); - SetWriteHandler(0x4100,0xFFFF,TCWrite); + SetWriteHandler(0x4100,0xFFFF,TCU01Write); TCU01Synco(); } @@ -374,10 +395,55 @@ static void TCU01Restore(int version) void TCU01_Init(CartInfo *info) { GameStateRestore=TCU01Restore; - info->Power=TCU01Reset; + info->Power=TCU01Power; AddExState(&latch[0], 1, 0, "LATC"); } +//----------------------------------------------- + +static void TCU02Synco() +{ + setprg32(0x8000,0); + setchr8(latch[0]&3); +} + +static DECLFW(TCU02Write) +{ + if((A&0x103)==0x102) + { + latch[0]=V+3; + TCU02Synco(); + } +} + +static DECLFR(TCU02Read) +{ + return (latch[0]&0x3F)|(X.DB&0xC0); +} + +static void TCU02Power(void) +{ + latch[0]=0; + SetReadHandler(0x8000,0xFFFF,CartBR); + SetReadHandler(0x4100,0x4100,TCU02Read); + SetWriteHandler(0x4100,0xFFFF,TCU02Write); + TCU02Synco(); +} + +static void TCU02Restore(int version) +{ + TCU02Synco(); +} + +void TCU02_Init(CartInfo *info) +{ + GameStateRestore=TCU02Restore; + info->Power=TCU02Power; + AddExState(&latch[0], 1, 0, "LATC"); +} + +// --------------------------------------------- + static DECLFR(TCA01Read) { uint8 ret; @@ -388,7 +454,7 @@ static DECLFR(TCA01Read) return ret; } -static void TCA01Reset(void) +static void TCA01Power(void) { setprg16(0x8000,0); setprg16(0xC000,1); @@ -399,5 +465,6 @@ static void TCA01Reset(void) void TCA01_Init(CartInfo *info) { - info->Power=TCA01Reset; + info->Power=TCA01Power; } +