--- /dev/null
+/*\r
+ FUJITSU FM16pi Emulator 'eFM16pi'\r
+\r
+ Author : Takeda.Toshiya\r
+ Date : 2010.12.25-\r
+\r
+ [ virtual machine ]\r
+*/\r
+\r
+#ifndef _FM7_H_\r
+#define _FM7_H_\r
+\r
+#define DEVICE_NAME "FUJITSU FM7"\r
+#define CONFIG_NAME "fm7"\r
+\r
+// device informations for virtual machine\r
+\r
+// TODO: check refresh rate\r
+#define FRAMES_PER_SEC 60\r
+#define LINES_PER_FRAME 400\r
+#define CPU_CLOCKS 2000000\r
+#define SCREEN_WIDTH 640\r
+#define SCREEN_HEIGHT 400\r
+#define MAX_DRIVE 4\r
+#define HAS_MC6809 \r
+#define MB8877_MAX_CHIPS 1\r
+#define MEMORY_ADDR_MAX 0x10000\r
+#define MEMORY_BANK_SIZE 0x1000\r
+//#define IO_ADDR_MAX 0x10000\r
+\r
+// device informations for win32\r
+#define USE_FD1\r
+#define USE_FD2\r
+#define NOTIFY_KEY_DOWN\r
+#define USE_ALT_F10_KEY\r
+#define USE_AUTO_KEY 5\r
+#define USE_AUTO_KEY_RELEASE 6\r
+#define USE_POWER_OFF\r
+#define USE_ACCESS_LAMP\r
+#define USE_DEBUGGER\r
+\r
+#include "../../common.h"\r
+\r
+class EMU;\r
+class DEVICE;\r
+class EVENT;\r
+\r
+class BEEP;\r
+class MC6809;\r
+class YM2203;\r
+class SN76489AN;\r
+class MB8877;\r
+class MEMORY;\r
+\r
+#if 0\r
+class Z80;\r
+#endif\r
+class VM\r
+{\r
+protected:\r
+ EMU* emu;\r
+ \r
+ // devices\r
+ EVENT* event;\r
+ \r
+ MC6809* maincpu;\r
+ MB8877* fdc;\r
+ MEMORY* mainmemory;\r
+ YM2203* opn;\r
+ YM2203* whg;\r
+ YM2203* thg;\r
+ SN76489AN* psg; // Is right? AY-3-8910 is right device.\r
+ BEEP* beep;\r
+#if 0\r
+ Z80* z80cpu;\r
+#endif\r
+#if 0 // WILL Implement\r
+ FM7_CMT* cmt;\r
+ FM7_OPNJOY* joystick_opn;\r
+ FM7_LPT* printer;\r
+ FM7_MOUSE* mouse_opn;\r
+ FM7_MAINIRQ* main_interrupt;\r
+ FM7_SHAREDBUS* mainsub_bus;\r
+ FM7_DPALET* ttl_palette;\r
+ \r
+ FM7_APALET* analog_palette;\r
+ FM7_MMR* mmr;\r
+ FM7_WINDOW *fm7_window;\r
+ FM7_DMA* dma;\r
+#endif \r
+ MC6809* subcpu;\r
+ MEMORY* submemory;\r
+#if 0 // WILL Implement\r
+ FM7_DISPLAY* display;\r
+ FM7_KBD* keyboard;\r
+ FM7_SUBIRQ* sub_interrupt;\r
+ \r
+ FM7_RTC* rtc;\r
+ FM7_ALU* alu;\r
+#endif \r
+ \r
+ int machine_version; // 0 = FM8 / 1 = FM7 / 2 = FM77AV / 3 = FM77AV40, etc...\r
+ Uint32 bootmode; \r
+ Uint32 connected_opns;\r
+ bool cycle_steal = true;\r
+ bool clock_low = false;\r
+ int mainfreq_type;\r
+ Uint32 mainfreq_low;\r
+ Uint32 mainfreq_high;\r
+ Uint32 mainfreq_mmr;\r
+ Uint32 mainfreq_high_mmr;\r
+ \r
+ Uint32 fdd_type[MAX_DRIVES];\r
+ BOOL fdd_connect[MAX_DRIVES];\r
+\r
+ FILEIO* cmt_fileio;\r
+ bool cmt_enabled = true; // 77AV40SX is disabled.\r
+ bool cmt_play;\r
+ bool cmt_rec;\r
+ Uint32 cmt_bufptr;\r
+ \r
+ // memory\r
+ // MAIN\r
+ uint8 mainram_b1[0x10000]; // 0x10000, RAM\r
+ uint8 mainram_b2[0x10000]; // 0x20000, RAM\r
+ uint8 mainram_b3a[0x8000]; // 0x30000, RAM\r
+ uint8 basicrom[0x7c00]; // 0x38000, ROM\r
+ uint8 mainram_b3b[0x7c00]; // 0x38000, RAM\r
+ uint8 shadowram[0x80]; // 0x3fc00, RAM\r
+ uint8 sharedram[0x80]; // 0x3fc80, Shared RAM\r
+ uint8 mainio[0x100]; // 0xfd00 - 0xfdff I/O\r
+ uint8 boot_bas[0x1f0]; // 0xfe00, BOOT(BAS)\r
+ uint8 boot_dos[0x1f0];\r
+ uint8 boot_bubl[0x1f0];\r
+ uint8 boot_ram[0x1f0];\r
+ uint8 main_vector[0x10]; // 0xfff0, VECTOR(main)\r
+ uint8 initiate[0x2000]; // Initiate RAM.\r
+\r
+ uint8 dictrom[0x40000];\r
+ uint8 kanjirom1[0x20000];\r
+ uint8 kanjirom2[0x20000];\r
+ // SUB\r
+ uint8 vram_b1[0xc000];\r
+ uint8 vram_b2[0xc000];\r
+ uint8 vram_b3[0xc000];\r
+ uint8 subchar[0x1000];\r
+ uint8 subwork[0x0380];\r
+ //uint8 sharedram_sub[0x80];\r
+ uint8 subio[0x400]; // Really?\r
+ uint8 cgrom[0x2000];\r
+ uint8 submon_a[0x2000];\r
+ uint8 submon_b[0x2000];\r
+ uint8 submon_c[0x2800];\r
+ uint8 extsubrom[0xc000];\r
+public:\r
+ // ----------------------------------------\r
+ // initialize\r
+ // ----------------------------------------\r
+ \r
+ VM(EMU* parent_emu);\r
+ ~VM();\r
+ \r
+ // ----------------------------------------\r
+ // for emulation class\r
+ // ----------------------------------------\r
+ \r
+ // drive virtual machine\r
+ void reset();\r
+ void notify_power_off();\r
+ void run();\r
+ \r
+#ifdef USE_DEBUGGER\r
+ // debugger\r
+ DEVICE *get_cpu(int index);\r
+#endif\r
+ \r
+ // draw screen\r
+ void draw_screen();\r
+ int access_lamp();\r
+ \r
+ // sound generation\r
+ void initialize_sound(int rate, int samples);\r
+ uint16* create_sound(int* extra_frames);\r
+ int sound_buffer_ptr();\r
+ \r
+ // notify key\r
+ void key_down(int code, bool repeat);\r
+ void key_up(int code);\r
+ \r
+ // user interface\r
+ void open_disk(int drv, _TCHAR* file_path, int offset);\r
+ void close_disk(int drv);\r
+ bool disk_inserted(int drv);\r
+ bool now_skip();\r
+ \r
+ void update_config();\r
+ \r
+ // ----------------------------------------\r
+ // for each device\r
+ // ----------------------------------------\r
+ \r
+ // devices\r
+ DEVICE* get_device(int id);\r
+ DEVICE* dummy;\r
+ DEVICE* first_device;\r
+ DEVICE* last_device;\r
+};\r
+\r
+#endif\r