8 u8int ram[65536], krom[8192], brom[8192], crom[4096], cart[16384], cram[1024];
12 u16int timer[4], timrel[4];
25 ciaread(int n, u8int a)
32 return (cia[0] | ~cia[2]) & (~joys >> 5 | 0xe0);
36 for(i = 0; i < 8; i++)
37 if((cia[0] & 1<<i) == 0)
39 return (cia[1] | ~cia[3]) & ~r & (~joys | 0xe0);
42 case 4: return timer[n*2];
43 case 5: return timer[n*2] >> 8;
44 case 6: return timer[n*2+1];
45 case 7: return timer[n*2+1] >> 8;
48 r = nmi >> 4 & 0x1f | ((nmi & nmien & 0x1f0) != 0) << 7;
52 r = irq >> 4 & 0x1f | ((irq & irqen & 0x1f0) != 0) << 7;
57 return cia[n * 16 + a];
61 ciawrite(int n, u8int a, u8int v)
66 vicbank = (~v & 3) << 14;
68 case 4: timrel[n*2] = v | timrel[n*2] & 0xff00; break;
69 case 5: timrel[n*2] = v << 8 | timrel[n*2] & 0xff; break;
70 case 6: timrel[n*2+1] = v | timrel[n*2+1] & 0xff00; break;
71 case 7: timrel[n*2+1] = v << 8 | timrel[n*2+1] & 0xff; break;
75 nmien |= v << 4 & 0x1f0;
77 nmien &= ~(v << 4 & 0x1f0);
80 irqen |= v << 4 & 0x1f0;
82 irqen &= ~(v << 4 & 0x1f0);
86 timer[n * 2 + (a & 1)] = timrel[n * 2 + (a & 1)];
104 return reg[b] & 0x7f | ppuy >> 1 & 0x80;
108 return irq & 0xf | (irq & irqen & 0xf) + 0x7f & 0x80;
118 return reg[b] | 0xf0;
123 return cram[a & 0x3ff];
126 return ciaread(a >> 8 & 1, a & 0xf);
133 miowrite(u16int a, u8int v)
143 case CTRL2: v |= 0xc0; break;
149 irqen = irqen & ~0xf | v & 0xf;
155 if(b == CTRL1 || b == CTRL2)
159 cram[a & 0x3ff] = v & 0xf;
163 ciawrite(a >> 8 & 1, a & 0xf, v);
174 if((ram[1] & 1<<5) != 0)
183 tapectr = tape[idx++] << 3;
184 if(tapever == 1 && tapectr == 0){
185 tapectr = tape[idx++];
186 tapectr |= tape[idx++] << 8;
187 tapectr |= tape[idx++] << 16;
189 progress(idx, tapelen);
204 for(i = 0; i < 2; i++){
205 a = cia[i * 16 + 14];
206 b = cia[i * 16 + 15];
209 if((a & (TIMEREN|TIMERASRC)) == TIMEREN){
217 if((a & TIMERSTOP) != 0)
218 cia[i * 16 + 14] &= ~TIMEREN;
219 t[0] = timrel[2 * i];
222 if((b & TIMEREN) != 0 && ((b & TIMERBSRC) == TIMERBSYS || (b & TIMERBSRC) == TIMERBA && at)){
229 if((b & TIMERSTOP) == 0)
230 cia[i * 16 + 15] &= ~TIMEREN;
231 t[1] = timrel[2 * i + 1];
251 return ram[1] & ~(1<<4) | (tapeplay ^ 1) << 4;
254 if((pla & (EXROM|GAME)) == EXROM || (pla & (EXROM|HIRAM|LORAM)) == (HIRAM|LORAM))
255 return cart[a & 0x1fff];
258 if((pla & (GAME|HIRAM|LORAM)) == (GAME|HIRAM|LORAM))
259 return brom[a & 0x1fff];
260 if((pla & (EXROM|GAME|HIRAM)) == HIRAM)
261 return cart[8192 + (a & 0x1fff)];
264 if((pla & (HIRAM|LORAM)) == 0 || pla == 1)
266 if((pla & CHAREN) == 0 && (pla & (EXROM|GAME)) != EXROM)
267 return crom[a & 0xfff];
268 return mioread(a & 0xfff);
270 if((pla & (EXROM|GAME)) == EXROM)
271 return cart[8192 + (a & 0x1fff)];
272 if((pla & HIRAM) == HIRAM)
273 return krom[a & 0x1fff];
281 memwrite(u16int a, u8int v)
283 if(a >> 12 == 13 && !((pla & (HIRAM|LORAM)) == 0 || pla == 1 || (pla & CHAREN) == 0 && (pla & (EXROM|GAME)) != EXROM))
284 miowrite(a & 0xfff, v);
287 pla = pla & ~7 | v & 7;
295 if((a & 0x7000) == 0x1000)
296 return crom[a & 0xfff];