openMSX
Main Page
Namespaces
Classes
Files
File List
File Members
MSXPrinterPort.cc
Go to the documentation of this file.
1
#include "
MSXPrinterPort.hh
"
2
#include "
DummyPrinterPortDevice.hh
"
3
#include "
checked_cast.hh
"
4
#include "
serialize.hh
"
5
#include "
memory.hh
"
6
#include "
unreachable.hh
"
7
8
using
std::string;
9
10
namespace
openmsx {
11
12
MSXPrinterPort::MSXPrinterPort
(
const
DeviceConfig
& config)
13
:
MSXDevice
(config)
14
,
Connector
(
MSXDevice
::getPluggingController(),
"printerport"
,
15
make_unique
<
DummyPrinterPortDevice
>())
16
{
17
data = 255;
// != 0;
18
strobe =
false
;
// != true;
19
reset
(
getCurrentTime
());
20
}
21
22
MSXPrinterPort::~MSXPrinterPort
()
23
{
24
}
25
26
void
MSXPrinterPort::reset
(
EmuTime::param
time)
27
{
28
writeData(0, time);
// TODO check this
29
setStrobe(
true
, time);
// TODO check this
30
}
31
32
byte
MSXPrinterPort::readIO
(
word
port,
EmuTime::param
time)
33
{
34
return
peekIO
(port, time);
35
}
36
37
byte
MSXPrinterPort::peekIO
(
word
/*port*/
,
EmuTime::param
time)
const
38
{
39
// bit 1 = status / other bits always 1
40
return
getPluggedPrintDev
().
getStatus
(time)
41
? 0xFF : 0xFD;
42
}
43
44
void
MSXPrinterPort::writeIO
(
word
port,
byte
value,
EmuTime::param
time)
45
{
46
switch
(port & 0x01) {
47
case
0:
48
setStrobe(value & 1, time);
// bit 0 = strobe
49
break
;
50
case
1:
51
writeData(value, time);
52
break
;
53
default
:
54
UNREACHABLE
;
55
}
56
}
57
58
void
MSXPrinterPort::setStrobe(
bool
newStrobe,
EmuTime::param
time)
59
{
60
if
(newStrobe != strobe) {
61
strobe = newStrobe;
62
getPluggedPrintDev
().
setStrobe
(strobe, time);
63
}
64
}
65
void
MSXPrinterPort::writeData(
byte
newData,
EmuTime::param
time)
66
{
67
if
(newData != data) {
68
data = newData;
69
getPluggedPrintDev
().
writeData
(data, time);
70
}
71
}
72
73
const
string
MSXPrinterPort::getDescription
()
const
74
{
75
return
"MSX Printer port"
;
76
}
77
78
string_ref
MSXPrinterPort::getClass
()
const
79
{
80
return
"Printer Port"
;
81
}
82
83
void
MSXPrinterPort::plug
(
Pluggable
& dev,
EmuTime::param
time)
84
{
85
Connector::plug
(dev, time);
86
getPluggedPrintDev
().
writeData
(data, time);
87
getPluggedPrintDev
().
setStrobe
(strobe, time);
88
}
89
90
PrinterPortDevice
&
MSXPrinterPort::getPluggedPrintDev
()
const
91
{
92
return
*checked_cast<
PrinterPortDevice
*>(&
getPlugged
());
93
}
94
95
template
<
typename
Archive>
96
void
MSXPrinterPort::serialize
(Archive& ar,
unsigned
/*version*/
)
97
{
98
ar.template serializeBase<MSXDevice>(*this);
99
ar.template serializeBase<Connector>(*this);
100
ar.serialize(
"strobe"
, strobe);
101
ar.serialize(
"data"
, data);
102
// TODO force writing data to port??
103
}
104
INSTANTIATE_SERIALIZE_METHODS
(
MSXPrinterPort
);
105
REGISTER_MSXDEVICE
(
MSXPrinterPort
,
"PrinterPort"
);
106
107
}
// namespace openmsx
Generated on Mon May 20 2013 12:16:59 for openMSX by
1.8.1.2