Annotation of nono/vm/mpu88xx0.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2020 [email protected]
        !             4: //
        !             5: 
        !             6: // MPU (m88xx0)
        !             7: 
        !             8: #include "mpu88xx0.h"
        !             9: #include "config.h"
        !            10: 
        !            11: // コンストラクタ
        !            12: MPU88xx0Device::MPU88xx0Device(uint32 addr)
        !            13: {
        !            14:        monitor.Init(79, 15);
        !            15: 
        !            16:        // リセットベクタアドレスは Reset() で指定するので保持しておく
        !            17:        reset_vector = addr;
        !            18: 
        !            19:        cpu.reset(new m88kcpu());
        !            20: }
        !            21: 
        !            22: // デストラクタ
        !            23: MPU88xx0Device::~MPU88xx0Device()
        !            24: {
        !            25: }
        !            26: 
        !            27: // リセット
        !            28: // (MPU が動くのはこの後 Scheduler::Run() を発行した後)
        !            29: void
        !            30: MPU88xx0Device::ResetHard()
        !            31: {
        !            32:        cpu->Reset(reset_vector);
        !            33: }
        !            34: 
        !            35: // モニター更新
        !            36: bool
        !            37: MPU88xx0Device::MonitorUpdate()
        !            38: {
        !            39:        m88100reg reg;
        !            40:        int x;
        !            41:        int y;
        !            42: 
        !            43:        monitor.Clear();
        !            44: 
        !            45:        // ローカルにコピー
        !            46:        reg = *cpu;
        !            47: 
        !            48:        //
        !            49:        for (int i = 0; i < countof(reg.r); i++) {
        !            50:                monitor.Print((i / 8) * 14, i % 8, "r%-2d:%08x", i, reg.r[i]);
        !            51:        }
        !            52: 
        !            53:        // 制御レジスタ
        !            54:        x = 0;
        !            55:        y = 9;
        !            56:        monitor.Print(x, y++,  "pid (cr0):%08x(arch=$%02x ver=$%02x %c)",
        !            57:                reg.pid,
        !            58:                (reg.pid >> 8) & 0xff,
        !            59:                (reg.pid & 0xfe),
        !            60:                (reg.pid & 1) ? 'M' : '-');
        !            61:        monitor.Print(x, y++, "psr (cr1):%08x(%c,%s,%s,%s %s,%s,%s,%s)",
        !            62:                reg.psr,
        !            63:                (reg.psr  & m88100reg::PSR_SUPER) ? 'S' : '-',
        !            64:                (reg.psr  & m88100reg::PSR_BO_LE) ? "LE" : "BE",
        !            65:                (reg.psr  & m88100reg::PSR_SER)   ? "CON" : "SER",
        !            66:                (reg.psr  & m88100reg::PSR_C)     ? "Cy" : "--",
        !            67:                (reg.psr  & m88100reg::PSR_SFD1)  ? "SFD1" : "----",
        !            68:                (reg.psr  & m88100reg::PSR_MXM)   ? "MXM" : "---",
        !            69:                (reg.psr  & m88100reg::PSR_IND)   ? "IND" : "---",
        !            70:                (reg.psr  & m88100reg::PSR_SFRZ)  ? "SFRZ" : "----");
        !            71:        monitor.Print(x, y++, "epsr(cr2):%08x(%c,%s,%s,%s %s,%s,%s,%s)",
        !            72:                reg.epsr,
        !            73:                (reg.epsr & m88100reg::PSR_SUPER) ? 'S' : '-',
        !            74:                (reg.epsr & m88100reg::PSR_BO_LE) ? "LE" : "BE",
        !            75:                (reg.epsr & m88100reg::PSR_SER)   ? "CON" : "SER",
        !            76:                (reg.epsr & m88100reg::PSR_C)     ? "Cy" : "--",
        !            77:                (reg.epsr & m88100reg::PSR_SFD1)  ? "SFD1" : "----",
        !            78:                (reg.epsr & m88100reg::PSR_MXM)   ? "MXM" : "---",
        !            79:                (reg.epsr & m88100reg::PSR_IND)   ? "IND" : "---",
        !            80:                (reg.epsr & m88100reg::PSR_SFRZ)  ? "SFRZ" : "----");
        !            81: 
        !            82:        // 制御レジスタ(左下; *IP)
        !            83:        x = 0;
        !            84:        y = 12;
        !            85:        monitor.Print(x, y + 0, "xip:%08x  opX:%08x(%c%c)",
        !            86:                reg.xip, (uint32)reg.opX,
        !            87:                cpu->OpIsBusErr(reg.opX) ? 'B' : '-',
        !            88:                cpu->OpIsDelay(reg.opX)  ? 'D' : '-');
        !            89:        monitor.Print(x, y + 1, "nip:%08x  opF:%08x(%c%c)",
        !            90:                reg.nip, (uint32)reg.opF,
        !            91:                cpu->OpIsBusErr(reg.opF) ? 'B' : '-',
        !            92:                cpu->OpIsDelay(reg.opF)  ? 'D' : '-');
        !            93:        monitor.Print(x, y + 2, "fip:%08x", reg.fip);
        !            94: 
        !            95:        // 制御レジスタ (S*IP)
        !            96:        x = 32;
        !            97:        for (int i = 0; i < 3; i++) {
        !            98:                monitor.Print(x, y + i, "%s(cr%d):%08x:%c%c",
        !            99:                        m88100reg::sipname[i], 4 + i,
        !           100:                        (reg.cr[4 + i] & m88100reg::SIP_MASK),
        !           101:                        (reg.cr[4 + i] & m88100reg::SIP_V) ? 'V' : '-',
        !           102:                        (reg.cr[4 + i] & m88100reg::SIP_E) ? 'E' : '-');
        !           103:        }
        !           104: 
        !           105:        // 制御レジスタ(右列)
        !           106:        x = 55;
        !           107:        y = 9;
        !           108:        monitor.Print(x, y++, "ssbr(cr3):%08x", reg.ssbr);
        !           109:        monitor.Print(x, y++, "vbr (cr7):%08x", reg.vbr);
        !           110:        for (int i = 0; i < 4; i++) {
        !           111:                int rn = 17 + i;
        !           112:                monitor.Print(x, y + i, "sr%d(cr%d):%08x", i, rn, reg.cr[rn]);
        !           113:        }
        !           114: 
        !           115:        return true;
        !           116: }

unix.superglobalmegacorp.com

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