1 |
|
/* |
2 |
|
* CPUC64_SC.cpp - Single-cycle 6510 (C64) emulation |
3 |
|
* |
4 |
< |
* Frodo (C) 1994-1997,2002-2005 Christian Bauer |
4 |
> |
* Frodo (C) 1994-1997,2002-2009 Christian Bauer |
5 |
|
* |
6 |
|
* This program is free software; you can redistribute it and/or modify |
7 |
|
* it under the terms of the GNU General Public License as published by |
179 |
|
|
180 |
|
ddr = s->ddr; |
181 |
|
pr = s->pr; |
182 |
+ |
pr_out = 0; // FIXME: should be saved in MOS6510State |
183 |
|
new_config(); |
184 |
|
|
185 |
|
pc = s->pc; |
202 |
|
|
203 |
|
void MOS6510::new_config(void) |
204 |
|
{ |
205 |
< |
uint8 port = ~ddr | pr; |
205 |
> |
pr_out = (pr_out & ~ddr) | (pr & ddr); |
206 |
> |
uint8 port = pr | ~ddr; |
207 |
|
|
208 |
|
basic_in = (port & 3) == 3; |
209 |
|
kernal_in = port & 2; |
281 |
|
uint8 MOS6510::read_byte(uint16 adr) |
282 |
|
{ |
283 |
|
if (adr < 0xa000) { |
284 |
< |
if (adr >= 2) |
284 |
> |
if (adr >= 2) { |
285 |
|
return ram[adr]; |
286 |
< |
else if (adr == 0) |
286 |
> |
} else if (adr == 0) { |
287 |
|
return ddr; |
288 |
< |
else |
289 |
< |
return (ddr & pr) | (~ddr & 0x17); |
288 |
> |
} else { |
289 |
> |
uint8 byte = (pr | ~ddr) & (pr_out | 0x17); |
290 |
> |
if (!(ddr & 0x20)) |
291 |
> |
byte &= 0xdf; |
292 |
> |
return byte; |
293 |
> |
} |
294 |
|
} else |
295 |
|
return read_byte_io(adr); |
296 |
|
} |
552 |
|
ram[0x8004] = 0; |
553 |
|
|
554 |
|
// Initialize extra 6510 registers and memory configuration |
555 |
< |
ddr = pr = 0; |
555 |
> |
ddr = pr = pr_out = 0; |
556 |
|
new_config(); |
557 |
|
|
558 |
|
// Clear all interrupt lines |