m68k.h
来自「DGen源码最后版本」· C头文件 代码 · 共 321 行
H
321 行
#ifndef M68K__HEADER#define M68K__HEADER/* ======================================================================== *//* ========================= LICENSING & COPYRIGHT ======================== *//* ======================================================================== *//* * MUSASHI * Version 2.0a * * A portable Motorola M680x0 processor emulation engine. * Copyright 1999 Karl Stenerud. All rights reserved. * * This code may be freely used for non-commercial purpooses as long as this * copyright notice remains unaltered in the source code and any binary files * containing this code in compiled form. * * Any commercial ventures wishing to use this code must contact the author * (Karl Stenerud) to negotiate commercial licensing terms. * * The latest version of this code can be obtained at: * http://milliways.scas.bcit.bc.ca/~karl/musashi *//* ======================================================================== *//* ============================= INSTRUCTIONS ============================= *//* ======================================================================== *//* 1. edit m68kconf.h and modify according to your needs. * 2. Implement in your host program the functions defined in * "FUNCTIONS CALLED BY THE CPU" located later in this file. * 3. You must call m68k_pulse_reset() first to initialize the emulation. * 4. If you don't call m68k_set_cpu_mode(), it will default to 68000 behavior. * * Requirements: * - All operations in this core are done using a default size which must be * at least 32 bits wide. * - Because of signed/unsigned operations required for CPU emulation, this * core will only work on a 2's complement machine. I'm not about to add * 2's complement emulation =). If you don't know what 2's complement is, * you most likely have it. * * Notes: * * You must at least implement the m68k_read_memory_xx() and * m68k_write_memory_xx() functions in order to use the emulation core. * Unless you plan to implement more direct access to memory for immediate * reads and instruction fetches, you can just #define the * m68k_read_immediate_xx() and m68k_read_instruction() functions to * the m68k_read_memory_xx() functions. * * In order to use the emulation, you will need to call m68k_input_reset() * and m68k_execute(). All the other functions are just to let you poke * about with the internals of the CPU. *//* ======================================================================== *//* ============================ GENERAL DEFINES =========================== *//* ======================================================================== *//* There are 7 levels of interrupt to the 68000. Level 7 cannot me masked */#define M68K_IRQ_1 1#define M68K_IRQ_2 2#define M68K_IRQ_3 3#define M68K_IRQ_4 4#define M68K_IRQ_5 5#define M68K_IRQ_6 6#define M68K_IRQ_7 7/* Special interrupt acknowledge values. * Use these as special returns from the interrupt acknowledge callback * (specified later in this header). *//* Causes an interrupt autovector (0x18 + interrupt level) to be taken. * This happens in a real 68000 if VPA or AVEC is asserted during an interrupt * acknowledge cycle instead of DTACK. */#define M68K_INT_ACK_AUTOVECTOR -1/* Causes the spurious interrupt vector (0x18) to be taken * This happens in a real 68000 if BERR is asserted during the interrupt * acknowledge cycle (i.e. no devices responded to the acknowledge). */#define M68K_INT_ACK_SPURIOUS -2/* CPU types for use in m68k_set_cpu_type() */#define M68K_CPU_MODE_68000 1#define M68K_CPU_MODE_68010 2#define M68K_CPU_MODE_68020 4/* ======================================================================== *//* ============================== STRUCTURES ============================== *//* ======================================================================== */typedef struct /* CPU Context */{ unsigned int mode; /* CPU Operation Mode (68000, 68010, or 68020) */ unsigned int sr; /* Status Register */ unsigned int ppc; /* Previous program counter */ unsigned int pc; /* Program Counter */ unsigned int d[8]; /* Data Registers */ unsigned int a[8]; /* Address Registers */ unsigned int usp; /* User Stack Pointer */ unsigned int isp; /* Interrupt Stack Pointer */ unsigned int msp; /* Master Stack Pointer */ unsigned int vbr; /* Vector Base Register. Used in 68010+ */ unsigned int sfc; /* Source Function Code. Used in 68010+ */ unsigned int dfc; /* Destination Function Code. Used in 68010+ */ unsigned int stopped; /* Stopped state: only interrupt can restart */ unsigned int halted; /* Halted state: only reset can restart */ unsigned int int_state; /* Current interrupt line states -- ASG: changed from ints_pending */ unsigned int int_cycles; /* Extra cycles taken due to interrupts -- ASG: added */ int (*int_ack_callback)(int int_level); /* Interrupt Acknowledge */ void (*bkpt_ack_callback)(int data); /* Breakpoint Acknowledge */ void (*reset_instr_callback)(void); /* Called when a RESET instruction is encountered */ void (*pc_changed_callback)(int new_pc); /* Called when the PC changes by a large amount */ void (*set_fc_callback)(int new_fc); /* Called when the CPU function code changes */ void (*instr_hook_callback)(void); /* Called every instruction cycle prior to execution */} m68k_cpu_context;/* ======================================================================== *//* ====================== FUNCTIONS CALLED BY THE CPU ===================== *//* ======================================================================== *//* You will have to implement these functions *//* read/write functions called by the CPU to access memory. * while values used are 32 bits, only the appropriate number * of bits are relevant (i.e. in write_memory_8, only the lower 8 bits * of value should be written to memory). * address will be a 24-bit value. *//* Read from anywhere */int m68k_read_memory_8(int address);int m68k_read_memory_16(int address);int m68k_read_memory_32(int address);/* Read data immediately following the PC */int m68k_read_immediate_8(int address);int m68k_read_immediate_16(int address);int m68k_read_immediate_32(int address);/* Read an instruction (16-bit word immeditately after PC) */int m68k_read_instruction(int address);/* Write to anywhere */void m68k_write_memory_8(int address, int value);void m68k_write_memory_16(int address, int value);void m68k_write_memory_32(int address, int value);/* ======================================================================== *//* ============================== CALLBACKS =============================== *//* ======================================================================== *//* These functions allow you to set callbacks to the host when specific events * occur. Note that you must enable the corresponding value in m68kconf.h * in order for these to do anything useful. * Note: I have defined default callbacks which are used if you have enabled * the corresponding #define in m68kconf.h but either haven't assigned a * callback or have assigned a callback of NULL. *//* Set the callback for an interrupt acknowledge. * You must enable M68K_INT_ACK in m68kconf.h. * The CPU will call the callback with the interrupt level being acknowledged. * The host program must return either a vector from 0x02-0xff, or one of the * special interrupt acknowledge values specified earlier in this header. * If this is not implemented, the CPU will always assume an autovectored * interrupt. * Default behavior: return M68K_INT_ACK_AUTOVECTOR. */void m68k_set_int_ack_callback(int (*callback)(int int_level));/* Set the callback for a breakpoint acknowledge (68010+). * You must enable M68K_BKPT_ACK in m68kconf.h. * The CPU will call the callback with whatever was in the data field of the * BKPT instruction for 68020+, or 0 for 68010. * Default behavior: do nothing. */void m68k_set_bkpt_ack_callback(void (*callback)(int data));/* Set the callback for the RESET instruction. * You must enable M68K_OUTPUT_RESET in m68kconf.h. * The CPU calls this callback every time it encounters a RESET instruction. * Default behavior: do nothing. */void m68k_set_reset_instr_callback(void (*callback)(void));/* Set the callback for informing of a large PC change. * You must enable M68K_PC_CHANGED in m68kconf.h. * The CPU calls this callback with the new PC value every time the PC changes * by a large value (currently set for changes by longwords). * Default behavior: do nothing. */void m68k_set_pc_changed_callback(void (*callback)(int new_pc));/* Set the callback for CPU function code changes. * You must enable M68K_SET_FC in m68kconf.h. * The CPU calls this callback with the function code before every memory * access to set the CPU's function code according to what kind of memory * access it is (supervisor/user, program/data and such). * Default behavior: do nothing. */void m68k_set_fc_callback(void (*callback)(int new_fc));/* Set a callback for the instruction cycle of the CPU. * You must enable M68K_INSTR_HOOK in m68kconf.h. * The CPU calls this callback just before fetching the opcode in the * instruction cycle. * Default behavior: do nothing. */void m68k_set_instr_hook_callback(void (*callback)(void));/* ======================================================================== *//* ====================== FUNCTIONS TO ACCESS THE CPU ===================== *//* =======================================================<================ *//* Use this function to set the CPU type ypu want to emulate. * Currently supported types are: M68K_CPU_MODE_68000, M68K_CPU_MODE_68010, * and M68K_CPU_MODE_68020. */void m68k_set_cpu_mode(int cpu_mode);/* Reset the CPU as if you asserted RESET *//* You *MUST* call this at least once to initialize the emulation */void m68k_pulse_reset(void *param);/* execute num_clks worth of instructions. returns number of clks used */int m68k_execute(int num_clks);/* The following 2 functions simulate an interrupt controller attached to the * CPU since the 68000 needs an interrupt controller attached to work * properly. Valid interrupt lines are 1, 2, 3, 4, 5, 6, and 7 (7 is a non- * maskable interrupt) */void m68k_assert_irq(int int_line);void m68k_clear_irq(int int_line);/* Halt the CPU as if you asserted the HALT pin */void m68k_pulse_halt(void);/* look at the internals of the CPU */int m68k_peek_dr(int reg_num);int m68k_peek_ar(int reg_num);unsigned int m68k_peek_pc(void);unsigned int m68k_peek_ppc(void);int m68k_peek_sr(void);int m68k_peek_ir(void);int m68k_peek_t1_flag(void);int m68k_peek_t0_flag(void);int m68k_peek_s_flag(void);int m68k_peek_m_flag(void);int m68k_peek_int_mask(void);int m68k_peek_x_flag(void);int m68k_peek_n_flag(void);int m68k_peek_z_flag(void);int m68k_peek_v_flag(void);int m68k_peek_c_flag(void);int m68k_peek_usp(void);int m68k_peek_isp(void);int m68k_peek_msp(void);/* poke values into the internals of the CPU */void m68k_poke_dr(int reg_num, int value);void m68k_poke_ar(int reg_num, int value);void m68k_poke_pc(unsigned int value);void m68k_poke_sr(int value);void m68k_poke_ir(int value);void m68k_poke_t1_flag(int value);void m68k_poke_t0_flag(int value);void m68k_poke_s_flag(int value);void m68k_poke_m_flag(int value);void m68k_poke_int_mask(int value);void m68k_poke_x_flag(int value);void m68k_poke_n_flag(int value);void m68k_poke_z_flag(int value);void m68k_poke_v_flag(int value);void m68k_poke_c_flag(int value);void m68k_poke_usp(int value);void m68k_poke_isp(int value);void m68k_poke_msp(int value);/* context switching to allow multiple CPUs */unsigned m68k_get_context(void* dst);void m68k_set_context(void* dst);/* check if an instruction is valid for the specified CPU mode */int m68k_is_valid_instruction(int instruction, int cpu_mode);/* ======================================================================== *//* ============================= CONFIGURATION ============================ *//* ======================================================================== *//* Import the configuration for this build */#include "m68kconf.h"/* ======================================================================== *//* ============================== END OF FILE ============================= *//* ======================================================================== */#endif /* M68K__HEADER */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?