|
|
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:
1.1.1.8 root 7: //
8: // CRTC-II (HD6445)
9: //
10:
1.1 root 11: #include "crtc2.h"
12: #include "renderer.h"
1.1.1.8 root 13: #include "scheduler.h"
1.1 root 14:
1.1.1.8 root 15: // コンストラクタ
1.1 root 16: CRTC2Device::CRTC2Device()
1.1.1.10! root 17: : inherited(OBJ_CRTC2)
1.1 root 18: {
1.1.1.8 root 19: vdisp_event.func = ToEventCallback(&CRTC2Device::VDispCallback);
20: vdisp_event.Regist("CRTC2 V-DISP");
1.1 root 21: }
22:
1.1.1.8 root 23: // デストラクタ
1.1 root 24: CRTC2Device::~CRTC2Device()
25: {
1.1.1.10! root 26: }
! 27:
! 28: // 初期化
! 29: bool
! 30: CRTC2Device::Init()
! 31: {
! 32: if (inherited::Init() == false) {
! 33: return false;
! 34: }
! 35:
! 36: renderer = GetRenderer();
! 37:
! 38: return true;
1.1 root 39: }
40:
1.1.1.8 root 41: // リセット
1.1 root 42: void
1.1.1.8 root 43: CRTC2Device::ResetHard(bool poweron)
1.1 root 44: {
45: // リセット信号で初期化されるレジスタ (他は維持)
46: reg[30] = 0;
47: reg[31] = 0;
48: reg[32] = 0;
49:
50: // 未確認
51: ar = 0;
52:
53: // XXX 適当
54: // すぐに垂直帰線期間を開始する
55: vdisp_event.time = 0;
56: vdisp_event.code = 1;
1.1.1.10! root 57: scheduler->RestartEvent(vdisp_event);
1.1 root 58: }
59:
60: uint64
1.1.1.6 root 61: CRTC2Device::Read(uint32 offset)
1.1 root 62: {
63: uint32 data;
64:
1.1.1.6 root 65: switch (offset) {
1.1 root 66: case 0: // アドレスレジスタ
67: // アドレスレジスタは書き込み専用
68: // XXX 何が読めるか
69: data = 0xff;
1.1.1.9 root 70: putlog(1, "Read write-only register AR");
1.1 root 71: break;
72:
73: case 1: // データレジスタ
74: switch (ar) {
75: case 12 ... 25: // 読み出し可能
76: case 28 ... 31:
77: case 33:
78: case 36 ... 39:
79: data = reg[ar];
80: putlog(2, "R%02d -> $%02x", ar, data);
81: break;
82:
83: case 40 ... 63: // 範囲外
84: // 未使用レジスタの読み出しは $00 (p.17)
85: data = 0;
1.1.1.9 root 86: putlog(1, "Read unused register R%02d", ar);
1.1 root 87: break;
88:
89: default: // 書き込み専用レジスタ
90: // 読み出しは 0 になる (p.112)
91: data = 0;
1.1.1.9 root 92: putlog(1, "Read write-only register R%02d", ar);
1.1 root 93: break;
94: }
95: break;
96:
97: default:
1.1.1.10! root 98: VMPANIC("corrupted offset=%d", offset);
1.1 root 99: }
100: return data;
101: }
102:
103: uint64
1.1.1.6 root 104: CRTC2Device::Write(uint32 offset, uint32 data)
1.1 root 105: {
1.1.1.6 root 106: switch (offset) {
1.1 root 107: case 0: // アドレスレジスタ
108: ar = data & 0x3f;
1.1.1.9 root 109: putlog(3, "Address Register <- $%02x", ar);
1.1 root 110: return 0;
111:
112: case 1: // データレジスタ
113: switch (ar) {
114: case 16 ... 17: // 読み出し専用レジスタ
115: case 28:
1.1.1.9 root 116: putlog(1, "Write read-only register R%02d <- $%02x", ar, data);
1.1 root 117: break;
118:
119: case 40 ... 63: // 範囲外
1.1.1.9 root 120: putlog(1, "Write unused register R%02d <- $%02x", ar, data);
1.1 root 121: break;
122:
123: default: // 書き込み可能レジスタ
124: reg[ar] = data;
125: putlog(2, "R%02d <- $%02x", ar, data);
126: break;
127: }
128: return 0;
129:
130: default:
1.1.1.10! root 131: VMPANIC("corrupted offset=%d", offset);
1.1 root 132: }
133: }
134:
135: uint64
1.1.1.6 root 136: CRTC2Device::Peek(uint32 offset)
1.1 root 137: {
1.1.1.6 root 138: switch (offset) {
1.1 root 139: case 0: // アドレスレジスタ
140: return ar;
141:
142: case 1: // データレジスタ
143: return reg[ar];
144:
145: default:
1.1.1.10! root 146: return 0xff;
1.1 root 147: }
148: }
149:
150: // 垂直表示・帰線イベント
1.1.1.5 root 151: // ev.code が 1 なら表示期間開始(V-disp)、0 なら帰線期間開始(V-blank)。
1.1 root 152: void
1.1.1.5 root 153: CRTC2Device::VDispCallback(Event& ev)
1.1 root 154: {
1.1.1.5 root 155: int& vdisp = ev.code;
156:
1.1 root 157: // 今はここで1画面まるごと作成
1.1.1.5 root 158: if (vdisp) {
1.1 root 159: // Render に作画指示
1.1.1.10! root 160: renderer->Render();
1.1 root 161: }
162:
163: // 次のタイミングを計算
164: // XXX まだ CRTC から計算していない
1.1.1.5 root 165: if (vdisp) {
1.1 root 166: // 垂直表示期間
1.1.1.5 root 167: ev.time = 16234.496_usec; // 1024*Ht
168: ev.code = 0;
1.1 root 169: } else {
170: // 垂直帰線期間
1.1.1.5 root 171: ev.time = 507.328_usec; // 32*Ht
172: ev.code = 1;
1.1 root 173: }
1.1.1.10! root 174: scheduler->StartEvent(ev);
1.1 root 175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.