|
|
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: // 本体リセットスイッチによるリセット
37: void
38: SIODevice::ResetHard()
39: {
40: // チップリセット
41: Reset();
42: }
43:
44: uint64
1.1.1.3 root 45: SIODevice::Read(uint32 addr)
1.1 root 46: {
47: uint32 data;
48:
1.1.1.3 root 49: switch (addr) {
1.1 root 50: case 0:
1.1.1.3 root 51: data = ReadData(&cr.chan[0]);
1.1 root 52: break;
53: case 1:
54: data = ReadCtrl(&cr.chan[0]);
55: break;
56: case 2:
1.1.1.3 root 57: data = ReadData(&cr.chan[1]);
1.1 root 58: break;
59: case 3:
60: data = ReadCtrl(&cr.chan[1]);
61: break;
62: default:
63: __unreachable();
64: }
65: return data;
66: }
67:
68: uint64
1.1.1.3 root 69: SIODevice::Write(uint32 addr, uint32 data)
1.1 root 70: {
1.1.1.3 root 71: switch (addr) {
1.1 root 72: case 0:
73: WriteData(&cr.chan[0], data);
74: return 0;
75:
76: case 1:
77: WriteCtrl(&cr.chan[0], data);
78: return 0;
79:
80: case 2:
81: WriteData(&cr.chan[1], data);
82: return 0;
83:
84: case 3:
85: WriteCtrl(&cr.chan[1], data);
86: return 0;
87: }
88: __unreachable();
89: }
90:
91: uint64
1.1.1.3 root 92: SIODevice::Peek(uint32 addr)
1.1 root 93: {
1.1.1.3 root 94: switch (addr) {
95: case 0:
96: return PeekData(&cr.chan[0]);
97:
98: case 1:
99: return PeekCtrl(&cr.chan[0]);
100:
101: case 2:
102: return PeekData(&cr.chan[1]);
103:
104: case 3:
105: return PeekCtrl(&cr.chan[1]);
106: }
107: __unreachable();
1.1 root 108: }
109:
110: // 割り込みを上げる
111: void
112: SIODevice::Interrupt()
113: {
114: putlog(2, "Interrupt");
1.1.1.5 ! root 115: gInterrupt->AssertINT(this);
1.1 root 116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.