/*
NEC TK-80BS (COMPO BS/80) Emulator 'eTK-80BS'
+ NEC TK-80 Emulator 'eTK-80'
+ NEC TK-85 Emulator 'eTK-85'
Author : Takeda.Toshiya
Date : 2008.08.26 -
#ifndef _TK80BS_H_
#define _TK80BS_H_
+#if defined(_TK80BS)
#define DEVICE_NAME "NEC TK-80BS"
#define CONFIG_NAME "tk80bs"
+#elif defined(_TK80)
+#define DEVICE_NAME "NEC TK-80"
+#define CONFIG_NAME "tk80"
+#elif defined(_TK85)
+#define DEVICE_NAME "NEC TK-85"
+#define CONFIG_NAME "tk85"
+#endif
// device informations for virtual machine
+#if defined(_TK80BS)
#define FRAMES_PER_SEC 59.9
#define LINES_PER_FRAME 262
+#elif defined(_TK80) || defined(_TK85)
+#define FRAMES_PER_SEC 30
+#define LINES_PER_FRAME 256
+#endif
+#if defined(_TK80BS) || defined(_TK80)
#define CPU_CLOCKS 2048000
-#define HAS_I8080
-#define I8255_AUTO_HAND_SHAKE
#define SCREEN_WIDTH 784
#define SCREEN_HEIGHT 428
+#define HAS_I8080
+#elif defined(_TK85)
+#define CPU_CLOCKS 2457600
+#define SCREEN_WIDTH 784
+#define SCREEN_HEIGHT 534
+#define HAS_I8085
+#endif
+#define I8255_AUTO_HAND_SHAKE
+
#define MEMORY_ADDR_MAX 0x10000
#define MEMORY_BANK_SIZE 0x200
#define IO_ADDR_MAX 0x10000
// device informations for win32
#define ONE_BOARD_MICRO_COMPUTER
+#if defined(_TK80BS) || defined(_TK80)
#define MAX_BUTTONS 25
-//#define MAX_DRAW_RANGES 9
+#elif defined(_TK85)
+#define MAX_BUTTONS 26
+#endif
+#if defined(_TK80) || defined(_TK85)
+#define MAX_DRAW_RANGES 8
+#endif
+#if defined(_TK80BS)
#define USE_BOOT_MODE 2
-//#define USE_DIPSWITCH
-//#define DIPSWITCH_DEFAULT 0
-#define USE_TAPE
-#define TAPE_BINARY_ONLY
-#define USE_BINARY_FILE1
+#endif
+#define USE_DIPSWITCH
+#define DIPSWITCH_DEFAULT 0
+#if defined(_TK80BS)
+#define USE_TAPE 2
+#else
+#define USE_TAPE 1
+#endif
+#define USE_TAPE_BUTTON
+#define USE_BINARY_FILE 1
#define NOTIFY_KEY_DOWN
+#define USE_KEY_LOCKED
#define USE_ALT_F10_KEY
#define USE_AUTO_KEY 5
#define USE_AUTO_KEY_RELEASE 6
#define USE_AUTO_KEY_NO_CAPS
-#define SUPPORT_ROMA_KANA_CONVERSION
-
-#define USE_SOUND_VOLUME 2
+#define USE_AUTO_KEY_NUMPAD
+#define USE_SOUND_VOLUME 4
#define USE_DEBUGGER
#define USE_STATE
+#define USE_CPU_I8080
#include "../../common.h"
#include "../../fileio.h"
+#include "../vm_template.h"
#ifdef USE_SOUND_VOLUME
static const _TCHAR *sound_device_caption[] = {
- _T("Beep #1"), _T("Beep #2"),
+ _T("Beep #1"), _T("Beep #2"), _T("CMT (Signal)"), _T("Noise (CMT)"),
};
#endif
+#if defined(_TK80BS) || defined(_TK80)
+#define BUTTON_SPACE_X 46
+#define BUTTON_SPACE_Y 46
+#define BUTTON_SIZE_X 40
+#define BUTTON_SIZE_Y 40
+#define BUTTON_POS_X1 523
+#define BUTTON_POS_X2 (BUTTON_POS_X1 + BUTTON_SPACE_X * 4)
+#define BUTTON_POS_Y1 374
+#define BUTTON_POS_Y2 190
+
+#define LED_SPACE_X 36
+#define LED_SIZE_X 33
+#define LED_SIZE_Y 46
+#define LED_POS_X1 461
+#define LED_POS_X2 618
+#define LED_POS_Y 28
+#else
+#define BUTTON_SPACE_X 47
+#define BUTTON_SPACE_Y 47
+#define BUTTON_SIZE_X 44
+#define BUTTON_SIZE_Y 44
+#define BUTTON_POS_X1 536
+#define BUTTON_POS_X2 729
+#define BUTTON_POS_Y1 488
+#define BUTTON_POS_Y2 296
+
+#define LED_SPACE_X 39
+#define LED_SIZE_X 29
+#define LED_SIZE_Y 39
+#define LED_POS_X1 446
+#define LED_POS_X2 607
+#define LED_POS_Y 130
+#endif
+
const struct {
- const _TCHAR* caption;
int x, y;
int width, height;
- int font_size;
int code;
} vm_buttons[] = {
// virtual key codes 0x80-0x8f and 0x98-0x9f are not used in pc keyboard
- {_T("0"), 523 + 46 * 0, 190 + 46 * 4, 40, 40, 20, 0x80},
- {_T("1"), 523 + 46 * 1, 190 + 46 * 4, 40, 40, 20, 0x81},
- {_T("2"), 523 + 46 * 2, 190 + 46 * 4, 40, 40, 20, 0x82},
- {_T("3"), 523 + 46 * 3, 190 + 46 * 4, 40, 40, 20, 0x83},
- {_T("4"), 523 + 46 * 0, 190 + 46 * 3, 40, 40, 20, 0x84},
- {_T("5"), 523 + 46 * 1, 190 + 46 * 3, 40, 40, 20, 0x85},
- {_T("6"), 523 + 46 * 2, 190 + 46 * 3, 40, 40, 20, 0x86},
- {_T("7"), 523 + 46 * 3, 190 + 46 * 3, 40, 40, 20, 0x87},
- {_T("8"), 523 + 46 * 0, 190 + 46 * 2, 40, 40, 20, 0x88},
- {_T("9"), 523 + 46 * 1, 190 + 46 * 2, 40, 40, 20, 0x89},
- {_T("A"), 523 + 46 * 2, 190 + 46 * 2, 40, 40, 20, 0x8a},
- {_T("B"), 523 + 46 * 3, 190 + 46 * 2, 40, 40, 20, 0x8b},
- {_T("C"), 523 + 46 * 0, 190 + 46 * 1, 40, 40, 20, 0x8c},
- {_T("D"), 523 + 46 * 1, 190 + 46 * 1, 40, 40, 20, 0x8d},
- {_T("E"), 523 + 46 * 2, 190 + 46 * 1, 40, 40, 20, 0x8e},
- {_T("F"), 523 + 46 * 3, 190 + 46 * 1, 40, 40, 20, 0x8f},
- {_T("RET"), 523 + 46 * 0, 190 + 46 * 0, 40, 40, 9, 0x98},
- {_T("RUN"), 523 + 46 * 1, 190 + 46 * 0, 40, 40, 9, 0x99},
- {_T("STORE\nDATA"), 523 + 46 * 2, 190 + 46 * 0, 40, 40, 9, 0x9a},
- {_T("LOAD\nDATA"), 523 + 46 * 3, 190 + 46 * 0, 40, 40, 9, 0x9b},
- {_T("RESET"), 523 + 46 * 4, 190 + 46 * 0, 40, 40, 9, 0x00},
- {_T("ADRS\nSET"), 523 + 46 * 4, 190 + 46 * 1, 40, 40, 9, 0x9c},
- {_T("READ\nINCR"), 523 + 46 * 4, 190 + 46 * 2, 40, 40, 9, 0x9d},
- {_T("READ\nDECR"), 523 + 46 * 4, 190 + 46 * 3, 40, 40, 9, 0x9e},
- {_T("WRITE\nINCR"), 523 + 46 * 4, 190 + 46 * 4, 40, 40, 9, 0x9f},
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x80}, // 0
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x81}, // 1
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x82}, // 2
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x83}, // 3
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x84}, // 4
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x85}, // 5
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x86}, // 6
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x87}, // 7
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x88}, // 8
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x89}, // 9
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8a}, // A
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8b}, // B
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8c}, // C
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8d}, // D
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8e}, // E
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x8f}, // F
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 0, BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x98}, // RET
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 1, BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x99}, // RUN
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 2, BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9a}, // STORE DATA
+ {BUTTON_POS_X1 + BUTTON_SPACE_X * 3, BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9b}, // LOAD DATA
+#if defined(_TK80BS) || defined(_TK80)
+ {BUTTON_POS_X2 , BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x00}, // RESET
+#elif defined(_TK85)
+ {BUTTON_POS_X2 , BUTTON_POS_Y2 , BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x97}, // MON
+#endif
+ {BUTTON_POS_X2 , BUTTON_POS_Y1 - BUTTON_SPACE_Y * 3, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9c}, // ADRS SET
+ {BUTTON_POS_X2 , BUTTON_POS_Y1 - BUTTON_SPACE_Y * 2, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9d}, // READ INCR
+ {BUTTON_POS_X2 , BUTTON_POS_Y1 - BUTTON_SPACE_Y * 1, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9e}, // READ DECR
+ {BUTTON_POS_X2 , BUTTON_POS_Y1 - BUTTON_SPACE_Y * 0, BUTTON_SIZE_X, BUTTON_SIZE_Y, 0x9f}, // WRITE INCR
+#if defined(_TK85)
+ {727 , 237 , 29 , 29 , 0x00}, // RESET
+#endif
};
const struct {
int x, y;
int width, height;
} vm_ranges[] = {
- {461 + 36 * 0, 28, 33, 46}, // 7-seg LEDs
- {461 + 36 * 1, 28, 33, 46},
- {461 + 36 * 2, 28, 33, 46},
- {461 + 36 * 3, 28, 33, 46},
- {618 + 36 * 0, 28, 33, 46},
- {618 + 36 * 1, 28, 33, 46},
- {618 + 36 * 2, 28, 33, 46},
- {618 + 36 * 3, 28, 33, 46},
+ {LED_POS_X1 + LED_SPACE_X * 0, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y}, // 7-seg LEDs
+ {LED_POS_X1 + LED_SPACE_X * 1, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
+ {LED_POS_X1 + LED_SPACE_X * 2, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
+ {LED_POS_X1 + LED_SPACE_X * 3, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
+ {LED_POS_X2 + LED_SPACE_X * 0, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
+ {LED_POS_X2 + LED_SPACE_X * 1, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
+ {LED_POS_X2 + LED_SPACE_X * 2, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
+ {LED_POS_X2 + LED_SPACE_X * 3, LED_POS_Y, LED_SIZE_X, LED_SIZE_Y},
+#if defined(_TK80BS)
{4, 158, 512, 256}, // CRT
+#endif
};
class EMU;
class DEVICE;
class EVENT;
+class DATAREC;
+class I8080;
+#if defined(_TK80BS)
class I8251;
-class I8255;
class IO;
-class MEMORY;
+#endif
+class I8255;
class PCM1BIT;
-class I8080;
-class CMT;
-class DISPLAY;
-class KEYBOARD;
+namespace TK80 {
+#if defined(_TK80BS)
+ class CMT;
+#endif
+ //class MEMORY;
+ class DISPLAY;
+ class KEYBOARD;
+ class MEMBUS;
+}
-class VM
+class VM : public VM_TEMPLATE
{
protected:
- EMU* emu;
+ //EMU* emu;
// devices
- EVENT* event;
+ //EVENT* event;
+ DATAREC* drec;
+ I8080* cpu;
+#if defined(_TK80BS)
I8251* sio_b;
I8255* pio_b;
- I8255* pio_t;
IO* memio;
- MEMORY* memory;
+#endif
+ I8255* pio_t;
+// TK80::MEMORY* memory;
PCM1BIT* pcm0;
PCM1BIT* pcm1;
- I8080* cpu;
- CMT* cmt;
- DISPLAY* display;
- KEYBOARD* keyboard;
+#if defined(_TK80BS)
+ TK80::CMT* cmt;
+#endif
+ TK80::DISPLAY* display;
+ TK80::KEYBOARD* keyboard;
+ TK80::MEMBUS* memory;
// memory
uint8_t mon[0x800];
uint8_t ext[0x7000];
+ uint8_t ram[0x5000]; // with TK-M20K
+#if defined(_TK80BS)
uint8_t basic[0x2000];
uint8_t bsmon[0x1000];
- uint8_t ram[0x5000]; // with TK-M20K
uint8_t vram[0x200];
int boot_mode;
+#endif
public:
// ----------------------------------------
// draw screen
void draw_screen();
+#if defined(_TK80BS)
int max_draw_ranges();
+#endif
// sound generation
void initialize_sound(int rate, int samples);
// notify key
void key_down(int code, bool repeat);
void key_up(int code);
+ bool get_caps_locked();
+ bool get_kana_locked();
// user interface
void load_binary(int drv, const _TCHAR* file_path);
void save_binary(int drv, const _TCHAR* file_path);
- void play_tape(const _TCHAR* file_path);
- void rec_tape(const _TCHAR* file_path);
- void close_tape();
- bool is_tape_inserted();
+ void play_tape(int drv, const _TCHAR* file_path);
+ void rec_tape(int drv, const _TCHAR* file_path);
+ void close_tape(int drv);
+ bool is_tape_inserted(int drv);
+ bool is_tape_playing(int drv);
+ bool is_tape_recording(int drv);
+ int get_tape_position(int drv);
+ const _TCHAR* get_tape_message(int drv);
+ void push_play(int drv);
+ void push_stop(int drv);
+ void push_fast_forward(int drv);
+ void push_fast_rewind(int drv);
+ void push_apss_forward(int drv) {}
+ void push_apss_rewind(int drv) {}
bool is_frame_skippable();
void update_config();
- void save_state(FILEIO* state_fio);
- bool load_state(FILEIO* state_fio);
+ bool process_state(FILEIO* state_fio, bool loading);
// ----------------------------------------
// for each device
// devices
DEVICE* get_device(int id);
- DEVICE* dummy;
- DEVICE* first_device;
- DEVICE* last_device;
+ //DEVICE* dummy;
+ //DEVICE* first_device;
+ //DEVICE* last_device;
+#if defined(_TK80BS)
int draw_ranges;
+#endif
};
#endif