C64 emulation on STM32F429 Discovery board with builtin LCD and USB keyboard support (OTG). More info at davevw.com and/or github.com/davervw

Dependencies:   LCD_DISCO_F429ZI BSP_DISCO_F429ZI USBHOST

Committer:
davervw
Date:
Thu Apr 16 06:38:02 2020 +0000
Revision:
9:a0c6747e539f
Parent:
4:8476be802690
1.3 - keyboard RESTORE (NMI) implemented

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davervw 4:8476be802690 1 // emu6502.cpp - Emu6502 - MOS6502 Emulator
davervw 0:90de1cbc8a5f 2 //
davervw 0:90de1cbc8a5f 3 ////////////////////////////////////////////////////////////////////////////////
davervw 0:90de1cbc8a5f 4 //
davervw 4:8476be802690 5 // C64-stm429_discovery
davervw 4:8476be802690 6 // C64/6502 Emulator targeting STM32F429 LCD/USBHOST
davervw 4:8476be802690 7 // [ported from c-simple-emu-cbm (C Portable Version - for console)]
davervw 0:90de1cbc8a5f 8 //
davervw 0:90de1cbc8a5f 9 // MIT License
davervw 0:90de1cbc8a5f 10 //
davervw 0:90de1cbc8a5f 11 // Copyright(c) 2020 by David R.Van Wagner
davervw 0:90de1cbc8a5f 12 // davevw.com
davervw 0:90de1cbc8a5f 13 //
davervw 0:90de1cbc8a5f 14 // Permission is hereby granted, free of charge, to any person obtaining a copy
davervw 0:90de1cbc8a5f 15 // of this software and associated documentation files (the "Software"), to deal
davervw 0:90de1cbc8a5f 16 // in the Software without restriction, including without limitation the rights
davervw 0:90de1cbc8a5f 17 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
davervw 0:90de1cbc8a5f 18 // copies of the Software, and to permit persons to whom the Software is
davervw 0:90de1cbc8a5f 19 // furnished to do so, subject to the following conditions:
davervw 0:90de1cbc8a5f 20 //
davervw 0:90de1cbc8a5f 21 // The above copyright notice and this permission notice shall be included in all
davervw 0:90de1cbc8a5f 22 // copies or substantial portions of the Software.
davervw 0:90de1cbc8a5f 23 //
davervw 0:90de1cbc8a5f 24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
davervw 0:90de1cbc8a5f 25 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
davervw 0:90de1cbc8a5f 26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
davervw 0:90de1cbc8a5f 27 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
davervw 0:90de1cbc8a5f 28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
davervw 0:90de1cbc8a5f 29 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
davervw 0:90de1cbc8a5f 30 // SOFTWARE.
davervw 0:90de1cbc8a5f 31 //
davervw 0:90de1cbc8a5f 32 ////////////////////////////////////////////////////////////////////////////////
davervw 0:90de1cbc8a5f 33
davervw 0:90de1cbc8a5f 34 //#define snprintf sprintf_s
davervw 0:90de1cbc8a5f 35
davervw 0:90de1cbc8a5f 36 #include <mbed.h>
davervw 0:90de1cbc8a5f 37 #include "emu6502.h"
davervw 0:90de1cbc8a5f 38
davervw 0:90de1cbc8a5f 39 // globals
davervw 0:90de1cbc8a5f 40 byte A = 0;
davervw 0:90de1cbc8a5f 41 byte X = 0;
davervw 0:90de1cbc8a5f 42 byte Y = 0;
davervw 0:90de1cbc8a5f 43 byte S = 0xFF;
davervw 0:90de1cbc8a5f 44 bool N = false;
davervw 0:90de1cbc8a5f 45 bool V = false;
davervw 0:90de1cbc8a5f 46 bool B = false;
davervw 0:90de1cbc8a5f 47 bool D = false;
davervw 0:90de1cbc8a5f 48 bool I = false;
davervw 0:90de1cbc8a5f 49 bool Z = false;
davervw 0:90de1cbc8a5f 50 bool C = false;
davervw 0:90de1cbc8a5f 51 ushort PC = 0;
davervw 0:90de1cbc8a5f 52 bool trace = false;
davervw 0:90de1cbc8a5f 53 bool step = false;
davervw 0:90de1cbc8a5f 54
davervw 0:90de1cbc8a5f 55 extern void ResetRun(bool (*ExecutePatch)(void))
davervw 0:90de1cbc8a5f 56 {
davervw 0:90de1cbc8a5f 57 ushort addr = (ushort)((GetMemory(0xFFFC) | (GetMemory(0xFFFD) << 8))); // RESET vector
davervw 0:90de1cbc8a5f 58 Execute(addr, ExecutePatch);
davervw 0:90de1cbc8a5f 59 }
davervw 0:90de1cbc8a5f 60
davervw 0:90de1cbc8a5f 61 #ifndef WIN32
davervw 0:90de1cbc8a5f 62 static void strcpy_s(char* dest, size_t size, const char* src)
davervw 0:90de1cbc8a5f 63 {
davervw 0:90de1cbc8a5f 64 strncpy(dest, src, size);
davervw 0:90de1cbc8a5f 65 }
davervw 0:90de1cbc8a5f 66
davervw 0:90de1cbc8a5f 67 static void strcat_s(char* dest, size_t size, const char* src)
davervw 0:90de1cbc8a5f 68 {
davervw 0:90de1cbc8a5f 69 strncat(dest, src, size);
davervw 0:90de1cbc8a5f 70 }
davervw 0:90de1cbc8a5f 71 #endif
davervw 0:90de1cbc8a5f 72
davervw 9:a0c6747e539f 73 extern void PHP()
davervw 0:90de1cbc8a5f 74 {
davervw 0:90de1cbc8a5f 75 int flags = (N ? 0x80 : 0)
davervw 0:90de1cbc8a5f 76 | (V ? 0x40 : 0)
davervw 0:90de1cbc8a5f 77 | (B ? 0x10 : 0)
davervw 0:90de1cbc8a5f 78 | (D ? 0x08 : 0)
davervw 0:90de1cbc8a5f 79 | (I ? 0x04 : 0)
davervw 0:90de1cbc8a5f 80 | (Z ? 0x02 : 0)
davervw 0:90de1cbc8a5f 81 | (C ? 0x01 : 0);
davervw 0:90de1cbc8a5f 82 Push(flags);
davervw 0:90de1cbc8a5f 83 }
davervw 0:90de1cbc8a5f 84
davervw 0:90de1cbc8a5f 85 extern byte LO(ushort value)
davervw 0:90de1cbc8a5f 86 {
davervw 0:90de1cbc8a5f 87 return (byte)value;
davervw 0:90de1cbc8a5f 88 }
davervw 0:90de1cbc8a5f 89
davervw 0:90de1cbc8a5f 90 extern byte HI(ushort value)
davervw 0:90de1cbc8a5f 91 {
davervw 0:90de1cbc8a5f 92 return (byte)(value >> 8);
davervw 0:90de1cbc8a5f 93 }
davervw 0:90de1cbc8a5f 94
davervw 0:90de1cbc8a5f 95 static void BRK(byte *p_bytes)
davervw 0:90de1cbc8a5f 96 {
davervw 0:90de1cbc8a5f 97 ++PC;
davervw 0:90de1cbc8a5f 98 Push(HI(PC));
davervw 0:90de1cbc8a5f 99 Push(LO(PC));
davervw 4:8476be802690 100 PHP();
davervw 0:90de1cbc8a5f 101 B = true;
davervw 0:90de1cbc8a5f 102 PC = (ushort)(GetMemory(0xFFFE) + (GetMemory(0xFFFF) << 8));
davervw 0:90de1cbc8a5f 103 *p_bytes = 0;
davervw 0:90de1cbc8a5f 104 }
davervw 0:90de1cbc8a5f 105
davervw 0:90de1cbc8a5f 106 static byte Subtract(byte reg, byte value, bool *p_overflow)
davervw 0:90de1cbc8a5f 107 {
davervw 0:90de1cbc8a5f 108 bool old_reg_neg = (reg & 0x80) != 0;
davervw 0:90de1cbc8a5f 109 bool value_neg = (value & 0x80) != 0;
davervw 0:90de1cbc8a5f 110 int result = reg - value - (C ? 0 : 1);
davervw 0:90de1cbc8a5f 111 N = (result & 0x80) != 0;
davervw 0:90de1cbc8a5f 112 C = (result >= 0);
davervw 0:90de1cbc8a5f 113 Z = (result == 0);
davervw 0:90de1cbc8a5f 114 bool result_neg = (result & 0x80) != 0;
davervw 0:90de1cbc8a5f 115 *p_overflow = (old_reg_neg && !value_neg && !result_neg) // neg - pos = pos
davervw 0:90de1cbc8a5f 116 || (!old_reg_neg && value_neg && result_neg); // pos - neg = neg
davervw 0:90de1cbc8a5f 117 return (byte)result;
davervw 0:90de1cbc8a5f 118 }
davervw 0:90de1cbc8a5f 119
davervw 0:90de1cbc8a5f 120 static byte SubtractWithoutOverflow(byte reg, byte value)
davervw 0:90de1cbc8a5f 121 {
davervw 0:90de1cbc8a5f 122 C = true; // init for CMP, etc.
davervw 0:90de1cbc8a5f 123 bool unused;
davervw 0:90de1cbc8a5f 124 return Subtract(reg, value, &unused);
davervw 0:90de1cbc8a5f 125 }
davervw 0:90de1cbc8a5f 126
davervw 0:90de1cbc8a5f 127 static void CMP(byte value)
davervw 0:90de1cbc8a5f 128 {
davervw 0:90de1cbc8a5f 129 SubtractWithoutOverflow(A, value);
davervw 0:90de1cbc8a5f 130 }
davervw 0:90de1cbc8a5f 131
davervw 0:90de1cbc8a5f 132 static void CPX(byte value)
davervw 0:90de1cbc8a5f 133 {
davervw 0:90de1cbc8a5f 134 SubtractWithoutOverflow(X, value);
davervw 0:90de1cbc8a5f 135 }
davervw 0:90de1cbc8a5f 136
davervw 0:90de1cbc8a5f 137 static void CPY(byte value)
davervw 0:90de1cbc8a5f 138 {
davervw 0:90de1cbc8a5f 139 SubtractWithoutOverflow(Y, value);
davervw 0:90de1cbc8a5f 140 }
davervw 0:90de1cbc8a5f 141
davervw 0:90de1cbc8a5f 142 static void SetReg(byte *p_reg, int value)
davervw 0:90de1cbc8a5f 143 {
davervw 0:90de1cbc8a5f 144 *p_reg = (byte)value;
davervw 0:90de1cbc8a5f 145 Z = (*p_reg == 0);
davervw 0:90de1cbc8a5f 146 N = ((*p_reg & 0x80) != 0);
davervw 0:90de1cbc8a5f 147 }
davervw 0:90de1cbc8a5f 148
davervw 0:90de1cbc8a5f 149 static void SetA(int value)
davervw 0:90de1cbc8a5f 150 {
davervw 0:90de1cbc8a5f 151 SetReg(&A, value);
davervw 0:90de1cbc8a5f 152 }
davervw 0:90de1cbc8a5f 153
davervw 0:90de1cbc8a5f 154 static void SetX(int value)
davervw 0:90de1cbc8a5f 155 {
davervw 0:90de1cbc8a5f 156 SetReg(&X, value);
davervw 0:90de1cbc8a5f 157 }
davervw 0:90de1cbc8a5f 158
davervw 0:90de1cbc8a5f 159 static void SetY(int value)
davervw 0:90de1cbc8a5f 160 {
davervw 0:90de1cbc8a5f 161 SetReg(&Y, value);
davervw 0:90de1cbc8a5f 162 }
davervw 0:90de1cbc8a5f 163
davervw 0:90de1cbc8a5f 164 static void SBC(byte value)
davervw 0:90de1cbc8a5f 165 {
davervw 0:90de1cbc8a5f 166 if (D)
davervw 0:90de1cbc8a5f 167 {
davervw 0:90de1cbc8a5f 168 int A_dec = (A & 0xF) + ((A >> 4) * 10);
davervw 0:90de1cbc8a5f 169 int value_dec = (value & 0xF) + ((value >> 4) * 10);
davervw 0:90de1cbc8a5f 170 int result_dec = A_dec - value_dec - (C ? 0 : 1);
davervw 0:90de1cbc8a5f 171 C = (result_dec >= 0);
davervw 0:90de1cbc8a5f 172 if (!C)
davervw 0:90de1cbc8a5f 173 result_dec = -result_dec; // absolute value
davervw 0:90de1cbc8a5f 174 int result = (result_dec % 10) | (((result_dec / 10) % 10) << 4);
davervw 0:90de1cbc8a5f 175 SetA(result);
davervw 0:90de1cbc8a5f 176 N = false; // undefined?
davervw 0:90de1cbc8a5f 177 V = false; // undefined?
davervw 0:90de1cbc8a5f 178 }
davervw 0:90de1cbc8a5f 179 else
davervw 0:90de1cbc8a5f 180 {
davervw 0:90de1cbc8a5f 181 byte result = Subtract(A, value, &V);
davervw 0:90de1cbc8a5f 182 SetA(result);
davervw 0:90de1cbc8a5f 183 }
davervw 0:90de1cbc8a5f 184 }
davervw 0:90de1cbc8a5f 185
davervw 4:8476be802690 186 static void ADDC(byte value)
davervw 0:90de1cbc8a5f 187 {
davervw 0:90de1cbc8a5f 188 int result;
davervw 0:90de1cbc8a5f 189 if (D)
davervw 0:90de1cbc8a5f 190 {
davervw 0:90de1cbc8a5f 191 int A_dec = (A & 0xF) + ((A >> 4) * 10);
davervw 0:90de1cbc8a5f 192 int value_dec = (value & 0xF) + ((value >> 4) * 10);
davervw 0:90de1cbc8a5f 193 int result_dec = A_dec + value_dec + (C ? 1 : 0);
davervw 0:90de1cbc8a5f 194 C = (result_dec > 99);
davervw 0:90de1cbc8a5f 195 result = (result_dec % 10) | (((result_dec / 10) % 10) << 4);
davervw 0:90de1cbc8a5f 196 SetA(result);
davervw 0:90de1cbc8a5f 197 Z = (result_dec == 0); // BCD quirk -- 100 doesn't set Z
davervw 0:90de1cbc8a5f 198 V = false;
davervw 0:90de1cbc8a5f 199 }
davervw 0:90de1cbc8a5f 200 else
davervw 0:90de1cbc8a5f 201 {
davervw 0:90de1cbc8a5f 202 bool A_old_neg = (A & 0x80) != 0;
davervw 0:90de1cbc8a5f 203 bool value_neg = (value & 0x80) != 0;
davervw 0:90de1cbc8a5f 204 result = A + value + (C ? 1 : 0);
davervw 0:90de1cbc8a5f 205 C = (result & 0x100) != 0;
davervw 0:90de1cbc8a5f 206 SetA(result);
davervw 0:90de1cbc8a5f 207 bool result_neg = (result & 0x80) != 0;
davervw 0:90de1cbc8a5f 208 V = (!A_old_neg && !value_neg && result_neg) // pos + pos = neg: overflow
davervw 0:90de1cbc8a5f 209 || (A_old_neg && value_neg && !result_neg); // neg + neg = pos: overflow
davervw 0:90de1cbc8a5f 210 }
davervw 0:90de1cbc8a5f 211 }
davervw 0:90de1cbc8a5f 212
davervw 0:90de1cbc8a5f 213 static void ORA(int value)
davervw 0:90de1cbc8a5f 214 {
davervw 0:90de1cbc8a5f 215 SetA(A | value);
davervw 0:90de1cbc8a5f 216 }
davervw 0:90de1cbc8a5f 217
davervw 0:90de1cbc8a5f 218 static void EOR(int value)
davervw 0:90de1cbc8a5f 219 {
davervw 0:90de1cbc8a5f 220 SetA(A ^ value);
davervw 0:90de1cbc8a5f 221 }
davervw 0:90de1cbc8a5f 222
davervw 0:90de1cbc8a5f 223 static void AND(int value)
davervw 0:90de1cbc8a5f 224 {
davervw 0:90de1cbc8a5f 225 SetA(A & value);
davervw 0:90de1cbc8a5f 226 }
davervw 0:90de1cbc8a5f 227
davervw 0:90de1cbc8a5f 228 static void BIT(byte value)
davervw 0:90de1cbc8a5f 229 {
davervw 0:90de1cbc8a5f 230 Z = (A & value) == 0;
davervw 0:90de1cbc8a5f 231 N = (value & 0x80) != 0;
davervw 0:90de1cbc8a5f 232 V = (value & 0x40) != 0;
davervw 0:90de1cbc8a5f 233 }
davervw 0:90de1cbc8a5f 234
davervw 0:90de1cbc8a5f 235 static byte ASL(int value)
davervw 0:90de1cbc8a5f 236 {
davervw 0:90de1cbc8a5f 237 C = (value & 0x80) != 0;
davervw 0:90de1cbc8a5f 238 value = (byte)(value << 1);
davervw 0:90de1cbc8a5f 239 Z = (value == 0);
davervw 0:90de1cbc8a5f 240 N = (value & 0x80) != 0;
davervw 0:90de1cbc8a5f 241 return (byte)value;
davervw 0:90de1cbc8a5f 242 }
davervw 0:90de1cbc8a5f 243
davervw 0:90de1cbc8a5f 244 static byte LSR(int value)
davervw 0:90de1cbc8a5f 245 {
davervw 0:90de1cbc8a5f 246 C = (value & 0x01) != 0;
davervw 0:90de1cbc8a5f 247 value = (byte)(value >> 1);
davervw 0:90de1cbc8a5f 248 Z = (value == 0);
davervw 0:90de1cbc8a5f 249 N = false;
davervw 0:90de1cbc8a5f 250 return (byte)value;
davervw 0:90de1cbc8a5f 251 }
davervw 0:90de1cbc8a5f 252
davervw 0:90de1cbc8a5f 253 static byte ROL(int value)
davervw 0:90de1cbc8a5f 254 {
davervw 0:90de1cbc8a5f 255 bool newC = (value & 0x80) != 0;
davervw 0:90de1cbc8a5f 256 value = (byte)((value << 1) | (C ? 1 : 0));
davervw 0:90de1cbc8a5f 257 C = newC;
davervw 0:90de1cbc8a5f 258 Z = (value == 0);
davervw 0:90de1cbc8a5f 259 N = (value & 0x80) != 0;
davervw 0:90de1cbc8a5f 260 return (byte)value;
davervw 0:90de1cbc8a5f 261 }
davervw 0:90de1cbc8a5f 262
davervw 0:90de1cbc8a5f 263 static byte ROR(int value)
davervw 0:90de1cbc8a5f 264 {
davervw 0:90de1cbc8a5f 265 bool newC = (value & 0x01) != 0;
davervw 0:90de1cbc8a5f 266 N = C;
davervw 0:90de1cbc8a5f 267 value = (byte)((value >> 1) | (C ? 0x80 : 0));
davervw 0:90de1cbc8a5f 268 C = newC;
davervw 0:90de1cbc8a5f 269 Z = (value == 0);
davervw 0:90de1cbc8a5f 270 return (byte)value;
davervw 0:90de1cbc8a5f 271 }
davervw 0:90de1cbc8a5f 272
davervw 0:90de1cbc8a5f 273 extern void Push(int value)
davervw 0:90de1cbc8a5f 274 {
davervw 0:90de1cbc8a5f 275 SetMemory((ushort)(0x100 + (S--)), (byte)value);
davervw 0:90de1cbc8a5f 276 }
davervw 0:90de1cbc8a5f 277
davervw 0:90de1cbc8a5f 278 extern byte Pop(void)
davervw 0:90de1cbc8a5f 279 {
davervw 0:90de1cbc8a5f 280 return GetMemory((ushort)(0x100 + (++S)));
davervw 0:90de1cbc8a5f 281 }
davervw 0:90de1cbc8a5f 282
davervw 0:90de1cbc8a5f 283 static void PLP()
davervw 0:90de1cbc8a5f 284 {
davervw 0:90de1cbc8a5f 285 int flags = Pop();
davervw 0:90de1cbc8a5f 286 N = (flags & 0x80) != 0;
davervw 0:90de1cbc8a5f 287 V = (flags & 0x40) != 0;
davervw 0:90de1cbc8a5f 288 B = (flags & 0x10) != 0;
davervw 0:90de1cbc8a5f 289 D = (flags & 0x08) != 0;
davervw 0:90de1cbc8a5f 290 I = (flags & 0x04) != 0;
davervw 0:90de1cbc8a5f 291 Z = (flags & 0x02) != 0;
davervw 0:90de1cbc8a5f 292 C = (flags & 0x01) != 0;
davervw 0:90de1cbc8a5f 293 }
davervw 0:90de1cbc8a5f 294
davervw 0:90de1cbc8a5f 295 static void PHA()
davervw 0:90de1cbc8a5f 296 {
davervw 0:90de1cbc8a5f 297 Push(A);
davervw 0:90de1cbc8a5f 298 }
davervw 0:90de1cbc8a5f 299
davervw 0:90de1cbc8a5f 300 static void PLA()
davervw 0:90de1cbc8a5f 301 {
davervw 0:90de1cbc8a5f 302 SetA(Pop());
davervw 0:90de1cbc8a5f 303 }
davervw 0:90de1cbc8a5f 304
davervw 0:90de1cbc8a5f 305 static void CLC()
davervw 0:90de1cbc8a5f 306 {
davervw 0:90de1cbc8a5f 307 C = false;
davervw 0:90de1cbc8a5f 308 }
davervw 0:90de1cbc8a5f 309
davervw 0:90de1cbc8a5f 310 static void CLD()
davervw 0:90de1cbc8a5f 311 {
davervw 0:90de1cbc8a5f 312 D = false;
davervw 0:90de1cbc8a5f 313 }
davervw 0:90de1cbc8a5f 314
davervw 0:90de1cbc8a5f 315 static void CLI()
davervw 0:90de1cbc8a5f 316 {
davervw 0:90de1cbc8a5f 317 I = false;
davervw 0:90de1cbc8a5f 318 }
davervw 0:90de1cbc8a5f 319
davervw 0:90de1cbc8a5f 320 static void CLV()
davervw 0:90de1cbc8a5f 321 {
davervw 0:90de1cbc8a5f 322 V = false;
davervw 0:90de1cbc8a5f 323 }
davervw 0:90de1cbc8a5f 324
davervw 0:90de1cbc8a5f 325 static void SEC()
davervw 0:90de1cbc8a5f 326 {
davervw 0:90de1cbc8a5f 327 C = true;
davervw 0:90de1cbc8a5f 328 }
davervw 0:90de1cbc8a5f 329
davervw 0:90de1cbc8a5f 330 static void SED()
davervw 0:90de1cbc8a5f 331 {
davervw 0:90de1cbc8a5f 332 D = true;
davervw 0:90de1cbc8a5f 333 }
davervw 0:90de1cbc8a5f 334
davervw 0:90de1cbc8a5f 335 static void SEI()
davervw 0:90de1cbc8a5f 336 {
davervw 0:90de1cbc8a5f 337 I = true;
davervw 0:90de1cbc8a5f 338 }
davervw 0:90de1cbc8a5f 339
davervw 0:90de1cbc8a5f 340 static byte INC(byte value)
davervw 0:90de1cbc8a5f 341 {
davervw 0:90de1cbc8a5f 342 ++value;
davervw 0:90de1cbc8a5f 343 Z = (value == 0);
davervw 0:90de1cbc8a5f 344 N = (value & 0x80) != 0;
davervw 0:90de1cbc8a5f 345 return (byte)value;
davervw 0:90de1cbc8a5f 346 }
davervw 0:90de1cbc8a5f 347
davervw 0:90de1cbc8a5f 348 static void INX()
davervw 0:90de1cbc8a5f 349 {
davervw 0:90de1cbc8a5f 350 X = INC(X);
davervw 0:90de1cbc8a5f 351 }
davervw 0:90de1cbc8a5f 352
davervw 0:90de1cbc8a5f 353 static void INY()
davervw 0:90de1cbc8a5f 354 {
davervw 0:90de1cbc8a5f 355 Y = INC(Y);
davervw 0:90de1cbc8a5f 356 }
davervw 0:90de1cbc8a5f 357
davervw 0:90de1cbc8a5f 358 static byte DEC(byte value)
davervw 0:90de1cbc8a5f 359 {
davervw 0:90de1cbc8a5f 360 --value;
davervw 0:90de1cbc8a5f 361 Z = (value == 0);
davervw 0:90de1cbc8a5f 362 N = (value & 0x80) != 0;
davervw 0:90de1cbc8a5f 363 return (byte)value;
davervw 0:90de1cbc8a5f 364 }
davervw 0:90de1cbc8a5f 365
davervw 0:90de1cbc8a5f 366 static void DEX()
davervw 0:90de1cbc8a5f 367 {
davervw 0:90de1cbc8a5f 368 X = DEC(X);
davervw 0:90de1cbc8a5f 369 }
davervw 0:90de1cbc8a5f 370
davervw 0:90de1cbc8a5f 371 static void DEY()
davervw 0:90de1cbc8a5f 372 {
davervw 0:90de1cbc8a5f 373 Y = DEC(Y);
davervw 0:90de1cbc8a5f 374 }
davervw 0:90de1cbc8a5f 375
davervw 0:90de1cbc8a5f 376 static void NOP()
davervw 0:90de1cbc8a5f 377 {
davervw 0:90de1cbc8a5f 378 }
davervw 0:90de1cbc8a5f 379
davervw 0:90de1cbc8a5f 380 static void TXA()
davervw 0:90de1cbc8a5f 381 {
davervw 0:90de1cbc8a5f 382 SetReg(&A, X);
davervw 0:90de1cbc8a5f 383 }
davervw 0:90de1cbc8a5f 384
davervw 0:90de1cbc8a5f 385 static void TAX()
davervw 0:90de1cbc8a5f 386 {
davervw 0:90de1cbc8a5f 387 SetReg(&X, A);
davervw 0:90de1cbc8a5f 388 }
davervw 0:90de1cbc8a5f 389
davervw 0:90de1cbc8a5f 390 static void TYA()
davervw 0:90de1cbc8a5f 391 {
davervw 0:90de1cbc8a5f 392 SetReg(&A, Y);
davervw 0:90de1cbc8a5f 393 }
davervw 0:90de1cbc8a5f 394
davervw 0:90de1cbc8a5f 395 static void TAY()
davervw 0:90de1cbc8a5f 396 {
davervw 0:90de1cbc8a5f 397 SetReg(&Y, A);
davervw 0:90de1cbc8a5f 398 }
davervw 0:90de1cbc8a5f 399
davervw 0:90de1cbc8a5f 400 static void TXS()
davervw 0:90de1cbc8a5f 401 {
davervw 0:90de1cbc8a5f 402 S = X;
davervw 0:90de1cbc8a5f 403 }
davervw 0:90de1cbc8a5f 404
davervw 0:90de1cbc8a5f 405 static void TSX()
davervw 0:90de1cbc8a5f 406 {
davervw 0:90de1cbc8a5f 407 SetReg(&X, S);
davervw 0:90de1cbc8a5f 408 }
davervw 0:90de1cbc8a5f 409
davervw 0:90de1cbc8a5f 410 static ushort GetBR(ushort addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 411 {
davervw 0:90de1cbc8a5f 412 *p_conditional = true;
davervw 0:90de1cbc8a5f 413 *p_bytes = 2;
davervw 0:90de1cbc8a5f 414 sbyte offset = (sbyte)GetMemory((ushort)(addr + 1));
davervw 0:90de1cbc8a5f 415 ushort addr2 = (ushort)(addr + 2 + offset);
davervw 0:90de1cbc8a5f 416 return addr2;
davervw 0:90de1cbc8a5f 417 }
davervw 0:90de1cbc8a5f 418
davervw 0:90de1cbc8a5f 419 static void BR(bool branch, ushort *p_addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 420 {
davervw 0:90de1cbc8a5f 421 ushort addr2 = GetBR(*p_addr, p_conditional, p_bytes);
davervw 0:90de1cbc8a5f 422 if (branch)
davervw 0:90de1cbc8a5f 423 {
davervw 0:90de1cbc8a5f 424 *p_addr = addr2;
davervw 0:90de1cbc8a5f 425 *p_bytes = 0; // don't advance addr
davervw 0:90de1cbc8a5f 426 }
davervw 0:90de1cbc8a5f 427 }
davervw 0:90de1cbc8a5f 428
davervw 0:90de1cbc8a5f 429 static void BPL(ushort *p_addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 430 {
davervw 0:90de1cbc8a5f 431 BR(!N, p_addr, p_conditional, p_bytes);
davervw 0:90de1cbc8a5f 432 }
davervw 0:90de1cbc8a5f 433
davervw 0:90de1cbc8a5f 434 static void BMI(ushort *p_addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 435 {
davervw 0:90de1cbc8a5f 436 BR(N, p_addr, p_conditional, p_bytes);
davervw 0:90de1cbc8a5f 437 }
davervw 0:90de1cbc8a5f 438
davervw 0:90de1cbc8a5f 439 static void BCC(ushort *p_addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 440 {
davervw 0:90de1cbc8a5f 441 BR(!C, p_addr, p_conditional, p_bytes);
davervw 0:90de1cbc8a5f 442 }
davervw 0:90de1cbc8a5f 443
davervw 0:90de1cbc8a5f 444 static void BCS(ushort *p_addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 445 {
davervw 0:90de1cbc8a5f 446 BR(C, p_addr, p_conditional, p_bytes);
davervw 0:90de1cbc8a5f 447 }
davervw 0:90de1cbc8a5f 448
davervw 0:90de1cbc8a5f 449 static void BVC(ushort *p_addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 450 {
davervw 0:90de1cbc8a5f 451 BR(!V, p_addr, p_conditional, p_bytes);
davervw 0:90de1cbc8a5f 452 }
davervw 0:90de1cbc8a5f 453
davervw 0:90de1cbc8a5f 454 static void BVS(ushort *p_addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 455 {
davervw 0:90de1cbc8a5f 456 BR(V, p_addr, p_conditional, p_bytes);
davervw 0:90de1cbc8a5f 457 }
davervw 0:90de1cbc8a5f 458
davervw 0:90de1cbc8a5f 459 static void BNE(ushort *p_addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 460 {
davervw 0:90de1cbc8a5f 461 BR(!Z, p_addr, p_conditional, p_bytes);
davervw 0:90de1cbc8a5f 462 }
davervw 0:90de1cbc8a5f 463
davervw 0:90de1cbc8a5f 464 static void BEQ(ushort *p_addr, bool *p_conditional, byte *p_bytes)
davervw 0:90de1cbc8a5f 465 {
davervw 0:90de1cbc8a5f 466 BR(Z, p_addr, p_conditional, p_bytes);
davervw 0:90de1cbc8a5f 467 }
davervw 0:90de1cbc8a5f 468
davervw 0:90de1cbc8a5f 469 static void JSR(ushort *p_addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 470 {
davervw 0:90de1cbc8a5f 471 *p_bytes = 3; // for next calculation
davervw 0:90de1cbc8a5f 472 ushort addr2 = (ushort)(*p_addr + *p_bytes - 1);
davervw 0:90de1cbc8a5f 473 ushort addr3 = (ushort)(GetMemory((ushort)(*p_addr + 1)) | (GetMemory((ushort)(*p_addr + 2)) << 8));
davervw 0:90de1cbc8a5f 474 Push(HI(addr2));
davervw 0:90de1cbc8a5f 475 Push(LO(addr2));
davervw 0:90de1cbc8a5f 476 *p_addr = addr3;
davervw 0:90de1cbc8a5f 477 *p_bytes = 0; // addr already changed
davervw 0:90de1cbc8a5f 478 }
davervw 0:90de1cbc8a5f 479
davervw 0:90de1cbc8a5f 480 static void RTS(ushort *p_addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 481 {
davervw 0:90de1cbc8a5f 482 byte lo = Pop();
davervw 0:90de1cbc8a5f 483 byte hi = Pop();
davervw 0:90de1cbc8a5f 484 *p_bytes = 1; // make sure caller increases addr by one
davervw 0:90de1cbc8a5f 485 *p_addr = (ushort)((hi << 8) | lo);
davervw 0:90de1cbc8a5f 486 }
davervw 0:90de1cbc8a5f 487
davervw 0:90de1cbc8a5f 488 static void RTI(ushort *p_addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 489 {
davervw 0:90de1cbc8a5f 490 PLP();
davervw 4:8476be802690 491 byte lo = Pop();
davervw 0:90de1cbc8a5f 492 byte hi = Pop();
davervw 0:90de1cbc8a5f 493 *p_bytes = 0; // make sure caller does not increase addr by one
davervw 0:90de1cbc8a5f 494 *p_addr = (ushort)((hi << 8) | lo);
davervw 0:90de1cbc8a5f 495 }
davervw 0:90de1cbc8a5f 496
davervw 0:90de1cbc8a5f 497 static void JMP(ushort *p_addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 498 {
davervw 0:90de1cbc8a5f 499 *p_bytes = 0; // caller should not advance address
davervw 0:90de1cbc8a5f 500 ushort addr2 = (ushort)(GetMemory((ushort)(*p_addr + 1)) | (GetMemory((ushort)(*p_addr + 2)) << 8));
davervw 0:90de1cbc8a5f 501 *p_addr = addr2;
davervw 0:90de1cbc8a5f 502 }
davervw 0:90de1cbc8a5f 503
davervw 0:90de1cbc8a5f 504 static void JMPIND(ushort *p_addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 505 {
davervw 0:90de1cbc8a5f 506 *p_bytes = 0; // caller should not advance address
davervw 0:90de1cbc8a5f 507 ushort addr2 = (ushort)(GetMemory((ushort)(*p_addr + 1)) | (GetMemory((ushort)(*p_addr + 2)) << 8));
davervw 0:90de1cbc8a5f 508 ushort addr3;
davervw 0:90de1cbc8a5f 509 if ((addr2 & 0xFF) == 0xFF) // JMP($XXFF) won't go over page boundary
davervw 0:90de1cbc8a5f 510 addr3 = (ushort)(GetMemory(addr2) | (GetMemory((ushort)(addr2 - 0xFF)) << 8)); // 6502 "bug" - will use XXFF and XX00 as source of address
davervw 0:90de1cbc8a5f 511 else
davervw 0:90de1cbc8a5f 512 addr3 = (ushort)(GetMemory(addr2) | (GetMemory((ushort)(addr2 + 1)) << 8));
davervw 0:90de1cbc8a5f 513 *p_addr = addr3;
davervw 0:90de1cbc8a5f 514 }
davervw 0:90de1cbc8a5f 515
davervw 0:90de1cbc8a5f 516 // "A:FF X:FF Y:FF S:FF P:XX-XXXXX"
davervw 0:90de1cbc8a5f 517 static void GetDisplayState(char *state, int state_size)
davervw 0:90de1cbc8a5f 518 {
davervw 0:90de1cbc8a5f 519 snprintf(state, state_size, "A:%02X X:%02X Y:%02X S:%02X P:%c%c-%c%c%c%c%c",
davervw 0:90de1cbc8a5f 520 A,
davervw 0:90de1cbc8a5f 521 X,
davervw 0:90de1cbc8a5f 522 Y,
davervw 0:90de1cbc8a5f 523 S,
davervw 0:90de1cbc8a5f 524 N ? 'N' : ' ',
davervw 0:90de1cbc8a5f 525 V ? 'V' : ' ',
davervw 0:90de1cbc8a5f 526 B ? 'B' : ' ',
davervw 0:90de1cbc8a5f 527 D ? 'D' : ' ',
davervw 0:90de1cbc8a5f 528 I ? 'I' : ' ',
davervw 0:90de1cbc8a5f 529 Z ? 'Z' : ' ',
davervw 0:90de1cbc8a5f 530 C ? 'C' : ' '
davervw 0:90de1cbc8a5f 531 );
davervw 0:90de1cbc8a5f 532 }
davervw 0:90de1cbc8a5f 533
davervw 0:90de1cbc8a5f 534 static byte GetIndX(ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 535 {
davervw 0:90de1cbc8a5f 536 *p_bytes = 2;
davervw 0:90de1cbc8a5f 537 ushort addr2 = (ushort)(GetMemory((ushort)(addr + 1)) + X);
davervw 0:90de1cbc8a5f 538 return GetMemory((ushort)(GetMemory(addr2) | (GetMemory((ushort)(addr2 + 1)) << 8)));
davervw 0:90de1cbc8a5f 539 }
davervw 0:90de1cbc8a5f 540
davervw 0:90de1cbc8a5f 541 static void SetIndX(byte value, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 542 {
davervw 0:90de1cbc8a5f 543 *p_bytes = 2;
davervw 0:90de1cbc8a5f 544 ushort addr2 = (ushort)(GetMemory((ushort)(addr + 1)) + X);
davervw 0:90de1cbc8a5f 545 ushort addr3 = (ushort)(GetMemory(addr2) | (GetMemory((ushort)(addr2 + 1)) << 8));
davervw 0:90de1cbc8a5f 546 SetMemory(addr3, value);
davervw 0:90de1cbc8a5f 547 }
davervw 0:90de1cbc8a5f 548
davervw 0:90de1cbc8a5f 549 static byte GetIndY(ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 550 {
davervw 0:90de1cbc8a5f 551 *p_bytes = 2;
davervw 0:90de1cbc8a5f 552 ushort addr2 = (ushort)(GetMemory((ushort)(addr + 1)));
davervw 0:90de1cbc8a5f 553 ushort addr3 = (ushort)((GetMemory(addr2) | (GetMemory((ushort)(addr2 + 1)) << 8)) + Y);
davervw 0:90de1cbc8a5f 554 return GetMemory(addr3);
davervw 0:90de1cbc8a5f 555 }
davervw 0:90de1cbc8a5f 556
davervw 0:90de1cbc8a5f 557 static void SetIndY(byte value, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 558 {
davervw 0:90de1cbc8a5f 559 *p_bytes = 2;
davervw 0:90de1cbc8a5f 560 ushort addr2 = (ushort)(GetMemory((ushort)(addr + 1)));
davervw 0:90de1cbc8a5f 561 ushort addr3 = (ushort)((GetMemory(addr2) | (GetMemory((ushort)(addr2 + 1)) << 8)) + Y);
davervw 0:90de1cbc8a5f 562 SetMemory(addr3, value);
davervw 0:90de1cbc8a5f 563 }
davervw 0:90de1cbc8a5f 564
davervw 0:90de1cbc8a5f 565 static byte GetZP(ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 566 {
davervw 0:90de1cbc8a5f 567 *p_bytes = 2;
davervw 0:90de1cbc8a5f 568 ushort addr2 = GetMemory((ushort)(addr + 1));
davervw 0:90de1cbc8a5f 569 return GetMemory(addr2);
davervw 0:90de1cbc8a5f 570 }
davervw 0:90de1cbc8a5f 571
davervw 0:90de1cbc8a5f 572 static void SetZP(byte value, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 573 {
davervw 0:90de1cbc8a5f 574 *p_bytes = 2;
davervw 0:90de1cbc8a5f 575 ushort addr2 = GetMemory((ushort)(addr + 1));
davervw 0:90de1cbc8a5f 576 SetMemory(addr2, value);
davervw 0:90de1cbc8a5f 577 }
davervw 0:90de1cbc8a5f 578
davervw 0:90de1cbc8a5f 579 static byte GetZPX(ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 580 {
davervw 0:90de1cbc8a5f 581 *p_bytes = 2;
davervw 0:90de1cbc8a5f 582 ushort addr2 = GetMemory((ushort)(addr + 1));
davervw 0:90de1cbc8a5f 583 return GetMemory((byte)(addr2 + X));
davervw 0:90de1cbc8a5f 584 }
davervw 0:90de1cbc8a5f 585
davervw 0:90de1cbc8a5f 586 static void SetZPX(byte value, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 587 {
davervw 0:90de1cbc8a5f 588 *p_bytes = 2;
davervw 0:90de1cbc8a5f 589 ushort addr2 = GetMemory((ushort)(addr + 1));
davervw 0:90de1cbc8a5f 590 SetMemory((byte)(addr2 + X), value);
davervw 0:90de1cbc8a5f 591 }
davervw 0:90de1cbc8a5f 592
davervw 0:90de1cbc8a5f 593 static byte GetZPY(ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 594 {
davervw 0:90de1cbc8a5f 595 *p_bytes = 2;
davervw 0:90de1cbc8a5f 596 ushort addr2 = GetMemory((ushort)(addr + 1));
davervw 0:90de1cbc8a5f 597 return GetMemory((byte)(addr2 + Y));
davervw 0:90de1cbc8a5f 598 }
davervw 0:90de1cbc8a5f 599
davervw 0:90de1cbc8a5f 600 static void SetZPY(byte value, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 601 {
davervw 0:90de1cbc8a5f 602 *p_bytes = 2;
davervw 0:90de1cbc8a5f 603 ushort addr2 = GetMemory((ushort)(addr + 1));
davervw 0:90de1cbc8a5f 604 SetMemory((byte)(addr2 + Y), value);
davervw 0:90de1cbc8a5f 605 }
davervw 0:90de1cbc8a5f 606
davervw 0:90de1cbc8a5f 607 static byte GetABS(ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 608 {
davervw 0:90de1cbc8a5f 609 *p_bytes = 3;
davervw 0:90de1cbc8a5f 610 ushort addr2 = (ushort)(GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8));
davervw 0:90de1cbc8a5f 611 return GetMemory(addr2);
davervw 0:90de1cbc8a5f 612 }
davervw 0:90de1cbc8a5f 613
davervw 0:90de1cbc8a5f 614 static void SetABS(byte value, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 615 {
davervw 0:90de1cbc8a5f 616 *p_bytes = 3;
davervw 0:90de1cbc8a5f 617 ushort addr2 = (ushort)(GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8));
davervw 0:90de1cbc8a5f 618 SetMemory(addr2, value);
davervw 0:90de1cbc8a5f 619 }
davervw 0:90de1cbc8a5f 620
davervw 0:90de1cbc8a5f 621 static byte GetABSX(ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 622 {
davervw 0:90de1cbc8a5f 623 *p_bytes = 3;
davervw 0:90de1cbc8a5f 624 ushort addr2 = (ushort)(GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8));
davervw 0:90de1cbc8a5f 625 return GetMemory((ushort)(addr2 + X));
davervw 0:90de1cbc8a5f 626 }
davervw 0:90de1cbc8a5f 627
davervw 0:90de1cbc8a5f 628 static void SetABSX(byte value, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 629 {
davervw 0:90de1cbc8a5f 630 *p_bytes = 3;
davervw 0:90de1cbc8a5f 631 ushort addr2 = (ushort)((GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8)) + X);
davervw 0:90de1cbc8a5f 632 SetMemory(addr2, value);
davervw 0:90de1cbc8a5f 633 }
davervw 0:90de1cbc8a5f 634
davervw 0:90de1cbc8a5f 635 static byte GetABSY(ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 636 {
davervw 0:90de1cbc8a5f 637 *p_bytes = 3;
davervw 0:90de1cbc8a5f 638 ushort addr2 = (ushort)(GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8));
davervw 0:90de1cbc8a5f 639 return GetMemory((ushort)(addr2 + Y));
davervw 0:90de1cbc8a5f 640 }
davervw 0:90de1cbc8a5f 641
davervw 0:90de1cbc8a5f 642 static void SetABSY(byte value, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 643 {
davervw 0:90de1cbc8a5f 644 *p_bytes = 3;
davervw 0:90de1cbc8a5f 645 ushort addr2 = (ushort)((GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8)) + Y);
davervw 0:90de1cbc8a5f 646 SetMemory(addr2, value);
davervw 0:90de1cbc8a5f 647 }
davervw 0:90de1cbc8a5f 648
davervw 0:90de1cbc8a5f 649 static byte GetIM(ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 650 {
davervw 0:90de1cbc8a5f 651 *p_bytes = 2;
davervw 0:90de1cbc8a5f 652 return GetMemory((ushort)(addr + 1));
davervw 0:90de1cbc8a5f 653 }
davervw 0:90de1cbc8a5f 654
davervw 0:90de1cbc8a5f 655 extern void Execute(ushort addr, bool (*ExecutePatch)(void))
davervw 0:90de1cbc8a5f 656 {
davervw 0:90de1cbc8a5f 657 bool conditional;
davervw 0:90de1cbc8a5f 658 byte bytes;
davervw 0:90de1cbc8a5f 659
davervw 4:8476be802690 660 Timer timer;
davervw 4:8476be802690 661 const double interrupt_time = 1.0 / 60.0 ; // 60 times per second
davervw 4:8476be802690 662 timer.start();
davervw 4:8476be802690 663 double timer_then = timer.read();
davervw 4:8476be802690 664
davervw 0:90de1cbc8a5f 665 PC = addr;
davervw 0:90de1cbc8a5f 666
davervw 0:90de1cbc8a5f 667 while (true)
davervw 0:90de1cbc8a5f 668 {
davervw 0:90de1cbc8a5f 669 while (true)
davervw 0:90de1cbc8a5f 670 {
davervw 4:8476be802690 671 if (!I && (timer.read()-timer_then) >= interrupt_time) // IRQ
davervw 4:8476be802690 672 {
davervw 4:8476be802690 673 timer_then = timer.read(); // reset timer
davervw 4:8476be802690 674 Push(HI(PC));
davervw 4:8476be802690 675 Push(LO(PC));
davervw 4:8476be802690 676 PHP();
davervw 4:8476be802690 677 I = true;
davervw 4:8476be802690 678 PC = (GetMemory(0xfffe) | (GetMemory(0xffff) << 8));
davervw 4:8476be802690 679 }
davervw 4:8476be802690 680 else
davervw 0:90de1cbc8a5f 681 {
davervw 4:8476be802690 682 bytes = 1;
davervw 4:8476be802690 683 bool breakpoint = false;
davervw 4:8476be802690 684 //if (Breakpoints.Contains(PC))
davervw 4:8476be802690 685 // breakpoint = true;
davervw 4:8476be802690 686 if (trace || breakpoint || step)
davervw 4:8476be802690 687 {
davervw 4:8476be802690 688 ushort addr2;
davervw 4:8476be802690 689 char line[27];
davervw 4:8476be802690 690 char dis[13];
davervw 4:8476be802690 691 DisassembleLong(PC, &conditional, &bytes, &addr2, dis, sizeof(dis), line, sizeof(line));
davervw 4:8476be802690 692 char state[33];
davervw 4:8476be802690 693 GetDisplayState(state, sizeof(state));
davervw 4:8476be802690 694 char full_line[80];
davervw 4:8476be802690 695 snprintf(full_line, sizeof(full_line), "%-30s%s\n", line, state);
davervw 4:8476be802690 696 #ifdef WIN32
davervw 4:8476be802690 697 OutputDebugStringA(full_line);
davervw 4:8476be802690 698 #else
davervw 4:8476be802690 699 printf("%s", full_line);
davervw 4:8476be802690 700 #endif
davervw 4:8476be802690 701 if (step)
davervw 4:8476be802690 702 step = step; // user can put debug breakpoint here to allow stepping
davervw 4:8476be802690 703 if (breakpoint)
davervw 4:8476be802690 704 breakpoint = breakpoint; // user can put debug breakpoint here to allow break
davervw 4:8476be802690 705 }
davervw 4:8476be802690 706 if (ExecutePatch != 0 && !ExecutePatch()) // allow execute to be overriden at a specific address
davervw 4:8476be802690 707 break;
davervw 0:90de1cbc8a5f 708 }
davervw 0:90de1cbc8a5f 709 }
davervw 0:90de1cbc8a5f 710
davervw 0:90de1cbc8a5f 711 switch (GetMemory(PC))
davervw 0:90de1cbc8a5f 712 {
davervw 0:90de1cbc8a5f 713 case 0x00: BRK(&bytes); break;
davervw 0:90de1cbc8a5f 714 case 0x01: ORA(GetIndX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 715 case 0x05: ORA(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 716 case 0x06: SetZP(ASL(GetZP(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 717 case 0x08: PHP(); break;
davervw 0:90de1cbc8a5f 718 case 0x09: ORA(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 719 case 0x0A: SetA(ASL(A)); break;
davervw 0:90de1cbc8a5f 720 case 0x0D: ORA(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 721 case 0x0E: SetABS(ASL(GetABS(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 722
davervw 0:90de1cbc8a5f 723 case 0x10: BPL(&PC, &conditional, &bytes); break;
davervw 0:90de1cbc8a5f 724 case 0x11: ORA(GetIndY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 725 case 0x15: ORA(GetZPX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 726 case 0x16: SetZPX(ASL(GetZPX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 727 case 0x18: CLC(); break;
davervw 0:90de1cbc8a5f 728 case 0x19: ORA(GetABSY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 729 case 0x1D: ORA(GetABSX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 730 case 0x1E: SetABSX(ASL(GetABSX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 731
davervw 0:90de1cbc8a5f 732 case 0x20: JSR(&PC, &bytes); break;
davervw 0:90de1cbc8a5f 733 case 0x21: AND(GetIndX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 734 case 0x24: BIT(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 735 case 0x25: AND(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 736 case 0x26: SetZP(ROL(GetZP(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 737 case 0x28: PLP(); break;
davervw 0:90de1cbc8a5f 738 case 0x29: AND(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 739 case 0x2A: SetA(ROL(A)); break;
davervw 0:90de1cbc8a5f 740 case 0x2C: BIT(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 741 case 0x2D: AND(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 742 case 0x2E: ROL(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 743
davervw 0:90de1cbc8a5f 744 case 0x30: BMI(&PC, &conditional, &bytes); break;
davervw 0:90de1cbc8a5f 745 case 0x31: AND(GetIndY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 746 case 0x35: AND(GetZPX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 747 case 0x36: SetZPX(ROL(GetZPX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 748 case 0x38: SEC(); break;
davervw 0:90de1cbc8a5f 749 case 0x39: AND(GetABSY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 750 case 0x3D: AND(GetABSX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 751 case 0x3E: SetABSX(ROL(GetABSX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 752
davervw 0:90de1cbc8a5f 753 case 0x40: RTI(&PC, &bytes); break;
davervw 0:90de1cbc8a5f 754 case 0x41: EOR(GetIndX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 755 case 0x45: EOR(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 756 case 0x46: SetZP(LSR(GetZP(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 757 case 0x48: PHA(); break;
davervw 0:90de1cbc8a5f 758 case 0x49: EOR(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 759 case 0x4A: SetA(LSR(A)); break;
davervw 0:90de1cbc8a5f 760 case 0x4C: JMP(&PC, &bytes); break;
davervw 0:90de1cbc8a5f 761 case 0x4D: EOR(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 762 case 0x4E: LSR(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 763
davervw 0:90de1cbc8a5f 764 case 0x50: BVC(&PC, &conditional, &bytes); break;
davervw 0:90de1cbc8a5f 765 case 0x51: EOR(GetIndY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 766 case 0x55: EOR(GetZPX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 767 case 0x56: SetZPX(LSR(GetZPX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 768 case 0x58: CLI(); break;
davervw 0:90de1cbc8a5f 769 case 0x59: EOR(GetABSY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 770 case 0x5D: EOR(GetABSX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 771 case 0x5E: SetABSX(LSR(GetABSX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 772
davervw 0:90de1cbc8a5f 773 case 0x60: RTS(&PC, &bytes); break;
davervw 4:8476be802690 774 case 0x61: ADDC(GetIndX(PC, &bytes)); break;
davervw 4:8476be802690 775 case 0x65: ADDC(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 776 case 0x66: SetZP(ROR(GetZP(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 777 case 0x68: PLA(); break;
davervw 4:8476be802690 778 case 0x69: ADDC(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 779 case 0x6A: SetA(ROR(A)); break;
davervw 0:90de1cbc8a5f 780 case 0x6C: JMPIND(&PC, &bytes); break;
davervw 4:8476be802690 781 case 0x6D: ADDC(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 782 case 0x6E: SetABS(ROR(GetABS(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 783
davervw 0:90de1cbc8a5f 784 case 0x70: BVS(&PC, &conditional, &bytes); break;
davervw 4:8476be802690 785 case 0x71: ADDC(GetIndY(PC, &bytes)); break;
davervw 4:8476be802690 786 case 0x75: ADDC(GetZPX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 787 case 0x76: SetZPX(ROR(GetZPX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 788 case 0x78: SEI(); break;
davervw 4:8476be802690 789 case 0x79: ADDC(GetABSY(PC, &bytes)); break;
davervw 4:8476be802690 790 case 0x7D: ADDC(GetABSX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 791 case 0x7E: SetABSX(ROR(GetABSX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 792
davervw 0:90de1cbc8a5f 793 case 0x81: SetIndX(A, PC, &bytes); break;
davervw 0:90de1cbc8a5f 794 case 0x84: SetZP(Y, PC, &bytes); break;
davervw 0:90de1cbc8a5f 795 case 0x85: SetZP(A, PC, &bytes); break;
davervw 0:90de1cbc8a5f 796 case 0x86: SetZP(X, PC, &bytes); break;
davervw 0:90de1cbc8a5f 797 case 0x88: DEY(); break;
davervw 0:90de1cbc8a5f 798 case 0x8A: TXA(); break;
davervw 0:90de1cbc8a5f 799 case 0x8C: SetABS(Y, PC, &bytes); break;
davervw 0:90de1cbc8a5f 800 case 0x8D: SetABS(A, PC, &bytes); break;
davervw 0:90de1cbc8a5f 801 case 0x8E: SetABS(X, PC, &bytes); break;
davervw 0:90de1cbc8a5f 802
davervw 0:90de1cbc8a5f 803 case 0x90: BCC(&PC, &conditional, &bytes); break;
davervw 0:90de1cbc8a5f 804 case 0x91: SetIndY(A, PC, &bytes); break;
davervw 0:90de1cbc8a5f 805 case 0x94: SetZPX(Y, PC, &bytes); break;
davervw 0:90de1cbc8a5f 806 case 0x95: SetZPX(A, PC, &bytes); break;
davervw 0:90de1cbc8a5f 807 case 0x96: SetZPY(X, PC, &bytes); break;
davervw 0:90de1cbc8a5f 808 case 0x98: TYA(); break;
davervw 0:90de1cbc8a5f 809 case 0x99: SetABSY(A, PC, &bytes); break;
davervw 0:90de1cbc8a5f 810 case 0x9A: TXS(); break;
davervw 0:90de1cbc8a5f 811 case 0x9D: SetABSX(A, PC, &bytes); break;
davervw 0:90de1cbc8a5f 812
davervw 0:90de1cbc8a5f 813 case 0xA0: SetY(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 814 case 0xA1: SetA(GetIndX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 815 case 0xA2: SetX(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 816 case 0xA4: SetY(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 817 case 0xA5: SetA(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 818 case 0xA6: SetX(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 819 case 0xA8: TAY(); break;
davervw 0:90de1cbc8a5f 820 case 0xA9: SetA(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 821 case 0xAA: TAX(); break;
davervw 0:90de1cbc8a5f 822 case 0xAC: SetY(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 823 case 0xAD: SetA(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 824 case 0xAE: SetX(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 825
davervw 0:90de1cbc8a5f 826 case 0xB0: BCS(&PC, &conditional, &bytes); break;
davervw 0:90de1cbc8a5f 827 case 0xB1: SetA(GetIndY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 828 case 0xB4: SetY(GetZPX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 829 case 0xB5: SetA(GetZPX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 830 case 0xB6: SetX(GetZPY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 831 case 0xB8: CLV(); break;
davervw 0:90de1cbc8a5f 832 case 0xB9: SetA(GetABSY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 833 case 0xBA: TSX(); break;
davervw 0:90de1cbc8a5f 834 case 0xBC: SetY(GetABSX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 835 case 0xBD: SetA(GetABSX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 836 case 0xBE: SetX(GetABSY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 837
davervw 0:90de1cbc8a5f 838 case 0xC0: CPY(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 839 case 0xC1: CMP(GetIndX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 840 case 0xC4: CPY(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 841 case 0xC5: CMP(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 842 case 0xC6: SetZP(DEC(GetZP(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 843 case 0xC8: INY(); break;
davervw 0:90de1cbc8a5f 844 case 0xC9: CMP(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 845 case 0xCA: DEX(); break;
davervw 0:90de1cbc8a5f 846 case 0xCC: CPY(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 847 case 0xCD: CMP(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 848 case 0xCE: SetABS(DEC(GetABS(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 849
davervw 0:90de1cbc8a5f 850 case 0xD0: BNE(&PC, &conditional, &bytes); break;
davervw 0:90de1cbc8a5f 851 case 0xD1: CMP(GetIndY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 852 case 0xD5: CMP(GetZPX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 853 case 0xD6: SetZPX(DEC(GetZPX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 854 case 0xD8: CLD(); break;
davervw 0:90de1cbc8a5f 855 case 0xD9: CMP(GetABSY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 856 case 0xDD: CMP(GetABSX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 857 case 0xDE: SetABSX(DEC(GetABSX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 858
davervw 0:90de1cbc8a5f 859 case 0xE0: CPX(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 860 case 0xE1: SBC(GetIndX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 861 case 0xE4: CPX(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 862 case 0xE5: SBC(GetZP(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 863 case 0xE6: SetZP(INC(GetZP(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 864 case 0xE8: INX(); break;
davervw 0:90de1cbc8a5f 865 case 0xE9: SBC(GetIM(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 866 case 0xEA: NOP(); break;
davervw 0:90de1cbc8a5f 867 case 0xEC: CPX(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 868 case 0xED: SBC(GetABS(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 869 case 0xEE: SetABS(INC(GetABS(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 870
davervw 0:90de1cbc8a5f 871 case 0xF0: BEQ(&PC, &conditional, &bytes); break;
davervw 0:90de1cbc8a5f 872 case 0xF1: SBC(GetIndY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 873 case 0xF5: SBC(GetZPX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 874 case 0xF6: SetZPX(INC(GetZPX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 875 case 0xF8: SED(); break;
davervw 0:90de1cbc8a5f 876 case 0xF9: SBC(GetABSY(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 877 case 0xFD: SBC(GetABSX(PC, &bytes)); break;
davervw 0:90de1cbc8a5f 878 case 0xFE: SetABSX(INC(GetABSX(PC, &bytes)), PC, &bytes); break;
davervw 0:90de1cbc8a5f 879
davervw 0:90de1cbc8a5f 880 default:
davervw 0:90de1cbc8a5f 881 {
davervw 0:90de1cbc8a5f 882 printf("Invalid opcode %02X at %04X", GetMemory(PC), PC);
davervw 0:90de1cbc8a5f 883 exit(1);
davervw 0:90de1cbc8a5f 884 }
davervw 0:90de1cbc8a5f 885 }
davervw 0:90de1cbc8a5f 886
davervw 0:90de1cbc8a5f 887 PC += bytes;
davervw 0:90de1cbc8a5f 888 }
davervw 0:90de1cbc8a5f 889 }
davervw 0:90de1cbc8a5f 890
davervw 0:90de1cbc8a5f 891 // Examples:
davervw 0:90de1cbc8a5f 892 // FFFF FF FF FF JMP ($FFFF)
davervw 0:90de1cbc8a5f 893 // FFFF FF FF FF LDA $FFFF,X
davervw 0:90de1cbc8a5f 894 extern void DisassembleLong(ushort addr, bool *p_conditional, byte *p_bytes, ushort *p_addr2, char *dis, int dis_size, char *line, int line_size)
davervw 0:90de1cbc8a5f 895 {
davervw 0:90de1cbc8a5f 896 DisassembleShort(addr, p_conditional, p_bytes, p_addr2, dis, dis_size);
davervw 0:90de1cbc8a5f 897 snprintf(line, line_size, "%04X ", addr);
davervw 0:90de1cbc8a5f 898 for (int i = 0; i < 3; ++i)
davervw 0:90de1cbc8a5f 899 {
davervw 0:90de1cbc8a5f 900 if (i < *p_bytes)
davervw 0:90de1cbc8a5f 901 snprintf(line+strlen(line), line_size-strlen(line), "%02X ", GetMemory((ushort)(addr + i)));
davervw 0:90de1cbc8a5f 902 else
davervw 0:90de1cbc8a5f 903 strcat_s(line, line_size, " ");
davervw 0:90de1cbc8a5f 904 }
davervw 0:90de1cbc8a5f 905 strcat_s(line, line_size, dis);
davervw 0:90de1cbc8a5f 906 }
davervw 0:90de1cbc8a5f 907
davervw 0:90de1cbc8a5f 908 static void Ind(char *dis, int dis_size, char* opcode, ushort addr, ushort *p_addr2, byte *p_bytes)
davervw 0:90de1cbc8a5f 909 {
davervw 0:90de1cbc8a5f 910 *p_bytes = 3;
davervw 0:90de1cbc8a5f 911 ushort addr1 = (ushort)(GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8));
davervw 0:90de1cbc8a5f 912 *p_addr2 = (ushort)(GetMemory(addr1) | (GetMemory((ushort)(addr1 + 1)) << 8));
davervw 0:90de1cbc8a5f 913 snprintf(dis, dis_size, "%s ($%0X4)", opcode, addr1);
davervw 0:90de1cbc8a5f 914 }
davervw 0:90de1cbc8a5f 915
davervw 0:90de1cbc8a5f 916 static void IndX(char *dis, int dis_size, char* opcode, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 917 {
davervw 0:90de1cbc8a5f 918 *p_bytes = 2;
davervw 0:90de1cbc8a5f 919 snprintf(dis, dis_size, "%s ($%02X,X)", opcode, GetMemory((ushort)(addr + 1)));
davervw 0:90de1cbc8a5f 920 }
davervw 0:90de1cbc8a5f 921
davervw 0:90de1cbc8a5f 922 static void IndY(char *dis, int dis_size, char* opcode, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 923 {
davervw 0:90de1cbc8a5f 924 *p_bytes = 2;
davervw 0:90de1cbc8a5f 925 snprintf(dis, dis_size, "%s ($%02X),Y", opcode, GetMemory((ushort)(addr + 1)));
davervw 0:90de1cbc8a5f 926 }
davervw 0:90de1cbc8a5f 927
davervw 0:90de1cbc8a5f 928 static void ZP(char *dis, int dis_size, char* opcode, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 929 {
davervw 0:90de1cbc8a5f 930 *p_bytes = 2;
davervw 0:90de1cbc8a5f 931 snprintf(dis, dis_size, "%s $%02X", opcode, GetMemory((ushort)(addr + 1)));
davervw 0:90de1cbc8a5f 932 }
davervw 0:90de1cbc8a5f 933
davervw 0:90de1cbc8a5f 934 static void ZPX(char *dis, int dis_size, char* opcode, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 935 {
davervw 0:90de1cbc8a5f 936 *p_bytes = 2;
davervw 0:90de1cbc8a5f 937 snprintf(dis, dis_size, "%s $%02X,X", opcode, GetMemory((ushort)(addr + 1)));
davervw 0:90de1cbc8a5f 938 }
davervw 0:90de1cbc8a5f 939
davervw 0:90de1cbc8a5f 940 static void ZPY(char *dis, int dis_size, char* opcode, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 941 {
davervw 0:90de1cbc8a5f 942 *p_bytes = 2;
davervw 0:90de1cbc8a5f 943 snprintf(dis, dis_size, "%s $%02X,Y", opcode, GetMemory((ushort)(addr + 1)));
davervw 0:90de1cbc8a5f 944 }
davervw 0:90de1cbc8a5f 945
davervw 0:90de1cbc8a5f 946 static void ABS(char *dis, int dis_size, char* opcode, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 947 {
davervw 0:90de1cbc8a5f 948 *p_bytes = 3;
davervw 0:90de1cbc8a5f 949 snprintf(dis, dis_size, "%s $%04X", opcode, GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8));
davervw 0:90de1cbc8a5f 950 }
davervw 0:90de1cbc8a5f 951
davervw 0:90de1cbc8a5f 952 static void ABSAddr(char *dis, int dis_size, char* opcode, ushort addr, ushort *p_addr2, byte *p_bytes)
davervw 0:90de1cbc8a5f 953 {
davervw 0:90de1cbc8a5f 954 *p_bytes = 3;
davervw 0:90de1cbc8a5f 955 *p_addr2 = (ushort)(GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8));
davervw 0:90de1cbc8a5f 956 snprintf(dis, dis_size, "%s $%04X", opcode, *p_addr2);
davervw 0:90de1cbc8a5f 957 }
davervw 0:90de1cbc8a5f 958
davervw 0:90de1cbc8a5f 959 static void ABSX(char *dis, int dis_size, char* opcode, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 960 {
davervw 0:90de1cbc8a5f 961 *p_bytes = 3;
davervw 0:90de1cbc8a5f 962 snprintf(dis, dis_size, "%s $%04X,X", opcode, GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8));
davervw 0:90de1cbc8a5f 963 }
davervw 0:90de1cbc8a5f 964
davervw 0:90de1cbc8a5f 965 static void ABSY(char *dis, int dis_size, char* opcode, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 966 {
davervw 0:90de1cbc8a5f 967 *p_bytes = 3;
davervw 0:90de1cbc8a5f 968 snprintf(dis, dis_size, "%s $%04X,Y", opcode, GetMemory((ushort)(addr + 1)) | (GetMemory((ushort)(addr + 2)) << 8));
davervw 0:90de1cbc8a5f 969 }
davervw 0:90de1cbc8a5f 970
davervw 0:90de1cbc8a5f 971 static void IM(char *dis, int dis_size, char* opcode, ushort addr, byte *p_bytes)
davervw 0:90de1cbc8a5f 972 {
davervw 0:90de1cbc8a5f 973 *p_bytes = 2;
davervw 0:90de1cbc8a5f 974 snprintf(dis, dis_size, "%s #$%02X", opcode, GetMemory((ushort)(addr + 1)));
davervw 0:90de1cbc8a5f 975 }
davervw 0:90de1cbc8a5f 976
davervw 0:90de1cbc8a5f 977 static void BRX(char *dis, int dis_size, char* opcode, ushort addr, bool *p_conditional, ushort *p_addr2, byte *p_bytes)
davervw 0:90de1cbc8a5f 978 {
davervw 0:90de1cbc8a5f 979 *p_bytes = 2;
davervw 0:90de1cbc8a5f 980 *p_conditional = true;
davervw 0:90de1cbc8a5f 981 sbyte offset = (sbyte)GetMemory((ushort)(addr + 1));
davervw 0:90de1cbc8a5f 982 *p_addr2 = (ushort)(addr + 2 + offset);
davervw 0:90de1cbc8a5f 983 snprintf(dis, dis_size, "%s $%04X", opcode, *p_addr2);
davervw 0:90de1cbc8a5f 984 }
davervw 0:90de1cbc8a5f 985
davervw 0:90de1cbc8a5f 986 // JMP ($FFFF)
davervw 0:90de1cbc8a5f 987 // LDA $FFFF,X
davervw 0:90de1cbc8a5f 988 extern void DisassembleShort(ushort addr, bool *p_conditional, byte *p_bytes, ushort *p_addr2, char *dis, int dis_size)
davervw 0:90de1cbc8a5f 989 {
davervw 0:90de1cbc8a5f 990 *p_conditional = false;
davervw 0:90de1cbc8a5f 991 *p_addr2 = 0;
davervw 0:90de1cbc8a5f 992 *p_bytes = 1;
davervw 0:90de1cbc8a5f 993
davervw 0:90de1cbc8a5f 994 switch (GetMemory(addr))
davervw 0:90de1cbc8a5f 995 {
davervw 0:90de1cbc8a5f 996 case 0x00: strcpy_s(dis, dis_size, "BRK"); return;
davervw 0:90de1cbc8a5f 997 case 0x01: IndX(dis, dis_size, "ORA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 998 case 0x05: ZP(dis, dis_size, "ORA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 999 case 0x06: ZP(dis, dis_size, "ASL", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1000 case 0x08: strcpy_s(dis, dis_size, "PHP"); return;
davervw 0:90de1cbc8a5f 1001 case 0x09: IM(dis, dis_size, "ORA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1002 case 0x0A: strcpy_s(dis, dis_size, "ASL A"); return;
davervw 0:90de1cbc8a5f 1003 case 0x0D: ABS(dis, dis_size, "ORA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1004 case 0x0E: ABS(dis, dis_size, "ASL", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1005
davervw 0:90de1cbc8a5f 1006 case 0x10: BRX(dis, dis_size, "BPL", addr, p_conditional, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1007 case 0x11: IndY(dis, dis_size, "ORA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1008 case 0x15: ZPX(dis, dis_size, "ORA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1009 case 0x16: ZPX(dis, dis_size, "ASL", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1010 case 0x18: strcpy_s(dis, dis_size, "CLC"); return;
davervw 0:90de1cbc8a5f 1011 case 0x19: ABSY(dis, dis_size, "ORA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1012 case 0x1D: ABSX(dis, dis_size, "ORA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1013 case 0x1E: ABSX(dis, dis_size, "ASL", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1014
davervw 0:90de1cbc8a5f 1015 case 0x20: ABSAddr(dis, dis_size, "JSR", addr, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1016 case 0x21: IndX(dis, dis_size, "AND", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1017 case 0x24: ZP(dis, dis_size, "BIT", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1018 case 0x25: ZP(dis, dis_size, "AND", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1019 case 0x26: ZP(dis, dis_size, "ROL", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1020 case 0x28: strcpy_s(dis, dis_size, "PLP"); return;
davervw 0:90de1cbc8a5f 1021 case 0x29: IM(dis, dis_size, "AND", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1022 case 0x2A: strcpy_s(dis, dis_size, "ROL A"); return;
davervw 0:90de1cbc8a5f 1023 case 0x2C: ABS(dis, dis_size, "BIT", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1024 case 0x2D: ABS(dis, dis_size, "AND", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1025 case 0x2E: ABS(dis, dis_size, "ROL", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1026
davervw 0:90de1cbc8a5f 1027 case 0x30: BRX(dis, dis_size, "BMI", addr, p_conditional, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1028 case 0x31: IndY(dis, dis_size, "AND", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1029 case 0x35: ZPX(dis, dis_size, "AND", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1030 case 0x36: ZPX(dis, dis_size, "ROL", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1031 case 0x38: strcpy_s(dis, dis_size, "SEC"); return;
davervw 0:90de1cbc8a5f 1032 case 0x39: ABSY(dis, dis_size, "AND", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1033 case 0x3D: ABSX(dis, dis_size, "AND", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1034 case 0x3E: ABSX(dis, dis_size, "ROL", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1035
davervw 0:90de1cbc8a5f 1036 case 0x40: strcpy_s(dis, dis_size, "RTI"); return;
davervw 0:90de1cbc8a5f 1037 case 0x41: IndX(dis, dis_size, "EOR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1038 case 0x45: ZP(dis, dis_size, "EOR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1039 case 0x46: ZP(dis, dis_size, "LSR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1040 case 0x48: strcpy_s(dis, dis_size, "PHA"); return;
davervw 0:90de1cbc8a5f 1041 case 0x49: IM(dis, dis_size, "EOR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1042 case 0x4A: strcpy_s(dis, dis_size, "LSR A"); return;
davervw 0:90de1cbc8a5f 1043 case 0x4C: ABSAddr(dis, dis_size, "JMP", addr, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1044 case 0x4D: ABS(dis, dis_size, "EOR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1045 case 0x4E: ABS(dis, dis_size, "LSR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1046
davervw 0:90de1cbc8a5f 1047 case 0x50: BRX(dis, dis_size, "BVC", addr, p_conditional, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1048 case 0x51: IndY(dis, dis_size, "EOR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1049 case 0x55: ZPX(dis, dis_size, "EOR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1050 case 0x56: ZPX(dis, dis_size, "LSR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1051 case 0x58: strcpy_s(dis, dis_size, "CLI"); return;
davervw 0:90de1cbc8a5f 1052 case 0x59: ABSY(dis, dis_size, "EOR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1053 case 0x5D: ABSX(dis, dis_size, "EOR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1054 case 0x5E: ABSX(dis, dis_size, "LSR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1055
davervw 0:90de1cbc8a5f 1056 case 0x60: strcpy_s(dis, dis_size, "RTS"); return;
davervw 0:90de1cbc8a5f 1057 case 0x61: IndX(dis, dis_size, "ADC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1058 case 0x65: ZP(dis, dis_size, "ADC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1059 case 0x66: ZP(dis, dis_size, "ROR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1060 case 0x68: strcpy_s(dis, dis_size, "PLA"); return;
davervw 0:90de1cbc8a5f 1061 case 0x69: IM(dis, dis_size, "ADC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1062 case 0x6A: strcpy_s(dis, dis_size, "ROR A"); return;
davervw 0:90de1cbc8a5f 1063 case 0x6C: Ind(dis, dis_size, "JMP", addr, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1064 case 0x6D: ABS(dis, dis_size, "ADC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1065 case 0x6E: ABS(dis, dis_size, "ROR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1066
davervw 0:90de1cbc8a5f 1067 case 0x70: BRX(dis, dis_size, "BVS", addr, p_conditional, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1068 case 0x71: IndY(dis, dis_size, "ADC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1069 case 0x75: ZPX(dis, dis_size, "ADC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1070 case 0x76: ZPX(dis, dis_size, "ROR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1071 case 0x78: strcpy_s(dis, dis_size, "SEI"); return;
davervw 0:90de1cbc8a5f 1072 case 0x79: ABSY(dis, dis_size, "ADC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1073 case 0x7D: ABSX(dis, dis_size, "ADC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1074 case 0x7E: ABSX(dis, dis_size, "ROR", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1075
davervw 0:90de1cbc8a5f 1076 case 0x81: IndX(dis, dis_size, "STA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1077 case 0x84: ZP(dis, dis_size, "STY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1078 case 0x85: ZP(dis, dis_size, "STA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1079 case 0x86: ZP(dis, dis_size, "STX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1080 case 0x88: strcpy_s(dis, dis_size, "DEY"); return;
davervw 0:90de1cbc8a5f 1081 case 0x8A: strcpy_s(dis, dis_size, "TXA"); return;
davervw 0:90de1cbc8a5f 1082 case 0x8C: ABS(dis, dis_size, "STY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1083 case 0x8D: ABS(dis, dis_size, "STA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1084 case 0x8E: ABS(dis, dis_size, "STX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1085
davervw 0:90de1cbc8a5f 1086 case 0x90: BRX(dis, dis_size, "BCC", addr, p_conditional, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1087 case 0x91: IndY(dis, dis_size, "STA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1088 case 0x94: ZPX(dis, dis_size, "STY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1089 case 0x95: ZPX(dis, dis_size, "STA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1090 case 0x96: ZPY(dis, dis_size, "STX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1091 case 0x98: strcpy_s(dis, dis_size, "TYA"); return;
davervw 0:90de1cbc8a5f 1092 case 0x99: ABSY(dis, dis_size, "STA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1093 case 0x9A: strcpy_s(dis, dis_size, "TXS"); return;
davervw 0:90de1cbc8a5f 1094 case 0x9D: ABSX(dis, dis_size, "STA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1095
davervw 0:90de1cbc8a5f 1096 case 0xA0: IM(dis, dis_size, "LDY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1097 case 0xA1: IndX(dis, dis_size, "LDA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1098 case 0xA2: IM(dis, dis_size, "LDX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1099 case 0xA4: ZP(dis, dis_size, "LDY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1100 case 0xA5: ZP(dis, dis_size, "LDA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1101 case 0xA6: ZP(dis, dis_size, "LDX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1102 case 0xA8: strcpy_s(dis, dis_size, "TAY"); return;
davervw 0:90de1cbc8a5f 1103 case 0xA9: IM(dis, dis_size, "LDA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1104 case 0xAA: strcpy_s(dis, dis_size, "TAX"); return;
davervw 0:90de1cbc8a5f 1105 case 0xAC: ABS(dis, dis_size, "LDY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1106 case 0xAD: ABS(dis, dis_size, "LDA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1107 case 0xAE: ABS(dis, dis_size, "LDX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1108
davervw 0:90de1cbc8a5f 1109 case 0xB0: BRX(dis, dis_size, "BCS", addr, p_conditional, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1110 case 0xB1: IndY(dis, dis_size, "LDA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1111 case 0xB4: ZPX(dis, dis_size, "LDY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1112 case 0xB5: ZPX(dis, dis_size, "LDA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1113 case 0xB6: ZPY(dis, dis_size, "LDX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1114 case 0xB8: strcpy_s(dis, dis_size, "CLV"); return;
davervw 0:90de1cbc8a5f 1115 case 0xB9: ABSY(dis, dis_size, "LDA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1116 case 0xBA: strcpy_s(dis, dis_size, "TSX"); return;
davervw 0:90de1cbc8a5f 1117 case 0xBC: ABSX(dis, dis_size, "LDY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1118 case 0xBD: ABSX(dis, dis_size, "LDA", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1119 case 0xBE: ABSY(dis, dis_size, "LDX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1120
davervw 0:90de1cbc8a5f 1121 case 0xC0: IM(dis, dis_size, "CPY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1122 case 0xC1: IndX(dis, dis_size, "CMP", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1123 case 0xC4: ZP(dis, dis_size, "CPY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1124 case 0xC5: ZP(dis, dis_size, "CMP", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1125 case 0xC6: ZP(dis, dis_size, "DEC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1126 case 0xC8: strcpy_s(dis, dis_size, "INY"); return;
davervw 0:90de1cbc8a5f 1127 case 0xC9: IM(dis, dis_size, "CMP", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1128 case 0xCA: strcpy_s(dis, dis_size, "DEX"); return;
davervw 0:90de1cbc8a5f 1129 case 0xCC: ABS(dis, dis_size, "CPY", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1130 case 0xCD: ABS(dis, dis_size, "CMP", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1131 case 0xCE: ABS(dis, dis_size, "DEC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1132
davervw 0:90de1cbc8a5f 1133 case 0xD0: BRX(dis, dis_size, "BNE", addr, p_conditional, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1134 case 0xD1: IndY(dis, dis_size, "CMP", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1135 case 0xD5: ZPX(dis, dis_size, "CMP", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1136 case 0xD6: ZPX(dis, dis_size, "DEC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1137 case 0xD8: strcpy_s(dis, dis_size, "CLD"); return;
davervw 0:90de1cbc8a5f 1138 case 0xD9: ABSY(dis, dis_size, "CMP", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1139 case 0xDD: ABSX(dis, dis_size, "CMP", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1140 case 0xDE: ABSX(dis, dis_size, "DEC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1141
davervw 0:90de1cbc8a5f 1142 case 0xE0: IM(dis, dis_size, "CPX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1143 case 0xE1: IndX(dis, dis_size, "SBC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1144 case 0xE4: ZP(dis, dis_size, "CPX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1145 case 0xE5: ZP(dis, dis_size, "SBC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1146 case 0xE6: ZP(dis, dis_size, "INC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1147 case 0xE8: strcpy_s(dis, dis_size, "INX"); return;
davervw 0:90de1cbc8a5f 1148 case 0xE9: IM(dis, dis_size, "SBC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1149 case 0xEA: strcpy_s(dis, dis_size, "NOP"); return;
davervw 0:90de1cbc8a5f 1150 case 0xEC: ABS(dis, dis_size, "CPX", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1151 case 0xED: ABS(dis, dis_size, "SBC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1152 case 0xEE: ABS(dis, dis_size, "INC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1153
davervw 0:90de1cbc8a5f 1154 case 0xF0: BRX(dis, dis_size, "BEQ", addr, p_conditional, p_addr2, p_bytes); return;
davervw 0:90de1cbc8a5f 1155 case 0xF1: IndY(dis, dis_size, "SBC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1156 case 0xF5: ZPX(dis, dis_size, "SBC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1157 case 0xF6: ZPX(dis, dis_size, "INC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1158 case 0xF8: strcpy_s(dis, dis_size, "SED"); return;
davervw 0:90de1cbc8a5f 1159 case 0xF9: ABSY(dis, dis_size, "SBC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1160 case 0xFD: ABSX(dis, dis_size, "SBC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1161 case 0xFE: ABSX(dis, dis_size, "INC", addr, p_bytes); return;
davervw 0:90de1cbc8a5f 1162
davervw 0:90de1cbc8a5f 1163 default:
davervw 0:90de1cbc8a5f 1164 strcpy_s(dis, dis_size, "???");
davervw 0:90de1cbc8a5f 1165 return;
davervw 0:90de1cbc8a5f 1166 //throw new Exception(string.Format("Invalid opcode {0:X2}", memory[addr]));
davervw 0:90de1cbc8a5f 1167 }
davervw 0:90de1cbc8a5f 1168 }