mirror of
https://github.com/dingusdev/dingusppc.git
synced 2024-11-18 22:05:51 +00:00
159 lines
5.8 KiB
C++
159 lines
5.8 KiB
C++
/*
|
|
DingusPPC - The Experimental PowerPC Macintosh emulator
|
|
Copyright (C) 2018-20 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 <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/** MacIO device family emulation
|
|
|
|
Mac I/O (MIO) is a family of ASICs to bring support for Apple legacy
|
|
I/O hardware to the PCI-based Power Macintosh. That legacy hardware has
|
|
existed long before Power Macintosh was introduced. It includes:
|
|
- versatile interface adapter (VIA)
|
|
- Sander-Woz integrated machine (SWIM) that is a floppy disk controller
|
|
- CUDA MCU for ADB, parameter RAM, realtime clock and power management support
|
|
- serial communication controller (SCC)
|
|
- Macintosh Enhanced SCSI Hardware (MESH)
|
|
|
|
In the 68k Macintosh era, all this hardware was implemented using several
|
|
custom chips. In a PCI-compatible Power Macintosh, the above devices are part
|
|
of the MIO chip itself. MIO's functional blocks implementing virtual devices
|
|
are called "cells", i.e. "VIA cell", "SWIM cell" etc.
|
|
|
|
MIO itself is PCI compliant while the legacy hardware it emulates isn't.
|
|
MIO occupies 512Kb of the PCI memory space divided into registers space and
|
|
DMA space. Access to emulated legacy devices is accomplished by reading from/
|
|
writing to MIO's PCI address space at predefined offsets.
|
|
|
|
MIO includes a DMA controller that offers 15 DMA channels implementing
|
|
Apple's own DMA protocol called descriptor-based DMA (DBDMA).
|
|
|
|
Official documentation (that is somewhat incomplete and erroneous) can be
|
|
found in the second chapter of the book "Macintosh Technology in the Common
|
|
Hardware Reference Platform" by Apple Computer, Inc.
|
|
*/
|
|
|
|
#ifndef MACIO_H
|
|
#define MACIO_H
|
|
|
|
#include "awacs.h"
|
|
#include "dbdma.h"
|
|
#include "hwcomponent.h"
|
|
#include "memctrlbase.h"
|
|
#include "mesh.h"
|
|
#include "mmiodevice.h"
|
|
#include "nvram.h"
|
|
#include "pcidevice.h"
|
|
#include "pcihost.h"
|
|
#include "viacuda.h"
|
|
#include <cinttypes>
|
|
|
|
/**
|
|
Heathrow ASIC emulation
|
|
|
|
Author: Max Poliakovski
|
|
|
|
Heathrow is a MIO-compliant ASIC used in the Gossamer architecture. It's
|
|
hard-wired to PCI device number 16. Its I/O memory (512Kb) will be configured
|
|
by the Macintosh firmware to live at 0xF3000000.
|
|
|
|
Emulated subdevices and their offsets within Heathrow I/O space:
|
|
----------------------------------------------------------------
|
|
mesh(SCSI) register space: 0x00010000, DMA space: 0x00008000
|
|
bmac(ethernet) register space: 0x00011000, DMA space: 0x00008200, 0x00008300
|
|
escc(serial) register space: 0x00013000, size: 0x00001000
|
|
DMA space: 0x00008400, size: 0x00000400
|
|
escc:ch-a register space: 0x00013020, DMA space: 0x00008400, 0x00008500
|
|
escc:ch-b register space: 0x00013000, DMA space: 0x00008600, 0x00008700
|
|
davbus(sound) register space: 0x00014000, DMA space: 0x00008800, 0x00008900
|
|
SWIM3(floppy) register space: 0x00015000, DMA space: 0x00008100
|
|
NVRAM register space: 0x00060000, size: 0x00020000
|
|
IDE register space: 0x00020000, DMA space: 0x00008b00
|
|
VIA-CUDA register space: 0x00016000, size: 0x00002000
|
|
*/
|
|
|
|
class HeathrowIC : public PCIDevice {
|
|
public:
|
|
HeathrowIC();
|
|
~HeathrowIC();
|
|
|
|
bool supports_type(HWCompType type) {
|
|
return type == HWCompType::MMIO_DEV;
|
|
};
|
|
|
|
/* PCI device methods */
|
|
bool supports_io_space(void) {
|
|
return false;
|
|
};
|
|
|
|
uint32_t pci_cfg_read(uint32_t reg_offs, uint32_t size);
|
|
void pci_cfg_write(uint32_t reg_offs, uint32_t value, uint32_t size);
|
|
|
|
/* MMIO device methods */
|
|
uint32_t read(uint32_t reg_start, uint32_t offset, int size);
|
|
void write(uint32_t reg_start, uint32_t offset, uint32_t value, int size);
|
|
|
|
protected:
|
|
uint32_t dma_read(uint32_t offset, int size);
|
|
void dma_write(uint32_t offset, uint32_t value, int size);
|
|
|
|
uint32_t mio_ctrl_read(uint32_t offset, int size);
|
|
void mio_ctrl_write(uint32_t offset, uint32_t value, int size);
|
|
|
|
private:
|
|
uint8_t pci_cfg_hdr[256] = {
|
|
0x6B,
|
|
0x10, // vendor ID: Apple Computer Inc.
|
|
0x10,
|
|
0x00, // device ID: Heathrow Mac I/O
|
|
0x00,
|
|
0x00, // PCI command (set to 0 at power-up?)
|
|
0x00,
|
|
0x00, // PCI status (set to 0 at power-up?)
|
|
0x01, // revision ID
|
|
// class code is reported in OF property "class-code" as 0xff0000
|
|
0x00, // standard programming
|
|
0x00, // subclass code
|
|
0xFF, // class code: unassigned
|
|
0x00,
|
|
0x00, // unknown defaults
|
|
0x00,
|
|
0x00 // unknown defaults
|
|
};
|
|
|
|
uint32_t int_mask2 = 0;
|
|
uint32_t int_clear2 = 0;
|
|
uint32_t int_levels2 = 0;
|
|
uint32_t int_mask1 = 0;
|
|
uint32_t int_clear1 = 0;
|
|
uint32_t int_levels1 = 0;
|
|
uint32_t macio_id = 0xF0700008UL;
|
|
uint32_t feat_ctrl = 0; // features control register
|
|
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
|
|
AwacsScreamer *screamer; // Screamer audio codec instance
|
|
MESHController *mesh; // MESH SCSI cell instance
|
|
|
|
DMAChannel* snd_out_dma;
|
|
};
|
|
|
|
#endif /* MACIO_H */
|