|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2018 [email protected]
4: //
5:
6: #include "sio.h"
7: #include "mpu.h"
8:
9: // IODevice
10: // |
11: // v
12: // upd7201Device (uPD7201 と Z8530 の共通部分)
13: // |
14: // +---------+----------+
15: // v v
16: // SIODevice SCCDevice
17: // (LUNA, uPD7201) (X68030, Z8530)
18:
19: SIODevice *gSIO;
20:
21: SIODevice::SIODevice()
22: {
23: logname = "sio";
24: devname = "SIO";
25: devaddr = 0x51000000;
26:
27: cr.chan[0].desc = "Serial Console";
28: cr.chan[1].desc = "Keyboard";
29: }
30:
31: SIODevice::~SIODevice()
32: {
33: }
34:
35: // 本体リセットスイッチによるリセット
36: void
37: SIODevice::ResetHard()
38: {
39: // チップリセット
40: Reset();
41: }
42:
43: uint64
44: SIODevice::Read8(uint32 addr)
45: {
46: uint32 data;
47:
48: // アドレスは8バイト単位でミラーのようだ。
49: uint32 an = addr & 7;
50:
51: // 奇数バイトは偶数バイトのミラーが見えるようだ。
52: switch (an / 2) {
53: case 0:
54: data = ReadData(0);
55: break;
56: case 1:
57: data = ReadCtrl(&cr.chan[0]);
58: break;
59: case 2:
60: data = ReadData(1);
61: break;
62: case 3:
63: data = ReadCtrl(&cr.chan[1]);
64: break;
65: default:
66: __unreachable();
67: }
68: return data;
69: }
70:
71: uint64
72: SIODevice::Read16(uint32 addr)
73: {
74: uint32 data = Read8(addr);
75:
76: // 奇数バイトは偶数バイトのミラーが見えるようだ。
77: return (data << 8) | data;
78: }
79:
80: uint64
81: SIODevice::Write8(uint32 addr, uint32 data)
82: {
83: // アドレスは8バイト単位でミラーのようだ。
84: uint32 an = addr & 7;
85:
86: // 奇数バイトは偶数バイトのミラーが見えるようだ。
87: // XXX 書き込み側は確認してないけど
88: switch (an / 2) {
89: case 0:
90: WriteData(&cr.chan[0], data);
91: return 0;
92:
93: case 1:
94: WriteCtrl(&cr.chan[0], data);
95: return 0;
96:
97: case 2:
98: WriteData(&cr.chan[1], data);
99: return 0;
100:
101: case 3:
102: WriteCtrl(&cr.chan[1], data);
103: return 0;
104: }
105: __unreachable();
106: }
107:
108: uint64
109: SIODevice::Write16(uint32 addr, uint32 data)
110: {
111: // バイト書き込み1回だけになるはず?
112: return Write8(addr, data);
113: }
114:
115: // 割り込みを上げる
116: void
117: SIODevice::Interrupt()
118: {
119: putlog(2, "Interrupt");
120: gMPU->Interrupt(6);
121: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.