OSDN Git Service

[VM][OSD] Add upstream devices/OSD updates.
[csp-qt/common_source_project-fm7.git] / source / src / vm / trnjr / trnjr.h
1 /*
2         EPS TRN Junior Emulator 'eTRNJunior'
3
4         Author : Takeda.Toshiya
5         Date   : 2022.07.02-
6
7         [ virtual machine ]
8 */
9
10 #ifndef _TRNJR_H_
11 #define _TRNJR_H_
12
13 #define DEVICE_NAME             "ESP TRN Junior"
14 #define CONFIG_NAME             "trnjr"
15
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
26
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
32 #define USE_MIDI
33 #define USE_SOUND_VOLUME        1
34 #define USE_DEBUGGER
35 #define USE_STATE
36
37 #include "../../common.h"
38 #include "../../fileio.h"
39 #include "../vm_template.h"
40
41 #ifdef USE_SOUND_VOLUME
42 static const _TCHAR *sound_device_caption[] = {
43         _T("Speaker"),
44 };
45 #endif
46
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
53
54 #define LED_SPACE_X     42
55 #define LED_SIZE_X      38
56 #define LED_SIZE_Y      52
57 #define LED_POS_X1      269
58 #define LED_POS_X2      449
59 #define LED_POS_Y       81
60
61 const struct {
62         int x, y;
63         int width, height;
64         int code;
65 } vm_buttons[] = {
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
92 };
93 const struct {
94         int x, y;
95         int width, height;
96 } vm_ranges[] = {
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},
105 };
106
107 class EMU;
108 class DEVICE;
109 class EVENT;
110
111 class I8255;
112 class IO;
113 class MIDI;
114 class SPEAKER;
115 class TMPZ84C015;
116 class Z80;
117
118 class DISPLAY;
119 class MEMBUS;
120
121 class VM : public VM_TEMPLATE
122 {
123 protected:
124 //      EMU* emu;
125         
126         // devices
127         EVENT* event;
128         
129         I8255* pio1;
130         I8255* pio2;
131         IO* io;
132         MIDI* midi;
133         SPEAKER* speaker;
134         TMPZ84C015* cpudev;
135         Z80* cpu;
136         
137         DISPLAY* display;
138         MEMBUS* memory;
139         
140         // memory
141         uint8_t rom[0x8000];
142         uint8_t ram[0x8000];
143         
144 public:
145         // ----------------------------------------
146         // initialize
147         // ----------------------------------------
148         
149         VM(EMU* parent_emu);
150         ~VM();
151         
152         // ----------------------------------------
153         // for emulation class
154         // ----------------------------------------
155         
156         // drive virtual machine
157         void reset();
158         void run();
159         double get_frame_rate()
160         {
161                 return FRAMES_PER_SEC;
162         }
163         
164 #ifdef USE_DEBUGGER
165         // debugger
166         DEVICE *get_cpu(int index);
167 #endif
168         
169         // draw screen
170         void draw_screen();
171         
172         // sound generation
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);
178 #endif
179         
180         // notify key
181         void key_down(int code, bool repeat);
182         void key_up(int code);
183         
184         // user interface
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();
188         
189         void update_config();
190         bool process_state(FILEIO* state_fio, bool loading);
191         
192         // ----------------------------------------
193         // for each device
194         // ----------------------------------------
195         
196         // devices
197         DEVICE* get_device(int id);
198 //      DEVICE* dummy;
199 //      DEVICE* first_device;
200 //      DEVICE* last_device;
201 };
202
203 #endif