29 #include "sidplayfp/event.h"
37 virtual void setCpuPort(
int state) =0;
38 virtual uint8_t getLastReadByte()
const =0;
39 virtual event_clock_t getPhi2Time()
const =0;
75 static const event_clock_t C64_CPU6510_DATA_PORT_FALL_OFF_CYCLES = 350000;
84 static const bool tape_sense =
false;
94 event_clock_t dataSetClkBit6;
95 event_clock_t dataSetClkBit7;
100 bool dataFalloffBit6;
101 bool dataFalloffBit7;
120 uint8_t procPortPins;
126 procPortPins = (procPortPins & ~dir) | (data & dir);
128 dataRead = (data | ~dir) & (procPortPins | 0x17);
130 pla->setCpuPort((data | ~dir) & 0x07);
132 if ((dir & 0x20) == 0)
136 if (tape_sense && (dir & 0x10) == 0)
154 dataFalloffBit6 =
false;
155 dataFalloffBit7 =
false;
179 uint8_t
peek(uint_least16_t address)
188 if (dataFalloffBit6 || dataFalloffBit7)
190 const event_clock_t phi2time = pla->getPhi2Time();
193 if (dataFalloffBit6 && dataSetClkBit6 < phi2time)
195 dataFalloffBit6 =
false;
200 if (dataFalloffBit7 && dataSetClkBit7 < phi2time)
202 dataFalloffBit7 =
false;
207 uint8_t retval = dataRead;
215 retval |= dataSetBit6;
222 retval |= dataSetBit7;
228 return ramBank->
peek(address);
232 void poke(uint_least16_t address, uint8_t value)
242 if ((dir & 0x40) && !(value & 0x40))
244 dataSetClkBit6 = pla->getPhi2Time() + C64_CPU6510_DATA_PORT_FALL_OFF_CYCLES;
245 dataSetBit6 = data & 0x40;
246 dataFalloffBit6 =
true;
250 if ((dir & 0x80) && !(value & 0x80))
252 dataSetClkBit7 = pla->getPhi2Time() + C64_CPU6510_DATA_PORT_FALL_OFF_CYCLES;
253 dataSetBit7 = data & 0x80;
254 dataFalloffBit7 =
true;
262 value = pla->getLastReadByte();
270 dataSetBit6 = value & 0x40;
271 dataSetClkBit6 = pla->getPhi2Time() + C64_CPU6510_DATA_PORT_FALL_OFF_CYCLES;
272 dataFalloffBit6 =
true;
277 dataSetBit7 = value & 0x80;
278 dataSetClkBit7 = pla->getPhi2Time() + C64_CPU6510_DATA_PORT_FALL_OFF_CYCLES;
279 dataFalloffBit7 =
true;
287 value = pla->getLastReadByte();
293 ramBank->
poke(address, value);