|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2023 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // 拡張エリアセット
9: //
10:
11: // 拡張エリアセットの範囲は $eaff80 〜 $eaffff までの 128バイトで、
12: // 他は (現状デバイスがないので) バスエラーになる。
13: // X68kIODevice の構造の都合上、$eae000 〜 $eaffff までの 8KB のアクセスが
14: // すべてここに来るので、BusIO を使わず自前でさばく必要がある。
15: // (本来は MuxDevice で分離すべき)
16:
17: #include "extarea.h"
18: #include "x68kio.h"
19:
20: // コンストラクタ
21: ExtAreaDevice::ExtAreaDevice()
22: : inherited(OBJ_EXTAREA)
23: {
24: }
25:
26: // デストラクタ
27: ExtAreaDevice::~ExtAreaDevice()
28: {
29: }
30:
31: // 初期化
32: bool
33: ExtAreaDevice::Init()
34: {
35: x68kio = GetX68kIODevice();
36:
37: return true;
38: }
39:
40: // リセット
41: void
42: ExtAreaDevice::ResetHard(bool poweron)
43: {
44: // リセット時はすべて 0 らしい。(X68030 Inside/Out)
45: for (int i = 0; i < 5; i++) {
46: x68kio->SetExtarea(i, 0x00);
47: }
48: }
49:
50: busdata
1.1.1.2 root 51: ExtAreaDevice::Read(busaddr addr)
1.1 root 52: {
1.1.1.2 root 53: uint32 reqsize = addr.GetSize();
54: uint32 paddr = addr.Addr();
55: uint32 offset = paddr & 1;
56: uint32 datasize = std::min(2 - offset, reqsize);
57:
58: if (paddr >= 0xeaff80) {
59: // 拡張エリアセット部分は書き込み専用なので読み出しはすべてバスエラー。
60: putlog(2, "Read $%06x.%c (BusErr)",
61: paddr, (datasize == 1 ? 'B' : 'W'));
62: } else {
63: // それ以外の部分も何もないのでバスエラー。
1.1 root 64: }
65:
1.1.1.2 root 66: busdata data = BusData::BusErr;
67: // XXX wait
68: data |= busdata::Size(datasize);
69: return data;
1.1 root 70: }
71:
72: busdata
1.1.1.2 root 73: ExtAreaDevice::Write(busaddr addr, uint32 data)
1.1 root 74: {
75: busdata r;
76:
1.1.1.2 root 77: uint32 reqsize = addr.GetSize();
78: uint32 paddr = addr.Addr();
79: uint32 offset = paddr & 1;
80: uint32 datasize = std::min(2 - offset, reqsize);
1.1 root 81:
1.1.1.2 root 82: if (paddr >= 0xeaff80) {
83: // 拡張エリアセット内は16バイト(8ワード)単位でミラー。
1.1 root 84: // 偶数アドレスはバスエラー。
1.1.1.2 root 85: if (datasize == 1 && offset == 0) {
86: r = BusData::BusErr;
87: } else {
88: uint32 regno = (paddr >> 1) & 7;
89: if (regno < 6) {
90: putlog(1, "$%06x [%u] <- $%02x", paddr, regno, data & 0xff);
91: x68kio->SetExtarea(regno, data);
92: } else {
93: r = BusData::BusErr;
94: }
95: }
96: if (r.IsBusErr()) {
97: putlog(2, "Write $%06x.%c (BusErr)",
98: paddr, (datasize == 1 ? 'B' : 'W'));
1.1 root 99: }
100: } else {
1.1.1.2 root 101: // それ以外の部分も何もないのでバスエラー。
102: r = BusData::BusErr;
1.1 root 103: }
104:
1.1.1.2 root 105: r |= busdata::Size(datasize);
106: return data;
1.1 root 107: }
108:
109: busdata
1.1.1.2 root 110: ExtAreaDevice::Peek1(uint32 addr)
1.1 root 111: {
1.1.1.2 root 112: return BusData::BusErr;
1.1 root 113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.