|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2020 [email protected] ! 4: // ! 5: ! 6: #include "vm_luna.h" ! 7: #include "aout.h" ! 8: #include "bitmap.h" ! 9: #include "bt454.h" ! 10: #include "busio.h" ! 11: #include "crtc2.h" ! 12: #include "ethernet.h" ! 13: #include "fuserom.h" ! 14: #include "lance.h" ! 15: #include "lcd.h" ! 16: #include "lunakbd.h" ! 17: #include "mainapp.h" ! 18: #include "mk48t02.h" ! 19: #include "pio.h" ! 20: #include "ram.h" ! 21: #include "renderer.h" ! 22: #include "romemu_luna.h" ! 23: #include "romemu_luna88k.h" ! 24: #include "romimg_luna.h" ! 25: #include "scheduler.h" ! 26: #include "sio.h" ! 27: #include "spc.h" ! 28: #include "sysclk.h" ! 29: #include "zram.h" ! 30: ! 31: // LUNA のデバイス割り当て表 (上位8ビット) ! 32: // ! 33: // 仕様 実際 ! 34: // 00 00 メインメモリ ! 35: // -- 01..03 二重バスフォールトするようだ ! 36: // -- 04..0f 何かよく分からないものが読める ! 37: // -- 10..3f BUSERR ! 38: // 41 40..43 PROM (B、N=128KBでミラー) ! 39: // 45 44..47 mk48t02 (B、N=2048でミラー) ! 40: // 49 48..4b pio0 (B、N=4でミラー) ! 41: // 4d 4c..4f pio1 (B、N=4でミラー) ! 42: // 51 50..53 sio (BB、N=4でミラー) ! 43: // -- 54..5f 0xff が読めるようだ ! 44: // 61 60..61 TAS (B、N=1でミラー) ! 45: // 63 62..63 システムクロック (B、N=1でミラー) ! 46: // -- 以降TASとSysClkで2枠ずつ。また無効ビットの読み出しは ! 47: // -- 必ずしも Hi とは限らず不安定のようだ。 ! 48: // 71 70..7f 3ポートRAM (B、N=128KBでミラー) ! 49: // 81 80.. BUSERR (オンボード拡張スロットA) ! 50: // 83 ..8f BUSERR (オンボード拡張スロットB) ! 51: // 91 90..9f 0xff が読めるようだ (PC-9000 拡張スロット) ! 52: // ! 53: // a1 マスクROM ! 54: // a0,a2,a4,... BUSERR ! 55: // a1,a3,a5,... マスクROM(なければ0xffが読める) ! 56: // b1 ビットマップ ! 57: // b0,b2,b4,... BUSERR ! 58: // b1,b3,b5,... ビットマップ (内訳は bitmap.cpp 参照) ! 59: // c1 パレット ! 60: // c0,c2,c4,... BUSERR ! 61: // c1,c3,c5,... パレット (B、N=4でミラー) ! 62: // d1 CRTC-II ! 63: // d0,d2,d4,... BUSERR ! 64: // d1,d3,d5,... CRTC-II (B、N=2でミラー) ! 65: // ! 66: // e1 e0..e3 SCSI (BBBB、N=16 でミラー) ! 67: // -- e4..ef 0xff が読めるようだが不安定。 ! 68: // f1 f0..f3 LANCE (WW、N=2 でミラー) ! 69: // -- f4..ff 0xff が読めるようだ ! 70: ! 71: // デバイスマップ用の識別子 ! 72: enum { ! 73: NONE, ! 74: BUSERR, ! 75: RAM, ! 76: PROM, ! 77: MK48, ! 78: PIO0, ! 79: PIO1, ! 80: SIO, ! 81: TAS, ! 82: SYSCLK, ! 83: ZRAM, ! 84: MROM, ! 85: BITMAP, ! 86: BT454, ! 87: CRTC2, ! 88: SCSI, ! 89: LANCE, ! 90: FUSE, ! 91: }; ! 92: ! 93: // ! 94: // LUNA-I ! 95: // ! 96: ! 97: /*static*/ const uint8 ! 98: VM_LUNA::maptable[256] = { ! 99: // 01,02,03 は実際には二重バスフォールトになるがそれは未対応 ! 100: RAM, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 00 ! 101: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 08 ! 102: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10 ! 103: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18 ! 104: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20 ! 105: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28 ! 106: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30 ! 107: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38 ! 108: ! 109: PROM, PROM, PROM, PROM, MK48, MK48, MK48, MK48, // 40 ! 110: PIO0, PIO0, PIO0, PIO0, PIO1, PIO1, PIO1, PIO1, // 48 ! 111: SIO, SIO, SIO, SIO, NONE, NONE, NONE, NONE, // 50 ! 112: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 58 ! 113: TAS, TAS, SYSCLK, SYSCLK, TAS, TAS, SYSCLK, SYSCLK, // 60 ! 114: TAS, TAS, SYSCLK, SYSCLK, TAS, TAS, SYSCLK, SYSCLK, // 68 ! 115: ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 70 ! 116: ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 78 ! 117: ! 118: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80 ! 119: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88 ! 120: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 90 ! 121: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98 ! 122: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0 ! 123: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8 ! 124: BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0 ! 125: BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8 ! 126: ! 127: BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c0 ! 128: BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c8 ! 129: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d0 ! 130: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d8 ! 131: SCSI, SCSI, SCSI, SCSI, NONE, NONE, NONE, NONE, // e0 ! 132: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // e8 ! 133: LANCE, LANCE, LANCE, LANCE, NONE, NONE, NONE, NONE, // f0 ! 134: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // f8 ! 135: }; ! 136: ! 137: // コンストラクタ ! 138: VM_LUNA::VM_LUNA() ! 139: { ! 140: // デバイス (順序に注意) ! 141: // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。 ! 142: gMPU.reset(new MPU680x0Device(0x41000000)); ! 143: gRAM.reset(new RAMDevice()); ! 144: if (gConfig->Get("prom-use-rom").AsInt() && gMainApp.host_file == NULL) { ! 145: gPROM.reset(new PROMDevice()); ! 146: } else { ! 147: gPROM.reset(new LunaPROMEmuDevice()); ! 148: } ! 149: gRTC.reset(new BusIO_B<MK48T02Device>()); ! 150: gPIO0.reset(new BusIO_B<PIO0Device>()); ! 151: gPIO1.reset(new BusIO_B<PIO1Device>()); ! 152: gSIO.reset(new BusIO_BB<SIODevice>()); ! 153: sysclk.reset(new BusIO_B<SysClkDevice>()); ! 154: gZRAM.reset(new ZRAMDevice()); ! 155: gBitmap.reset(new BitmapDevice()); // required by BT454 ! 156: gBT454.reset(new BusIO_B<BT454Device>()); ! 157: crtc2.reset(new BusIO_B<CRTC2Device>()); ! 158: gSPC.reset(new BusIO_BBBB<SPCDevice>()); ! 159: gEthernet.reset(new BusIO_W<LanceDevice>()); ! 160: nulldev.reset(new NullDevice()); ! 161: ! 162: gLCD.reset(new LCDDevice()); ! 163: gKeyboard.reset(new LunaKeyboard()); ! 164: gRenderer.reset(new LunaRenderer()); ! 165: ! 166: // デバイスマップから devtable を作成 ! 167: for (uint i = 0; i < countof(::devtable); i++) { ! 168: IODevice *d; ! 169: switch (maptable[i]) { ! 170: case NONE: d = nulldev.get(); break; ! 171: case BUSERR: d = buserr.get(); break; ! 172: case RAM: d = gRAM.get(); break; ! 173: case PROM: d = gPROM.get(); break; ! 174: case MK48: d = gRTC.get(); break; ! 175: case PIO0: d = gPIO0.get(); break; ! 176: case PIO1: d = gPIO1.get(); break; ! 177: case SIO: d = gSIO.get(); break; ! 178: case TAS: d = gZRAM.get(); break; ! 179: case SYSCLK: d = sysclk.get(); break; ! 180: case ZRAM: d = gZRAM.get(); break; ! 181: case MROM: d = nulldev.get(); break; ! 182: case BITMAP: d = gBitmap.get(); break; ! 183: case BT454: d = gBT454.get(); break; ! 184: case CRTC2: d = crtc2.get(); break; ! 185: case SCSI: d = gSPC.get(); break; ! 186: case LANCE: d = gEthernet.get(); break; ! 187: default: ! 188: __unreachable(); ! 189: } ! 190: ::devtable[i] = d; ! 191: } ! 192: } ! 193: ! 194: // デストラクタ ! 195: VM_LUNA::~VM_LUNA() ! 196: { ! 197: } ! 198: ! 199: void ! 200: VM_LUNA::PowerButton() ! 201: { ! 202: // LUNA の電源ボタンは電源オンにしか使わない。 ! 203: // ! 204: // 電源 ボタン ! 205: // ON PUSH (何も起きない) ! 206: // OFF PUSH 電源オン ! 207: ! 208: // デバイスに指示 ! 209: DevicePowerOn(); ! 210: } ! 211: ! 212: ! 213: // ! 214: // LUNA88K ! 215: // ! 216: ! 217: /*static*/ const uint8 ! 218: VM_LUNA88K::maptable[256] = { ! 219: RAM, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 00 ! 220: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 08 ! 221: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10 ! 222: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18 ! 223: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20 ! 224: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28 ! 225: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30 ! 226: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38 ! 227: ! 228: // LUNA88K2 は 47 に(も?) NVRAM がいるようだ ! 229: // 65 に割り込みコントローラ? ! 230: // 69,6b,6d にも何かのコントローラ? ! 231: PROM, PROM, PROM, FUSE, MK48, MK48, MK48, MK48, // 40 ! 232: PIO0, PIO0, PIO0, PIO0, PIO1, PIO1, PIO1, PIO1, // 48 ! 233: SIO, SIO, SIO, SIO, NONE, NONE, NONE, NONE, // 50 ! 234: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 58 ! 235: TAS, TAS, SYSCLK, SYSCLK, NONE, NONE, NONE, NONE, // 60 ! 236: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 68 ! 237: ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 70 ! 238: ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 78 ! 239: ! 240: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80 ! 241: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88 ! 242: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 90 ! 243: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98 ! 244: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0 ! 245: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8 ! 246: BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0 ! 247: BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8 ! 248: ! 249: // d0 にボードチェックレジスタ? ! 250: // ff に CMMU ! 251: BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c0 ! 252: BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c8 ! 253: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d0 ! 254: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d8 ! 255: SCSI, SCSI, SCSI, SCSI, NONE, NONE, NONE, NONE, // e0 ! 256: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // e8 ! 257: LANCE, LANCE, LANCE, LANCE, NONE, NONE, NONE, NONE, // f0 ! 258: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // f8 ! 259: }; ! 260: ! 261: // コンストラクタ ! 262: VM_LUNA88K::VM_LUNA88K() ! 263: { ! 264: // デバイス (順序に注意) ! 265: // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。 ! 266: gMPU.reset(new MPU88xx0Device(0x41000000)); ! 267: gRAM.reset(new RAMDevice()); ! 268: if (0) { ! 269: //gPROM.reset(new PROMDevice()); ! 270: } else { ! 271: gPROM.reset(new Luna88kPROMEmuDevice()); ! 272: } ! 273: gRTC.reset(new BusIO_BFFF<MK48T02Device>()); ! 274: gPIO0.reset(new PIO0Device()); ! 275: gPIO1.reset(new PIO1Device()); ! 276: gSIO.reset(new BusIO_BFFF<SIODevice>()); ! 277: sysclk.reset(new SysClkDevice()); ! 278: gZRAM.reset(new ZRAMDevice()); ! 279: gBitmap.reset(new BitmapDevice()); // required by BT454 ! 280: gBT454.reset(new BusIO_B<BT454Device>()); ! 281: crtc2.reset(new BusIO_BFFF<CRTC2Device>()); ! 282: gSPC.reset(new BusIO_BFFF<SPCDevice>()); ! 283: //gEthernet.reset(new BusIO_WF<LanceDevice>()); ! 284: fuserom.reset(new FuseROMDevice()); ! 285: nulldev.reset(new NullDevice()); ! 286: ! 287: gLCD.reset(new LCDDevice()); ! 288: gKeyboard.reset(new LunaKeyboard()); ! 289: gRenderer.reset(new LunaRenderer()); ! 290: ! 291: // デバイスマップから devtable を作成 ! 292: for (uint i = 0; i < countof(::devtable); i++) { ! 293: IODevice *d; ! 294: switch (maptable[i]) { ! 295: case NONE: d = nulldev.get(); break; ! 296: case BUSERR: d = buserr.get(); break; ! 297: case RAM: d = gRAM.get(); break; ! 298: case PROM: d = gPROM.get(); break; ! 299: case MK48: d = gRTC.get(); break; ! 300: case PIO0: d = gPIO0.get(); break; ! 301: case PIO1: d = gPIO1.get(); break; ! 302: case SIO: d = gSIO.get(); break; ! 303: case TAS: d = gZRAM.get(); break; ! 304: case SYSCLK: d = sysclk.get(); break; ! 305: case ZRAM: d = gZRAM.get(); break; ! 306: case MROM: d = nulldev.get(); break; ! 307: case BITMAP: d = gBitmap.get(); break; ! 308: case BT454: d = gBT454.get(); break; ! 309: case CRTC2: d = crtc2.get(); break; ! 310: case SCSI: d = gSPC.get(); break; ! 311: case LANCE: d = buserr.get(); break; // XXX not yet ! 312: case FUSE: d = fuserom.get(); break; ! 313: default: ! 314: __unreachable(); ! 315: } ! 316: ::devtable[i] = d; ! 317: } ! 318: } ! 319: ! 320: // デストラクタ ! 321: VM_LUNA88K::~VM_LUNA88K() ! 322: { ! 323: } ! 324: ! 325: void ! 326: VM_LUNA88K::PowerButton() ! 327: { ! 328: // デバイスに指示 ! 329: DevicePowerOn(); ! 330: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.