|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: #include "videoctlr.h"
8:
9: // e82000..e823ff パレット
10: // e82400..e824ff R0(e82400.w) のミラー
11: // e82500..e825ff R1(e82500.w) のミラー
12: // e82600..e826ff R2(e82600.w) のミラー
13: // e82700..e82fff $00 が読めるようだ
14: // 以上の 4KB をミラー。
15:
16: std::unique_ptr<VideoCtlrDevice> gVideoCtlr;
17:
18: VideoCtlrDevice::VideoCtlrDevice()
19: {
20: logname = "videoctlr";
21: devname = "VideoCtlr";
22: devaddr = baseaddr;
23: devlen = 0x2000;
24: }
25:
26: VideoCtlrDevice::~VideoCtlrDevice()
27: {
28: }
29:
30: // addr は何ワード目のポートかという意味になるので
31: // $E82002 が addr=1 (番目のワード)。
32: uint64
33: VideoCtlrDevice::Read(uint32 addr)
34: {
35: uint32 data;
36:
37: if (addr < 0x400 / 2) { // パレット
38: data = palette.w[addr];
39:
40: } else if (addr < 0x500 / 2) { // $E82400 (R0)
41: data = videoctlr.r0;
42:
43: } else if (addr < 0x600 / 2) { // $E82500 (R1)
44: data = videoctlr.r1;
45:
46: } else if (addr < 0x700 / 2) { // $E82600 (R2)
47: data = videoctlr.r2;
48:
49: } else { // それ以降は $00 が読めるようだ
50: data = 0;
51: }
52:
53: return data;
54: }
55:
56: uint64
57: VideoCtlrDevice::Write(uint32 addr, uint32 data)
58: {
59: if (addr < 0x400 / 2) { // パレット
60: putlog(3, "パレット $%06x.W <- $%04x", baseaddr + addr * 2, data);
61: palette.w[addr] = data;
62:
63: } else if (addr < 0x500 / 2) { // $E82400 (R0)
64: SetR0(data);
65:
66: } else if (addr < 0x600 / 2) { // $E82500 (R1)
67: SetR1(data);
68:
69: } else if (addr < 0x700 / 2) { // $E82600 (R2)
70: SetR2(data);
71:
72: } else { // それ以降はたぶん何も起きない?
73: }
74:
75: return 0;
76: }
77:
78: uint64
79: VideoCtlrDevice::Peek(uint32 addr)
80: {
81: uint32 data;
82:
83: if (addr < 0x400 / 2) { // パレット
84: data = palette.w[addr];
85:
86: } else if (addr < 0x500 / 2) { // $E82400 (R0)
87: data = videoctlr.r0;
88:
89: } else if (addr < 0x600 / 2) { // $E82500 (R1)
90: data = videoctlr.r1;
91:
92: } else if (addr < 0x700 / 2) { // $E82600 (R2)
93: data = videoctlr.r2;
94:
95: } else { // それ以降は $00 が読めるようだ
96: data = 0;
97: }
98:
99: return data;
100: }
101:
102: // R0 への書き込み
103: void
104: VideoCtlrDevice::SetR0(uint32 data)
105: {
106: putlog(0, "R0 <- $%04x 未実装書き込み", data);
107: videoctlr.r0 = data & 3;
108: }
109:
110: // R1 への書き込み
111: void
112: VideoCtlrDevice::SetR1(uint32 data)
113: {
114: putlog(0, "R1 <- $%04x 未実装書き込み", data);
115: videoctlr.r1 = data & 0x3fff;
116: }
117:
118: // R2 への書き込み
119: void
120: VideoCtlrDevice::SetR2(uint32 data)
121: {
122: putlog(0, "R2 <- $%04x 未実装書き込み", data);
123: videoctlr.r2 = (data & 0xff7f);
124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.