DGen/SDL
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Classes | Macros | Enumerations | Functions | Variables
m68kmake.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>

Classes

struct  opcode_struct
struct  ea_info_struct
struct  body_struct
struct  replace_struct

Macros

#define M68K_MAX_PATH   1024
#define M68K_MAX_DIR   1024
#define MAX_LINE_LENGTH   200 /* length of 1 line */
#define MAX_BODY_LENGTH   300 /* Number of lines in 1 function */
#define MAX_REPLACE_LENGTH   30 /* Max number of replace strings */
#define MAX_INSERT_LENGTH   5000 /* Max size of insert piece */
#define MAX_NAME_LENGTH   30 /* Max length of ophandler name */
#define MAX_SPEC_PROC_LENGTH   4 /* Max length of special processing str */
#define MAX_SPEC_EA_LENGTH   5 /* Max length of specified EA str */
#define EA_ALLOWED_LENGTH   11 /* Max length of ea allowed str */
#define MAX_OPCODE_INPUT_TABLE_LENGTH   1000 /* Max length of opcode handler tbl */
#define MAX_OPCODE_OUTPUT_TABLE_LENGTH   3000 /* Max length of opcode handler tbl */
#define FILENAME_INPUT   "m68k_in.c"
#define FILENAME_PROTOTYPE   "m68kops.h"
#define FILENAME_TABLE   "m68kops.c"
#define ID_INPUT_SEPARATOR   "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
#define ID_BASE   "M68KMAKE"
#define ID_PROTOTYPE_HEADER   ID_BASE "_PROTOTYPE_HEADER"
#define ID_PROTOTYPE_FOOTER   ID_BASE "_PROTOTYPE_FOOTER"
#define ID_TABLE_HEADER   ID_BASE "_TABLE_HEADER"
#define ID_TABLE_FOOTER   ID_BASE "_TABLE_FOOTER"
#define ID_TABLE_BODY   ID_BASE "_TABLE_BODY"
#define ID_TABLE_START   ID_BASE "_TABLE_START"
#define ID_OPHANDLER_HEADER   ID_BASE "_OPCODE_HANDLER_HEADER"
#define ID_OPHANDLER_FOOTER   ID_BASE "_OPCODE_HANDLER_FOOTER"
#define ID_OPHANDLER_BODY   ID_BASE "_OPCODE_HANDLER_BODY"
#define ID_END   ID_BASE "_END"
#define ID_OPHANDLER_NAME   ID_BASE "_OP"
#define ID_OPHANDLER_EA_AY_8   ID_BASE "_GET_EA_AY_8"
#define ID_OPHANDLER_EA_AY_16   ID_BASE "_GET_EA_AY_16"
#define ID_OPHANDLER_EA_AY_32   ID_BASE "_GET_EA_AY_32"
#define ID_OPHANDLER_OPER_AY_8   ID_BASE "_GET_OPER_AY_8"
#define ID_OPHANDLER_OPER_AY_16   ID_BASE "_GET_OPER_AY_16"
#define ID_OPHANDLER_OPER_AY_32   ID_BASE "_GET_OPER_AY_32"
#define ID_OPHANDLER_CC   ID_BASE "_CC"
#define ID_OPHANDLER_NOT_CC   ID_BASE "_NOT_CC"
#define DECL_SPEC
#define UNSPECIFIED   "."
#define UNSPECIFIED_CH   '.'
#define HAS_NO_EA_MODE(A)   (strcmp(A, "..........") == 0)
#define HAS_EA_AI(A)   ((A)[0] == 'A')
#define HAS_EA_PI(A)   ((A)[1] == '+')
#define HAS_EA_PD(A)   ((A)[2] == '-')
#define HAS_EA_DI(A)   ((A)[3] == 'D')
#define HAS_EA_IX(A)   ((A)[4] == 'X')
#define HAS_EA_AW(A)   ((A)[5] == 'W')
#define HAS_EA_AL(A)   ((A)[6] == 'L')
#define HAS_EA_PCDI(A)   ((A)[7] == 'd')
#define HAS_EA_PCIX(A)   ((A)[8] == 'x')
#define HAS_EA_I(A)   ((A)[9] == 'I')

