|
|
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: if (inherited::Init() == false) {
36: return false;
37: }
38:
39: x68kio = GetX68kIODevice();
40:
41: return true;
42: }
43:
44: // リセット
45: void
46: ExtAreaDevice::ResetHard(bool poweron)
47: {
48: // リセット時はすべて 0 らしい。(X68030 Inside/Out)
49: for (int i = 0; i < 5; i++) {
50: x68kio->SetExtarea(i, 0x00);
51: }
52: }
53:
54: busdata
1.1.1.2 ! root 55: ExtAreaDevice::Read(busaddr addr)
1.1 root 56: {
1.1.1.2 ! root 57: uint32 reqsize = addr.GetSize();
! 58: uint32 paddr = addr.Addr();
! 59: uint32 offset = paddr & 1;
! 60: uint32 datasize = std::min(2 - offset, reqsize);
! 61:
! 62: if (paddr >= 0xeaff80) {
! 63: // 拡張エリアセット部分は書き込み専用なので読み出しはすべてバスエラー。
! 64: putlog(2, "Read $%06x.%c (BusErr)",
! 65: paddr, (datasize == 1 ? 'B' : 'W'));
! 66: } else {
! 67: // それ以外の部分も何もないのでバスエラー。
1.1 root 68: }
69:
1.1.1.2 ! root 70: busdata data = BusData::BusErr;
! 71: // XXX wait
! 72: data |= busdata::Size(datasize);
! 73: return data;
1.1 root 74: }
75:
76: busdata
1.1.1.2 ! root 77: ExtAreaDevice::Write(busaddr addr, uint32 data)
1.1 root 78: {
79: busdata r;
80:
1.1.1.2 ! root 81: uint32 reqsize = addr.GetSize();
! 82: uint32 paddr = addr.Addr();
! 83: uint32 offset = paddr & 1;
! 84: uint32 datasize = std::min(2 - offset, reqsize);
1.1 root 85:
1.1.1.2 ! root 86: if (paddr >= 0xeaff80) {
! 87: // 拡張エリアセット内は16バイト(8ワード)単位でミラー。
1.1 root 88: // 偶数アドレスはバスエラー。
1.1.1.2 ! root 89: if (datasize == 1 && offset == 0) {
! 90: r = BusData::BusErr;
! 91: } else {
! 92: uint32 regno = (paddr >> 1) & 7;
! 93: if (regno < 6) {
! 94: putlog(1, "$%06x [%u] <- $%02x", paddr, regno, data & 0xff);
! 95: x68kio->SetExtarea(regno, data);
! 96: } else {
! 97: r = BusData::BusErr;
! 98: }
! 99: }
! 100: if (r.IsBusErr()) {
! 101: putlog(2, "Write $%06x.%c (BusErr)",
! 102: paddr, (datasize == 1 ? 'B' : 'W'));
1.1 root 103: }
104: } else {
1.1.1.2 ! root 105: // それ以外の部分も何もないのでバスエラー。
! 106: r = BusData::BusErr;
1.1 root 107: }
108:
1.1.1.2 ! root 109: r |= busdata::Size(datasize);
! 110: return data;
1.1 root 111: }
112:
113: busdata
1.1.1.2 ! root 114: ExtAreaDevice::Peek1(uint32 addr)
1.1 root 115: {
1.1.1.2 ! root 116: return BusData::BusErr;
1.1 root 117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.