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