Enumerations

enum  {
  CPU_TYPE_000 = 0, CPU_TYPE_010, CPU_TYPE_020, CPU_TYPE_040,
  NUM_CPUS
}
enum  {
  EA_MODE_NONE, EA_MODE_AI, EA_MODE_PI, EA_MODE_PI7,
  EA_MODE_PD, EA_MODE_PD7, EA_MODE_DI, EA_MODE_IX,
  EA_MODE_AW, EA_MODE_AL, EA_MODE_PCDI, EA_MODE_PCIX,
  EA_MODE_I
}

Functions

void error_exit (const char *fmt,...)
void perror_exit (const char *fmt,...)
int check_strsncpy (char *dst, char *src, int maxlength)
int check_atoi (char *str, int *result)
int skip_spaces (char *str)
int num_bits (int value)
int atoh (char *buff)
int fgetline (char *buff, int nchars, FILE *file)
int get_oper_cycles (opcode_struct *op, int ea_mode, int cpu_type)
opcode_structfind_opcode (char *name, int size, char *spec_proc, char *spec_ea)
opcode_structfind_illegal_opcode (void)
int extract_opcode_info (char *src, char *name, int *size, char *spec_proc, char *spec_ea)
void add_replace_string (replace_struct *replace, const char *search_str, const char *replace_str)
void write_body (FILE *filep, body_struct *body, replace_struct *replace)
void get_base_name (char *base_name, opcode_struct *op)
void write_prototype (FILE *filep, char *base_name)
void write_function_name (FILE *filep, char *base_name)
void add_opcode_output_table_entry (opcode_struct *op, char *name)
static int DECL_SPEC compare_nof_true_bits (const void *aptr, const void *bptr)
void print_opcode_output_table (FILE *filep)
void write_table_entry (FILE *filep, opcode_struct *op)
void set_opcode_struct (opcode_struct *src, opcode_struct *dst, int ea_mode)
void generate_opcode_handler (FILE *filep, body_struct *body, replace_struct *replace, opcode_struct *opinfo, int ea_mode)
void generate_opcode_ea_variants (FILE *filep, body_struct *body, replace_struct *replace, opcode_struct *op)
void generate_opcode_cc_variants (FILE *filep, body_struct *body, replace_struct *replace, opcode_struct *op_in, int offset)
void process_opcode_handlers (FILE *filep)
void populate_table (void)
void read_insert (char *insert)
int check_strcncpy (char *dst, char *src, char delim, int maxlength)
int main (int argc, char **argv)

Variables

static const char * g_version = "3.31"
char g_input_filename [M68K_MAX_PATH] = FILENAME_INPUT
FILE * g_input_file = NULL
FILE * g_prototype_file = NULL
FILE * g_table_file = NULL
int g_num_functions = 0
int g_num_primitives = 0
int g_line_number = 1
opcode_struct g_opcode_input_table [MAX_OPCODE_INPUT_TABLE_LENGTH]
opcode_struct g_opcode_output_table [MAX_OPCODE_OUTPUT_TABLE_LENGTH]
int g_opcode_output_table_length = 0
ea_info_struct g_ea_info_table [13]
const char * g_cc_table [16][2]
int g_size_select_table [33]
int g_ea_cycle_table [13][NUM_CPUS][3]
int g_jmp_cycle_table [13]
int g_jsr_cycle_table [13]
int g_lea_cycle_table [13]
int g_pea_cycle_table [13]
int g_movem_cycle_table [13]
int g_moves_cycle_table [13][3]
int g_clr_cycle_table [13][3]

Macro Definition Documentation

