OSDN Git Service

[VM][General] Merge Upstream 20180530.
[csp-qt/common_source_project-fm7.git] / source / src / vm / upd765a.h
index 8f90ec6..913cdca 100644 (file)
@@ -11,8 +11,8 @@
 #ifndef _UPD765A_H_
 #define _UPD765A_H_
 
-#include "vm.h"
-#include "../emu.h"
+//#include "vm.h"
+//#include "../emu.h"
 #include "device.h"
 
 #define SIG_UPD765A_RESET      0
@@ -25,6 +25,7 @@
 #define SIG_UPD765A_FREADY     7
 
 class DISK;
+class NOISE;
 
 class UPD765A : public DEVICE
 {
@@ -35,41 +36,61 @@ private:
        outputs_t outputs_hdu;
        outputs_t outputs_index;
        
+       // drive noise
+       NOISE* d_noise_seek;
+       NOISE* d_noise_head_down;
+       NOISE* d_noise_head_up;
+       
        // fdc
        struct {
-               uint8 track;
-               uint8 result;
+               uint8_t track;
+               uint8_t cur_track;
+               uint8_t result;
                bool access;
+               bool head_load;
                // timing
                int cur_position;
                int next_trans_position;
-               uint32 prev_clock;
+               uint32_t prev_clock;
        } fdc[4];
        DISK* disk[4];
        
-       uint8 hdu, hdue, id[4], eot, gpl, dtl;
+       uint8_t hdu, hdue, id[4], eot, gpl, dtl;
        
        int phase, prevphase;
-       uint8 status, seekstat, command;
-       uint32 result;
+       uint8_t status, seekstat, command;
+       uint32_t result;
        int step_rate_time;
+       int head_unload_time;
        bool no_dma_mode, motor_on;
-#ifdef UPD765A_DMA_MODE
+//#ifdef UPD765A_DMA_MODE
        bool dma_data_lost;
-#endif
+//#endif
        bool irq_masked, drq_masked;
        
-       uint8* bufptr;
-       uint8 buffer[0x8000];
+       uint8_t* bufptr;
+       uint8_t buffer[0x8000];
+       int tmp_bufsize;
+       
        int count;
        int event_phase;
-       int phase_id, drq_id, lost_id, result7_id, seek_id[4];
+       int phase_id, drq_id, lost_id, result7_id, seek_step_id[4], seek_end_id[4], head_unload_id[4];
        bool force_ready;
        bool reset_signal;
        bool prev_index;
+
+       int _max_drive;
+       bool _fdc_debug_log;
+       bool _upd765a_dma_mode;
+       bool _upd765a_ext_drvsel;
+       bool _upd765a_sence_intstat_result;
+       bool _upd765a_dont_wait_seek;
+       bool _upd765a_no_st0_at_for_seek;
+       bool _upd765a_wait_result7;
+       bool _upd765a_no_st1_en_or_for_result7;
        
        // timing
-       uint32 prev_drq_clock;
+       uint32_t prev_drq_clock;
        
        int get_cur_position(int drv);
        double get_usec_to_exec_phase();
@@ -77,7 +98,7 @@ private:
        // update status
        void set_irq(bool val);
        void set_drq(bool val);
-       void set_hdu(uint8 val);
+       void set_hdu(uint8_t val);
        
        // phase shift
        void shift_to_idle();
@@ -89,12 +110,14 @@ private:
        void shift_to_result(int length);
        void shift_to_result7();
        void shift_to_result7_event();
+       void start_transfer();
+       void finish_transfer();
        
        // command
        void process_cmd(int cmd);
        void cmd_sence_devstat();
        void cmd_sence_intstat();
-       uint8 get_devstat(int drv);
+       uint8_t get_devstat(int drv);
        void cmd_seek();
        void cmd_recalib();
        void seek(int drv, int trk);
@@ -106,37 +129,40 @@ private:
        void read_data(bool deleted, bool scan);
        void write_data(bool deleted);
        void read_diagnostic();
-       uint32 read_sector();
-       uint32 write_sector(bool deleted);
-       uint32 find_id();
-       uint32 check_cond(bool write);
+       uint32_t read_sector();
+       uint32_t write_sector(bool deleted);
+       uint32_t find_id();
+       uint32_t check_cond(bool write);
        void get_sector_params();
        bool id_incr();
        void cmd_read_id();
        void cmd_write_id();
-       uint32 read_id();
-       uint32 write_id();
+       uint32_t read_id();
+       uint32_t write_id();
        void cmd_specify();
        void cmd_invalid();
-#if defined(_USE_AGAR) || defined(_USE_SDL) || defined(_USE_QT)
-        int __min(int x, int y) {
-          if(x > y) return y;
-          return x;
-       }
-        int __max(int x, int y) {
-          if(x < y) return y;
-          return x;
-       }
-#endif
-       
+       void update_head_flag(int drv, bool head_load);
+
+       void decl_state_fdc(int ch);
 public:
-       UPD765A(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+       UPD765A(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
        {
-               init_output_signals(&outputs_irq);
-               init_output_signals(&outputs_drq);
-               init_output_signals(&outputs_hdu);
-               init_output_signals(&outputs_index);
+               initialize_output_signals(&outputs_irq);
+               initialize_output_signals(&outputs_drq);
+               initialize_output_signals(&outputs_hdu);
+               initialize_output_signals(&outputs_index);
+               d_noise_seek = NULL;
+               d_noise_head_down = NULL;
+               d_noise_head_up = NULL;
+               force_ready = false;
                raise_irq_when_media_changed = false;
+               
+               _max_drive = 4;
+               _fdc_debug_log = false;
+               _upd765a_dma_mode = _upd765a_ext_drvsel = _upd765a_sence_intstat_result = false;
+               _upd765a_dont_wait_seek = _upd765a_no_st0_at_for_seek = false;
+               _upd765a_wait_result7 = _upd765a_no_st1_en_or_for_result7 = false;
+               set_device_name(_T("uPD765A FDC"));
        }
        ~UPD765A() {}
        
@@ -144,57 +170,83 @@ public:
        void initialize();
        void release();
        void reset();
-       void write_io8(uint32 addr, uint32 data);
-       uint32 read_io8(uint32 addr);
-       void write_dma_io8(uint32 addr, uint32 data);
-       uint32 read_dma_io8(uint32 addr);
-       void write_signal(int id, uint32 data, uint32 mask);
-       uint32 read_signal(int ch);
+       void write_io8(uint32_t addr, uint32_t data);
+       uint32_t read_io8(uint32_t addr);
+       void write_dma_io8(uint32_t addr, uint32_t data);
+       uint32_t read_dma_io8(uint32_t addr);
+       void write_signal(int id, uint32_t data, uint32_t mask);
+       uint32_t read_signal(int ch);
        void event_callback(int event_id, int err);
+       void update_config();
+       //#ifdef USE_DEBUGGER
+       void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
+//#endif
+       void decl_state();
        void save_state(FILEIO* state_fio);
        bool load_state(FILEIO* state_fio);
        
        // unique function
-       void set_context_irq(DEVICE* device, int id, uint32 mask)
+       void set_context_irq(DEVICE* device, int id, uint32_t mask)
        {
                register_output_signal(&outputs_irq, device, id, mask);
        }
-       void set_context_drq(DEVICE* device, int id, uint32 mask)
+       void set_context_drq(DEVICE* device, int id, uint32_t mask)
        {
                register_output_signal(&outputs_drq, device, id, mask);
        }
-       void set_context_hdu(DEVICE* device, int id, uint32 mask)
+       void set_context_hdu(DEVICE* device, int id, uint32_t mask)
        {
                register_output_signal(&outputs_hdu, device, id, mask);
        }
-       void set_context_index(DEVICE* device, int id, uint32 mask)
+       void set_context_index(DEVICE* device, int id, uint32_t mask)
        {
                register_output_signal(&outputs_index, device, id, mask);
        }
+       void set_context_noise_seek(NOISE* device)
+       {
+               d_noise_seek = device;
+       }
+       NOISE* get_context_noise_seek()
+       {
+               return d_noise_seek;
+       }
+       void set_context_noise_head_down(NOISE* device)
+       {
+               d_noise_head_down = device;
+       }
+       NOISE* get_context_noise_head_down()
+       {
+               return d_noise_head_down;
+       }
+       void set_context_noise_head_up(NOISE* device)
+       {
+               d_noise_head_up = device;
+       }
+       NOISE* get_context_noise_head_up()
+       {
+               return d_noise_head_up;
+       }
        DISK* get_disk_handler(int drv)
        {
-               return disk[drv];
+               if(drv < 4) {
+                       return disk[drv];
+               }
+               return NULL;
        }
-       void open_disk(int drv, _TCHAR path[], int bank);
+       void open_disk(int drv, const _TCHAR* file_path, int bank);
        void close_disk(int drv);
-       bool disk_inserted(int drv);
-       bool disk_inserted();   // current hdu
+       bool is_disk_inserted(int drv);
+       bool is_disk_inserted();        // current hdu
        bool disk_ejected(int drv);
        bool disk_ejected();    // current hdu
-       uint8 media_type(int drv);
-       void set_drive_type(int drv, uint8 type);
-       uint8 get_drive_type(int drv);
+       void is_disk_protected(int drv, bool value);
+       bool is_disk_protected(int drv);
+       uint8_t get_media_type(int drv);
+       void set_drive_type(int drv, uint8_t type);
+       uint8_t get_drive_type(int drv);
        void set_drive_rpm(int drv, int rpm);
        void set_drive_mfm(int drv, bool mfm);
        bool raise_irq_when_media_changed;
-       void write_protect_fd(int drive, bool flag) {
-         if((drive >= 4) || (drive < 0)) return;
-         disk[drive]->write_protected = flag;
-       }
-       bool is_write_protect_fd(int drive) {
-         if((drive >= 4) || (drive < 0)) return true; // Protected
-         return disk[drive]->write_protected;
-       }
 };
 
 #endif