////////////////////////////////////////////////////////////////////////// // Mapper020 Nintendo Disk System(FDS) // ////////////////////////////////////////////////////////////////////////// class Mapper020 : public Mapper { public: Mapper020( NES* parent ) : Mapper(parent) {} void Reset(); BYTE ExRead ( WORD addr ); void ExWrite( WORD addr, BYTE data ); void WriteLow( WORD addr, BYTE data ); void Write(WORD addr, BYTE data); void Clock( INT cycles ); void HSync( INT scanline ); void VSync(); BYTE ExCmdRead ( EXCMDRD cmd ); void ExCmdWrite( EXCMDWR cmd, BYTE data ); // For state save BOOL IsStateSave() { return TRUE; } void SaveState( LPBYTE p ); void LoadState( LPBYTE p ); void PPU_Latch( WORD addr ); protected: enum { BLOCK_READY = 0, BLOCK_VOLUME_LABEL, BLOCK_FILE_AMOUNT, BLOCK_FILE_HEADER, BLOCK_FILE_DATA, }; enum { SIZE_VOLUME_LABEL = 56, SIZE_FILE_AMOUNT = 2, SIZE_FILE_HEADER = 16, }; enum { OFFSET_VOLUME_LABEL = 0, OFFSET_FILE_AMOUNT = 56, OFFSET_FILE_HEADER = 58, OFFSET_FILE_DATA = 74, }; enum { MECHANICAL_SOUND_BOOT = 0, MECHANICAL_SOUND_SEEKEND, MECHANICAL_SOUND_MOTOR_ON, MECHANICAL_SOUND_MOTOR_OFF, MECHANICAL_SOUND_ALLSTOP, }; BOOL bDiskThrottle; INT DiskThrottleTime; LPBYTE disk; LPBYTE disk_w; INT irq_counter, irq_latch; // $4020-$4021 BYTE irq_enable, irq_repeat; // $4022 BYTE irq_occur; // IRQ発生時に0以外になる BYTE irq_transfer; // 割り込み転送フラグ BYTE disk_enable; // Disk I/O enable BYTE sound_enable; // Sound I/O enable BYTE RW_start; // 読み書き可能になったらIRQ発生 BYTE RW_mode; // 読み書きモード BYTE disk_motor_mode; // ディスクモーター BYTE disk_eject; // ディスクカードの挿入/非挿入 BYTE drive_ready; // 読み書き中かどうか BYTE drive_reset; // ドライブリセット状態 INT block_point; INT block_mode; INT size_file_data; INT file_amount; INT point; BYTE first_access; BYTE disk_side; BYTE disk_mount_count; BYTE irq_type; // For mechanical sound BYTE sound_startup_flag; INT sound_startup_timer; INT sound_seekend_timer; void MechanicalSound( INT type ); private: };