|
|
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; ! 17: vdisp_event.name = "CRTC2 V-DISP"; ! 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.