#define DECL_SPEC
#define EA_ALLOWED_LENGTH   11 /* Max length of ea allowed str */
#define FILENAME_INPUT   "m68k_in.c"
#define FILENAME_PROTOTYPE   "m68kops.h"
#define FILENAME_TABLE   "m68kops.c"
#define HAS_EA_AI (   A)    ((A)[0] == 'A')
#define HAS_EA_AL (   A)    ((A)[6] == 'L')
#define HAS_EA_AW (   A)    ((A)[5] == 'W')
#define HAS_EA_DI (   A)    ((A)[3] == 'D')
#define HAS_EA_I (   A)    ((A)[9] == 'I')
#define HAS_EA_IX (   A)    ((A)[4] == 'X')
#define HAS_EA_PCDI (   A)    ((A)[7] == 'd')
#define HAS_EA_PCIX (   A)    ((A)[8] == 'x')
#define HAS_EA_PD (   A)    ((A)[2] == '-')
#define HAS_EA_PI (   A)    ((A)[1] == '+')
#define HAS_NO_EA_MODE (   A)    (strcmp(A, "..........") == 0)
#define ID_BASE   "M68KMAKE"
#define ID_END   ID_BASE "_END"
#define ID_INPUT_SEPARATOR   "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
#define ID_OPHANDLER_BODY   ID_BASE "_OPCODE_HANDLER_BODY"
#define ID_OPHANDLER_CC   ID_BASE "_CC"
#define ID_OPHANDLER_EA_AY_16   ID_BASE "_GET_EA_AY_16"
#define ID_OPHANDLER_EA_AY_32   ID_BASE "_GET_EA_AY_32"
#define ID_OPHANDLER_EA_AY_8   ID_BASE "_GET_EA_AY_8"
#define ID_OPHANDLER_FOOTER   ID_BASE "_OPCODE_HANDLER_FOOTER"
#define ID_OPHANDLER_HEADER   ID_BASE "_OPCODE_HANDLER_HEADER"
#define ID_OPHANDLER_NAME   ID_BASE "_OP"
#define ID_OPHANDLER_NOT_CC   ID_BASE "_NOT_CC"
#define ID_OPHANDLER_OPER_AY_16   ID_BASE "_GET_OPER_AY_16"
#define ID_OPHANDLER_OPER_AY_32   ID_BASE "_GET_OPER_AY_32"
#define ID_OPHANDLER_OPER_AY_8   ID_BASE "_GET_OPER_AY_8"
#define ID_PROTOTYPE_FOOTER   ID_BASE "_PROTOTYPE_FOOTER"
#define ID_PROTOTYPE_HEADER   ID_BASE "_PROTOTYPE_HEADER"
#define ID_TABLE_BODY   ID_BASE "_TABLE_BODY"
#define ID_TABLE_FOOTER   ID_BASE "_TABLE_FOOTER"
#define ID_TABLE_HEADER   ID_BASE "_TABLE_HEADER"
#define ID_TABLE_START   ID_BASE "_TABLE_START"
#define M68K_MAX_DIR   1024
#define M68K_MAX_PATH   1024
#define MAX_BODY_LENGTH   300 /* Number of lines in 1 function */
#define MAX_INSERT_LENGTH   5000 /* Max size of insert piece */
#define MAX_LINE_LENGTH   200 /* length of 1 line */
#define MAX_NAME_LENGTH   30 /* Max length of ophandler name */
#define MAX_OPCODE_INPUT_TABLE_LENGTH   1000 /* Max length of opcode handler tbl */
#define MAX_OPCODE_OUTPUT_TABLE_LENGTH   3000 /* Max length of opcode handler tbl */
#define MAX_REPLACE_LENGTH   30 /* Max number of replace strings */
#define MAX_SPEC_EA_LENGTH   5 /* Max length of specified EA str */
#define MAX_SPEC_PROC_LENGTH   4 /* Max length of special processing str */
#define UNSPECIFIED   "."
#define UNSPECIFIED_CH   '.'

Enumeration Type Documentation

