9 int rombank, rambank, ramen, battery, ramrom;
17 if((p & 0xFF80) == 0xFF00)
20 if((mem[0xFF00] & (1<<5)) == 0)
21 return (mem[0xFF00] & 0xF0) | ~(keys >> 4);
22 if((mem[0xFF00] & (1<<6)) == 0)
23 return (mem[0xFF00] & 0xF0) | ~(keys & 0x0F);
24 return (mem[0xFF00] & 0xF0) | 0x0F;
26 if(!ramen && ((p & 0xE000) == 0xA000))
32 ramswitch(int state, int bank)
35 memcpy(ram + 8192 * rambank, mem + 0xA000, 8192);
36 if(battery && savefd > 0){
37 seek(savefd, rambank * 8192, 0);
38 write(savefd, ram + 8192 * rambank, 8192);
45 sysfatal("invalid RAM bank %d selected (pc = %.4x)", bank, curpc);
46 memcpy(mem + 0xA000, ram + 8192 * rambank, 8192);
55 ramswitch(ramen, rambank);
62 sysfatal("invalid ROM bank %d selected (pc = %.4x)", bank, curpc);
64 memcpy(mem + 0x4000, cart + 0x4000 * bank, 0x4000);
68 memwrite(u16int p, u8int v)
78 if((v & 0x0F) == 0x0A)
79 ramswitch(1, rambank);
81 ramswitch(0, rambank);
87 romswitch((rombank & 0xE0) | v);
91 ramswitch(ramen, v & 3);
93 romswitch(((v & 3) << 5) | (rombank & 0x1F));
103 if((v & 0x0F) == 0x0A)
104 ramswitch(1, rambank);
106 ramswitch(0, rambank);
123 if((v & 0x0F) == 0x0A)
124 ramswitch(1, rambank);
126 ramswitch(0, rambank);
129 romswitch((rombank & 0x100) | v);
132 romswitch((((int)v & 1) << 8) | (rombank & 0xFF));
135 ramswitch(ramen, v & 15);
141 sysfatal("mbc %d unimplemented", mbc);
144 if((p & 0xFF80) == 0xFF00)
150 timer = (v & 4) != 0;
166 v = (v & 0xF0) | (mem[p] & 0x0F);
172 memcpy(mem + 0xFE00, mem + (((int)v) << 8), 0xA0);