|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2020 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // サブメモリ ! 9: // ! 10: ! 11: // SubRAM はバイト配置とする。 ! 12: ! 13: #include "subram.h" ! 14: #include "mainapp.h" ! 15: ! 16: // ! 17: // 共通クラス ! 18: // ! 19: ! 20: // コンストラクタ ! 21: SubRAMBaseDevice::SubRAMBaseDevice(int objid_, uint ramsize_kb) ! 22: : inherited(objid_) ! 23: { ! 24: ramsize = ramsize_kb * 1024; ! 25: ! 26: ram.reset(new uint8[ramsize]); ! 27: memset(&ram[0], 0, ramsize); ! 28: } ! 29: ! 30: // デストラクタ ! 31: SubRAMBaseDevice::~SubRAMBaseDevice() ! 32: { ! 33: } ! 34: ! 35: // リセット ! 36: void ! 37: SubRAMBaseDevice::ResetHard(bool poweron) ! 38: { ! 39: if (poweron) { ! 40: // 実際にはゼロ初期化ではなくゴミだと思うがとりあえず。 ! 41: memset(&ram[0], 0, ramsize); ! 42: } ! 43: } ! 44: ! 45: // アドレスデコーダ ! 46: inline uint64 ! 47: SubRAMBaseDevice::Decoder(uint32 addr) const ! 48: { ! 49: // たぶん 128KB というかサイズ分で折り返しイメージが見えるはず。要確認。 ! 50: return addr % ramsize; ! 51: } ! 52: ! 53: uint64 ! 54: SubRAMBaseDevice::Read8(uint32 addr) ! 55: { ! 56: uint32 offset = Decoder(addr); ! 57: uint32 data = ram[offset]; ! 58: putlog(4, "$%08x.B -> $%02x", addr, data); ! 59: return data; ! 60: } ! 61: ! 62: uint64 ! 63: SubRAMBaseDevice::Read16(uint32 addr) ! 64: { ! 65: uint32 offset = Decoder(addr); ! 66: uint32 data; ! 67: data = (uint32)ram[offset + 0] << 8; ! 68: data |= (uint32)ram[offset + 1]; ! 69: putlog(4, "$%08x.W -> $%04x", addr, data); ! 70: return data; ! 71: } ! 72: ! 73: uint64 ! 74: SubRAMBaseDevice::Read32(uint32 addr) ! 75: { ! 76: uint32 offset = Decoder(addr); ! 77: uint32 data; ! 78: data = (uint32)ram[offset + 0] << 24; ! 79: data |= (uint32)ram[offset + 1] << 16; ! 80: data |= (uint32)ram[offset + 2] << 8; ! 81: data |= (uint32)ram[offset + 3]; ! 82: putlog(4, "$%08x.L -> $%08x", addr, data); ! 83: return data; ! 84: } ! 85: ! 86: uint64 ! 87: SubRAMBaseDevice::Write8(uint32 addr, uint32 data) ! 88: { ! 89: putlog(3, "$%08x.B <- $%02x", addr, data); ! 90: ! 91: uint32 offset = Decoder(addr); ! 92: ram[offset] = data; ! 93: return 0; ! 94: } ! 95: ! 96: uint64 ! 97: SubRAMBaseDevice::Write16(uint32 addr, uint32 data) ! 98: { ! 99: putlog(3, "$%08x.W <- $%04x", addr, data); ! 100: ! 101: uint32 offset = Decoder(addr); ! 102: ram[offset + 0] = (data >> 8) & 0xff; ! 103: ram[offset + 1] = data & 0xff; ! 104: return 0; ! 105: } ! 106: ! 107: uint64 ! 108: SubRAMBaseDevice::Write32(uint32 addr, uint32 data) ! 109: { ! 110: putlog(3, "$%08x.L <- $%08x", addr, data); ! 111: ! 112: uint32 offset = Decoder(addr); ! 113: ram[offset + 0] = data >> 24; ! 114: ram[offset + 1] = (data >> 16) & 0xff; ! 115: ram[offset + 2] = (data >> 8) & 0xff; ! 116: ram[offset + 3] = data & 0xff; ! 117: return 0; ! 118: } ! 119: ! 120: uint64 ! 121: SubRAMBaseDevice::Peek8(uint32 addr) ! 122: { ! 123: uint32 offset = Decoder(addr); ! 124: return ram[offset]; ! 125: } ! 126: ! 127: uint64 ! 128: SubRAMBaseDevice::Poke8(uint32 addr, uint32 data) ! 129: { ! 130: if ((int32)data >= 0) { ! 131: uint32 offset = Decoder(addr); ! 132: ram[offset] = data; ! 133: } ! 134: return 0; ! 135: } ! 136: ! 137: ! 138: // ! 139: // サブメモリ 1 ! 140: // ! 141: ! 142: // コンストラクタ ! 143: SubRAMDevice::SubRAMDevice(int ramsize_kb) ! 144: : inherited(OBJ_SUBRAM, ramsize_kb) ! 145: { ! 146: } ! 147: ! 148: // デストラクタ ! 149: SubRAMDevice::~SubRAMDevice() ! 150: { ! 151: } ! 152: ! 153: // リセット ! 154: void ! 155: SubRAMDevice::ResetHard(bool poweron) ! 156: { ! 157: // 通常モードなら電源オンで初期化。 ! 158: // MSXDOS モードなら MSXDOSDevice::Init() がすでにここに ! 159: // 書き込んでいるため、消してはいけない。 ! 160: if (gMainApp.msxdos_mode == false) { ! 161: inherited::ResetHard(poweron); ! 162: } ! 163: } ! 164: ! 165: ! 166: // ! 167: // サブメモリ 2 ! 168: // ! 169: ! 170: // コンストラクタ ! 171: SubRAM2Device::SubRAM2Device(int ramsize_kb) ! 172: : inherited(OBJ_SUBRAM2, ramsize_kb) ! 173: { ! 174: } ! 175: ! 176: // デストラクタ ! 177: SubRAM2Device::~SubRAM2Device() ! 178: { ! 179: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.