blob: 278bc3fa06bb918d98e9ee6d4c175df5d67c4198 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
// license:BSD-3-Clause
// copyright-holders:Patrick Mackinlay
#ifndef MAME_MACHINE_UPD7261_H
#define MAME_MACHINE_UPD7261_H
#pragma once
#include "imagedev/harddriv.h"
class upd7261_device
: public device_t
{
public:
upd7261_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
// output lines
auto out_dreq() { return m_dreq.bind(); }
auto out_int() { return m_int.bind(); }
// input lines
void tc_w(int state);
void head_w(u8 data) { m_head = data; }
void map(address_map &map) ATTR_COLD;
protected:
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
void set_dreq(int state);
void set_int(bool state);
u8 data_r();
u8 status_r();
void data_w(u8 data);
void command_w(u8 data);
void state_timer(s32 param);
attotime state_step(s32 param);
private:
optional_device_array<harddisk_image_device, 8> m_drive;
devcb_write_line m_dreq;
devcb_write_line m_int;
emu_timer *m_state_timer;
u32 m_state;
u8 m_head; // head number (extended)
u8 m_status; // status register
u8 m_est; // error status byte
u8 m_ist; // interrupt status byte
u8 m_ua; // unit address
u16 m_pcn[4]; // physical cylinder number
struct specify
{
// data transfer length
u16 dtl() const;
// step time in ticks
unsigned stp(unsigned cylinders) const;
u8 mode; // operation mode
u8 dtlh; // data transfer length (high byte)
u8 dtll; // data transfer length (low byte)
u8 etn; // ending track number
u8 esn; // ending sector number
u8 gpl2; // gap length 2
u8 rwch; // reduced write current cylinder (high byte)
u8 rwcl; // reduced write current cylinder (low byte)
}
m_specify;
struct transfer
{
// logical cylinder number
u16 lcn() const;
u8 phn; // physical head number
u8 lcnh; // logical cylinder number (high byte)
u8 lcnl; // logical cylinder number (low byte)
u8 lhn; // logical head number
u8 lsn; // logical sector number
u8 scnt; // sector count
}
m_transfer;
// data buffer
u32 m_buf_index;
u32 m_buf_count;
std::unique_ptr<u8[]> m_buf;
// i/o line state
bool m_dreq_state;
bool m_int_state;
bool m_tc_state;
};
DECLARE_DEVICE_TYPE(UPD7261, upd7261_device)
#endif // MAME_MACHINE_UPD7261_H
|