|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2018 [email protected] ! 4: // ! 5: ! 6: #include "ram.h" ! 7: #include "vm.h" ! 8: ! 9: // ! 10: // メインメモリ ! 11: // ! 12: // RAM はロングワード単位でホストバイトオーダ配置なので、 ! 13: // バイトアクセス、ワードアクセス時は HLB(), HLW() マクロを使用のこと。 ! 14: // ! 15: ! 16: uint8 *ram; ! 17: int ram_size; ! 18: RAMDevice *gRAM; ! 19: ! 20: RAMDevice::RAMDevice() ! 21: { ! 22: logname = "ram"; ! 23: devname = "MainRAM"; ! 24: devaddr = 0; ! 25: ! 26: ram_size = 0; ! 27: ram = NULL; ! 28: } ! 29: ! 30: RAMDevice::~RAMDevice() ! 31: { ! 32: if (ram) { ! 33: delete ram; ! 34: ram = NULL; ! 35: } ! 36: ram_size = 0; ! 37: } ! 38: ! 39: bool ! 40: RAMDevice::Init() ! 41: { ! 42: // とりあえず。実際は設定ファイルから ! 43: if (gVM->GetType() == VM::TYPE_LUNA) { ! 44: ram_size = 16 * 1024 * 1024; ! 45: } else { ! 46: ram_size = 12 * 1024 * 1024; ! 47: } ! 48: ram = new uint8[ram_size]; ! 49: ! 50: return true; ! 51: } ! 52: ! 53: uint64 ! 54: RAMDevice::Read8(uint32 addr) ! 55: { ! 56: uint32 data; ! 57: data = ram[HLB(addr)]; ! 58: return data; ! 59: } ! 60: ! 61: uint64 ! 62: RAMDevice::Read16(uint32 addr) ! 63: { ! 64: uint32 data; ! 65: data = *(uint16 *)&ram[HLW(addr)]; ! 66: return data; ! 67: } ! 68: ! 69: uint64 ! 70: RAMDevice::Read32(uint32 addr) ! 71: { ! 72: uint32 data; ! 73: data = *(uint32 *)&ram[addr]; ! 74: return data; ! 75: } ! 76: ! 77: uint64 ! 78: RAMDevice::Write8(uint32 addr, uint32 data) ! 79: { ! 80: ram[HLB(addr)] = data; ! 81: return 0; ! 82: } ! 83: ! 84: uint64 ! 85: RAMDevice::Write16(uint32 addr, uint32 data) ! 86: { ! 87: *(uint16 *)&ram[HLW(addr)] = data; ! 88: return 0; ! 89: } ! 90: ! 91: uint64 ! 92: RAMDevice::Write32(uint32 addr, uint32 data) ! 93: { ! 94: *(uint32 *)&ram[addr] = data; ! 95: return 0; ! 96: } ! 97: ! 98: uint64 ! 99: RAMDevice::Peek8(uint32 addr) ! 100: { ! 101: return ram[HLB(addr)]; ! 102: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.