Annotation of nono/vm/nmi.cpp, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2021 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // ABORT/INTERRUPT スイッチによる NMI 機構デバイス
                      9: //
                     10: 
                     11: #include "nmi.h"
                     12: #include "interrupt.h"
                     13: #include "mainapp.h"
                     14: #include "scheduler.h"
                     15: 
                     16: // グローバル参照用
                     17: NMIDevice *gNMI;
                     18: 
                     19: // コンストラクタ
                     20: NMIDevice::NMIDevice()
                     21:        : inherited("NMI")
                     22: {
                     23:        event.func = ToEventCallback(&NMIDevice::NegateCallback);
                     24:        event.time = 100_msec;
                     25:        event.Regist("NMI");
                     26: }
                     27: 
                     28: // デストラクタ
                     29: NMIDevice::~NMIDevice()
                     30: {
                     31:        gNMI = NULL;
                     32: }
                     33: 
                     34: // 初期化
                     35: bool
                     36: NMIDevice::Init()
                     37: {
                     38:        gScheduler->ConnectMessage(MessageID::NMI, this,
                     39:                ToMessageCallback(&NMIDevice::AssertCallback));
                     40:        return true;
                     41: }
                     42: 
                     43: // NMI ボタンを押す (GUI から呼ばれる)
                     44: void
                     45: NMIDevice::PressNMI()
                     46: {
                     47:        gScheduler->SendMessage(MessageID::NMI);
                     48: }
                     49: 
                     50: // NMI 信号線をアサートする
                     51: void
                     52: NMIDevice::AssertNMI()
                     53: {
                     54:        gInterrupt->AssertINT(this);
                     55: }
                     56: 
                     57: // NMI 信号線をネゲートする
                     58: void
                     59: NMIDevice::NegateNMI()
                     60: {
                     61:        gInterrupt->NegateINT(this);
                     62: }
                     63: 
                     64: // NMI アサートのメッセージコールバック
                     65: void
                     66: NMIDevice::AssertCallback(MessageID msgid, uint32 arg)
                     67: {
                     68:        AssertNMI();
                     69: 
                     70:        if (gMainApp.HasVMFeature(VMF_LUNA)) {
                     71:                // LUNA(-I) は誰がいつどうネゲートしているのか分からないが
                     72:                // コードが能動的にネゲートしているようには見えないので、
                     73:                // とりあえず適当な時間経過後に自動的にネゲートしておいてみる。
                     74:                gScheduler->RestartEvent(event);
                     75:        }
                     76: }
                     77: 
                     78: // NMI ネゲートのイベントコールバック
                     79: void
                     80: NMIDevice::NegateCallback(Event& ev)
                     81: {
                     82:        NegateNMI();
                     83: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.