anonymous enum
Enumerator:
CPU_TYPE_000 
CPU_TYPE_010 
CPU_TYPE_020 
CPU_TYPE_040 
NUM_CPUS 
anonymous enum
Enumerator:
EA_MODE_NONE 
EA_MODE_AI 
EA_MODE_PI 
EA_MODE_PI7 
EA_MODE_PD 
EA_MODE_PD7 
EA_MODE_DI 
EA_MODE_IX 
EA_MODE_AW 
EA_MODE_AL 
EA_MODE_PCDI 
EA_MODE_PCIX 
EA_MODE_I 

Function Documentation

void add_opcode_output_table_entry ( opcode_struct op,
char *  name 
)
void add_replace_string ( replace_struct replace,
const char *  search_str,
const char *  replace_str 
)
int atoh ( char *  buff)
int check_atoi ( char *  str,
int *  result 
)
int check_strcncpy ( char *  dst,
char *  src,
char  delim,
int  maxlength 
)
int check_strsncpy ( char *  dst,
char *  src,
int  maxlength 
)
static int DECL_SPEC compare_nof_true_bits ( const void *  aptr,
const void *  bptr 
)
static
void error_exit ( const char *  fmt,
  ... 
)
int extract_opcode_info ( char *  src,
char *  name,
int *  size,
char *  spec_proc,
char *  spec_ea 
)
int fgetline ( char *  buff,
int  nchars,
FILE *  file 
)
opcode_struct * find_illegal_opcode ( void  )
opcode_struct * find_opcode ( char *  name,
int  size,
char *  spec_proc,
char *  spec_ea 
)
void generate_opcode_cc_variants ( FILE *  filep,
body_struct body,
replace_struct replace,
opcode_struct op_in,
int  offset 
)
void generate_opcode_ea_variants ( FILE *  filep,
body_struct body,
replace_struct replace,
opcode_struct op 
)
void generate_opcode_handler ( FILE *  filep,
body_struct body,
replace_struct replace,
opcode_struct opinfo,
int  ea_mode 
)
void get_base_name ( char *  base_name,
opcode_struct op 
)
int get_oper_cycles ( opcode_struct op,
int  ea_mode,
int  cpu_type 
)
int main ( int  argc,
char **  argv 
)
int num_bits ( int  value)
void perror_exit ( const char *  fmt,
  ... 
)
void populate_table ( void  )
void print_opcode_output_table ( FILE *  filep)
void process_opcode_handlers ( FILE *  filep)
void read_insert ( char *  insert)
void set_opcode_struct ( opcode_struct src,
opcode_struct dst,
int  ea_mode 
)
int skip_spaces ( char *  str)
void write_body ( FILE *  filep,
body_struct body,
replace_struct replace 
)
void write_function_name ( FILE *  filep,
char *  base_name 
)
void write_prototype ( FILE *  filep,
char *  base_name 
)
void write_table_entry ( FILE *  filep,
opcode_struct op 
)

Variable Documentation

