cleanups, savestates, input (combos), menu
[fceu.git] / mappers / 211.c
CommitLineData
d97315ac 1#include "mapinc.h"\r
2\r
3static uint8 mul[2];\r
4static 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
12static uint16 names[4];\r
13static uint8 tekker;\r
14\r
15static 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
29static 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
49static 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
67static 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
90static 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
124static 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
133static void togglie()\r
134{\r
135 tekker^=0xFF;\r
136}\r
137\r
138void 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