|
|
1.1 root 1: //
2: // nono
1.1.1.4 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #include "sio.h"
1.1.1.5 root 8: #include "interrupt.h"
1.1 root 9:
10: // IODevice
11: // |
12: // v
13: // upd7201Device (uPD7201 と Z8530 の共通部分)
14: // |
15: // +---------+----------+
16: // v v
17: // SIODevice SCCDevice
18: // (LUNA, uPD7201) (X68030, Z8530)
19:
1.1.1.3 root 20: std::unique_ptr<SIODevice> gSIO;
1.1 root 21:
22: SIODevice::SIODevice()
23: {
24: logname = "sio";
25: devname = "SIO";
26: devaddr = 0x51000000;
27:
28: cr.chan[0].desc = "Serial Console";
29: cr.chan[1].desc = "Keyboard";
30: }
31:
32: SIODevice::~SIODevice()
33: {
34: }
35:
36: uint64
1.1.1.6 ! root 37: SIODevice::Read(uint32 offset)
1.1 root 38: {
39: uint32 data;
40:
1.1.1.6 ! root 41: switch (offset) {
1.1 root 42: case 0:
1.1.1.3 root 43: data = ReadData(&cr.chan[0]);
1.1 root 44: break;
45: case 1:
46: data = ReadCtrl(&cr.chan[0]);
47: break;
48: case 2:
1.1.1.3 root 49: data = ReadData(&cr.chan[1]);
1.1 root 50: break;
51: case 3:
52: data = ReadCtrl(&cr.chan[1]);
53: break;
54: default:
55: __unreachable();
56: }
57: return data;
58: }
59:
60: uint64
1.1.1.6 ! root 61: SIODevice::Write(uint32 offset, uint32 data)
1.1 root 62: {
1.1.1.6 ! root 63: switch (offset) {
1.1 root 64: case 0:
65: WriteData(&cr.chan[0], data);
66: return 0;
67:
68: case 1:
69: WriteCtrl(&cr.chan[0], data);
70: return 0;
71:
72: case 2:
73: WriteData(&cr.chan[1], data);
74: return 0;
75:
76: case 3:
77: WriteCtrl(&cr.chan[1], data);
78: return 0;
79: }
80: __unreachable();
81: }
82:
83: uint64
1.1.1.6 ! root 84: SIODevice::Peek(uint32 offset)
1.1 root 85: {
1.1.1.6 ! root 86: switch (offset) {
1.1.1.3 root 87: case 0:
88: return PeekData(&cr.chan[0]);
89:
90: case 1:
91: return PeekCtrl(&cr.chan[0]);
92:
93: case 2:
94: return PeekData(&cr.chan[1]);
95:
96: case 3:
97: return PeekCtrl(&cr.chan[1]);
98: }
99: __unreachable();
1.1 root 100: }
101:
102: // 割り込みを上げる
103: void
104: SIODevice::Interrupt()
105: {
106: putlog(2, "Interrupt");
1.1.1.5 root 107: gInterrupt->AssertINT(this);
1.1 root 108: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.