2 NEC TK-80BS (COMPO BS/80) Emulator 'eTK-80BS'
3 NEC TK-80 Emulator 'eTK-80'
4 NEC TK-85 Emulator 'eTK-85'
6 Author : Takeda.Toshiya
16 #define DEVICE_NAME "NEC TK-80BS"
17 #define CONFIG_NAME "tk80bs"
19 #define DEVICE_NAME "NEC TK-80"
20 #define CONFIG_NAME "tk80"
22 #define DEVICE_NAME "NEC TK-85"
23 #define CONFIG_NAME "tk85"
26 // device informations for virtual machine
28 #define FRAMES_PER_SEC 59.9
29 #define LINES_PER_FRAME 262
30 #elif defined(_TK80) || defined(_TK85)
31 #define FRAMES_PER_SEC 30
32 #define LINES_PER_FRAME 256
34 #if defined(_TK80BS) || defined(_TK80)
35 #define CPU_CLOCKS 2048000
36 #define SCREEN_WIDTH 784
37 #define SCREEN_HEIGHT 428
40 #define CPU_CLOCKS 2457600
41 #define SCREEN_WIDTH 784
42 #define SCREEN_HEIGHT 534
45 #define I8255_AUTO_HAND_SHAKE
47 #define MEMORY_ADDR_MAX 0x10000
48 #define MEMORY_BANK_SIZE 0x200
49 #define IO_ADDR_MAX 0x10000
51 // device informations for win32
52 #define ONE_BOARD_MICRO_COMPUTER
53 #if defined(_TK80BS) || defined(_TK80)
54 #define MAX_BUTTONS 25
56 #define MAX_BUTTONS 26
58 #if defined(_TK80) || defined(_TK85)
59 #define MAX_DRAW_RANGES 8
62 #define USE_BOOT_MODE 2
65 #define DIPSWITCH_DEFAULT 0
71 #define USE_TAPE_BUTTON
72 #define USE_BINARY_FILE 1
73 #define NOTIFY_KEY_DOWN
74 #define USE_KEY_LOCKED
75 #define USE_ALT_F10_KEY
76 #define USE_AUTO_KEY 5
77 #define USE_AUTO_KEY_RELEASE 6
78 #define USE_AUTO_KEY_NO_CAPS
79 #define USE_AUTO_KEY_NUMPAD
80 #define USE_SOUND_VOLUME 4
85 #include "../../common.h"
86 #include "../../fileio.h"
88 #ifdef USE_SOUND_VOLUME
89 static const _TCHAR *sound_device_caption[] = {
90 _T("Beep #1"), _T("Beep #2"), _T("CMT (Signal)"), _T("Noise (CMT)"),
94 #if defined(_TK80BS) || defined(_TK80)
95 #define BUTTON_SPACE_X 46
96 #define BUTTON_SPACE_Y 46
97 #define BUTTON_SIZE_X 40
98 #define BUTTON_SIZE_Y 40
99 #define BUTTON_POS_X1 523
100 #define BUTTON_POS_X2 (BUTTON_POS_X1 + BUTTON_SPACE_X * 4)
101 #define BUTTON_POS_Y1 374
102 #define BUTTON_POS_Y2 190
104 #define LED_SPACE_X 36
105 #define LED_SIZE_X 33
106 #define LED_SIZE_Y 46
107 #define LED_POS_X1 461
108 #define LED_POS_X2 618
111 #define BUTTON_SPACE_X 47
112 #define BUTTON_SPACE_Y 47
113 #define BUTTON_SIZE_X 44
114 #define BUTTON_SIZE_Y 44
115 #define BUTTON_POS_X1 536
116 #define BUTTON_POS_X2 729
117 #define BUTTON_POS_Y1 488
118 #define BUTTON_POS_Y2 296
120 #define LED_SPACE_X 39
121 #define LED_SIZE_X 29
122 #define LED_SIZE_Y 39
123 #define LED_POS_X1 446
124 #define LED_POS_X2 607
125 #define LED_POS_Y 130
133 // virtual key codes 0x80-0x8f and 0x98-0x9f are not used in pc keyboard
134 {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x80}, // 0
135 {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x81}, // 1
136 {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x82}, // 2
137 {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x83}, // 3
138 {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x84}, // 4
139 {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x85}, // 5
140 {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x86}, // 6
141 {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x87}, // 7
142 {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x88}, // 8
143 {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x89}, // 9
144 {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8a}, // A
145 {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8b}, // B
146 {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8c}, // C
147 {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8d}, // D
148 {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8e}, // E
149 {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8f}, // F
150 {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x98}, // RET
151 {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x99}, // RUN
152 {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9a}, // STORE DATA
153 {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9b}, // LOAD DATA
154 #if defined(_TK80BS) || defined(_TK80)
155 {BUTTON_POS_X2 , BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x00}, // RESET
157 {BUTTON_POS_X2 , BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x97}, // MON
159 {BUTTON_POS_X2 , BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9c}, // ADRS SET
160 {BUTTON_POS_X2 , BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9d}, // READ INCR
161 {BUTTON_POS_X2 , BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9e}, // READ DECR
162 {BUTTON_POS_X2 , BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9f}, // WRITE INCR
164 {727 , 237 , 29 , 29 , 0x00}, // RESET
171 {LED_POS_X1 + LED_SPACE_X * 0, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y}, // 7-seg LEDs
172 {LED_POS_X1 + LED_SPACE_X * 1, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
173 {LED_POS_X1 + LED_SPACE_X * 2, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
174 {LED_POS_X1 + LED_SPACE_X * 3, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
175 {LED_POS_X2 + LED_SPACE_X * 0, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
176 {LED_POS_X2 + LED_SPACE_X * 1, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
177 {LED_POS_X2 + LED_SPACE_X * 2, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
178 {LED_POS_X2 + LED_SPACE_X * 3, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
180 {4, 158, 512, 256}, // CRT
235 uint8_t ram[0x5000]; // with TK-M20K
237 uint8_t basic[0x2000];
238 uint8_t bsmon[0x1000];
245 // ----------------------------------------
247 // ----------------------------------------
252 // ----------------------------------------
253 // for emulation class
254 // ----------------------------------------
256 // drive virtual machine
262 DEVICE *get_cpu(int index);
268 int max_draw_ranges();
272 void initialize_sound(int rate, int samples);
273 uint16_t* create_sound(int* extra_frames);
274 int get_sound_buffer_ptr();
275 #ifdef USE_SOUND_VOLUME
276 void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
280 void key_down(int code, bool repeat);
281 void key_up(int code);
282 bool get_caps_locked();
283 bool get_kana_locked();
286 void load_binary(int drv, const _TCHAR* file_path);
287 void save_binary(int drv, const _TCHAR* file_path);
288 void play_tape(int drv, const _TCHAR* file_path);
289 void rec_tape(int drv, const _TCHAR* file_path);
290 void close_tape(int drv);
291 bool is_tape_inserted(int drv);
292 bool is_tape_playing(int drv);
293 bool is_tape_recording(int drv);
294 int get_tape_position(int drv);
295 const _TCHAR* get_tape_message(int drv);
296 void push_play(int drv);
297 void push_stop(int drv);
298 void push_fast_forward(int drv);
299 void push_fast_rewind(int drv);
300 void push_apss_forward(int drv) {}
301 void push_apss_rewind(int drv) {}
302 bool is_frame_skippable();
304 void update_config();
305 void save_state(FILEIO* state_fio);
306 bool load_state(FILEIO* state_fio);
308 // ----------------------------------------
310 // ----------------------------------------
313 DEVICE* get_device(int id);
315 DEVICE* first_device;