X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=boards%2Fh2288.c;h=a3b5a0b704f0728d1e69213e6450100165f2e979;hp=c8ad1e0fb128405201f4e98a3197f6a5c4310cde;hb=43725da7349c85fa13e828fdbf20cc7ac8d298d6;hpb=c62d28102c77e19c291c78bf6bf7f0a81abd54b9 diff --git a/boards/h2288.c b/boards/h2288.c index c8ad1e0..a3b5a0b 100644 --- a/boards/h2288.c +++ b/boards/h2288.c @@ -1,99 +1,80 @@ -/* FCE Ultra - NES/Famicom Emulator - * - * Copyright notice for this file: - * Copyright (C) 2002 Ben Parnell - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* Not finished. Darn evil game... *Mumble*... */ - -#include "mapinc.h" - -static uint8 cmd; -static uint8 regs[8]; - -static void DoPRG(void) -{ - if(cmd&0x40) - { - setprg8(0xC000,regs[4]); - setprg8(0xA000,regs[5]); - setprg8(0x8000,~1); - setprg8(0xE000,~0); - } - else - { - setprg8(0x8000,regs[4]); - setprg8(0xA000,regs[5]); - setprg8(0xC000,~1); - setprg8(0xE000,~0); - } -} - -static void DoCHR(void) -{ - uint32 base=(cmd&0x80)<<5; - - setchr2(0x0000^base,regs[0]); - setchr2(0x0800^base,regs[2]); - - setchr1(0x1000^base,regs[6]); - setchr1(0x1400^base,regs[1]); - setchr1(0x1800^base,regs[7]); - setchr1(0x1c00^base,regs[3]); -} - -static DECLFW(H2288Write) -{ - //printf("$%04x:$%02x, $%04x\n",A,V,X.PC.W); - //RAM[0x7FB]=0x60; - switch(A&0xE001) - { - case 0xa000:setmirror((V&1)^1);break; - case 0x8000:// DumpMem("out",0x0000,0xFFFF); - cmd=V;DoPRG();DoCHR();break; - case 0x8001:regs[cmd&7]=V; - if((cmd&7)==4 || (cmd&7)==5) - DoPRG(); - else - DoCHR(); - break; - } -} - -static DECLFR(H2288Read) -{ - //printf("Rd: $%04x, $%04x\n",A,X.PC.W); - return((X.DB&0xFE)|(A&(A>>8))); -} - -static void H2288Reset(void) -{ - int x; - - SetReadHandler(0x5800,0x5FFF,H2288Read); - SetReadHandler(0x8000,0xFFFF,CartBR); - SetWriteHandler(0x8000,0xFFFF,H2288Write); - for(x=0;x<8;x++) regs[x]=0; - cmd=0; - DoPRG(); - DoCHR(); -} - -void H2288_Init(void) -{ - BoardPower=H2288Reset; -} +/* FCE Ultra - NES/Famicom Emulator + * + * Copyright notice for this file: + * Copyright (C) 2005 CaH4e3 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" +#include "mmc3.h" + +extern uint8 m114_perm[8]; + +static void H2288PW(uint32 A, uint8 V) +{ + if(EXPREGS[0]&0x40) + { + uint8 bank=(EXPREGS[0]&5)|((EXPREGS[0]&8)>>2)|((EXPREGS[0]&0x20)>>2); + if(EXPREGS[0]&2) + setprg32(0x8000,bank>>1); + else + { + setprg16(0x8000,bank); + setprg16(0xC000,bank); + } + } + else + setprg8(A,V&0x3F); +} + +static DECLFW(H2288WriteHi) +{ + switch (A&0x8001) + { + case 0x8000: MMC3_CMDWrite(0x8000,(V&0xC0)|(m114_perm[V&7])); break; + case 0x8001: MMC3_CMDWrite(0x8001,V); break; + } +} + +static DECLFW(H2288WriteLo) +{ + if(A&0x800) + { + if(A&1) + EXPREGS[1]=V; + else + EXPREGS[0]=V; + FixMMC3PRG(MMC3_cmd); + } +} + +static void H2288Power(void) +{ + EXPREGS[0]=EXPREGS[1]=0; + GenMMC3Power(); +// SetReadHandler(0x5000,0x5FFF,H2288Read); + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x5000,0x5FFF,H2288WriteLo); + SetWriteHandler(0x8000,0x9FFF,H2288WriteHi); +} + +void UNLH2288_Init(CartInfo *info) +{ + GenMMC3_Init(info, 256, 256, 0, 0); + pwrap=H2288PW; + info->Power=H2288Power; + AddExState(EXPREGS, 2, 0, "EXPR"); +}