summaryrefslogtreecommitdiff
path: root/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h')
-rw-r--r--plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h20
1 files changed, 17 insertions, 3 deletions
diff --git a/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h b/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h
index 9a046d2e..93d222a3 100644
--- a/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h
+++ b/plugins/sid/sidplay-libs/libsidplay/src/mos6510/cycle_based/mos6510c.h
@@ -71,11 +71,12 @@
#include "sidtypes.h"
#include "sidendian.h"
-
+#include <setjmp.h>
class MOS6510: public C64Environment, public Event
{
private:
+ jmp_buf jmp_env;
// External signals
bool aec; /* Address Controller, blocks all */
bool rdy; /* Bus Access, blocks reads */
@@ -293,9 +294,22 @@ public:
inline void MOS6510::clock (void)
{
int_least8_t i = cycleCount++;
- try {
+
+// C++ exception version
+// try {
+// (this->*procCycle[i]) ();
+// } catch (int_least8_t delta) {
+// cycleCount += delta;
+// m_blocked = true;
+// eventContext.cancel (this);
+// }
+
+ // longjmp version
+ int_least8_t delta = setjmp (jmp_env);
+ if (delta == 0) {
(this->*procCycle[i]) ();
- } catch (int_least8_t delta) {
+ }
+ else {
cycleCount += delta;
m_blocked = true;
eventContext.cancel (this);