const char* g_cc_table[16][2]
Initial value:
{
{ "t", "T"},
{ "f", "F"},
{"hi", "HI"},
{"ls", "LS"},
{"cc", "CC"},
{"cs", "CS"},
{"ne", "NE"},
{"eq", "EQ"},
{"vc", "VC"},
{"vs", "VS"},
{"pl", "PL"},
{"mi", "MI"},
{"ge", "GE"},
{"lt", "LT"},
{"gt", "GT"},
{"le", "LE"},
}
int g_clr_cycle_table[13][3]
Initial value:
{
{ 0, 0, 0},
{ 0, 4, 6},
{ 0, 4, 6},
{ 0, 4, 6},
{ 0, 6, 8},
{ 0, 6, 8},
{ 0, 8, 10},
{ 0, 10, 14},
{ 0, 8, 10},
{ 0, 10, 14},
{ 0, 0, 0},
{ 0, 0, 0},
{ 0, 0, 0},
}
int g_ea_cycle_table[13][NUM_CPUS][3]
Initial value:
{
{{ 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}},
{{ 0, 4, 8}, { 0, 4, 8}, { 0, 4, 4}, { 0, 4, 4}},
{{ 0, 4, 8}, { 0, 4, 8}, { 0, 4, 4}, { 0, 4, 4}},
{{ 0, 4, 8}, { 0, 4, 8}, { 0, 4, 4}, { 0, 4, 4}},
{{ 0, 6, 10}, { 0, 6, 10}, { 0, 5, 5}, { 0, 5, 5}},
{{ 0, 6, 10}, { 0, 6, 10}, { 0, 5, 5}, { 0, 5, 5}},
{{ 0, 8, 12}, { 0, 8, 12}, { 0, 5, 5}, { 0, 5, 5}},
{{ 0, 10, 14}, { 0, 10, 14}, { 0, 7, 7}, { 0, 7, 7}},
{{ 0, 8, 12}, { 0, 8, 12}, { 0, 4, 4}, { 0, 4, 4}},
{{ 0, 12, 16}, { 0, 12, 16}, { 0, 4, 4}, { 0, 4, 4}},
{{ 0, 8, 12}, { 0, 8, 12}, { 0, 5, 5}, { 0, 5, 5}},
{{ 0, 10, 14}, { 0, 10, 14}, { 0, 7, 7}, { 0, 7, 7}},
{{ 0, 4, 8}, { 0, 4, 8}, { 0, 2, 4}, { 0, 2, 4}},
}
ea_info_struct g_ea_info_table[13]
Initial value:
{
{"", "", 0x00, 0x00},
{"ai", "AY_AI", 0x38, 0x10},
{"pi", "AY_PI", 0x38, 0x18},
{"pi7", "A7_PI", 0x3f, 0x1f},
{"pd", "AY_PD", 0x38, 0x20},
{"pd7", "A7_PD", 0x3f, 0x27},
{"di", "AY_DI", 0x38, 0x28},
{"ix", "AY_IX", 0x38, 0x30},
{"aw", "AW", 0x3f, 0x38},
{"al", "AL", 0x3f, 0x39},
{"pcdi", "PCDI", 0x3f, 0x3a},
{"pcix", "PCIX", 0x3f, 0x3b},
{"i", "I", 0x3f, 0x3c},
}
FILE* g_input_file = NULL
char g_input_filename[M68K_MAX_PATH] = FILENAME_INPUT
int g_jmp_cycle_table[13]
Initial value:
{
0,
4,
0,
0,
0,
0,
6,
10,
6,
8,
6,
10,
0,
}
int g_jsr_cycle_table[13]
Initial value:
{
0,
4,
0,
0,
0,
0,
6,
10,
6,
8,
6,
10,
0,
}
int g_lea_cycle_table[13]
Initial value:
{
0,
4,
0,
0,
0,
0,
8,
12,
8,
12,
8,
12,
0,
}
int g_line_number = 1
int g_movem_cycle_table[13]
Initial value:
{
0,
0,
0,
0,
0,
0,
4,
6,
4,
8,
0,
0,
0,
}
int g_moves_cycle_table[13][3]
Initial value:
{
{ 0, 0, 0},
{ 0, 4, 6},
{ 0, 4, 6},
{ 0, 4, 6},
{ 0, 6, 12},
{ 0, 6, 12},
{ 0, 12, 16},
{ 0, 16, 20},
{ 0, 12, 16},
{ 0, 16, 20},
{ 0, 0, 0},
{ 0, 0, 0},
{ 0, 0, 0},
}
int g_num_functions = 0
int g_num_primitives = 0
int g_opcode_output_table_length = 0
int g_pea_cycle_table[13]
Initial value:
{
0,
6,
0,
0,
0,
0,
10,
14,
10,
14,
10,
14,
0,
}
FILE* g_prototype_file = NULL
int g_size_select_table[33]
Initial value:
{
0,
0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2
}
FILE* g_table_file = NULL
const char* g_version = "3.31"
static