9 u8int ram[65536], krom[8192], brom[8192], crom[4096], cart[16384], cram[1024];
13 u16int timer[4], timrel[4];
26 ciaread(int n, u8int a)
33 return (cia[0] | ~cia[2]) & (~joys >> 5 | 0xe0);
37 for(i = 0; i < 8; i++)
38 if((cia[0] & 1<<i) == 0)
40 return (cia[1] | ~cia[3]) & ~r & (~joys | 0xe0);
43 case 4: return timer[n*2];
44 case 5: return timer[n*2] >> 8;
45 case 6: return timer[n*2+1];
46 case 7: return timer[n*2+1] >> 8;
49 r = nmi >> 4 & 0x1f | ((nmi & nmien & 0x1f0) != 0) << 7;
53 r = irq >> 4 & 0x1f | ((irq & irqen & 0x1f0) != 0) << 7;
58 return cia[n * 16 + a];
62 ciawrite(int n, u8int a, u8int v)
67 vicbank = (~v & 3) << 14;
69 case 4: timrel[n*2] = v | timrel[n*2] & 0xff00; break;
70 case 5: timrel[n*2] = v << 8 | timrel[n*2] & 0xff; break;
71 case 6: timrel[n*2+1] = v | timrel[n*2+1] & 0xff00; break;
72 case 7: timrel[n*2+1] = v << 8 | timrel[n*2+1] & 0xff; break;
76 nmien |= v << 4 & 0x1f0;
78 nmien &= ~(v << 4 & 0x1f0);
81 irqen |= v << 4 & 0x1f0;
83 irqen &= ~(v << 4 & 0x1f0);
87 timer[n * 2 + (a & 1)] = timrel[n * 2 + (a & 1)];
105 return reg[b] & 0x7f | ppuy >> 1 & 0x80;
109 return irq & 0xf | (irq & irqen & 0xf) + 0x7f & 0x80;
119 return reg[b] | 0xf0;
124 return cram[a & 0x3ff];
127 return ciaread(a >> 8 & 1, a & 0xf);
134 miowrite(u16int a, u8int v)
144 case CTRL2: v |= 0xc0; break;
150 irqen = irqen & ~0xf | v & 0xf;
156 if(b == CTRL1 || b == CTRL2)
160 cram[a & 0x3ff] = v & 0xf;
164 ciawrite(a >> 8 & 1, a & 0xf, v);
175 if((ram[1] & 1<<5) != 0)
184 tapectr = tape[idx++] << 3;
185 if(tapever == 1 && tapectr == 0){
186 tapectr = tape[idx++];
187 tapectr |= tape[idx++] << 8;
188 tapectr |= tape[idx++] << 16;
190 progress(idx, tapelen);
205 for(i = 0; i < 2; i++){
206 a = cia[i * 16 + 14];
207 b = cia[i * 16 + 15];
210 if((a & (TIMEREN|TIMERASRC)) == TIMEREN){
218 if((a & TIMERSTOP) != 0)
219 cia[i * 16 + 14] &= ~TIMEREN;
220 t[0] = timrel[2 * i];
223 if((b & TIMEREN) != 0 && ((b & TIMERBSRC) == TIMERBSYS || (b & TIMERBSRC) == TIMERBA && at)){
230 if((b & TIMERSTOP) == 0)
231 cia[i * 16 + 15] &= ~TIMEREN;
232 t[1] = timrel[2 * i + 1];
252 return ram[1] & ~(1<<4) | (tapeplay ^ 1) << 4;
255 if((pla & (EXROM|GAME)) == EXROM || (pla & (EXROM|HIRAM|LORAM)) == (HIRAM|LORAM))
256 return cart[a & 0x1fff];
259 if((pla & (GAME|HIRAM|LORAM)) == (GAME|HIRAM|LORAM))
260 return brom[a & 0x1fff];
261 if((pla & (EXROM|GAME|HIRAM)) == HIRAM)
262 return cart[8192 + (a & 0x1fff)];
265 if((pla & (HIRAM|LORAM)) == 0 || pla == 1)
267 if((pla & CHAREN) == 0 && (pla & (EXROM|GAME)) != EXROM)
268 return crom[a & 0xfff];
269 return mioread(a & 0xfff);
271 if((pla & (EXROM|GAME)) == EXROM)
272 return cart[8192 + (a & 0x1fff)];
273 if((pla & HIRAM) == HIRAM)
274 return krom[a & 0x1fff];
282 memwrite(u16int a, u8int v)
284 if(a >> 12 == 13 && !((pla & (HIRAM|LORAM)) == 0 || pla == 1 || (pla & CHAREN) == 0 && (pla & (EXROM|GAME)) != EXROM)){
285 miowrite(a & 0xfff, v);
291 pla = pla & ~7 | v & 7;
299 if((a & 0x7000) == 0x1000)
300 return crom[a & 0xfff];