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