OSDN Git Service

[VM][General] Merge Upstream 20180530.
[csp-qt/common_source_project-fm7.git] / source / src / vm / upd765a.h
index 11004c1..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,11 +36,18 @@ 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_t track;
+               uint8_t cur_track;
                uint8_t result;
                bool access;
+               bool head_load;
                // timing
                int cur_position;
                int next_trans_position;
@@ -53,20 +61,33 @@ private:
        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_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_t prev_drq_clock;
@@ -89,6 +110,8 @@ 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);
@@ -118,17 +141,28 @@ private:
        uint32_t write_id();
        void cmd_specify();
        void cmd_invalid();
-       
+       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)
        {
                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;
-               set_device_name(_T("uPD765A"));
+               
+               _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() {}
        
@@ -143,12 +177,13 @@ public:
        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);
-       const _TCHAR *get_device_name()
-       {
-               return _T("uPD765A");
-       }
        
        // unique function
        void set_context_irq(DEVICE* device, int id, uint32_t mask)
@@ -167,9 +202,36 @@ public:
        {
                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, const _TCHAR* file_path, int bank);
        void close_disk(int drv);
@@ -179,7 +241,7 @@ public:
        bool disk_ejected();    // current hdu
        void is_disk_protected(int drv, bool value);
        bool is_disk_protected(int drv);
-       uint8_t media_type(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);