#define CONFIG_NAME "familybasic"
// device informations for virtual machine
-#define FRAMES_PER_SEC 60
-#define LINES_PER_FRAME 262
+#define FRAMES_PER_SEC 59.98
+//#define LINES_PER_FRAME 262
+#define LINES_PER_FRAME 525 // 262.5*2
#define CPU_CLOCKS 1789772
#define SCREEN_WIDTH 256
#define SCREEN_HEIGHT 240
#define HAS_N2A03
// device informations for win32
-#define USE_BOOT_MODE 3
-#define USE_TAPE
+#define SUPPORT_TV_RENDER
+#define USE_BOOT_MODE 6
+#define USE_TAPE 1
+#define USE_TAPE_BUTTON
#define USE_ALT_F10_KEY
#define USE_AUTO_KEY 5
#define USE_AUTO_KEY_RELEASE 6
#define USE_AUTO_KEY_NO_CAPS
-#define USE_SOUND_VOLUME 2
-#define USE_JOY_BUTTON_CAPTIONS
-#define USE_CRT_MONITOR_4_3 1
+#define USE_SOUND_VOLUME 4
#define USE_JOYSTICK
+#define USE_JOY_BUTTON_CAPTIONS
+#define USE_DEBUGGER
#define USE_STATE
+#define USE_CPU_N2A03
#include "../../common.h"
#include "../../fileio.h"
+#include "../vm_template.h"
#ifdef USE_SOUND_VOLUME
static const _TCHAR *sound_device_caption[] = {
- _T("APU"), _T("CMT"),
+ _T("APU"), _T("VRC7"), _T("CMT (Signal)"), _T("Noise (CMT)"),
};
#endif
};
#endif
+typedef struct header_s {
+ uint8_t id[3]; // 'NES'
+ uint8_t ctrl_z; // control-z
+ uint8_t dummy;
+ uint8_t num_8k_vrom_banks;
+ uint8_t flags_1;
+ uint8_t flags_2;
+ uint8_t reserved[8];
+ uint32_t num_16k_rom_banks()
+ {
+ return (dummy != 0) ? dummy : 256;
+ }
+ uint32_t num_8k_rom_banks()
+ {
+ return num_16k_rom_banks() * 2;
+ }
+ uint8_t mapper()
+ {
+ return (flags_1 >> 4) | (flags_2 & 0xf0);
+ }
+} header_t;
+
+class csp_state_utils;
+
class EMU;
class DEVICE;
class EVENT;
class DATAREC;
-class M6502;
+class N2A03;
+class YM2413;
-class MEMORY;
+class FAMILYBASIC_MEMORY;
class APU;
class PPU;
-class VM
+class VM : public VM_TEMPLATE
{
protected:
- EMU* emu;
+ //EMU* emu;
+ //csp_state_utils* state_entry;
// devices
- EVENT* event;
+ //EVENT* event;
DATAREC* drec;
- M6502* cpu;
+ N2A03* cpu;
+ YM2413* opll;
- MEMORY* memory;
+ FAMILYBASIC_MEMORY* memory;
APU* apu;
PPU* ppu;
void reset();
void run();
+#ifdef USE_DEBUGGER
+ // debugger
+ DEVICE *get_cpu(int index);
+#endif
+
// draw screen
void draw_screen();
// sound generation
void initialize_sound(int rate, int samples);
- uint16* create_sound(int* extra_frames);
+ uint16_t* create_sound(int* extra_frames);
int get_sound_buffer_ptr();
#ifdef USE_SOUND_VOLUME
void set_sound_device_volume(int ch, int decibel_l, int decibel_r);
#endif
// user interface
- void play_tape(const _TCHAR* file_path);
- void rec_tape(const _TCHAR* file_path);
- void close_tape();
- bool is_tape_inserted();
- bool is_tape_playing();
- bool is_tape_recording();
- int get_tape_position();
+ 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;
};
#endif