-//
-// Virtual 6809 v1.2P (Last build: 2/2/2004)
-//
-// by James L. Hammons
-//
-// (c) 1997 Underground Software
-//
-
-#include <string> // To make this really clean, we'd have to make our own memcpy, etc...
-#include "v6809.h"
-
-// Global defs (needed because functions can only return one value.
-// Maybe you could use a struct to pass multiple values, but
-// what a pain in the ass! This way makes a little more sense
-// to me.)
-
-//BYTE * ram, * rom; // RAM & ROM image spaces (64K each)
-WORD pcr, xr, yr, sr, ur; // Double byte registers
-BYTE ccr, ar, br, dpr;
-long iclock;
-bool /*color_reg = false,*/ illegal = false, inter;
-
-// Instead of the above, we can use a private struct for our CPU state...
-
-static V6809REGS regs;
-
-static WORD addr; // Temporary variables common to all funcs...
-static BYTE tmp;
-
-extern BYTE Fetch(); // You need to define these functions
-//extern WORD FetchW(); // externally because every hardware situation
-extern BYTE RdMem(WORD); // is going to be different...
-extern void WrMem(WORD, BYTE);
-
-// Internal function prototypes
-
-WORD ReadEXG(BYTE); // Read TFR/EXG post byte
-void WriteEXG(BYTE, WORD); // Set TFR/EXG data
-WORD DecodeReg(BYTE); // Decode register data
-WORD DecodeIDX(BYTE); // Decode IDX data
-
-//
-// Fetch word function
-//
-WORD FetchW(void)
-{
- return (WORD)(Fetch() << 8) | Fetch();
-}
-
-//
-// Return signed byte from unsigned
-//
-int SignedB(BYTE b)
-{
- return (b & 0x80 ? b - 256 : b);
-}
-
-//
-// Return signed word from unsigned
-//
-int SignedW(WORD w)
-{
- return (w & 0x8000 ? w - 65536 : w);
-}
-
-//
-// Function to read TFR/EXG post byte
-//
-WORD ReadEXG(BYTE code)
-{
- WORD retval;
-
- switch(code)
- {
- case 0: retval = (ar<<8) | br; break;
- case 1: retval = xr; break;
- case 2: retval = yr; break;
- case 3: retval = ur; break;
- case 4: retval = sr; break;
- case 5: retval = pcr; break;
- case 8: retval = ar; break;
- case 9: retval = br; break;
- case 10: retval = ccr; break;
- case 11: retval = dpr; break;
- default: retval = 0xFF;
- }
- return(retval);
-}
-
-//
-// Function to set TFR/EXG data
-//
-void WriteEXG(BYTE code, WORD data)
-{
- switch(code)
- {
- case 0:
- ar = data >> 8, br = data & 0xFF; break;
- case 1:
- xr = data; break;
- case 2:
- yr = data; break;
- case 3:
- ur = data; break;
- case 4:
- sr = data; break;
- case 5:
- pcr = data; break;
- case 8:
- ar = data & 0xFF; break;
- case 9:
- br = data & 0xFF; break;
- case 10:
- ccr = data & 0xFF; break;
- case 11:
- dpr = data & 0xFF; break;
- }
-}
-
-//
-// Function to decode register data
-//
-WORD DecodeReg(BYTE reg)
-{
- WORD retval;
-
- switch (reg)
- {
- case 0:
- retval = xr; break;
- case 1:
- retval = yr; break;
- case 2:
- retval = ur; break;
- case 3:
- retval = sr; break;
- }
-
- return retval;
-}
-
-//
-// Function to decode IDX data
-//
-WORD DecodeIDX(BYTE code)
-{
- WORD addr, woff;
- BYTE reg = (code&0x60)>>5, idxind = (code&0x10)>>4, lo_nyb = code&0x0F;
-
- if (!(code&0x80)) // Hi bit unset? Then decode 4 bit offset
- {
- addr = DecodeReg(reg) + (idxind ? lo_nyb-16 : lo_nyb);
- }
- else
- {
- if (idxind)
- {
- switch(lo_nyb)
- {
- case 1: { woff = DecodeReg(reg);
- addr = (RdMem(woff)<<8) | RdMem(woff+1);
- switch(reg)
- {
- case 0: xr++; xr++; break;
- case 1: yr++; yr++; break;
- case 2: ur++; ur++; break;
- case 3: sr++; sr++; break;
- }
- break; }
- case 3: { switch(reg)
- {
- case 0: xr--; xr--; break;
- case 1: yr--; yr--; break;
- case 2: ur--; ur--; break;
- case 3: sr--; sr--; break;
- }
- woff = DecodeReg(reg);
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- case 4: { woff = DecodeReg(reg);
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- case 5: { woff = DecodeReg(reg) + SignedB(br);
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- case 6: { woff = DecodeReg(reg) + SignedB(ar);
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- case 8: { woff = DecodeReg(reg) + SignedB(Fetch());
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- case 9: { woff = DecodeReg(reg) + SignedW(FetchW());
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- case 11: { woff = DecodeReg(reg) + SignedW((ar<<8) | br);
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- case 12: { woff = pcr + SignedB(Fetch());
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- case 13: { woff = pcr + SignedW(FetchW());
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- case 15: { woff = FetchW();
- addr = (RdMem(woff)<<8) | RdMem(woff+1); break; }
- }
- }
- else
- {
- switch(lo_nyb)
- {
- case 0: { addr = DecodeReg(reg);
- switch(reg)
- {
- case 0: xr++; break;
- case 1: yr++; break;
- case 2: ur++; break;
- case 3: sr++; break;
- }
- break; }
- case 1: { addr = DecodeReg(reg);
- switch(reg)
- {
- case 0: xr++; xr++; break;
- case 1: yr++; yr++; break;
- case 2: ur++; ur++; break;
- case 3: sr++; sr++; break;
- }
- break; }
- case 2: { switch(reg)
- {
- case 0: xr--; break;
- case 1: yr--; break;
- case 2: ur--; break;
- case 3: sr--; break;
- }
- addr = DecodeReg(reg); break; }
- case 3: { switch(reg)
- {
- case 0: xr--; xr--; break;
- case 1: yr--; yr--; break;
- case 2: ur--; ur--; break;
- case 3: sr--; sr--; break;
- }
- addr = DecodeReg(reg); break; }
- case 4: { addr = DecodeReg(reg); break; }
- case 5: { addr = DecodeReg(reg) + SignedB(br); break; }
- case 6: { addr = DecodeReg(reg) + SignedB(ar); break; }
- case 8: { addr = DecodeReg(reg) + SignedB(Fetch()); break; }
- case 9: { addr = DecodeReg(reg) + SignedW(FetchW()); break; }
- case 11: { addr = DecodeReg(reg) + SignedW((ar<<8) | br); break; }
- case 12: { addr = pcr + SignedB(Fetch()); break; }
- case 13: { addr = pcr + SignedW(FetchW()); break; }
- }
- }
- }
- return(addr);
-}
-
-//
-// Page zero instructions...
-//
-
-void Op00(void) // NEG DP
-{
- addr = (dpr<<8) | Fetch();
- tmp = 256 - RdMem(addr);
- WrMem(addr, tmp);
- (tmp == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (tmp > 0x7F ? ccr |= 0x01 : ccr &= 0xFE); // Adjust carry
- iclock += 6;
-}
-void Op03(void) // COM DP
-{
- addr = (dpr<<8) | Fetch();
- tmp = 0xFF ^ RdMem(addr);
- WrMem(addr, tmp);
- ccr &= 0xFD; ccr |= 0x01; // CLV SEC
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void Op04(void) // LSR DP
-{
- addr = (dpr<<8) | Fetch();
- tmp = RdMem(addr);
- (tmp&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift low bit into carry
- tmp >>= 1; WrMem(addr, tmp);
- ccr &= 0xF7; // CLN
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- iclock += 6;
-}
-void Op06(void) // ROR DP
-{
- addr = (dpr<<8) | Fetch(); BYTE tmp2 = RdMem(addr);
- tmp = (tmp2>>1) + (ccr&0x01)*128;
- WrMem(addr, tmp);
- (tmp2&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift bit into carry
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void Op07(void) // ASR DP
-{
- addr = (dpr<<8) | Fetch(); tmp = RdMem(addr);
- (tmp&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift bit into carry
- tmp >>= 1;
- if (tmp&0x40) tmp |= 0x80; // Set Neg if it was set
- WrMem(addr, tmp);
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void Op08(void) // LSL DP
-{
- addr = (dpr<<8) | Fetch(); // NEEDS OVERFLOW ADJUSTMENT
- tmp = RdMem(addr);
- (tmp&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- tmp <<= 1;
- WrMem(addr, tmp);
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void Op09(void) // ROL DP
-{
- addr = (dpr<<8) | Fetch(); BYTE tmp2 = RdMem(addr);
- tmp = (tmp2<<1) + (ccr&0x01);
- WrMem(addr, tmp);
- (tmp2&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- ((tmp2&0x80)^((tmp2<<1)&0x80) ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void Op0A(void) // DEC DP
-{
- addr = (dpr<<8) | Fetch();
- tmp = RdMem(addr) - 1;
- WrMem(addr, tmp);
- (tmp == 0x7F ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void Op0C(void) // INC DP
-{
- addr = (dpr<<8) | Fetch();
- tmp = RdMem(addr) + 1;
- WrMem(addr, tmp);
- (tmp == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void Op0D(void) // TST DP
-{
- tmp = RdMem((dpr<<8)|Fetch());
- ccr &= 0xFD; // CLV
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void Op0E(void) // JMP DP
-{
- pcr = (dpr<<8) | Fetch();
- iclock += 3;
-}
-void Op0F(void) // CLR DP
-{
- WrMem((dpr<<8)|Fetch(), 0);
- ccr &= 0xF0; ccr |= 0x04; // CLN, SEZ, CLV, CLC
- iclock += 6;
-}
-void Op12(void) // NOP
-{
- iclock += 2;
-}
-void Op13(void) // SYNC
-{
- iclock += 2;
-}
-void Op16(void) // LBRA
-{
- pcr += SignedW(FetchW());
- iclock += 5;
-}
-void Op17(void) // LBSR
-{
- addr = FetchW();
- WrMem(--sr, pcr&0xFF); WrMem(--sr, pcr>>8);
- pcr += SignedW(addr);
- iclock += 9;
-}
-void Op19(void) // DAA
-{
- if ((ccr&0x20) || ((ar&0x0F) > 0x09)) // H set or lo nyb too big?
- {
- ar += 0x06; ccr |= 0x20; // Then adjust & set half carry
- }
- if ((ccr&0x01) || (ar > 0x9F)) // C set or hi nyb too big?
- {
- ar += 0x60; ccr |= 0x01; // Then adjust & set carry
- }
- ccr &= 0xF1; // CL NZV
- if (ar == 0) ccr |= 0x04; // Adjust Zero flag
- if (ar&0x80) ccr |= 0x08; // Adjust Negative flag
- iclock += 2;
-}
-void Op1A(void) // ORCC #
-{
- ccr |= Fetch();
- iclock += 3;
-}
-void Op1C(void) // ANDCC #
-{
- ccr &= Fetch();
- iclock += 3;
-}
-void Op1D(void) // SEX
-{
- (br&0x80 ? ar = 0xFF : ar = 0x00);
- ((ar|br) == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op1E(void) // EXG
-{
- tmp = Fetch();
- addr = ReadEXG(tmp>>4); WriteEXG(tmp>>4, ReadEXG(tmp&0xF));
- WriteEXG(tmp&0xF, addr);
- iclock += 8;
-}
-void Op1F(void) // TFR
-{
- tmp = Fetch();
- WriteEXG(tmp&0xF, ReadEXG(tmp>>4));
- iclock += 7;
-}
-void Op20(void) // BRA
-{
- pcr += SignedB(Fetch()); // Branch always
- iclock += 3;
-}
-void Op21(void) // BRN
-{
- Fetch();
- iclock += 3;
-}
-void Op22(void) // BHI
-{
- tmp = Fetch();
- if (!(ccr&0x05)) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op23(void) // BLS
-{
- tmp = Fetch();
- if (ccr&0x05) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op24(void) // BCC (BHS)
-{
- tmp = Fetch();
- if (!(ccr&0x01)) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op25(void) // BCS (BLO)
-{
- tmp = Fetch();
- if (ccr&0x01) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op26(void) // BNE
-{
- tmp = Fetch();
- if (!(ccr&0x04)) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op27(void) // BEQ
-{
- tmp = Fetch();
- if (ccr&0x04) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op28(void) // BVC
-{
- tmp = Fetch();
- if (!(ccr&0x02)) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op29(void) // BVS
-{
- tmp = Fetch();
- if (ccr&0x02) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op2A(void) // BPL
-{
- tmp = Fetch();
- if (!(ccr&0x08)) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op2B(void) // BMI
-{
- tmp = Fetch();
- if (ccr&0x08) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op2C(void) // BGE
-{
- tmp = Fetch();
- if (!(((ccr&0x08) >> 2) ^ (ccr&0x02))) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op2D(void) // BLT
-{
- tmp = Fetch();
- if (((ccr&0x08) >> 2) ^ (ccr&0x02)) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op2E(void) // BGT
-{
- tmp = Fetch();
- if (!((ccr&0x04) | (((ccr&0x08) >> 2) ^ (ccr&0x02)))) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op2F(void) // BLE
-{
- tmp = Fetch();
- if ((ccr&0x04) | (((ccr&0x08) >> 2) ^ (ccr&0x02))) pcr += SignedB(tmp);
- iclock += 3;
-}
-void Op30(void) // LEAX
-{
- xr = DecodeIDX(Fetch());
- (xr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- iclock += 4;
-}
-void Op31(void) // LEAY
-{
- yr = DecodeIDX(Fetch());
- (yr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- iclock += 4;
-}
-void Op32(void) // LEAS
-{
- sr = DecodeIDX(Fetch());
- (sr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- iclock += 4;
-}
-void Op33(void) // LEAU
-{
- ur = DecodeIDX(Fetch());
- (ur == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- iclock += 4;
-}
-void Op34(void) // PSHS
-{
- tmp = Fetch();
- if (tmp&0x80) { WrMem(--sr, pcr&0xFF); WrMem(--sr, pcr>>8); }
- if (tmp&0x40) { WrMem(--sr, ur&0xFF); WrMem(--sr, ur>>8); }
- if (tmp&0x20) { WrMem(--sr, yr&0xFF); WrMem(--sr, yr>>8); }
- if (tmp&0x10) { WrMem(--sr, xr&0xFF); WrMem(--sr, xr>>8); }
- if (tmp&0x08) WrMem(--sr, dpr);
- if (tmp&0x04) WrMem(--sr, br);
- if (tmp&0x02) WrMem(--sr, ar);
- if (tmp&0x01) WrMem(--sr, ccr);
- iclock += 5;
-}
-void Op35(void) // PULS
-{
- tmp = Fetch();
- if (tmp&0x01) ccr = RdMem(sr++);
- if (tmp&0x02) ar = RdMem(sr++);
- if (tmp&0x04) br = RdMem(sr++);
- if (tmp&0x08) dpr = RdMem(sr++);
- if (tmp&0x10) xr = (RdMem(sr++)<<8) | RdMem(sr++);
- if (tmp&0x20) yr = (RdMem(sr++)<<8) | RdMem(sr++);
- if (tmp&0x40) ur = (RdMem(sr++)<<8) | RdMem(sr++);
- if (tmp&0x80) pcr = (RdMem(sr++)<<8) | RdMem(sr++);
- iclock += 5;
-}
-void Op36(void) // PSHU
-{
- tmp = Fetch();
- if (tmp&0x80) { WrMem(--ur, pcr&0xFF); WrMem(--ur, pcr>>8); }
- if (tmp&0x40) { WrMem(--ur, sr&0xFF); WrMem(--ur, sr>>8); }
- if (tmp&0x20) { WrMem(--ur, yr&0xFF); WrMem(--ur, yr>>8); }
- if (tmp&0x10) { WrMem(--ur, xr&0xFF); WrMem(--ur, xr>>8); }
- if (tmp&0x08) WrMem(--ur, dpr);
- if (tmp&0x04) WrMem(--ur, br);
- if (tmp&0x02) WrMem(--ur, ar);
- if (tmp&0x01) WrMem(--ur, ccr);
- iclock += 5;
-}
-void Op37(void) // PULU
-{
- tmp = Fetch();
- if (tmp&0x01) ccr = RdMem(ur++);
- if (tmp&0x02) ar = RdMem(ur++);
- if (tmp&0x04) br = RdMem(ur++);
- if (tmp&0x08) dpr = RdMem(ur++);
- if (tmp&0x10) xr = (RdMem(ur++)<<8) | RdMem(ur++);
- if (tmp&0x20) yr = (RdMem(ur++)<<8) | RdMem(ur++);
- if (tmp&0x40) sr = (RdMem(ur++)<<8) | RdMem(ur++);
- if (tmp&0x80) pcr = (RdMem(ur++)<<8) | RdMem(ur++);
- iclock += 5;
-}
-void Op39(void) // RTS
-{
- pcr = (RdMem(sr++)<<8) | RdMem(sr++);
- iclock += 5;
-}
-void Op3A(void) // ABX
-{
- xr += br;
- iclock += 3;
-}
-void Op3B(void) // RTI
-{
- ccr = RdMem(sr++);
- if (ccr&0x80) // If E flag set, pull all regs
- {
- ar = RdMem(sr++); br = RdMem(sr++); dpr = RdMem(sr++);
- xr = (RdMem(sr++)<<8) | RdMem(sr++);
- yr = (RdMem(sr++)<<8) | RdMem(sr++);
- ur = (RdMem(sr++)<<8) | RdMem(sr++);
- iclock += 15;
- }
- else
- {
- iclock += 6;
- }
- pcr = (RdMem(sr++)<<8) | RdMem(sr++);
-}
-void Op3C(void) // CWAI
-{
- ccr &= Fetch(); ccr |= 0x80;
- iclock += 1000000; // Force interrupt
-}
-void Op3D(void) // MUL
-{
- addr = ar * br; ar = addr>>8; br = addr&0xFF;
- (addr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero
- (br&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry
- iclock += 11;
-}
-void Op3E(void) // RESET
-{
-}
-void Op3F(void) // SWI
-{
-}
-void Op40(void) // NEGA
-{
- ar = 256 - ar;
- (ar > 0x7F ? ccr |= 0x01 : ccr &= 0xFE); // Adjust carry
- (ar == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op43(void) // COMA
-{
- ar ^= 0xFF;
- ccr &= 0xFD; ccr |= 0x01; // CLV, SEC
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op44(void) // LSRA
-{
- (ar&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift low bit into carry
- ar >>= 1;
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op46(void) // RORA
-{
- tmp = ar; ar = (tmp>>1) + (ccr&0x01)*128;
- (tmp&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift bit into carry
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op47(void) // ASRA
-{
- (ar&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift bit into carry
- ar >>= 1; // Do the shift
- if (ar&0x40) ar |= 0x80; // Set neg if it was set
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op48(void) // LSLA [Keep checking from here...]
-{
- (ar&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- ar <<= 1;
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op49(void) // ROLA
-{
- tmp = ar; ar = (tmp<<1) + (ccr&0x01);
- (tmp&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op4A(void) // DECA
-{
- ar--;
- (ar == 0x7F ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op4C(void) // INCA
- {
- ar++;
- (ar == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op4D(void) // TSTA
- {
- ccr &= 0xFD; // Clear oVerflow flag
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op4F(void) // CLRA
-{
- ar = 0;
- ccr &= 0xF0; ccr |= 0x04; // Set NZVC
- iclock += 2;
-}
-void Op50(void) // NEGB
- {
- br = 256 - br;
-// ((br^tmp)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Adjust H carry
- (br == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (br > 0x7F ? ccr |= 0x01 : ccr &= 0xFE); // Adjust carry
- iclock += 2;
- }
-void Op53(void) // COMB
- {
- br ^= 0xFF;
- ccr &= 0xFD; ccr |= 0x01; // CLV, SEC
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op54(void) // LSRB
- {
- (br&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift low bit into carry
- br >>= 1;
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op56(void) // RORB
- {
- tmp = br; br = (br >> 1) + (ccr&0x01)*128;
- (tmp&0x01 ? ccr |=0x01 : ccr &= 0xFE); // Shift bit into carry
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op57(void) // ASRB
- {
- (br&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift bit into carry
- br >>= 1; // Do the shift
- if (br&0x40) br |= 0x80; // Set neg if it was set
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op58(void) // LSLB
- {
- (br&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- br <<= 1;
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op59(void) // ROLB
-{
- tmp = br;
- br = (tmp<<1) + (ccr&0x01);
- (tmp&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op5A(void) // DECB
- {
- br--;
- (br == 0x7F ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op5C(void) // INCB
- {
- br++;
- (br == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op5D(void) // TSTB
- {
- ccr &= 0xFD; // Clear oVerflow flag
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op5F(void) // CLRB
- {
- br = 0;
- ccr &= 0xF0; ccr |= 0x04; // Set NZVC
- iclock += 2;
- }
-void Op60(void) // NEG IDX
- {
- addr = DecodeIDX(Fetch());
- tmp = RdMem(addr); BYTE res = 256 - tmp;
- WrMem(addr, res);
-// ((res^tmp)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Adjust H carry
- (res == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (res == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (res&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (res > 0x7F ? ccr |= 0x01 : ccr &= 0xFE); // Adjust carry
- iclock += 6;
- }
-void Op63(void) // COM IDX
- {
- addr = DecodeIDX(Fetch());
- tmp = RdMem(addr) ^ 0xFF;
- WrMem(addr, tmp);
- ccr &= 0xFD; ccr |= 0x01; // CLV, SEC
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op64(void) // LSR IDX
- {
- addr = DecodeIDX(Fetch());
- tmp = RdMem(addr);
- (tmp&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift low bit into carry
- tmp >>= 1; WrMem(addr, tmp);
- ccr &= 0xF7; // CLN
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- iclock += 6;
- }
-void Op66(void) // ROR IDX
- {
- addr = DecodeIDX(Fetch());
- tmp = RdMem(addr); BYTE tmp2 = tmp;
- tmp = (tmp >> 1) + (ccr&0x01)*128;
- WrMem(addr, tmp);
- (tmp2&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift bit into carry
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op67(void) // ASR IDX
- {
- addr = DecodeIDX(Fetch());
- tmp = RdMem(addr);
- (tmp&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift bit into carry
- tmp >>= 1;
- if (tmp&0x40) tmp |= 0x80; // Set Neg if it was set
- WrMem(addr, tmp);
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op68(void) // LSL IDX
- {
- addr = DecodeIDX(Fetch());
- tmp = RdMem(addr);
- (tmp&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- tmp <<= 1;
- WrMem(addr, tmp);
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op69(void) // ROL IDX
-{
- BYTE tmp2 = RdMem(DecodeIDX(Fetch()));
- tmp = (tmp2<<1) + (ccr&0x01);
- WrMem(addr, tmp);
- (tmp2&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void Op6A(void) // DEC IDX
- {
- BYTE tmp; WORD addr;
- addr = DecodeIDX(Fetch());
- tmp = RdMem(addr) - 1;
- WrMem(addr, tmp);
- (tmp == 0x7F ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op6C(void) // INC IDX
- {
- addr = DecodeIDX(Fetch());
- tmp = RdMem(addr) + 1;
- WrMem(addr, tmp);
- (tmp == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op6D(void) // TST IDX
- {
- tmp = RdMem(DecodeIDX(Fetch()));
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op6E(void) // JMP IDX
-{
- pcr = DecodeIDX(Fetch());
- iclock += 3;
-}
-void Op6F(void) // CLR IDX
-{
- addr = DecodeIDX(Fetch());
- WrMem(addr, 0);
- ccr &= 0xF0; ccr |= 0x04; // Set NZVC
- iclock += 6;
-}
-void Op70(void) // NEG ABS
- {
- addr = FetchW();
- tmp = RdMem(addr); BYTE res = 256 - tmp;
- WrMem(addr, res);
- (res == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (res == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (res&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (res > 0x7F ? ccr |= 0x01 : ccr &= 0xFE); // Adjust carry
- iclock += 7;
- }
-void Op73(void) // COM ABS
- {
- addr = FetchW();
- tmp = RdMem(addr) ^ 0xFF;
- WrMem(addr, tmp);
- ccr &= 0xFD; ccr |= 0x01; // CLV, SEC
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
- }
-void Op74(void) // LSR ABS
- {
- addr = FetchW();
- tmp = RdMem(addr);
- (tmp&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift low bit into carry
- tmp >>= 1; WrMem(addr, tmp);
- ccr &= 0xF7; // CLN
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- iclock += 7;
- }
-void Op76(void) // ROR ABS
- {
- BYTE tmp; WORD addr;
- addr = FetchW();
- tmp = RdMem(addr); BYTE tmp2 = tmp;
- tmp = (tmp >> 1) + (ccr&0x01)*128;
- WrMem(addr, tmp);
- (tmp2&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift bit into carry
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
- }
-void Op77(void) // ASR ABS
- {
- BYTE tmp; WORD addr;
- addr = FetchW();
- tmp = RdMem(addr);
- (tmp&0x01 ? ccr |= 0x01 : ccr &= 0xFE); // Shift bit into carry
- tmp >>= 1;
- if (tmp&0x40) tmp |= 0x80; // Set Neg if it was set
- WrMem(addr, tmp);
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
- }
-void Op78(void) // LSL ABS
- {
- BYTE tmp; WORD addr;
- addr = FetchW();
- tmp = RdMem(addr);
- (tmp&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- tmp <<= 1;
- WrMem(addr, tmp);
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
- }
-void Op79(void) // ROL ABS
-{
- BYTE tmp2 = RdMem(FetchW());
- tmp = (tmp2<<1) + (ccr&0x01);
- WrMem(addr, tmp);
- (tmp2&0x80 ? ccr |= 0x01 : ccr &= 0xFE); // Shift hi bit into carry
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
-}
-void Op7A(void) // DEC ABS
- {
- BYTE tmp; WORD addr;
- addr = FetchW();
- tmp = RdMem(addr) - 1;
- WrMem(addr, tmp);
- (tmp == 0x7F ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
- }
-void Op7C(void) // INC ABS
- {
- BYTE tmp; WORD addr;
- addr = FetchW();
- tmp = RdMem(addr) + 1;
- WrMem(addr, tmp);
- (tmp == 0x80 ? ccr |= 0x02 : ccr &= 0xFD); // Adjust oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
- }
-
-void Op7D(void) // TST ABS
-{
- BYTE tmp = RdMem(FetchW());
-
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
-
- iclock += 7;
-}
-
-void Op7E(void) // JMP ABS
-{
- pcr = FetchW();
- iclock += 3;
-}
-void Op7F(void) // CLR ABS
- {
- WrMem(FetchW(), 0);
- ccr &= 0xF0; ccr |= 0x04; // Set NZVC
- iclock += 7;
- }
-void Op80(void) // SUBA #
-{
- BYTE tmp = Fetch(); BYTE as = ar;
- ar -= tmp;
- (as < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((as^tmp^ar^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op81(void) // CMPA #
-{
- tmp = Fetch();
- BYTE db = ar - tmp;
- (ar < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((ar^tmp^db^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (db == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (db&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op82(void) // SBCA #
-{
- tmp = Fetch(); BYTE as = ar;
- ar = ar - tmp - (ccr&0x01);
- (as < (tmp+(ccr&0x01)) ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((as^tmp^ar^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void Op83(void) // SUBD #
-{
- addr = FetchW(); WORD dr = (ar<<8)|br, ds = dr;
- dr -= addr;
- (ds < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((ds^addr^dr^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (dr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- ar = dr>>8; br = dr&0xFF;
- iclock += 4;
-}
-void Op84(void) // ANDA #
- {
- ar &= Fetch();
- ccr &= 0xFD; // Clear oVerflow flag
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op85(void) // BITA #
- {
- tmp = ar & Fetch();
- ccr &= 0xFD; // Clear oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op86(void) // LDA #
- {
- ar = Fetch();
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op88(void) // EORA #
- {
- ar ^= Fetch();
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op89(void) // ADCA #
-{
- tmp = Fetch();
- addr = (WORD)ar + (WORD)tmp + (WORD)(ccr&0x01);
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry
- ((ar^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((ar^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- ar = addr & 0xFF; // Set accumulator
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative
- iclock += 2;
-}
-void Op8A(void) // ORA #
- {
- ar |= Fetch();
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void Op8B(void) // ADDA #
-{
- tmp = Fetch(); addr = ar + tmp;
- (addr > 0xFF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((ar^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((ar^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- ar = addr & 0xFF; // Set accumulator
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 2;
-}
-void Op8C(void) // CMPX #
-{
- addr = FetchW();
- WORD dw = xr - addr;
- (xr < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((xr^addr^dw^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
-}
-void Op8D(void) // BSR
- {
- tmp = Fetch();
- WrMem(--sr, pcr&0xFF); WrMem(--sr, pcr>>8);
- pcr += SignedB(tmp);
- iclock += 7;
- }
-void Op8E(void) // LDX #
- {
- xr = FetchW();
- ccr &= 0xFD; // CLV
- (xr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (xr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 3;
- }
-void Op90(void) // SUBA DP
- {
- tmp = RdMem((dpr<<8)|Fetch()); BYTE as = ar;
- ar -= tmp;
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (as < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((as^tmp^ar^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 4;
- }
-void Op91(void) // CMPA DP
- {
- tmp = RdMem((dpr<<8)|Fetch());
- BYTE db = ar - tmp;
- (db == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (db&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (ar < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((ar^tmp^db^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 4;
- }
-void Op92(void) // SBCA DP
-{
- tmp = RdMem((dpr<<8)|Fetch()); BYTE as = ar;
- ar = ar - tmp - (ccr&0x01);
- (as < (tmp+(ccr&0x01)) ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((as^tmp^ar^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
-}
-void Op93(void) // SUBD DP
-{
- addr = (dpr<<8)|Fetch(); WORD dr = (ar<<8)|br, ds = dr;
- WORD adr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- dr -= adr2;
- (ds < adr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((ds^adr2^dr^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (dr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- ar = dr>>8; br = dr&0xFF;
- iclock += 6;
-}
-void Op94(void) // ANDA DP
-{
- ar &= RdMem((dpr<<8)|Fetch());
- ccr &= 0xF1; // CLV CLZ CLN
- if (ar == 0) ccr |= 0x04; // Adjust Zero flag
- if (ar&0x80) ccr |= 0x08; // Adjust Negative flag
- iclock += 4;
-}
-void Op95(void) // BITA DP
- {
- tmp = ar & RdMem((dpr<<8)|Fetch());
- ccr &= 0xFD; // Clear oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void Op96(void) // LDA DP
-{
- ar = RdMem((dpr<<8)|Fetch());
- ccr &= 0xF1; // CLN CLZ CLV
- if (ar == 0) ccr |= 0x04; // Set Zero flag
- if (ar&0x80) ccr |= 0x08; // Set Negative flag
- iclock += 4;
-}
-void Op97(void) // STA DP
- {
- WrMem((dpr<<8)|Fetch(), ar);
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void Op98(void) // EORA DP
- {
- ar ^= RdMem((dpr<<8)|Fetch());
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void Op99(void) // ADCA DP
-{
- tmp = RdMem((dpr<<8)|Fetch());
- addr = (WORD)ar + (WORD)tmp + (WORD)(ccr&0x01);
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry
- ((ar^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((ar^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- ar = addr & 0xFF; // Set accumulator
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative
- iclock += 4;
-}
-void Op9A(void) // ORA DP
- {
- ar |= RdMem((dpr<<8)|Fetch());
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void Op9B(void) // ADDA DP
-{
- tmp = RdMem((dpr<<8)|Fetch());
- addr = (WORD)ar + (WORD)tmp;
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((ar^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((ar^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflo
- ar = addr & 0xFF; // Set accumulator
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 4;
-}
-void Op9C(void) // CMPX DP
- {
- addr = (dpr<<8)|Fetch();
- WORD adr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- WORD dw = xr - adr2;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (xr < adr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((xr^adr2^dw^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 6;
- }
-void Op9D(void) // JSR DP
- {
- addr = (dpr<<8) | Fetch();
- WrMem(--sr, pcr&0xFF); WrMem(--sr, pcr>>8);
- pcr = addr; // JSR to DP location...
- iclock += 7;
- }
-void Op9E(void) // LDX DP
- {
- addr = (dpr<<8) | Fetch();
- xr = (RdMem(addr) << 8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (xr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (xr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
- }
-void Op9F(void) // STX DP
- {
- addr = (dpr<<8) | Fetch();
- WrMem(addr, xr>>8); WrMem(addr+1, xr&0xFF);
- ccr &= 0xFD; // CLV
- (xr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (xr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
- }
-void OpA0(void) // SUBA IDX
- {
- tmp = RdMem(DecodeIDX(Fetch())); BYTE as = ar;
- ar -= tmp;
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (as < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((as^tmp^ar^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 4;
- }
-void OpA1(void) // CMPA IDX
- {
- tmp = RdMem(DecodeIDX(Fetch()));
- BYTE db = ar - tmp;
- (db == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (db&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (ar < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((ar^tmp^db^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 4;
- }
-void OpA2(void) // SBCA IDX
-{
- tmp = RdMem(DecodeIDX(Fetch())); BYTE as = ar;
- ar = ar - tmp - (ccr&0x01);
- (as < (tmp+(ccr&0x01)) ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((as^tmp^ar^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
-}
-void OpA3(void) // SUBD IDX
-{
- addr = DecodeIDX(Fetch()); WORD dr = (ar<<8)|br, ds = dr;
- WORD adr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- dr -= adr2;
- (ds < adr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((ds^adr2^dr^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (dr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- ar = dr>>8; br = dr&0xFF;
- iclock += 6;
-}
-void OpA4(void) // ANDA IDX
- {
- ar &= RdMem(DecodeIDX(Fetch()));
- ccr &= 0xFD; // Clear oVerflow flag
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpA5(void) // BITA IDX
- {
- tmp = ar & RdMem(DecodeIDX(Fetch()));
- ccr &= 0xFD; // Clear oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpA6(void) // LDA IDX
-{
- ar = RdMem(DecodeIDX(Fetch()));
- ccr &= 0xF1; // CLV CLZ CLN
- if (ar == 0) ccr |= 0x04; // Set Zero flag
- if (ar&0x80) ccr |= 0x08; // Set Negative flag
- iclock += 4;
-}
-void OpA7(void) // STA IDX
-{
- WrMem(DecodeIDX(Fetch()), ar);
- ccr &= 0xF1; // CLV CLZ CLN
- if (ar == 0) ccr |= 0x04; // Set Zero flag
- if (ar&0x80) ccr |= 0x08; // Set Negative flag
- iclock += 4;
-}
-void OpA8(void) // EORA IDX
- {
- ar ^= RdMem(DecodeIDX(Fetch()));
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpA9(void) // ADCA IDX
-{
- tmp = RdMem(DecodeIDX(Fetch()));
- addr = (WORD)ar + (WORD)tmp + (WORD)(ccr&0x01);
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((ar^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((ar^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflo
- ar = addr & 0xFF; // Set accumulator
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 4;
-}
-void OpAA(void) // ORA IDX
-{
- ar |= RdMem(DecodeIDX(Fetch()));
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
-}
-void OpAB(void) // ADDA IDX
-{
- tmp = RdMem(DecodeIDX(Fetch()));
- addr = (WORD)ar + (WORD)tmp;
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((ar^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((ar^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflo
- ar = addr & 0xFF; // Set accumulator
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 4;
-}
-void OpAC(void) // CMPX IDX
-{
- addr = DecodeIDX(Fetch());
- WORD addr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- WORD dw = xr - addr2;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (xr < addr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((xr^addr2^dw^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 6;
-}
-void OpAD(void) // JSR IDX
-{
- addr = DecodeIDX(Fetch());
- WrMem(--sr, pcr&0xFF); WrMem(--sr, pcr>>8);
- pcr = addr; // JSR directly to IDX ptr
- iclock += 7;
-}
-void OpAE(void) // LDX IDX
-{
- addr = DecodeIDX(Fetch());
- xr = (RdMem(addr) << 8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (xr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (xr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpAF(void) // STX IDX
-{
- addr = DecodeIDX(Fetch());
- WrMem(addr, xr>>8); WrMem(addr+1, xr&0xFF);
- ccr &= 0xF1; // CLV CLZ CLN
- if (xr == 0) ccr |= 0x04; // Set Zero flag
- if (xr&0x8000) ccr |= 0x08; // Set Negative flag
- iclock += 5;
-}
-void OpB0(void) // SUBA ABS
- {
- tmp = RdMem(FetchW()); BYTE as = ar;
- ar -= tmp;
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (as < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((as^tmp^ar^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 5;
- }
-void OpB1(void) // CMPA ABS
- {
- tmp = RdMem(FetchW());
- BYTE db = ar - tmp;
- (db == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (db&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (ar < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((ar^tmp^db^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 5;
- }
-void OpB2(void) // SBCA ABS
-{
- tmp = RdMem(FetchW()); BYTE as = ar;
- ar = ar - tmp - (ccr&0x01);
- (as < (tmp+(ccr&0x01)) ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((as^tmp^ar^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpB3(void) // SUBD ABS
-{
- addr = FetchW(); WORD dr = (ar<<8)|br, ds = dr;
- WORD adr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- dr -= adr2;
- (ds < adr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((ds^adr2^dr^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- (dr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- ar = dr>>8; br = dr&0xFF;
- iclock += 7;
-}
-void OpB4(void) // ANDA ABS
-{
- ar &= RdMem(FetchW());
- ccr &= 0xFD; // Clear oVerflow flag
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpB5(void) // BITA ABS
-{
- tmp = ar & RdMem(FetchW());
- ccr &= 0xFD; // Clear oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpB6(void) // LDA ABS
-{
- ar = RdMem(FetchW());
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpB7(void) // STA ABS
-{
- WrMem(FetchW(), ar);
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpB8(void) // EORA ABS
-{
- ar ^= RdMem(FetchW());
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpB9(void) // ADCA ABS
-{
- tmp = RdMem(FetchW());
- addr = (WORD)ar + (WORD)tmp + (WORD)(ccr&0x01);
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((ar^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((ar^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- ar = addr; // Set accumulator
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 5;
-}
-void OpBA(void) // ORA ABS
-{
- ar |= RdMem(FetchW());
- ccr &= 0xFD; // CLV
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpBB(void) // ADDA ABS
-{
- tmp = RdMem(FetchW());
- addr = (WORD)ar + (WORD)tmp;
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((ar^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((ar^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflo
- ar = addr & 0xFF; // Set accumulator
- (ar == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 5;
-}
-void OpBC(void) // CMPX ABS
-{
- addr = FetchW(); WORD addr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- WORD dw = xr - addr2;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (xr < addr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((xr^addr2^dw^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 7;
-}
-void OpBD(void) // JSR ABS
-{
- addr = FetchW();
- WrMem(--sr, pcr&0xFF); WrMem(--sr, pcr>>8);
- pcr = addr; // Go to absolute address (Not indir)
- iclock += 8;
-}
-void OpBE(void) // LDX ABS
-{
- addr = FetchW();
- xr = (RdMem(addr) << 8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (xr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (xr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
-}
-void OpBF(void) // STX ABS
- {
- addr = FetchW();
- WrMem(addr, xr>>8); WrMem(addr+1, xr&0xFF);
- ccr &= 0xFD; // CLV
- (xr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (xr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void OpC0(void) // SUBB #
- {
- tmp = Fetch(); BYTE bs = br;
- br -= tmp;
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (bs < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((bs^tmp^br^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 2;
- }
-void OpC1(void) // CMPB #
- {
- tmp = Fetch();
- BYTE db = br - tmp;
- (br < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((br^tmp^db^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (db == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (db&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void OpC2(void) // SBCB #
-{
- tmp = Fetch(); BYTE bs = br;
- br = br - tmp - (ccr&0x01);
- (bs < (tmp+(ccr&0x01)) ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((bs^tmp^br^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
-}
-void OpC3(void) // ADDD #
-{
- addr = FetchW(); long dr = ((ar<<8)|br)&0xFFFF, ds = dr;
- dr += addr;
- (dr > 0xFFFF ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- dr &= 0xFFFF;
- (dr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- ((ds^addr^dr^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- ar = dr>>8; br = dr&0xFF;
- iclock += 4;
-}
-void OpC4(void) // ANDB #
- {
- br &= Fetch();
- ccr &= 0xFD; // Clear oVerflow flag
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void OpC5(void) // BITB #
-{
- tmp = br & Fetch();
- ccr &= 0xF1; // CLV CLZ CLN
- if (tmp == 0) ccr |= 0x04; // Set Zero flag
- if (tmp&0x80) ccr |= 0x08; // Set Negative flag
- iclock += 2;
-}
-void OpC6(void) // LDB #
-{
- br = Fetch();
- ccr &= 0xF1; // CLV CLZ CLN
- if (br == 0) ccr |= 0x04; // Set Zero flag
- if (br&0x80) ccr |= 0x08; // Set Negative flag
- iclock += 2;
-}
-void OpC8(void) // EORB #
- {
- br ^= Fetch();
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void OpC9(void) // ADCB #
-{
- tmp = Fetch();
- addr = (WORD)br + (WORD)tmp + (WORD)(ccr&0x01);
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((br^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((br^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflo
- br = addr & 0xFF; // Set accumulator
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 2;
-}
-void OpCA(void) // ORB #
- {
- br |= Fetch();
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 2;
- }
-void OpCB(void) // ADDB #
-{
- tmp = Fetch(); addr = br + tmp;
- (addr > 0xFF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((br^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((br^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflo
- br = addr & 0xFF; // Set accumulator
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 2;
-}
-void OpCC(void) // LDD #
-{
- ar = Fetch(); br = Fetch();
- ccr &= 0xFD; // CLV
- ((ar+br) == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 3;
-}
-void OpCE(void) // LDU #
-{
- ur = FetchW();
- ccr &= 0xFD; // CLV
- (ur == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ur&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 3;
-}
-void OpD0(void) // SUBB DP
-{
- tmp = RdMem((dpr<<8)|Fetch()); BYTE bs = br;
- br -= tmp;
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (bs < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((bs^tmp^br^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 4;
-}
-void OpD1(void) // CMPB DP
-{
- tmp = RdMem((dpr<<8)|Fetch());
- BYTE db = br - tmp;
- (db == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (db&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (br < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((br^tmp^db^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 4;
-}
-void OpD2(void) // SBCB DP
-{
- tmp = RdMem((dpr<<8)|Fetch()); BYTE bs = br;
- br = br - tmp - (ccr&0x01);
- (bs < (tmp+(ccr&0x01)) ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((bs^tmp^br^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
-}
-void OpD3(void) // ADDD DP
-{
- addr = (dpr<<8)|Fetch(); long dr = ((ar<<8)|br)&0xFFFF, ds = dr;
- WORD adr2 = (RdMem(addr)<<8)|RdMem(addr+1);
- dr += adr2;
- (dr > 0xFFFF ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- dr &= 0xFFFF;
- (dr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- ((ds^adr2^dr^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- ar = dr>>8; br = dr&0xFF;
- iclock += 6;
-}
-void OpD4(void) // ANDB DP
- {
- br &= RdMem((dpr<<8)|Fetch());
- ccr &= 0xFD; // Clear oVerflow flag
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpD5(void) // BITB DP
- {
- tmp = br & RdMem((dpr<<8)|Fetch());
- ccr &= 0xFD; // Clear oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpD6(void) // LDB DP
-{
- br = RdMem((dpr<<8)|Fetch());
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
-}
-void OpD7(void) // STB DP
- {
- WrMem((dpr<<8)|Fetch(), br);
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpD8(void) // EORB DP
- {
- br ^= RdMem((dpr<<8)|Fetch());
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpD9(void) // ADCB DP
-{
- tmp = RdMem((dpr<<8)|Fetch());
- addr = (WORD)br + (WORD)tmp + (WORD)(ccr&0x01);
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((br^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((br^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- br = addr; // Set accumulator
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 4;
-}
-void OpDA(void) // ORB DP
- {
- br |= RdMem((dpr<<8)|Fetch());
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpDB(void) // ADDB DP
-{
- tmp = RdMem((dpr<<8)|Fetch());
- addr = (WORD)br + (WORD)tmp;
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((br^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((br^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- br = addr & 0xFF; // Set accumulator
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 4;
-}
-void OpDC(void) // LDD DP
-{
- addr = (dpr<<8)|Fetch();
- ar = RdMem(addr); br = RdMem(addr+1);
- ccr &= 0xFD; // CLV
- ((ar|br) == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpDD(void) // STD DP
-{
- addr = (dpr<<8)|Fetch();
- WrMem(addr, ar); WrMem(addr+1, br);
- ccr &= 0xFD; // CLV
- ((ar|br) == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpDE(void) // LDU DP
-{
- addr = (dpr<<8)|Fetch();
- ur = (RdMem(addr) << 8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (ur == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ur&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpDF(void) // STU DP
-{
- addr = (dpr<<8)|Fetch();
- WrMem(addr, ur>>8); WrMem(addr+1, ur&0xFF);
- ccr &= 0xFD; // CLV
- (ur == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ur&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
-}
-void OpE0(void) // SUBB IDX
-{
- tmp = RdMem(DecodeIDX(Fetch())); BYTE bs = br;
- br -= tmp;
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (bs < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((bs^tmp^br^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 4;
-}
-void OpE1(void) // CMPB IDX
-{
- tmp = RdMem(DecodeIDX(Fetch()));
- BYTE db = br - tmp;
- (db == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (db&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (br < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((br^tmp^db^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 4;
-}
-void OpE2(void) // SBCB IDX
-{
- tmp = RdMem(DecodeIDX(Fetch())); BYTE bs = br;
- br = br - tmp - (ccr&0x01);
- (bs < (tmp+(ccr&0x01)) ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((bs^tmp^br^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
-}
-void OpE3(void) // ADDD IDX
-{
- addr = DecodeIDX(Fetch()); long dr = ((ar<<8)|br)&0xFFFF, ds = dr;
- WORD adr2 = (RdMem(addr)<<8)|RdMem(addr+1);
- dr += adr2;
- (dr > 0xFFFF ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- dr &= 0xFFFF;
- (dr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- ((ds^adr2^dr^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- ar = dr>>8; br = dr&0xFF;
- iclock += 6;
-}
-void OpE4(void) // ANDB IDX
- {
- br &= RdMem(DecodeIDX(Fetch()));
- ccr &= 0xFD; // Clear oVerflow flag
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpE5(void) // BITB IDX
- {
- tmp = br & RdMem(DecodeIDX(Fetch()));
- ccr &= 0xFD; // Clear oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpE6(void) // LDB IDX
- {
- br = RdMem(DecodeIDX(Fetch()));
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpE7(void) // STB IDX
-{
- WrMem(DecodeIDX(Fetch()), br);
- ccr &= 0xF1; // CLV CLZ CLN
- if (br == 0) ccr |= 0x04; // Adjust Zero flag
- if (br&0x80) ccr |= 0x08; // Adjust Negative flag
- iclock += 4;
-}
-void OpE8(void) // EORB IDX
- {
- br ^= RdMem(DecodeIDX(Fetch()));
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpE9(void) // ADCB IDX
-{
- tmp = RdMem(DecodeIDX(Fetch()));
- addr = (WORD)br + (WORD)tmp + (WORD)(ccr&0x01);
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((br^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((br^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- br = addr; // Set accumulator
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 4;
-}
-void OpEA(void) // ORB IDX
- {
- br |= RdMem(DecodeIDX(Fetch()));
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void OpEB(void) // ADDB IDX
-{
- tmp = RdMem(DecodeIDX(Fetch()));
- addr = (WORD)br + (WORD)tmp;
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((br^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((br^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- br = addr; // Set accumulator
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 4;
-}
-void OpEC(void) // LDD IDX
-{
- addr = DecodeIDX(Fetch());
- ar = RdMem(addr); br = RdMem(addr+1);
- ccr &= 0xF1; // CLV CLZ CLN
- if (!(ar|br)) ccr |= 0x04; // Adjust Zero flag
- if (ar&0x80) ccr |= 0x08; // Adjust Negative flag
- iclock += 5;
-}
-void OpED(void) // STD IDX
-{
- addr = DecodeIDX(Fetch());
- WrMem(addr, ar); WrMem(addr+1, br);
- ccr &= 0xF1; // CLV CLZ CLZ
- if (!(ar|br)) ccr |= 0x04; // Adjust Zero flag
- if (ar&0x80) ccr |= 0x08; // Adjust Negative flag
- iclock += 5;
-}
-void OpEE(void) // LDU IDX
-{
- addr = DecodeIDX(Fetch());
- ur = (RdMem(addr) << 8) | RdMem(addr+1);
- ccr &= 0xF1; // CLV CLZ CLN
- if (ur == 0) ccr |= 0x04; // Set Zero flag
- if (ur&0x8000) ccr |= 0x08; // Set Negative flag
- iclock += 5;
-}
-void OpEF(void) // STU IDX
-{
- addr = DecodeIDX(Fetch());
- WrMem(addr, ur>>8); WrMem(addr+1, ur&0xFF);
- ccr &= 0xF1; // CLV CLZ CLN
- if (ur == 0) ccr |= 0x04; // Set Zero flag
- if (ur&0x8000) ccr |= 0x08; // Set Negative flag
- iclock += 5;
-}
-void OpF0(void) // SUBB ABS
- {
- tmp = RdMem(FetchW()); BYTE bs = br;
- br -= tmp;
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (bs < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((bs^tmp^br^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- }
-void OpF1(void) // CMPB ABS
- {
- tmp = RdMem(FetchW());
- BYTE db = br - tmp;
- (db == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (db&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (br < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((br^tmp^db^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 5;
- }
-void OpF2(void) // SBCB ABS
-{
- tmp = RdMem(FetchW()); BYTE bs = br;
- br = br - tmp - (ccr&0x01);
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (bs < tmp ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((bs^tmp^br^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflow
- iclock += 5;
-}
-void OpF3(void) // ADDD ABS
-{
- addr = FetchW(); long dr = ((ar<<8)|br)&0xFFFF, ds = dr;
- WORD adr2 = (RdMem(addr)<<8)|RdMem(addr+1);
- dr += adr2;
- (dr > 0xFFFF ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- dr &= 0xFFFF;
- (dr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- ((ds^adr2^dr^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- ar = dr>>8; br = dr&0xFF;
- iclock += 7;
-}
-void OpF4(void) // ANDB ABS
- {
- br &= RdMem(FetchW());
- ccr &= 0xFD; // Clear oVerflow flag
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
- }
-void OpF5(void) // BITB ABS
- {
- tmp = br & RdMem(FetchW());
- ccr &= 0xFD; // Clear oVerflow flag
- (tmp == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (tmp&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
- }
-void OpF6(void) // LDB ABS
- {
- br = RdMem(FetchW());
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
- }
-void OpF7(void) // STB ABS
- {
- WrMem(FetchW(), br);
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
- }
-void OpF8(void) // EORB ABS
- {
- br ^= RdMem(FetchW());
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
- }
-void OpF9(void) // ADCB ABS
-{
- tmp = RdMem(FetchW());
- addr = (WORD)br + (WORD)tmp + (WORD)(ccr&0x01);
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((br^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((br^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflo
- br = addr & 0xFF; // Set accumulator
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 5;
-}
-void OpFA(void) // ORB ABS
- {
- br |= RdMem(FetchW());
- ccr &= 0xFD; // CLV
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 5;
- }
-void OpFB(void) // ADDB ABS
-{
- tmp = RdMem(FetchW());
- addr = (WORD)br + (WORD)tmp;
- (addr > 0x00FF ? ccr |= 0x01 : ccr &= 0xFE); // Set Carry flag
- ((br^tmp^addr)&0x10 ? ccr |= 0x20 : ccr &= 0xDF); // Set Half carry
- ((br^tmp^addr^(ccr<<7))&0x80 ? ccr |= 0x02 : ccr &= 0xFD); // oVerflo
- br = addr & 0xFF; // Set accumulator
- (br == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Set Zero flag
- (br&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Set Negative flag
- iclock += 5;
-}
-void OpFC(void) // LDD ABS
- {
- addr = FetchW();
- ar = RdMem(addr); br = RdMem(addr+1);
- ccr &= 0xFD; // CLV
- ((ar+br) == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void OpFD(void) // STD ABS
- {
- addr = FetchW();
- WrMem(addr, ar); WrMem(addr+1, br);
- ccr &= 0xFD; // CLV
- ((ar+br) == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ar&0x80 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void OpFE(void) // LDU ABS
- {
- addr = FetchW();
- ur = (RdMem(addr) << 8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (ur == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ur&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void OpFF(void) // STU ABS
- {
- addr = FetchW();
- WrMem(addr, ur>>8); WrMem(addr+1, ur&0xFF);
- ccr &= 0xFD; // CLV
- (ur == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (ur&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-
-//
-// Page one opcodes' execute code
-//
-
-void Op1021(void) // LBRN
-{
- addr = FetchW();
- iclock += 5;
-}
-void Op1022(void) // LBHI
-{
- addr = FetchW();
- if (!((ccr&0x01)|(ccr&0x04))) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op1023(void) // LBLS
-{
- addr = FetchW();
- if ((ccr&0x01)|(ccr&0x04)) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op1024(void) // LBCC (LBHS)
-{
- addr = FetchW();
- if (!(ccr&0x01)) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op1025(void) // LBCS (LBLO)
-{
- addr = FetchW();
- if (ccr&0x01) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op1026(void) // LBNE
-{
- addr = FetchW();
- if (!(ccr&0x04)) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op1027(void) // LBEQ
-{
- addr = FetchW();
- if (ccr&0x04) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op1028(void) // LBVC
-{
- addr = FetchW();
- if (!(ccr&0x02)) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op1029(void) // LBVS
-{
- addr = FetchW();
- if (ccr&0x02) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op102A(void) // LBPL
-{
- addr = FetchW();
- if (!(ccr&0x08)) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op102B(void) // LBMI
-{
- addr = FetchW();
- if (ccr&0x08) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op102C(void) // LBGE
-{
- addr = FetchW();
- if (!(((ccr&0x08) >> 2) ^ (ccr&0x02))) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op102D(void) // LBLT
-{
- addr = FetchW();
- if (((ccr&0x08) >> 2) ^ (ccr&0x02)) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op102E(void) // LBGT
-{
- addr = FetchW();
- if (!((ccr&0x04) | (((ccr&0x08) >> 2) ^ (ccr&0x02)))) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op102F(void) // LBLE
-{
- addr = FetchW();
- if ((ccr&0x04) | (((ccr&0x08) >> 2) ^ (ccr&0x02))) pcr += SignedW(addr);
- iclock += 5;
-}
-void Op103F(void) // SWI2 (Not yet implemented)
-{
- iclock += 20;
-}
-void Op1083(void) // CMPD #
- {
- addr = FetchW(); WORD dr = (ar<<8)|br;
- WORD dw = dr - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (dr < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((dr^addr^dw^((WORD)ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 5;
- }
-void Op108C(void) // CMPY #
- {
- addr = FetchW();
- WORD dw = yr - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (yr < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((yr^addr^dw^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 5;
- }
-void Op108E(void) // LDY #
- {
- yr = FetchW();
- ccr &= 0xFD; // CLV
- (yr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (yr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void Op1093(void) // CMPD DP
- {
- WORD adr2 = (dpr<<8)|Fetch(), dr = (ar<<8)|br;
- addr = (RdMem(adr2)<<8) | RdMem(adr2+1);
- WORD dw = dr - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (dr < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((dr^addr^dw^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 7;
- }
-void Op109C(void) // CMPY DP
- {
- WORD adr2 = (dpr<<8)|Fetch();
- addr = (RdMem(adr2)<<8) | RdMem(adr2+1);
- WORD dw = yr - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (yr < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- ((yr^addr^dw^(ccr<<15))&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 7;
- }
-void Op109E(void) // LDY DP
- {
- addr = (dpr<<8)|Fetch();
- yr = (RdMem(addr)<<8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (yr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (yr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op109F(void) // STY DP
- {
- addr = (dpr<<8)|Fetch();
- WrMem(addr, yr>>8); WrMem(addr+1, yr&0xFF);
- ccr &= 0xFD; // CLV
- (yr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (yr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op10A3(void) // CMPD IDX
-{
- WORD adr2 = DecodeIDX(Fetch()), dr = (ar<<8)|br;
- addr = (RdMem(adr2)<<8) | RdMem(adr2+1);
- WORD dw = dr - addr;
- ccr &= 0xF0; // CLC CLV CLZ CLN
- if (dr < addr) ccr |= 0x01; // Set Carry flag
- if ((dr^addr^dw^(ccr<<15))&0x8000) ccr |= 0x02; // Set oVerflow
- if (dw == 0) ccr |= 0x04; // Set Zero flag
- if (dw&0x8000) ccr |= 0x08; // Set Negative flag
- iclock += 7;
-}
-void Op10AC(void) // CMPY IDX
- {
- WORD adr2 = DecodeIDX(Fetch());
- addr = (RdMem(adr2)<<8) | RdMem(adr2+1);
- WORD dw = yr - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (yr < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^yr^addr^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 7;
- }
-void Op10AE(void) // LDY IDX
-{
- addr = DecodeIDX(Fetch());
- yr = (RdMem(addr)<<8) | RdMem(addr+1);
- ccr &= 0xF1; // CLV CLZ CLN
- if (yr == 0) ccr |= 0x04; // Adjust Zero flag
- if (yr&0x8000) ccr |= 0x08; // Adjust Negative flag
- iclock += 6;
-}
-void Op10AF(void) // STY IDX
- {
- addr = DecodeIDX(Fetch());
- WrMem(addr, yr>>8); WrMem(addr+1, yr&0xFF);
- ccr &= 0xFD; // CLV
- (yr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (yr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op10B3(void) // CMPD ABS
- {
- addr = FetchW(); WORD dr = (ar<<8)|br;
- WORD addr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- WORD dw = dr - addr2;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (dr < addr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^dr^addr2^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 8;
- }
-void Op10BC(void) // CMPY ABS
- {
- addr = FetchW(); WORD addr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- WORD dw = yr - addr2;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (yr < addr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^yr^addr2^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 8;
- }
-void Op10BE(void) // LDY ABS
- {
- addr = FetchW();
- yr = (RdMem(addr)<<8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (yr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (yr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
- }
-void Op10BF(void) // STY ABS
- {
- addr = FetchW();
- WrMem(addr, yr>>8); WrMem(addr+1, yr&0xFF);
- ccr &= 0xFD; // CLV
- (yr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (yr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
- }
-void Op10CE(void) // LDS #
- {
- sr = FetchW();
- ccr &= 0xFD; // CLV
- (sr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (sr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 4;
- }
-void Op10DE(void) // LDS DP
- {
- addr = (dpr<<8)|Fetch();
- sr = (RdMem(addr)<<8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (sr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (sr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op10DF(void) // STS DP
- {
- addr = (dpr<<8)|Fetch();
- WrMem(addr, sr>>8); WrMem(addr+1, sr&0xFF);
- ccr &= 0xFD; // CLV
- (sr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (sr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op10EE(void) // LDS IDX
- {
- addr = DecodeIDX(Fetch());
- sr = (RdMem(addr)<<8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (sr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (sr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op10EF(void) // STS IDX
- {
- addr = DecodeIDX(Fetch());
- WrMem(addr, sr>>8); WrMem(addr+1, sr&0xFF);
- ccr &= 0xFD; // CLV
- (sr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (sr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 6;
- }
-void Op10FE(void) // LDS ABS
- {
- addr = FetchW();
- sr = (RdMem(addr)<<8) | RdMem(addr+1);
- ccr &= 0xFD; // CLV
- (sr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (sr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
- }
-void Op10FF(void) // STS ABS
-{
- addr = FetchW();
- WrMem(addr, sr>>8); WrMem(addr+1, sr&0xFF);
- ccr &= 0xFD; // CLV
- (sr == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (sr&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- iclock += 7;
-}
-
-//
-// Page two opcodes' execute code
-//
-
-void Op113F(void) // SWI3
- {
- iclock += 20;
- }
-void Op1183(void) // CMPU #
- {
- addr = FetchW();
- WORD dw = ur - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (ur < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^ur^addr^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 5;
- }
-void Op118C(void) // CMPS #
- {
- addr = FetchW();
- WORD dw = sr - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (sr < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^sr^addr^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 5;
- }
-void Op1193(void) // CMPU DP
- {
- WORD adr2 = (dpr<<8)|Fetch();
- addr = (RdMem(adr2)<<8) | RdMem(adr2+1);
- WORD dw = ur - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (ur < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^ur^addr^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 7;
- }
-void Op119C(void) // CMPS DP
- {
- WORD adr2 = (dpr<<8)|Fetch();
- addr = (RdMem(adr2)<<8) | RdMem(adr2+1);
- WORD dw = sr - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (sr < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^sr^addr^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 7;
- }
-void Op11A3(void) // CMPU IDX
- {
- WORD addr2 = DecodeIDX(Fetch());
- addr = (RdMem(addr2)<<8) | RdMem(addr2+1);
- WORD dw = ur - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (ur < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^ur^addr^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 7;
- }
-void Op11AC(void) // CMPS IDX
- {
- WORD addr2 = DecodeIDX(Fetch());
- addr = (RdMem(addr2)<<8) | RdMem(addr2+1);
- WORD dw = sr - addr;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (sr < addr ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^sr^addr^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 7;
- }
-void Op11B3(void) // CMPU ABS
- {
- addr = FetchW(); WORD addr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- WORD dw = ur - addr2;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (ur < addr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^ur^addr2^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 8;
- }
-
-void Op11BC(void) // CMPS ABS
-{
- addr = FetchW(); WORD addr2 = (RdMem(addr)<<8) | RdMem(addr+1);
- WORD dw = sr - addr2;
- (dw == 0 ? ccr |= 0x04 : ccr &= 0xFB); // Adjust Zero flag
- (dw&0x8000 ? ccr |= 0x08 : ccr &= 0xF7); // Adjust Negative flag
- (sr < addr2 ? ccr |= 0x01 : ccr &= 0xFE); // Adjust Carry flag
- (((ccr<<15)^sr^addr2^dw)&0x8000 ? ccr |= 0x02 : ccr &= 0xFD); // oVerfl
- iclock += 8;
-}
-
-void IllegalOp(void)
-{
- iclock++;
- illegal = true;
-}
-
-void Op__(void)
-{
- iclock++;
- illegal = true;
-}
-
-//
-// Function arrays
-//
-
-// Array of page zero opcode functions...
-void (* exec_op0[256])() = {
- Op00, Op__, Op__, Op03, Op04, Op__, Op06, Op07, Op08, Op09, Op0A, Op__, Op0C, Op0D, Op0E, Op0F,
- Op__, Op__, Op12, Op13, Op__, Op__, Op16, Op17, Op__, Op19, Op1A, Op__, Op1C, Op1D, Op1E, Op1F,
- Op20, Op21, Op22, Op23, Op24, Op25, Op26, Op27, Op28, Op29, Op2A, Op2B, Op2C, Op2D, Op2E, Op2F,
- Op30, Op31, Op32, Op33, Op34, Op35, Op36, Op37, Op__, Op39, Op3A, Op3B, Op3C, Op3D, Op3E, Op3F,
- Op40, Op__, Op__, Op43, Op44, Op__, Op46, Op47, Op48, Op49, Op4A, Op__, Op4C, Op4D, Op__, Op4F,
- Op50, Op__, Op__, Op53, Op54, Op__, Op56, Op57, Op58, Op59, Op5A, Op__, Op5C, Op5D, Op__, Op5F,
- Op60, Op__, Op__, Op63, Op64, Op__, Op66, Op67, Op68, Op69, Op6A, Op__, Op6C, Op6D, Op6E, Op6F,
- Op70, Op__, Op__, Op73, Op74, Op__, Op76, Op77, Op78, Op79, Op7A, Op__, Op7C, Op7D, Op7E, Op7F,
- Op80, Op81, Op82, Op83, Op84, Op85, Op86, Op__, Op88, Op89, Op8A, Op8B, Op8C, Op8D, Op8E, Op__,
- Op90, Op91, Op92, Op93, Op94, Op95, Op96, Op97, Op98, Op99, Op9A, Op9B, Op9C, Op9D, Op9E, Op9F,
- OpA0, OpA1, OpA2, OpA3, OpA4, OpA5, OpA6, OpA7, OpA8, OpA9, OpAA, OpAB, OpAC, OpAD, OpAE, OpAF,
- OpB0, OpB1, OpB2, OpB3, OpB4, OpB5, OpB6, OpB7, OpB8, OpB9, OpBA, OpBB, OpBC, OpBD, OpBE, OpBF,
- OpC0, OpC1, OpC2, OpC3, OpC4, OpC5, OpC6, Op__, OpC8, OpC9, OpCA, OpCB, OpCC, Op__, OpCE, Op__,
- OpD0, OpD1, OpD2, OpD3, OpD4, OpD5, OpD6, OpD7, OpD8, OpD9, OpDA, OpDB, OpDC, OpDD, OpDE, OpDF,
- OpE0, OpE1, OpE2, OpE3, OpE4, OpE5, OpE6, OpE7, OpE8, OpE9, OpEA, OpEB, OpEC, OpED, OpEE, OpEF,
- OpF0, OpF1, OpF2, OpF3, OpF4, OpF5, OpF6, OpF7, OpF8, OpF9, OpFA, OpFB, OpFC, OpFD, OpFE, OpFF
-};
-
-// Array of page one opcode functions...
-void (* exec_op1[256])() = {
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op1021, Op1022, Op1023, Op1024, Op1025, Op1026, Op1027, Op1028, Op1029, Op102A, Op102B, Op102C, Op102D, Op102E, Op102F,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op103F,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op1083, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op108C, Op__, Op108E, Op__,
- Op__, Op__, Op__, Op1093, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op109C, Op__, Op109E, Op109F,
- Op__, Op__, Op__, Op10A3, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op10AC, Op__, Op10AE, Op10AF,
- Op__, Op__, Op__, Op10B3, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op10BC, Op__, Op10BE, Op10BF,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op10CE, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op10DE, Op10DF,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op10EE, Op10EF,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op10FE, Op10FF
-};
-// Array of page two opcode functions...
-void (* exec_op2[256])() = {
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op113F,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op1183, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op118C, Op__, Op__, Op__,
- Op__, Op__, Op__, Op1193, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op119C, Op__, Op__, Op__,
- Op__, Op__, Op__, Op11A3, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op11AC, Op__, Op__, Op__,
- Op__, Op__, Op__, Op11B3, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op11BC, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__,
- Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__, Op__
-};
-
-//
-// Initialize 6809 function adressess
-//
-
-void Init_6809(void)
-{
- return;
-/*
- for(int i=0; i<256; i++) // Set all functions to illegal
- exec_op0[i] = exec_op1[i] = exec_op2[i] = IllegalOp;
-
- exec_op0[0x00] = Op00; exec_op0[0x03] = Op03; exec_op0[0x04] = Op04;
- exec_op0[0x06] = Op06; exec_op0[0x07] = Op07; exec_op0[0x08] = Op08;
- exec_op0[0x09] = Op09; exec_op0[0x0A] = Op0A; exec_op0[0x0C] = Op0C;
- exec_op0[0x0D] = Op0D; exec_op0[0x0E] = Op0E; exec_op0[0x0F] = Op0F;
- exec_op0[0x12] = Op12; exec_op0[0x13] = Op13; exec_op0[0x16] = Op16;
- exec_op0[0x17] = Op17; exec_op0[0x19] = Op19; exec_op0[0x1A] = Op1A;
- exec_op0[0x1C] = Op1C; exec_op0[0x1D] = Op1D; exec_op0[0x1E] = Op1E;
- exec_op0[0x1F] = Op1F; exec_op0[0x20] = Op20; exec_op0[0x21] = Op21;
- exec_op0[0x22] = Op22; exec_op0[0x23] = Op23; exec_op0[0x24] = Op24;
- exec_op0[0x25] = Op25; exec_op0[0x26] = Op26; exec_op0[0x27] = Op27;
- exec_op0[0x28] = Op28; exec_op0[0x29] = Op29; exec_op0[0x2A] = Op2A;
- exec_op0[0x2B] = Op2B; exec_op0[0x2C] = Op2C; exec_op0[0x2D] = Op2D;
- exec_op0[0x2E] = Op2E; exec_op0[0x2F] = Op2F; exec_op0[0x30] = Op30;
- exec_op0[0x31] = Op31; exec_op0[0x32] = Op32; exec_op0[0x33] = Op33;
- exec_op0[0x34] = Op34; exec_op0[0x35] = Op35; exec_op0[0x36] = Op36;
- exec_op0[0x37] = Op37; exec_op0[0x39] = Op39; exec_op0[0x3A] = Op3A;
- exec_op0[0x3B] = Op3B; exec_op0[0x3C] = Op3C; exec_op0[0x3D] = Op3D;
- exec_op0[0x3E] = Op3E; exec_op0[0x3F] = Op3F; exec_op0[0x40] = Op40;
- exec_op0[0x43] = Op43; exec_op0[0x44] = Op44; exec_op0[0x46] = Op46;
- exec_op0[0x47] = Op47; exec_op0[0x48] = Op48; exec_op0[0x49] = Op49;
- exec_op0[0x4A] = Op4A; exec_op0[0x4C] = Op4C; exec_op0[0x4D] = Op4D;
- exec_op0[0x4F] = Op4F; exec_op0[0x50] = Op50; exec_op0[0x53] = Op53;
- exec_op0[0x54] = Op54; exec_op0[0x56] = Op56; exec_op0[0x57] = Op57;
- exec_op0[0x58] = Op58; exec_op0[0x59] = Op59; exec_op0[0x5A] = Op5A;
- exec_op0[0x5C] = Op5C; exec_op0[0x5D] = Op5D; exec_op0[0x5F] = Op5F;
- exec_op0[0x60] = Op60; exec_op0[0x63] = Op63; exec_op0[0x64] = Op64;
- exec_op0[0x66] = Op66; exec_op0[0x67] = Op67; exec_op0[0x68] = Op68;
- exec_op0[0x69] = Op69; exec_op0[0x6A] = Op6A; exec_op0[0x6C] = Op6C;
- exec_op0[0x6D] = Op6D; exec_op0[0x6E] = Op6E; exec_op0[0x6F] = Op6F;
- exec_op0[0x70] = Op70; exec_op0[0x73] = Op73; exec_op0[0x74] = Op74;
- exec_op0[0x76] = Op76; exec_op0[0x77] = Op77; exec_op0[0x78] = Op78;
- exec_op0[0x79] = Op79; exec_op0[0x7A] = Op7A; exec_op0[0x7C] = Op7C;
- exec_op0[0x7D] = Op7D; exec_op0[0x7E] = Op7E; exec_op0[0x7F] = Op7F;
- exec_op0[0x80] = Op80; exec_op0[0x81] = Op81; exec_op0[0x82] = Op82;
- exec_op0[0x83] = Op83; exec_op0[0x84] = Op84; exec_op0[0x85] = Op85;
- exec_op0[0x86] = Op86; exec_op0[0x88] = Op88; exec_op0[0x89] = Op89;
- exec_op0[0x8A] = Op8A; exec_op0[0x8B] = Op8B; exec_op0[0x8C] = Op8C;
- exec_op0[0x8D] = Op8D; exec_op0[0x8E] = Op8E; exec_op0[0x90] = Op90;
- exec_op0[0x91] = Op91; exec_op0[0x92] = Op92; exec_op0[0x93] = Op93;
- exec_op0[0x94] = Op94; exec_op0[0x95] = Op95; exec_op0[0x96] = Op96;
- exec_op0[0x97] = Op97; exec_op0[0x98] = Op98; exec_op0[0x99] = Op99;
- exec_op0[0x9A] = Op9A; exec_op0[0x9B] = Op9B; exec_op0[0x9C] = Op9C;
- exec_op0[0x9D] = Op9D; exec_op0[0x9E] = Op9E; exec_op0[0x9F] = Op9F;
- exec_op0[0xA0] = OpA0; exec_op0[0xA1] = OpA1; exec_op0[0xA2] = OpA2;
- exec_op0[0xA3] = OpA3; exec_op0[0xA4] = OpA4; exec_op0[0xA5] = OpA5;
- exec_op0[0xA6] = OpA6; exec_op0[0xA7] = OpA7; exec_op0[0xA8] = OpA8;
- exec_op0[0xA9] = OpA9; exec_op0[0xAA] = OpAA; exec_op0[0xAB] = OpAB;
- exec_op0[0xAC] = OpAC; exec_op0[0xAD] = OpAD; exec_op0[0xAE] = OpAE;
- exec_op0[0xAF] = OpAF; exec_op0[0xB0] = OpB0; exec_op0[0xB1] = OpB1;
- exec_op0[0xB2] = OpB2; exec_op0[0xB3] = OpB3; exec_op0[0xB4] = OpB4;
- exec_op0[0xB5] = OpB5; exec_op0[0xB6] = OpB6; exec_op0[0xB7] = OpB7;
- exec_op0[0xB8] = OpB8; exec_op0[0xB9] = OpB9; exec_op0[0xBA] = OpBA;
- exec_op0[0xBB] = OpBB; exec_op0[0xBC] = OpBC; exec_op0[0xBD] = OpBD;
- exec_op0[0xBE] = OpBE; exec_op0[0xBF] = OpBF; exec_op0[0xC0] = OpC0;
- exec_op0[0xC1] = OpC1; exec_op0[0xC2] = OpC2; exec_op0[0xC3] = OpC3;
- exec_op0[0xC4] = OpC4; exec_op0[0xC5] = OpC5; exec_op0[0xC6] = OpC6;
- exec_op0[0xC8] = OpC8; exec_op0[0xC9] = OpC9; exec_op0[0xCA] = OpCA;
- exec_op0[0xCB] = OpCB; exec_op0[0xCC] = OpCC; exec_op0[0xCE] = OpCE;
- exec_op0[0xD0] = OpD0; exec_op0[0xD1] = OpD1; exec_op0[0xD2] = OpD2;
- exec_op0[0xD3] = OpD3; exec_op0[0xD4] = OpD4; exec_op0[0xD5] = OpD5;
- exec_op0[0xD6] = OpD6; exec_op0[0xD7] = OpD7; exec_op0[0xD8] = OpD8;
- exec_op0[0xD9] = OpD9; exec_op0[0xDA] = OpDA; exec_op0[0xDB] = OpDB;
- exec_op0[0xDC] = OpDC; exec_op0[0xDD] = OpDD; exec_op0[0xDE] = OpDE;
- exec_op0[0xDF] = OpDF; exec_op0[0xE0] = OpE0; exec_op0[0xE1] = OpE1;
- exec_op0[0xE2] = OpE2; exec_op0[0xE3] = OpE3; exec_op0[0xE4] = OpE4;
- exec_op0[0xE5] = OpE5; exec_op0[0xE6] = OpE6; exec_op0[0xE7] = OpE7;
- exec_op0[0xE8] = OpE8; exec_op0[0xE9] = OpE9; exec_op0[0xEA] = OpEA;
- exec_op0[0xEB] = OpEB; exec_op0[0xEC] = OpEC; exec_op0[0xED] = OpED;
- exec_op0[0xEE] = OpEE; exec_op0[0xEF] = OpEF; exec_op0[0xF0] = OpF0;
- exec_op0[0xF1] = OpF1; exec_op0[0xF2] = OpF2; exec_op0[0xF3] = OpF3;
- exec_op0[0xF4] = OpF4; exec_op0[0xF5] = OpF5; exec_op0[0xF6] = OpF6;
- exec_op0[0xF7] = OpF7; exec_op0[0xF8] = OpF8; exec_op0[0xF9] = OpF9;
- exec_op0[0xFA] = OpFA; exec_op0[0xFB] = OpFB; exec_op0[0xFC] = OpFC;
- exec_op0[0xFD] = OpFD; exec_op0[0xFE] = OpFE; exec_op0[0xFF] = OpFF;
-
- exec_op1[0x21] = Op1021; exec_op1[0x22] = Op1022; exec_op1[0x23] = Op1023;
- exec_op1[0x24] = Op1024; exec_op1[0x25] = Op1025; exec_op1[0x26] = Op1026;
- exec_op1[0x27] = Op1027; exec_op1[0x28] = Op1028; exec_op1[0x29] = Op1029;
- exec_op1[0x2A] = Op102A; exec_op1[0x2B] = Op102B; exec_op1[0x2C] = Op102C;
- exec_op1[0x2D] = Op102D; exec_op1[0x2E] = Op102E; exec_op1[0x2F] = Op102F;
- exec_op1[0x3F] = Op103F; exec_op1[0x83] = Op1083; exec_op1[0x8C] = Op108C;
- exec_op1[0x8E] = Op108E; exec_op1[0x93] = Op1093; exec_op1[0x9C] = Op109C;
- exec_op1[0x9E] = Op109E; exec_op1[0x9F] = Op109F; exec_op1[0xA3] = Op10A3;
- exec_op1[0xAC] = Op10AC; exec_op1[0xAE] = Op10AE; exec_op1[0xAF] = Op10AF;
- exec_op1[0xB3] = Op10B3; exec_op1[0xBC] = Op10BC; exec_op1[0xBE] = Op10BE;
- exec_op1[0xBF] = Op10BF; exec_op1[0xCE] = Op10CE; exec_op1[0xDE] = Op10DE;
- exec_op1[0xDF] = Op10DF; exec_op1[0xEE] = Op10EE; exec_op1[0xEF] = Op10EF;
- exec_op1[0xFE] = Op10FE; exec_op1[0xFF] = Op10FF;
-
- exec_op2[0x3F] = Op113F; exec_op2[0x83] = Op1183; exec_op2[0x8C] = Op118C;
- exec_op2[0x93] = Op1193; exec_op2[0x9C] = Op119C; exec_op2[0xA3] = Op11A3;
- exec_op2[0xAC] = Op11AC; exec_op2[0xB3] = Op11B3; exec_op2[0xBC] = Op11BC;*/
-}
-
-//
-// Function to execute one 6809 instruction
-//
-
-void Execute_6809(long num_of_instrs_to_exec)
-{
- for(long i=0; i<num_of_instrs_to_exec; i++)
- {
- if (pcr == 0x164A) inter = false; // Ugly temp fix...
-
- BYTE opcode = Fetch(); // Get the opcode
- if (opcode == 0x10) { exec_op1[Fetch()](); goto EXE_NEXT; }
- if (opcode == 0x11) { exec_op2[Fetch()](); goto EXE_NEXT; }
- exec_op0[opcode]();
- EXE_NEXT:
-
- if (iclock > 2177)
- {
- iclock = 0;
- if (!(ccr&0x10) && (!inter)) // Process an interrupt?
- {
- inter = true;
- ccr |= 0x80; // Set E
- WrMem(--sr, pcr&0xFF); WrMem(--sr, pcr>>8); // Save all regs...
- WrMem(--sr, ur&0xFF); WrMem(--sr, ur>>8);
- WrMem(--sr, yr&0xFF); WrMem(--sr, yr>>8);
- WrMem(--sr, xr&0xFF); WrMem(--sr, xr>>8);
- WrMem(--sr, dpr); WrMem(--sr, br);
- WrMem(--sr, ar); WrMem(--sr, ccr);
- ccr |= 0x50; // Set F,I
- pcr = (RdMem(0xFFF8)<<8) | RdMem(0xFFF9); // And do it!
-// ram[0xCB00] += 64; // Set to 64 for faster updates...
- }
- }
- }
-}
-
-void Execute6809(V6809REGS * context, DWORD cycles)
-{
- memcpy(®s, context, sizeof(V6809REGS));
-
- // Execute here...
-
- memcpy(context, ®s, sizeof(V6809REGS));
-}