1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-06-25 18:30:07 +00:00

Corrects interpretation of bit 3 of the state register.

And attempts to be a bit more careful with the language card in general.
This commit is contained in:
Thomas Harte 2020-11-04 21:15:10 -05:00
parent d3c7253981
commit 9e2a6526d1
3 changed files with 20 additions and 10 deletions

View File

@ -21,11 +21,13 @@ namespace II {
template <typename Machine> class LanguageCardSwitches {
public:
struct State {
/// Indicates which 4kb chunk of RAM should be visible at $Dxxx if RAM is visible at all.
/// When RAM is visible in the range $D000$FFFF:
/// @c true indicates that bank 1 should be used;
/// @c false indicates bank 2.
bool bank1 = false;
/// @c true indicates that RAM should be readable in the range $D000$FFFF;
/// @c indicates ROM should be readable.
/// @c false indicates ROM should be readable.
bool read = false;
/// @c true indicates that ROM is selected for 'writing' in the range $D000$FFFF (i.e. writes are a no-op);
@ -48,7 +50,7 @@ template <typename Machine> class LanguageCardSwitches {
// Quotes below taken from Understanding the Apple II, p. 5-28 and 5-29.
// "A3 controls the 4K bank selection"
// "A3 controls the 4K bank selection"; 0 = bank 2, 1 = bank 1.
state_.bank1 = address & 8;
// "Access to $C080, $C083, $C084, $0087, $C088, $C08B, $C08C, or $C08F sets the READ ENABLE flip-flop"
@ -81,7 +83,9 @@ template <typename Machine> class LanguageCardSwitches {
void set_state(uint8_t value) {
const auto previous_state = state_;
state_.read = value & 0x08;
// Bit 3: 1 => enable ROM, 0 => enable RAM.
state_.read = !(value & 0x08);
// Bit 2: 1 => select bank 1, 0 => select bank 2.
state_.bank1 = value & 0x04;
if(previous_state != state_) {

View File

@ -153,6 +153,7 @@ class ConcreteMachine:
case 0xc036:
if(is_read) {
*value = speed_register_;
printf("Reading speed register: %02x\n", *value);
} else {
memory_.set_speed_register(*value);
speed_register_ = *value;
@ -169,7 +170,7 @@ class ConcreteMachine:
}
break;
// Various independent memory switch reads [TODO: does the IIe-style keyboard the low seven?].
// Various independent memory switch reads [TODO: does the IIe-style keyboard provide the low seven?].
#define SwitchRead(s) *value = memory_.s ? 0x80 : 0x00
#define LanguageRead(s) SwitchRead(language_card_switches().state().s)
#define AuxiliaryRead(s) SwitchRead(auxiliary_switches().switches().s)
@ -183,6 +184,10 @@ class ConcreteMachine:
case 0xc017: AuxiliaryRead(slot_C3_rom); break;
case 0xc018: VideoRead(get_80_store()); break;
// case 0xc019: VideoRead(get_is_vertical_blank(cycles_since_video_update_)); break;
case 0xc019:
printf("TODO: vertical blank check\n");
*value = 0x80; // i.e. not VBL.
break;
case 0xc01a: VideoRead(get_text()); break;
case 0xc01b: VideoRead(get_mixed()); break;
case 0xc01c: VideoRead(get_page2()); break;
@ -323,7 +328,7 @@ class ConcreteMachine:
case 0xc049: case 0xc04a: case 0xc04b: case 0xc04c: case 0xc04d: case 0xc04e: case 0xc04f:
case 0xc069: case 0xc06a: case 0xc06b: case 0xc06c:
printf("Ignoring %04x\n", address_suffix);
log = true;
// log = true;
break;
// 'Test Mode', whatever that is (?)
@ -367,6 +372,7 @@ class ConcreteMachine:
}
} else {
// TODO: disk-port soft switches should be in COEx.
// log = true;
printf("Internal card-area access: %04x\n", address_suffix);
if(is_read) {
*value = rom_[rom_.size() - 65536 + address_suffix];
@ -392,8 +398,8 @@ class ConcreteMachine:
}
}
if(operation == CPU::WDC65816::BusOperation::ReadOpcode && address == 0x00fa56) {
printf("?");
if(operation == CPU::WDC65816::BusOperation::ReadOpcode) {
assert(address);
}
// log |= (address >= 0xffa6d9) && (address < 0xffa6ec);
if(log) {

View File

@ -261,8 +261,8 @@ class MemoryMap {
// All references below are to 0xc000, 0xd000 and 0xe000 but should
// work regardless of bank.
// TODO: verify order of ternary here — on the plain Apple II it was arbitrary.
uint8_t *const lower_ram_bank = ram - (language_state.bank1 ? 0x0000 : 0x1000);
// This assumes bank 1 is the one before bank 2 when RAM is linear.
uint8_t *const lower_ram_bank = ram - (language_state.bank1 ? 0x1000 : 0x0000);
// Crib the ROM pointer from a page it's always visible on.
const uint8_t *const rom = &regions[region_map[0xffd0]].read[0xffd000] - ((bank_base << 8) + 0xd000);