|
|
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()
1.1.1.7 ! root 23: : inherited("SIO")
1.1 root 24: {
25: devaddr = 0x51000000;
26:
27: cr.chan[0].desc = "Serial Console";
28: cr.chan[1].desc = "Keyboard";
1.1.1.7 ! root 29:
! 30: // LUNA では SIO と呼ぶほうが通りがいい。
! 31: monitor.Regist(ID_MONITOR_SIO);
1.1 root 32: }
33:
34: SIODevice::~SIODevice()
35: {
36: }
37:
38: uint64
1.1.1.6 root 39: SIODevice::Read(uint32 offset)
1.1 root 40: {
41: uint32 data;
42:
1.1.1.6 root 43: switch (offset) {
1.1 root 44: case 0:
1.1.1.3 root 45: data = ReadData(&cr.chan[0]);
1.1 root 46: break;
47: case 1:
48: data = ReadCtrl(&cr.chan[0]);
49: break;
50: case 2:
1.1.1.3 root 51: data = ReadData(&cr.chan[1]);
1.1 root 52: break;
53: case 3:
54: data = ReadCtrl(&cr.chan[1]);
55: break;
56: default:
57: __unreachable();
58: }
59: return data;
60: }
61:
62: uint64
1.1.1.6 root 63: SIODevice::Write(uint32 offset, uint32 data)
1.1 root 64: {
1.1.1.6 root 65: switch (offset) {
1.1 root 66: case 0:
67: WriteData(&cr.chan[0], data);
68: return 0;
69:
70: case 1:
71: WriteCtrl(&cr.chan[0], data);
72: return 0;
73:
74: case 2:
75: WriteData(&cr.chan[1], data);
76: return 0;
77:
78: case 3:
79: WriteCtrl(&cr.chan[1], data);
80: return 0;
81: }
82: __unreachable();
83: }
84:
85: uint64
1.1.1.6 root 86: SIODevice::Peek(uint32 offset)
1.1 root 87: {
1.1.1.6 root 88: switch (offset) {
1.1.1.3 root 89: case 0:
90: return PeekData(&cr.chan[0]);
91:
92: case 1:
93: return PeekCtrl(&cr.chan[0]);
94:
95: case 2:
96: return PeekData(&cr.chan[1]);
97:
98: case 3:
99: return PeekCtrl(&cr.chan[1]);
100: }
101: __unreachable();
1.1 root 102: }
103:
104: // 割り込みを上げる
105: void
106: SIODevice::Interrupt()
107: {
108: putlog(2, "Interrupt");
1.1.1.5 root 109: gInterrupt->AssertINT(this);
1.1 root 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.