|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #pragma once
7:
8: #include "device.h"
9: #include "scheduler.h"
10:
11: enum fdc_phase_t {
12: PHASE_IDLE = 0,
13: PHASE_COMMAND,
14: PHASE_EXEC,
15: PHASE_RESULT,
16: };
17:
18: struct FDD {
19: bool motor; // モーターオン
20: bool seek; // シーク中/シーク完了割り込み保留中
21: };
22:
23: struct FDC {
24: int drivesel; // ドライブ選択
25: fdc_phase_t phase;
26: uint8 cmdbuf[10];
27: int cmdpos;
28: int cmdlen;
29: uint8 resbuf[10];
30: int respos;
31: int reslen;
32:
33: bool is2DD;
34: int accdrive; // アクセスドライブ番号
35:
36: // ステータスレジスタ
37: bool RQM; // Request For Master
38: int DIO; // Data Input/Output
39: #define DIOtoFDC (0)
40: #define DIOtoHost (1)
41: bool NDM; // Non-DMA Mode
42: bool CB; // FDC Busy
43:
44: uint8 srt;
45: uint8 hut;
46: uint8 hlt;
47: bool nd; // Non DMA
48:
49: // コマンド(下位5ビットのみにしたもの)
50: static const int CMD_MASK = 0x1f; // マスク
51: static const int CMD_READ_DIAGNOSTIC = 0x02; // %0M00_0010
52: static const int CMD_SPECIFY = 0x03; // %0000_0011
53: static const int CMD_SENSE_DEVICE_STATUS = 0x04; // %0000_0100
54: static const int CMD_WRITE_DATA = 0x05; // %MM00_0101
55: static const int CMD_READ = 0x06; // %MMS0_0110
56: static const int CMD_RECALIBRATE = 0x07; // %0000_0111
57: static const int CMD_SENSE_INTERRUPT_STATUS = 0x08; // %0000_1000
58: static const int CMD_WRITE_DELETED_DATA = 0x09; // %MM00_1001
59: static const int CMD_READ_ID = 0x0a; // %0M00_1010
60: static const int CMD_READ_DELETED_DATA = 0x0c; // %MMS0_1100
61: static const int CMD_WRITE_ID = 0x0d; // %0M00_1101
62: static const int CMD_SEEK = 0x0f; // %0000_1111
63: static const int CMD_SCAN_EQUAL = 0x11; // %MMS1_0001
64: static const int CMD_RESET_STANDBY = 0x14; // %0011_0100
65: static const int CMD_SET_STABNDBY = 0x15; // %0011_0101
66: static const int CMD_SOFTWARE_RESET = 0x16; // %0011_0110
67: static const int CMD_SCAN_LOW_OR_EQUAL = 0x19; // %MMS1_1001
68: static const int CMD_SCAN_HIGH_OR_EQUAL = 0x1d; // %MMS1_1101
69:
70: // ステータスレジスタ
71: static const int STAT_RQM = 0x80; // Request For Master
72: static const int STAT_DIO = 0x40; // Data Input/Output
73: static const int STAT_NDM = 0x20; // Non-DMA Mode
74: static const int STAT_CB = 0x10; // FDC Busy
75: static const int STAT_D3B = 0x08; // FD3 Busy
76: static const int STAT_D2B = 0x04; // FD2 Busy
77: static const int STAT_D1B = 0x02; // FD1 Busy
78: static const int STAT_D0B = 0x01; // FD0 Busy
79:
80: // リザルトステータス0
81: static const int ST0_IC_MASK = 0xc0;
82: static const int ST0_IC_AI = 0xc0; // AI: Attention Interrupt
83: static const int ST0_IC_IC = 0x80; // CI: Invalid Command
84: static const int ST0_IC_AT = 0x40; // AT: Abnormal Terminate
85: static const int ST0_IC_NT = 0x00; // NT: Normal Terminate
86: static const int ST0_SE = 0x20; // Seek End
87: static const int ST0_EC = 0x10; // Equipment Check
88: static const int ST0_NR = 0x08; // Not Ready
89: static const int ST0_HD = 0x04; // Head Address
90: static const int ST0_US_MASK = 0x03; // Unit Select
91:
92: // リザルトステータス3
93: static const int ST3_FT = 0x80; // Fault
94: static const int ST3_WP = 0x40; // Write Protect
95: static const int ST3_RY = 0x20; // Ready
96: static const int ST3_T0 = 0x10; // Track 0
97: static const int ST3_TS = 0x08; // Two Side
98: static const int ST3_HD = 0x04; // HD
99: static const int ST3_US_MASK = 0x03; // Unit Select
100: };
101:
102: class FDCDevice
103: : public IODevice
104: {
105: typedef IODevice inherited;
106: private:
107: static const int baseaddr = 0xe94000;
108:
109: public:
110: FDCDevice();
111: virtual ~FDCDevice();
112:
113: virtual void ResetHard();
114:
115: virtual uint64 Read8(uint32 addr);
116: virtual uint64 Read16(uint32 addr);
117: virtual uint64 Write8(uint32 addr, uint32 data);
118: virtual uint64 Write16(uint32 addr, uint32 data);
119: virtual uint64 Peek8(uint32 addr);
120:
121: private:
122: uint32 ReadStatus();
123: uint32 ReadData();
124: uint32 ReadDriveStatus();
125: void WriteCmd(uint32);
126:
127: void idle_phase();
128: void exec_phase();
129: void result_phase();
130:
131: struct FDC fdc {};
132: struct FDD fdd[4] {};
133:
134: void Callback(int);
135:
136: void Interrupt();
137:
138: Event event {};
139:
140: // コマンドを名前に変換
141: static const char *cmd2name(uint32);
142:
143: // コマンド名一覧
144: static const char *cmdnames_str[];
145: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.