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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
// license:LGPL-2.1+
// copyright-holders:Michael Zapf
/****************************************************************************
SNUG BwG Disk Controller
Based on WD1770
Double Density, Double-sided
Michael Zapf, September 2010
February 2012: Rewritten as class
*****************************************************************************/
#ifndef MAME_BUS_TI99_PED_BWG_H
#define MAME_BUS_TI99_PED_BWG_H
#pragma once
#include "peribox.h"
#include "imagedev/floppy.h"
#include "machine/mm58274c.h"
#include "machine/wd_fdc.h"
#include "machine/ram.h"
#include "machine/74259.h"
#include "machine/74123.h"
namespace bus::ti99::peb {
class snug_bwg_device : public device_t, public device_ti99_peribox_card_interface
{
public:
snug_bwg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
void readz(offs_t offset, uint8_t *value) override;
void write(offs_t offset, uint8_t data) override;
void setaddress_dbin(offs_t offset, int state) override;
void crureadz(offs_t offset, uint8_t *value) override;
void cruwrite(offs_t offset, uint8_t data) override;
protected:
virtual void device_start() override;
virtual void device_reset() override;
virtual const tiny_rom_entry *device_rom_region() const override;
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
private:
static void floppy_formats(format_registration &fr);
void fdc_irq_w(int state);
void fdc_drq_w(int state);
// Latch callbacks
void den_w(int state);
void mop_w(int state);
void waiten_w(int state);
void hlt_w(int state);
void dsel1_w(int state);
void dsel2_w(int state);
void dsel3_w(int state);
void dsel4_w(int state);
void sidsel_w(int state);
void dden_w(int state);
void motorona_w(int state);
void select_drive(int n, int state);
// Debugger accessors
void debug_read(offs_t offset, uint8_t* value);
void debug_write(offs_t offset, uint8_t data);
// Wait state logic
void operate_ready_line();
// Set the current floppy
void set_drive();
// Holds the status of the DRQ and IRQ lines.
int m_DRQ, m_IRQ;
// DIP switch state
int m_dip1, m_dip2, m_dip34;
// Address in card area
bool m_inDsrArea;
// WD selected
bool m_WDsel, m_WDsel0;
// RTC selected
bool m_RTCsel;
// last 1K area selected
bool m_lastK;
// Data register +1 selected
bool m_dataregLB;
// Signal motor_on. When true, makes all drives turning.
int m_MOTOR_ON;
// Recent address
int m_address;
// DSR ROM
uint8_t* m_dsrrom;
// Buffer RAM
required_device<ram_device> m_buffer_ram;
// Link to the attached floppy drives
required_device_array<floppy_connector, 4> m_floppy;
// Currently selected floppy drive (1-4, 0=none)
int m_sel_floppy;
// Link to the WD1773 controller on the board.
required_device<wd1773_device> m_wd1773;
// Link to the real-time clock on the board.
required_device<mm58274c_device> m_clock;
// Latched CRU outputs
required_device<hc259_device> m_crulatch0_7;
required_device<hc259_device> m_crulatch8_15;
// Motor monoflop
required_device<ttl74123_device> m_motormf;
};
} // end namespace bus::ti99::peb
DECLARE_DEVICE_TYPE_NS(TI99_BWG, bus::ti99::peb, snug_bwg_device)
#endif // MAME_BUS_TI99_PED_BWG_H
|