1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-02-19 07:31:15 +00:00

Adds further boilerplate around VIA and IWM decoding.

This commit is contained in:
Thomas Harte 2019-05-04 17:12:26 -04:00
parent 181b77c490
commit 98bc570bf7

View File

@ -77,22 +77,24 @@ class ConcreteMachine:
if(cycle.data_select_active()) { if(cycle.data_select_active()) {
printf("IO access to %06x: ", word_address << 1); printf("IO access to %06x: ", word_address << 1);
const int register_address = word_address >> 8;
switch(word_address & 0x7ff0ff) { switch(word_address & 0x7ff0ff) {
case 0x77f0ff: case 0x77f0ff:
// VIA accesses are via address 0xefe1fe + register*512, // VIA accesses are via address 0xefe1fe + register*512,
// which at word precision is 0x77f0ff + register*256. // which at word precision is 0x77f0ff + register*256.
printf("VIA"); printf("VIA");
if(cycle.operation & Microcycle::Read) { if(cycle.operation & Microcycle::Read) {
cycle.value->halves.low = via_.get_register(word_address >> 8); cycle.value->halves.low = via_.get_register(register_address);
if(cycle.operation & Microcycle::SelectWord) cycle.value->halves.high = 0xff; if(cycle.operation & Microcycle::SelectWord) cycle.value->halves.high = 0xff;
} else { } else {
via_.set_register(word_address >> 8, cycle.value->halves.low); via_.set_register(register_address, cycle.value->halves.low);
} }
break; break;
case 0x6ff0ff: case 0x6ff0ff:
// IWM // IWM
printf("IWM"); printf("IWM %d", register_address & 0xf);
break; break;
} }
@ -181,13 +183,16 @@ class ConcreteMachine:
public: public:
VIAPortHandler(ConcreteMachine &machine) : machine_(machine) {} VIAPortHandler(ConcreteMachine &machine) : machine_(machine) {}
void set_port_output(MOS::MOS6522::Port port, uint8_t value, uint8_t direction_mask) { using Port = MOS::MOS6522::Port;
using Line = MOS::MOS6522::Line;
void set_port_output(Port port, uint8_t value, uint8_t direction_mask) {
/* /*
Peripheral lines: keyboard data, interrupt configuration. Peripheral lines: keyboard data, interrupt configuration.
(See p176 [/215]) (See p176 [/215])
*/ */
switch(port) { switch(port) {
case MOS::MOS6522::Port::A: case Port::A:
/* /*
Port A: Port A:
b7: [input] SCC wait/request (/W/REQA and /W/REQB wired together for a logical OR) b7: [input] SCC wait/request (/W/REQA and /W/REQB wired together for a logical OR)
@ -197,25 +202,44 @@ class ConcreteMachine:
b3: 0 = use alternate sound buffer, 1 = use ordinary sound buffer b3: 0 = use alternate sound buffer, 1 = use ordinary sound buffer
b2b0: audio output volume b2b0: audio output volume
*/ */
printf(" w A: %02x", value);
machine_.set_rom_is_overlay(!!(value & 0x10)); machine_.set_rom_is_overlay(!!(value & 0x10));
break; break;
case MOS::MOS6522::Port::B: case Port::B:
/* /*
Port B: Port B:
b7: 0 = sound enabled, 1 = sound disabled b7: 0 = sound enabled, 1 = sound disabled
b6: [input] 0 = video beam in visible portion of line, 1 = outside b6: [input] 0 = video beam in visible portion of line, 1 = outside
b5: [input] mouse y2 b5: [input] mouse y2
b4: [input] mouse x2 b4: [input] mouse x2
b3: [input] 0 = mouse button down, 1 = up b3: [input] 0 = mouse button down, 1 = up
b2: 0 = real-time clock enabled, 1 = disabled b2: 0 = real-time clock enabled, 1 = disabled
b1: clock's data-clock line b1: clock's data-clock line
b0: clock's serial data line b0: clock's serial data line
*/ */
printf(" w B: %02x", value);
break; break;
} }
} }
uint8_t get_port_input(Port port) {
switch(port) {
case Port::A:
printf(" r A");
break;
case Port::B:
printf(" r B");
break;
}
return 0xff;
}
void set_control_line_output(Port port, Line line, bool value) {
printf(" l %c%d: %c", port ? 'B' : 'A', int(line), value ? 't' : 'f');
}
private: private:
ConcreteMachine &machine_; ConcreteMachine &machine_;