diff --git a/devices/heathrow.cpp b/devices/heathrow.cpp index bbb28a9..d7ff5c9 100644 --- a/devices/heathrow.cpp +++ b/devices/heathrow.cpp @@ -45,6 +45,8 @@ HeathrowIC::HeathrowIC() : PCIDevice("mac-io/heathrow") { this->screamer = new AWACDevice(); this->snd_out_dma = new DMAChannel(this->screamer); this->screamer->set_dma_out(this->snd_out_dma); + + this->mesh = new MESHController(HeathrowMESHID); } HeathrowIC::~HeathrowIC() { @@ -53,6 +55,9 @@ HeathrowIC::~HeathrowIC() { if (this->viacuda) delete (this->viacuda); + + if (this->mesh) + delete (this->mesh); } @@ -122,6 +127,9 @@ uint32_t HeathrowIC::read(uint32_t reg_start, uint32_t offset, int size) { case 8: res = dma_read(offset - 0x8000, size); break; + case 0x10: + res = this->mesh->read((offset >> 4) & 0xF); + break; case 0x14: res = this->screamer->snd_ctrl_read(offset - 0x14000, size); break; @@ -152,6 +160,9 @@ void HeathrowIC::write(uint32_t reg_start, uint32_t offset, uint32_t value, int case 8: dma_write(offset - 0x8000, value, size); break; + case 0x10: + this->mesh->write((offset >> 4) & 0xF, value); + break; case 0x14: this->screamer->snd_ctrl_write(offset - 0x14000, value, size); break; diff --git a/devices/macio.h b/devices/macio.h index e8b400f..daa2776 100644 --- a/devices/macio.h +++ b/devices/macio.h @@ -55,6 +55,7 @@ along with this program. If not, see . #include "dbdma.h" #include "hwcomponent.h" #include "memctrlbase.h" +#include "mesh.h" #include "mmiodevice.h" #include "nvram.h" #include "pcidevice.h" @@ -146,9 +147,10 @@ private: uint32_t aux_ctrl = 0; // aux features control register /* device cells */ - ViaCuda* viacuda; /* VIA cell with Cuda MCU attached to it */ - NVram* nvram; /* NVRAM cell */ - AWACDevice* screamer; /* Screamer audio codec instance */ + ViaCuda* viacuda; // VIA cell with Cuda MCU attached to it + NVram* nvram; // NVRAM cell + AWACDevice* screamer; // Screamer audio codec instance + MESHController *mesh; // MESH SCSI cell instance DMAChannel* snd_out_dma; }; diff --git a/devices/mesh.cpp b/devices/mesh.cpp new file mode 100644 index 0000000..2444b3d --- /dev/null +++ b/devices/mesh.cpp @@ -0,0 +1,68 @@ +/* +DingusPPC - The Experimental PowerPC Macintosh emulator +Copyright (C) 2018-21 divingkatae and maximum + (theweirdo) spatium + +(Contact divingkatae#1017 or powermax#2286 on Discord for more info) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +/** @file MESH (Macintosh Enhanced SCSI Hardware) controller emulation. */ + +#include "mesh.h" +#include +#include + +uint8_t MESHController::read(uint8_t reg_offset) +{ + switch(reg_offset) { + case MeshReg::BusStatus0: + LOG_F(INFO, "MESH: read from BusStatus0 register"); + return 0; + case MeshReg::MeshID: + LOG_F(INFO, "MESH: read from MeshID register"); + return this->chip_id; // tell them who we are + default: + LOG_F(WARNING, "MESH: read from unimplemented register at offset %d", reg_offset); + } + + return 0; +} + +void MESHController::write(uint8_t reg_offset, uint8_t value) +{ + switch(reg_offset) { + case MeshReg::Sequence: + LOG_F(INFO, "MESH: write 0x%02X to Sequence register", value); + break; + case MeshReg::BusStatus1: + LOG_F(INFO, "MESH: write 0x%02X to BusStatus1 register", value); + break; + case MeshReg::IntMask: + LOG_F(INFO, "MESH: write 0x%02X to IntMask register", value); + break; + case MeshReg::Interrupt: + LOG_F(INFO, "MESH: write 0x%02X to Interrupt register", value); + break; + case MeshReg::SourceID: + LOG_F(INFO, "MESH: write 0x%02X to SourceID register", value); + break; + case MeshReg::SyncParms: + LOG_F(INFO, "MESH: write 0x%02X to SyncParms register", value); + break; + default: + LOG_F(WARNING, "MESH: write to unimplemented register at offset %d", reg_offset); + } +} diff --git a/devices/mesh.h b/devices/mesh.h new file mode 100644 index 0000000..d0765ee --- /dev/null +++ b/devices/mesh.h @@ -0,0 +1,65 @@ +/* +DingusPPC - The Experimental PowerPC Macintosh emulator +Copyright (C) 2018-21 divingkatae and maximum + (theweirdo) spatium + +(Contact divingkatae#1017 or powermax#2286 on Discord for more info) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +/** @file MESH (Macintosh Enhanced SCSI Hardware) controller definitions. */ + +#ifndef MESH_H +#define MESH_H + +#include + +// Chip ID returned by the MESH cell inside the Heathrow ASIC +#define HeathrowMESHID 4 + +// MESH registers offsets +enum MeshReg : uint8_t { + XferCount0 = 0, + XferCount1 = 1, + FIFO = 2, + Sequence = 3, + BusStatus0 = 4, + BusStatus1 = 5, + FIFOCount = 6, + Exception = 7, + Error = 8, + IntMask = 9, + Interrupt = 0xA, + SourceID = 0xB, + DestID = 0xC, + SyncParms = 0xD, + MeshID = 0xE, + SelTimeOut = 0xF +}; + +class MESHController { +public: + MESHController(uint8_t mesh_id) { this->chip_id = mesh_id; }; + ~MESHController() = default; + + // MESH registers access + uint8_t read(uint8_t reg_offset); + void write(uint8_t reg_offset, uint8_t value); + +private: + uint8_t chip_id; // Chip ID for the MESH controller +}; + +#endif // MESH_H