--- /dev/null
+#include "mapinc.h"\r
+\r
+static uint8 mul[2];\r
+static uint8 regie;\r
+#define tkcom1 mapbyte1[1]\r
+#define tkcom2 mapbyte1[2]\r
+#define tkcom3 mapbyte1[3]\r
+\r
+#define prgb mapbyte2\r
+#define chr mapbyte3\r
+\r
+static uint16 names[4];\r
+static uint8 tekker;\r
+\r
+static DECLFR(tekread)\r
+{\r
+// FCEU_printf("READ READ READ: $%04x, $%04x, $%04x\n",A,X.PC,tekker);\r
+ switch(A)\r
+ {\r
+ case 0x5000:return(tekker);\r
+ case 0x5800:return(mul[0]*mul[1]);\r
+ case 0x5801:return((mul[0]*mul[1])>>8);\r
+ case 0x5803:return(regie);\r
+ default:break;\r
+ }\r
+ return(X.DB);\r
+}\r
+\r
+static void mira(void)\r
+{\r
+ int x;\r
+ if(tkcom1&0x40) // Name tables are ROM-only\r
+ {\r
+ for(x=0;x<4;x++)\r
+ setntamem(CHRptr[0]+(((names[x])&CHRmask1[0])<<10), 0, x);\r
+ }\r
+ else // Name tables can be RAM or ROM.\r
+ {\r
+ for(x=0;x<4;x++)\r
+ {\r
+ if(((tkcom3&0x80)==(names[x]&0x80))) // RAM selected.\r
+ setntamem(NTARAM + ((names[x]&0x1)<<10),1,x);\r
+ else\r
+ setntamem(CHRptr[0]+(((names[x])&CHRmask1[0])<<10), 0, x);\r
+ }\r
+ }\r
+}\r
+\r
+static void tekprom(void)\r
+{\r
+ switch(tkcom1&3)\r
+ {\r
+ case 1: // 16 KB\r
+ ROM_BANK16(0x8000,prgb[0]);\r
+ ROM_BANK16(0xC000,prgb[2]);\r
+ break;\r
+\r
+ case 2: //2 = 8 KB ??\r
+ ROM_BANK8(0x8000,prgb[0]);\r
+ ROM_BANK8(0xa000,prgb[1]);\r
+ ROM_BANK8(0xc000,prgb[2]);\r
+ ROM_BANK8(0xe000,~0);\r
+ break;\r
+ }\r
+}\r
+\r
+static void tekvrom(void)\r
+{\r
+ int x;\r
+ switch(tkcom1&0x18)\r
+ {\r
+ case 0x00: // 8KB\r
+ setchr8(chr[0]);\r
+ break;\r
+ case 0x08: // 4KB\r
+ for(x=0;x<8;x+=4)\r
+ setchr4(x<<10,chr[x]);\r
+ break;\r
+ case 0x10: // 2KB\r
+ for(x=0;x<8;x+=2)\r
+ setchr2(x<<10,chr[x]);\r
+ break;\r
+ case 0x18: // 1KB\r
+ for(x=0;x<8;x++)\r
+ setchr1(x<<10,chr[x]);\r
+ break;\r
+ }\r
+}\r
+\r
+static DECLFW(Mapper211_write)\r
+{\r
+ if(A==0x5800) mul[0]=V;\r
+ else if(A==0x5801) mul[1]=V;\r
+ else if(A==0x5803) regie=V;\r
+\r
+ A&=0xF007;\r
+ if(A>=0x8000 && A<=0x8003)\r
+ {\r
+ prgb[A&3]=V;\r
+ tekprom();\r
+ }\r
+ else if(A>=0x9000 && A<=0x9007)\r
+ {\r
+ chr[A&7]=V;\r
+ tekvrom();\r
+ }\r
+ else if(A>=0xb000 && A<=0xb007)\r
+ {\r
+ names[A&3]=V&3;\r
+ mira();\r
+ }\r
+ else switch(A)\r
+ {\r
+ case 0xc002:IRQa=0;X6502_IRQEnd(FCEU_IQEXT);break;\r
+ case 0xc003:\r
+ case 0xc004:if(!IRQa) {IRQa=1;IRQCount=IRQLatch;} break;\r
+ case 0xc005:IRQCount=IRQLatch=V;\r
+ X6502_IRQEnd(FCEU_IQEXT);break;\r
+ case 0xd000: tkcom1=V; mira(); break;\r
+ case 0xd001: tkcom3=V; mira(); break;\r
+ }\r
+}\r
+\r
+static void Mapper211_hb(void)\r
+{\r
+ if(IRQCount) IRQCount--;\r
+ if(!IRQCount)\r
+ {\r
+ if(IRQa) X6502_IRQBegin(FCEU_IQEXT);\r
+ IRQa=0;\r
+ }\r
+}\r
+static void togglie()\r
+{\r
+ tekker^=0xFF;\r
+}\r
+\r
+void Mapper211_init(void)\r
+{\r
+ tekker=0xFF;\r
+ MapperReset=togglie;\r
+ SetWriteHandler(0x5000,0xffff,Mapper211_write);\r
+ SetReadHandler(0x5000,0x5fff,tekread);\r
+ GameHBIRQHook=Mapper211_hb;\r
+}\r
+\r