-//\r
-// PC-6001/6601 disk I/O\r
-// This file is based on a disk I/O program in C++\r
-// by Mr. Yumitaro and translated into C for Cocoa iP6\r
-// by Koichi NISHIDA 2006\r
-//\r
-\r
-/*\r
- NEC PC-6601 Emulator 'yaPC-6601'\r
- NEC PC-6601SR Emulator 'yaPC-6801'\r
-\r
- Author : tanam\r
- Date : 2013.07.15-\r
-\r
- [ internal floppy drive ]\r
-*/\r
-\r
-#ifndef _FLOPPY_H_\r
-#define _FLOPPY_H_\r
-\r
-#include "../vm.h"\r
-#include "../../emu.h"\r
-#include "../device.h"\r
-\r
-class DISK;\r
-\r
-class FLOPPY : public DEVICE\r
-{\r
-private:\r
- DEVICE *d_ext;\r
- unsigned char io_B1H;\r
- \r
- DISK* disk[2];\r
- \r
- int cur_trk[2];\r
- int cur_sct[2];\r
- int cur_pos[2];\r
- bool access[2];\r
- \r
- int Seek88(int drvno, int trackno, int sectno);\r
- unsigned char Getc88(int drvno);\r
- int Putc88(int drvno, unsigned char dat);\r
- \r
- // data buffer (256BytesX4)\r
- unsigned char Data[4][256];\r
- int Index[4];\r
- \r
- typedef struct {\r
- unsigned char Data[10];\r
- int Index;\r
- } CmdBuffer;\r
- \r
- CmdBuffer CmdIn; // command buffer\r
- CmdBuffer CmdOut; // status buffer\r
- unsigned char SeekST0; // ST0 when SEEK\r
- unsigned char LastCylinder; // last read cylinder\r
- int SeekEnd; // complete seek flag\r
- unsigned char SendSectors; // amount(100H unit)\r
- int DIO; // data direction TRUE: Buffer->CPU FALSE: CPU->Buffer\r
- unsigned char Status; // FDC status register\r
- \r
- void Push(int part, unsigned char data);\r
- unsigned char Pop(int part);\r
- void Clear(int i);\r
- \r
- int DiskInit66(void);\r
- void PushStatus(int data);\r
- unsigned char PopStatus();\r
- void OutFDC(unsigned char data);\r
- unsigned char InFDC();\r
- void Read();\r
- void Write(void);\r
- void Seek(void);\r
- void SenseInterruptStatus(void);\r
- void Exec();\r
- \r
- void OutB1H_66(unsigned char data);\r
- void OutB2H_66(unsigned char data);\r
- void OutB3H_66(unsigned char data);\r
- void OutD0H_66(unsigned char data);\r
- void OutD1H_66(unsigned char data);\r
- void OutD2H_66(unsigned char data);\r
- void OutD3H_66(unsigned char data);\r
- void OutD6H_66(unsigned char data);\r
- void OutD8H_66(unsigned char data);\r
- void OutDAH_66(unsigned char data);\r
- void OutDDH_66(unsigned char data);\r
- void OutDEH_66(unsigned char data);\r
- \r
- unsigned char InB2H_66();\r
- unsigned char InD0H_66();\r
- unsigned char InD1H_66();\r
- unsigned char InD2H_66();\r
- unsigned char InD3H_66();\r
- unsigned char InD4H_66();\r
- unsigned char InDCH_66();\r
- unsigned char InDDH_66();\r
- \r
-public:\r
- FLOPPY(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) {}\r
- ~FLOPPY() {}\r
- \r
- // common functions\r
- void initialize();\r
- void release();\r
- void reset();\r
- void write_io8(uint32 addr, uint32 data);\r
- uint32 read_io8(uint32 addr);\r
- uint32 read_signal(int ch);\r
- \r
- // unique functiosn\r
- void set_context_ext(DEVICE* device)\r
- {\r
- d_ext = device;\r
- }\r
- void open_disk(int drv, _TCHAR* file_path, int offset);\r
- void close_disk(int drv);\r
- bool disk_inserted(int drv);\r
-};\r
-\r
-#endif\r
-\r
+//
+// PC-6001/6601 disk I/O
+// This file is based on a disk I/O program in C++
+// by Mr. Yumitaro and translated into C for Cocoa iP6
+// by Koichi NISHIDA 2006
+//
+
+/*
+ NEC PC-6601 Emulator 'yaPC-6601'
+ NEC PC-6601SR Emulator 'yaPC-6801'
+
+ Author : tanam
+ Date : 2013.07.15-
+
+ [ internal floppy drive ]
+*/
+
+#ifndef _FLOPPY_H_
+#define _FLOPPY_H_
+
+#include "../vm.h"
+#include "../../emu.h"
+#include "../device.h"
+
+class DISK;
+class NOISE;
+
+class FLOPPY : public DEVICE
+{
+private:
+ DEVICE *d_ext;
+ NOISE *d_noise_seek;
+// NOISE* d_noise_head_down;
+// NOISE* d_noise_head_up;
+ unsigned char io_B1H;
+
+ DISK* disk[2];
+
+ int cur_trk[2];
+ int cur_sct[2];
+ int cur_pos[2];
+ bool access[2];
+
+ int Seek88(int drvno, int trackno, int sectno);
+ unsigned char Getc88(int drvno);
+ int Putc88(int drvno, unsigned char dat);
+
+ // data buffer (256BytesX4)
+ unsigned char Data[4][256];
+ int Index[4];
+
+ typedef struct {
+ unsigned char Data[10];
+ int Index;
+ } CmdBuffer;
+
+ CmdBuffer CmdIn; // command buffer
+ CmdBuffer CmdOut; // status buffer
+ unsigned char SeekST0; // ST0 when SEEK
+ unsigned char LastCylinder; // last read cylinder
+ int SeekEnd; // complete seek flag
+ unsigned char SendSectors; // amount(100H unit)
+ int DIO; // data direction TRUE: Buffer->CPU FALSE: CPU->Buffer
+ unsigned char Status; // FDC status register
+
+ void Push(int part, unsigned char data);
+ unsigned char Pop(int part);
+ void Clear(int i);
+
+ int DiskInit66(void);
+ void PushStatus(int data);
+ unsigned char PopStatus();
+ void OutFDC(unsigned char data);
+ unsigned char InFDC();
+ void Read();
+ void Write(void);
+ void Seek(void);
+ void SenseInterruptStatus(void);
+ void Exec();
+
+ void OutB1H_66(unsigned char data);
+ void OutB2H_66(unsigned char data);
+ void OutB3H_66(unsigned char data);
+ void OutD0H_66(unsigned char data);
+ void OutD1H_66(unsigned char data);
+ void OutD2H_66(unsigned char data);
+ void OutD3H_66(unsigned char data);
+ void OutD6H_66(unsigned char data);
+ void OutD8H_66(unsigned char data);
+ void OutDAH_66(unsigned char data);
+ void OutDDH_66(unsigned char data);
+ void OutDEH_66(unsigned char data);
+
+ unsigned char InB2H_66();
+ unsigned char InD0H_66();
+ unsigned char InD1H_66();
+ unsigned char InD2H_66();
+ unsigned char InD3H_66();
+ unsigned char InD4H_66();
+ unsigned char InDCH_66();
+ unsigned char InDDH_66();
+
+public:
+ FLOPPY(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+ {
+ d_noise_seek = NULL;
+// d_noise_head_down = NULL;
+// d_noise_head_up = NULL;
+ set_device_name(_T("Floppy Drive"));
+ }
+ ~FLOPPY() {}
+
+ // common functions
+ void initialize();
+ void release();
+ void reset();
+ void write_io8(uint32_t addr, uint32_t data);
+ uint32_t read_io8(uint32_t addr);
+ uint32_t read_signal(int ch);
+ void update_config();
+ bool process_state(FILEIO* state_fio, bool loading);
+
+ // unique functions
+ void set_context_ext(DEVICE* device)
+ {
+ d_ext = device;
+ }
+ 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];
+ }
+ void open_disk(int drv, const _TCHAR* file_path, int bank);
+ void close_disk(int drv);
+ bool is_disk_inserted(int drv);
+ void is_disk_protected(int drv, bool value);
+ bool is_disk_protected(int drv);
+};
+
+#endif
+