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