merge mappers from FCEU-mm
[fceu.git] / mappers / 27.c
1 #include "mapinc.h"\r
2 \r
3 static uint32 regchr[9];\r
4 \r
5 static DECLFW(Mapper27_write)\r
6 {\r
7  A&=0xF00F;\r
8  int regnum;\r
9  if((A>=0xB000) && (A<=0xE003)) {\r
10     regnum=((((A>>12)+1)&0x03)<<1)|((A&0x02)>>1);\r
11     if(A&1)\r
12        regchr[regnum]=(regchr[regnum]&0x00F)|(V<<4);\r
13     else\r
14        regchr[regnum]=(regchr[regnum]&0x1F0)|(V&0xF);\r
15     VROM_BANK1(regnum<<10,regchr[regnum]);\r
16  }\r
17  switch(A)\r
18  {\r
19   case 0x8000: ROM_BANK8(0x8000|((regchr[8]&2)<<13),V); break;\r
20   case 0xA000: ROM_BANK8(0xa000,V); break;\r
21   case 0x9000: switch(V&3){\r
22                   case 0:setmirror(MI_V);break;\r
23                   case 1:setmirror(MI_H);break;\r
24                   case 2:setmirror(MI_0);break;\r
25                   case 3:setmirror(MI_1);break;\r
26                }\r
27   case 0x9002: regchr[8]=V; break;\r
28   case 0xF000: //X6502_IRQEnd(FCEU_IQEXT);\r
29                IRQLatch=(IRQLatch&0xF0)|(V&0x0F);\r
30                            break;\r
31   case 0xF001: //X6502_IRQEnd(FCEU_IQEXT);\r
32                IRQLatch=(IRQLatch&0x0F)|((V&0xF)<<4);\r
33                            break;\r
34   case 0xF003: IRQa=((IRQa&0x1)<<1)|(IRQa&0x1);\r
35                            X6502_IRQEnd(FCEU_IQEXT);\r
36                break;\r
37   case 0xF002: IRQa=V&3;\r
38                            if(IRQa&0x02) IRQCount=IRQLatch-1;\r
39 //                           X6502_IRQEnd(FCEU_IQEXT);\r
40                            break;\r
41  }\r
42 // if((A&0xF000)==0xF000) FCEU_printf("$%04x:$%02x, %d\n",A,V, scanline);\r
43 }\r
44 \r
45 static void Mapper27_hb(void)\r
46 {\r
47 //   FCEU_printf("%02x-%d,%d,%d\n",scanline,IRQa,IRQCount,IRQLatch);\r
48         if(IRQa&0x2){\r
49            if(IRQCount==0xFF){\r
50              X6502_IRQBegin(FCEU_IQEXT);\r
51               IRQCount=IRQLatch+1;\r
52          } else {\r
53            IRQCount++;\r
54            }\r
55         }\r
56 }\r
57 \r
58 void Mapper27_init(void)\r
59 {\r
60   int i;\r
61   for (i=0; i<9; i++) {\r
62     regchr[i]=0;\r
63   }\r
64   IRQa=0;\r
65   IRQCount=IRQLatch=0;\r
66   SetWriteHandler(0x8000,0xffff,Mapper27_write);\r
67   GameHBIRQHook=Mapper27_hb;\r
68 }\r
69 \r