updated bords/mappers/stuff to 0.98.15, lots of them got broken, asmcore support...
[fceu.git] / mappers / 211.c
diff --git a/mappers/211.c b/mappers/211.c
new file mode 100644 (file)
index 0000000..5e6c5b2
--- /dev/null
@@ -0,0 +1,146 @@
+#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