merge mapper code from FCEUX
[fceu.git] / mappers / 217.c
1 /*
2 #include "mapinc.h"
3
4 static uint8 cmdin;
5 static uint8 cmd;
6 static uint8 regs[8];
7 static uint8 master,chrm;
8
9 static void DoPRG217(void)
10 {
11  if(master&0x80)
12  {
13    setprg16(0x8000,master&0x1F);
14    setprg16(0xc000,master&0x1F);
15  }
16  else
17  {
18    setprg8(0x8000,regs[1]);
19    setprg8(0xA000,regs[3]);
20    setprg8(0xC000,~1);
21    setprg8(0xE000,~0);
22  }
23 }
24
25 static void DoCHR217(void)
26 {
27  uint32 base=(cmd&0x80)<<5;
28  int orie=(chrm&0x4)<<6;
29
30  setchr2(0x0000^base,(orie|regs[0])>>1);
31  setchr2(0x0800^base,(orie|regs[7])>>1);
32
33  setchr1(0x1000,orie|regs[5]);
34  setchr1(0x1400,orie|regs[2]);
35  setchr1(0x1800,orie|regs[6]);
36  setchr1(0x1c00,orie|regs[4]);
37 }
38
39 static DECLFW(Write217_write)
40 {
41 // if(A==0x5000)
42 // {
43 //  master=V;
44 //  DoPRG217();
45 // }
46 // else if(A==0x5001)
47 // {
48 //  chrm=V;
49 //  DoCHR217();
50 // }
51 // else if(A==0x5007)
52 // {
53 // }
54
55  switch(A&0xE001)
56  {
57   case 0x4000:master=V;DoPRG217();break;
58   case 0x8000:IRQCount=V;break;
59   case 0xc001:break;
60   case 0xe000:X6502_IRQEnd(FCEU_IQEXT);break;
61   case 0xe001:break;
62   case 0xa001:setmirror((V&1)^1);break;
63   case 0x8001:cmd=V;cmdin=1;DoPRG217();DoCHR217();break;
64   case 0xa000:if(!cmdin) break;
65               regs[cmd&7]=V;
66               DoPRG217();
67               DoCHR217();
68               cmdin=0;
69               break;
70  }
71 }
72
73 static void hooko217(void)
74 {
75  if(IRQCount)
76  {
77   IRQCount--;
78   if(!IRQCount)
79   {
80      X6502_IRQBegin(FCEU_IQEXT);
81   }
82  }
83 }
84
85 void Mapper217_init(void)
86 {
87   int x;
88   for(x=0;x<8;x++) regs[x]=0;
89   master=chrm=cmd=cmdin=IRQCount=0;
90   GameHBIRQHook=hooko217;
91   SetReadHandler(0x8000,0xFFFF,CartBR);
92   SetWriteHandler(0x5000,0xFFFF,Write217_write);
93   DoPRG217();
94   DoCHR217();
95 }
96 */