Coverage Report

Created: 2025-08-28 06:43

/src/capstonenext/arch/MOS65XX/MOS65XXModule.c
Line
Count
Source (jump to first uncovered line)
1
/* Capstone Disassembly Engine */
2
/* MOS65XX Backend by Sebastian Macke <sebastian@macke.de> 2018 */
3
4
#ifdef CAPSTONE_HAS_MOS65XX
5
6
#include "../../utils.h"
7
#include "../../MCRegisterInfo.h"
8
#include "MOS65XXDisassembler.h"
9
#include "MOS65XXDisassemblerInternals.h"
10
#include "MOS65XXModule.h"
11
12
cs_err MOS65XX_global_init(cs_struct *ud)
13
439
{
14
439
  mos65xx_info *info;
15
16
439
  info = cs_mem_malloc(sizeof(*info));
17
439
  info->hex_prefix = NULL;
18
439
  info->cpu_type = MOS65XX_CPU_TYPE_6502;
19
439
  info->long_m = 0;
20
439
  info->long_x = 0;
21
22
439
  ud->printer = MOS65XX_printInst;
23
439
  ud->printer_info = info;
24
439
  ud->insn_id = MOS65XX_get_insn_id;
25
439
  ud->insn_name = MOS65XX_insn_name;
26
439
  ud->group_name = MOS65XX_group_name;
27
439
  ud->disasm = MOS65XX_getInstruction;
28
439
  ud->reg_name = MOS65XX_reg_name;
29
30
439
  if (ud->mode) {
31
0
    MOS65XX_option(ud, CS_OPT_MODE, ud->mode);
32
0
  }
33
34
439
  return CS_ERR_OK;
35
439
}
36
37
cs_err MOS65XX_option(cs_struct *handle, cs_opt_type type, size_t value)
38
261
{
39
261
  mos65xx_info *info = (mos65xx_info *)handle->printer_info;
40
261
  switch (type) {
41
0
  default:
42
0
    break;
43
0
  case CS_OPT_MODE:
44
45
0
    if (value & CS_MODE_MOS65XX_6502)
46
0
      info->cpu_type = MOS65XX_CPU_TYPE_6502;
47
0
    if (value & CS_MODE_MOS65XX_65C02)
48
0
      info->cpu_type = MOS65XX_CPU_TYPE_65C02;
49
0
    if (value & CS_MODE_MOS65XX_W65C02)
50
0
      info->cpu_type = MOS65XX_CPU_TYPE_W65C02;
51
0
    if (value &
52
0
        (CS_MODE_MOS65XX_65816 | CS_MODE_MOS65XX_65816_LONG_M |
53
0
         CS_MODE_MOS65XX_65816_LONG_X))
54
0
      info->cpu_type = MOS65XX_CPU_TYPE_65816;
55
56
0
    info->long_m = value & CS_MODE_MOS65XX_65816_LONG_M ? 1 : 0;
57
0
    info->long_x = value & CS_MODE_MOS65XX_65816_LONG_X ? 1 : 0;
58
59
    // NOLINTBEGIN(clang-analyzer-optin.core.EnumCastOutOfRange)
60
0
    handle->mode = (cs_mode)value;
61
    // NOLINTEND(clang-analyzer-optin.core.EnumCastOutOfRange)
62
0
    break;
63
261
  case CS_OPT_SYNTAX:
64
261
    switch (value) {
65
261
    default:
66
      // wrong syntax value
67
261
      handle->errnum = CS_ERR_OPTION;
68
261
      return CS_ERR_OPTION;
69
0
    case CS_OPT_SYNTAX_DEFAULT:
70
0
      info->hex_prefix = NULL;
71
0
      break;
72
0
    case CS_OPT_SYNTAX_MOTOROLA:
73
0
      info->hex_prefix = "$";
74
0
      break;
75
261
    }
76
0
    handle->syntax = (int)value;
77
0
    break;
78
261
  }
79
0
  return CS_ERR_OK;
80
261
}
81
82
#endif