|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2017 [email protected] ! 4: // ! 5: ! 6: #include "vicon.h" ! 7: ! 8: ViconDevice *gVicon; ! 9: ! 10: ViconDevice::ViconDevice() ! 11: { ! 12: logname = "vicon"; ! 13: devname = "Vicon"; ! 14: devaddr = baseaddr; ! 15: devlen = 0x2000; ! 16: } ! 17: ! 18: ViconDevice::~ViconDevice() ! 19: { ! 20: } ! 21: ! 22: uint64 ! 23: ViconDevice::Read8(uint32 addr) ! 24: { ! 25: uint32 offset = addr - baseaddr; ! 26: uint32 data; ! 27: ! 28: if (offset < 0x400) { ! 29: // パレット ! 30: return palette.b[HB(offset)]; ! 31: } ! 32: ! 33: // レジスタ ! 34: switch (offset) { ! 35: case 0x401: ! 36: data = read_r0(); ! 37: break; ! 38: ! 39: case 0x500: ! 40: data = read_r1H(); ! 41: break; ! 42: case 0x501: ! 43: data = read_r1L(); ! 44: break; ! 45: ! 46: case 0x600: ! 47: data = read_r2H(); ! 48: break; ! 49: case 0x601: ! 50: data = read_r2L(); ! 51: break; ! 52: ! 53: default: ! 54: PANIC("Vicon $%06x.B 未実装読み込み", addr); ! 55: break; ! 56: } ! 57: return data; ! 58: } ! 59: ! 60: uint64 ! 61: ViconDevice::Read16(uint32 addr) ! 62: { ! 63: uint32 offset = addr - baseaddr; ! 64: uint32 data; ! 65: ! 66: if (offset < 0x400) { ! 67: return palette.w[offset / 2]; ! 68: } ! 69: ! 70: // レジスタ ! 71: switch (offset) { ! 72: case 0x400: ! 73: data = read_r0(); ! 74: break; ! 75: ! 76: case 0x500: ! 77: data = (read_r1H() << 8) | read_r1L(); ! 78: break; ! 79: ! 80: case 0x600: ! 81: data = (read_r2H() << 8) | read_r2L(); ! 82: break; ! 83: ! 84: default: ! 85: PANIC("Vicon $%06x.W 未実装読み込み", addr); ! 86: break; ! 87: } ! 88: return data; ! 89: } ! 90: ! 91: uint64 ! 92: ViconDevice::Write8(uint32 addr, uint32 data) ! 93: { ! 94: uint32 offset = addr - baseaddr; ! 95: ! 96: if (offset < 0x400) { ! 97: putlog(3, "パレット $%06x.B <- $%02x", addr, data); ! 98: palette.b[HB(offset)] = data; ! 99: return 0; ! 100: } ! 101: ! 102: // レジスタ ! 103: switch (offset) { ! 104: case 0x400: ! 105: break; ! 106: case 0x401: ! 107: write_r0(data); ! 108: break; ! 109: ! 110: case 0x500: ! 111: write_r1H(data); ! 112: break; ! 113: case 0x501: ! 114: write_r1L(data); ! 115: break; ! 116: ! 117: case 0x600: ! 118: write_r2H(data); ! 119: break; ! 120: case 0x601: ! 121: write_r2L(data); ! 122: break; ! 123: ! 124: default: ! 125: PANIC("Vicon $%06x.B <- $%02x 未実装書き込み", addr, data); ! 126: break; ! 127: } ! 128: return 0; ! 129: } ! 130: ! 131: uint64 ! 132: ViconDevice::Write16(uint32 addr, uint32 data) ! 133: { ! 134: uint32 offset = addr - baseaddr; ! 135: ! 136: if (offset < 0x400) { ! 137: if (offset < 0x200) { ! 138: putlog(3, "Gパレット $%06x [$%02x] <- $%04x", ! 139: addr, offset / 2, data); ! 140: } else { ! 141: putlog(3, "Tパレット $%06x [$%02x] <- $%04x", ! 142: addr, (offset - 0x200) / 2, data); ! 143: } ! 144: palette.w[offset / 2] = data; ! 145: return 0; ! 146: } ! 147: ! 148: // レジスタ ! 149: switch (offset) { ! 150: case 0x400: ! 151: write_r0(data); ! 152: break; ! 153: ! 154: case 0x500: ! 155: write_r1H(data >> 8); ! 156: write_r1L(data & 0xff); ! 157: break; ! 158: ! 159: case 0x600: ! 160: write_r2H(data >> 8); ! 161: write_r2L(data & 0xff); ! 162: break; ! 163: ! 164: default: ! 165: PANIC("Vicon $%06x.W <- $%04x 未実装書き込み", addr, data); ! 166: break; ! 167: } ! 168: return 0; ! 169: } ! 170: ! 171: uint64 ! 172: ViconDevice::Peek8(uint32 addr) ! 173: { ! 174: uint32 offset = addr - baseaddr; ! 175: uint32 data; ! 176: ! 177: if (offset < 0x400) { ! 178: return palette.b[HB(offset)]; ! 179: } ! 180: ! 181: switch (offset) { ! 182: case 0x401: ! 183: data = read_r0(); ! 184: break; ! 185: ! 186: case 0x500: ! 187: data = read_r1H(); ! 188: break; ! 189: case 0x501: ! 190: data = read_r1L(); ! 191: break; ! 192: ! 193: case 0x600: ! 194: data = read_r2H(); ! 195: break; ! 196: case 0x601: ! 197: data = read_r2L(); ! 198: break; ! 199: ! 200: default: ! 201: data = 0xff; ! 202: break; ! 203: } ! 204: return data; ! 205: } ! 206: ! 207: uint32 ! 208: ViconDevice::read_r0() ! 209: { ! 210: return vicon.r0; ! 211: } ! 212: ! 213: uint32 ! 214: ViconDevice::read_r1H() ! 215: { ! 216: return vicon.r1 >> 8; ! 217: } ! 218: ! 219: uint32 ! 220: ViconDevice::read_r1L() ! 221: { ! 222: return vicon.r1 & 0xff; ! 223: } ! 224: ! 225: uint32 ! 226: ViconDevice::read_r2H() ! 227: { ! 228: return vicon.r2 >> 8; ! 229: } ! 230: ! 231: uint32 ! 232: ViconDevice::read_r2L() ! 233: { ! 234: return vicon.r2 & 0xff; ! 235: } ! 236: ! 237: void ! 238: ViconDevice::write_r0(uint32 data) ! 239: { ! 240: putlog(0, "R0 <- $%02x 未実装書き込み", data); ! 241: vicon.r0 = data & 3; ! 242: } ! 243: ! 244: void ! 245: ViconDevice::write_r1H(uint32 data) ! 246: { ! 247: putlog(0, "R1(H) <- $%02x 未実装書き込み", data); ! 248: vicon.r1 &= 0x00ff; ! 249: vicon.r1 |= (data & 0x3f00); ! 250: } ! 251: ! 252: void ! 253: ViconDevice::write_r1L(uint32 data) ! 254: { ! 255: putlog(0, "R1(L) <- $%02x 未実装書き込み", data); ! 256: vicon.r1 &= 0xff00; ! 257: vicon.r1 |= (data & 0x00ff); ! 258: } ! 259: ! 260: void ! 261: ViconDevice::write_r2H(uint32 data) ! 262: { ! 263: putlog(0, "R2(H) <- $%02x 未実装書き込み", data); ! 264: vicon.r2 &= 0x00ff; ! 265: vicon.r2 |= (data & 0xff00); ! 266: } ! 267: ! 268: void ! 269: ViconDevice::write_r2L(uint32 data) ! 270: { ! 271: putlog(0, "R2(L) <- $%02x 未実装書き込み", data); ! 272: vicon.r2 &= 0xff00; ! 273: vicon.r2 |= (data & 0x007f); ! 274: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.