Annotation of nono/vm/mpu88xx0.cpp, revision 1.1.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.