|
|
1.1 root 1: //
2: // nono
1.1.1.4 ! root 3: // Copyright (C) 2020 nono project
! 4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #include "sram.h"
1.1.1.4 ! root 8: #include "mainapp.h"
! 9: #include "mystring.h"
1.1 root 10:
11: //
12: // SRAM
13: //
14: // SRAM はビッグエンディアンのままメモリに置かれるので、
15: // 必要ならアクセス時に都度変換すること。
16: //
17:
1.1.1.3 root 18: std::unique_ptr<SRAMDevice> gSRAM;
1.1 root 19:
20: SRAMDevice::SRAMDevice()
21: {
22: logname = "sram";
23: devname = "SRAM";
24: devaddr = baseaddr;
1.1.1.4 ! root 25: devlen = 0x4000;
1.1 root 26: }
27:
28: SRAMDevice::~SRAMDevice()
29: {
30: }
31:
32: bool
33: SRAMDevice::Init()
34: {
1.1.1.3 root 35: filename = gMainApp.GetVMDir() + "SRAM030.DAT";
1.1.1.4 ! root 36: file.SetFilename(filename);
! 37: file.SetDispname(string_format("SRAM \"%s\"", filename.c_str()));
! 38: mem = file.OpenCreate(16 * 1024);
! 39: if (mem == NULL) {
1.1 root 40: return false;
41: }
42:
43: return true;
44: }
45:
1.1.1.3 root 46: // アドレスデコーダ
47: inline uint64
48: SRAMDevice::Decoder(uint32 addr) const
49: {
1.1.1.4 ! root 50: uint32 offset = addr - baseaddr;
! 51: assertmsg(offset < file.GetMemSize(),
! 52: "offset=%x memlen=%x", offset, (int)file.GetMemSize());
! 53: return offset;
1.1.1.3 root 54: }
55:
1.1 root 56: uint64
57: SRAMDevice::Read8(uint32 addr)
58: {
1.1.1.3 root 59: uint32 offset = Decoder(addr);
1.1.1.4 ! root 60: uint32 data;
! 61:
! 62: // ホストファイル起動モードなら起動アドレスとして Pluto-X を見せる。
! 63: if (gMainApp.host_file) {
! 64: data = PeekHostBoot(offset);
! 65: if ((int32)data >= 0) {
! 66: if ((offset & 1) == 0) {
! 67: data = data >> 8;
! 68: } else {
! 69: data = data & 0xff;
! 70: }
! 71: return data;
! 72: }
! 73: }
! 74:
! 75: data = mem[offset];
! 76: return data;
1.1 root 77: }
78:
79: uint64
80: SRAMDevice::Read16(uint32 addr)
81: {
1.1.1.3 root 82: uint32 offset = Decoder(addr);
1.1.1.4 ! root 83: uint32 data;
! 84:
! 85: // ホストファイル起動モードなら起動アドレスとして Pluto-X を見せる。
! 86: if (gMainApp.host_file) {
! 87: data = PeekHostBoot(offset);
! 88: if ((int32)data >= 0) {
! 89: return data;
! 90: }
! 91: }
! 92:
! 93: data = be16toh(*(uint16 *)&mem[offset]);
! 94: return data;
1.1 root 95: }
96:
97: uint64
98: SRAMDevice::Write8(uint32 addr, uint32 data)
99: {
1.1.1.3 root 100: uint32 offset = Decoder(addr);
101:
1.1 root 102: if (writeable) {
1.1.1.3 root 103: if (offset < 0x100) {
1.1 root 104: putlog(1, "更新 $%06x <- $%02x", addr, data);
105: }
1.1.1.3 root 106: mem[offset] = data;
1.1 root 107: } else {
108: putlog(1, "書き込み禁止 $%06x <- $%02x", addr, data);
109: }
110: return 0;
111: }
112:
113: uint64
114: SRAMDevice::Write16(uint32 addr, uint32 data)
115: {
1.1.1.3 root 116: uint32 offset = Decoder(addr);
117:
1.1 root 118: if (writeable) {
1.1.1.3 root 119: if (offset < 0x100) {
1.1 root 120: putlog(1, "更新 $%06x <- $%04x", addr, data);
121: }
1.1.1.3 root 122: *(uint16 *)&mem[offset] = htobe16(data);
1.1 root 123: } else {
124: putlog(1, "書き込み禁止 $%06x <- $%04x", addr, data);
125: }
126: return 0;
127: }
128:
129: uint64
130: SRAMDevice::Peek8(uint32 addr)
131: {
1.1.1.3 root 132: uint32 offset = Decoder(addr);
1.1.1.4 ! root 133:
! 134: // ホストファイル起動モードなら起動アドレスとして Pluto-X を見せる。
! 135: if (gMainApp.host_file) {
! 136: uint32 data = PeekHostBoot(offset);
! 137: if ((int32)data >= 0) {
! 138: if ((offset & 1) == 0) {
! 139: data = data >> 8;
! 140: } else {
! 141: data = data & 0xff;
! 142: }
! 143: return data;
! 144: }
! 145: }
! 146:
1.1.1.3 root 147: return mem[offset];
1.1 root 148: }
149:
150: void
151: SRAMDevice::write_enable(bool value)
152: {
153: if (writeable == false && value == true) {
154: putlog(1, "書き込み許可");
155: } else if (writeable == true && value == false) {
156: putlog(1, "書き込み禁止");
157: }
158:
159: writeable = value;
160: }
1.1.1.4 ! root 161:
! 162: // ホストファイル起動用の読み出し値を返す。
! 163: // offset はワード境界であること。戻り値はホストバイトオーダのワード値。
! 164: // 本来の SRAM の値を読み出してよいところについては (uint32)-1 を返す。
! 165: //
! 166: // mem[] は SRAM.DAT を直接 mmap(2) しており書き換えておくことは出来ないため、
! 167: // ホストファイル起動モードなら読み出し時に動的に値を返す。
! 168: uint32
! 169: SRAMDevice::PeekHostBoot(uint32 offset) const
! 170: {
! 171: switch (offset) {
! 172: case 0x0c: // ROM 起動アドレス(H)
! 173: return (plutoaddr >> 16);
! 174: case 0x0e: // ROM 起動アドレス(L)
! 175: return (plutoaddr & 0xffff);
! 176: case 0x18: // 起動デバイスを ROM にする
! 177: return 0xa000;
! 178: default:
! 179: break;
! 180: }
! 181: return (uint32)-1;
! 182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.