|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2018 [email protected] ! 4: // ! 5: ! 6: #include "bt454.h" ! 7: #include "bitmap.h" ! 8: ! 9: // XXX 仕様書には $c100_0000 と書いてあるが、PROM も NetBSD カーネルも ! 10: // $c110_0000 にアクセスしているので、とりあえず $c110_0000 にしておく ! 11: // というか $10_0000 で折り返して見せることにしておく。 ! 12: // 実機調査すること。 ! 13: ! 14: // 下位ニブルのパターンは不明。とりあえず ! 15: #define LOW_NIBBLE (0x0f) ! 16: ! 17: BT454Device *gBT454; ! 18: ! 19: BT454Device::BT454Device() ! 20: { ! 21: logname = "bt454"; ! 22: devname = "BT454"; ! 23: devaddr = 0xc1000000; ! 24: } ! 25: ! 26: BT454Device::~BT454Device() ! 27: { ! 28: } ! 29: ! 30: bool ! 31: BT454Device::Init() ! 32: { ! 33: nplane = gBitmap->GetPlaneCount(); ! 34: return true; ! 35: } ! 36: ! 37: void ! 38: BT454Device::ResetHard() ! 39: { ! 40: reg.addr = 0; ! 41: } ! 42: ! 43: /* static */ const char ! 44: BT454Device::rgbstr[3] = { 'R', 'G', 'B' }; ! 45: ! 46: uint64 ! 47: BT454Device::Read8(uint32 addr) ! 48: { ! 49: uint32 an = (addr - devaddr) & 0x000fffff; ! 50: uint32 data; ! 51: ! 52: switch (an) { ! 53: case 0: // アドレスレジスタ ! 54: // 今の(今からアクセスする)パレット番号 ! 55: data = reg.addr / 3; ! 56: data = (data << 4) | LOW_NIBBLE; ! 57: putlog(2, "アドレスレジスタ -> $%02x", data); ! 58: break; ! 59: ! 60: case 1: // カラーマップレジスタ ! 61: // reg.color[] は上位4ビットが有効なのでそのまま読み出せる。 ! 62: data = reg.color[reg.addr]; ! 63: data |= LOW_NIBBLE; ! 64: putlog(2, "カラーマップ $%x(%c) -> $%02x", ! 65: reg.addr / 3, rgbstr[reg.addr % 3], data); ! 66: // アクセスするたびにインクリメントする。 ! 67: reg.addr++; ! 68: if (reg.addr >= countof(reg.color)) { ! 69: reg.addr = 0; ! 70: } ! 71: break; ! 72: ! 73: default: ! 74: putlog(0, "未実装バイト読み込み $%08x", addr); ! 75: data = 0xff; ! 76: break; ! 77: } ! 78: ! 79: return data; ! 80: } ! 81: ! 82: uint64 ! 83: BT454Device::Read16(uint32 addr) ! 84: { ! 85: putlog(0, "未実装ワード読み込み $%08x", addr); ! 86: return 0xffff; ! 87: } ! 88: ! 89: uint64 ! 90: BT454Device::Read32(uint32 addr) ! 91: { ! 92: putlog(0, "未実装ロング読み込み $%08x", addr); ! 93: return 0xffffffff; ! 94: } ! 95: ! 96: uint64 ! 97: BT454Device::Write8(uint32 addr, uint32 data) ! 98: { ! 99: uint32 an = (addr - devaddr) & 0x000fffff; ! 100: ! 101: // 書き込みデータのうち有効なのは上位ニブルだけ ! 102: ! 103: switch (an) { ! 104: case 0: // アドレスレジスタ ! 105: // 今からアクセスするパレット番号 ! 106: // data はパレット番号だが reg.addr は配列のインデックスなので 3倍。 ! 107: putlog(2, "アドレスレジスタ <- $%02x", data); ! 108: reg.addr = (data >> 4) * 3; ! 109: break; ! 110: ! 111: case 1: // カラーマップレジスタ ! 112: // reg.color[] は上位4ビットが有効なのでそのまま書き込む。 ! 113: // 下位4ビットはどうするか。 ! 114: reg.color[reg.addr] = (data & 0xf0); ! 115: if (loglevel == 1) { ! 116: // ログレベル1なら RGB が書き込まれた時点で表示。 ! 117: // 大体はこれくらいの表示で構わないはず。 ! 118: if (reg.addr % 3 == 2) { ! 119: putlog("カラーマップ $%x = (%x,%x,%x)", ! 120: reg.addr / 3, ! 121: reg.color[reg.addr - 2] >> 4, ! 122: reg.color[reg.addr - 1] >> 4, ! 123: reg.color[reg.addr ] >> 4); ! 124: } ! 125: } else if (loglevel >= 2) { ! 126: putlog("カラーマップ $%x(%c) <- $%02x", ! 127: reg.addr / 3, rgbstr[reg.addr % 3], data); ! 128: } ! 129: // ホストカラーを計算。 ! 130: MakeHostColor(reg.addr); ! 131: ! 132: // ホストカラー計算後にインクリメントする。 ! 133: reg.addr++; ! 134: if (reg.addr >= countof(reg.color)) { ! 135: reg.addr = 0; ! 136: } ! 137: break; ! 138: ! 139: default: ! 140: putlog(0, "未実装バイト書き込み $%08x <- %02x", addr, data); ! 141: break; ! 142: } ! 143: return 0; ! 144: } ! 145: ! 146: uint64 ! 147: BT454Device::Write16(uint32 addr, uint32 data) ! 148: { ! 149: putlog(0, "未実装ワード書き込み $%08x <- %04x", addr, data); ! 150: return 0; ! 151: } ! 152: ! 153: uint64 ! 154: BT454Device::Write32(uint32 addr, uint32 data) ! 155: { ! 156: putlog(0, "未実装ロング書き込み $%08x <- %08x", addr, data); ! 157: return 0; ! 158: } ! 159: ! 160: uint64 ! 161: BT454Device::Peek8(uint32 addr) ! 162: { ! 163: uint32 an = (addr - devaddr) & 0x000fffff; ! 164: ! 165: switch (an) { ! 166: case 0: // アドレスレジスタ ! 167: // XXX 下位ニブルは? ! 168: return ((reg.addr / 3) << 4) | LOW_NIBBLE; ! 169: ! 170: case 1: // カラーマップレジスタ ! 171: // 今読み出そうとしたら読み出せるやつ ! 172: return reg.color[reg.addr] | LOW_NIBBLE; ! 173: ! 174: default: ! 175: return 0xff; ! 176: } ! 177: } ! 178: ! 179: // addr 番目のレジスタ値からホストパレットを作成。 ! 180: void ! 181: BT454Device::MakeHostColor(int addr) ! 182: { ! 183: int col = addr / 3; ! 184: int idx = addr % 3; ! 185: ! 186: if (nplane == 1) { ! 187: // 1bpp なら R,G,B のうち G の値だけを使用 ! 188: if (idx == 1) { ! 189: reg.hostcolor[col * 4 + 0] = reg.color[col * 3 + 1]; ! 190: reg.hostcolor[col * 4 + 1] = reg.color[col * 3 + 1]; ! 191: reg.hostcolor[col * 4 + 2] = reg.color[col * 3 + 1]; ! 192: } ! 193: } else { ! 194: // 4bpp なら代入するだけ ! 195: reg.hostcolor[col * 4 + idx] = reg.color[col * 3 + idx]; ! 196: } ! 197: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.