updated bords/mappers/stuff to 0.98.15, lots of them got broken, asmcore support...
[fceu.git] / mappers / 211.c
1 #include "mapinc.h"\r
2 \r
3 static uint8 mul[2];\r
4 static uint8 regie;\r
5 #define tkcom1 mapbyte1[1]\r
6 #define tkcom2 mapbyte1[2]\r
7 #define tkcom3 mapbyte1[3]\r
8 \r
9 #define prgb        mapbyte2\r
10 #define chr     mapbyte3\r
11 \r
12 static uint16 names[4];\r
13 static uint8  tekker;\r
14 \r
15 static DECLFR(tekread)\r
16 {\r
17 // FCEU_printf("READ READ READ: $%04x, $%04x, $%04x\n",A,X.PC,tekker);\r
18  switch(A)\r
19  {\r
20   case 0x5000:return(tekker);\r
21   case 0x5800:return(mul[0]*mul[1]);\r
22   case 0x5801:return((mul[0]*mul[1])>>8);\r
23   case 0x5803:return(regie);\r
24   default:break;\r
25  }\r
26  return(X.DB);\r
27 }\r
28 \r
29 static void mira(void)\r
30 {\r
31   int x;\r
32   if(tkcom1&0x40)        // Name tables are ROM-only\r
33   {\r
34    for(x=0;x<4;x++)\r
35     setntamem(CHRptr[0]+(((names[x])&CHRmask1[0])<<10), 0, x);\r
36   }\r
37   else                        // Name tables can be RAM or ROM.\r
38   {\r
39   for(x=0;x<4;x++)\r
40   {\r
41    if(((tkcom3&0x80)==(names[x]&0x80)))        // RAM selected.\r
42     setntamem(NTARAM + ((names[x]&0x1)<<10),1,x);\r
43    else\r
44     setntamem(CHRptr[0]+(((names[x])&CHRmask1[0])<<10), 0, x);\r
45   }\r
46   }\r
47 }\r
48 \r
49 static void tekprom(void)\r
50 {\r
51  switch(tkcom1&3)\r
52   {\r
53    case 1:              // 16 KB\r
54           ROM_BANK16(0x8000,prgb[0]);\r
55           ROM_BANK16(0xC000,prgb[2]);\r
56           break;\r
57 \r
58    case 2:              //2 = 8 KB ??\r
59           ROM_BANK8(0x8000,prgb[0]);\r
60           ROM_BANK8(0xa000,prgb[1]);\r
61           ROM_BANK8(0xc000,prgb[2]);\r
62           ROM_BANK8(0xe000,~0);\r
63                break;\r
64   }\r
65 }\r
66 \r
67 static void tekvrom(void)\r
68 {\r
69  int x;\r
70  switch(tkcom1&0x18)\r
71   {\r
72    case 0x00:      // 8KB\r
73            setchr8(chr[0]);\r
74                break;\r
75    case 0x08:      // 4KB\r
76           for(x=0;x<8;x+=4)\r
77            setchr4(x<<10,chr[x]);\r
78               break;\r
79    case 0x10:      // 2KB\r
80               for(x=0;x<8;x+=2)\r
81            setchr2(x<<10,chr[x]);\r
82               break;\r
83    case 0x18:      // 1KB\r
84               for(x=0;x<8;x++)\r
85                setchr1(x<<10,chr[x]);\r
86               break;\r
87  }\r
88 }\r
89 \r
90 static DECLFW(Mapper211_write)\r
91 {\r
92  if(A==0x5800) mul[0]=V;\r
93  else if(A==0x5801) mul[1]=V;\r
94  else if(A==0x5803) regie=V;\r
95 \r
96  A&=0xF007;\r
97  if(A>=0x8000 && A<=0x8003)\r
98  {\r
99   prgb[A&3]=V;\r
100   tekprom();\r
101  }\r
102  else if(A>=0x9000 && A<=0x9007)\r
103  {\r
104   chr[A&7]=V;\r
105   tekvrom();\r
106  }\r
107  else if(A>=0xb000 && A<=0xb007)\r
108  {\r
109    names[A&3]=V&3;\r
110    mira();\r
111  }\r
112  else switch(A)\r
113  {\r
114    case 0xc002:IRQa=0;X6502_IRQEnd(FCEU_IQEXT);break;\r
115    case 0xc003:\r
116    case 0xc004:if(!IRQa) {IRQa=1;IRQCount=IRQLatch;} break;\r
117    case 0xc005:IRQCount=IRQLatch=V;\r
118                X6502_IRQEnd(FCEU_IQEXT);break;\r
119    case 0xd000: tkcom1=V; mira(); break;\r
120    case 0xd001: tkcom3=V; mira(); break;\r
121  }\r
122 }\r
123 \r
124 static void Mapper211_hb(void)\r
125 {\r
126  if(IRQCount) IRQCount--;\r
127  if(!IRQCount)\r
128  {\r
129   if(IRQa) X6502_IRQBegin(FCEU_IQEXT);\r
130   IRQa=0;\r
131  }\r
132 }\r
133 static void togglie()\r
134 {\r
135   tekker^=0xFF;\r
136 }\r
137 \r
138 void Mapper211_init(void)\r
139 {\r
140   tekker=0xFF;\r
141   MapperReset=togglie;\r
142   SetWriteHandler(0x5000,0xffff,Mapper211_write);\r
143   SetReadHandler(0x5000,0x5fff,tekread);\r
144   GameHBIRQHook=Mapper211_hb;\r
145 }\r
146 \r