merge mappers from FCEU-mm
[fceu.git] / mappers / 217.c
CommitLineData
d97315ac 1/*
2#include "mapinc.h"
3
4static uint8 cmdin;
5static uint8 cmd;
6static uint8 regs[8];
7static uint8 master,chrm;
8
9static 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
25static 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
39static 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
73static void hooko217(void)
74{
75 if(IRQCount)
76 {
77 IRQCount--;
78 if(!IRQCount)
79 {
80 X6502_IRQBegin(FCEU_IQEXT);
81 }
82 }
83}
84
85void 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}
43725da7 96*/