Subversion Repositories pentevo

Rev

Rev 883 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
716 lvd 1
#pragma once
2
 
3
const int Z80FQ = 3500000; // todo: #define as (conf.frame*conf.intfq)
4
const int FDD_RPS = 5; // rotation speed
5
 
6
const int MAX_TRACK_LEN = 6250;
800 DimkaM 7
constexpr unsigned MAX_SEC_DATA_LEN = 6144U;
716 lvd 8
const int MAX_CYLS = 86;            // don't load images with so many tracks
9
const int MAX_PHYS_CYL = 86;        // don't seek over it
10
const int MAX_SEC = 256;
11
 
12
struct WD1793
13
{
14
   enum WDSTATE
15
   {
16
      S_IDLE = 0,
17
      S_WAIT,
18
 
19
      S_DELAY_BEFORE_CMD,
20
      S_CMD_RW,
21
      S_FOUND_NEXT_ID,
22
      S_RDSEC,
23
      S_READ,
24
      S_WRSEC,
25
      S_WRITE,
26
      S_WRTRACK,
27
      S_WR_TRACK_DATA,
28
 
29
      S_TYPE1_CMD,
30
      S_STEP,
31
      S_SEEKSTART,
32
      S_RESTORE,
33
      S_SEEK,
34
      S_VERIFY,
35
      S_VERIFY2,
36
 
37
      S_WAIT_HLT,
38
      S_WAIT_HLT_RW,
39
 
784 DimkaM 40
      S_EJECT1,
41
      S_EJECT2
716 lvd 42
   };
43
 
44
   __int64 next, time;
45
   __int64 idx_tmo;
46
 
800 DimkaM 47
   struct FDD *seldrive;
716 lvd 48
   unsigned tshift;
49
 
50
   WDSTATE state, state2;
51
 
52
   unsigned char cmd;
53
   unsigned char data, track, sector;
54
   unsigned char rqs, status;
55
   u8 sign_status; // ������� ������� (���� ������ HLD)
56
 
57
   unsigned drive, side;                // update this with changing 'system'
58
 
59
   signed char stepdirection;
60
   unsigned char system;                // beta128 system register
61
 
62
   unsigned idx_cnt; // idx counter
63
 
64
   // read/write sector(s) data
65
   __int64 end_waiting_am;
66
   unsigned foundid;                    // index in trkcache.hdr for next encountered ID and bytes before this ID
67
   unsigned rwptr, rwlen;
68
 
69
   // format track data
70
   unsigned start_crc;
71
 
72
   enum CMDBITS
73
   {
74
      CMD_SEEK_RATE     = 0x03,
75
      CMD_SEEK_VERIFY   = 0x04,
76
      CMD_SEEK_HEADLOAD = 0x08,
77
      CMD_SEEK_TRKUPD   = 0x10,
78
      CMD_SEEK_DIR      = 0x20,
79
 
80
      CMD_WRITE_DEL     = 0x01,
81
      CMD_SIDE_CMP_FLAG = 0x02,
82
      CMD_DELAY         = 0x04,
83
      CMD_SIDE          = 0x08,
84
      CMD_SIDE_SHIFT    = 3,
85
      CMD_MULTIPLE      = 0x10
86
   };
87
 
88
   enum BETA_STATUS
89
   {
90
      DRQ   = 0x40,
91
      INTRQ = 0x80
92
   };
93
 
94
   enum WD_STATUS
95
   {
96
      WDS_BUSY      = 0x01,
97
      WDS_INDEX     = 0x02,
98
      WDS_DRQ       = 0x02,
99
      WDS_TRK00     = 0x04,
100
      WDS_LOST      = 0x04,
101
      WDS_CRCERR    = 0x08,
102
      WDS_NOTFOUND  = 0x10,
103
      WDS_SEEKERR   = 0x10,
104
      WDS_RECORDT   = 0x20,
105
      WDS_HEADL     = 0x20,
106
      WDS_WRFAULT   = 0x20,
107
      WDS_WRITEP    = 0x40,
108
      WDS_NOTRDY    = 0x80
109
   };
110
 
111
   enum WD_SYS
112
   {
113
      SYS_HLT       = 0x08
114
   };
115
 
116
   enum WD_SIG
117
   {
118
       SIG_HLD      = 0x01
119
   };
120
 
121
   unsigned char in(unsigned char port);
122
   void out(unsigned char port, unsigned char val);
123
   u8 RdStatus();
124
 
125
   void process();
126
   void find_marker();
127
   char notready();
128
   void load();
129
   void getindex();
130
   void trdos_traps();
131
 
132
//   TRKCACHE trkcache;
133
 
784 DimkaM 134
   bool EjectPending;
135
   void Eject(unsigned Drive);
136
 
800 DimkaM 137
   WD1793();
716 lvd 138
};