|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2018 [email protected]
4: //
5:
6: #include "crtc2.h"
7: #include "renderer.h"
8:
9: CRTC2Device::CRTC2Device()
10: {
11: logname = "crtc2";
12: devname = "CRTC2";
13: devaddr = 0xd1000000;
14:
15: vdisp_event.dev = this;
16: vdisp_event.func = (DeviceCallback_t)&CRTC2Device::VDispCallback;
1.1.1.2 ! root 17: vdisp_event.SetName("CRTC2 V-DISP");
1.1 root 18: }
19:
20: CRTC2Device::~CRTC2Device()
21: {
22: }
23:
24: void
25: CRTC2Device::ResetHard()
26: {
27: // リセット信号で初期化されるレジスタ (他は維持)
28: reg[30] = 0;
29: reg[31] = 0;
30: reg[32] = 0;
31:
32: // 未確認
33: ar = 0;
34:
35: // XXX 適当
36: // すぐに垂直帰線期間を開始する
37: vdisp_event.time = 0;
38: vdisp_event.code = 1;
39: gScheduler->AddEvent(&vdisp_event);
40: }
41:
42: uint64
43: CRTC2Device::Read8(uint32 addr)
44: {
45: uint32 an = addr - devaddr;
46: uint32 data;
47:
48: switch (an) {
49: case 0: // アドレスレジスタ
50: // アドレスレジスタは書き込み専用
51: // XXX 何が読めるか
52: data = 0xff;
53: putlog(1, "書き込み専用レジスタ AR の読み出し");
54: break;
55:
56: case 1: // データレジスタ
57: switch (ar) {
58: case 12 ... 25: // 読み出し可能
59: case 28 ... 31:
60: case 33:
61: case 36 ... 39:
62: data = reg[ar];
63: putlog(2, "R%02d -> $%02x", ar, data);
64: break;
65:
66: case 40 ... 63: // 範囲外
67: // 未使用レジスタの読み出しは $00 (p.17)
68: data = 0;
69: putlog(1, "未使用レジスタ読み込み R%02d", ar);
70: break;
71:
72: default: // 書き込み専用レジスタ
73: // 読み出しは 0 になる (p.112)
74: data = 0;
75: putlog(1, "書き込み専用レジスタ R%02d の読み出し", ar);
76: break;
77: }
78: break;
79:
80: default:
81: data = 0xff;
82: putlog(0, "未実装バイト読み込み $%08x", addr);
83: break;
84: }
85: return data;
86: }
87:
88: uint64
89: CRTC2Device::Read16(uint32 addr)
90: {
91: putlog(0, "未実装ワード読み込み $%08x", addr);
92: return 0xffff;
93: }
94:
95: uint64
96: CRTC2Device::Read32(uint32 addr)
97: {
98: putlog(0, "未実装ロング読み込み $%08x", addr);
99: return 0xffffffff;
100: }
101:
102: uint64
103: CRTC2Device::Write8(uint32 addr, uint32 data)
104: {
105: uint32 an = addr - devaddr;
106: switch (an) {
107: case 0: // アドレスレジスタ
108: ar = data & 0x3f;
109: putlog(3, "アドレスレジスタ <- $%02x", ar);
110: return 0;
111:
112: case 1: // データレジスタ
113: switch (ar) {
114: case 16 ... 17: // 読み出し専用レジスタ
115: case 28:
116: putlog(1, "読み出し専用レジスタへの書き込み R%02d <- $%02x",
117: ar, data);
118: break;
119:
120: case 40 ... 63: // 範囲外
121: putlog(1, "未使用レジスタ書き込み R%02d <- $%02x", ar, data);
122: break;
123:
124: default: // 書き込み可能レジスタ
125: reg[ar] = data;
126: putlog(2, "R%02d <- $%02x", ar, data);
127: break;
128: }
129: return 0;
130:
131: default:
132: putlog(3, "未実装バイト書き込み $%08x <- %02x", addr, data);
133: return 0;
134: }
135: }
136:
137: uint64
138: CRTC2Device::Write16(uint32 addr, uint32 data)
139: {
140: putlog(0, "未実装ワード書き込み $%08x <- %04x", addr, data);
141: return 0;
142: }
143:
144: uint64
145: CRTC2Device::Write32(uint32 addr, uint32 data)
146: {
147: putlog(0, "未実装ロング書き込み $%08x <- %08x", addr, data);
148: return 0;
149: }
150:
151: uint64
152: CRTC2Device::Peek8(uint32 addr)
153: {
154: uint32 an = addr - devaddr;
155: switch (an) {
156: case 0: // アドレスレジスタ
157: return ar;
158:
159: case 1: // データレジスタ
160: return reg[ar];
161:
162: default:
163: return 0xff;
164: }
165: }
166:
167: // 垂直表示・帰線イベント
168: // arg == 1 なら表示期間開始、arg == 0 なら帰線期間開始。
169: void
170: CRTC2Device::VDispCallback(int arg)
171: {
172: // 今はここで1画面まるごと作成
173: if (arg) {
174: // Render に作画指示
175: gRenderer->Render();
176: }
177:
178: // 次のタイミングを計算
179: // XXX まだ CRTC から計算していない
180: if (arg) {
181: // 垂直表示期間
182: vdisp_event.time = 16234.496_usec; // 1024*Ht
183: } else {
184: // 垂直帰線期間
185: vdisp_event.time = 507.328_usec; // 32*Ht
186: }
187: vdisp_event.code = 1 - arg;
188: gScheduler->AddEvent(&vdisp_event);
189: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.