|
|
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.