summaryrefslogtreecommitdiff
path: root/sid/sidplay-libs-2.1.0/libsidplay/src/mos6510/mos6510.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sid/sidplay-libs-2.1.0/libsidplay/src/mos6510/mos6510.cpp')
-rw-r--r--sid/sidplay-libs-2.1.0/libsidplay/src/mos6510/mos6510.cpp534
1 files changed, 534 insertions, 0 deletions
diff --git a/sid/sidplay-libs-2.1.0/libsidplay/src/mos6510/mos6510.cpp b/sid/sidplay-libs-2.1.0/libsidplay/src/mos6510/mos6510.cpp
new file mode 100644
index 00000000..74b09c95
--- /dev/null
+++ b/sid/sidplay-libs-2.1.0/libsidplay/src/mos6510/mos6510.cpp
@@ -0,0 +1,534 @@
+/***************************************************************************
+ main.cpp - description
+ -------------------
+ begin : Thu May 11 06:22:40 BST 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: mos6510.cpp,v $
+ * Revision 1.8 2001/08/05 15:46:38 s_a_white
+ * No longer need to check on which cycle to print debug information.
+ *
+ * Revision 1.7 2001/07/14 13:04:34 s_a_white
+ * Accumulator is now unsigned, which improves code readability.
+ *
+ * Revision 1.6 2001/03/09 22:27:46 s_a_white
+ * Speed optimisation update.
+ *
+ * Revision 1.5 2001/02/13 23:01:10 s_a_white
+ * envReadMemDataByte now used for debugging.
+ *
+ * Revision 1.4 2000/12/11 19:03:16 s_a_white
+ * AC99 Update.
+ *
+ ***************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "sidtypes.h"
+#include "sidendian.h"
+#include "sidenv.h"
+#include "conf6510.h"
+#include "opcodes.h"
+
+#ifdef HAVE_EXCEPTIONS
+# include <new>
+#endif
+
+#ifdef MOS6510_STATE_6510
+# include "state6510.h"
+# include "state6510.cpp"
+#else
+
+#include "mos6510.h"
+
+// Check to see what type of emulation is required
+#ifdef MOS6510_CYCLE_BASED
+# include "cycle_based/mos6510c.i"
+
+# ifdef MOS6510_SIDPLAY
+ // Compile in sidplay code
+# include "cycle_based/sid6510c.i"
+# endif // MOS6510_SIDPLAY
+#else
+ // Line based emulation code has not been provided
+#endif // MOS6510_CYCLE_BASED
+
+void MOS6510::DumpState (void)
+{
+ uint8_t opcode, data;
+ uint_least16_t operand, address;
+
+ printf(" PC I A X Y SP DR PR NV-BDIZC Instruction\n");
+ printf("%04x ", instrStartPC);
+ printf("%u ", interrupts.irqs);
+ printf("%02x ", Register_Accumulator);
+ printf("%02x ", Register_X);
+ printf("%02x ", Register_Y);
+ printf("01%02x ", endian_16lo8 (Register_StackPointer));
+ printf("%02x ", envReadMemDataByte (0));
+ printf("%02x ", envReadMemDataByte (1));
+
+ if (getFlagN()) printf ("1"); else printf ("0");
+ if (getFlagV()) printf ("1"); else printf ("0");
+ if (Register_Status & (1 << SR_NOTUSED)) printf ("1"); else printf ("0");
+ if (Register_Status & (1 << SR_BREAK)) printf ("1"); else printf ("0");
+ if (getFlagD()) printf ("1"); else printf ("0");
+ if (getFlagI()) printf ("1"); else printf ("0");
+ if (getFlagZ()) printf ("1"); else printf ("0");
+ if (getFlagC()) printf ("1"); else printf ("0");
+
+ opcode = instrOpcode;
+ operand = Instr_Operand;
+ data = Cycle_Data;
+
+ switch (opcode)
+ {
+ case BCCr: case BCSr: case BEQr: case BMIr: case BNEr: case BPLr:
+ case BVCr: case BVSr:
+ address = (uint_least16_t) (Register_ProgramCounter + (int8_t) operand);
+ break;
+
+ default:
+ address = Cycle_EffectiveAddress;
+ break;
+ }
+
+ printf(" %02x ", opcode);
+
+ switch(opcode)
+ {
+ //Accumulator or Implied addressing
+ case ASLn: case LSRn: case ROLn: case RORn:
+ printf(" ");
+ break;
+ //Zero Page Addressing Mode Handler
+ case ADCz: case ANDz: case ASLz: case BITz: case CMPz: case CPXz:
+ case CPYz: case DCPz: case DECz: case EORz: case INCz: case ISBz:
+ case LAXz: case LDAz: case LDXz: case LDYz: case LSRz: case NOPz_:
+ case ORAz: case ROLz: case RORz: case SAXz: case SBCz: case SREz:
+ case STAz: case STXz: case STYz: case SLOz: case RLAz: case RRAz:
+ //ASOz AXSz DCMz INSz LSEz - Optional Opcode Names
+ printf("%02x ", (uint8_t) operand);
+ break;
+ //Zero Page with X Offset Addressing Mode Handler
+ case ADCzx: case ANDzx: case ASLzx: case CMPzx: case DCPzx: case DECzx:
+ case EORzx: case INCzx: case ISBzx: case LDAzx: case LDYzx: case LSRzx:
+ case NOPzx_: case ORAzx: case RLAzx: case ROLzx: case RORzx: case RRAzx:
+ case SBCzx: case SLOzx: case SREzx: case STAzx: case STYzx:
+ //ASOzx DCMzx INSzx LSEzx - Optional Opcode Names
+ printf("%02x ", (uint8_t) operand);
+ break;
+ //Zero Page with Y Offset Addressing Mode Handler
+ case LDXzy: case STXzy: case SAXzy: case LAXzy:
+ //AXSzx - Optional Opcode Names
+ printf("%02x ", endian_16lo8 (operand));
+ break;
+ //Absolute Addressing Mode Handler
+ case ADCa: case ANDa: case ASLa: case BITa: case CMPa: case CPXa:
+ case CPYa: case DCPa: case DECa: case EORa: case INCa: case ISBa:
+ case JMPw: case JSRw: case LAXa: case LDAa: case LDXa: case LDYa:
+ case LSRa: case NOPa: case ORAa: case ROLa: case RORa: case SAXa:
+ case SBCa: case SLOa: case SREa: case STAa: case STXa: case STYa:
+ case RLAa: case RRAa:
+ //ASOa AXSa DCMa INSa LSEa - Optional Opcode Names
+ printf("%02x %02x ", endian_16lo8 (operand), endian_16hi8 (operand));
+ break;
+ //Absolute With X Offset Addresing Mode Handler
+ case ADCax: case ANDax: case ASLax: case CMPax: case DCPax: case DECax:
+ case EORax: case INCax: case ISBax: case LDAax: case LDYax: case LSRax:
+ case NOPax_: case ORAax: case RLAax: case ROLax: case RORax: case RRAax:
+ case SBCax: case SHYax: case SLOax: case SREax: case STAax:
+ //ASOax DCMax INSax LSEax SAYax - Optional Opcode Names
+ printf("%02x %02x ", endian_16lo8 (operand), endian_16hi8 (operand));
+ break;
+ //Absolute With Y Offset Addresing Mode Handler
+ case ADCay: case ANDay: case CMPay: case DCPay: case EORay: case ISBay:
+ case LASay: case LAXay: case LDAay: case LDXay: case ORAay: case RLAay:
+ case RRAay: case SBCay: case SHAay: case SHSay: case SHXay: case SLOay:
+ case SREay: case STAay:
+ //ASOay AXAay DCMay INSax LSEay TASay XASay - Optional Opcode Names
+ printf("%02x %02x ", endian_16lo8 (operand), endian_16hi8 (operand));
+ break;
+ //Immediate and Relative Addressing Mode Handler
+ case ADCb: case ANDb: case ANCb_: case ANEb: case ASRb: case ARRb:
+
+ case CMPb: case CPXb: case CPYb: case EORb: case LDAb: case LDXb:
+ case LDYb: case LXAb: case NOPb_: case ORAb: case SBCb_: case SBXb:
+ //OALb ALRb XAAb - Optional Opcode Names
+ printf("%02x ", endian_16lo8 (operand));
+ break;
+ case BCCr: case BCSr: case BEQr: case BMIr: case BNEr: case BPLr:
+ case BVCr: case BVSr:
+ printf("%02x ", endian_16lo8 (operand));
+ break;
+ //Indirect Addressing Mode Handler
+ case JMPi:
+ printf("%02x %02x ", endian_16lo8 (operand), endian_16hi8 (operand));
+ break;
+ //Indexed with X Preinc Addressing Mode Handler
+ case ADCix: case ANDix: case CMPix: case DCPix: case EORix: case ISBix:
+ case LAXix: case LDAix: case ORAix: case SAXix: case SBCix: case SLOix:
+ case SREix: case STAix: case RLAix: case RRAix:
+ //ASOix AXSix DCMix INSix LSEix - Optional Opcode Names
+ printf("%02x ", endian_16lo8 (operand));
+ break;
+ //Indexed with Y Postinc Addressing Mode Handler
+ case ADCiy: case ANDiy: case CMPiy: case DCPiy: case EORiy: case ISBiy:
+ case LAXiy: case LDAiy: case ORAiy: case RLAiy: case RRAiy: case SBCiy:
+ case SHAiy: case SLOiy: case SREiy: case STAiy:
+ //AXAiy ASOiy LSEiy DCMiy INSiy - Optional Opcode Names
+ printf("%02x ", endian_16lo8 (operand));
+ break;
+ default:
+ printf(" ");
+ break;
+ }
+
+ switch(opcode)
+ {
+ case ADCb: case ADCz: case ADCzx: case ADCa: case ADCax: case ADCay:
+ case ADCix: case ADCiy:
+ printf(" ADC"); break;
+ case ANCb_:
+ printf("*ANC"); break;
+ case ANDb: case ANDz: case ANDzx: case ANDa: case ANDax: case ANDay:
+ case ANDix: case ANDiy:
+ printf(" AND"); break;
+ case ANEb: //Also known as XAA
+ printf("*ANE"); break;
+ case ARRb:
+ printf("*ARR"); break;
+ case ASLn: case ASLz: case ASLzx: case ASLa: case ASLax:
+ printf(" ASL"); break;
+ case ASRb: //Also known as ALR
+ printf("*ASR"); break;
+ case BCCr:
+ printf(" BCC"); break;
+ case BCSr:
+ printf(" BCS"); break;
+ case BEQr:
+ printf(" BEQ"); break;
+ case BITz: case BITa:
+ printf(" BIT"); break;
+ case BMIr:
+ printf(" BMI"); break;
+ case BNEr:
+ printf(" BNE"); break;
+ case BPLr:
+ printf(" BPL"); break;
+ case BRKn:
+ printf(" BRK"); break;
+ case BVCr:
+ printf(" BVC"); break;
+ case BVSr:
+ printf(" BVS"); break;
+ case CLCn:
+ printf(" CLC"); break;
+ case CLDn:
+ printf(" CLD"); break;
+ case CLIn:
+ printf(" CLI"); break;
+ case CLVn:
+ printf(" CLV"); break;
+ case CMPb: case CMPz: case CMPzx: case CMPa: case CMPax: case CMPay:
+ case CMPix: case CMPiy:
+ printf(" CMP"); break;
+ case CPXb: case CPXz: case CPXa:
+ printf(" CPX"); break;
+ case CPYb: case CPYz: case CPYa:
+ printf(" CPY"); break;
+ case DCPz: case DCPzx: case DCPa: case DCPax: case DCPay: case DCPix:
+ case DCPiy: //Also known as DCM
+ printf("*DCP"); break;
+ case DECz: case DECzx: case DECa: case DECax:
+ printf(" DEC"); break;
+ case DEXn:
+ printf(" DEX"); break;
+ case DEYn:
+ printf(" DEY"); break;
+ case EORb: case EORz: case EORzx: case EORa: case EORax: case EORay:
+ case EORix: case EORiy:
+ printf(" EOR"); break;
+ case INCz: case INCzx: case INCa: case INCax:
+ printf(" INC"); break;
+ case INXn:
+ printf(" INX"); break;
+ case INYn:
+ printf(" INY"); break;
+ case ISBz: case ISBzx: case ISBa: case ISBax: case ISBay: case ISBix:
+ case ISBiy: //Also known as INS
+ printf("*ISB"); break;
+ case JMPw: case JMPi:
+ printf(" JMP"); break;
+ case JSRw:
+ printf(" JSR"); break;
+ case LASay:
+ printf("*LAS"); break;
+ case LAXz: case LAXzy: case LAXa: case LAXay: case LAXix: case LAXiy:
+ printf("*LAX"); break;
+ case LDAb: case LDAz: case LDAzx: case LDAa: case LDAax: case LDAay:
+ case LDAix: case LDAiy:
+ printf(" LDA"); break;
+ case LDXb: case LDXz: case LDXzy: case LDXa: case LDXay:
+ printf(" LDX"); break;
+ case LDYb: case LDYz: case LDYzx: case LDYa: case LDYax:
+ printf(" LDY"); break;
+ case LSRz: case LSRzx: case LSRa: case LSRax: case LSRn:
+ printf(" LSR"); break;
+ case NOPn_: case NOPb_: case NOPz_: case NOPzx_: case NOPa: case NOPax_:
+ if(opcode != NOPn) printf("*");
+ else printf(" ");
+ printf("NOP"); break;
+ case LXAb: //Also known as OAL
+ printf("*LXA"); break;
+ case ORAb: case ORAz: case ORAzx: case ORAa: case ORAax: case ORAay:
+ case ORAix: case ORAiy:
+ printf(" ORA"); break;
+ case PHAn:
+ printf(" PHA"); break;
+ case PHPn:
+ printf(" PHP"); break;
+ case PLAn:
+ printf(" PLA"); break;
+ case PLPn:
+ printf(" PLP"); break;
+ case RLAz: case RLAzx: case RLAix: case RLAa: case RLAax: case RLAay:
+ case RLAiy:
+ printf("*RLA"); break;
+ case ROLz: case ROLzx: case ROLa: case ROLax: case ROLn:
+ printf(" ROL"); break;
+ case RORz: case RORzx: case RORa: case RORax: case RORn:
+ printf(" ROR"); break;
+ case RRAa: case RRAax: case RRAay: case RRAz: case RRAzx: case RRAix:
+ case RRAiy:
+ printf("*RRA"); break;
+ case RTIn:
+ printf(" RTI"); break;
+ case RTSn:
+ printf(" RTS"); break;
+ case SAXz: case SAXzy: case SAXa: case SAXix: //Also known as AXS
+ printf("*SAX"); break;
+ case SBCb_:
+ if(opcode != SBCb) printf("*");
+ else printf(" ");
+ printf ("SBC"); break;
+ case SBCz: case SBCzx: case SBCa: case SBCax: case SBCay: case SBCix:
+ case SBCiy:
+ printf(" SBC"); break;
+ case SBXb:
+ printf("*SBX"); break;
+ case SECn:
+ printf(" SEC"); break;
+ case SEDn:
+ printf(" SED"); break;
+ case SEIn:
+ printf(" SEI"); break;
+ case SHAay: case SHAiy: //Also known as AXA
+ printf("*SHA"); break;
+ case SHSay: //Also known as TAS
+ printf("*SHS"); break;
+ case SHXay: //Also known as XAS
+ printf("*SHX"); break;
+ case SHYax: //Also known as SAY
+ printf("*SHY"); break;
+ case SLOz: case SLOzx: case SLOa: case SLOax: case SLOay: case SLOix:
+ case SLOiy: //Also known as ASO
+ printf("*SLO"); break;
+ case SREz: case SREzx: case SREa: case SREax: case SREay: case SREix:
+ case SREiy: //Also known as LSE
+ printf("*SRE"); break;
+ case STAz: case STAzx: case STAa: case STAax: case STAay: case STAix:
+ case STAiy:
+ printf(" STA"); break;
+ case STXz: case STXzy: case STXa:
+ printf(" STX"); break;
+ case STYz: case STYzx: case STYa:
+ printf(" STY"); break;
+ case TAXn:
+ printf(" TAX"); break;
+ case TAYn:
+ printf(" TAY"); break;
+ case TSXn:
+ printf(" TSX"); break;
+ case TXAn:
+ printf(" TXA"); break;
+ case TXSn:
+ printf(" TXS"); break;
+ case TYAn:
+ printf(" TYA"); break;
+ default:
+ printf("*HLT"); break;
+ }
+
+ switch(opcode)
+ {
+ //Accumulator or Implied addressing
+ case ASLn: case LSRn: case ROLn: case RORn:
+ printf("n A");
+ break;
+
+ //Zero Page Addressing Mode Handler
+ case ADCz: case ANDz: case ASLz: case BITz: case CMPz: case CPXz:
+ case CPYz: case DCPz: case DECz: case EORz: case INCz: case ISBz:
+ case LAXz: case LDAz: case LDXz: case LDYz: case LSRz: case ORAz:
+
+ case ROLz: case RORz: case SBCz: case SREz: case SLOz: case RLAz:
+ case RRAz:
+ //ASOz AXSz DCMz INSz LSEz - Optional Opcode Names
+ printf("z %02x {%02x}", (uint8_t) operand, data);
+ break;
+ case SAXz: case STAz: case STXz: case STYz:
+#ifdef MOS6510_DEBUG
+ case NOPz_:
+#endif
+ printf("z %02x", endian_16lo8 (operand));
+ break;
+
+ //Zero Page with X Offset Addressing Mode Handler
+ case ADCzx: case ANDzx: case ASLzx: case CMPzx: case DCPzx: case DECzx:
+ case EORzx: case INCzx: case ISBzx: case LDAzx: case LDYzx: case LSRzx:
+ case ORAzx: case RLAzx: case ROLzx: case RORzx: case RRAzx: case SBCzx:
+ case SLOzx: case SREzx:
+ //ASOzx DCMzx INSzx LSEzx - Optional Opcode Names
+ printf("zx %02x,X", endian_16lo8 (operand));
+ printf(" [%04x]{%02x}", address, data);
+ break;
+ case STAzx: case STYzx:
+#ifdef MOS6510_DEBUG
+ case NOPzx_:
+#endif
+ printf("zx %02x,X", endian_16lo8 (operand));
+ printf(" [%04x]", address);
+ break;
+
+ //Zero Page with Y Offset Addressing Mode Handler
+ case LAXzy: case LDXzy:
+ //AXSzx - Optional Opcode Names
+ printf("zy %02x,Y", endian_16lo8 (operand));
+ printf(" [%04x]{%02x}", address, data);
+ break;
+ case STXzy: case SAXzy:
+ printf("zy %02x,Y", endian_16lo8 (operand));
+ printf(" [%04x]", address);
+ break;
+
+ //Absolute Addressing Mode Handler
+ case ADCa: case ANDa: case ASLa: case BITa: case CMPa: case CPXa:
+ case CPYa: case DCPa: case DECa: case EORa: case INCa: case ISBa:
+ case LAXa: case LDAa: case LDXa: case LDYa: case LSRa: case ORAa:
+ case ROLa: case RORa: case SBCa: case SLOa: case SREa: case RLAa:
+ case RRAa:
+ //ASOa AXSa DCMa INSa LSEa - Optional Opcode Names
+ printf("a %04x {%02x}", operand, data);
+ break;
+ case SAXa: case STAa: case STXa: case STYa:
+#ifdef MOS6510_DEBUG
+ case NOPa:
+#endif
+ printf("a %04x", operand);
+ break;
+ case JMPw: case JSRw:
+ printf("w %04x", operand);
+ break;
+
+ //Absolute With X Offset Addresing Mode Handler
+ case ADCax: case ANDax: case ASLax: case CMPax: case DCPax: case DECax:
+ case EORax: case INCax: case ISBax: case LDAax: case LDYax: case LSRax:
+ case ORAax: case RLAax: case ROLax: case RORax: case RRAax: case SBCax:
+ case SLOax: case SREax:
+ //ASOax DCMax INSax LSEax SAYax - Optional Opcode Names
+ printf("ax %04x,X", operand);
+ printf(" [%04x]{%02x}", address, data);
+ break;
+ case SHYax: case STAax:
+#ifdef MOS6510_DEBUG
+ case NOPax_:
+#endif
+ printf("ax %04x,X", operand);
+ printf(" [%04x]", address);
+ break;
+
+ //Absolute With Y Offset Addresing Mode Handler
+ case ADCay: case ANDay: case CMPay: case DCPay: case EORay: case ISBay:
+ case LASay: case LAXay: case LDAay: case LDXay: case ORAay: case RLAay:
+ case RRAay: case SBCay: case SHSay: case SLOay: case SREay:
+ //ASOay AXAay DCMay INSax LSEay TASay XASay - Optional Opcode Names
+ printf("ay %04x,Y", operand);
+ printf(" [%04x]{%02x}", address, data);
+ break;
+ case SHAay: case SHXay: case STAay:
+ printf("ay %04x,Y", operand);
+ printf(" [%04x]", address);
+ break;
+
+ //Immediate Addressing Mode Handler
+ case ADCb: case ANDb: case ANCb_: case ANEb: case ASRb: case ARRb:
+ case CMPb: case CPXb: case CPYb: case EORb: case LDAb: case LDXb:
+ case LDYb: case LXAb: case ORAb: case SBCb_: case SBXb:
+ //OALb ALRb XAAb - Optional Opcode Names
+#ifdef MOS6510_DEBUG
+ case NOPb_:
+#endif
+ printf("b #%02x", endian_16lo8 (operand));
+ break;
+
+ //Relative Addressing Mode Handler
+ case BCCr: case BCSr: case BEQr: case BMIr: case BNEr: case BPLr:
+ case BVCr: case BVSr:
+ printf("r #%02x", endian_16lo8 (operand));
+ printf(" [%04x]", address);
+ break;
+
+ //Indirect Addressing Mode Handler
+ case JMPi:
+ printf("i (%04x)", operand);
+ printf(" [%04x]", address);
+ break;
+
+ //Indexed with X Preinc Addressing Mode Handler
+ case ADCix: case ANDix: case CMPix: case DCPix: case EORix: case ISBix:
+ case LAXix: case LDAix: case ORAix: case SBCix: case SLOix: case SREix:
+ case RLAix: case RRAix:
+ //ASOix AXSix DCMix INSix LSEix - Optional Opcode Names
+ printf("ix (%02x,X)", endian_16lo8 (operand));
+ printf(" [%04x]{%02x}", address, data);
+ break;
+ case SAXix: case STAix:
+ printf("ix (%02x,X)", endian_16lo8 (operand));
+ printf(" [%04x]", address);
+ break;
+
+ //Indexed with Y Postinc Addressing Mode Handler
+ case ADCiy: case ANDiy: case CMPiy: case DCPiy: case EORiy: case ISBiy:
+ case LAXiy: case LDAiy: case ORAiy: case RLAiy: case RRAiy: case SBCiy:
+ case SLOiy: case SREiy:
+ //AXAiy ASOiy LSEiy DCMiy INSiy - Optional Opcode Names
+ printf("iy (%02x),Y", endian_16lo8 (operand));
+ printf(" [%04x]{%02x}", address, data);
+ break;
+ case SHAiy: case STAiy:
+ printf("iy (%02x),Y", endian_16lo8 (operand));
+ printf(" [%04x]", address);
+ break;
+
+ default:
+ break;
+ }
+
+ printf ("\n\n");
+ fflush (stdout);
+}
+
+#endif // MOS6510_STATE_6510
+