mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-25 16:31:42 +00:00
Adds in VIA access decoding, and a note to self on video.
The Mac now proceeds to try to talk to the IWM.
This commit is contained in:
parent
29fc024ecd
commit
bc9eb82e6f
@ -73,12 +73,33 @@ class ConcreteMachine:
|
|||||||
// Hardware devices begin at 0x800000.
|
// Hardware devices begin at 0x800000.
|
||||||
mc68000_.set_is_peripheral_address(word_address >= 0x400000);
|
mc68000_.set_is_peripheral_address(word_address >= 0x400000);
|
||||||
if(word_address >= 0x400000) {
|
if(word_address >= 0x400000) {
|
||||||
printf("IO access to %06x\n", word_address << 1);
|
if(cycle.data_select_active()) {
|
||||||
|
printf("IO access to %06x: ", word_address << 1);
|
||||||
|
|
||||||
|
// VIA accesses are via address 0xefe1fe + register*512,
|
||||||
|
// which at word precision is 0x77f0ff + register*256.
|
||||||
|
if((word_address & 0x77f0ff) == 0x77f0ff) {
|
||||||
|
printf("VIA access ");
|
||||||
|
if(cycle.operation & Microcycle::Read) {
|
||||||
|
cycle.value->halves.low = via_.get_register(word_address >> 8);
|
||||||
|
if(cycle.operation & Microcycle::SelectWord) cycle.value->halves.high = 0xff;
|
||||||
|
} else {
|
||||||
|
via_.set_register(word_address >> 8, cycle.value->halves.low);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if(cycle.data_select_active()) {
|
if(cycle.data_select_active()) {
|
||||||
uint16_t *memory_base = nullptr;
|
uint16_t *memory_base = nullptr;
|
||||||
bool is_read_only = false;
|
bool is_read_only = false;
|
||||||
if(word_address & 0x200000 || ROM_is_overlay_) {
|
|
||||||
|
// When ROM overlay is enabled, the ROM begins at both $000000 and $400000,
|
||||||
|
// and RAM is available at $600000.
|
||||||
|
//
|
||||||
|
// Otherwise RAM is mapped at $000000 and ROM from $400000.
|
||||||
|
if((ROM_is_overlay_ && word_address < 0x600000) || (!ROM_is_overlay_ && word_address & 0x200000)) {
|
||||||
memory_base = rom_.data();
|
memory_base = rom_.data();
|
||||||
word_address %= rom_.size();
|
word_address %= rom_.size();
|
||||||
is_read_only = true;
|
is_read_only = true;
|
||||||
@ -143,7 +164,7 @@ class ConcreteMachine:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class VIAPortHandler: public MOS::MOS6522::PortHandler {
|
struct VIAPortHandler: public MOS::MOS6522::PortHandler {
|
||||||
void set_port_output(MOS::MOS6522::Port port, uint8_t value, uint8_t direction_mask) {
|
void set_port_output(MOS::MOS6522::Port port, uint8_t value, uint8_t direction_mask) {
|
||||||
/*
|
/*
|
||||||
Port A:
|
Port A:
|
||||||
|
@ -28,3 +28,7 @@ Video::Video(uint16_t *ram) :
|
|||||||
void Video::set_scan_target(Outputs::Display::ScanTarget *scan_target) {
|
void Video::set_scan_target(Outputs::Display::ScanTarget *scan_target) {
|
||||||
crt_.set_scan_target(scan_target);
|
crt_.set_scan_target(scan_target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Video: $1A700 and the alternate buffer starts at $12700; for a 512K Macintosh, add $60000 to these numbers.
|
||||||
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user