|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2022 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // VM (NEWS) ! 9: // ! 10: ! 11: #include "vm_news.h" ! 12: #include "busio.h" ! 13: #include "config.h" ! 14: #include "dipsw.h" ! 15: #include "interrupt.h" ! 16: #include "mainapp.h" ! 17: #include "mainbus.h" ! 18: #include "mainram.h" ! 19: #include "mpu680x0.h" ! 20: #include "newsctlr.h" ! 21: #include "newsfb.h" ! 22: #include "newsio.h" ! 23: #include "prom.h" ! 24: #include "renderer.h" ! 25: #include "romemu_news.h" ! 26: #include "scheduler.h" ! 27: ! 28: // コンストラクタ ! 29: VM_NEWS::VM_NEWS() ! 30: { ! 31: // 機種固有パラメータ ! 32: // MPU クロックの初期値は機種ごとに異なる。単位は MHz ! 33: gConfig->SetDefault("mpu-clock", 25); ! 34: // RAM 初期値は? ! 35: gConfig->SetDefault("ram-size", 16); ! 36: // RTC epoch は 1900年。 ! 37: gConfig->SetDefault("rtc-epoch-year", 1900); ! 38: ! 39: NEWDV(MPU, new MPU680x0Device()); ! 40: NEWDV(Interrupt, new NewsInterrupt()); ! 41: NEWDV(PROM, new NewsROMEmuDevice()); ! 42: NEWDV(MainRAM, new MainRAMDevice()); ! 43: NEWDV(NewsCtlr, new NewsCtlrDevice()); ! 44: NEWDV(NewsIO, new NewsIODevice()); ! 45: ! 46: NEWDV(Renderer, new NewsRenderer()); ! 47: NEWDV(Newsfb, new NewsfbDevice()); ! 48: NEWDV(Dipsw, new NewsDipswDevice()); ! 49: ! 50: // 全域をバスエラーで埋める。 ! 51: // XXX バスエラーが起きるかどうかは知らないが ! 52: auto mainbus = dynamic_cast<MainbusDevice *>(pMainbus.get()); ! 53: for (int i = 0; i < mainbus->devtable.size() / 4; i++) { ! 54: auto buserr = dynamic_cast<IODevice *>(pBusErr.get()); ! 55: mainbus->SetDevice(i, buserr); ! 56: } ! 57: ! 58: // 少ないので手動で置いていく。 ! 59: auto newsio = dynamic_cast<IODevice *>(pNewsIO.get()); ! 60: auto newsctlr = dynamic_cast<IODevice *>(pNewsCtlr.get()); ! 61: auto prom = dynamic_cast<IODevice *>(pPROM.get()); ! 62: #define A(addr) (((addr) >> 24) & 0x3f) ! 63: mainbus->SetDevice(A(0xe0'000000), newsio); ! 64: mainbus->SetDevice(A(0xe1'000000), newsctlr); ! 65: mainbus->SetDevice(A(0xf8'000000), prom); ! 66: } ! 67: ! 68: // デストラクタ ! 69: VM_NEWS::~VM_NEWS() ! 70: { ! 71: } ! 72: ! 73: // 初期化 ! 74: bool ! 75: VM_NEWS::Init() ! 76: { ! 77: if (inherited::Init() == false) { ! 78: return false; ! 79: } ! 80: ! 81: auto mainbus = dynamic_cast<MainbusDevice *>(pMainbus.get()); ! 82: auto mainram = dynamic_cast<MainRAMDevice *>(pMainRAM.get()); ! 83: ! 84: // RAM 容量が確定したので、ここで devtable に RAM を配置。 ! 85: int ram_size_MB = mainram->GetSizeMB(); ! 86: int i = 0; ! 87: while (ram_size_MB >= 16) { ! 88: // 16MB 単位にとりあえずしとく ! 89: mainbus->SetDevice(i++, mainram); ! 90: ram_size_MB -= 16; ! 91: } ! 92: ! 93: // $40'000000〜、$80'000000〜、$c0'000000〜はミラーっぽい。 ! 94: mainbus->CopyDevtable(0x40, 0, 0x40); ! 95: mainbus->CopyDevtable(0x80, 0, 0x40); ! 96: mainbus->CopyDevtable(0xc0, 0, 0x40); ! 97: ! 98: return true; ! 99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.