summaryrefslogtreecommitdiff
path: root/plugins/sid/sidplay-libs/libsidplay/src/mos6526/mos6526.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/sid/sidplay-libs/libsidplay/src/mos6526/mos6526.h')
-rw-r--r--plugins/sid/sidplay-libs/libsidplay/src/mos6526/mos6526.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/plugins/sid/sidplay-libs/libsidplay/src/mos6526/mos6526.h b/plugins/sid/sidplay-libs/libsidplay/src/mos6526/mos6526.h
new file mode 100644
index 00000000..5fa11bcf
--- /dev/null
+++ b/plugins/sid/sidplay-libs/libsidplay/src/mos6526/mos6526.h
@@ -0,0 +1,156 @@
+/***************************************************************************
+ mos6526.h - CIA timer to produce interrupts
+ -------------------
+ begin : Wed Jun 7 2000
+ copyright : (C) 2000 by Simon White
+ email : s_a_white@email.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+/***************************************************************************
+ * $Log: mos6526.h,v $
+ * Revision 1.11 2002/12/16 22:12:27 s_a_white
+ * Simulate serial input from data port A to prevent kernel lockups.
+ *
+ * Revision 1.10 2002/10/02 19:49:22 s_a_white
+ * Revert previous change as was incorrect.
+ *
+ * Revision 1.9 2002/09/11 22:30:47 s_a_white
+ * Counter interval writes now go to a new register call prescaler. This is
+ * copied to the timer latch/counter as appropriate.
+ *
+ * Revision 1.8 2002/07/20 08:34:52 s_a_white
+ * Remove unnecessary and pointless conts.
+ *
+ * Revision 1.7 2001/10/18 22:35:45 s_a_white
+ * GCC3 fixes.
+ *
+ * Revision 1.6 2001/07/14 16:46:59 s_a_white
+ * Sync with sidbuilder class project.
+ *
+ * Revision 1.5 2001/07/14 13:03:33 s_a_white
+ * Now uses new component classes and event generation.
+ *
+ * Revision 1.4 2001/03/25 19:50:16 s_a_white
+ * Timer B counts timer Aer a underflows correc
+ *
+ * Revision 1.3 2001/03/23 23:20:29 s_a_white
+ * Removed redundant reset prototype.
+ *
+ * Revision 1.2 2001/03/22 22:41:45 s_a_white
+ * Replaced tab characters
+ *
+ * Revision 1.1 2001/03/21 22:41:45 s_a_white
+ * Non faked CIA emulation with NMI support. Removal of Hacked VIC support
+ * off CIA timer.
+ *
+ * Revision 1.7 2001/03/09 23:44:30 s_a_white
+ * Integrated more 6526 features. All timer modes and interrupts correctly
+ * supported.
+ *
+ * Revision 1.6 2001/02/21 22:07:10 s_a_white
+ * Prevent re-triggering of interrupt if it's already active.
+ *
+ * Revision 1.5 2001/02/13 21:00:01 s_a_white
+ * Support for real interrupts.
+ *
+ * Revision 1.3 2000/12/11 18:52:12 s_a_white
+ * Conversion to AC99
+ *
+ ***************************************************************************/
+
+#ifndef _mos6526_h_
+#define _mos6526_h_
+
+#include "component.h"
+#include "event.h"
+
+class MOS6526: public component
+{
+private:
+ static const char *credit;
+
+protected:
+ uint8_t regs[0x10];
+ bool cnt_high;
+
+ // Timer A
+ uint8_t cra, cra_latch, dpa;
+ uint_least16_t ta, ta_latch;
+ int ta_state;
+
+ // Timer B
+ uint8_t crb;
+ uint_least16_t tb, tb_latch;
+
+ uint8_t icr, idr; // Interrupt Control Register
+ event_clock_t m_accessClk;
+ EventContext &event_context;
+
+ class EventTa: public Event
+ {
+ private:
+ MOS6526 &m_cia;
+ void event (void) {m_cia.ta_event ();}
+
+ public:
+ EventTa (MOS6526 *cia)
+ :Event("CIA Timer A"),
+ m_cia(*cia) {}
+ } event_ta;
+
+ /*
+ class EventStateMachineA: public Event
+ {
+ private:
+ MOS6526 &m_cia;
+ void event (void) {m_cia.cra_event ();}
+
+ public:
+ EventStateMachineA (MOS6526 *cia)
+ :Event("CIA Timer A (State Machine)"),
+ m_cia(*cia) {}
+ } event_stateMachineA;
+*/
+ class EventTb: public Event
+ {
+ private:
+ MOS6526 &m_cia;
+ void event (void) {m_cia.tb_event ();}
+
+ public:
+ EventTb (MOS6526 *cia)
+ :Event("CIA Timer B"),
+ m_cia(*cia) {}
+ } event_tb;
+
+ friend class EventTa;
+// friend class EventStateMachineA;
+ friend class EventTb;
+
+protected:
+ MOS6526 (EventContext *context);
+ void ta_event (void);
+ void tb_event (void);
+ void trigger (int irq);
+// void stateMachineA_event (void);
+
+ // Environment Interface
+ virtual void interrupt (bool state) = 0;
+
+public:
+ // Component Standard Calls
+ void reset (void);
+ uint8_t read (uint_least8_t addr);
+ void write (uint_least8_t addr, uint8_t data);
+ const char *credits (void) {return credit;}
+};
+
+#endif // _mos6526_h_