2 EPS TRN Junior Emulator 'eTRNJunior'
4 Author : Takeda.Toshiya
13 #define DEVICE_NAME "ESP TRN Junior"
14 #define CONFIG_NAME "trnjr"
16 // device informations for virtual machine
17 #define FRAMES_PER_SEC 60
18 #define LINES_PER_FRAME 256
19 #define CPU_CLOCKS 4000000
20 #define SCREEN_WIDTH 768
21 #define SCREEN_HEIGHT 512
22 #define MEMORY_ADDR_MAX 0x10000
23 #define MEMORY_BANK_SIZE 0x1000
24 #define IO_ADDR_MAX 0x100
25 #define HAS_TMPZ84C013
27 // device informations for win32
28 #define ONE_BOARD_MICRO_COMPUTER
29 #define MAX_BUTTONS 25
30 #define MAX_DRAW_RANGES 8
31 #define USE_BINARY_FILE 1
33 #define USE_SOUND_VOLUME 1
37 #include "../../common.h"
38 #include "../../fileio.h"
39 #include "../vm_template.h"
41 #ifdef USE_SOUND_VOLUME
42 static const _TCHAR *sound_device_caption[] = {
47 #define BUTTON_SPACE_X 50
48 #define BUTTON_SPACE_Y 52
49 #define BUTTON_SIZE_X 37
50 #define BUTTON_SIZE_Y 38
51 #define BUTTON_POS_X 378
52 #define BUTTON_POS_Y 165
54 #define LED_SPACE_X 42
57 #define LED_POS_X1 269
58 #define LED_POS_X2 449
66 // virtual key codes 0x80-0x8f and 0x98-0x9f are not used in pc keyboard
67 {BUTTON_POS_X + BUTTON_SPACE_X * 0, BUTTON_POS_Y + BUTTON_SPACE_Y * 4, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x30}, // 0
68 {BUTTON_POS_X + BUTTON_SPACE_X * 1, BUTTON_POS_Y + BUTTON_SPACE_Y * 4, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x31}, // 1
69 {BUTTON_POS_X + BUTTON_SPACE_X * 2, BUTTON_POS_Y + BUTTON_SPACE_Y * 4, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x32}, // 2
70 {BUTTON_POS_X + BUTTON_SPACE_X * 3, BUTTON_POS_Y + BUTTON_SPACE_Y * 4, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x33}, // 3
71 {BUTTON_POS_X + BUTTON_SPACE_X * 0, BUTTON_POS_Y + BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x34}, // 4
72 {BUTTON_POS_X + BUTTON_SPACE_X * 1, BUTTON_POS_Y + BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x35}, // 5
73 {BUTTON_POS_X + BUTTON_SPACE_X * 2, BUTTON_POS_Y + BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x36}, // 6
74 {BUTTON_POS_X + BUTTON_SPACE_X * 3, BUTTON_POS_Y + BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x37}, // 7
75 {BUTTON_POS_X + BUTTON_SPACE_X * 0, BUTTON_POS_Y + BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x38}, // 8
76 {BUTTON_POS_X + BUTTON_SPACE_X * 1, BUTTON_POS_Y + BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x39}, // 9
77 {BUTTON_POS_X + BUTTON_SPACE_X * 2, BUTTON_POS_Y + BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x41}, // A
78 {BUTTON_POS_X + BUTTON_SPACE_X * 3, BUTTON_POS_Y + BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x42}, // B
79 {BUTTON_POS_X + BUTTON_SPACE_X * 0, BUTTON_POS_Y + BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x43}, // C
80 {BUTTON_POS_X + BUTTON_SPACE_X * 1, BUTTON_POS_Y + BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x44}, // D
81 {BUTTON_POS_X + BUTTON_SPACE_X * 2, BUTTON_POS_Y + BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x45}, // E
82 {BUTTON_POS_X + BUTTON_SPACE_X * 3, BUTTON_POS_Y + BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x46}, // F
83 {BUTTON_POS_X + BUTTON_SPACE_X * 0, BUTTON_POS_Y + BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x70}, // REG
84 {BUTTON_POS_X + BUTTON_SPACE_X * 1, BUTTON_POS_Y + BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x71}, // INC
85 {BUTTON_POS_X + BUTTON_SPACE_X * 2, BUTTON_POS_Y + BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x72}, // DEC
86 {BUTTON_POS_X + BUTTON_SPACE_X * 3, BUTTON_POS_Y + BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x73}, // RUN
87 {BUTTON_POS_X + BUTTON_SPACE_X * 4, BUTTON_POS_Y + BUTTON_SPACE_Y * 4, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x74}, // STEP
88 {BUTTON_POS_X + BUTTON_SPACE_X * 4, BUTTON_POS_Y + BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x75}, // WRT
89 {BUTTON_POS_X + BUTTON_SPACE_X * 4, BUTTON_POS_Y + BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x76}, // ADRS
90 {BUTTON_POS_X + BUTTON_SPACE_X * 4, BUTTON_POS_Y + BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x77}, // SHFT
91 {BUTTON_POS_X + BUTTON_SPACE_X * 4, BUTTON_POS_Y + BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x00}, // RES
97 {LED_POS_X1 + LED_SPACE_X * 0, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y}, // 7-seg LEDs
98 {LED_POS_X1 + LED_SPACE_X * 1, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
99 {LED_POS_X1 + LED_SPACE_X * 2, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
100 {LED_POS_X1 + LED_SPACE_X * 3, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
101 {LED_POS_X2 + LED_SPACE_X * 0, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
102 {LED_POS_X2 + LED_SPACE_X * 1, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
103 {LED_POS_X2 + LED_SPACE_X * 2, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
104 {LED_POS_X2 + LED_SPACE_X * 3, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
121 class VM : public VM_TEMPLATE
145 // ----------------------------------------
147 // ----------------------------------------
152 // ----------------------------------------
153 // for emulation class
154 // ----------------------------------------
156 // drive virtual machine
159 double get_frame_rate()
161 return FRAMES_PER_SEC;
166 DEVICE *get_cpu(int index);
173 void initialize_sound(int rate, int samples);
174 uint16_t* create_sound(int* extra_frames);
175 int get_sound_buffer_ptr();
176 #ifdef USE_SOUND_VOLUME
177 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
181 void key_down(int code, bool repeat);
182 void key_up(int code);
185 void load_binary(int drv, const _TCHAR* file_path);
186 void save_binary(int drv, const _TCHAR* file_path);
187 bool is_frame_skippable();
189 void update_config();
190 bool process_state(FILEIO* state_fio, bool loading);
192 // ----------------------------------------
194 // ----------------------------------------
197 DEVICE* get_device(int id);
199 // DEVICE* first_device;
200 // DEVICE* last_device;