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