2013-06-11 07:08:15 +00:00
|
|
|
/*
|
2015-10-22 05:13:26 +00:00
|
|
|
* Apple // emulator for *ix
|
|
|
|
*
|
|
|
|
* This software package is subject to the GNU General Public License
|
|
|
|
* version 3 or later (your choice) as published by the Free Software
|
|
|
|
* Foundation.
|
2013-06-11 07:08:15 +00:00
|
|
|
*
|
|
|
|
* Copyright 1994 Alexander Jean-Claude Bottema
|
|
|
|
* Copyright 1995 Stephen Lee
|
|
|
|
* Copyright 1997, 1998 Aaron Culliney
|
|
|
|
* Copyright 1998, 1999, 2000 Michael Deutschmann
|
2015-10-22 05:13:26 +00:00
|
|
|
* Copyright 2013-2015 Aaron Culliney
|
2013-06-11 07:08:15 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2018-01-15 21:03:31 +00:00
|
|
|
#ifndef _GLUE_H_
|
|
|
|
#define _GLUE_H_
|
|
|
|
|
2015-09-11 07:00:04 +00:00
|
|
|
#if defined(__ASSEMBLER__)
|
|
|
|
# error assembler-specific glue code should be in the arch-specific area
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define GLUE_BANK_READ(func,pointer) extern void func(void)
|
2016-09-26 02:18:34 +00:00
|
|
|
#define GLUE_BANK_MAYBE_READ_C3(func,pointer) extern void func(void)
|
|
|
|
#define GLUE_BANK_MAYBE_READ_CX(func,pointer) extern void func(void)
|
2015-09-11 07:00:04 +00:00
|
|
|
#define GLUE_BANK_WRITE(func,pointer) extern void func(void)
|
|
|
|
#define GLUE_BANK_MAYBEWRITE(func,pointer) extern void func(void)
|
|
|
|
|
2018-01-15 21:03:31 +00:00
|
|
|
#define GLUE_INLINE_READ(func,arg) extern uint8_t func(uint16_t)
|
|
|
|
|
2015-09-11 07:00:04 +00:00
|
|
|
#define GLUE_EXTERN_C_READ(func) extern uint8_t func(uint16_t)
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2014-11-23 22:03:18 +00:00
|
|
|
#if VM_TRACING
|
|
|
|
|
2013-06-11 07:08:15 +00:00
|
|
|
#define GLUE_C_WRITE(func) \
|
2015-09-11 07:00:04 +00:00
|
|
|
extern void func(uint16_t, uint8_t); \
|
2014-11-23 22:03:18 +00:00
|
|
|
void c__##func(uint16_t ea, uint8_t b); \
|
|
|
|
void c_##func(uint16_t ea, uint8_t b) { \
|
2014-11-23 22:28:00 +00:00
|
|
|
c__##func(ea, b); \
|
2014-11-23 22:03:18 +00:00
|
|
|
extern FILE *test_vm_fp; \
|
2014-11-23 22:28:00 +00:00
|
|
|
if (test_vm_fp && !vm_trace_is_ignored(ea)) { \
|
2014-11-29 21:28:34 +00:00
|
|
|
fprintf(test_vm_fp, "%04X w:%02X %s\n", ea, b, __FUNCTION__); \
|
2014-11-23 22:28:00 +00:00
|
|
|
fflush(test_vm_fp); \
|
2014-11-23 22:03:18 +00:00
|
|
|
} \
|
|
|
|
} \
|
|
|
|
void c__##func(uint16_t ea, uint8_t b)
|
2013-06-11 07:08:15 +00:00
|
|
|
|
|
|
|
#define GLUE_C_READ(func) \
|
2015-09-11 07:00:04 +00:00
|
|
|
extern uint8_t func(uint16_t); \
|
2014-11-23 22:03:18 +00:00
|
|
|
uint8_t c__##func(uint16_t ea); \
|
|
|
|
uint8_t c_##func(uint16_t ea) { \
|
|
|
|
uint8_t b = c__##func(ea); \
|
|
|
|
extern FILE *test_vm_fp; \
|
2014-11-23 22:28:00 +00:00
|
|
|
if (test_vm_fp && !vm_trace_is_ignored(ea)) { \
|
2014-11-29 21:28:34 +00:00
|
|
|
fprintf(test_vm_fp, "%04X r:%02X %s\n", ea, b, __FUNCTION__); \
|
2014-11-23 22:28:00 +00:00
|
|
|
fflush(test_vm_fp); \
|
2014-11-23 22:03:18 +00:00
|
|
|
} \
|
|
|
|
return b; \
|
|
|
|
} \
|
|
|
|
uint8_t c__##func(uint16_t ea)
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define GLUE_C_WRITE(func) \
|
2015-09-11 07:00:04 +00:00
|
|
|
extern void func(uint16_t, uint8_t); \
|
2014-11-23 22:03:18 +00:00
|
|
|
void c_##func(uint16_t ea, uint8_t b)
|
|
|
|
|
|
|
|
#define GLUE_C_READ(func) \
|
2015-09-11 07:00:04 +00:00
|
|
|
extern uint8_t func(uint16_t); \
|
2014-11-23 22:03:18 +00:00
|
|
|
uint8_t c_##func(uint16_t ea)
|
|
|
|
|
|
|
|
#endif
|
2013-06-11 07:08:15 +00:00
|
|
|
|
2014-05-11 04:25:54 +00:00
|
|
|
#define GLUE_C_READ_ALTZP(func, ...) GLUE_C_READ(func)
|
|
|
|
|
2018-01-15 21:03:31 +00:00
|
|
|
// Stack struct assembly bridge (avoiding all PIC nastiness)
|
|
|
|
typedef struct cpu65_run_args_s {
|
|
|
|
|
2018-03-25 22:43:56 +00:00
|
|
|
void (*unused0)(uint16_t, uint8_t);
|
|
|
|
#define OUTPUT_UNUSED0() printf("#define UNUSED0 %ld\n", offsetof(cpu65_run_args_s, unused0))
|
2018-01-15 21:03:31 +00:00
|
|
|
|
|
|
|
void (*cpu65_trace_prologue)(uint16_t, uint8_t);
|
|
|
|
#define OUTPUT_CPU65_TRACE_PROLOGUE() printf("#define CPU65_TRACE_PROLOGUE %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_prologue))
|
|
|
|
void (*cpu65_trace_arg)(uint16_t, uint8_t);
|
|
|
|
#define OUTPUT_CPU65_TRACE_ARG() printf("#define CPU65_TRACE_ARG %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_arg))
|
2018-03-25 22:43:56 +00:00
|
|
|
void (*unused1)(uint16_t, uint8_t);
|
|
|
|
#define OUTPUT_UNUSED1() printf("#define UNUSED1 %ld\n", offsetof(cpu65_run_args_s, unused1))
|
|
|
|
void (*unused2)(uint16_t, uint8_t);
|
|
|
|
#define OUTPUT_UNUSED2() printf("#define UNUSED2 %ld\n", offsetof(cpu65_run_args_s, unused2))
|
|
|
|
|
2018-01-15 21:03:31 +00:00
|
|
|
void (*cpu65_trace_epilogue)(uint16_t, uint8_t);
|
|
|
|
#define OUTPUT_CPU65_TRACE_EPILOGUE() printf("#define CPU65_TRACE_EPILOGUE %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_epilogue))
|
2018-03-25 22:43:56 +00:00
|
|
|
|
2018-01-15 21:03:31 +00:00
|
|
|
void (*cpu65_trace_irq)(uint16_t, uint8_t);
|
|
|
|
#define OUTPUT_CPU65_TRACE_IRQ() printf("#define CPU65_TRACE_IRQ %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_irq))
|
|
|
|
|
|
|
|
uint8_t (*debug_illegal_bcd)(uint16_t);
|
|
|
|
#define OUTPUT_DEBUG_ILLEGAL_BCD() printf("#define DEBUG_ILLEGAL_BCD %ld\n", offsetof(cpu65_run_args_s, debug_illegal_bcd))
|
|
|
|
|
|
|
|
void *cpu65_vmem_r;
|
|
|
|
#define OUTPUT_CPU65_VMEM_R() printf("#define CPU65_VMEM_R %ld\n", offsetof(cpu65_run_args_s, cpu65_vmem_r))
|
|
|
|
void *cpu65_vmem_w;
|
|
|
|
#define OUTPUT_CPU65_VMEM_W() printf("#define CPU65_VMEM_W %ld\n", offsetof(cpu65_run_args_s, cpu65_vmem_w))
|
|
|
|
void *cpu65_flags_encode;
|
|
|
|
#define OUTPUT_CPU65_FLAGS_ENCODE() printf("#define CPU65_FLAGS_ENCODE %ld\n", offsetof(cpu65_run_args_s, cpu65_flags_encode))
|
|
|
|
void *cpu65_flags_decode;
|
|
|
|
#define OUTPUT_CPU65_FLAGS_DECODE() printf("#define CPU65_FLAGS_DECODE %ld\n", offsetof(cpu65_run_args_s, cpu65_flags_decode))
|
|
|
|
void *cpu65__opcodes;
|
|
|
|
#define OUTPUT_CPU65__OPCODES() printf("#define CPU65__OPCODES %ld\n", offsetof(cpu65_run_args_s, cpu65__opcodes))
|
|
|
|
uint8_t *cpu65__opcycles;
|
|
|
|
#define OUTPUT_CPU65__OPCYCLES() printf("#define CPU65__OPCYCLES %ld\n", offsetof(cpu65_run_args_s, cpu65__opcycles))
|
|
|
|
|
|
|
|
uint8_t *base_ramrd;
|
|
|
|
#define OUTPUT_BASE_RAMRD() printf("#define BASE_RAMRD %ld\n", offsetof(cpu65_run_args_s, base_ramrd))
|
|
|
|
uint8_t *base_ramwrt;
|
|
|
|
#define OUTPUT_BASE_RAMWRT() printf("#define BASE_RAMWRT %ld\n", offsetof(cpu65_run_args_s, base_ramwrt))
|
|
|
|
uint8_t *base_textrd;
|
|
|
|
#define OUTPUT_BASE_TEXTRD() printf("#define BASE_TEXTRD %ld\n", offsetof(cpu65_run_args_s, base_textrd))
|
|
|
|
uint8_t *base_textwrt;
|
|
|
|
#define OUTPUT_BASE_TEXTWRT() printf("#define BASE_TEXTWRT %ld\n", offsetof(cpu65_run_args_s, base_textwrt))
|
|
|
|
uint8_t *base_hgrrd;
|
|
|
|
#define OUTPUT_BASE_HGRRD() printf("#define BASE_HGRRD %ld\n", offsetof(cpu65_run_args_s, base_hgrrd))
|
|
|
|
uint8_t *base_hgrwrt;
|
|
|
|
#define OUTPUT_BASE_HGRWRT() printf("#define BASE_HGRWRT %ld\n", offsetof(cpu65_run_args_s, base_hgrwrt))
|
|
|
|
|
|
|
|
uint8_t *base_stackzp;
|
|
|
|
#define OUTPUT_BASE_STACKZP() printf("#define BASE_STACKZP %ld\n", offsetof(cpu65_run_args_s, base_stackzp))
|
|
|
|
uint8_t *base_d000_rd;
|
|
|
|
#define OUTPUT_BASE_D000_RD() printf("#define BASE_D000_RD %ld\n", offsetof(cpu65_run_args_s, base_d000_rd))
|
|
|
|
uint8_t *base_e000_rd;
|
|
|
|
#define OUTPUT_BASE_E000_RD() printf("#define BASE_E000_RD %ld\n", offsetof(cpu65_run_args_s, base_e000_rd))
|
|
|
|
uint8_t *base_d000_wrt;
|
|
|
|
#define OUTPUT_BASE_D000_WRT() printf("#define BASE_D000_WRT %ld\n", offsetof(cpu65_run_args_s, base_d000_wrt))
|
|
|
|
uint8_t *base_e000_wrt;
|
|
|
|
#define OUTPUT_BASE_E000_WRT() printf("#define BASE_E000_WRT %ld\n", offsetof(cpu65_run_args_s, base_e000_wrt))
|
|
|
|
|
|
|
|
uint8_t *base_c3rom;
|
|
|
|
#define OUTPUT_BASE_C3ROM() printf("#define BASE_C3ROM %ld\n", offsetof(cpu65_run_args_s, base_c3rom))
|
|
|
|
uint8_t *base_c4rom;
|
|
|
|
#define OUTPUT_BASE_C4ROM() printf("#define BASE_C4ROM %ld\n", offsetof(cpu65_run_args_s, base_c4rom))
|
|
|
|
uint8_t *base_c5rom;
|
|
|
|
#define OUTPUT_BASE_C5ROM() printf("#define BASE_C5ROM %ld\n", offsetof(cpu65_run_args_s, base_c5rom))
|
|
|
|
uint8_t *base_cxrom;
|
|
|
|
#define OUTPUT_BASE_CXROM() printf("#define BASE_CXROM %ld\n", offsetof(cpu65_run_args_s, base_cxrom))
|
|
|
|
|
|
|
|
uint32_t softswitches;
|
|
|
|
#define OUTPUT_SOFTSWITCHES() printf("#define SOFTSWITCHES %ld\n", offsetof(cpu65_run_args_s, softswitches))
|
|
|
|
|
|
|
|
int32_t gc_cycles_timer_0; // joystick timer values
|
|
|
|
#define OUTPUT_GC_CYCLES_TIMER_0() printf("#define GC_CYCLES_TIMER_0 %ld\n", offsetof(cpu65_run_args_s, gc_cycles_timer_0))
|
|
|
|
int32_t gc_cycles_timer_1;
|
|
|
|
#define OUTPUT_GC_CYCLES_TIMER_1() printf("#define GC_CYCLES_TIMER_1 %ld\n", offsetof(cpu65_run_args_s, gc_cycles_timer_1))
|
|
|
|
|
|
|
|
int32_t cpu65_cycles_to_execute; // cycles-to-execute by cpu65_run()
|
|
|
|
#define OUTPUT_CPU65_CYCLES_TO_EXECUTE() printf("#define CPU65_CYCLES_TO_EXECUTE %ld\n", offsetof(cpu65_run_args_s, cpu65_cycles_to_execute))
|
|
|
|
int32_t cpu65_cycle_count; // cycles currently excuted by cpu65_run()
|
|
|
|
#define OUTPUT_CPU65_CYCLE_COUNT() printf("#define CPU65_CYCLE_COUNT %ld\n", offsetof(cpu65_run_args_s, cpu65_cycle_count))
|
2018-03-25 22:43:56 +00:00
|
|
|
|
|
|
|
int32_t unused3;
|
|
|
|
#define OUTPUT_UNUSED3() printf("#define UNUSED3 %ld\n", offsetof(cpu65_run_args_s, unused3))
|
2018-01-15 21:03:31 +00:00
|
|
|
|
|
|
|
uint16_t interrupt_vector;
|
|
|
|
#define OUTPUT_INTERRUPT_VECTOR() printf("#define INTERRUPT_VECTOR %ld\n", offsetof(cpu65_run_args_s, interrupt_vector))
|
|
|
|
uint16_t reset_vector;
|
|
|
|
#define OUTPUT_RESET_VECTOR() printf("#define RESET_VECTOR %ld\n", offsetof(cpu65_run_args_s, reset_vector))
|
|
|
|
|
|
|
|
uint16_t cpu65_pc; // Program counter
|
|
|
|
#define OUTPUT_CPU65_PC() printf("#define CPU65_PC %ld\n", offsetof(cpu65_run_args_s, cpu65_pc))
|
|
|
|
uint16_t cpu65_ea; // Last effective address
|
|
|
|
#define OUTPUT_CPU65_EA() printf("#define CPU65_EA %ld\n", offsetof(cpu65_run_args_s, cpu65_ea))
|
|
|
|
|
|
|
|
uint8_t cpu65_a; // Accumulator
|
|
|
|
#define OUTPUT_CPU65_A() printf("#define CPU65_A %ld\n", offsetof(cpu65_run_args_s, cpu65_a))
|
|
|
|
uint8_t cpu65_f; // Flags (host-order)
|
|
|
|
#define OUTPUT_CPU65_F() printf("#define CPU65_F %ld\n", offsetof(cpu65_run_args_s, cpu65_f))
|
|
|
|
uint8_t cpu65_x; // X Index register
|
|
|
|
#define OUTPUT_CPU65_X() printf("#define CPU65_X %ld\n", offsetof(cpu65_run_args_s, cpu65_x))
|
|
|
|
uint8_t cpu65_y; // Y Index register
|
|
|
|
#define OUTPUT_CPU65_Y() printf("#define CPU65_Y %ld\n", offsetof(cpu65_run_args_s, cpu65_y))
|
|
|
|
uint8_t cpu65_sp; // Stack Pointer
|
|
|
|
#define OUTPUT_CPU65_SP() printf("#define CPU65_SP %ld\n", offsetof(cpu65_run_args_s, cpu65_sp))
|
|
|
|
|
|
|
|
uint8_t cpu65_d; // Last data byte written
|
|
|
|
#define OUTPUT_CPU65_D() printf("#define CPU65_D %ld\n", offsetof(cpu65_run_args_s, cpu65_d))
|
|
|
|
uint8_t cpu65_rw; // MEM_READ_FLAG = read occured, MEM_WRITE_FLAG = write
|
|
|
|
#define OUTPUT_CPU65_RW() printf("#define CPU65_RW %ld\n", offsetof(cpu65_run_args_s, cpu65_rw))
|
|
|
|
uint8_t cpu65_opcode; // Last opcode
|
|
|
|
#define OUTPUT_CPU65_OPCODE() printf("#define CPU65_OPCODE %ld\n", offsetof(cpu65_run_args_s, cpu65_opcode))
|
|
|
|
uint8_t cpu65_opcycles; // Last opcode extra cycles
|
|
|
|
#define OUTPUT_CPU65_OPCYCLES() printf("#define CPU65_OPCYCLES %ld\n", offsetof(cpu65_run_args_s, cpu65_opcycles))
|
|
|
|
|
|
|
|
uint8_t cpu65__signal;
|
|
|
|
#define OUTPUT_CPU65__SIGNAL() printf("#define CPU65__SIGNAL %ld\n", offsetof(cpu65_run_args_s, cpu65__signal))
|
|
|
|
|
|
|
|
uint8_t joy_button0;
|
|
|
|
#define OUTPUT_JOY_BUTTON0() printf("#define JOY_BUTTON0 %ld\n", offsetof(cpu65_run_args_s, joy_button0))
|
|
|
|
uint8_t joy_button1;
|
|
|
|
#define OUTPUT_JOY_BUTTON1() printf("#define JOY_BUTTON1 %ld\n", offsetof(cpu65_run_args_s, joy_button1))
|
|
|
|
|
|
|
|
uint8_t emul_reinitialize;
|
|
|
|
#define OUTPUT_EMUL_REINITIALIZE() printf("#define EMUL_REINITIALIZE %ld\n", offsetof(cpu65_run_args_s, emul_reinitialize))
|
|
|
|
|
|
|
|
} cpu65_run_args_s;
|
|
|
|
|
|
|
|
#endif // whole file
|
|
|
|
|