2 // Mockingboard support
5 // (C) 2018 Underground Software
8 // bit 7 = L/R channel select (AY chip 1 versus AY chip 2)
11 // Reg. B is connected to BC1, BDIR, RST' (bits 0, 1, 2)
13 // Left VIA IRQ line is tied to 6502 IRQ line
14 // Rght VIA IRQ line is tied to 6502 NMI line
18 #include "mockingboard.h"
35 void MBWrite(int chipNum, uint8_t reg, uint8_t byte)
37 V6522VIA * chip1 = &mb[0].via[chipNum];
38 chip1->Write(reg, byte);
41 mb[0].ay[chipNum].WriteControl(chip1->orb & chip1->ddrb);
43 mb[0].ay[chipNum].WriteData(chip1->ora & chip1->ddra);
47 uint8_t MBRead(int chipNum, uint8_t reg)
49 return mb[0].via[chipNum].Read(reg);
53 void MBRun(uint16_t cycles)
55 if (mb[0].via[0].Run(cycles))
56 mainCPU.cpuFlags |= V65C02_ASSERT_LINE_IRQ;
58 if (mb[0].via[1].Run(cycles))
59 mainCPU.cpuFlags |= V65C02_ASSERT_LINE_NMI;
63 void MBSaveState(FILE * file)
65 fwrite(&mb[0], 1, sizeof(struct MOCKINGBOARD), file);
66 fwrite(&mb[1], 1, sizeof(struct MOCKINGBOARD), file);
70 void MBLoadState(FILE * file)
72 fread(&mb[0], 1, sizeof(struct MOCKINGBOARD), file);
73 fread(&mb[1], 1, sizeof(struct MOCKINGBOARD), file);
77 static uint8_t SlotPageR(uint16_t address)
79 uint8_t regNum = address & 0x0F;
80 uint8_t chipNum = (address & 0x80) >> 7;
82 return MBRead(chipNum, regNum);
86 static void SlotPageW(uint16_t address, uint8_t byte)
88 uint8_t regNum = address & 0x0F;
89 uint8_t chipNum = (address & 0x80) >> 7;
91 MBWrite(chipNum, regNum, byte);
95 void InstallMockingboard(uint8_t slot)
97 SlotData mbDevice = { 0, 0, SlotPageR, SlotPageW, 0, 0 };
98 InstallSlotHandler(slot, &mbDevice);