Annotation of hatari/src/hd6301_cpu.c, revision 1.1.1.1

1.1       root        1: /*
                      2:   Hatari - hd6301_cpu.c
                      3:   Copyright Laurent Sallafranque 2009
                      4: 
                      5:   This file is distributed under the GNU Public License, version 2 or at
                      6:   your option any later version. Read the file gpl.txt for details.
                      7: 
                      8:   hd6301_cpu.c - this is the cpu core emulation for hd 6301 processor
                      9: */
                     10: 
                     11: #ifdef HAVE_CONFIG_H
                     12: #include "config.h"
                     13: #endif
                     14: 
                     15: #include <string.h>
                     16: #include <SDL.h>
                     17: 
                     18: #include "hd6301_cpu.h"
                     19: 
                     20: 
                     21: /**********************************
                     22:  *     Defines
                     23:  **********************************/
                     24: #define HD6301_DISASM          1
                     25: #define HD6301_DISPLAY_REGS    1
                     26: 
                     27: /* HD6301 Disasm and debug code */
                     28: #define HD6301_DISASM_UNDEFINED                0
                     29: #define HD6301_DISASM_NONE             1
                     30: #define HD6301_DISASM_MEMORY8          2
                     31: #define HD6301_DISASM_MEMORY16         3
                     32: #define HD6301_DISASM_XIM              4
                     33: 
                     34: /* CCR bits for clearing */
                     35: 
                     36: #define HD6301_CLR_HNZVC       hd6301_reg_CCR &= 0xd0
                     37: #define HD6301_CLR_HNZC                hd6301_reg_CCR &= 0xd2
                     38: #define HD6301_CLR_NZVC                hd6301_reg_CCR &= 0xf0
                     39: #define HD6301_CLR_NZV         hd6301_reg_CCR &= 0xf1
                     40: #define HD6301_CLR_NZC         hd6301_reg_CCR &= 0xf2
                     41: #define HD6301_CLR_ZC          hd6301_reg_CCR &= 0xfa
                     42: #define HD6301_CLR_I           hd6301_reg_CCR &= 0xef
                     43: #define HD6301_CLR_Z           hd6301_reg_CCR &= 0xfb
                     44: #define HD6301_CLR_V           hd6301_reg_CCR &= 0xfd
                     45: #define HD6301_CLR_C           hd6301_reg_CCR &= 0xfe
                     46: 
                     47: 
                     48: /**********************************
                     49:  *     macros for CCR processing
                     50:  *     adapted from mame project
                     51:  **********************************/
                     52: #define HD6301_SET_Z8(a)       hd6301_reg_CCR |= (((Uint8)(a) == 0) << 1)
                     53: #define HD6301_SET_Z16(a)      hd6301_reg_CCR |= (((Uint16)(a) == 0) << 1)
                     54: #define HD6301_SET_N8(a)       hd6301_reg_CCR |= (((a) & 0x80) >> 4)
                     55: #define HD6301_SET_N16(a)      hd6301_reg_CCR |= (((a) & 0x8000) >> 12)
                     56: #define HD6301_SET_C8(a)       hd6301_reg_CCR |= (((a) & 0x100) >> 8)
                     57: #define HD6301_SET_C16(a)      hd6301_reg_CCR |= (((a) & 0x10000) >> 16)
                     58: #define HD6301_SET_V8(a,b,r)   hd6301_reg_CCR |= ((((a)^(b)^(r)^((r)>>1)) & 0x80) >> 6)
                     59: #define HD6301_SET_V16(a,b,r)  hd6301_reg_CCR |= ((((a)^(b)^(r)^((r)>>1)) & 0x8000) >> 14)
                     60: #define HD6301_SET_H(a,b,r)    hd6301_reg_CCR |= ((((a)^(b)^(r)) & 0x10) << 1)
                     61: 
                     62: 
                     63: #define HD6301_SET_NZ8(a)              {HD6301_SET_N8(a);HD6301_SET_Z8(a);}
                     64: #define HD6301_SET_NZ16(a)             {HD6301_SET_N16(a);HD6301_SET_Z16(a);}
                     65: #define HD6301_SET_FLAGS8(a,b,r)       {HD6301_SET_N8(r);HD6301_SET_Z8(r);HD6301_SET_V8(a,b,r);HD6301_SET_C8(r);}
                     66: #define HD6301_SET_FLAGS16(a,b,r)      {HD6301_SET_N16(r);HD6301_SET_Z16(r);HD6301_SET_V16(a,b,r);HD6301_SET_C16(r);}
                     67: 
                     68: 
                     69: /**********************************
                     70:  *     Functions
                     71:  **********************************/
                     72: 
                     73: /* HD6301 internal functions */
                     74: static Uint8 hd6301_read_memory(Uint16 addr);
                     75: static void hd6301_write_memory (Uint16 addr, Uint8 value);
                     76: static Uint16 hd6301_get_memory_ext(void);
                     77: 
                     78: /* HD6301 opcodes functions */
                     79: static void hd6301_undefined(void);
                     80: static void hd6301_nop(void);
                     81: static void hd6301_lsrd(void);
                     82: static void hd6301_asld(void);
                     83: static void hd6301_tap(void);
                     84: static void hd6301_tpa(void);
                     85: static void hd6301_inx(void);
                     86: static void hd6301_dex(void);
                     87: static void hd6301_clv(void);
                     88: static void hd6301_sev(void);
                     89: static void hd6301_clc(void);
                     90: static void hd6301_sec(void);
                     91: static void hd6301_cli(void);
                     92: static void hd6301_sei(void);
                     93: static void hd6301_sba(void);
                     94: static void hd6301_cba(void);
                     95: static void hd6301_tab(void);
                     96: static void hd6301_tba(void);
                     97: static void hd6301_xgdx(void);
                     98: static void hd6301_daa(void);
                     99: static void hd6301_slp(void);
                    100: static void hd6301_aba(void);
                    101: static void hd6301_bra(void);
                    102: static void hd6301_brn(void);
                    103: static void hd6301_bhi(void);
                    104: static void hd6301_bls(void);
                    105: static void hd6301_bcc(void);
                    106: static void hd6301_bcs(void);
                    107: static void hd6301_bne(void);
                    108: static void hd6301_beq(void);
                    109: static void hd6301_bvc(void);
                    110: static void hd6301_bvs(void);
                    111: static void hd6301_bpl(void);
                    112: static void hd6301_bmi(void);
                    113: static void hd6301_bge(void);
                    114: static void hd6301_blt(void);
                    115: static void hd6301_bgt(void);
                    116: static void hd6301_ble(void);
                    117: static void hd6301_tsx(void);
                    118: static void hd6301_ins(void);
                    119: static void hd6301_pula(void);
                    120: static void hd6301_pulb(void);
                    121: static void hd6301_des(void);
                    122: static void hd6301_txs(void);
                    123: static void hd6301_psha(void);
                    124: static void hd6301_pshb(void);
                    125: static void hd6301_pulx(void);
                    126: static void hd6301_rts(void);
                    127: static void hd6301_abx(void);
                    128: static void hd6301_rti(void);
                    129: static void hd6301_pshx(void);
                    130: static void hd6301_mul(void);
                    131: static void hd6301_wai(void);
                    132: static void hd6301_swi(void);
                    133: static void hd6301_nega(void);
                    134: static void hd6301_coma(void);
                    135: static void hd6301_lsra(void);
                    136: static void hd6301_rora(void);
                    137: static void hd6301_asra(void);
                    138: static void hd6301_asla(void);
                    139: static void hd6301_rola(void);
                    140: static void hd6301_deca(void);
                    141: static void hd6301_inca(void);
                    142: static void hd6301_tsta(void);
                    143: static void hd6301_clra(void);
                    144: static void hd6301_negb(void);
                    145: static void hd6301_comb(void);
                    146: static void hd6301_lsrb(void);
                    147: static void hd6301_rorb(void);
                    148: static void hd6301_asrb(void);
                    149: static void hd6301_aslb(void);
                    150: static void hd6301_rolb(void);
                    151: static void hd6301_decb(void);
                    152: static void hd6301_incb(void);
                    153: static void hd6301_tstb(void);
                    154: static void hd6301_clrb(void);
                    155: static void hd6301_neg_ind(void);
                    156: static void hd6301_aim_ind(void);
                    157: static void hd6301_oim_ind(void);
                    158: static void hd6301_com_ind(void);
                    159: static void hd6301_lsr_ind(void);
                    160: static void hd6301_eim_ind(void);
                    161: static void hd6301_ror_ind(void);
                    162: static void hd6301_asr_ind(void);
                    163: static void hd6301_asl_ind(void);
                    164: static void hd6301_rol_ind(void);
                    165: static void hd6301_dec_ind(void);
                    166: static void hd6301_tim_ind(void);
                    167: static void hd6301_inc_ind(void);
                    168: static void hd6301_tst_ind(void);
                    169: static void hd6301_jmp_ind(void);
                    170: static void hd6301_clr_ind(void);
                    171: static void hd6301_neg_ext(void);
                    172: static void hd6301_aim_dir(void);
                    173: static void hd6301_oim_dir(void);
                    174: static void hd6301_com_ext(void);
                    175: static void hd6301_lsr_ext(void);
                    176: static void hd6301_eim_dir(void);
                    177: static void hd6301_ror_ext(void);
                    178: static void hd6301_asr_ext(void);
                    179: static void hd6301_asl_ext(void);
                    180: static void hd6301_rol_ext(void);
                    181: static void hd6301_dec_ext(void);
                    182: static void hd6301_tim_dir(void);
                    183: static void hd6301_inc_ext(void);
                    184: static void hd6301_tst_ext(void);
                    185: static void hd6301_jmp_ext(void);
                    186: static void hd6301_clr_ext(void);
                    187: static void hd6301_suba_imm(void);
                    188: static void hd6301_cmpa_imm(void);
                    189: static void hd6301_sbca_imm(void);
                    190: static void hd6301_subd_imm(void);
                    191: static void hd6301_anda_imm(void);
                    192: static void hd6301_bita_imm(void);
                    193: static void hd6301_ldaa_imm(void);
                    194: static void hd6301_eora_imm(void);
                    195: static void hd6301_adca_imm(void);
                    196: static void hd6301_oraa_imm(void);
                    197: static void hd6301_adda_imm(void);
                    198: static void hd6301_cpx_imm(void);
                    199: static void hd6301_bsr(void);
                    200: static void hd6301_lds_imm(void);
                    201: static void hd6301_suba_dir(void);
                    202: static void hd6301_cmpa_dir(void);
                    203: static void hd6301_sbca_dir(void);
                    204: static void hd6301_subd_dir(void);
                    205: static void hd6301_anda_dir(void);
                    206: static void hd6301_bita_dir(void);
                    207: static void hd6301_ldaa_dir(void);
                    208: static void hd6301_staa_dir(void);
                    209: static void hd6301_eora_dir(void);
                    210: static void hd6301_adca_dir(void);
                    211: static void hd6301_oraa_dir(void);
                    212: static void hd6301_adda_dir(void);
                    213: static void hd6301_cpx_dir(void);
                    214: static void hd6301_jsr_dir(void);
                    215: static void hd6301_lds_dir(void);
                    216: static void hd6301_sts_dir(void);
                    217: static void hd6301_suba_ind(void);
                    218: static void hd6301_cmpa_ind(void);
                    219: static void hd6301_sbca_ind(void);
                    220: static void hd6301_subd_ind(void);
                    221: static void hd6301_anda_ind(void);
                    222: static void hd6301_bita_ind(void);
                    223: static void hd6301_ldaa_ind(void);
                    224: static void hd6301_staa_ind(void);
                    225: static void hd6301_eora_ind(void);
                    226: static void hd6301_adca_ind(void);
                    227: static void hd6301_oraa_ind(void);
                    228: static void hd6301_adda_ind(void);
                    229: static void hd6301_cpx_ind(void);
                    230: static void hd6301_jsr_ind(void);
                    231: static void hd6301_lds_ind(void);
                    232: static void hd6301_sts_ind(void);
                    233: static void hd6301_suba_ext(void);
                    234: static void hd6301_cmpa_ext(void);
                    235: static void hd6301_sbca_ext(void);
                    236: static void hd6301_subd_ext(void);
                    237: static void hd6301_anda_ext(void);
                    238: static void hd6301_bita_ext(void);
                    239: static void hd6301_ldaa_ext(void);
                    240: static void hd6301_staa_ext(void);
                    241: static void hd6301_eora_ext(void);
                    242: static void hd6301_adca_ext(void);
                    243: static void hd6301_oraa_ext(void);
                    244: static void hd6301_adda_ext(void);
                    245: static void hd6301_cpx_ext(void);
                    246: static void hd6301_jsr_ext(void);
                    247: static void hd6301_lds_ext(void);
                    248: static void hd6301_sts_ext(void);
                    249: static void hd6301_subb_imm(void);
                    250: static void hd6301_cmpb_imm(void);
                    251: static void hd6301_sbcb_imm(void);
                    252: static void hd6301_addd_imm(void);
                    253: static void hd6301_andb_imm(void);
                    254: static void hd6301_bitb_imm(void);
                    255: static void hd6301_ldab_imm(void);
                    256: static void hd6301_eorb_imm(void);
                    257: static void hd6301_adcb_imm(void);
                    258: static void hd6301_orab_imm(void);
                    259: static void hd6301_addb_imm(void);
                    260: static void hd6301_ldd_imm(void);
                    261: static void hd6301_ldx_imm(void);
                    262: static void hd6301_subb_dir(void);
                    263: static void hd6301_cmpb_dir(void);
                    264: static void hd6301_sbcb_dir(void);
                    265: static void hd6301_addd_dir(void);
                    266: static void hd6301_andb_dir(void);
                    267: static void hd6301_bitb_dir(void);
                    268: static void hd6301_ldab_dir(void);
                    269: static void hd6301_stab_dir(void);
                    270: static void hd6301_eorb_dir(void);
                    271: static void hd6301_adcb_dir(void);
                    272: static void hd6301_orab_dir(void);
                    273: static void hd6301_addb_dir(void);
                    274: static void hd6301_ldd_dir(void);
                    275: static void hd6301_std_dir(void);
                    276: static void hd6301_ldx_dir(void);
                    277: static void hd6301_stx_dir(void);
                    278: static void hd6301_subb_ind(void);
                    279: static void hd6301_cmpb_ind(void);
                    280: static void hd6301_sbcb_ind(void);
                    281: static void hd6301_addd_ind(void);
                    282: static void hd6301_andb_ind(void);
                    283: static void hd6301_bitb_ind(void);
                    284: static void hd6301_ldab_ind(void);
                    285: static void hd6301_stab_ind(void);
                    286: static void hd6301_eorb_ind(void);
                    287: static void hd6301_adcb_ind(void);
                    288: static void hd6301_orab_ind(void);
                    289: static void hd6301_addb_ind(void);
                    290: static void hd6301_ldd_ind(void);
                    291: static void hd6301_std_ind(void);
                    292: static void hd6301_ldx_ind(void);
                    293: static void hd6301_stx_ind(void);
                    294: static void hd6301_subb_ext(void);
                    295: static void hd6301_cmpb_ext(void);
                    296: static void hd6301_sbcb_ext(void);
                    297: static void hd6301_addd_ext(void);
                    298: static void hd6301_andb_ext(void);
                    299: static void hd6301_bitb_ext(void);
                    300: static void hd6301_ldab_ext(void);
                    301: static void hd6301_stab_ext(void);
                    302: static void hd6301_eorb_ext(void);
                    303: static void hd6301_adcb_ext(void);
                    304: static void hd6301_orab_ext(void);
                    305: static void hd6301_addb_ext(void);
                    306: static void hd6301_ldd_ext(void);
                    307: static void hd6301_std_ext(void);
                    308: static void hd6301_ldx_ext(void);
                    309: static void hd6301_stx_ext(void);
                    310: 
                    311: 
                    312: /**********************************
                    313:  *     Variables
                    314:  **********************************/
                    315: static char hd6301_str_instr[50];
                    316: 
                    317: static struct hd6301_opcode_t hd6301_opcode;
                    318: 
                    319: static struct hd6301_opcode_t hd6301_opcode_table[256] = {
                    320: 
                    321:        {0x00, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    322:        {0x01, 1, hd6301_nop,           1,      "nop",                  HD6301_DISASM_NONE},
                    323:        {0x02, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    324:        {0x03, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    325:        {0x04, 1, hd6301_lsrd,          1,      "lsrd",                 HD6301_DISASM_NONE},
                    326:        {0x05, 1, hd6301_asld,          1,      "asld",                 HD6301_DISASM_NONE},
                    327:        {0x06, 1, hd6301_tap,           1,      "tap",                  HD6301_DISASM_NONE},
                    328:        {0x07, 1, hd6301_tpa,           1,      "tpa",                  HD6301_DISASM_NONE},
                    329:        {0x08, 1, hd6301_inx,           1,      "inx",                  HD6301_DISASM_NONE},
                    330:        {0x09, 1, hd6301_dex,           1,      "dex",                  HD6301_DISASM_NONE},
                    331:        {0x0a, 1, hd6301_clv,           1,      "clv",                  HD6301_DISASM_NONE},
                    332:        {0x0b, 1, hd6301_sev,           1,      "sev",                  HD6301_DISASM_NONE},
                    333:        {0x0c, 1, hd6301_clc,           1,      "clc",                  HD6301_DISASM_NONE},
                    334:        {0x0d, 1, hd6301_sec,           1,      "sec",                  HD6301_DISASM_NONE},
                    335:        {0x0e, 1, hd6301_cli,           1,      "cli",                  HD6301_DISASM_NONE},
                    336:        {0x0f, 1, hd6301_sei,           1,      "sei",                  HD6301_DISASM_NONE},
                    337: 
                    338:        {0x10, 1, hd6301_sba,           1,      "sba",                  HD6301_DISASM_NONE},
                    339:        {0x11, 1, hd6301_cba,           1,      "cba",                  HD6301_DISASM_NONE},
                    340:        {0x12, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    341:        {0x13, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    342:        {0x14, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    343:        {0x15, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    344:        {0x16, 1, hd6301_tab,           1,      "tab",                  HD6301_DISASM_NONE},
                    345:        {0x17, 1, hd6301_tba,           1,      "tba",                  HD6301_DISASM_NONE},
                    346:        {0x18, 1, hd6301_xgdx,          2,      "xgdx",                 HD6301_DISASM_NONE},
                    347:        {0x19, 1, hd6301_daa,           2,      "daa",                  HD6301_DISASM_NONE},
                    348:        {0x1a, 1, hd6301_slp,           4,      "slp",                  HD6301_DISASM_NONE},
                    349:        {0x1b, 1, hd6301_aba,           1,      "aba",                  HD6301_DISASM_NONE},
                    350:        {0x1c, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    351:        {0x1d, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    352:        {0x1e, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    353:        {0x1f, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    354: 
                    355:        {0x20, 0, hd6301_bra,           3,      "bra  $%02x",           HD6301_DISASM_MEMORY8},
                    356:        {0x21, 0, hd6301_brn,           3,      "brn  $%02x",           HD6301_DISASM_MEMORY8},
                    357:        {0x22, 0, hd6301_bhi,           3,      "bhi  $%02x",           HD6301_DISASM_MEMORY8},
                    358:        {0x23, 0, hd6301_bls,           3,      "bls  $%02x",           HD6301_DISASM_MEMORY8},
                    359:        {0x24, 0, hd6301_bcc,           3,      "bcc  $%02x",           HD6301_DISASM_MEMORY8},
                    360:        {0x25, 0, hd6301_bcs,           3,      "bcs  $%02x",           HD6301_DISASM_MEMORY8},
                    361:        {0x26, 0, hd6301_bne,           3,      "bne  $%02x",           HD6301_DISASM_MEMORY8},
                    362:        {0x27, 0, hd6301_beq,           3,      "beq  $%02x",           HD6301_DISASM_MEMORY8},
                    363:        {0x28, 0, hd6301_bvc,           3,      "bvc  $%02x",           HD6301_DISASM_MEMORY8},
                    364:        {0x29, 0, hd6301_bvs,           3,      "bvs  $%02x",           HD6301_DISASM_MEMORY8},
                    365:        {0x2a, 0, hd6301_bpl,           3,      "bpl  $%02x",           HD6301_DISASM_MEMORY8},
                    366:        {0x2b, 0, hd6301_bmi,           3,      "bmi  $%02x",           HD6301_DISASM_MEMORY8},
                    367:        {0x2c, 0, hd6301_bge,           3,      "bge  $%02x",           HD6301_DISASM_MEMORY8},
                    368:        {0x2d, 0, hd6301_blt,           3,      "blt  $%02x",           HD6301_DISASM_MEMORY8},
                    369:        {0x2e, 0, hd6301_bgt,           3,      "bgt  $%02x",           HD6301_DISASM_MEMORY8},
                    370:        {0x2f, 0, hd6301_ble,           3,      "ble  $%02x",           HD6301_DISASM_MEMORY8},
                    371: 
                    372:        {0x30, 1, hd6301_tsx,           1,      "tsx",                  HD6301_DISASM_NONE},
                    373:        {0x31, 1, hd6301_ins,           1,      "ins",                  HD6301_DISASM_NONE},
                    374:        {0x32, 1, hd6301_pula,          3,      "pula",                 HD6301_DISASM_NONE},
                    375:        {0x33, 1, hd6301_pulb,          3,      "pulb",                 HD6301_DISASM_NONE},
                    376:        {0x34, 1, hd6301_des,           1,      "des",                  HD6301_DISASM_NONE},
                    377:        {0x35, 1, hd6301_txs,           1,      "txs",                  HD6301_DISASM_NONE},
                    378:        {0x36, 1, hd6301_psha,          4,      "psha",                 HD6301_DISASM_NONE},
                    379:        {0x37, 1, hd6301_pshb,          4,      "pshb",                 HD6301_DISASM_NONE},
                    380:        {0x38, 1, hd6301_pulx,          4,      "pulx",                 HD6301_DISASM_NONE},
                    381:        {0x39, 0, hd6301_rts,           5,      "rts",                  HD6301_DISASM_NONE},
                    382:        {0x3a, 1, hd6301_abx,           1,      "abx",                  HD6301_DISASM_NONE},
                    383:        {0x3b, 0, hd6301_rti,           10,     "rti",                  HD6301_DISASM_NONE},
                    384:        {0x3c, 1, hd6301_pshx,          5 ,     "pshx",                 HD6301_DISASM_NONE},
                    385:        {0x3d, 1, hd6301_mul,           7,      "mul",                  HD6301_DISASM_NONE},
                    386:        {0x3e, 0, hd6301_wai,           9,      "wai",                  HD6301_DISASM_NONE},
                    387:        {0x3f, 0, hd6301_swi,           12,     "swi",                  HD6301_DISASM_NONE},
                    388: 
                    389:        {0x40, 1, hd6301_nega,          1,      "nega",                 HD6301_DISASM_NONE},
                    390:        {0x41, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    391:        {0x42, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    392:        {0x43, 1, hd6301_coma,          1,      "coma",                 HD6301_DISASM_NONE},
                    393:        {0x44, 1, hd6301_lsra,          1,      "lsra",                 HD6301_DISASM_NONE},
                    394:        {0x45, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    395:        {0x46, 1, hd6301_rora,          1,      "rora",                 HD6301_DISASM_NONE},
                    396:        {0x47, 1, hd6301_asra,          1,      "asra",                 HD6301_DISASM_NONE},
                    397:        {0x48, 1, hd6301_asla,          1,      "lsla",                 HD6301_DISASM_NONE},
                    398:        {0x49, 1, hd6301_rola,          1,      "rola",                 HD6301_DISASM_NONE},
                    399:        {0x4a, 1, hd6301_deca,          1,      "deca",                 HD6301_DISASM_NONE},
                    400:        {0x4b, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    401:        {0x4c, 1, hd6301_inca,          1,      "inca",                 HD6301_DISASM_NONE},
                    402:        {0x4d, 1, hd6301_tsta,          1,      "tsta",                 HD6301_DISASM_NONE},
                    403:        {0x4e, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    404:        {0x4f, 1, hd6301_clra,          1,      "clra",                 HD6301_DISASM_NONE},
                    405: 
                    406:        {0x50, 1, hd6301_negb,          1,      "negb",                 HD6301_DISASM_NONE},
                    407:        {0x51, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    408:        {0x52, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    409:        {0x53, 1, hd6301_comb,          1,      "comb",                 HD6301_DISASM_NONE},
                    410:        {0x54, 1, hd6301_lsrb,          1,      "lsrb",                 HD6301_DISASM_NONE},
                    411:        {0x55, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    412:        {0x56, 1, hd6301_rorb,          1,      "rorb",                 HD6301_DISASM_NONE},
                    413:        {0x57, 1, hd6301_asrb,          1,      "asrb",                 HD6301_DISASM_NONE},
                    414:        {0x58, 1, hd6301_aslb,          1,      "lslb",                 HD6301_DISASM_NONE},
                    415:        {0x59, 1, hd6301_rolb,          1,      "rolb",                 HD6301_DISASM_NONE},
                    416:        {0x5a, 1, hd6301_decb,          1,      "decb",                 HD6301_DISASM_NONE},
                    417:        {0x5b, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    418:        {0x5c, 1, hd6301_incb,          1,      "incb",                 HD6301_DISASM_NONE},
                    419:        {0x5d, 1, hd6301_tstb,          1,      "tstb",                 HD6301_DISASM_NONE},
                    420:        {0x5e, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    421:        {0x5f, 1, hd6301_clrb,          1,      "clrb",                 HD6301_DISASM_NONE},
                    422: 
                    423:        {0x60, 2, hd6301_neg_ind,       6,      "neg $%02x,x",          HD6301_DISASM_MEMORY8},
                    424:        {0x61, 3, hd6301_aim_ind,       7,      "aim #$%02x,$%02x x",   HD6301_DISASM_XIM},
                    425:        {0x62, 3, hd6301_oim_ind,       7,      "oim #$%02x,$%02x x",   HD6301_DISASM_XIM},
                    426:        {0x63, 2, hd6301_com_ind,       6,      "com $%02x,x",          HD6301_DISASM_MEMORY8},
                    427:        {0x64, 2, hd6301_lsr_ind,       6,      "lsr $%02x,x",          HD6301_DISASM_MEMORY8},
                    428:        {0x65, 3, hd6301_eim_ind,       7,      "eim #$%02x,$%02x x",   HD6301_DISASM_XIM},
                    429:        {0x66, 2, hd6301_ror_ind,       6,      "ror $%02x,x",          HD6301_DISASM_MEMORY8},
                    430:        {0x67, 2, hd6301_asr_ind,       6,      "asr $%02x,x",          HD6301_DISASM_MEMORY8},
                    431:        {0x68, 2, hd6301_asl_ind,       6,      "lsl $%02x,x",          HD6301_DISASM_MEMORY8},
                    432:        {0x69, 2, hd6301_rol_ind,       6,      "rol $%02x,x",          HD6301_DISASM_MEMORY8},
                    433:        {0x6a, 2, hd6301_dec_ind,       6,      "dec $%02x,x",          HD6301_DISASM_MEMORY8},
                    434:        {0x6b, 3, hd6301_tim_ind,       5,      "tim #$%02x,$%02x x",   HD6301_DISASM_XIM},
                    435:        {0x6c, 2, hd6301_inc_ind,       6,      "inc $%02x,x",          HD6301_DISASM_MEMORY8},
                    436:        {0x6d, 2, hd6301_tst_ind,       4,      "tst $%02x,x",          HD6301_DISASM_MEMORY8},
                    437:        {0x6e, 0, hd6301_jmp_ind,       3,      "jmp $%02x,x",          HD6301_DISASM_MEMORY8},
                    438:        {0x6f, 2, hd6301_clr_ind,       5,      "clr $%02x,x",          HD6301_DISASM_MEMORY8},
                    439: 
                    440:        {0x70, 3, hd6301_neg_ext,       6,      "neg $%04x",            HD6301_DISASM_MEMORY16},
                    441:        {0x71, 3, hd6301_aim_dir,       6,      "aim #$%02x,$%02x",     HD6301_DISASM_XIM},
                    442:        {0x72, 3, hd6301_oim_dir,       6,      "oim #$%02x,$%02x",     HD6301_DISASM_XIM},
                    443:        {0x73, 3, hd6301_com_ext,       6,      "com $%04x",            HD6301_DISASM_MEMORY16},
                    444:        {0x74, 3, hd6301_lsr_ext,       6,      "lsr $%04x",            HD6301_DISASM_MEMORY16},
                    445:        {0x75, 3, hd6301_eim_dir,       6,      "eim #$%02x,$%02x",     HD6301_DISASM_XIM},
                    446:        {0x76, 3, hd6301_ror_ext,       6,      "ror $%04x",            HD6301_DISASM_MEMORY16},
                    447:        {0x77, 3, hd6301_asr_ext,       6,      "asr $%04x",            HD6301_DISASM_MEMORY16},
                    448:        {0x78, 3, hd6301_asl_ext,       6,      "lsl $%04x",            HD6301_DISASM_MEMORY16},
                    449:        {0x79, 3, hd6301_rol_ext,       6,      "rol $%04x",            HD6301_DISASM_MEMORY16},
                    450:        {0x7a, 3, hd6301_dec_ext,       6,      "dec $%04x",            HD6301_DISASM_MEMORY16},
                    451:        {0x7b, 3, hd6301_tim_dir,       4,      "tim #$%02x,$%02x",     HD6301_DISASM_XIM},
                    452:        {0x7c, 3, hd6301_inc_ext,       6,      "inc $%04x",            HD6301_DISASM_MEMORY16},
                    453:        {0x7d, 3, hd6301_tst_ext,       4,      "tst $%04x",            HD6301_DISASM_MEMORY16},
                    454:        {0x7e, 0, hd6301_jmp_ext,       3,      "jmp $%04x",            HD6301_DISASM_MEMORY16},
                    455:        {0x7f, 3, hd6301_clr_ext,       5,      "clr $%04x",            HD6301_DISASM_MEMORY16},
                    456: 
                    457:        {0x80, 2, hd6301_suba_imm,      2,      "suba #$%02x",          HD6301_DISASM_MEMORY8},
                    458:        {0x81, 2, hd6301_cmpa_imm,      2,      "cmpa #$%02x",          HD6301_DISASM_MEMORY8},
                    459:        {0x82, 2, hd6301_sbca_imm,      2,      "sbca #$%02x",          HD6301_DISASM_MEMORY8},
                    460:        {0x83, 3, hd6301_subd_imm,      3,      "subd #$%04x",          HD6301_DISASM_MEMORY16},
                    461:        {0x84, 2, hd6301_anda_imm,      2,      "anda #$%02x",          HD6301_DISASM_MEMORY8},
                    462:        {0x85, 2, hd6301_bita_imm,      2,      "bita #$%02x",          HD6301_DISASM_MEMORY8},
                    463:        {0x86, 2, hd6301_ldaa_imm,      2,      "ldaa #$%02x",          HD6301_DISASM_MEMORY8},
                    464:        {0x87, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    465:        {0x88, 2, hd6301_eora_imm,      2,      "eora #$%02x",          HD6301_DISASM_MEMORY8},
                    466:        {0x89, 2, hd6301_adca_imm,      2,      "adca #$%02x",          HD6301_DISASM_MEMORY8},
                    467:        {0x8a, 2, hd6301_oraa_imm,      2,      "oraa #$%02x",          HD6301_DISASM_MEMORY8},
                    468:        {0x8b, 2, hd6301_adda_imm,      2,      "adda #$%02x",          HD6301_DISASM_MEMORY8},
                    469:        {0x8c, 3, hd6301_cpx_imm,       3,      "cpx  #$%04x",          HD6301_DISASM_MEMORY16},
                    470:        {0x8d, 0, hd6301_bsr,           5,      "bsr  $%02x",           HD6301_DISASM_MEMORY8},
                    471:        {0x8e, 3, hd6301_lds_imm,       3,      "lds  #$%04x",          HD6301_DISASM_MEMORY16},
                    472:        {0x8f, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    473: 
                    474:        {0x90, 2, hd6301_suba_dir,      3,      "suba $%02x",           HD6301_DISASM_MEMORY8},
                    475:        {0x91, 2, hd6301_cmpa_dir,      3,      "cmpa $%02x",           HD6301_DISASM_MEMORY8},
                    476:        {0x92, 2, hd6301_sbca_dir,      3,      "sbca $%02x",           HD6301_DISASM_MEMORY8},
                    477:        {0x93, 2, hd6301_subd_dir,      4,      "subd $%02x",           HD6301_DISASM_MEMORY8},
                    478:        {0x94, 2, hd6301_anda_dir,      3,      "anda $%02x",           HD6301_DISASM_MEMORY8},
                    479:        {0x95, 2, hd6301_bita_dir,      3,      "bita $%02x",           HD6301_DISASM_MEMORY8},
                    480:        {0x96, 2, hd6301_ldaa_dir,      3,      "ldaa $%02x",           HD6301_DISASM_MEMORY8},
                    481:        {0x97, 2, hd6301_staa_dir,      3,      "staa $%02x",           HD6301_DISASM_MEMORY8},
                    482:        {0x98, 2, hd6301_eora_dir,      3,      "eora $%02x",           HD6301_DISASM_MEMORY8},
                    483:        {0x99, 2, hd6301_adca_dir,      3,      "adca $%02x",           HD6301_DISASM_MEMORY8},
                    484:        {0x9a, 2, hd6301_oraa_dir,      3,      "oraa $%02x",           HD6301_DISASM_MEMORY8},
                    485:        {0x9b, 2, hd6301_adda_dir,      3,      "adda $%02x",           HD6301_DISASM_MEMORY8},
                    486:        {0x9c, 2, hd6301_cpx_dir,       4,      "cpx  $%02x",           HD6301_DISASM_MEMORY8},
                    487:        {0x9d, 0, hd6301_jsr_dir,       5,      "jsr  $%02x",           HD6301_DISASM_MEMORY8},
                    488:        {0x9e, 2, hd6301_lds_dir,       4,      "lds  $%02x",           HD6301_DISASM_MEMORY8},
                    489:        {0x9f, 2, hd6301_sts_dir,       4,      "sts  $%02x",           HD6301_DISASM_MEMORY8},
                    490: 
                    491:        {0xa0, 2, hd6301_suba_ind,      4,      "suba $%02x,x",         HD6301_DISASM_MEMORY8},
                    492:        {0xa1, 2, hd6301_cmpa_ind,      4,      "cmpa $%02x,x",         HD6301_DISASM_MEMORY8},
                    493:        {0xa2, 2, hd6301_sbca_ind,      4,      "sbca $%02x,x",         HD6301_DISASM_MEMORY8},
                    494:        {0xa3, 2, hd6301_subd_ind,      5,      "subd $%02x,x",         HD6301_DISASM_MEMORY8},
                    495:        {0xa4, 2, hd6301_anda_ind,      4,      "anda $%02x,x",         HD6301_DISASM_MEMORY8},
                    496:        {0xa5, 2, hd6301_bita_ind,      4,      "bita $%02x,x",         HD6301_DISASM_MEMORY8},
                    497:        {0xa6, 2, hd6301_ldaa_ind,      4,      "ldaa $%02x,x",         HD6301_DISASM_MEMORY8},
                    498:        {0xa7, 2, hd6301_staa_ind,      4,      "staa $%02x,x",         HD6301_DISASM_MEMORY8},
                    499:        {0xa8, 2, hd6301_eora_ind,      4,      "eora $%02x,x",         HD6301_DISASM_MEMORY8},
                    500:        {0xa9, 2, hd6301_adca_ind,      4,      "adca $%02x,x",         HD6301_DISASM_MEMORY8},
                    501:        {0xaa, 2, hd6301_oraa_ind,      4,      "oraa $%02x,x",         HD6301_DISASM_MEMORY8},
                    502:        {0xab, 2, hd6301_adda_ind,      4,      "adda $%02x,x",         HD6301_DISASM_MEMORY8},
                    503:        {0xac, 2, hd6301_cpx_ind,       5,      "cpx  $%02x,x",         HD6301_DISASM_MEMORY8},
                    504:        {0xad, 0, hd6301_jsr_ind,       5,      "jsr  $%02x,x",         HD6301_DISASM_MEMORY8},
                    505:        {0xae, 2, hd6301_lds_ind,       5,      "lds  $%02x,x",         HD6301_DISASM_MEMORY8},
                    506:        {0xaf, 2, hd6301_sts_ind,       5,      "sts  $%02x,x",         HD6301_DISASM_MEMORY8},
                    507: 
                    508:        {0xb0, 3, hd6301_suba_ext,      4,      "suba $%04x",           HD6301_DISASM_MEMORY16},
                    509:        {0xb1, 3, hd6301_cmpa_ext,      4,      "cmpa $%04x",           HD6301_DISASM_MEMORY16},
                    510:        {0xb2, 3, hd6301_sbca_ext,      4,      "sbca $%04x",           HD6301_DISASM_MEMORY16},
                    511:        {0xb3, 3, hd6301_subd_ext,      5,      "subd $%04x",           HD6301_DISASM_MEMORY16},
                    512:        {0xb4, 3, hd6301_anda_ext,      4,      "anda $%04x",           HD6301_DISASM_MEMORY16},
                    513:        {0xb5, 3, hd6301_bita_ext,      4,      "bita $%04x",           HD6301_DISASM_MEMORY16},
                    514:        {0xb6, 3, hd6301_ldaa_ext,      4,      "ldaa $%04x",           HD6301_DISASM_MEMORY16},
                    515:        {0xb7, 3, hd6301_staa_ext,      4,      "staa $%04x",           HD6301_DISASM_MEMORY16},
                    516:        {0xb8, 3, hd6301_eora_ext,      4,      "eora $%04x",           HD6301_DISASM_MEMORY16},
                    517:        {0xb9, 3, hd6301_adca_ext,      4,      "adca $%04x",           HD6301_DISASM_MEMORY16},
                    518:        {0xba, 3, hd6301_oraa_ext,      4,      "oraa $%04x",           HD6301_DISASM_MEMORY16},
                    519:        {0xbb, 3, hd6301_adda_ext,      4,      "adda $%04x",           HD6301_DISASM_MEMORY16},
                    520:        {0xbc, 3, hd6301_cpx_ext,       5,      "cpx  $%04x",           HD6301_DISASM_MEMORY16},
                    521:        {0xbd, 0, hd6301_jsr_ext,       6,      "jsr  $%04x",           HD6301_DISASM_MEMORY16},
                    522:        {0xbe, 3, hd6301_lds_ext,       5,      "lds  $%04x",           HD6301_DISASM_MEMORY16},
                    523:        {0xbf, 3, hd6301_sts_ext,       5,      "sts  $%04x",           HD6301_DISASM_MEMORY16},
                    524: 
                    525:        {0xc0, 2, hd6301_subb_imm,      2,      "subb #$%02x",          HD6301_DISASM_MEMORY8},
                    526:        {0xc1, 2, hd6301_cmpb_imm,      2,      "cmpb #$%02x",          HD6301_DISASM_MEMORY8},
                    527:        {0xc2, 2, hd6301_sbcb_imm,      2,      "sbcb #$%02x",          HD6301_DISASM_MEMORY8},
                    528:        {0xc3, 3, hd6301_addd_imm,      3,      "addd #$%04x",          HD6301_DISASM_MEMORY16},
                    529:        {0xc4, 2, hd6301_andb_imm,      2,      "andb #$%02x",          HD6301_DISASM_MEMORY8},
                    530:        {0xc5, 2, hd6301_bitb_imm,      2,      "bitb #$%02x",          HD6301_DISASM_MEMORY8},
                    531:        {0xc6, 2, hd6301_ldab_imm,      2,      "ldab #$%02x",          HD6301_DISASM_MEMORY8},
                    532:        {0xc7, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    533:        {0xc8, 2, hd6301_eorb_imm,      2,      "eorb #$%02x",          HD6301_DISASM_MEMORY8},
                    534:        {0xc9, 2, hd6301_adcb_imm,      2,      "adcb #$%02x",          HD6301_DISASM_MEMORY8},
                    535:        {0xca, 2, hd6301_orab_imm,      2,      "orab #$%02x",          HD6301_DISASM_MEMORY8},
                    536:        {0xcb, 2, hd6301_addb_imm,      2,      "addb #$%02x",          HD6301_DISASM_MEMORY8},
                    537:        {0xcc, 3, hd6301_ldd_imm,       3,      "ldd  #$%04x",          HD6301_DISASM_MEMORY16},
                    538:        {0xcd, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    539:        {0xce, 3, hd6301_ldx_imm,       3,      "ldx  #$%04x",          HD6301_DISASM_MEMORY16},
                    540:        {0xcf, 0, hd6301_undefined,     0,      "",                     HD6301_DISASM_UNDEFINED},
                    541: 
                    542:        {0xd0, 2, hd6301_subb_dir,      3,      "subb $%02x",           HD6301_DISASM_MEMORY8},
                    543:        {0xd1, 2, hd6301_cmpb_dir,      3,      "cmpb $%02x",           HD6301_DISASM_MEMORY8},
                    544:        {0xd2, 2, hd6301_sbcb_dir,      3,      "sbcb $%02x",           HD6301_DISASM_MEMORY8},
                    545:        {0xd3, 2, hd6301_addd_dir,      4,      "addd $%02x",           HD6301_DISASM_MEMORY8},
                    546:        {0xd4, 2, hd6301_andb_dir,      3,      "andb $%02x",           HD6301_DISASM_MEMORY8},
                    547:        {0xd5, 2, hd6301_bitb_dir,      3,      "bitb $%02x",           HD6301_DISASM_MEMORY8},
                    548:        {0xd6, 2, hd6301_ldab_dir,      3,      "ldab $%02x",           HD6301_DISASM_MEMORY8},
                    549:        {0xd7, 2, hd6301_stab_dir,      3,      "stab $%02x",           HD6301_DISASM_MEMORY8},
                    550:        {0xd8, 2, hd6301_eorb_dir,      3,      "eorb $%02x",           HD6301_DISASM_MEMORY8},
                    551:        {0xd9, 2, hd6301_adcb_dir,      3,      "adcb $%02x",           HD6301_DISASM_MEMORY8},
                    552:        {0xda, 2, hd6301_orab_dir,      3,      "orab $%02x",           HD6301_DISASM_MEMORY8},
                    553:        {0xdb, 2, hd6301_addb_dir,      3,      "addb $%02x",           HD6301_DISASM_MEMORY8},
                    554:        {0xdc, 2, hd6301_ldd_dir,       4,      "ldd  $%02x",           HD6301_DISASM_MEMORY8},
                    555:        {0xdd, 2, hd6301_std_dir,       4,      "std  $%02x",           HD6301_DISASM_MEMORY8},
                    556:        {0xde, 2, hd6301_ldx_dir,       4,      "ldx  $%02x",           HD6301_DISASM_MEMORY8},
                    557:        {0xdf, 2, hd6301_stx_dir,       4,      "stx  $%02x",           HD6301_DISASM_MEMORY8},
                    558:        
                    559:        {0xe0, 2, hd6301_subb_ind,      4,      "subb $%02x,x",         HD6301_DISASM_MEMORY8},
                    560:        {0xe1, 2, hd6301_cmpb_ind,      4,      "cmpb $%02x,x",         HD6301_DISASM_MEMORY8},
                    561:        {0xe2, 2, hd6301_sbcb_ind,      4,      "sbcb $%02x,x",         HD6301_DISASM_MEMORY8},
                    562:        {0xe3, 2, hd6301_addd_ind,      5,      "addd $%02x,x",         HD6301_DISASM_MEMORY8},
                    563:        {0xe4, 2, hd6301_andb_ind,      4,      "andb $%02x,x",         HD6301_DISASM_MEMORY8},
                    564:        {0xe5, 2, hd6301_bitb_ind,      4,      "bitb $%02x,x",         HD6301_DISASM_MEMORY8},
                    565:        {0xe6, 2, hd6301_ldab_ind,      4,      "ldab $%02x,x",         HD6301_DISASM_MEMORY8},
                    566:        {0xe7, 2, hd6301_stab_ind,      4,      "stab $%02x,x",         HD6301_DISASM_MEMORY8},
                    567:        {0xe8, 2, hd6301_eorb_ind,      4,      "eorb $%02x,x",         HD6301_DISASM_MEMORY8},
                    568:        {0xe9, 2, hd6301_adcb_ind,      4,      "adcb $%02x,x",         HD6301_DISASM_MEMORY8},
                    569:        {0xea, 2, hd6301_orab_ind,      4,      "orab $%02x,x",         HD6301_DISASM_MEMORY8},
                    570:        {0xeb, 2, hd6301_addb_ind,      4,      "addb $%02x,x",         HD6301_DISASM_MEMORY8},
                    571:        {0xec, 2, hd6301_ldd_ind,       5,      "ldd  $%02x,x",         HD6301_DISASM_MEMORY8},
                    572:        {0xed, 2, hd6301_std_ind,       5,      "std  $%02x,x",         HD6301_DISASM_MEMORY8},
                    573:        {0xee, 2, hd6301_ldx_ind,       5,      "ldx  $%02x,x",         HD6301_DISASM_MEMORY8},
                    574:        {0xef, 2, hd6301_stx_ind,       5,      "stx  $%02x,x",         HD6301_DISASM_MEMORY8},
                    575: 
                    576:        {0xf0, 3, hd6301_subb_ext,      4,      "subb $%04x",           HD6301_DISASM_MEMORY16},
                    577:        {0xf1, 3, hd6301_cmpb_ext,      4,      "cmpb $%04x",           HD6301_DISASM_MEMORY16},
                    578:        {0xf2, 3, hd6301_sbcb_ext,      4,      "sbcb $%04x",           HD6301_DISASM_MEMORY16},
                    579:        {0xf3, 3, hd6301_addd_ext,      5,      "addd $%04x",           HD6301_DISASM_MEMORY16},
                    580:        {0xf4, 3, hd6301_andb_ext,      4,      "andb $%04x",           HD6301_DISASM_MEMORY16},
                    581:        {0xf5, 3, hd6301_bitb_ext,      4,      "bitb $%04x",           HD6301_DISASM_MEMORY16},
                    582:        {0xf6, 3, hd6301_ldab_ext,      4,      "ldab $%04x",           HD6301_DISASM_MEMORY16},
                    583:        {0xf7, 3, hd6301_stab_ext,      4,      "stab $%04x",           HD6301_DISASM_MEMORY16},
                    584:        {0xf8, 3, hd6301_eorb_ext,      4,      "eorb $%04x",           HD6301_DISASM_MEMORY16},
                    585:        {0xf9, 3, hd6301_adcb_ext,      4,      "adcb $%04x",           HD6301_DISASM_MEMORY16},
                    586:        {0xfa, 3, hd6301_orab_ext,      4,      "orab $%04x",           HD6301_DISASM_MEMORY16},
                    587:        {0xfb, 3, hd6301_addb_ext,      4,      "addb $%04x",           HD6301_DISASM_MEMORY16},
                    588:        {0xfc, 3, hd6301_ldd_ext,       5,      "ldd  $%04x",           HD6301_DISASM_MEMORY16},
                    589:        {0xfd, 3, hd6301_std_ext,       5,      "std  $%04x",           HD6301_DISASM_MEMORY16},
                    590:        {0xfe, 3, hd6301_ldx_ext,       5,      "ldx  $%04x",           HD6301_DISASM_MEMORY16},
                    591:        {0xff, 3, hd6301_stx_ext,       5,      "stx  $%04x",           HD6301_DISASM_MEMORY16}
                    592: };
                    593: 
                    594: 
                    595: /* Variables */
                    596: static Uint8   hd6301_cycles;
                    597: static Uint8   hd6301_cur_inst;
                    598: 
                    599: static Sint8   hd6301_reg_A; 
                    600: static Sint8   hd6301_reg_B;
                    601: static Sint16  hd6301_reg_X;
                    602: static Uint16  hd6301_reg_SP;
                    603: static Uint16  hd6301_reg_PC;
                    604: static Uint8   hd6301_reg_CCR;
                    605: 
                    606: //Uint8        hd6301_reg_RMCR;
                    607: 
                    608: static Uint8   hd6301_intREG[32];
                    609: static Uint8   hd6301_intRAM[128];
                    610: static Uint8   hd6301_intROM[4096];
                    611: 
                    612: 
                    613: /**********************************
                    614:  *     Emulator kernel
                    615:  **********************************/
                    616: 
                    617: /**
                    618:  * Initialise hd6301 cpu
                    619:  */
                    620: void hd6301_init_cpu(void)
                    621: {
                    622:        hd6301_reg_CCR = 0xc0;
                    623: }
                    624: 
                    625: /**
                    626:  * Execute 1 hd6301 instruction
                    627:  */
                    628: void hd6301_execute_one_instruction(void)
                    629: {
                    630:        hd6301_cur_inst = hd6301_read_memory(hd6301_reg_PC);
                    631: 
                    632:        /* Get opcode to execute */
                    633:        hd6301_opcode = hd6301_opcode_table[hd6301_cur_inst];
                    634: 
                    635:        /* disasm opcode ? */
                    636: #ifdef HD6301_DISASM
                    637:        hd6301_disasm();
                    638: #endif
                    639:        /* execute opcode  */
                    640:        hd6301_opcode.op_func();
                    641: 
                    642: #ifdef HD6301_DISPLAY_REGS
                    643:        hd6301_display_registers();
                    644: #endif
                    645: 
                    646:        /* Increment instruction cycles */
                    647:        hd6301_cycles += hd6301_opcode.op_n_cycles;
                    648: 
                    649:        /* Increment PC register */
                    650:        hd6301_reg_PC += hd6301_opcode.op_bytes;
                    651: 
                    652:        /* post process interrupts */
                    653: 
                    654:        /* post process timers */
                    655: 
                    656:        /* post process SCI */
                    657: }
                    658: 
                    659: /**
                    660:  * Read hd6301 memory (Ram, Rom, Internal registers)
                    661:  */
                    662: static Uint8 hd6301_read_memory(Uint16 addr)
                    663: {
                    664:        /* Internal registers */
                    665:        if (addr <= 0x1f) {
                    666:                return hd6301_intREG[addr];
                    667:        }
                    668: 
                    669:        /* Internal RAM */
                    670:        if ((addr >= 0x80) && (addr <= 0xff)) {
                    671:                return hd6301_intRAM[addr-0x80];
                    672:        }
                    673: 
                    674:        /* Internal ROM */
                    675:        if (addr >= 0xf000) {
                    676:                return hd6301_intROM[addr-0xf000];
                    677:        }
                    678: 
                    679:        fprintf(stderr, "hd6301: 0x%04x: 0x%04x illegal memory address\n", hd6301_reg_PC, addr);
                    680:        exit(-1);
                    681: }
                    682: 
                    683: /**
                    684:  * Write hd6301 memory (Ram, Internal registers)
                    685:  */
                    686: static void hd6301_write_memory (Uint16 addr, Uint8 value)
                    687: {
                    688:        /* Internal registers */
                    689:        if (addr <= 0x1f) {
                    690:                hd6301_intREG[addr] = value;
                    691:        }
                    692: 
                    693:        /* Internal RAM */
                    694:        else if ((addr >= 0x80) && (addr <= 0xff)) {
                    695:                hd6301_intRAM[addr-0x80] = value;
                    696:        }
                    697: 
                    698:        /* Internal ROM */
                    699:        else if (addr >= 0xf000) {
                    700:                fprintf(stderr, "hd6301: 0x%04x: attempt to write to rom\n", addr);
                    701:        }
                    702: 
                    703:        /* Illegal address */
                    704:        else {
                    705:                fprintf(stderr, "hd6301: 0x%04x: write to illegal address\n", addr);
                    706:                exit(-1);
                    707:        }
                    708: }
                    709: 
                    710: /**
                    711:  * Get extended memory (16 bits)
                    712:  */
                    713: static Uint16 hd6301_get_memory_ext(void)
                    714: {
                    715:        Uint16 addr;
                    716: 
                    717:        addr = hd6301_read_memory(hd6301_reg_PC+1)<<8;
                    718:        addr += hd6301_read_memory(hd6301_reg_PC+2);
                    719:        return addr;
                    720: }
                    721: 
                    722: /**
                    723:  * Undefined opcode
                    724:  */
                    725: static void hd6301_undefined(void)
                    726: {
                    727:        fprintf(stderr, "hd6301: 0x%04x: 0x%02x unknown instruction\n", hd6301_reg_PC, hd6301_cur_inst);
                    728:        exit(-1);  /* TODO: Trap the error correctly */
                    729: }
                    730: 
                    731: /**
                    732:  * NOP : no operation
                    733:  *
                    734:  * HINZVC
                    735:  * ......
                    736:  */
                    737: static void hd6301_nop(void)
                    738: {
                    739: }
                    740: 
                    741: /**
                    742:  * LSRD : logical Shift Right, accumulator D : D=D>>1
                    743:  *
                    744:  * HINZVC
                    745:  * ..0***
                    746:  */
                    747: static void hd6301_lsrd(void)
                    748: {
                    749:        Uint16 regD;
                    750:        Uint8  carry;
                    751: 
                    752:        regD = (hd6301_reg_A<<8) + hd6301_reg_B;
                    753:        carry = regD & 1;
                    754:        regD >>= 1;
                    755: 
                    756:        hd6301_reg_A = regD >> 8;
                    757:        hd6301_reg_B = regD;
                    758: 
                    759:        HD6301_CLR_NZVC;
                    760:        hd6301_reg_CCR |= carry;
                    761:        HD6301_SET_Z16(regD);
                    762:        hd6301_reg_CCR |= ((0 ^ carry) == 1) << hd6301_REG_CCR_V;
                    763: }
                    764: 
                    765: /**
                    766:  * ASLD : arythmetic Shift left, accumulator D : D=D<<1
                    767:  *
                    768:  * HINZVC
                    769:  * ..****
                    770:  */
                    771: static void hd6301_asld(void)
                    772: {
                    773:        Uint16 regD;
                    774:        Uint8  carry, bitN;
                    775: 
                    776:        regD = (hd6301_reg_A<<8) + hd6301_reg_B;
                    777:        carry = (regD >> 15) & 1;
                    778:        regD <<= 1;
                    779: 
                    780:        hd6301_reg_A = regD >> 8;
                    781:        hd6301_reg_B = regD;
                    782: 
                    783:        HD6301_CLR_NZVC;
                    784:        hd6301_reg_CCR |= carry;
                    785:        HD6301_SET_NZ16(regD);
                    786:        bitN = (hd6301_reg_CCR & 0x8) >> 3;
                    787:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                    788: }
                    789: 
                    790: 
                    791: /**
                    792:  * TAP : transfer accumulator A into register CCR : CCR=A
                    793:  *
                    794:  * HINZVC
                    795:  * ******
                    796:  */
                    797: static void hd6301_tap(void)
                    798: {
                    799:        hd6301_reg_CCR = hd6301_reg_A;
                    800:        hd6301_reg_CCR |= 0xc0;
                    801: }
                    802: 
                    803: /**
                    804:  * TPA : transfer register CCR into accumulator A : A=CCR
                    805:  *
                    806:  * HINZVC
                    807:  * ......
                    808:  */
                    809: static void hd6301_tpa(void)
                    810: {
                    811:        hd6301_reg_A = hd6301_reg_CCR;
                    812: }
                    813: 
                    814: /**
                    815:  * INX : increment register X : X=X+1
                    816:  *
                    817:  * HINZVC
                    818:  * ...*..
                    819:  */
                    820: static void hd6301_inx(void)
                    821: {
                    822:        ++ hd6301_reg_X;
                    823: 
                    824:        HD6301_CLR_Z;
                    825:        HD6301_SET_Z16(hd6301_reg_X);
                    826: }
                    827: 
                    828: /**
                    829:  * DEX : decrement register X : X=X-1
                    830:  *
                    831:  * HINZVC
                    832:  * ...*..
                    833:  */
                    834: static void hd6301_dex(void)
                    835: {
                    836:        -- hd6301_reg_X;
                    837: 
                    838:        HD6301_CLR_Z;
                    839:        HD6301_SET_Z16(hd6301_reg_X);
                    840: }
                    841: 
                    842: /**
                    843:  * CLV : clear register CCR bit V : V=0
                    844:  *
                    845:  * HINZVC
                    846:  * ....0.
                    847:  */
                    848: static void hd6301_clv(void)
                    849: {
                    850:        HD6301_CLR_V;
                    851: }
                    852: 
                    853: /**
                    854:  * SEV : set register CCR bit V : V=1
                    855:  *
                    856:  * HINZVC
                    857:  * ....1.
                    858:  */
                    859: static void hd6301_sev(void)
                    860: {
                    861:        hd6301_reg_CCR |= 1<<hd6301_REG_CCR_V;
                    862: }
                    863: 
                    864: /**
                    865:  * CLC : clear register CCR bit C : C=0
                    866:  *
                    867:  * HINZVC
                    868:  * .....0
                    869:  */
                    870: static void hd6301_clc(void)
                    871: {
                    872:        HD6301_CLR_C;
                    873: }
                    874: 
                    875: /**
                    876:  * SEC : set register CCR bit C : C=1
                    877:  *
                    878:  * HINZVC
                    879:  * .....1
                    880:  */
                    881: static void hd6301_sec(void)
                    882: {
                    883:        hd6301_reg_CCR |= 1<<hd6301_REG_CCR_C;
                    884: }
                    885: 
                    886: /**
                    887:  * CLI : clear register CCR bit I : I=0
                    888:  *
                    889:  * HINZVC
                    890:  * .0....
                    891:  */
                    892: static void hd6301_cli(void)
                    893: {
                    894:        HD6301_CLR_I;
                    895: }
                    896: 
                    897: /**
                    898:  * SEI : set register CCR bit I : I=1
                    899:  *
                    900:  * HINZVC
                    901:  * .1....
                    902:  */
                    903: static void hd6301_sei(void)
                    904: {
                    905:        hd6301_reg_CCR |= 1<<hd6301_REG_CCR_I;
                    906: }
                    907: 
                    908: /**
                    909:  * SBA : substract accumulator B from accumulator A : A=A-B
                    910:  *
                    911:  * HINZVC
                    912:  * ..****
                    913:  */
                    914: static void hd6301_sba(void)
                    915: {
                    916:        Uint16 result;
                    917: 
                    918:        result = hd6301_reg_A - hd6301_reg_B;
                    919: 
                    920:        HD6301_CLR_NZVC;
                    921:        HD6301_SET_FLAGS8(hd6301_reg_A, hd6301_reg_B, result);
                    922: 
                    923:        hd6301_reg_A = result;
                    924: }
                    925: 
                    926: /**
                    927:  * CBA : compare accumulator A and accumulator B : A-B
                    928:  *
                    929:  * HINZVC
                    930:  * ..****
                    931:  */
                    932: static void hd6301_cba(void)
                    933: {
                    934:        Uint16 result;
                    935: 
                    936:        result = hd6301_reg_A - hd6301_reg_B;
                    937: 
                    938:        HD6301_CLR_NZVC;
                    939:        HD6301_SET_FLAGS8(hd6301_reg_A, hd6301_reg_B, result);
                    940: }
                    941: 
                    942: /**
                    943:  * TAB : transfer accumulator A into accumulator B : B=A
                    944:  *
                    945:  * HINZVC
                    946:  * ..**0.
                    947:  */
                    948: static void hd6301_tab(void)
                    949: {
                    950:        hd6301_reg_B = hd6301_reg_A;
                    951: 
                    952:        HD6301_CLR_NZV;
                    953:        HD6301_SET_NZ8(hd6301_reg_B);
                    954: }
                    955: 
                    956: /**
                    957:  * TBA : transfer accumulator B into accumulator A : A=B
                    958:  *
                    959:  * HINZVC
                    960:  * ..**0.
                    961:  */
                    962: static void hd6301_tba(void)
                    963: {
                    964:        hd6301_reg_A = hd6301_reg_B;
                    965: 
                    966:        HD6301_CLR_NZV;
                    967:        HD6301_SET_NZ8(hd6301_reg_A);
                    968: }
                    969: 
                    970: /**
                    971:  * XGDX : exchange register X and accumulator D : X<->D
                    972:  *
                    973:  * HINZVC
                    974:  * ......
                    975:  */
                    976: static void hd6301_xgdx(void)
                    977: {
                    978:        Uint16 temp;
                    979: 
                    980:        temp = hd6301_reg_X;
                    981:        hd6301_reg_X = (hd6301_reg_A << 8) + hd6301_reg_B;
                    982:        hd6301_reg_A = temp >> 8;
                    983:        hd6301_reg_B = temp;
                    984: }
                    985: 
                    986: /**
                    987:  * DAA : converts binary add of BCD characters into BCD format : A=BCD(A)
                    988:  *
                    989:  * HINZVC
                    990:  * ..****
                    991:  */
                    992: static void hd6301_daa(void)
                    993: {
                    994:        /* Todo */
                    995: }
                    996: 
                    997: /**
                    998:  * SLP : sleep
                    999:  *
                   1000:  * HINZVC
                   1001:  * ......
                   1002:  */
                   1003: static void hd6301_slp(void)
                   1004: {
                   1005:        /* Todo */
                   1006: }
                   1007: 
                   1008: /**
                   1009:  * ABA : add accumulator A and accumulator B into accumulator A : A=A+B
                   1010:  *
                   1011:  * HINZVC
                   1012:  * *.****
                   1013:  */
                   1014: static void hd6301_aba(void)
                   1015: {
                   1016:        Uint16 result;
                   1017: 
                   1018:        result = hd6301_reg_A + hd6301_reg_B;
                   1019: 
                   1020:        HD6301_CLR_HNZVC;
                   1021:        HD6301_SET_FLAGS8(hd6301_reg_A, hd6301_reg_B, result);
                   1022:        HD6301_SET_H(hd6301_reg_A, hd6301_reg_B, result);
                   1023: 
                   1024:        hd6301_reg_A = result;
                   1025: }
                   1026: 
                   1027: /**
                   1028:  * BRA : branch always
                   1029:  *
                   1030:  * HINZVC
                   1031:  * ......
                   1032:  */
                   1033: static void hd6301_bra(void)
                   1034: {
                   1035:        Sint8 addr;
                   1036: 
                   1037:        addr = hd6301_read_memory(hd6301_reg_PC + 1);
                   1038:        hd6301_reg_PC += addr + 2;
                   1039: }
                   1040: 
                   1041: /**
                   1042:  * BRN : branch never
                   1043:  *
                   1044:  * HINZVC
                   1045:  * ......
                   1046:  */
                   1047: static void hd6301_brn(void)
                   1048: {
                   1049:        hd6301_reg_PC += 2;
                   1050: }
                   1051: 
                   1052: /**
                   1053:  * BHI : branch if higher : C|Z=0
                   1054:  *
                   1055:  * HINZVC
                   1056:  * ......
                   1057:  */
                   1058: static void hd6301_bhi(void)
                   1059: {
                   1060:        Sint8 addr;
                   1061:        Uint8 bitC, bitZ;
                   1062: 
                   1063:        bitC = (hd6301_reg_CCR >> hd6301_REG_CCR_C) & 1;
                   1064:        bitZ = (hd6301_reg_CCR >> hd6301_REG_CCR_Z) & 1;
                   1065:        addr = 2;
                   1066:        if ((bitC | bitZ) == 0) {
                   1067:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1068:        }
                   1069:        hd6301_reg_PC += addr;
                   1070: }
                   1071: 
                   1072: /**
                   1073:  * BLS : branch if lower or same : C|Z=1
                   1074:  *
                   1075:  * HINZVC
                   1076:  * ......
                   1077:  */
                   1078: static void hd6301_bls(void)
                   1079: {
                   1080:        Sint8 addr;
                   1081:        Uint8 bitC, bitZ;
                   1082: 
                   1083:        bitC = (hd6301_reg_CCR >> hd6301_REG_CCR_C) & 1;
                   1084:        bitZ = (hd6301_reg_CCR >> hd6301_REG_CCR_Z) & 1;
                   1085:        addr = 2;
                   1086:        if ((bitC | bitZ) == 1) {
                   1087:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1088:        }
                   1089:        hd6301_reg_PC += addr;
                   1090: }
                   1091: 
                   1092: /**
                   1093:  * BCC : branch if carry clear : C=0
                   1094:  *
                   1095:  * HINZVC
                   1096:  * ......
                   1097:  */
                   1098: static void hd6301_bcc(void)
                   1099: {
                   1100:        Sint8 addr;
                   1101:        Uint8 bitC;
                   1102: 
                   1103:        bitC = (hd6301_reg_CCR >> hd6301_REG_CCR_C) & 1;
                   1104:        addr = 2;
                   1105:        if (bitC == 0) {
                   1106:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1107:        }
                   1108:        hd6301_reg_PC += addr;
                   1109: }
                   1110: 
                   1111: /**
                   1112:  * BCS : branch if carry set : C=1
                   1113:  *
                   1114:  * HINZVC
                   1115:  * ......
                   1116:  */
                   1117: static void hd6301_bcs(void)
                   1118: {
                   1119:        Sint8 addr;
                   1120:        Uint8 bitC;
                   1121: 
                   1122:        bitC = (hd6301_reg_CCR >> hd6301_REG_CCR_C) & 1;
                   1123:        addr = 2;
                   1124:        if (bitC == 1) {
                   1125:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1126:        }
                   1127:        hd6301_reg_PC += addr;
                   1128: }
                   1129: 
                   1130: /**
                   1131:  * BNE : branch if not equal 0 : Z=0
                   1132:  *
                   1133:  * HINZVC
                   1134:  * ......
                   1135:  */
                   1136: static void hd6301_bne(void)
                   1137: {
                   1138:        Sint8 addr;
                   1139:        Uint8 bitZ;
                   1140: 
                   1141:        bitZ = (hd6301_reg_CCR >> hd6301_REG_CCR_Z) & 1;
                   1142:        addr = 2;
                   1143:        if (bitZ == 0) {
                   1144:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1145:        }
                   1146:        hd6301_reg_PC += addr;
                   1147: }
                   1148: 
                   1149: /**
                   1150:  * BEQ : branch if equal 0 : Z=1
                   1151:  *
                   1152:  * HINZVC
                   1153:  * ......
                   1154:  */
                   1155: static void hd6301_beq(void)
                   1156: {
                   1157:        Sint8 addr;
                   1158:        Uint8 bitZ;
                   1159: 
                   1160:        bitZ = (hd6301_reg_CCR >> hd6301_REG_CCR_Z) & 1;
                   1161:        addr = 2;
                   1162:        if (bitZ == 1) {
                   1163:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1164:        }
                   1165:        hd6301_reg_PC += addr;
                   1166: }
                   1167: 
                   1168: /**
                   1169:  * BVC : branch if overflow clear : V=0
                   1170:  *
                   1171:  * HINZVC
                   1172:  * ......
                   1173:  */
                   1174: static void hd6301_bvc(void)
                   1175: {
                   1176:        Sint8 addr;
                   1177:        Uint8 bitV;
                   1178: 
                   1179:        bitV = (hd6301_reg_CCR >> hd6301_REG_CCR_V) & 1;
                   1180:        addr = 2;
                   1181:        if (bitV == 0) {
                   1182:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1183:        }
                   1184:        hd6301_reg_PC += addr;
                   1185: }
                   1186: 
                   1187: /**
                   1188:  * BVS : branch if overflow set : V=1
                   1189:  *
                   1190:  * HINZVC
                   1191:  * ......
                   1192:  */
                   1193: static void hd6301_bvs(void)
                   1194: {
                   1195:        Sint8 addr;
                   1196:        Uint8 bitV;
                   1197: 
                   1198:        bitV = (hd6301_reg_CCR >> hd6301_REG_CCR_V) & 1;
                   1199:        addr = 2;
                   1200:        if (bitV == 1) {
                   1201:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1202:        }
                   1203:        hd6301_reg_PC += addr;
                   1204: }
                   1205: 
                   1206: /**
                   1207:  * BPL : branch if plus : N=0
                   1208:  *
                   1209:  * HINZVC
                   1210:  * ......
                   1211:  */
                   1212: static void hd6301_bpl(void)
                   1213: {
                   1214:        Sint8 addr;
                   1215:        Uint8 bitN;
                   1216: 
                   1217:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1218:        addr = 2;
                   1219:        if (bitN == 0) {
                   1220:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1221:        }
                   1222:        hd6301_reg_PC += addr;
                   1223: }
                   1224: 
                   1225: /**
                   1226:  * BMI : branch if minus : N=1
                   1227:  *
                   1228:  * HINZVC
                   1229:  * ......
                   1230:  */
                   1231: static void hd6301_bmi(void)
                   1232: {
                   1233:        Sint8 addr;
                   1234:        Uint8 bitN;
                   1235: 
                   1236:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1237:        addr = 2;
                   1238:        if (bitN == 1) {
                   1239:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1240:        }
                   1241:        hd6301_reg_PC += addr;
                   1242: }
                   1243: 
                   1244: /**
                   1245:  * BGE : branch if greater or equal to zero : N^V=0
                   1246:  *
                   1247:  * HINZVC
                   1248:  * ......
                   1249:  */
                   1250: static void hd6301_bge(void)
                   1251: {
                   1252:        Sint8 addr;
                   1253:        Uint8 bitN, bitV;
                   1254: 
                   1255:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1256:        bitV = (hd6301_reg_CCR >> hd6301_REG_CCR_V) & 1;
                   1257:        addr = 2;
                   1258:        if ((bitN ^ bitV) == 0) {
                   1259:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1260:        }
                   1261:        hd6301_reg_PC += addr;
                   1262: }
                   1263: 
                   1264: /**
                   1265:  * BLT : branch if lower to zero : N^V=1
                   1266:  *
                   1267:  * HINZVC
                   1268:  * ......
                   1269:  */
                   1270: static void hd6301_blt(void)
                   1271: {
                   1272:        Sint8 addr;
                   1273:        Uint8 bitN, bitV;
                   1274: 
                   1275:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1276:        bitV = (hd6301_reg_CCR >> hd6301_REG_CCR_V) & 1;
                   1277:        addr = 2;
                   1278:        if ((bitN ^ bitV) == 1) {
                   1279:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1280:        }
                   1281:        hd6301_reg_PC += addr;
                   1282: }
                   1283: 
                   1284: /**
                   1285:  * BGT : branch if greater to zero : Z|(N^V)=0
                   1286:  *
                   1287:  * HINZVC
                   1288:  * ......
                   1289:  */
                   1290: static void hd6301_bgt(void)
                   1291: {
                   1292:        Sint8 addr;
                   1293:        Uint8 bitN, bitV, bitZ;
                   1294: 
                   1295:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1296:        bitV = (hd6301_reg_CCR >> hd6301_REG_CCR_V) & 1;
                   1297:        bitZ = (hd6301_reg_CCR >> hd6301_REG_CCR_Z) & 1;
                   1298:        addr = 2;
                   1299:        if ((bitZ | (bitN ^ bitV)) == 0) {
                   1300:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1301:        }
                   1302:        hd6301_reg_PC += addr;
                   1303: }
                   1304: 
                   1305: /**
                   1306:  * BLE : branch if lower or equal to zero : Z|(N^V)=1
                   1307:  *
                   1308:  * HINZVC
                   1309:  * ......
                   1310:  */
                   1311: static void hd6301_ble(void)
                   1312: {
                   1313:        Sint8 addr;
                   1314:        Uint8 bitN, bitV, bitZ;
                   1315: 
                   1316:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1317:        bitV = (hd6301_reg_CCR >> hd6301_REG_CCR_V) & 1;
                   1318:        bitZ = (hd6301_reg_CCR >> hd6301_REG_CCR_Z) & 1;
                   1319:        addr = 2;
                   1320:        if ((bitZ | (bitN ^ bitV)) == 1) {
                   1321:                addr += hd6301_read_memory(hd6301_reg_PC + 1);
                   1322:        }
                   1323:        hd6301_reg_PC += addr;
                   1324: }
                   1325: 
                   1326: /**
                   1327:  * TSX : transfer stack pointer to register X : X=SP+1
                   1328:  *
                   1329:  * HINZVC
                   1330:  * ......
                   1331:  */
                   1332: static void hd6301_tsx(void)
                   1333: {
                   1334:        hd6301_reg_X = hd6301_reg_SP + 1;
                   1335: }
                   1336: 
                   1337: /**
                   1338:  * INS : increment stack pointer : SP=SP+1
                   1339:  *
                   1340:  * HINZVC
                   1341:  * ......
                   1342:  */
                   1343: static void hd6301_ins(void)
                   1344: {
                   1345:        ++ hd6301_reg_SP;
                   1346: }
                   1347: 
                   1348: /**
                   1349:  * PULA : pull accumulator A from stack : SP=SP+1 ; A=(SP)
                   1350:  *
                   1351:  * HINZVC
                   1352:  * ......
                   1353:  */
                   1354: static void hd6301_pula(void)
                   1355: {
                   1356:        ++ hd6301_reg_SP;
                   1357:        hd6301_reg_A = hd6301_read_memory(hd6301_reg_SP);
                   1358: }
                   1359: 
                   1360: /**
                   1361:  * PULB : pull accumulator B from stack : SP=SP+1 ; B=(SP)
                   1362:  *
                   1363:  * HINZVC
                   1364:  * ......
                   1365:  */
                   1366: static void hd6301_pulb(void)
                   1367: {
                   1368:        ++ hd6301_reg_SP;
                   1369:        hd6301_reg_B = hd6301_read_memory(hd6301_reg_SP);
                   1370: }
                   1371: 
                   1372: /**
                   1373:  * DES : decrement stack pointer : SP=SP-1
                   1374:  *
                   1375:  * HINZVC
                   1376:  * ......
                   1377:  */
                   1378: static void hd6301_des(void)
                   1379: {
                   1380:        -- hd6301_reg_SP;
                   1381: }
                   1382: 
                   1383: /**
                   1384:  * TXS : transfer register X to stack pointer : SP=X-1
                   1385:  *
                   1386:  * HINZVC
                   1387:  * ......
                   1388:  */
                   1389: static void hd6301_txs(void)
                   1390: {
                   1391:        hd6301_reg_SP = hd6301_reg_X - 1;
                   1392: }
                   1393: 
                   1394: /**
                   1395:  * PSHA : push accumulator A to stack : (SP)=A ; SP=SP-1
                   1396:  *
                   1397:  * HINZVC
                   1398:  * ......
                   1399:  */
                   1400: static void hd6301_psha(void)
                   1401: {
                   1402:        hd6301_write_memory(hd6301_reg_SP, hd6301_reg_A);
                   1403:        -- hd6301_reg_SP;
                   1404: }
                   1405: 
                   1406: /**
                   1407:  * PSHB : push accumulator B to stack : (SP)=B ; SP=SP-1
                   1408:  *
                   1409:  * HINZVC
                   1410:  * ......
                   1411:  */
                   1412: static void hd6301_pshb(void)
                   1413: {
                   1414:        hd6301_write_memory(hd6301_reg_SP, hd6301_reg_B);
                   1415:        -- hd6301_reg_SP;
                   1416: }
                   1417: 
                   1418: /**
                   1419:  * PULX : pull register X from stack : SP=SP+1 ; X=(SP)
                   1420:  *
                   1421:  * HINZVC
                   1422:  * ......
                   1423:  */
                   1424: static void hd6301_pulx(void)
                   1425: {
                   1426:        hd6301_reg_X = hd6301_read_memory(++hd6301_reg_SP)<<8;
                   1427:        hd6301_reg_X += hd6301_read_memory(++hd6301_reg_SP);
                   1428: }
                   1429: 
                   1430: /**
                   1431:  * RTS : return from subroutine
                   1432:  *
                   1433:  * HINZVC
                   1434:  * ......
                   1435:  */
                   1436: static void hd6301_rts(void)
                   1437: {
                   1438:        hd6301_reg_PC = hd6301_read_memory(++hd6301_reg_SP)<<8;
                   1439:        hd6301_reg_PC += hd6301_read_memory(++hd6301_reg_SP);
                   1440: }
                   1441: 
                   1442: /**
                   1443:  * ABX : add accumulator B to register X : X=X+B
                   1444:  *
                   1445:  * HINZVC
                   1446:  * ......
                   1447:  */
                   1448: static void hd6301_abx(void)
                   1449: {
                   1450:        hd6301_reg_X += hd6301_reg_B;
                   1451: }
                   1452: 
                   1453: /**
                   1454:  * RTI : return from interrupt
                   1455:  *
                   1456:  * HINZVC
                   1457:  * ******
                   1458:  */
                   1459: static void hd6301_rti(void)
                   1460: {
                   1461:        hd6301_reg_CCR = hd6301_read_memory(++hd6301_reg_SP);
                   1462:        hd6301_reg_B = hd6301_read_memory(++hd6301_reg_SP);
                   1463:        hd6301_reg_A = hd6301_read_memory(++hd6301_reg_SP);
                   1464:        hd6301_reg_X = hd6301_read_memory(++hd6301_reg_SP)<<8;
                   1465:        hd6301_reg_X += hd6301_read_memory(++hd6301_reg_SP);
                   1466:        hd6301_reg_PC = hd6301_read_memory(++hd6301_reg_SP)<<8;
                   1467:        hd6301_reg_PC += hd6301_read_memory(++hd6301_reg_SP);
                   1468: }
                   1469: 
                   1470: /**
                   1471:  * PSHX : push register X to stack : (SP)=X ; SP=SP-1
                   1472:  *
                   1473:  * HINZVC
                   1474:  * ......
                   1475:  */
                   1476: static void hd6301_pshx(void)
                   1477: {
                   1478:        hd6301_write_memory(hd6301_reg_SP--, hd6301_reg_X & 0xff);
                   1479:        hd6301_write_memory(hd6301_reg_SP--, hd6301_reg_X >> 8);
                   1480: }
                   1481: 
                   1482: /**
                   1483:  * MUL : multiply unsigned : D=A*B
                   1484:  *
                   1485:  * HINZVC
                   1486:  * .....*
                   1487:  */
                   1488: static void hd6301_mul(void)
                   1489: {
                   1490:        Uint16 regD;
                   1491: 
                   1492:        regD = hd6301_reg_B * hd6301_reg_A;
                   1493:        hd6301_reg_A = regD >> 8;
                   1494:        hd6301_reg_B = regD;
                   1495: 
                   1496:        HD6301_CLR_C;
                   1497:        hd6301_reg_CCR |= hd6301_reg_B >> 7;
                   1498: }
                   1499: 
                   1500: /**
                   1501:  * WAI : wait for interrupt
                   1502:  *
                   1503:  * HINZVC
                   1504:  * .*....
                   1505:  */
                   1506: static void hd6301_wai(void)
                   1507: {
                   1508:        /* Todo */
                   1509: }
                   1510: 
                   1511: /**
                   1512:  * SWI : software interrupt
                   1513:  *
                   1514:  * HINZVC
                   1515:  * .1....
                   1516:  */
                   1517: static void hd6301_swi(void)
                   1518: {
                   1519:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC+1) & 0xff);
                   1520:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC+1) >> 8);
                   1521:        hd6301_write_memory(hd6301_reg_SP--, hd6301_reg_X & 0xff);
                   1522:        hd6301_write_memory(hd6301_reg_SP--, hd6301_reg_X >> 8);
                   1523:        hd6301_write_memory(hd6301_reg_SP--, hd6301_reg_A);
                   1524:        hd6301_write_memory(hd6301_reg_SP--, hd6301_reg_B);
                   1525:        hd6301_write_memory(hd6301_reg_SP--, hd6301_reg_CCR);
                   1526: 
                   1527:        hd6301_reg_PC = hd6301_read_memory(0xfffa) << 8;
                   1528:        hd6301_reg_PC += hd6301_read_memory(0xfffb);
                   1529: 
                   1530:        hd6301_reg_CCR |= 1 << hd6301_REG_CCR_I;
                   1531: }
                   1532: 
                   1533: /**
                   1534:  * NEGA : negate accumulator A : A=0-A
                   1535:  *
                   1536:  * HINZVC
                   1537:  * ..****
                   1538:  */
                   1539: static void hd6301_nega(void)
                   1540: {
                   1541:        Uint8 value;
                   1542: 
                   1543:        value = 0 - hd6301_reg_A;
                   1544:        hd6301_reg_A = value;
                   1545: 
                   1546:        HD6301_CLR_NZVC;
                   1547:        HD6301_SET_NZ8(value);
                   1548:        hd6301_reg_CCR |= (value != 0x0);
                   1549:        hd6301_reg_CCR |= (value == 0x80) << hd6301_REG_CCR_V;
                   1550: }
                   1551: 
                   1552: /**
                   1553:  * COMA : complement 1 accumulator A : A=~A
                   1554:  *
                   1555:  * HINZVC
                   1556:  * ..**01
                   1557:  */
                   1558: static void hd6301_coma(void)
                   1559: {
                   1560:        hd6301_reg_A = ~hd6301_reg_A;
                   1561: 
                   1562:        HD6301_CLR_NZV;
                   1563:        hd6301_reg_CCR |= 1;
                   1564:        HD6301_SET_NZ8(hd6301_reg_A);
                   1565: }
                   1566: 
                   1567: /**
                   1568:  * LSRA : logical shift right, accumulator A : A=A>>1
                   1569:  *
                   1570:  * HINZVC
                   1571:  * ..0***
                   1572:  */
                   1573: static void hd6301_lsra(void)
                   1574: {
                   1575:        Uint8  carry;
                   1576: 
                   1577:        carry = hd6301_reg_A & 1;
                   1578:        hd6301_reg_A >>= 1;
                   1579: 
                   1580:        HD6301_CLR_NZVC;
                   1581:        hd6301_reg_CCR |= carry;
                   1582:        HD6301_SET_Z8(hd6301_reg_A);
                   1583:        hd6301_reg_CCR |= ((0 ^ carry) == 1) << hd6301_REG_CCR_V;
                   1584: }
                   1585: 
                   1586: /**
                   1587:  * RORA : rotate right, accumulator A : A=A>>1 + carry<<8
                   1588:  *
                   1589:  * HINZVC
                   1590:  * ..****
                   1591:  */
                   1592: static void hd6301_rora(void)
                   1593: {
                   1594:        Uint8  carry, result, bitN;
                   1595: 
                   1596:        carry = hd6301_reg_A & 1;
                   1597:        result = (hd6301_reg_CCR & 1) << 7;
                   1598:        result += hd6301_reg_A >> 1;
                   1599:        hd6301_reg_A = result;
                   1600: 
                   1601:        HD6301_CLR_NZVC;
                   1602:        hd6301_reg_CCR |= carry;
                   1603:        HD6301_SET_NZ8(hd6301_reg_A);
                   1604:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1605:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   1606: }
                   1607: 
                   1608: /**
                   1609:  * ASRA : arithmetic shift right, accumulator A : A=A>>1
                   1610:  *
                   1611:  * HINZVC
                   1612:  * ..****
                   1613:  */
                   1614: static void hd6301_asra(void)
                   1615: {
                   1616:        Uint8  carry, bitN;
                   1617: 
                   1618:        carry = hd6301_reg_A & 1;
                   1619:        hd6301_reg_A >>= 1;
                   1620:        hd6301_reg_A |= (hd6301_reg_A & 0x40) << 1;
                   1621: 
                   1622:        HD6301_CLR_NZVC;
                   1623:        hd6301_reg_CCR |= carry;
                   1624:        HD6301_SET_NZ8(hd6301_reg_A);
                   1625:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1626:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   1627: }
                   1628: 
                   1629: /**
                   1630:  * ASLA : arithmetic shift left, accumulator A : A=A<<1
                   1631:  *
                   1632:  * HINZVC
                   1633:  * ..****
                   1634:  */
                   1635: static void hd6301_asla(void)
                   1636: {
                   1637:        Uint8  carry, bitN;
                   1638: 
                   1639:        carry = (hd6301_reg_A & 0X80) >> 7;
                   1640:        hd6301_reg_A <<= 1;
                   1641: 
                   1642:        HD6301_CLR_NZVC;
                   1643:        hd6301_reg_CCR |= carry;
                   1644:        HD6301_SET_NZ8(hd6301_reg_A);
                   1645:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1646:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   1647: }
                   1648: 
                   1649: /**
                   1650:  * ROLA : rotate left, accumulator A : A=A<<1 +C
                   1651:  *
                   1652:  * HINZVC
                   1653:  * ..****
                   1654:  */
                   1655: static void hd6301_rola(void)
                   1656: {
                   1657:        Uint8  carry, result, bitN;
                   1658: 
                   1659:        carry = (hd6301_reg_A & 0x80) >> 7;
                   1660:        result = hd6301_reg_CCR & 1;
                   1661:        result += hd6301_reg_A << 1;
                   1662:        hd6301_reg_A  = result;
                   1663: 
                   1664:        HD6301_CLR_NZVC;
                   1665:        hd6301_reg_CCR |= carry;
                   1666:        HD6301_SET_NZ8(hd6301_reg_A);
                   1667:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1668:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   1669: }
                   1670: 
                   1671: /**
                   1672:  * DECA : decrement accumulator A : A=A-1
                   1673:  *
                   1674:  * HINZVC
                   1675:  * ..***.
                   1676:  */
                   1677: static void hd6301_deca(void)
                   1678: {
                   1679:        Uint8 overflow;
                   1680: 
                   1681:        overflow = (hd6301_reg_A == (Sint8)0x80) << hd6301_REG_CCR_V;
                   1682:        -- hd6301_reg_A;
                   1683: 
                   1684:        HD6301_CLR_NZV;
                   1685:        hd6301_reg_CCR |= overflow;
                   1686:        HD6301_SET_NZ8(hd6301_reg_A);
                   1687: }
                   1688: 
                   1689: /**
                   1690:  * INCA : increment accumulator A : A=A+1
                   1691:  *
                   1692:  * HINZVC
                   1693:  * ..***.
                   1694:  */
                   1695: static void hd6301_inca(void)
                   1696: {
                   1697:        Uint8 overflow;
                   1698: 
                   1699:        overflow = (hd6301_reg_A == 0x7f) << hd6301_REG_CCR_V;
                   1700:        hd6301_reg_A ++;
                   1701: 
                   1702:        HD6301_CLR_NZV;
                   1703:        hd6301_reg_CCR |= overflow;
                   1704:        HD6301_SET_NZ8(hd6301_reg_A);
                   1705: }
                   1706: 
                   1707: /**
                   1708:  * TSTA : test zero or minus, accumulator A : A-0
                   1709:  *
                   1710:  * HINZVC
                   1711:  * ..**00
                   1712:  */
                   1713: static void hd6301_tsta(void)
                   1714: {
                   1715:        HD6301_CLR_NZVC;
                   1716:        HD6301_SET_NZ8(hd6301_reg_A);
                   1717: }
                   1718: 
                   1719: /**
                   1720:  * CLRA : clear accumulator A : A=0
                   1721:  *
                   1722:  * HINZVC
                   1723:  * ..0100
                   1724:  */
                   1725: static void hd6301_clra(void)
                   1726: {
                   1727:        hd6301_reg_A = 0;
                   1728:        HD6301_CLR_NZVC;
                   1729:        hd6301_reg_CCR |= 1 << hd6301_REG_CCR_Z;
                   1730: }
                   1731: 
                   1732: /**
                   1733:  * NEGB : negate accumulator B : B=0-B
                   1734:  *
                   1735:  * HINZVC
                   1736:  * ..****
                   1737:  */
                   1738: static void hd6301_negb(void)
                   1739: {
                   1740:        Uint8 value;
                   1741: 
                   1742:        value = 0 - hd6301_reg_B;
                   1743:        hd6301_reg_B = value;
                   1744: 
                   1745:        HD6301_CLR_NZVC;
                   1746:        HD6301_SET_NZ8(value);
                   1747:        hd6301_reg_CCR |= (value != 0x0);
                   1748:        hd6301_reg_CCR |= (value == 0x80) << hd6301_REG_CCR_V;
                   1749: }
                   1750: 
                   1751: /**
                   1752:  * COMB : complement 1 accumulator B : B=~B
                   1753:  *
                   1754:  * HINZVC
                   1755:  * ..**01
                   1756:  */
                   1757: static void hd6301_comb(void)
                   1758: {
                   1759:        hd6301_reg_B = ~hd6301_reg_B;
                   1760:        HD6301_CLR_NZVC;
                   1761:        hd6301_reg_CCR |= 1;
                   1762:        HD6301_SET_NZ8(hd6301_reg_B);
                   1763: }
                   1764: 
                   1765: /**
                   1766:  * LSRB : logical shift right, accumulator B : B=B>>1
                   1767:  *
                   1768:  * HINZVC
                   1769:  * ..0***
                   1770:  */
                   1771: static void hd6301_lsrb(void)
                   1772: {
                   1773:        Uint8  carry;
                   1774: 
                   1775:        carry = hd6301_reg_B & 1;
                   1776:        hd6301_reg_B >>= 1;
                   1777: 
                   1778:        HD6301_CLR_NZVC;
                   1779:        hd6301_reg_CCR |= carry;
                   1780:        HD6301_SET_Z8(hd6301_reg_B);
                   1781:        hd6301_reg_CCR |= ((0 ^ carry) == 1) << hd6301_REG_CCR_V;
                   1782: }
                   1783: 
                   1784: /**
                   1785:  * RORB : rotate right, accumulator B : B=B>>1 + carry<<8
                   1786:  *
                   1787:  * HINZVC
                   1788:  * ..****
                   1789:  */
                   1790: static void hd6301_rorb(void)
                   1791: {
                   1792:        Uint8  carry, result, bitN;
                   1793: 
                   1794:        carry = hd6301_reg_B & 1;
                   1795:        result = (hd6301_reg_CCR & 1) << 7;
                   1796:        result += hd6301_reg_B >> 1;
                   1797:        hd6301_reg_B = result;
                   1798: 
                   1799:        HD6301_CLR_NZVC;
                   1800:        hd6301_reg_CCR |= carry;
                   1801:        HD6301_SET_NZ8(hd6301_reg_B);
                   1802:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1803:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   1804: }
                   1805: 
                   1806: /**
                   1807:  * ASRB : arithmetic shift right, accumulator B : B=B>>1
                   1808:  *
                   1809:  * HINZVC
                   1810:  * ..****
                   1811:  */
                   1812: static void hd6301_asrb(void)
                   1813: {
                   1814:        Uint8  carry, bitN;
                   1815: 
                   1816:        carry = hd6301_reg_B & 1;
                   1817:        hd6301_reg_B >>= 1;
                   1818:        hd6301_reg_B |= (hd6301_reg_B & 0x40) << 1;
                   1819: 
                   1820:        HD6301_CLR_NZVC;
                   1821:        hd6301_reg_CCR |= carry;
                   1822:        HD6301_SET_NZ8(hd6301_reg_B);
                   1823:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1824:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   1825: }
                   1826: 
                   1827: /**
                   1828:  * ASLB : arithmetic shift left, accumulator B : B=B<<1
                   1829:  *
                   1830:  * HINZVC
                   1831:  * ..****
                   1832:  */
                   1833: static void hd6301_aslb(void)
                   1834: {
                   1835:        Uint8  carry, bitN;
                   1836: 
                   1837:        carry = (hd6301_reg_B & 0x80) >> 7;
                   1838:        hd6301_reg_B <<= 1;
                   1839: 
                   1840:        HD6301_CLR_NZVC;
                   1841:        hd6301_reg_CCR |= carry;
                   1842:        HD6301_SET_NZ8(hd6301_reg_B);
                   1843:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1844:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   1845: }
                   1846: 
                   1847: /**
                   1848:  * ROLB : rotate left, accumulator B : B=B<<1 +C
                   1849:  *
                   1850:  * HINZVC
                   1851:  * ..****
                   1852:  */
                   1853: static void hd6301_rolb(void)
                   1854: {
                   1855:        Uint8  carry, result, bitN;
                   1856: 
                   1857:        carry = (hd6301_reg_B & 0x80) >> 7;
                   1858:        result = hd6301_reg_CCR & 1;
                   1859:        result += hd6301_reg_B << 1;
                   1860:        hd6301_reg_B  = result;
                   1861: 
                   1862:        HD6301_CLR_NZVC;
                   1863:        hd6301_reg_CCR |= carry;
                   1864:        HD6301_SET_NZ8(hd6301_reg_B);
                   1865:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   1866:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   1867: }
                   1868: 
                   1869: /**
                   1870:  * DECB : decrement accumulator B : B=B-1
                   1871:  *
                   1872:  * HINZVC
                   1873:  * ..***.
                   1874:  */
                   1875: static void hd6301_decb(void)
                   1876: {
                   1877:        Uint8 overflow;
                   1878: 
                   1879:        overflow = (hd6301_reg_B == (Sint8)0x80) << hd6301_REG_CCR_V;
                   1880:        -- hd6301_reg_B;
                   1881: 
                   1882:        HD6301_CLR_NZV;
                   1883:        hd6301_reg_CCR |= overflow;
                   1884:        HD6301_SET_NZ8(hd6301_reg_B);
                   1885: }
                   1886: 
                   1887: /**
                   1888:  * INCB : increment accumulator B : B=B+1
                   1889:  *
                   1890:  * HINZVC
                   1891:  * ..***.
                   1892:  */
                   1893: static void hd6301_incb(void)
                   1894: {
                   1895:        Uint8 overflow;
                   1896: 
                   1897:        overflow = (hd6301_reg_B == 0x7f) << hd6301_REG_CCR_V;
                   1898:        hd6301_reg_B ++;
                   1899: 
                   1900:        HD6301_CLR_NZV;
                   1901:        hd6301_reg_CCR |= overflow;
                   1902:        HD6301_SET_NZ8(hd6301_reg_B);
                   1903: }
                   1904: 
                   1905: /**
                   1906:  * TSTB : test zero or minus, accumulator B : B-0
                   1907:  *
                   1908:  * HINZVC
                   1909:  * ..**00
                   1910:  */
                   1911: static void hd6301_tstb(void)
                   1912: {
                   1913:        HD6301_CLR_NZVC;
                   1914:        HD6301_SET_NZ8(hd6301_reg_B);
                   1915: }
                   1916: 
                   1917: /**
                   1918:  * CLRB : clear accumulator B : B=0
                   1919:  *
                   1920:  * HINZVC
                   1921:  * ..0100
                   1922:  */
                   1923: static void hd6301_clrb(void)
                   1924: {
                   1925:        hd6301_reg_B = 0;
                   1926:        HD6301_CLR_NZVC;
                   1927:        hd6301_reg_CCR |= 1 << hd6301_REG_CCR_Z;
                   1928: }
                   1929: 
                   1930: /**
                   1931:  * NEG_IND : negate indexed memory : M=0-M
                   1932:  *
                   1933:  * HINZVC
                   1934:  * ..****
                   1935:  */
                   1936: static void hd6301_neg_ind(void)
                   1937: {
                   1938:        Uint8  value;
                   1939:        Uint16 addr;
                   1940: 
                   1941:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   1942:        value = -hd6301_read_memory(addr);
                   1943:        hd6301_write_memory(addr, value);
                   1944: 
                   1945:        HD6301_CLR_NZVC;
                   1946:        hd6301_reg_CCR |= (value != 0x0);
                   1947:        hd6301_reg_CCR |= (value == 0x80) << hd6301_REG_CCR_V;
                   1948:        HD6301_SET_NZ8(value);
                   1949: }
                   1950: 
                   1951: /**
                   1952:  * AIM_IND : and immediate indexed memory : M=M&IMM
                   1953:  *
                   1954:  * HINZVC
                   1955:  * ..**0.
                   1956:  */
                   1957: static void hd6301_aim_ind(void)
                   1958: {
                   1959:        Uint8  value;
                   1960:        Uint16 addr;
                   1961: 
                   1962:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   1963:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+2);
                   1964:        value &= hd6301_read_memory(addr);
                   1965:        hd6301_write_memory(addr, value);
                   1966: 
                   1967:        HD6301_CLR_NZV;
                   1968:        HD6301_SET_NZ8(value);
                   1969: }
                   1970: 
                   1971: /**
                   1972:  * OIM_IND : or immediate indexed memory : M=M|IMM
                   1973:  *
                   1974:  * HINZVC
                   1975:  * ..**0.
                   1976:  */
                   1977: static void hd6301_oim_ind(void)
                   1978: {
                   1979:        Uint8  value;
                   1980:        Uint16 addr;
                   1981: 
                   1982:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   1983:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+2);
                   1984:        value |= hd6301_read_memory(addr);
                   1985:        hd6301_write_memory(addr, value);
                   1986: 
                   1987:        HD6301_CLR_NZV;
                   1988:        HD6301_SET_NZ8(value);
                   1989: }
                   1990: 
                   1991: /**
                   1992:  * COM_IND : complement 1 indexed memory : M=~M
                   1993:  *
                   1994:  * HINZVC
                   1995:  * ..**01
                   1996:  */
                   1997: static void hd6301_com_ind(void)
                   1998: {
                   1999:        Uint8  value;
                   2000:        Uint16 addr;
                   2001: 
                   2002:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2003:        value = ~hd6301_read_memory(addr);
                   2004:        hd6301_write_memory(addr, value);
                   2005: 
                   2006:        HD6301_CLR_NZV;
                   2007:        hd6301_reg_CCR |= 1;
                   2008:        HD6301_SET_NZ8(value);
                   2009: }
                   2010: 
                   2011: /**
                   2012:  * LSR_IND : logical shift right indexed memory : M=M>>1
                   2013:  *
                   2014:  * HINZVC
                   2015:  * ..0***
                   2016:  */
                   2017: static void hd6301_lsr_ind(void)
                   2018: {
                   2019:        Uint8  value, carry;
                   2020:        Uint16 addr;
                   2021: 
                   2022:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2023:        value = hd6301_read_memory(addr);
                   2024: 
                   2025:        carry = value & 1;
                   2026:        value >>= 1;
                   2027:        hd6301_write_memory(addr, value);
                   2028: 
                   2029:        HD6301_CLR_NZVC;
                   2030:        hd6301_reg_CCR |= carry;
                   2031:        HD6301_SET_Z8(value);
                   2032:        hd6301_reg_CCR |= ((0 ^ carry) == 1) << hd6301_REG_CCR_V;
                   2033: }
                   2034: 
                   2035: /**
                   2036:  * EIM_IND : eor immediate indexed memory : M=M^IMM
                   2037:  *
                   2038:  * HINZVC
                   2039:  * ..**0.
                   2040:  */
                   2041: static void hd6301_eim_ind(void)
                   2042: {
                   2043:        Uint8  value;
                   2044:        Uint16 addr;
                   2045: 
                   2046:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2047:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+2);
                   2048:        value ^= hd6301_read_memory(addr);
                   2049:        hd6301_write_memory(addr, value);
                   2050: 
                   2051:        HD6301_CLR_NZV;
                   2052:        HD6301_SET_NZ8(value);
                   2053: }
                   2054: 
                   2055: /**
                   2056:  * ROR_IND : rotate right indexed memory : M=M>>1 + carry<<8
                   2057:  *
                   2058:  * HINZVC
                   2059:  * ..****
                   2060:  */
                   2061: static void hd6301_ror_ind(void)
                   2062: {
                   2063:        Uint8  value, carry, result, bitN;
                   2064:        Uint16 addr;
                   2065: 
                   2066:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2067:        value = hd6301_read_memory(addr);
                   2068: 
                   2069:        carry = value & 1;
                   2070:        result = (hd6301_reg_CCR & 1) << 7;
                   2071:        result += value >> 1;
                   2072:        hd6301_write_memory(addr, result);
                   2073: 
                   2074:        HD6301_CLR_NZVC;
                   2075:        hd6301_reg_CCR |= carry;
                   2076:        HD6301_SET_NZ8(result);
                   2077:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   2078:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   2079: }
                   2080: 
                   2081: /**
                   2082:  * ASR_IND : arithmetic shift right indexed memory : M=M>>1
                   2083:  *
                   2084:  * HINZVC
                   2085:  * ..****
                   2086:  */
                   2087: static void hd6301_asr_ind(void)
                   2088: {
                   2089:        Uint8  value, carry, bitN;
                   2090:        Uint16 addr;
                   2091: 
                   2092:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2093:        value = hd6301_read_memory(addr);
                   2094: 
                   2095:        carry = value & 1;
                   2096:        value >>= 1;
                   2097:        value |= (value & 0x40) << 1;
                   2098:        hd6301_write_memory(addr, value);
                   2099: 
                   2100:        HD6301_CLR_NZVC;
                   2101:        hd6301_reg_CCR |= carry;
                   2102:        HD6301_SET_NZ8(value);
                   2103:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   2104:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   2105: }
                   2106: 
                   2107: /**
                   2108:  * ASL_IND : arithmetic shift left indexed memory : M=M<<1
                   2109:  *
                   2110:  * HINZVC
                   2111:  * ..****
                   2112:  */
                   2113: static void hd6301_asl_ind(void)
                   2114: {
                   2115:        Uint8  value, carry, bitN;
                   2116:        Uint16 addr;
                   2117: 
                   2118:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2119:        value = hd6301_read_memory(addr);
                   2120: 
                   2121:        carry = (value & 0X80) >> 7;
                   2122:        value <<= 1;
                   2123:        hd6301_write_memory(addr, value);
                   2124: 
                   2125:        HD6301_CLR_NZVC;
                   2126:        hd6301_reg_CCR |= carry;
                   2127:        HD6301_SET_NZ8(value);
                   2128:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   2129:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   2130: }
                   2131: 
                   2132: /**
                   2133:  * ROL_IND : rotate left indexed memory : M=M<<1 + carry
                   2134:  *
                   2135:  * HINZVC
                   2136:  * ..****
                   2137:  */
                   2138: static void hd6301_rol_ind(void)
                   2139: {
                   2140:        Uint8  value, carry, result, bitN;
                   2141:        Uint16 addr;
                   2142: 
                   2143:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2144:        value = hd6301_read_memory(addr);
                   2145: 
                   2146:        result = hd6301_reg_CCR & 1;
                   2147:        carry = (value & 0x80) >> 7;
                   2148:        result += value << 1;
                   2149:        hd6301_write_memory(addr, result);
                   2150: 
                   2151:        HD6301_CLR_NZVC;
                   2152:        hd6301_reg_CCR |= carry;
                   2153:        HD6301_SET_NZ8(result);
                   2154:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   2155:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   2156: }
                   2157: 
                   2158: /**
                   2159:  * DEC_IND : decrement indexed memory : M=M-1
                   2160:  *
                   2161:  * HINZVC
                   2162:  * ..***.
                   2163:  */
                   2164: static void hd6301_dec_ind(void)
                   2165: {
                   2166:        Uint8  value, overflow;
                   2167:        Uint16 addr;
                   2168: 
                   2169:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2170:        value = hd6301_read_memory(addr);
                   2171: 
                   2172:        overflow = (value == 0x80) << hd6301_REG_CCR_V;
                   2173:        --value;
                   2174:        hd6301_write_memory(addr, value);
                   2175: 
                   2176:        HD6301_CLR_NZV;
                   2177:        hd6301_reg_CCR |= overflow;
                   2178:        HD6301_SET_NZ8(value);
                   2179: }
                   2180: 
                   2181: /**
                   2182:  * TIM_IND : test immediate indexed memory : M&IMM
                   2183:  *
                   2184:  * HINZVC
                   2185:  * ..**0.
                   2186:  */
                   2187: static void hd6301_tim_ind(void)
                   2188: {
                   2189:        Uint8  value;
                   2190:        Uint16 addr;
                   2191: 
                   2192:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2193:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+2);
                   2194:        value &= hd6301_read_memory(addr);
                   2195:        hd6301_write_memory(addr, value);
                   2196: 
                   2197:        HD6301_CLR_NZV;
                   2198:        HD6301_SET_NZ8(value);
                   2199: }
                   2200: 
                   2201: /**
                   2202:  * INC_IND : increment indexed memory : M=M+1
                   2203:  *
                   2204:  * HINZVC
                   2205:  * ..***.
                   2206:  */
                   2207: static void hd6301_inc_ind(void)
                   2208: {
                   2209:        Uint8  value, overflow;
                   2210:        Uint16 addr;
                   2211: 
                   2212:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2213:        value = hd6301_read_memory(addr);
                   2214: 
                   2215:        overflow = (value == 0x7f) << hd6301_REG_CCR_V;
                   2216:        value ++;
                   2217:        hd6301_write_memory(addr, value);
                   2218: 
                   2219:        HD6301_CLR_NZV;
                   2220:        hd6301_reg_CCR |= overflow;
                   2221:        HD6301_SET_NZ8(value);
                   2222: }
                   2223: 
                   2224: /**
                   2225:  * TST_IND : test indexed memory : M-0
                   2226:  *
                   2227:  * HINZVC
                   2228:  * ..**00
                   2229:  */
                   2230: static void hd6301_tst_ind(void)
                   2231: {
                   2232:        Uint8  value;
                   2233:        Uint16 addr;
                   2234: 
                   2235:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2236:        value = hd6301_read_memory(addr);
                   2237: 
                   2238:        HD6301_CLR_NZVC;
                   2239:        HD6301_SET_NZ8(value);
                   2240: }
                   2241: 
                   2242: /**
                   2243:  * JMP_IND : jump to indexed memory address : PC=M
                   2244:  *
                   2245:  * HINZVC
                   2246:  * ......
                   2247:  */
                   2248: static void hd6301_jmp_ind(void)
                   2249: {
                   2250:        Uint8  value;
                   2251:        Uint16 addr;
                   2252: 
                   2253:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2254:        value = hd6301_read_memory(addr);
                   2255:        hd6301_reg_PC = value;
                   2256: }
                   2257: 
                   2258: /**
                   2259:  * CLR_IND : clear indexed memory : M=0
                   2260:  *
                   2261:  * HINZVC
                   2262:  * ..0100
                   2263:  */
                   2264: static void hd6301_clr_ind(void)
                   2265: {
                   2266:        Uint16 addr;
                   2267: 
                   2268:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   2269:        hd6301_write_memory(addr, 0);
                   2270: 
                   2271:        HD6301_CLR_NZVC;
                   2272:        hd6301_reg_CCR |= 1 << hd6301_REG_CCR_Z;
                   2273: }
                   2274: 
                   2275: /**
                   2276:  * NEG_EXT : negate extended memory : M=0-M
                   2277:  *
                   2278:  * HINZVC
                   2279:  * ..****
                   2280:  */
                   2281: static void hd6301_neg_ext(void)
                   2282: {
                   2283:        Uint8  value;
                   2284:        Uint16 addr;
                   2285: 
                   2286:        addr = hd6301_get_memory_ext();
                   2287:        value = -hd6301_read_memory(addr);
                   2288:        hd6301_write_memory(addr, value);
                   2289: 
                   2290:        HD6301_CLR_NZVC;
                   2291:        hd6301_reg_CCR |= (value != 0x0);
                   2292:        hd6301_reg_CCR |= (value == 0x80) << hd6301_REG_CCR_V;
                   2293:        HD6301_SET_NZ8(value);
                   2294: }
                   2295: 
                   2296: /**
                   2297:  * AIM_DIR : and immediate direct memory address : M=M&IMM
                   2298:  *
                   2299:  * HINZVC
                   2300:  * ..**0.
                   2301:  */
                   2302: static void hd6301_aim_dir(void)
                   2303: {
                   2304:        Uint8  value;
                   2305:        Uint16 addr;
                   2306: 
                   2307:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2308:        addr = hd6301_read_memory(hd6301_reg_PC+2);
                   2309:        value &= hd6301_read_memory(addr);
                   2310:        hd6301_write_memory(addr, value);
                   2311: 
                   2312:        HD6301_CLR_NZV;
                   2313:        HD6301_SET_NZ8(value);
                   2314: }
                   2315: 
                   2316: /**
                   2317:  * OIM_DIR : or immediate direct memory address : M=M|IMM
                   2318:  *
                   2319:  * HINZVC
                   2320:  * ..**0.
                   2321:  */
                   2322: static void hd6301_oim_dir(void)
                   2323: {
                   2324:        Uint8  value;
                   2325:        Uint16 addr;
                   2326: 
                   2327:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2328:        addr = hd6301_read_memory(hd6301_reg_PC+2);
                   2329:        value |= hd6301_read_memory(addr);
                   2330:        hd6301_write_memory(addr, value);
                   2331: 
                   2332:        HD6301_CLR_NZV;
                   2333:        HD6301_SET_NZ8(value);
                   2334: }
                   2335: 
                   2336: /**
                   2337:  * COM_EXT : complement 1 extended memory : M=~M
                   2338:  *
                   2339:  * HINZVC
                   2340:  * ..**01
                   2341:  */
                   2342: static void hd6301_com_ext(void)
                   2343: {
                   2344:        Uint8  value;
                   2345:        Uint16 addr;
                   2346: 
                   2347:        addr = hd6301_get_memory_ext();
                   2348:        value = ~hd6301_read_memory(addr);
                   2349:        hd6301_write_memory(addr, value);
                   2350: 
                   2351:        HD6301_CLR_NZV;
                   2352:        hd6301_reg_CCR |= 1;
                   2353:        HD6301_SET_NZ8(value);
                   2354: }
                   2355: 
                   2356: /**
                   2357:  * LSR_EXT : logical shift right extended memory : M=M>>1
                   2358:  *
                   2359:  * HINZVC
                   2360:  * ..0***
                   2361:  */
                   2362: static void hd6301_lsr_ext(void)
                   2363: {
                   2364:        Uint8  value, carry;
                   2365:        Uint16 addr;
                   2366: 
                   2367:        addr = hd6301_get_memory_ext();
                   2368:        value = hd6301_read_memory(addr);
                   2369: 
                   2370:        carry = value & 1;
                   2371:        value >>= 1;
                   2372:        hd6301_write_memory(addr, value);
                   2373: 
                   2374:        HD6301_CLR_NZVC;
                   2375:        hd6301_reg_CCR |= carry;
                   2376:        HD6301_SET_Z8(value);
                   2377:        hd6301_reg_CCR |= ((0 ^ carry) == 1) << hd6301_REG_CCR_V;
                   2378: }
                   2379: 
                   2380: /**
                   2381:  * EIM_DIR : eor immediate direct memory address : M=M^IMM
                   2382:  *
                   2383:  * HINZVC
                   2384:  * ..**0.
                   2385:  */
                   2386: static void hd6301_eim_dir(void)
                   2387: {
                   2388:        Uint8  value;
                   2389:        Uint16 addr;
                   2390: 
                   2391:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2392:        addr = hd6301_read_memory(hd6301_reg_PC+2);
                   2393:        value ^= hd6301_read_memory(addr);
                   2394:        hd6301_write_memory(addr, value);
                   2395: 
                   2396:        HD6301_CLR_NZV;
                   2397:        HD6301_SET_NZ8(value);
                   2398: }
                   2399: 
                   2400: /**
                   2401:  * ROR_EXT : rotate right extended memory : M=M>>1 + carry<<8
                   2402:  *
                   2403:  * HINZVC
                   2404:  * ..****
                   2405:  */
                   2406: static void hd6301_ror_ext(void)
                   2407: {
                   2408:        Uint8  value, carry, result, bitN;
                   2409:        Uint16 addr;
                   2410: 
                   2411:        addr = hd6301_get_memory_ext();
                   2412:        value = hd6301_read_memory(addr);
                   2413: 
                   2414:        result = (hd6301_reg_CCR & 1) << 7;
                   2415:        carry = value & 1;
                   2416:        result += value >> 1;
                   2417:        hd6301_write_memory(addr, result);
                   2418: 
                   2419:        HD6301_CLR_NZVC;
                   2420:        hd6301_reg_CCR |= carry;
                   2421:        HD6301_SET_NZ8(value);
                   2422:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   2423:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   2424: }
                   2425: 
                   2426: /**
                   2427:  * ASR_EXT : arithmetic shift right extended memory : M=M>>1
                   2428:  *
                   2429:  * HINZVC
                   2430:  * ..****
                   2431:  */
                   2432: static void hd6301_asr_ext(void)
                   2433: {
                   2434:        Uint8  value, carry, bitN;
                   2435:        Uint16 addr;
                   2436: 
                   2437:        addr = hd6301_get_memory_ext();
                   2438:        value = hd6301_read_memory(addr);
                   2439: 
                   2440:        carry = value & 1;
                   2441:        value >>= 1;
                   2442:        value |= (value & 0x40) << 1;
                   2443:        hd6301_write_memory(addr, value);
                   2444: 
                   2445:        HD6301_CLR_NZVC;
                   2446:        hd6301_reg_CCR |= carry;
                   2447:        HD6301_SET_NZ8(value);
                   2448:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   2449:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   2450: }
                   2451: 
                   2452: /**
                   2453:  * ASL_EXT : arithmetic shift left extended memory : M=M<<1
                   2454:  *
                   2455:  * HINZVC
                   2456:  * ..****
                   2457:  */
                   2458: static void hd6301_asl_ext(void)
                   2459: {
                   2460:        Uint8  value, carry, bitN;
                   2461:        Uint16 addr;
                   2462: 
                   2463:        addr = hd6301_get_memory_ext();
                   2464:        value = hd6301_read_memory(addr);
                   2465: 
                   2466:        carry = (value & 0X80) >> 7;
                   2467:        value <<= 1;
                   2468:        hd6301_write_memory(addr, value);
                   2469: 
                   2470:        HD6301_CLR_NZVC;
                   2471:        hd6301_reg_CCR |= carry;
                   2472:        HD6301_SET_NZ8(value);
                   2473:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   2474:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   2475: }
                   2476: 
                   2477: /**
                   2478:  * ROL_EXT : rotate left extended memory : M=M<<1 + carry
                   2479:  *
                   2480:  * HINZVC
                   2481:  * ..****
                   2482:  */
                   2483: static void hd6301_rol_ext(void)
                   2484: {
                   2485:        Uint8  value, carry, result, bitN;
                   2486:        Uint16 addr;
                   2487: 
                   2488:        addr = hd6301_get_memory_ext();
                   2489:        value = hd6301_read_memory(addr);
                   2490: 
                   2491:        result = hd6301_reg_CCR & 1;
                   2492:        carry = (value & 0x80) >> 7;
                   2493:        result += value << 1;
                   2494:        hd6301_write_memory(addr, result);
                   2495: 
                   2496:        HD6301_CLR_NZVC;
                   2497:        hd6301_reg_CCR |= carry;
                   2498:        HD6301_SET_NZ8(value);
                   2499:        bitN = (hd6301_reg_CCR >> hd6301_REG_CCR_N) & 1;
                   2500:        hd6301_reg_CCR |= ((bitN ^ carry) == 1) << hd6301_REG_CCR_V;
                   2501: }
                   2502: 
                   2503: /**
                   2504:  * DEC_EXT : decrement extended memory : M=M-1
                   2505:  *
                   2506:  * HINZVC
                   2507:  * ..***.
                   2508:  */
                   2509: static void hd6301_dec_ext(void)
                   2510: {
                   2511:        Uint8  value, overflow;
                   2512:        Uint16 addr;
                   2513: 
                   2514:        addr = hd6301_get_memory_ext();
                   2515:        value = hd6301_read_memory(addr);
                   2516: 
                   2517:        overflow = (value == 0x80) << hd6301_REG_CCR_V;
                   2518:        --value;
                   2519:        hd6301_write_memory(addr, value);
                   2520: 
                   2521:        HD6301_CLR_NZV;
                   2522:        hd6301_reg_CCR |= overflow;
                   2523:        HD6301_SET_NZ8(value);
                   2524: }
                   2525: 
                   2526: /**
                   2527:  * TIM_DIR : test direct memory address value : M&IMM
                   2528:  *
                   2529:  * HINZVC
                   2530:  * ..**0.
                   2531:  */
                   2532: static void hd6301_tim_dir(void)
                   2533: {
                   2534:        Uint8  value;
                   2535:        Uint16 addr;
                   2536: 
                   2537:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2538:        addr = hd6301_read_memory(hd6301_reg_PC+2);
                   2539:        value &= hd6301_read_memory(addr);
                   2540:        hd6301_write_memory(addr, value);
                   2541: 
                   2542:        HD6301_CLR_NZV;
                   2543:        HD6301_SET_NZ8(value);
                   2544: }
                   2545: 
                   2546: /**
                   2547:  * INC_EXT : increment extended memory : M=M+1
                   2548:  *
                   2549:  * HINZVC
                   2550:  * ..***.
                   2551:  */
                   2552: static void hd6301_inc_ext(void)
                   2553: {
                   2554:        Uint8  value, overflow;
                   2555:        Uint16 addr;
                   2556: 
                   2557:        addr = hd6301_get_memory_ext();
                   2558:        value = hd6301_read_memory(addr);
                   2559: 
                   2560:        overflow = (value == 0x7f) << hd6301_REG_CCR_V;
                   2561:        value ++;
                   2562:        hd6301_write_memory(addr, value);
                   2563: 
                   2564:        HD6301_CLR_NZV;
                   2565:        hd6301_reg_CCR |= overflow;
                   2566:        HD6301_SET_NZ8(value);
                   2567: }
                   2568: 
                   2569: /**
                   2570:  * TST_EXT : test extended memory : M-0
                   2571:  *
                   2572:  * HINZVC
                   2573:  * ..**00
                   2574:  */
                   2575: static void hd6301_tst_ext(void)
                   2576: {
                   2577:        Uint8  value;
                   2578:        Uint16 addr;
                   2579: 
                   2580:        addr = hd6301_get_memory_ext();
                   2581:        value = hd6301_read_memory(addr);
                   2582: 
                   2583:        HD6301_CLR_NZVC;
                   2584:        HD6301_SET_NZ8(value);
                   2585: }
                   2586: 
                   2587: /**
                   2588:  * JMP_EXT : jump to extended memory address : PC=M
                   2589:  *
                   2590:  * HINZVC
                   2591:  * ......
                   2592:  */
                   2593: static void hd6301_jmp_ext(void)
                   2594: {
                   2595:        Uint8  value;
                   2596:        Uint16 addr;
                   2597: 
                   2598:        addr = hd6301_get_memory_ext();
                   2599:        value = hd6301_read_memory(addr);
                   2600: 
                   2601:        hd6301_reg_PC = value;
                   2602: }
                   2603: 
                   2604: /**
                   2605:  * CLR_EXT : clear extended memory : M=0
                   2606:  *
                   2607:  * HINZVC
                   2608:  * ..0100
                   2609:  */
                   2610: static void hd6301_clr_ext(void)
                   2611: {
                   2612:        Uint16 addr;
                   2613: 
                   2614:        addr = hd6301_get_memory_ext();
                   2615:        hd6301_write_memory(addr, 0);
                   2616: 
                   2617:        HD6301_CLR_NZVC;
                   2618:        hd6301_reg_CCR |= 1 << hd6301_REG_CCR_Z;
                   2619: }
                   2620: 
                   2621: /**
                   2622:  * SUBA_IMM : substract immediate value from accumulator A : A=A-M
                   2623:  *
                   2624:  * HINZVC
                   2625:  * ..****
                   2626:  */
                   2627: static void hd6301_suba_imm(void)
                   2628: {
                   2629:        Uint8  value;
                   2630:        Uint16 result;
                   2631: 
                   2632:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2633:        result = hd6301_reg_A - value;
                   2634: 
                   2635:        HD6301_CLR_NZVC;
                   2636:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   2637: 
                   2638:        hd6301_reg_A = result;
                   2639: }
                   2640: 
                   2641: /**
                   2642:  * CMPA_IMM : compare immediate value to accumulator A : A-M
                   2643:  *
                   2644:  * HINZVC
                   2645:  * ..****
                   2646:  */
                   2647: static void hd6301_cmpa_imm(void)
                   2648: {
                   2649:        Uint8  value;
                   2650:        Uint16 result;
                   2651: 
                   2652:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2653:        result = hd6301_reg_A - value;
                   2654: 
                   2655:        HD6301_CLR_NZVC;
                   2656:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   2657: }
                   2658: 
                   2659: /**
                   2660:  * SBCA_IMM : substract with carry immediate value from accumulator A : A=A-M-C
                   2661:  *
                   2662:  * HINZVC
                   2663:  * ..****
                   2664:  */
                   2665: static void hd6301_sbca_imm(void)
                   2666: {
                   2667:        Uint8  value, carry;
                   2668:        Uint16 result;
                   2669: 
                   2670:        carry = hd6301_REG_CCR_C & 1;
                   2671:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2672:        result = hd6301_reg_A - value - carry;
                   2673: 
                   2674:        HD6301_CLR_NZVC;
                   2675:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   2676: 
                   2677:        hd6301_reg_A = result;
                   2678: }
                   2679: 
                   2680: /**
                   2681:  * SUBD_IMM : substract immediate value from accumulator D : D=D-MM
                   2682:  *
                   2683:  * HINZVC
                   2684:  * ..****
                   2685:  */
                   2686: static void hd6301_subd_imm(void)
                   2687: {
                   2688:        Uint16 value, regD;
                   2689:        Uint32 result;
                   2690: 
                   2691:        value = hd6301_read_memory(hd6301_reg_PC+1) << 8;
                   2692:        value += hd6301_read_memory(hd6301_reg_PC+2);
                   2693:        regD = (hd6301_reg_A << 8) + hd6301_reg_B;
                   2694:        result = regD - value;
                   2695: 
                   2696:        hd6301_reg_A = (result >> 8) & 0xff;
                   2697:        hd6301_reg_B = result & 0xff;
                   2698: 
                   2699:        HD6301_CLR_NZVC;
                   2700:        HD6301_SET_FLAGS16(regD, value, result);
                   2701: }
                   2702: 
                   2703: /**
                   2704:  * ANDA_IMM : and immediate value with accumulator A : A=A&M
                   2705:  *
                   2706:  * HINZVC
                   2707:  * ..**0.
                   2708:  */
                   2709: static void hd6301_anda_imm(void)
                   2710: {
                   2711:        hd6301_reg_A &= hd6301_read_memory(hd6301_reg_PC+1);
                   2712: 
                   2713:        HD6301_CLR_NZV;
                   2714:        HD6301_SET_NZ8(hd6301_reg_A);
                   2715: }
                   2716: 
                   2717: /**
                   2718:  * BITA_IMM : bit test immediate value with accumulator A : A&M
                   2719:  *
                   2720:  * HINZVC
                   2721:  * ..**0.
                   2722:  */
                   2723: static void hd6301_bita_imm(void)
                   2724: {
                   2725:        Uint8 value;
                   2726:        
                   2727:        value = hd6301_reg_A & hd6301_read_memory(hd6301_reg_PC+1);
                   2728: 
                   2729:        HD6301_CLR_NZV;
                   2730:        HD6301_SET_NZ8(value);
                   2731: }
                   2732: 
                   2733: /**
                   2734:  * LDAA_IMM : load accumulator A with immediate value : A=M
                   2735:  *
                   2736:  * HINZVC
                   2737:  * ..**0.
                   2738:  */
                   2739: static void hd6301_ldaa_imm(void)
                   2740: {
                   2741:        hd6301_reg_A = hd6301_read_memory(hd6301_reg_PC+1);
                   2742: 
                   2743:        HD6301_CLR_NZV;
                   2744:        HD6301_SET_NZ8(hd6301_reg_A);
                   2745: }
                   2746: 
                   2747: /**
                   2748:  * EORA_IMM : exclusive or immediate value with accumulator A : A=A^M
                   2749:  *
                   2750:  * HINZVC
                   2751:  * ..**0.
                   2752:  */
                   2753: static void hd6301_eora_imm(void)
                   2754: {
                   2755:        hd6301_reg_A ^= hd6301_read_memory(hd6301_reg_PC+1);
                   2756: 
                   2757:        HD6301_CLR_NZV;
                   2758:        HD6301_SET_NZ8(hd6301_reg_A);
                   2759: }
                   2760: 
                   2761: /**
                   2762:  * ADCA_IMM : add with carry immediate value to accumulator A : A=A+M+C
                   2763:  *
                   2764:  * HINZVC
                   2765:  * *.****
                   2766:  */
                   2767: static void hd6301_adca_imm(void)
                   2768: {
                   2769:        Uint8  value, carry;
                   2770:        Uint16 result;
                   2771: 
                   2772:        carry = hd6301_REG_CCR_C & 1;
                   2773:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2774:        result = hd6301_reg_A + value + carry;
                   2775: 
                   2776:        HD6301_CLR_HNZVC;
                   2777:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   2778:        HD6301_SET_H(hd6301_reg_A, value, result);
                   2779: 
                   2780:        hd6301_reg_A = result;
                   2781: }
                   2782: 
                   2783: /**
                   2784:  * ORAA_IMM : inclusive or accumulator A with immediate value : A=A|M
                   2785:  *
                   2786:  * HINZVC
                   2787:  * ..**0.
                   2788:  */
                   2789: static void hd6301_oraa_imm(void)
                   2790: {
                   2791:        hd6301_reg_A |= hd6301_read_memory(hd6301_reg_PC+1);
                   2792: 
                   2793:        HD6301_CLR_NZV;
                   2794:        HD6301_SET_NZ8(hd6301_reg_A);
                   2795: }
                   2796: 
                   2797: /**
                   2798:  * ADDA_IMM : add immediate value with accumulator A : A=A+M
                   2799:  *
                   2800:  * HINZVC
                   2801:  * *.****
                   2802:  */
                   2803: static void hd6301_adda_imm(void)
                   2804: {
                   2805:        Uint8  value;
                   2806:        Uint16 result;
                   2807: 
                   2808:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   2809:        result = hd6301_reg_A + value;
                   2810: 
                   2811:        HD6301_CLR_HNZVC;
                   2812:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   2813:        HD6301_SET_H(hd6301_reg_A, value, result);
                   2814: 
                   2815:        hd6301_reg_A = result;
                   2816: }
                   2817: 
                   2818: /**
                   2819:  * CPX_IMM : compare index register with immediate value : X-MM
                   2820:  *
                   2821:  * HINZVC
                   2822:  * ..****
                   2823:  */
                   2824: static void hd6301_cpx_imm(void)
                   2825: {
                   2826:        Uint16 value;
                   2827:        Uint32 result;
                   2828: 
                   2829:        value = hd6301_read_memory(hd6301_reg_PC+1) << 8;
                   2830:        value += hd6301_read_memory(hd6301_reg_PC+2);
                   2831:        result = hd6301_reg_X - value;
                   2832: 
                   2833:        HD6301_CLR_NZVC;
                   2834:        HD6301_SET_FLAGS16(hd6301_reg_X, value, result);
                   2835: }
                   2836: 
                   2837: /**
                   2838:  * BSR : branch to subroutine
                   2839:  *
                   2840:  * HINZVC
                   2841:  * ......
                   2842:  */
                   2843: static void hd6301_bsr(void)
                   2844: {
                   2845:        Sint8 addr;
                   2846: 
                   2847:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC + 2) & 0xff);
                   2848:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC + 2) >> 8);
                   2849: 
                   2850:        addr = hd6301_read_memory(hd6301_reg_PC + 1);
                   2851:        hd6301_reg_PC += addr + 2;
                   2852: }
                   2853: 
                   2854: /**
                   2855:  * LDS_IMM : load stack pointer with immediate value : SP=MM
                   2856:  *
                   2857:  * HINZVC
                   2858:  * ..**0.
                   2859:  */
                   2860: static void hd6301_lds_imm(void)
                   2861: {
                   2862:        Uint16 value;
                   2863:        
                   2864:        value = hd6301_read_memory(hd6301_reg_PC+1) << 8;
                   2865:        value += hd6301_read_memory(hd6301_reg_PC+2);
                   2866:        hd6301_reg_SP = value;
                   2867: 
                   2868:        HD6301_CLR_NZV;
                   2869:        HD6301_SET_NZ16(value);
                   2870: }
                   2871: 
                   2872: /**
                   2873:  * SUBA_DIR : substract direct memory address value from accumulator A : A=A-M
                   2874:  *
                   2875:  * HINZVC
                   2876:  * ..****
                   2877:  */
                   2878: static void hd6301_suba_dir(void)
                   2879: {
                   2880:        Uint8  value;
                   2881:        Uint16 result, addr;
                   2882: 
                   2883:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   2884:        value = hd6301_read_memory(addr);
                   2885:        result = hd6301_reg_A - value;
                   2886: 
                   2887:        HD6301_CLR_NZVC;
                   2888:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   2889: 
                   2890:        hd6301_reg_A = result;
                   2891: }
                   2892: 
                   2893: /**
                   2894:  * CMPA_DIR : compare direct memory address value to accumulator A : A-M
                   2895:  *
                   2896:  * HINZVC
                   2897:  * ..****
                   2898:  */
                   2899: static void hd6301_cmpa_dir(void)
                   2900: {
                   2901:        Uint8  value;
                   2902:        Uint16 addr, result;
                   2903: 
                   2904:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   2905:        value = hd6301_read_memory(addr);
                   2906:        result = hd6301_reg_A - value;
                   2907: 
                   2908:        HD6301_CLR_NZVC;
                   2909:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   2910: }
                   2911: 
                   2912: /**
                   2913:  * SBCA_DIR : substract with carry direct memory address value from accumulator A : A=A-M-C
                   2914:  *
                   2915:  * HINZVC
                   2916:  * ..****
                   2917:  */
                   2918: static void hd6301_sbca_dir(void)
                   2919: {
                   2920:        Uint8  value, carry;
                   2921:        Uint16 addr, result;
                   2922: 
                   2923:        carry = hd6301_REG_CCR_C & 1;
                   2924:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   2925:        value = hd6301_read_memory(addr);
                   2926:        result = hd6301_reg_A - value - carry;
                   2927: 
                   2928:        HD6301_CLR_NZVC;
                   2929:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   2930: 
                   2931:        hd6301_reg_A = result;
                   2932: }
                   2933: 
                   2934: /**
                   2935:  * SUBD_DIR : substract direct memory address value from accumulator D : D=D-MM
                   2936:  *
                   2937:  * HINZVC
                   2938:  * ..****
                   2939:  */
                   2940: static void hd6301_subd_dir(void)
                   2941: {
                   2942:        Uint16 addr, value, regD;
                   2943:        Uint32 result;
                   2944: 
                   2945:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   2946:        value = hd6301_read_memory(addr) << 8;
                   2947:        value += hd6301_read_memory(addr+1);
                   2948:        regD = (hd6301_reg_A << 8) + hd6301_reg_B;
                   2949:        result = regD - value;
                   2950: 
                   2951:        hd6301_reg_A = (result >> 8) & 0xff;
                   2952:        hd6301_reg_B = result & 0xff;
                   2953: 
                   2954:        HD6301_CLR_NZVC;
                   2955:        HD6301_SET_FLAGS16(regD, value, result);
                   2956: }
                   2957: 
                   2958: /**
                   2959:  * ANDA_DIR : and direct memory address value with accumulator A : A=A&M
                   2960:  *
                   2961:  * HINZVC
                   2962:  * ..**0.
                   2963:  */
                   2964: static void hd6301_anda_dir(void)
                   2965: {
                   2966:        Uint16 addr;
                   2967:        
                   2968:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   2969:        hd6301_reg_A &= hd6301_read_memory(addr);
                   2970: 
                   2971:        HD6301_CLR_NZV;
                   2972:        HD6301_SET_NZ8(hd6301_reg_A);
                   2973: }
                   2974: 
                   2975: /**
                   2976:  * BITA_DIR : bit test direct memory address value with accumulator A : A&M
                   2977:  *
                   2978:  * HINZVC
                   2979:  * ..**0.
                   2980:  */
                   2981: static void hd6301_bita_dir(void)
                   2982: {
                   2983:        Uint8 value;
                   2984:        Uint16 addr;
                   2985:        
                   2986:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   2987:        value = hd6301_reg_A & hd6301_read_memory(addr);
                   2988: 
                   2989:        HD6301_CLR_NZV;
                   2990:        HD6301_SET_NZ8(value);
                   2991: }
                   2992: 
                   2993: /**
                   2994:  * LDAA_DIR : load accumulator A with direct memory address value : A=M
                   2995:  *
                   2996:  * HINZVC
                   2997:  * ..**0.
                   2998:  */
                   2999: static void hd6301_ldaa_dir(void)
                   3000: {
                   3001:        Uint16 addr;
                   3002:        
                   3003:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   3004:        hd6301_reg_A = hd6301_read_memory(addr);
                   3005: 
                   3006:        HD6301_CLR_NZV;
                   3007:        HD6301_SET_NZ8(hd6301_reg_A);
                   3008: }
                   3009: 
                   3010: /**
                   3011:  * STAA_DIR : store accumulator A into direct memory address value : M=A
                   3012:  *
                   3013:  * HINZVC
                   3014:  * ..**0.
                   3015:  */
                   3016: static void hd6301_staa_dir(void)
                   3017: {
                   3018:        Uint16 addr;
                   3019: 
                   3020:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   3021:        hd6301_write_memory(addr, hd6301_reg_A);
                   3022:        
                   3023:        HD6301_CLR_NZV;
                   3024:        HD6301_SET_NZ8(hd6301_reg_A);
                   3025: }
                   3026: 
                   3027: /**
                   3028:  * EORA_DIR : exclusive or direct memory address value with accumulator A : A=A^M
                   3029:  *
                   3030:  * HINZVC
                   3031:  * ..**0.
                   3032:  */
                   3033: static void hd6301_eora_dir(void)
                   3034: {
                   3035:        Uint16 addr;
                   3036: 
                   3037:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   3038:        hd6301_reg_A ^= hd6301_read_memory(addr);
                   3039: 
                   3040:        HD6301_CLR_NZV;
                   3041:        HD6301_SET_NZ8(hd6301_reg_A);
                   3042: }
                   3043: 
                   3044: /**
                   3045:  * ADCA_DIR : add with carry direct memory address value to accumulator A : A=A+M+C
                   3046:  *
                   3047:  * HINZVC
                   3048:  * *.****
                   3049:  */
                   3050: static void hd6301_adca_dir(void)
                   3051: {
                   3052:        Uint8  value, carry;
                   3053:        Uint16 addr, result;
                   3054: 
                   3055:        carry = hd6301_REG_CCR_C & 1;
                   3056:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   3057:        value = hd6301_read_memory(addr);
                   3058:        result = hd6301_reg_A + value + carry;
                   3059: 
                   3060:        HD6301_CLR_HNZVC;
                   3061:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3062:        HD6301_SET_H(hd6301_reg_A, value, result);
                   3063: 
                   3064:        hd6301_reg_A = result;
                   3065: }
                   3066: 
                   3067: /**
                   3068:  * ORAA_DIR : inclusive or accumulator A with direct memory address value : A=A|M
                   3069:  *
                   3070:  * HINZVC
                   3071:  * ..**0.
                   3072:  */
                   3073: static void hd6301_oraa_dir(void)
                   3074: {
                   3075:        Uint16 addr;
                   3076:        
                   3077:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   3078:        hd6301_reg_A |= hd6301_read_memory(addr);
                   3079: 
                   3080:        HD6301_CLR_NZV;
                   3081:        HD6301_SET_NZ8(hd6301_reg_A);
                   3082: }
                   3083: 
                   3084: /**
                   3085:  * ADDA_DIR : add direct memory address value with accumulator A : A=A+M
                   3086:  *
                   3087:  * HINZVC
                   3088:  * *.****
                   3089:  */
                   3090: static void hd6301_adda_dir(void)
                   3091: {
                   3092:        Uint8  value;
                   3093:        Uint16 addr, result;
                   3094: 
                   3095:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   3096:        value = hd6301_read_memory(addr);
                   3097:        result = hd6301_reg_A + value;
                   3098: 
                   3099:        HD6301_CLR_NZVC;
                   3100:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3101:        HD6301_SET_H(hd6301_reg_A, value, result);
                   3102: 
                   3103:        hd6301_reg_A = result;
                   3104: }
                   3105: 
                   3106: /**
                   3107:  * CPX_DIR : compare index register with direct memory address value : X-MM
                   3108:  *
                   3109:  * HINZVC
                   3110:  * ..****
                   3111:  */
                   3112: static void hd6301_cpx_dir(void)
                   3113: {
                   3114:        Uint16 addr, value;
                   3115:        Uint32 result;
                   3116: 
                   3117:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   3118:        value = hd6301_read_memory(addr) << 8;
                   3119:        value += hd6301_read_memory(addr+1);
                   3120:        result = hd6301_reg_X - value;
                   3121: 
                   3122:        HD6301_CLR_NZVC;
                   3123:        HD6301_SET_FLAGS16(hd6301_reg_X, value, result);
                   3124: }
                   3125: 
                   3126: /**
                   3127:  * JSR_DIR : jump to subroutine at direct memory address
                   3128:  *
                   3129:  * HINZVC
                   3130:  * ......
                   3131:  */
                   3132: static void hd6301_jsr_dir(void)
                   3133: {
                   3134:        Uint16 addr;
                   3135: 
                   3136:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC + 2) & 0xff);
                   3137:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC + 2) >> 8);
                   3138: 
                   3139:        addr = hd6301_read_memory(hd6301_reg_PC + 1);
                   3140:        hd6301_reg_PC += addr + 2;
                   3141: }
                   3142: 
                   3143: /**
                   3144:  * LDS_DIR : load stack pointer with direct memory address value : SP=MM
                   3145:  *
                   3146:  * HINZVC
                   3147:  * ..**0.
                   3148:  */
                   3149: static void hd6301_lds_dir(void)
                   3150: {
                   3151:        Uint16 addr;
                   3152:        
                   3153:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   3154:        hd6301_reg_SP = hd6301_read_memory(addr) << 8;
                   3155:        hd6301_reg_SP += hd6301_read_memory(addr+1);
                   3156: 
                   3157:        HD6301_CLR_NZV;
                   3158:        HD6301_SET_NZ16(hd6301_reg_SP);
                   3159: }
                   3160: 
                   3161: /**
                   3162:  * STS_DIR : store stack pointer into direct memory address value : MM=SP
                   3163:  *
                   3164:  * HINZVC
                   3165:  * ..**0.
                   3166:  */
                   3167: static void hd6301_sts_dir(void)
                   3168: {
                   3169:        Uint16 addr;
                   3170:        
                   3171:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   3172:        hd6301_write_memory(addr, hd6301_reg_SP >> 8);
                   3173:        hd6301_write_memory(addr+1, hd6301_reg_SP & 8);
                   3174: 
                   3175:        HD6301_CLR_NZV;
                   3176:        HD6301_SET_NZ16(hd6301_reg_SP);
                   3177: }
                   3178: 
                   3179: /**
                   3180:  * SUBA_IND : substract indexed memory address value from accumulator A : A=A-M
                   3181:  *
                   3182:  * HINZVC
                   3183:  * ..****
                   3184:  */
                   3185: static void hd6301_suba_ind(void)
                   3186: {
                   3187:        Uint8  value;
                   3188:        Uint16 result, addr;
                   3189: 
                   3190:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3191:        value = hd6301_read_memory(addr);
                   3192:        result = hd6301_reg_A - value;
                   3193: 
                   3194:        HD6301_CLR_NZVC;
                   3195:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3196: 
                   3197:        hd6301_reg_A = result;
                   3198: }
                   3199: 
                   3200: /**
                   3201:  * CMPA_IND : compare indexed memory address value to accumulator A : A-M
                   3202:  *
                   3203:  * HINZVC
                   3204:  * ..****
                   3205:  */
                   3206: static void hd6301_cmpa_ind(void)
                   3207: {
                   3208:        Uint8  value;
                   3209:        Uint16 addr, result;
                   3210: 
                   3211:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3212:        value = hd6301_read_memory(addr);
                   3213:        result = hd6301_reg_A - value;
                   3214: 
                   3215:        HD6301_CLR_NZVC;
                   3216:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3217: }
                   3218: 
                   3219: /**
                   3220:  * SBCA_IND : substract with carry indexed memory address value from accumulator A : A=A-M-C
                   3221:  *
                   3222:  * HINZVC
                   3223:  * ..****
                   3224:  */
                   3225: static void hd6301_sbca_ind(void)
                   3226: {
                   3227:        Uint8  value, carry;
                   3228:        Uint16 addr, result;
                   3229: 
                   3230:        carry = hd6301_REG_CCR_C & 1;
                   3231:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3232:        value = hd6301_read_memory(addr);
                   3233:        result = hd6301_reg_A - value - carry;
                   3234: 
                   3235:        HD6301_CLR_NZVC;
                   3236:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3237: 
                   3238:        hd6301_reg_A = result;
                   3239: }
                   3240: 
                   3241: /**
                   3242:  * SUBD_IND : substract indexed memory address value from accumulator D : D=D-MM
                   3243:  *
                   3244:  * HINZVC
                   3245:  * ..****
                   3246:  */
                   3247: static void hd6301_subd_ind(void)
                   3248: {
                   3249:        Uint16 addr, value, regD;
                   3250:        Uint32 result;
                   3251: 
                   3252:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3253:        value = hd6301_read_memory(addr) << 8;
                   3254:        value += hd6301_read_memory(addr+1);
                   3255:        regD = (hd6301_reg_A << 8) + hd6301_reg_B;
                   3256:        result = regD - value;
                   3257: 
                   3258:        hd6301_reg_A = (result >> 8) & 0xff;
                   3259:        hd6301_reg_B = result & 0xff;
                   3260: 
                   3261:        HD6301_CLR_NZVC;
                   3262:        HD6301_SET_FLAGS16(regD, value, result);
                   3263: }
                   3264: 
                   3265: /**
                   3266:  * ANDA_IND : and indexed memory address value with accumulator A : A=A&M
                   3267:  *
                   3268:  * HINZVC
                   3269:  * ..**0.
                   3270:  */
                   3271: static void hd6301_anda_ind(void)
                   3272: {
                   3273:        Uint16 addr;
                   3274:        
                   3275:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3276:        hd6301_reg_A &= hd6301_read_memory(addr);
                   3277: 
                   3278:        HD6301_CLR_NZV;
                   3279:        HD6301_SET_NZ8(hd6301_reg_A);
                   3280: }
                   3281: 
                   3282: /**
                   3283:  * BITA_IND : bit test indexed memory address value with accumulator A : A&M
                   3284:  *
                   3285:  * HINZVC
                   3286:  * ..**0.
                   3287:  */
                   3288: static void hd6301_bita_ind(void)
                   3289: {
                   3290:        Uint8 value;
                   3291:        Uint16 addr;
                   3292:        
                   3293:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3294:        value = hd6301_reg_A & hd6301_read_memory(addr);
                   3295: 
                   3296:        HD6301_CLR_NZV;
                   3297:        HD6301_SET_NZ8(value);
                   3298: }
                   3299: 
                   3300: /**
                   3301:  * LDAA_IND : load accumulator A with indexed memory address value : A=M
                   3302:  *
                   3303:  * HINZVC
                   3304:  * ..**0.
                   3305:  */
                   3306: static void hd6301_ldaa_ind(void)
                   3307: {
                   3308:        Uint16 addr;
                   3309:        
                   3310:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3311:        hd6301_reg_A = hd6301_read_memory(addr);
                   3312: 
                   3313:        HD6301_CLR_NZV;
                   3314:        HD6301_SET_NZ8(hd6301_reg_A);
                   3315: }
                   3316: 
                   3317: /**
                   3318:  * STAA_IND : store accumulator A into indexed memory address value : M=A
                   3319:  *
                   3320:  * HINZVC
                   3321:  * ..**0.
                   3322:  */
                   3323: static void hd6301_staa_ind(void)
                   3324: {
                   3325:        Uint16 addr;
                   3326: 
                   3327:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3328:        hd6301_write_memory(addr, hd6301_reg_A);
                   3329:        
                   3330:        HD6301_CLR_NZV;
                   3331:        HD6301_SET_NZ8(hd6301_reg_A);
                   3332: }
                   3333: 
                   3334: /**
                   3335:  * EORA_IND : exclusive or indexed memory address value with accumulator A : A=A^M
                   3336:  *
                   3337:  * HINZVC
                   3338:  * ..**0.
                   3339:  */
                   3340: static void hd6301_eora_ind(void)
                   3341: {
                   3342:        Uint16 addr;
                   3343: 
                   3344:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3345:        hd6301_reg_A ^= hd6301_read_memory(addr);
                   3346: 
                   3347:        HD6301_CLR_NZV;
                   3348:        HD6301_SET_NZ8(hd6301_reg_A);
                   3349: }
                   3350: 
                   3351: /**
                   3352:  * ADCA_IND : add with carry indexed memory address value to accumulator A : A=A+M+C
                   3353:  *
                   3354:  * HINZVC
                   3355:  * *.****
                   3356:  */
                   3357: static void hd6301_adca_ind(void)
                   3358: {
                   3359:        Uint8  value, carry;
                   3360:        Uint16 addr, result;
                   3361: 
                   3362:        carry = hd6301_REG_CCR_C & 1;
                   3363:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3364:        value = hd6301_read_memory(addr);
                   3365:        result = hd6301_reg_A + value + carry;
                   3366: 
                   3367:        HD6301_CLR_HNZVC;
                   3368:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3369:        HD6301_SET_H(hd6301_reg_A, value, result);
                   3370: 
                   3371:        hd6301_reg_A = result;
                   3372: }
                   3373: 
                   3374: /**
                   3375:  * ORAA_IND : inclusive or accumulator A with indexed memory address value : A=A|M
                   3376:  *
                   3377:  * HINZVC
                   3378:  * ..**0.
                   3379:  */
                   3380: static void hd6301_oraa_ind(void)
                   3381: {
                   3382:        Uint16 addr;
                   3383:        
                   3384:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3385:        hd6301_reg_A |= hd6301_read_memory(addr);
                   3386: 
                   3387:        HD6301_CLR_NZV;
                   3388:        HD6301_SET_NZ8(hd6301_reg_A);
                   3389: }
                   3390: 
                   3391: /**
                   3392:  * ADDA_IND : add indexed memory address value with accumulator A : A=A+M
                   3393:  *
                   3394:  * HINZVC
                   3395:  * *.****
                   3396:  */
                   3397: static void hd6301_adda_ind(void)
                   3398: {
                   3399:        Uint8  value;
                   3400:        Uint16 addr, result;
                   3401: 
                   3402:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3403:        value = hd6301_read_memory(addr);
                   3404:        result = hd6301_reg_A + value;
                   3405: 
                   3406:        HD6301_CLR_HNZVC;
                   3407:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3408:        HD6301_SET_H(hd6301_reg_A, value, result);
                   3409: 
                   3410:        hd6301_reg_A = result;
                   3411: }
                   3412: 
                   3413: /**
                   3414:  * CPX_IND : compare index register with indexed memory address value : X-MM
                   3415:  *
                   3416:  * HINZVC
                   3417:  * ..****
                   3418:  */
                   3419: static void hd6301_cpx_ind(void)
                   3420: {
                   3421:        Uint16 addr, value;
                   3422:        Uint32 result;
                   3423: 
                   3424:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3425:        value = hd6301_read_memory(addr) << 8;
                   3426:        value += hd6301_read_memory(addr+1);
                   3427:        result = hd6301_reg_X - value;
                   3428: 
                   3429:        HD6301_CLR_NZVC;
                   3430:        HD6301_SET_FLAGS16(hd6301_reg_X, value, result);
                   3431: }
                   3432: 
                   3433: /**
                   3434:  * JSR_IND : jump to subroutine at indexed address
                   3435:  *
                   3436:  * HINZVC
                   3437:  * ......
                   3438:  */
                   3439: static void hd6301_jsr_ind(void)
                   3440: {
                   3441:        Uint16 addr;
                   3442: 
                   3443:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC + 2) & 0xff);
                   3444:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC + 2) >> 8);
                   3445: 
                   3446:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3447:        hd6301_reg_PC += addr + 2;
                   3448: }
                   3449: 
                   3450: /**
                   3451:  * LDS_IND : load stack pointer with indexed memory address value : SP=MM
                   3452:  *
                   3453:  * HINZVC
                   3454:  * ..**0.
                   3455:  */
                   3456: static void hd6301_lds_ind(void)
                   3457: {
                   3458:        Uint16 addr;
                   3459:        
                   3460:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3461:        hd6301_reg_SP = hd6301_read_memory(addr) << 8;
                   3462:        hd6301_reg_SP += hd6301_read_memory(addr+1);
                   3463: 
                   3464:        HD6301_CLR_NZV;
                   3465:        HD6301_SET_NZ16(hd6301_reg_SP);
                   3466: }
                   3467: 
                   3468: /**
                   3469:  * STS_IND : store stack pointer into indexed memory address value : MM=SP
                   3470:  *
                   3471:  * HINZVC
                   3472:  * ..**0.
                   3473:  */
                   3474: static void hd6301_sts_ind(void)
                   3475: {
                   3476:        Uint16 addr;
                   3477:        
                   3478:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   3479:        hd6301_write_memory(addr, hd6301_reg_SP >> 8);
                   3480:        hd6301_write_memory(addr+1, hd6301_reg_SP & 8);
                   3481: 
                   3482:        HD6301_CLR_NZV;
                   3483:        HD6301_SET_NZ16(hd6301_reg_SP);
                   3484: }
                   3485: 
                   3486: /**
                   3487:  * SUBA_EXT : substract extented memory address value from accumulator A : A=A-M
                   3488:  *
                   3489:  * HINZVC
                   3490:  * ..****
                   3491:  */
                   3492: static void hd6301_suba_ext(void)
                   3493: {
                   3494:        Uint8  value;
                   3495:        Uint16 result, addr;
                   3496: 
                   3497:        addr = hd6301_get_memory_ext();
                   3498:        value = hd6301_read_memory(addr);
                   3499:        result = hd6301_reg_A - value;
                   3500: 
                   3501:        HD6301_CLR_NZVC;
                   3502:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3503: 
                   3504:        hd6301_reg_A = result;
                   3505: }
                   3506: 
                   3507: /**
                   3508:  * CMPA_EXT : compare extented memory address value to accumulator A : A-M
                   3509:  *
                   3510:  * HINZVC
                   3511:  * ..****
                   3512:  */
                   3513: static void hd6301_cmpa_ext(void)
                   3514: {
                   3515:        Uint8  value;
                   3516:        Uint16 addr, result;
                   3517: 
                   3518:        addr = hd6301_get_memory_ext();
                   3519:        value = hd6301_read_memory(addr);
                   3520:        result = hd6301_reg_A - value;
                   3521: 
                   3522:        HD6301_CLR_NZVC;
                   3523:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3524: }
                   3525: 
                   3526: /**
                   3527:  * SBCA_EXT : substract with carry extented memory address value from accumulator A : A=A-M-C
                   3528:  *
                   3529:  * HINZVC
                   3530:  * ..****
                   3531:  */
                   3532: static void hd6301_sbca_ext(void)
                   3533: {
                   3534:        Uint8  value, carry;
                   3535:        Uint16 addr, result;
                   3536: 
                   3537:        carry = hd6301_REG_CCR_C & 1;
                   3538:        addr = hd6301_get_memory_ext();
                   3539:        value = hd6301_read_memory(addr);
                   3540:        result = hd6301_reg_A - value - carry;
                   3541: 
                   3542:        HD6301_CLR_NZVC;
                   3543:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3544: 
                   3545:        hd6301_reg_A = result;
                   3546: }
                   3547: 
                   3548: /**
                   3549:  * SUBD_EXT : substract extented memory address value from accumulator D : D=D-MM
                   3550:  *
                   3551:  * HINZVC
                   3552:  * ..****
                   3553:  */
                   3554: static void hd6301_subd_ext(void)
                   3555: {
                   3556:        Uint16 addr, value, regD;
                   3557:        Uint32 result;
                   3558: 
                   3559:        addr = hd6301_get_memory_ext();
                   3560:        value = hd6301_read_memory(addr) << 8;
                   3561:        value += hd6301_read_memory(addr+1);
                   3562:        regD = (hd6301_reg_A << 8) + hd6301_reg_B;
                   3563:        result = regD - value;
                   3564: 
                   3565:        hd6301_reg_A = (result >> 8) & 0xff;
                   3566:        hd6301_reg_B = result & 0xff;
                   3567: 
                   3568:        HD6301_CLR_NZVC;
                   3569:        HD6301_SET_FLAGS16(regD, value, result);
                   3570: }
                   3571: 
                   3572: /**
                   3573:  * ANDA_EXT : and extented memory address value with accumulator A : A=A&M
                   3574:  *
                   3575:  * HINZVC
                   3576:  * ..**0.
                   3577:  */
                   3578: static void hd6301_anda_ext(void)
                   3579: {
                   3580:        Uint16 addr;
                   3581:        
                   3582:        addr = hd6301_get_memory_ext();
                   3583:        hd6301_reg_A &= hd6301_read_memory(addr);
                   3584: 
                   3585:        HD6301_CLR_NZV;
                   3586:        HD6301_SET_NZ8(hd6301_reg_A);
                   3587: }
                   3588: 
                   3589: /**
                   3590:  * BITA_EXT : bit test extented memory address value with accumulator A : A&M
                   3591:  *
                   3592:  * HINZVC
                   3593:  * ..**0.
                   3594:  */
                   3595: static void hd6301_bita_ext(void)
                   3596: {
                   3597:        Uint8 value;
                   3598:        Uint16 addr;
                   3599:        
                   3600:        addr = hd6301_get_memory_ext();
                   3601:        value = hd6301_reg_A & hd6301_read_memory(addr);
                   3602: 
                   3603:        HD6301_CLR_NZV;
                   3604:        HD6301_SET_NZ8(value);
                   3605: }
                   3606: 
                   3607: /**
                   3608:  * LDAA_EXT : load accumulator A with extented memory address value : A=M
                   3609:  *
                   3610:  * HINZVC
                   3611:  * ..**0.
                   3612:  */
                   3613: static void hd6301_ldaa_ext(void)
                   3614: {
                   3615:        Uint16 addr;
                   3616:        
                   3617:        addr = hd6301_get_memory_ext();
                   3618:        hd6301_reg_A = hd6301_read_memory(addr);
                   3619: 
                   3620:        HD6301_CLR_NZV;
                   3621:        HD6301_SET_NZ8(hd6301_reg_A);
                   3622: }
                   3623: 
                   3624: /**
                   3625:  * STAA_EXT : store accumulator A into extented memory address value : M=A
                   3626:  *
                   3627:  * HINZVC
                   3628:  * ..**0.
                   3629:  */
                   3630: static void hd6301_staa_ext(void)
                   3631: {
                   3632:        Uint16 addr;
                   3633: 
                   3634:        addr = hd6301_get_memory_ext();
                   3635:        hd6301_write_memory(addr, hd6301_reg_A);
                   3636:        
                   3637:        HD6301_CLR_NZV;
                   3638:        HD6301_SET_NZ8(hd6301_reg_A);
                   3639: }
                   3640: 
                   3641: /**
                   3642:  * EORA_EXT : exclusive or extented memory address value with accumulator A : A=A^M
                   3643:  *
                   3644:  * HINZVC
                   3645:  * ..**0.
                   3646:  */
                   3647: static void hd6301_eora_ext(void)
                   3648: {
                   3649:        Uint16 addr;
                   3650: 
                   3651:        addr = hd6301_get_memory_ext();
                   3652:        hd6301_reg_A ^= hd6301_read_memory(addr);
                   3653: 
                   3654:        HD6301_CLR_NZV;
                   3655:        HD6301_SET_NZ8(hd6301_reg_A);
                   3656: }
                   3657: 
                   3658: /**
                   3659:  * ADCA_EXT : add with carry extented memory address value to accumulator A : A=A+M+C
                   3660:  *
                   3661:  * HINZVC
                   3662:  * *.****
                   3663:  */
                   3664: static void hd6301_adca_ext(void)
                   3665: {
                   3666:        Uint8  value, carry;
                   3667:        Uint16 addr, result;
                   3668: 
                   3669:        carry = hd6301_REG_CCR_C & 1;
                   3670:        addr = hd6301_get_memory_ext();
                   3671:        value = hd6301_read_memory(addr);
                   3672:        result = hd6301_reg_A + value + carry;
                   3673: 
                   3674:        HD6301_CLR_HNZVC;
                   3675:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3676:        HD6301_SET_H(hd6301_reg_A, value, result);
                   3677: 
                   3678:        hd6301_reg_A = result;
                   3679: }
                   3680: 
                   3681: /**
                   3682:  * ORAA_EXT : inclusive or accumulator A with extented memory address value : A=A|M
                   3683:  *
                   3684:  * HINZVC
                   3685:  * ..**0.
                   3686:  */
                   3687: static void hd6301_oraa_ext(void)
                   3688: {
                   3689:        Uint16 addr;
                   3690:        
                   3691:        addr = hd6301_get_memory_ext();
                   3692:        hd6301_reg_A |= hd6301_read_memory(addr);
                   3693: 
                   3694:        HD6301_CLR_NZV;
                   3695:        HD6301_SET_NZ8(hd6301_reg_A);
                   3696: }
                   3697: 
                   3698: /**
                   3699:  * ADDA_EXT : add extented memory address value with accumulator A : A=A+M
                   3700:  *
                   3701:  * HINZVC
                   3702:  * *.****
                   3703:  */
                   3704: static void hd6301_adda_ext(void)
                   3705: {
                   3706:        Uint8  value;
                   3707:        Uint16 addr, result;
                   3708: 
                   3709:        addr = hd6301_get_memory_ext();
                   3710:        value = hd6301_read_memory(addr);
                   3711:        result = hd6301_reg_A + value;
                   3712: 
                   3713:        HD6301_CLR_HNZVC;
                   3714:        HD6301_SET_FLAGS8(hd6301_reg_A, value, result);
                   3715:        HD6301_SET_H(hd6301_reg_A, value, result);
                   3716: 
                   3717:        hd6301_reg_A = result;
                   3718: }
                   3719: 
                   3720: /**
                   3721:  * CPX_EXT : compare index register with extented memory address value : X-MM
                   3722:  *
                   3723:  * HINZVC
                   3724:  * ..****
                   3725:  */
                   3726: static void hd6301_cpx_ext(void)
                   3727: {
                   3728:        Uint16 addr, value;
                   3729:        Uint32 result;
                   3730: 
                   3731:        addr = hd6301_get_memory_ext();
                   3732:        value = hd6301_read_memory(addr) << 8;
                   3733:        value += hd6301_read_memory(addr+1);
                   3734:        result = hd6301_reg_X - value;
                   3735: 
                   3736:        HD6301_CLR_NZVC;
                   3737:        HD6301_SET_FLAGS16(hd6301_reg_X, value, result);
                   3738: }
                   3739: 
                   3740: /**
                   3741:  * JSR_EXT : jump to subroutine at extented address
                   3742:  *
                   3743:  * HINZVC
                   3744:  * ......
                   3745:  */
                   3746: static void hd6301_jsr_ext(void)
                   3747: {
                   3748:        Uint16 addr;
                   3749: 
                   3750:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC + 2) & 0xff);
                   3751:        hd6301_write_memory(hd6301_reg_SP--, (hd6301_reg_PC + 2) >> 8);
                   3752: 
                   3753:        addr = hd6301_get_memory_ext();
                   3754:        hd6301_reg_PC += addr + 2;
                   3755: }
                   3756: 
                   3757: /**
                   3758:  * LDS_EXT : load stack pointer with extented memory address value : SP=MM
                   3759:  *
                   3760:  * HINZVC
                   3761:  * ..**0.
                   3762:  */
                   3763: static void hd6301_lds_ext(void)
                   3764: {
                   3765:        Uint16 addr;
                   3766:        
                   3767:        addr = hd6301_get_memory_ext();
                   3768:        hd6301_reg_SP = hd6301_read_memory(addr) << 8;
                   3769:        hd6301_reg_SP += hd6301_read_memory(addr+1);
                   3770: 
                   3771:        HD6301_CLR_NZV;
                   3772:        HD6301_SET_NZ16(hd6301_reg_SP);
                   3773: }
                   3774: 
                   3775: /**
                   3776:  * STS_EXT : store stack pointer into extented memory address value : MM=SP
                   3777:  *
                   3778:  * HINZVC
                   3779:  * ..**0.
                   3780:  */
                   3781: static void hd6301_sts_ext(void)
                   3782: {
                   3783:        Uint16 addr;
                   3784:        
                   3785:        addr = hd6301_get_memory_ext();
                   3786:        hd6301_write_memory(addr, hd6301_reg_SP >> 8);
                   3787:        hd6301_write_memory(addr+1, hd6301_reg_SP & 8);
                   3788: 
                   3789:        HD6301_CLR_NZV;
                   3790:        HD6301_SET_NZ16(hd6301_reg_SP);
                   3791: }
                   3792: 
                   3793: /**
                   3794:  * SUBB_IMM : substract immediate value from accumulator B : B=B-M
                   3795:  *
                   3796:  * HINZVC
                   3797:  * ..****
                   3798:  */
                   3799: static void hd6301_subb_imm(void)
                   3800: {
                   3801:        Uint8  value;
                   3802:        Uint16 result;
                   3803: 
                   3804:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   3805:        result = hd6301_reg_B - value;
                   3806: 
                   3807:        HD6301_CLR_NZVC;
                   3808:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   3809: 
                   3810:        hd6301_reg_B = result;
                   3811: }
                   3812: 
                   3813: /**
                   3814:  * CMPB_IMM : compare immediate value to accumulator B : B-M
                   3815:  *
                   3816:  * HINZVC
                   3817:  * ..****
                   3818:  */
                   3819: static void hd6301_cmpb_imm(void)
                   3820: {
                   3821:        Uint8  value;
                   3822:        Uint16 result;
                   3823: 
                   3824:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   3825:        result = hd6301_reg_B - value;
                   3826: 
                   3827:        HD6301_CLR_NZVC;
                   3828:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   3829: }
                   3830: 
                   3831: /**
                   3832:  * SBCB_IMM : substract with carry immediate value from accumulator B : B=B-M-C
                   3833:  *
                   3834:  * HINZVC
                   3835:  * ..****
                   3836:  */
                   3837: static void hd6301_sbcb_imm(void)
                   3838: {
                   3839:        Uint8  value, carry;
                   3840:        Uint16 result;
                   3841: 
                   3842:        carry = hd6301_REG_CCR_C & 1;
                   3843:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   3844:        result = hd6301_reg_B - value - carry;
                   3845: 
                   3846:        HD6301_CLR_NZVC;
                   3847:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   3848: 
                   3849:        hd6301_reg_B = result;
                   3850: }
                   3851: 
                   3852: /**
                   3853:  * ADDD_IMM : add immediate value from accumulator D : D=D+MM
                   3854:  *
                   3855:  * HINZVC
                   3856:  * ..****
                   3857:  */
                   3858: static void hd6301_addd_imm(void)
                   3859: {
                   3860:        Uint16 value, regD;
                   3861:        Uint32 result;
                   3862: 
                   3863:        value = hd6301_read_memory(hd6301_reg_PC+1) << 8;
                   3864:        value += hd6301_read_memory(hd6301_reg_PC+2);
                   3865:        regD = (hd6301_reg_A << 8) + hd6301_reg_B;
                   3866:        result = regD + value;
                   3867: 
                   3868:        hd6301_reg_A = (result >> 8) & 0xff;
                   3869:        hd6301_reg_B = result & 0xff;
                   3870: 
                   3871:        HD6301_CLR_NZVC;
                   3872:        HD6301_SET_FLAGS16(regD, value, result);
                   3873: }
                   3874: 
                   3875: /**
                   3876:  * ANDB_IMM : and immediate value with accumulator B : B=B&M
                   3877:  *
                   3878:  * HINZVC
                   3879:  * ..**0.
                   3880:  */
                   3881: static void hd6301_andb_imm(void)
                   3882: {
                   3883:        hd6301_reg_B &= hd6301_read_memory(hd6301_reg_PC+1);
                   3884: 
                   3885:        HD6301_CLR_NZV;
                   3886:        HD6301_SET_NZ8(hd6301_reg_B);
                   3887: }
                   3888: 
                   3889: /**
                   3890:  * BITB_IMM : bit test immediate value with accumulator B : B&M
                   3891:  *
                   3892:  * HINZVC
                   3893:  * ..**0.
                   3894:  */
                   3895: static void hd6301_bitb_imm(void)
                   3896: {
                   3897:        Uint8 value;
                   3898:        
                   3899:        value = hd6301_reg_B & hd6301_read_memory(hd6301_reg_PC+1);
                   3900: 
                   3901:        HD6301_CLR_NZV;
                   3902:        HD6301_SET_NZ8(value);
                   3903: }
                   3904: 
                   3905: /**
                   3906:  * LDAB_IMM : load accumulator B with immediate value : B=M
                   3907:  *
                   3908:  * HINZVC
                   3909:  * ..**0.
                   3910:  */
                   3911: static void hd6301_ldab_imm(void)
                   3912: {
                   3913:        hd6301_reg_B = hd6301_read_memory(hd6301_reg_PC+1);
                   3914: 
                   3915:        HD6301_CLR_NZV;
                   3916:        HD6301_SET_NZ8(hd6301_reg_B);
                   3917: }
                   3918: 
                   3919: /**
                   3920:  * EORB_IMM : exclusive or immediate value with accumulator B : B=B^M
                   3921:  *
                   3922:  * HINZVC
                   3923:  * ..**0.
                   3924:  */
                   3925: static void hd6301_eorb_imm(void)
                   3926: {
                   3927:        hd6301_reg_B ^= hd6301_read_memory(hd6301_reg_PC+1);
                   3928: 
                   3929:        HD6301_CLR_NZV;
                   3930:        HD6301_SET_NZ8(hd6301_reg_B);
                   3931: }
                   3932: 
                   3933: /**
                   3934:  * ADCB_IMM : add with carry immediate value to accumulator B : B=B+M+C
                   3935:  *
                   3936:  * HINZVC
                   3937:  * *.****
                   3938:  */
                   3939: static void hd6301_adcb_imm(void)
                   3940: {
                   3941:        Uint8  value, carry;
                   3942:        Uint16 result;
                   3943: 
                   3944:        carry = hd6301_REG_CCR_C & 1;
                   3945:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   3946:        result = hd6301_reg_B + value + carry;
                   3947: 
                   3948:        HD6301_CLR_HNZVC;
                   3949:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   3950:        HD6301_SET_H(hd6301_reg_B, value, result);
                   3951: 
                   3952:        hd6301_reg_B = result;
                   3953: }
                   3954: 
                   3955: /**
                   3956:  * ORAB_IMM : inclusive or accumulator B with immediate value : B=B|M
                   3957:  *
                   3958:  * HINZVC
                   3959:  * ..**0.
                   3960:  */
                   3961: static void hd6301_orab_imm(void)
                   3962: {
                   3963:        hd6301_reg_B |= hd6301_read_memory(hd6301_reg_PC+1);
                   3964: 
                   3965:        HD6301_CLR_NZV;
                   3966:        HD6301_SET_NZ8(hd6301_reg_B);
                   3967: }
                   3968: 
                   3969: /**
                   3970:  * ADDB_IMM : add immediate value with accumulator B : B=B+M
                   3971:  *
                   3972:  * HINZVC
                   3973:  * ..****
                   3974:  */
                   3975: static void hd6301_addb_imm(void)
                   3976: {
                   3977:        Uint8  value;
                   3978:        Uint16 result;
                   3979: 
                   3980:        value = hd6301_read_memory(hd6301_reg_PC+1);
                   3981:        result = hd6301_reg_B + value;
                   3982: 
                   3983:        HD6301_CLR_HNZVC;
                   3984:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   3985:        HD6301_SET_H(hd6301_reg_B, value, result);
                   3986: 
                   3987:        hd6301_reg_B = result;
                   3988: }
                   3989: 
                   3990: /**
                   3991:  * LDD_IMM : load accumulator D with immediate value : D=MM
                   3992:  *
                   3993:  * HINZVC
                   3994:  * ..**0.
                   3995:  */
                   3996: static void hd6301_ldd_imm(void)
                   3997: {
                   3998:        hd6301_reg_A = hd6301_read_memory(hd6301_reg_PC+1);
                   3999:        hd6301_reg_B = hd6301_read_memory(hd6301_reg_PC+2);
                   4000: 
                   4001:        HD6301_CLR_NZV;
                   4002:        hd6301_reg_CCR |= ((hd6301_reg_A == 0) && (hd6301_reg_B == 0)) << hd6301_REG_CCR_Z;
                   4003:        hd6301_reg_CCR |= (hd6301_reg_A >> 7) << hd6301_REG_CCR_N;
                   4004: }
                   4005: 
                   4006: /**
                   4007:  * LDX_IMM : load register X with immediate value : X=MM
                   4008:  *
                   4009:  * HINZVC
                   4010:  * ..**0.
                   4011:  */
                   4012: static void hd6301_ldx_imm(void)
                   4013: {
                   4014:        Uint16 value;
                   4015:        
                   4016:        value = hd6301_read_memory(hd6301_reg_PC+1) << 8;
                   4017:        value += hd6301_read_memory(hd6301_reg_PC+2);
                   4018:        hd6301_reg_X = value;
                   4019: 
                   4020:        HD6301_CLR_NZV;
                   4021:        HD6301_SET_NZ16(hd6301_reg_X);
                   4022: }
                   4023: 
                   4024: /**
                   4025:  * SUBB_DIR : substract direct memory address value from accumulator B : B=B-M
                   4026:  *
                   4027:  * HINZVC
                   4028:  * ..****
                   4029:  */
                   4030: static void hd6301_subb_dir(void)
                   4031: {
                   4032:        Uint8  value;
                   4033:        Uint16 result, addr;
                   4034: 
                   4035:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4036:        value = hd6301_read_memory(addr);
                   4037:        result = hd6301_reg_B - value;
                   4038: 
                   4039:        HD6301_CLR_NZVC;
                   4040:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4041: 
                   4042:        hd6301_reg_B = result;
                   4043: }
                   4044: 
                   4045: /**
                   4046:  * CMPB_DIR : compare direct memory address value to accumulator B : B-M
                   4047:  *
                   4048:  * HINZVC
                   4049:  * ..****
                   4050:  */
                   4051: static void hd6301_cmpb_dir(void)
                   4052: {
                   4053:        Uint8  value;
                   4054:        Uint16 addr, result;
                   4055: 
                   4056:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4057:        value = hd6301_read_memory(addr);
                   4058:        result = hd6301_reg_B - value;
                   4059: 
                   4060:        HD6301_CLR_NZVC;
                   4061:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4062: }
                   4063: 
                   4064: /**
                   4065:  * SBCB_DIR : substract with carry direct memory address value from accumulator B : B=B-M-C
                   4066:  *
                   4067:  * HINZVC
                   4068:  * ..****
                   4069:  */
                   4070: static void hd6301_sbcb_dir(void)
                   4071: {
                   4072:        Uint8  value, carry;
                   4073:        Uint16 addr, result;
                   4074: 
                   4075:        carry = hd6301_REG_CCR_C & 1;
                   4076:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4077:        value = hd6301_read_memory(addr);
                   4078:        result = hd6301_reg_B - value - carry;
                   4079: 
                   4080:        HD6301_CLR_NZVC;
                   4081:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4082: 
                   4083:        hd6301_reg_B = result;
                   4084: }
                   4085: 
                   4086: /**
                   4087:  * ADDD_DIR : add direct memory address value from accumulator D : D=D+MM
                   4088:  *
                   4089:  * HINZVC
                   4090:  * ..****
                   4091:  */
                   4092: static void hd6301_addd_dir(void)
                   4093: {
                   4094:        Uint16 addr, value, regD;
                   4095:        Uint32 result;
                   4096: 
                   4097:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4098:        value = hd6301_read_memory(addr) << 8;
                   4099:        value += hd6301_read_memory(addr+1);
                   4100:        regD = (hd6301_reg_A << 8) + hd6301_reg_B;
                   4101:        result = regD + value;
                   4102: 
                   4103:        hd6301_reg_A = (result >> 8) & 0xff;
                   4104:        hd6301_reg_B = result & 0xff;
                   4105: 
                   4106:        HD6301_CLR_NZVC;
                   4107:        HD6301_SET_FLAGS16(regD, value, result);
                   4108: }
                   4109: 
                   4110: /**
                   4111:  * ANDB_DIR : and direct memory address value with accumulator B : B=B&M
                   4112:  *
                   4113:  * HINZVC
                   4114:  * ..**0.
                   4115:  */
                   4116: static void hd6301_andb_dir(void)
                   4117: {
                   4118:        Uint16 addr;
                   4119:        
                   4120:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4121:        hd6301_reg_B &= hd6301_read_memory(addr);
                   4122: 
                   4123:        HD6301_CLR_NZV;
                   4124:        HD6301_SET_NZ8(hd6301_reg_B);
                   4125: }
                   4126: 
                   4127: /**
                   4128:  * BITB_DIR : bit test direct memory address value with accumulator B : B&M
                   4129:  *
                   4130:  * HINZVC
                   4131:  * ..**0.
                   4132:  */
                   4133: static void hd6301_bitb_dir(void)
                   4134: {
                   4135:        Uint8 value;
                   4136:        Uint16 addr;
                   4137:        
                   4138:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4139:        value = hd6301_reg_B & hd6301_read_memory(addr);
                   4140: 
                   4141:        HD6301_CLR_NZV;
                   4142:        HD6301_SET_NZ8(value);
                   4143: }
                   4144: 
                   4145: /**
                   4146:  * LDAB_DIR : load accumulator B with direct memory address value : B=M
                   4147:  *
                   4148:  * HINZVC
                   4149:  * ..**0.
                   4150:  */
                   4151: static void hd6301_ldab_dir(void)
                   4152: {
                   4153:        Uint16 addr;
                   4154:        
                   4155:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4156:        hd6301_reg_B = hd6301_read_memory(addr);
                   4157: 
                   4158:        HD6301_CLR_NZV;
                   4159:        HD6301_SET_NZ8(hd6301_reg_B);
                   4160: }
                   4161: 
                   4162: /**
                   4163:  * STAB_DIR : store accumulator B into direct memory address value : M=B
                   4164:  *
                   4165:  * HINZVC
                   4166:  * ..**0.
                   4167:  */
                   4168: static void hd6301_stab_dir(void)
                   4169: {
                   4170:        Uint16 addr;
                   4171: 
                   4172:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4173:        hd6301_write_memory(addr, hd6301_reg_B);
                   4174:        
                   4175:        HD6301_CLR_NZV;
                   4176:        HD6301_SET_NZ8(hd6301_reg_B);
                   4177: }
                   4178: 
                   4179: /**
                   4180:  * EORB_DIR : exclusive or direct memory address value with accumulator B : B=B^M
                   4181:  *
                   4182:  * HINZVC
                   4183:  * ..**0.
                   4184:  */
                   4185: static void hd6301_eorb_dir(void)
                   4186: {
                   4187:        Uint16 addr;
                   4188: 
                   4189:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4190:        hd6301_reg_B ^= hd6301_read_memory(addr);
                   4191: 
                   4192:        HD6301_CLR_NZV;
                   4193:        HD6301_SET_NZ8(hd6301_reg_B);
                   4194: }
                   4195: 
                   4196: /**
                   4197:  * ADCB_DIR : add with carry direct memory address value to accumulator B : B=B+M+C
                   4198:  *
                   4199:  * HINZVC
                   4200:  * *.****
                   4201:  */
                   4202: static void hd6301_adcb_dir(void)
                   4203: {
                   4204:        Uint8  value, carry;
                   4205:        Uint16 addr, result;
                   4206: 
                   4207:        carry = hd6301_REG_CCR_C & 1;
                   4208:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4209:        value = hd6301_read_memory(addr);
                   4210:        result = hd6301_reg_B + value + carry;
                   4211: 
                   4212:        HD6301_CLR_HNZVC;
                   4213:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4214:        HD6301_SET_H(hd6301_reg_B, value, result);
                   4215: 
                   4216:        hd6301_reg_B = result;
                   4217: }
                   4218: 
                   4219: /**
                   4220:  * ORAB_DIR : inclusive or accumulator B with direct memory address value : B=B|M
                   4221:  *
                   4222:  * HINZVC
                   4223:  * ..**0.
                   4224:  */
                   4225: static void hd6301_orab_dir(void)
                   4226: {
                   4227:        Uint16 addr;
                   4228:        
                   4229:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4230:        hd6301_reg_B |= hd6301_read_memory(addr);
                   4231: 
                   4232:        HD6301_CLR_NZV;
                   4233:        HD6301_SET_NZ8(hd6301_reg_B);
                   4234: }
                   4235: 
                   4236: /**
                   4237:  * ADDB_DIR : add direct memory address value with accumulator B : B=B+M
                   4238:  *
                   4239:  * HINZVC
                   4240:  * *.****
                   4241:  */
                   4242: static void hd6301_addb_dir(void)
                   4243: {
                   4244:        Uint8  value;
                   4245:        Uint16 addr, result;
                   4246: 
                   4247:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4248:        value = hd6301_read_memory(addr);
                   4249:        result = hd6301_reg_B + value;
                   4250: 
                   4251:        HD6301_CLR_HNZVC;
                   4252:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4253:        HD6301_SET_H(hd6301_reg_B, value, result);
                   4254: 
                   4255:        hd6301_reg_B = result;
                   4256: }
                   4257: 
                   4258: /**
                   4259:  * LDD_DIR : load accumulator D with direct memory address value : D=MM
                   4260:  *
                   4261:  * HINZVC
                   4262:  * ..**0.
                   4263:  */
                   4264: static void hd6301_ldd_dir(void)
                   4265: {
                   4266:        Uint16 addr;
                   4267:        
                   4268:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4269: 
                   4270:        hd6301_reg_A = hd6301_read_memory(addr);
                   4271:        hd6301_reg_B = hd6301_read_memory(addr+1);
                   4272: 
                   4273:        HD6301_CLR_NZV;
                   4274:        hd6301_reg_CCR |= ((hd6301_reg_A == 0) && (hd6301_reg_B == 0)) << hd6301_REG_CCR_Z;
                   4275:        hd6301_reg_CCR |= (hd6301_reg_A >> 7) << hd6301_REG_CCR_N;
                   4276: }
                   4277: 
                   4278: /**
                   4279:  * STD_DIR : store accumulator D into direct memory address value : MM=D
                   4280:  *
                   4281:  * HINZVC
                   4282:  * ..**0.
                   4283:  */
                   4284: static void hd6301_std_dir(void)
                   4285: {
                   4286:        Uint16 addr;
                   4287:        
                   4288:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4289: 
                   4290:        hd6301_write_memory(addr, hd6301_reg_A);
                   4291:        hd6301_write_memory(addr+1, hd6301_reg_B);
                   4292: 
                   4293:        HD6301_CLR_NZV;
                   4294:        hd6301_reg_CCR |= ((hd6301_reg_A == 0) && (hd6301_reg_B == 0)) << hd6301_REG_CCR_Z;
                   4295:        hd6301_reg_CCR |= (hd6301_reg_A >> 7) << hd6301_REG_CCR_N;
                   4296: }
                   4297: 
                   4298: /**
                   4299:  * LDX_DIR : load register X with direct memory address value : X=MM
                   4300:  *
                   4301:  * HINZVC
                   4302:  * ..**0.
                   4303:  */
                   4304: static void hd6301_ldx_dir(void)
                   4305: {
                   4306:        Uint16 addr;
                   4307:        
                   4308:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4309: 
                   4310:        hd6301_reg_X = hd6301_read_memory(addr) << 8;
                   4311:        hd6301_reg_X += hd6301_read_memory(addr+1);
                   4312: 
                   4313:        HD6301_CLR_NZV;
                   4314:        HD6301_SET_NZ16(hd6301_reg_X);
                   4315: }
                   4316: 
                   4317: /**
                   4318:  * STX_DIR : store register X into direct memory address value : MM=X
                   4319:  *
                   4320:  * HINZVC
                   4321:  * ..**0.
                   4322:  */
                   4323: static void hd6301_stx_dir(void)
                   4324: {
                   4325:        Uint16 addr;
                   4326:        
                   4327:        addr = hd6301_read_memory(hd6301_reg_PC+1);
                   4328: 
                   4329:        hd6301_write_memory(addr, hd6301_reg_X >> 8);
                   4330:        hd6301_write_memory(addr+1, hd6301_reg_X & 0xff);
                   4331: 
                   4332:        HD6301_CLR_NZV;
                   4333:        HD6301_SET_NZ16(hd6301_reg_X);
                   4334: }
                   4335: 
                   4336: /**
                   4337:  * SUBB_IND : substract indexed memory address value from accumulator B : B=B-M
                   4338:  *
                   4339:  * HINZVC
                   4340:  * ..****
                   4341:  */
                   4342: static void hd6301_subb_ind(void)
                   4343: {
                   4344:        Uint8  value;
                   4345:        Uint16 result, addr;
                   4346: 
                   4347:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4348:        value = hd6301_read_memory(addr);
                   4349:        result = hd6301_reg_B - value;
                   4350: 
                   4351:        HD6301_CLR_NZVC;
                   4352:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4353: 
                   4354:        hd6301_reg_B = result;
                   4355: }
                   4356: 
                   4357: /**
                   4358:  * CMPB_IND : compare indexed memory address value to accumulator B : B-M
                   4359:  *
                   4360:  * HINZVC
                   4361:  * ..****
                   4362:  */
                   4363: static void hd6301_cmpb_ind(void)
                   4364: {
                   4365:        Uint8  value;
                   4366:        Uint16 addr, result;
                   4367: 
                   4368:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4369:        value = hd6301_read_memory(addr);
                   4370:        result = hd6301_reg_B - value;
                   4371: 
                   4372:        HD6301_CLR_NZVC;
                   4373:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4374: }
                   4375: 
                   4376: /**
                   4377:  * SBCB_IND : substract with carry indexed memory address value from accumulator B : B=B-M-C
                   4378:  *
                   4379:  * HINZVC
                   4380:  * ..****
                   4381:  */
                   4382: static void hd6301_sbcb_ind(void)
                   4383: {
                   4384:        Uint8  value, carry;
                   4385:        Uint16 addr, result;
                   4386: 
                   4387:        carry = hd6301_REG_CCR_C & 1;
                   4388:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4389:        value = hd6301_read_memory(addr);
                   4390:        result = hd6301_reg_B - value - carry;
                   4391: 
                   4392:        HD6301_CLR_NZVC;
                   4393:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4394: 
                   4395:        hd6301_reg_B = result;
                   4396: }
                   4397: 
                   4398: /**
                   4399:  * ADDD_IND : add indexed memory address value from accumulator D : D=D+MM
                   4400:  *
                   4401:  * HINZVC
                   4402:  * ..****
                   4403:  */
                   4404: static void hd6301_addd_ind(void)
                   4405: {
                   4406:        Uint16 addr, value, regD;
                   4407:        Uint32 result;
                   4408: 
                   4409:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4410:        value = hd6301_read_memory(addr) << 8;
                   4411:        value += hd6301_read_memory(addr+1);
                   4412:        regD = (hd6301_reg_A << 8) + hd6301_reg_B;
                   4413:        result = regD + value;
                   4414: 
                   4415:        hd6301_reg_A = (result >> 8) & 0xff;
                   4416:        hd6301_reg_B = result & 0xff;
                   4417: 
                   4418:        HD6301_CLR_NZVC;
                   4419:        HD6301_SET_FLAGS16(regD, value, result);
                   4420: }
                   4421: 
                   4422: /**
                   4423:  * ANDB_IND : and indexed memory address value with accumulator B : B=B&M
                   4424:  *
                   4425:  * HINZVC
                   4426:  * ..**0.
                   4427:  */
                   4428: static void hd6301_andb_ind(void)
                   4429: {
                   4430:        Uint16 addr;
                   4431:        
                   4432:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4433:        hd6301_reg_B &= hd6301_read_memory(addr);
                   4434: 
                   4435:        HD6301_CLR_NZV;
                   4436:        HD6301_SET_NZ8(hd6301_reg_B);
                   4437: }
                   4438: 
                   4439: /**
                   4440:  * BITB_IND : bit test indexed memory address value with accumulator B : B&M
                   4441:  *
                   4442:  * HINZVC
                   4443:  * ..**0.
                   4444:  */
                   4445: static void hd6301_bitb_ind(void)
                   4446: {
                   4447:        Uint8 value;
                   4448:        Uint16 addr;
                   4449:        
                   4450:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4451:        value = hd6301_reg_B & hd6301_read_memory(addr);
                   4452: 
                   4453:        HD6301_CLR_NZV;
                   4454:        HD6301_SET_NZ8(value);
                   4455: }
                   4456: 
                   4457: /**
                   4458:  * LDAB_IND : load accumulator B with indexed memory address value : B=M
                   4459:  *
                   4460:  * HINZVC
                   4461:  * ..**0.
                   4462:  */
                   4463: static void hd6301_ldab_ind(void)
                   4464: {
                   4465:        Uint16 addr;
                   4466:        
                   4467:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4468:        hd6301_reg_B = hd6301_read_memory(addr);
                   4469: 
                   4470:        HD6301_CLR_NZV;
                   4471:        HD6301_SET_NZ8(hd6301_reg_B);
                   4472: }
                   4473: 
                   4474: /**
                   4475:  * STAB_IND : store accumulator B into indexed memory address value : M=B
                   4476:  *
                   4477:  * HINZVC
                   4478:  * ..**0.
                   4479:  */
                   4480: static void hd6301_stab_ind(void)
                   4481: {
                   4482:        Uint16 addr;
                   4483: 
                   4484:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4485:        hd6301_write_memory(addr, hd6301_reg_B);
                   4486:        
                   4487:        HD6301_CLR_NZV;
                   4488:        HD6301_SET_NZ8(hd6301_reg_B);
                   4489: }
                   4490: 
                   4491: /**
                   4492:  * EORB_IND : exclusive or indexed memory address value with accumulator B : B=B^M
                   4493:  *
                   4494:  * HINZVC
                   4495:  * ..**0.
                   4496:  */
                   4497: static void hd6301_eorb_ind(void)
                   4498: {
                   4499:        Uint16 addr;
                   4500: 
                   4501:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4502:        hd6301_reg_B ^= hd6301_read_memory(addr);
                   4503: 
                   4504:        HD6301_CLR_NZV;
                   4505:        HD6301_SET_NZ8(hd6301_reg_B);
                   4506: }
                   4507: 
                   4508: /**
                   4509:  * ADCB_IND : add with carry indexed memory address value to accumulator B : B=B+M+C
                   4510:  *
                   4511:  * HINZVC
                   4512:  * *.****
                   4513:  */
                   4514: static void hd6301_adcb_ind(void)
                   4515: {
                   4516:        Uint8  value, carry;
                   4517:        Uint16 addr, result;
                   4518: 
                   4519:        carry = hd6301_REG_CCR_C & 1;
                   4520:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4521:        value = hd6301_read_memory(addr);
                   4522:        result = hd6301_reg_B + value + carry;
                   4523: 
                   4524:        HD6301_CLR_HNZVC;
                   4525:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4526:        HD6301_SET_H(hd6301_reg_B, value, result);
                   4527: 
                   4528:        hd6301_reg_B = result;
                   4529: }
                   4530: 
                   4531: /**
                   4532:  * ORAB_IND : inclusive or accumulator B with indexed memory address value : B=B|M
                   4533:  *
                   4534:  * HINZVC
                   4535:  * ..**0.
                   4536:  */
                   4537: static void hd6301_orab_ind(void)
                   4538: {
                   4539:        Uint16 addr;
                   4540:        
                   4541:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4542:        hd6301_reg_B |= hd6301_read_memory(addr);
                   4543: 
                   4544:        HD6301_CLR_NZV;
                   4545:        HD6301_SET_NZ8(hd6301_reg_B);
                   4546: }
                   4547: 
                   4548: /**
                   4549:  * ADDB_IND : add indexed memory address value with accumulator B : B=B+M
                   4550:  *
                   4551:  * HINZVC
                   4552:  * *.****
                   4553:  */
                   4554: static void hd6301_addb_ind(void)
                   4555: {
                   4556:        Uint8  value;
                   4557:        Uint16 addr, result;
                   4558: 
                   4559:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4560:        value = hd6301_read_memory(addr);
                   4561:        result = hd6301_reg_B + value;
                   4562: 
                   4563:        HD6301_CLR_HNZVC;
                   4564:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4565:        HD6301_SET_H(hd6301_reg_B, value, result);
                   4566: 
                   4567:        hd6301_reg_B = result;
                   4568: }
                   4569: 
                   4570: /**
                   4571:  * LDD_IND : load accumulator D with indexed memory address value : D=MM
                   4572:  *
                   4573:  * HINZVC
                   4574:  * ..**0.
                   4575:  */
                   4576: static void hd6301_ldd_ind(void)
                   4577: {
                   4578:        Uint16 addr;
                   4579:        
                   4580:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4581: 
                   4582:        hd6301_reg_A = hd6301_read_memory(addr);
                   4583:        hd6301_reg_B = hd6301_read_memory(addr+1);
                   4584: 
                   4585:        HD6301_CLR_NZV;
                   4586:        hd6301_reg_CCR |= ((hd6301_reg_A == 0) && (hd6301_reg_B == 0)) << hd6301_REG_CCR_Z;
                   4587:        hd6301_reg_CCR |= (hd6301_reg_A >> 7) << hd6301_REG_CCR_N;
                   4588: }
                   4589: 
                   4590: /**
                   4591:  * STD_IND : store accumulator D into indexed memory address value : MM=D
                   4592:  *
                   4593:  * HINZVC
                   4594:  * ..**0.
                   4595:  */
                   4596: static void hd6301_std_ind(void)
                   4597: {
                   4598:        Uint16 addr;
                   4599:        
                   4600:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4601: 
                   4602:        hd6301_write_memory(addr, hd6301_reg_A);
                   4603:        hd6301_write_memory(addr+1, hd6301_reg_B);
                   4604: 
                   4605:        HD6301_CLR_NZV;
                   4606:        hd6301_reg_CCR |= ((hd6301_reg_A == 0) && (hd6301_reg_B == 0)) << hd6301_REG_CCR_Z;
                   4607:        hd6301_reg_CCR |= (hd6301_reg_A >> 7) << hd6301_REG_CCR_N;
                   4608: }
                   4609: 
                   4610: /**
                   4611:  * LDX_IND : load register X with indexed memory address value : X=MM
                   4612:  *
                   4613:  * HINZVC
                   4614:  * ..**0.
                   4615:  */
                   4616: static void hd6301_ldx_ind(void)
                   4617: {
                   4618:        Uint16 addr;
                   4619:        
                   4620:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4621: 
                   4622:        hd6301_reg_X = hd6301_read_memory(addr) << 8;
                   4623:        hd6301_reg_X += hd6301_read_memory(addr+1);
                   4624: 
                   4625:        HD6301_CLR_NZV;
                   4626:        HD6301_SET_NZ16(hd6301_reg_X);
                   4627: }
                   4628: 
                   4629: /**
                   4630:  * STX_IND : store register X into indexed memory address value : MM=X
                   4631:  *
                   4632:  * HINZVC
                   4633:  * ..**0.
                   4634:  */
                   4635: static void hd6301_stx_ind(void)
                   4636: {
                   4637:        Uint16 addr;
                   4638:        
                   4639:        addr = hd6301_reg_X + hd6301_read_memory(hd6301_reg_PC+1);
                   4640: 
                   4641:        hd6301_write_memory(addr, hd6301_reg_X >> 8);
                   4642:        hd6301_write_memory(addr+1, hd6301_reg_X & 0xff);
                   4643: 
                   4644:        HD6301_CLR_NZV;
                   4645:        HD6301_SET_NZ16(hd6301_reg_X);
                   4646: }
                   4647: 
                   4648: /**
                   4649:  * SUBB_EXT : substract extended memory address value from accumulator B : B=B-M
                   4650:  *
                   4651:  * HINZVC
                   4652:  * ..****
                   4653:  */
                   4654: static void hd6301_subb_ext(void)
                   4655: {
                   4656:        Uint8  value;
                   4657:        Uint16 result, addr;
                   4658: 
                   4659:        addr = hd6301_get_memory_ext();
                   4660:        value = hd6301_read_memory(addr);
                   4661:        result = hd6301_reg_B - value;
                   4662: 
                   4663:        HD6301_CLR_NZVC;
                   4664:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4665: 
                   4666:        hd6301_reg_B = result;
                   4667: }
                   4668: 
                   4669: /**
                   4670:  * CMPB_EXT : compare extended memory address value to accumulator B : B-M
                   4671:  *
                   4672:  * HINZVC
                   4673:  * ..****
                   4674:  */
                   4675: static void hd6301_cmpb_ext(void)
                   4676: {
                   4677:        Uint8  value;
                   4678:        Uint16 addr, result;
                   4679: 
                   4680:        addr = hd6301_get_memory_ext();
                   4681:        value = hd6301_read_memory(addr);
                   4682:        result = hd6301_reg_B - value;
                   4683: 
                   4684:        HD6301_CLR_NZVC;
                   4685:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4686: }
                   4687: 
                   4688: /**
                   4689:  * SBCB_EXT : substract with carry extended memory address value from accumulator B : B=B-M-C
                   4690:  *
                   4691:  * HINZVC
                   4692:  * ..****
                   4693:  */
                   4694: static void hd6301_sbcb_ext(void)
                   4695: {
                   4696:        Uint8  value, carry;
                   4697:        Uint16 addr, result;
                   4698: 
                   4699:        carry = hd6301_REG_CCR_C & 1;
                   4700:        addr = hd6301_get_memory_ext();
                   4701:        value = hd6301_read_memory(addr);
                   4702:        result = hd6301_reg_B - value - carry;
                   4703: 
                   4704:        HD6301_CLR_NZVC;
                   4705:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4706: 
                   4707:        hd6301_reg_B = result;
                   4708: }
                   4709: 
                   4710: /**
                   4711:  * ADDD_EXT : add extended memory address value from accumulator D : D=D+MM
                   4712:  *
                   4713:  * HINZVC
                   4714:  * ..****
                   4715:  */
                   4716: static void hd6301_addd_ext(void)
                   4717: {
                   4718:        Uint16 addr, value, regD;
                   4719:        Uint32 result;
                   4720: 
                   4721:        addr = hd6301_get_memory_ext();
                   4722:        value = hd6301_read_memory(addr) << 8;
                   4723:        value += hd6301_read_memory(addr+1);
                   4724:        regD = (hd6301_reg_A << 8) + hd6301_reg_B;
                   4725:        result = regD + value;
                   4726: 
                   4727:        hd6301_reg_A = (result >> 8) & 0xff;
                   4728:        hd6301_reg_B = result & 0xff;
                   4729: 
                   4730:        HD6301_CLR_NZVC;
                   4731:        HD6301_SET_FLAGS16(regD, value, result);
                   4732: }
                   4733: 
                   4734: /**
                   4735:  * ANDB_EXT : and extended memory address value with accumulator B : B=B&M
                   4736:  *
                   4737:  * HINZVC
                   4738:  * ..**0.
                   4739:  */
                   4740: static void hd6301_andb_ext(void)
                   4741: {
                   4742:        Uint16 addr;
                   4743:        
                   4744:        addr = hd6301_get_memory_ext();
                   4745:        hd6301_reg_B &= hd6301_read_memory(addr);
                   4746: 
                   4747:        HD6301_CLR_NZV;
                   4748:        HD6301_SET_NZ8(hd6301_reg_B);
                   4749: }
                   4750: 
                   4751: /**
                   4752:  * BITB_EXT : bit test extended memory address value with accumulator B : B&M
                   4753:  *
                   4754:  * HINZVC
                   4755:  * ..**0.
                   4756:  */
                   4757: static void hd6301_bitb_ext(void)
                   4758: {
                   4759:        Uint8 value;
                   4760:        Uint16 addr;
                   4761:        
                   4762:        addr = hd6301_get_memory_ext();
                   4763:        value = hd6301_reg_B & hd6301_read_memory(addr);
                   4764: 
                   4765:        HD6301_CLR_NZV;
                   4766:        HD6301_SET_NZ8(value);
                   4767: }
                   4768: 
                   4769: /**
                   4770:  * LDAB_EXT : load accumulator B with extended memory address value : B=M
                   4771:  *
                   4772:  * HINZVC
                   4773:  * ..**0.
                   4774:  */
                   4775: static void hd6301_ldab_ext(void)
                   4776: {
                   4777:        Uint16 addr;
                   4778:        
                   4779:        addr = hd6301_get_memory_ext();
                   4780:        hd6301_reg_B = hd6301_read_memory(addr);
                   4781: 
                   4782:        HD6301_CLR_NZV;
                   4783:        HD6301_SET_NZ8(hd6301_reg_B);
                   4784: }
                   4785: 
                   4786: /**
                   4787:  * STAB_EXT : store accumulator B into extended memory address value : M=B
                   4788:  *
                   4789:  * HINZVC
                   4790:  * ..**0.
                   4791:  */
                   4792: static void hd6301_stab_ext(void)
                   4793: {
                   4794:        Uint16 addr;
                   4795: 
                   4796:        addr = hd6301_get_memory_ext();
                   4797:        hd6301_write_memory(addr, hd6301_reg_B);
                   4798:        
                   4799:        HD6301_CLR_NZV;
                   4800:        HD6301_SET_NZ8(hd6301_reg_B);
                   4801: }
                   4802: 
                   4803: /**
                   4804:  * EORB_EXT : exclusive or extended memory address value with accumulator B : B=B^M
                   4805:  *
                   4806:  * HINZVC
                   4807:  * ..**0.
                   4808:  */
                   4809: static void hd6301_eorb_ext(void)
                   4810: {
                   4811:        Uint16 addr;
                   4812: 
                   4813:        addr = hd6301_get_memory_ext();
                   4814:        hd6301_reg_B ^= hd6301_read_memory(addr);
                   4815: 
                   4816:        HD6301_CLR_NZV;
                   4817:        HD6301_SET_NZ8(hd6301_reg_B);
                   4818: }
                   4819: 
                   4820: /**
                   4821:  * ADCB_EXT : add with carry extended memory address value to accumulator B : B=B+M+C
                   4822:  *
                   4823:  * HINZVC
                   4824:  * *.****
                   4825:  */
                   4826: static void hd6301_adcb_ext(void)
                   4827: {
                   4828:        Uint8  value, carry;
                   4829:        Uint16 addr, result;
                   4830: 
                   4831:        carry = hd6301_REG_CCR_C & 1;
                   4832:        addr = hd6301_get_memory_ext();
                   4833:        value = hd6301_read_memory(addr);
                   4834:        result = hd6301_reg_B + value + carry;
                   4835: 
                   4836:        HD6301_CLR_HNZVC;
                   4837:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4838:        HD6301_SET_H(hd6301_reg_B, value, result);
                   4839: 
                   4840:        hd6301_reg_B = result;
                   4841: }
                   4842: 
                   4843: /**
                   4844:  * ORAB_EXT : inclusive or accumulator B with extended memory address value : B=B|M
                   4845:  *
                   4846:  * HINZVC
                   4847:  * ..**0.
                   4848:  */
                   4849: static void hd6301_orab_ext(void)
                   4850: {
                   4851:        Uint16 addr;
                   4852:        
                   4853:        addr = hd6301_get_memory_ext();
                   4854:        hd6301_reg_B |= hd6301_read_memory(addr);
                   4855: 
                   4856:        HD6301_CLR_NZV;
                   4857:        HD6301_SET_NZ8(hd6301_reg_B);
                   4858: }
                   4859: 
                   4860: /**
                   4861:  * ADDB_EXT : add extended memory address value with accumulator B : B=B+M
                   4862:  *
                   4863:  * HINZVC
                   4864:  * *.****
                   4865:  */
                   4866: static void hd6301_addb_ext(void)
                   4867: {
                   4868:        Uint8  value;
                   4869:        Uint16 addr, result;
                   4870: 
                   4871:        addr = hd6301_get_memory_ext();
                   4872:        value = hd6301_read_memory(addr);
                   4873:        result = hd6301_reg_B + value;
                   4874: 
                   4875:        HD6301_CLR_HNZVC;
                   4876:        HD6301_SET_FLAGS8(hd6301_reg_B, value, result);
                   4877:        HD6301_SET_H(hd6301_reg_B, value, result);
                   4878: 
                   4879:        hd6301_reg_B = result;
                   4880: }
                   4881: 
                   4882: /**
                   4883:  * LDD_EXT : load accumulator D with extended memory address value : D=MM
                   4884:  *
                   4885:  * HINZVC
                   4886:  * ..**0.
                   4887:  */
                   4888: static void hd6301_ldd_ext(void)
                   4889: {
                   4890:        Uint16 addr;
                   4891:        
                   4892:        addr = hd6301_get_memory_ext();
                   4893: 
                   4894:        hd6301_reg_A = hd6301_read_memory(addr);
                   4895:        hd6301_reg_B = hd6301_read_memory(addr+1);
                   4896: 
                   4897:        HD6301_CLR_NZV;
                   4898:        hd6301_reg_CCR |= ((hd6301_reg_A == 0) && (hd6301_reg_B == 0)) << hd6301_REG_CCR_Z;
                   4899:        hd6301_reg_CCR |= (hd6301_reg_A >> 7) << hd6301_REG_CCR_N;
                   4900: }
                   4901: 
                   4902: /**
                   4903:  * STD_EXT : store accumulator D into extended memory address value : MM=D
                   4904:  *
                   4905:  * HINZVC
                   4906:  * ..**0.
                   4907:  */
                   4908: static void hd6301_std_ext(void)
                   4909: {
                   4910:        Uint16 addr;
                   4911:        
                   4912:        addr = hd6301_get_memory_ext();
                   4913: 
                   4914:        hd6301_write_memory(addr, hd6301_reg_A);
                   4915:        hd6301_write_memory(addr+1, hd6301_reg_B);
                   4916: 
                   4917:        HD6301_CLR_NZV;
                   4918:        hd6301_reg_CCR |= ((hd6301_reg_A == 0) && (hd6301_reg_B == 0)) << hd6301_REG_CCR_Z;
                   4919:        hd6301_reg_CCR |= (hd6301_reg_A >> 7) << hd6301_REG_CCR_N;
                   4920: }
                   4921: 
                   4922: /**
                   4923:  * LDX_EXT : load register X with extended memory address value : X=MM
                   4924:  *
                   4925:  * HINZVC
                   4926:  * ..**0.
                   4927:  */
                   4928: static void hd6301_ldx_ext(void)
                   4929: {
                   4930:        Uint16 addr;
                   4931:        
                   4932:        addr = hd6301_get_memory_ext();
                   4933: 
                   4934:        hd6301_reg_X = hd6301_read_memory(addr) << 8;
                   4935:        hd6301_reg_X += hd6301_read_memory(addr+1);
                   4936: 
                   4937:        HD6301_CLR_NZV;
                   4938:        HD6301_SET_NZ16(hd6301_reg_X);
                   4939: }
                   4940: 
                   4941: /**
                   4942:  * STX_EXT : store register X into extended memory address value : MM=X
                   4943:  *
                   4944:  * HINZVC
                   4945:  * ..**0.
                   4946:  */
                   4947: static void hd6301_stx_ext(void)
                   4948: {
                   4949:        Uint16 addr;
                   4950:        
                   4951:        addr = hd6301_get_memory_ext();
                   4952: 
                   4953:        hd6301_write_memory(addr, hd6301_reg_X >> 8);
                   4954:        hd6301_write_memory(addr+1, hd6301_reg_X & 0xff);
                   4955: 
                   4956:        HD6301_CLR_NZV;
                   4957:        HD6301_SET_NZ16(hd6301_reg_X);
                   4958: }
                   4959: 
                   4960: 
                   4961: 
                   4962: /**
                   4963:  * hd6301_disasm : disasm hd6301 memory
                   4964:  */
                   4965: void hd6301_disasm(void)
                   4966: {
                   4967:        switch(hd6301_opcode.op_disasm) {
                   4968:                case HD6301_DISASM_UNDEFINED:
                   4969:                        sprintf(hd6301_str_instr, "0x%02x : unknown instruction", hd6301_cur_inst);
                   4970:                        break;
                   4971:                case HD6301_DISASM_NONE: 
                   4972:                        sprintf(hd6301_str_instr, hd6301_opcode.op_mnemonic, 0);
                   4973:                        break;
                   4974:                case HD6301_DISASM_MEMORY8: 
                   4975:                        sprintf(hd6301_str_instr, hd6301_opcode.op_mnemonic, hd6301_read_memory(hd6301_reg_PC+1));
                   4976:                        break;
                   4977:                case HD6301_DISASM_MEMORY16: 
                   4978:                        sprintf(hd6301_str_instr, hd6301_opcode.op_mnemonic, hd6301_get_memory_ext());
                   4979:                        break;
                   4980:                case HD6301_DISASM_XIM: 
                   4981:                        sprintf(hd6301_str_instr, hd6301_opcode.op_mnemonic,
                   4982:                                hd6301_read_memory(hd6301_reg_PC+1),
                   4983:                                hd6301_read_memory(hd6301_reg_PC+2));
                   4984:                        break;
                   4985:        }
                   4986: 
                   4987:        fprintf(stderr, "%02x: %s\n", hd6301_reg_PC, hd6301_str_instr);
                   4988: 
                   4989: }
                   4990: 
                   4991: /**
                   4992:  * hd6301_display_registers : display hd6301 registers state
                   4993:  */
                   4994: void hd6301_display_registers(void)
                   4995: {
                   4996:        fprintf(stderr, "A:  %02x       B: %02x\n", hd6301_reg_A, hd6301_reg_B);
                   4997:        fprintf(stderr, "X:  %04x   CCR: %02x\n", hd6301_reg_X, hd6301_reg_CCR);
                   4998:        fprintf(stderr, "SP: %04x    PC:  %04x\n", hd6301_reg_SP, hd6301_reg_PC);
                   4999: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.