main backend.h
  1/*
  2 Copyright 2013 Michael Pavone
  3 This file is part of BlastEm.
  4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
  5*/
  6#ifndef BACKEND_H_
  7#define BACKEND_H_
  8
  9#include <stdint.h>
 10#include <stdio.h>
 11#include "gen.h"
 12
 13#define INVALID_OFFSET 0xFFFFFFFF
 14#define EXTENSION_WORD 0xFFFFFFFE
 15#define CYCLE_NEVER 0xFFFFFFFF
 16
 17#if defined(X86_32) || defined(X86_64)
 18typedef struct {
 19	int32_t disp;
 20	uint8_t mode;
 21	uint8_t base;
 22	uint8_t index;
 23} host_ea;
 24#else
 25typedef struct {
 26	int32_t disp;
 27	uint8_t mode;
 28	uint8_t base;
 29} host_ea;
 30#endif
 31
 32typedef struct {
 33	uint8_t  *base;
 34	int32_t  *offsets;
 35} native_map_slot;
 36
 37typedef struct deferred_addr {
 38	struct deferred_addr *next;
 39	code_ptr             dest;
 40	uint32_t             address;
 41} deferred_addr;
 42
 43#include "memmap.h"
 44#include "system.h"
 45
 46typedef struct {
 47	uint32_t flags;
 48	native_map_slot    *native_code_map;
 49	deferred_addr      *deferred;
 50	code_info          code;
 51	uint8_t            **ram_inst_sizes;
 52	memmap_chunk const *memmap;
 53	code_ptr           save_context;
 54	code_ptr           load_context;
 55	code_ptr           handle_cycle_limit;
 56	code_ptr           handle_cycle_limit_int;
 57	code_ptr           handle_code_write;
 58	code_ptr           handle_align_error_write;
 59	code_ptr           handle_align_error_read;
 60	system_str_fun_r8  debug_cmd_handler;
 61	uint32_t           memmap_chunks;
 62	uint32_t           address_mask;
 63	uint32_t           max_address;
 64	uint32_t           bus_cycles;
 65	uint32_t           clock_divider;
 66	uint32_t           move_pc_off;
 67	uint32_t           move_pc_size;
 68	int32_t            mem_ptr_off;
 69	int32_t            ram_flags_off;
 70	uint8_t            ram_flags_shift;
 71	uint8_t            address_size;
 72	uint8_t            byte_swap;
 73	int8_t             context_reg;
 74	int8_t             cycles;
 75	int8_t             limit;
 76	int8_t             scratch1;
 77	int8_t             scratch2;
 78	uint8_t            align_error_mask;
 79} cpu_options;
 80
 81typedef uint8_t * (*native_addr_func)(void * context, uint32_t address);
 82
 83deferred_addr * defer_address(deferred_addr * old_head, uint32_t address, uint8_t *dest);
 84void remove_deferred_until(deferred_addr **head_ptr, deferred_addr * remove_to);
 85void process_deferred(deferred_addr ** head_ptr, void * context, native_addr_func get_native);
 86
 87void cycles(cpu_options *opts, uint32_t num);
 88void check_cycles_int(cpu_options *opts, uint32_t address);
 89void check_cycles(cpu_options * opts);
 90void check_code_prologue(code_info *code);
 91void log_address(cpu_options *opts, uint32_t address, char * format);
 92
 93void retranslate_calc(cpu_options *opts);
 94void patch_for_retranslate(cpu_options *opts, code_ptr native_address, code_ptr handler);
 95
 96code_ptr gen_mem_fun(cpu_options * opts, memmap_chunk const * memmap, uint32_t num_chunks, ftype fun_type, code_ptr *after_inc);
 97void * get_native_pointer(uint32_t address, void ** mem_pointers, cpu_options * opts);
 98void * get_native_write_pointer(uint32_t address, void ** mem_pointers, cpu_options * opts);
 99uint16_t read_word(uint32_t address, void **mem_pointers, cpu_options *opts, void *context);
100uint8_t read_byte(uint32_t address, void **mem_pointers, cpu_options *opts, void *context);
101void write_byte(uint32_t address, uint8_t value, void **mem_pointers, cpu_options *opts, void *context);
102memmap_chunk const *find_map_chunk(uint32_t address, cpu_options *opts, uint16_t flags, uint32_t *size_sum);
103uint32_t chunk_size(cpu_options *opts, memmap_chunk const *chunk);
104uint32_t ram_size(cpu_options *opts);
105
106#endif //BACKEND_H_
107