|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2023 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // X68030 勝手に拡張メモリ
9: //
10: // 拡張メモリは TS-6BE16 互換か 060turbo 互換のいずれか。
11: // TS-6BE16 互換だと $0100'0000 〜 $01ff'ffff の 16MB。
12: // 060turbo 互換だと $1000'0000 〜 $17ff'ffff の 128MB、
13: // $1000'0000 〜 $1fff'ffff の 256MB。
1.1.1.3 root 14: // $1000'0000 〜 $2fff'ffff の 512MB。(独自拡張)
1.1 root 15: //
16:
17: // 拡張 RAM はロングワード単位でホストバイトオーダ配置なので、
18: // バイトアクセス、ワードアクセス時は HLB(), HLW() マクロを使用のこと。
19:
20: #include "extram.h"
21: #include "config.h"
22:
23: // コンストラクタ
24: ExtRAMDevice::ExtRAMDevice()
25: : inherited(OBJ_EXTRAM)
26: {
27: }
28:
29: // デストラクタ
30: ExtRAMDevice::~ExtRAMDevice()
31: {
32: }
33:
34: // 初期化
35: bool
36: ExtRAMDevice::Init()
37: {
38: const ConfigItem& item = gConfig->Find("extram-size");
39: uint32 extram_size_MB = item.AsInt();
1.1.1.4 root 40: if (extram_size_MB == 0) {
1.1 root 41: return true;
42: }
43: switch (extram_size_MB) {
44: case 16:
45: ram_addr = 0x01'000000;
46: break;
47: case 128:
48: case 256:
1.1.1.3 root 49: case 384:
50: case 512:
1.1 root 51: ram_addr = 0x10'000000;
52: break;
53: default:
1.1.1.3 root 54: item.Err("Valid size are 16, 128, 256, 384 or 512 for now");
1.1 root 55: return false;
56: }
57:
58: ram_size = extram_size_MB * 1024 * 1024;
1.1.1.3 root 59: ram.reset(new(std::nothrow) uint8[ram_size]);
60: if ((bool)ram == false) {
1.1.1.6 ! root 61: warnx("Could not allocate ExtRAM(%u bytes)", ram_size);
1.1.1.3 root 62: return false;
63: }
1.1 root 64:
65: return true;
66: }
67:
68: // 電源オン/リセット
69: void
70: ExtRAMDevice::ResetHard(bool poweron)
71: {
72: if (poweron) {
73: // ノイズで埋めたいがとりあえず。
74: memset(&ram[0], 0, ram_size);
75: }
76: }
77:
78: inline uint32
79: ExtRAMDevice::Decoder(uint32 addr) const
80: {
81: return (addr - ram_addr);
82: }
83:
1.1.1.3 root 84: busdata
1.1.1.4 root 85: ExtRAMDevice::Read(busaddr addr)
1.1 root 86: {
1.1.1.4 root 87: uint32 offset = Decoder(addr.Addr());
88: busdata data;
1.1 root 89:
1.1.1.4 root 90: data = *(uint32 *)&ram[offset & ~3U];
91: putlog(4, "$%08x -> $%08x", addr.Addr(), data.Data());
92: data |= BusData::Size4;
1.1 root 93: return data;
94: }
95:
1.1.1.3 root 96: busdata
1.1.1.4 root 97: ExtRAMDevice::Write(busaddr addr, uint32 data)
1.1 root 98: {
1.1.1.4 root 99: uint32 paddr = Decoder(addr.Addr());
100: uint32 reqsize = addr.GetSize();
101: uint32 datasize = std::min(4 - (paddr & 3U), reqsize);
102:
103: if (datasize == 4) {
104: *(uint32 *)&ram[paddr] = data;
105: putlog(3, "$%08x <- $%08x", addr.Addr(), data);
106: } else {
107: data >>= (reqsize - datasize) * 8;
108: putlog(3, "$%08x <- $%0*x", addr.Addr(), datasize * 2, data);
109: for (int i = datasize - 1; i >= 0; i--) {
110: ram[HLB(paddr + i)] = data;
111: data >>= 8;
112: }
113: }
1.1 root 114:
1.1.1.4 root 115: busdata r = BusData::Size4;
116: return r;
1.1 root 117: }
118:
1.1.1.3 root 119: busdata
1.1.1.4 root 120: ExtRAMDevice::Peek1(uint32 addr)
1.1 root 121: {
122: uint32 offset = Decoder(addr);
123: return ram[HLB(offset)];
124: }
125:
1.1.1.3 root 126: bool
1.1.1.4 root 127: ExtRAMDevice::Poke1(uint32 addr, uint32 data)
1.1 root 128: {
129: if ((int32)data >= 0) {
130: uint32 offset = Decoder(addr);
131: ram[HLB(offset)] = data;
132: }
1.1.1.3 root 133: return true;
1.1 root 134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.