21class CIA :
public SubComponent,
public Inspectable<CIAInfo, CIAStats> {
24 friend class ParCable;
26 Descriptions descriptions = {
29 .description =
"Complex Interface Adapter 1"
33 .description =
"Complex Interface Adapter 2"
37 ConfigOptions options = {
49 static constexpr u64 CIACountA0 = (1ULL << 0);
50 static constexpr u64 CIACountA1 = (1ULL << 1);
51 static constexpr u64 CIACountA2 = (1ULL << 2);
52 static constexpr u64 CIACountA3 = (1ULL << 3);
55 static constexpr u64 CIACountB0 = (1ULL << 4);
56 static constexpr u64 CIACountB1 = (1ULL << 5);
57 static constexpr u64 CIACountB2 = (1ULL << 6);
58 static constexpr u64 CIACountB3 = (1ULL << 7);
61 static constexpr u64 CIALoadA0 = (1ULL << 8);
62 static constexpr u64 CIALoadA1 = (1ULL << 9);
63 static constexpr u64 CIALoadA2 = (1ULL << 10);
66 static constexpr u64 CIALoadB0 = (1ULL << 11);
67 static constexpr u64 CIALoadB1 = (1ULL << 12);
68 static constexpr u64 CIALoadB2 = (1ULL << 13);
71 static constexpr u64 CIAPB6Low0 = (1ULL << 14);
72 static constexpr u64 CIAPB6Low1 = (1ULL << 15);
75 static constexpr u64 CIAPB7Low0 = (1ULL << 16);
76 static constexpr u64 CIAPB7Low1 = (1ULL << 17);
79 static constexpr u64 CIASetInt0 = (1ULL << 18);
80 static constexpr u64 CIASetInt1 = (1ULL << 19);
83 static constexpr u64 CIAClearInt0 = (1ULL << 20);
84 static constexpr u64 CIAOneShotA0 = (1ULL << 21);
85 static constexpr u64 CIAOneShotB0 = (1ULL << 22);
88 static constexpr u64 CIAReadIcr0 = (1ULL << 23);
89 static constexpr u64 CIAReadIcr1 = (1ULL << 24);
92 static constexpr u64 CIAClearIcr0 = (1ULL << 25);
93 static constexpr u64 CIAClearIcr1 = (1ULL << 26);
94 static constexpr u64 CIAClearIcr2 = (1ULL << 27);
97 static constexpr u64 CIAAckIcr0 = (1ULL << 28);
98 static constexpr u64 CIAAckIcr1 = (1ULL << 29);
101 static constexpr u64 CIASetIcr0 = (1ULL << 30);
102 static constexpr u64 CIASetIcr1 = (1ULL << 31);
105 static constexpr u64 CIATODInt0 = (1ULL << 32);
108 static constexpr u64 CIASerInt0 = (1ULL << 33);
109 static constexpr u64 CIASerInt1 = (1ULL << 34);
110 static constexpr u64 CIASerInt2 = (1ULL << 35);
113 static constexpr u64 CIASerLoad0 = (1ULL << 36);
114 static constexpr u64 CIASerLoad1 = (1ULL << 37);
117 static constexpr u64 CIASerClk0 = (1ULL << 38);
118 static constexpr u64 CIASerClk1 = (1ULL << 39);
119 static constexpr u64 CIASerClk2 = (1ULL << 40);
120 static constexpr u64 CIASerClk3 = (1ULL << 41);
122 static constexpr u64 CIALast = (1ULL << 42);
124 static constexpr u64 CIADelayMask = ~CIALast
125 & ~CIACountA0 & ~CIACountB0 & ~CIALoadA0 & ~CIALoadB0 & ~CIAPB6Low0
126 & ~CIAPB7Low0 & ~CIASetInt0 & ~CIAClearInt0 & ~CIAOneShotA0 & ~CIAOneShotB0
127 & ~CIAReadIcr0 & ~CIAClearIcr0 & ~CIAAckIcr0 & ~CIASetIcr0 & ~CIATODInt0
128 & ~CIASerInt0 & ~CIASerLoad0 & ~CIASerClk0;
131 CIAConfig config = { };
140 TOD tod = TOD(c64, *
this);
300 CIA(C64 &ref, isize
id);
302 bool isCIA1()
const {
return objid == 0; }
303 bool isCIA2()
const {
return objid == 1; }
305 CIA& operator= (
const CIA& other) {
353 void serialize(T& worker)
390 if (isResetter(worker))
return;
397 } SERIALIZERS(serialize);
406 const Descriptions &getDescriptions()
const override {
return descriptions; }
410 void _dump(Category category, std::ostream& os)
const override;
411 void _reset(
bool hard)
override;
420 void cacheInfo(CIAInfo &result)
const override;
421 void cacheStats(CIAStats &result)
const override;
430 const CIAConfig &getConfig()
const {
return config; }
431 const ConfigOptions &getOptions()
const override {
return options; }
432 i64 getOption(Option opt)
const override;
433 void checkOption(Option opt, i64 value)
override;
434 void setOption(Option opt, i64 value)
override;
447 u8 spypeek(u16 addr)
const;
450 void poke(u16 addr, u8 value);
460 u8 getPA()
const {
return PA; }
461 u8 getPB()
const {
return PB; }
466 u8 getDDRA()
const {
return DDRA; }
467 u8 getDDRB()
const {
return DDRB; }
470 virtual void updatePA() = 0;
471 virtual u8 computePA()
const = 0;
474 virtual u8 portAinternal()
const = 0;
477 virtual u8 portAexternal()
const = 0;
480 virtual void updatePB() = 0;
481 virtual u8 computePB()
const = 0;
484 virtual u8 portBinternal()
const = 0;
487 virtual u8 portBexternal()
const = 0;
492 virtual u8 peekPA() { updatePA();
return PA; }
493 virtual u8 peekPB() { updatePB();
return PB; }
496 virtual void pokePRA(u8 value) { PRA = value; updatePA(); }
497 virtual void pokePRB(u8 value) { PRB = value; updatePB(); }
500 virtual void pokeDDRA(u8 value) { DDRA = value; updatePA(); }
501 virtual void pokeDDRB(u8 value) { DDRB = value; updatePB(); }
511 void triggerRisingEdgeOnFlagPin();
512 void triggerFallingEdgeOnFlagPin();
515 virtual void pulsePC() { };
525 virtual void pullDownInterruptLine() = 0;
528 virtual void releaseInterruptLine() = 0;
531 void reloadTimerA(u64 *delay);
532 void reloadTimerB(u64 *delay);
535 void triggerTimerIrq(u64 *delay);
536 void triggerTodIrq(u64 *delay);
537 void triggerSerialIrq(u64 *delay);
552 void serviceEvent(EventID
id);
555 void scheduleNextExecution();
558 void scheduleWakeUp();
568 void executeOneCycle();
586 bool isSleeping()
const {
return sleeping; }
589 bool isAwake()
const {
return !sleeping; }
592 Cycle idleSince()
const;
595 Cycle idleTotal()
const {
return idleCycles; }
603class CIA1 final :
public CIA {
607 CIA1(C64 &ref) : CIA(ref, 0) { };
611 void pullDownInterruptLine()
override;
612 void releaseInterruptLine()
override;
614 u8 portAinternal()
const override;
615 u8 portAexternal()
const override;
616 void updatePA()
override;
617 u8 computePA()
const override;
619 u8 portBinternal()
const override;
620 u8 portBexternal()
const override;
621 void updatePB()
override;
622 u8 computePB()
const override;
630class CIA2 final :
public CIA {
632 friend class ParCable;
636 CIA2(C64 &ref) : CIA(ref, 1) { };
640 void pullDownInterruptLine()
override;
641 void releaseInterruptLine()
override;
643 u8 portAinternal()
const override;
644 u8 portAexternal()
const override;
648 void updatePA()
override;
649 u8 computePA()
const override;
653 u8 portBinternal()
const override;
654 u8 portBexternal()
const override;
655 void updatePB()
override;
656 u8 computePB()
const override;
657 void pokePRA(u8 value)
override;
658 void pokePRB(u8 value)
override;
659 void pokeDDRA(u8 value)
override;
660 void pulsePC()
override;
VirtualC64 project namespace.
Definition CmdQueue.cpp:16
@ OPT_CIA_TIMER_B_BUG
Emulate timer B bug.
Definition OptionTypes.h:105
@ OPT_CIA_REVISION
Chip revision.
Definition OptionTypes.h:104