MIXAL
io.h
Go to the documentation of this file.
1 #ifndef INCLUDE_IO_H_
2 #define INCLUDE_IO_H_
3 
4 #include <cstdint>
5 #include <vector>
6 #include <string>
7 #include "memory.h"
8 
14 namespace mixal {
15 
17 enum class IODeviceType {
18  TAPE, // 100 words
19  DISK, // 100 words
20  CARD_READER, // 16 words
21  CARD_PUNCH, // 16 words
22  LINE_PRINTER, // 24 words
23  TYPEWRITER, // 14 words
24  PAPER_TAPE, // 14 words
25 };
26 
28 enum class IODeviceStatus {
29  READY,
30  BUSY_READ,
31  BUSY_WRITE,
32 };
33 
40 class IODevice {
41  public:
48  IODevice(int32_t blockSize, bool allowRead, bool allowWrite);
49  virtual ~IODevice() {}
50 
52  inline IODeviceType type() const { return _type; }
54  inline int blockSize() const { return _blockSize; }
56  inline bool allowRead() const { return _allowRead; }
58  inline bool allowWrite() const { return _allowWrite; }
59 
61  virtual bool ready(int32_t elapsed);
63  virtual void control(int32_t) {}
65  virtual void read(ComputerWord* memory, int32_t address) = 0;
67  virtual void write(const ComputerWord* memory, int32_t address) = 0;
68 
70  virtual ComputerWord& wordAt(int32_t index) = 0;
71 
72  protected:
74  int32_t _blockSize;
75  bool _allowRead;
76  bool _allowWrite;
77  int32_t _timestamp;
78  double _readyRate;
81  virtual void doRead() = 0;
83  virtual void doWrite() = 0;
84 };
85 
87 class IODeviceStorage : public IODevice {
88  public:
89  explicit IODeviceStorage(int32_t storageSize = 4096);
90  IODeviceStorage(const IODeviceStorage&) = default;
91  IODeviceStorage& operator=(const IODeviceStorage&) = default;
92 
93  bool ready(int32_t elapsed) override;
94  void read(ComputerWord* memory, int32_t address) override;
95  void write(const ComputerWord* memory, int32_t address) override;
96 
97  inline ComputerWord& wordAt(int32_t index) override { return _storage[index]; }
98  protected:
99  IODeviceStatus _status;
100  int32_t _address, _locator;
101  ComputerWord* _memory;
102  std::vector<ComputerWord> _buffer;
103  std::vector<ComputerWord> _storage;
104 
105  void doRead() override;
106  void doWrite() override;
107 };
108 
111  public:
112  explicit IODeviceTape(int32_t storageSize = 4096);
117  void control(int32_t operation) final;
118 
119  private:
120  void doRead() final;
121  void doWrite() final;
122 };
123 
129  public:
130  explicit IODeviceDisk(int32_t storageSize = 4096);
132  void control(int32_t operation) final;
133 };
134 
137  public:
138  explicit IODeviceSeqReader(int32_t storageSize = 4096);
139 
140  private:
141  void doRead() override;
142 };
143 
146  public:
147  explicit IODeviceSeqWriter(int32_t storageSize = 4096);
148 
149  private:
150  void doWrite() override;
151 };
152 
155  public:
156  explicit IODeviceCardReader(int32_t storageSize = 4096);
157 };
158 
161  public:
162  explicit IODeviceCardPunch(int32_t storageSize = 4096);
163 };
164 
167  public:
168  explicit IODeviceLinePrinter(int32_t storageSize = 4096, int32_t pageSize = 20);
170  void control(int32_t operation) final;
172  inline int32_t pageSize() const { return _pageSize; }
174  int32_t pageOffsetAt(int32_t index) const;
176  std::string line(int32_t pageNum, int32_t lineNum) const;
177  private:
178  int32_t _pageSize;
179 };
180 
183  public:
184  explicit IODeviceTypewriter(int32_t storageSize = 4096);
185 };
186 
189  public:
190  explicit IODevicePaperTape(int32_t storageSize = 4096);
192  void control(int32_t operation) final;
193 };
194 
195 }; // namespace mixal
196 
197 #endif // INCLUDE_IO_H_
mixal::IODevice::blockSize
int blockSize() const
Definition: io.h:54
mixal::IODeviceStorage::doWrite
void doWrite() override
Definition: io.cpp:63
mixal::IODevice::allowWrite
bool allowWrite() const
Definition: io.h:58
mixal::IODevice::control
virtual void control(int32_t)
Definition: io.h:63
mixal::ComputerWord
Definition: memory.h:25
mixal::IODevice::_allowWrite
bool _allowWrite
Definition: io.h:76
mixal::IODevice::_blockSize
int32_t _blockSize
Definition: io.h:74
mixal::IODeviceStorage
Definition: io.h:87
mixal::IODevice::doWrite
virtual void doWrite()=0
mixal::IODevice::_timestamp
int32_t _timestamp
Definition: io.h:77
mixal::IODevicePaperTape
Definition: io.h:188
mixal::IODevice::doRead
virtual void doRead()=0
mixal::IODeviceCardReader
Definition: io.h:154
mixal::IODeviceSeqReader
Definition: io.h:136
mixal::IODeviceDisk::control
void control(int32_t operation) final
Definition: io.cpp:99
mixal::IODevice::IODevice
IODevice(int32_t blockSize, bool allowRead, bool allowWrite)
Definition: io.cpp:10
mixal::IODeviceStorage::wordAt
ComputerWord & wordAt(int32_t index) override
Definition: io.h:97
mixal::IODeviceStorage::read
void read(ComputerWord *memory, int32_t address) override
Definition: io.cpp:38
mixal::IODeviceLinePrinter::control
void control(int32_t operation) final
Definition: io.cpp:140
mixal::IODeviceStatus
IODeviceStatus
Definition: io.h:28
mixal::IODeviceType
IODeviceType
Definition: io.h:17
mixal::IODevice::_readyRate
double _readyRate
Definition: io.h:78
mixal::IODevice::read
virtual void read(ComputerWord *memory, int32_t address)=0
mixal::IODeviceTape
Definition: io.h:110
mixal::IODevice::wordAt
virtual ComputerWord & wordAt(int32_t index)=0
mixal::IODeviceLinePrinter::pageSize
int32_t pageSize() const
Definition: io.h:172
mixal::IODevice::ready
virtual bool ready(int32_t elapsed)
Definition: io.cpp:14
mixal::IODeviceLinePrinter::pageOffsetAt
int32_t pageOffsetAt(int32_t index) const
Definition: io.cpp:144
mixal::IODevice::allowRead
bool allowRead() const
Definition: io.h:56
mixal::IODeviceCardPunch
Definition: io.h:160
mixal::IODeviceStorage::write
void write(const ComputerWord *memory, int32_t address) override
Definition: io.cpp:48
mixal::IODevicePaperTape::control
void control(int32_t operation) final
Definition: io.cpp:169
mixal::IODevice::_allowRead
bool _allowRead
Definition: io.h:75
mixal::IODeviceTypewriter
Definition: io.h:182
mixal::IODeviceStorage::ready
bool ready(int32_t elapsed) override
Definition: io.cpp:26
mixal::IODeviceLinePrinter
Definition: io.h:166
mixal::IODevice::type
IODeviceType type() const
Definition: io.h:52
mixal::IODeviceDisk
Definition: io.h:128
mixal::IODevice::_type
IODeviceType _type
Definition: io.h:73
mixal::IODevice
Definition: io.h:40
mixal::IODevice::write
virtual void write(const ComputerWord *memory, int32_t address)=0
mixal::IODeviceLinePrinter::line
std::string line(int32_t pageNum, int32_t lineNum) const
Definition: io.cpp:148
mixal::IODeviceSeqWriter
Definition: io.h:145
memory.h
The definition of a computer word.
mixal::IODeviceStorage::doRead
void doRead() override
Definition: io.cpp:56
mixal::IODeviceTape::control
void control(int32_t operation) final
Definition: io.cpp:75