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

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2020 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: // M88200 CMMU の I/O デバイス部分
        !             8: 
        !             9: #include "cmmu.h"
        !            10: #include "mpu88xx0.h"
        !            11: 
        !            12: // CMMU が確定したらそっちのデバイスログから出力する。
        !            13: // CMMU が確定しない場合はこのデバイスのログを使う。
        !            14: 
        !            15: std::unique_ptr<CMMUDevice> gCMMU;
        !            16: 
        !            17: // コンストラクタ
        !            18: CMMUDevice::CMMUDevice()
        !            19: {
        !            20:        // m88200 側の logname が "cmmu7" とかなので、こっちを "cmmu" で
        !            21:        // 受け付けてしまうのは紛らわしそうなので。
        !            22:        logname = "cmmudev";
        !            23:        devname = "CMMU";
        !            24: }
        !            25: 
        !            26: // デストラクタ
        !            27: CMMUDevice::~CMMUDevice()
        !            28: {
        !            29: }
        !            30: 
        !            31: bool
        !            32: CMMUDevice::Init()
        !            33: {
        !            34:        // CMMU をポイントしておく
        !            35:        cmmus[7] = &gMPU88xx0->GetCPU()->cmmu[0];
        !            36:        cmmus[6] = &gMPU88xx0->GetCPU()->cmmu[1];
        !            37: 
        !            38:        return true;
        !            39: }
        !            40: 
        !            41: // アドレスデコーダ
        !            42: /*static*/ inline uint32
        !            43: CMMUDevice::Decoder(uint32 addr)
        !            44: {
        !            45:        uint32 offset = addr & 0xfff;
        !            46: 
        !            47:        // BWP* の A5 はデコードされてない
        !            48:        if (0x420 <= offset && offset < 0x440) {
        !            49:                offset &= ~0x20;
        !            50:        }
        !            51:        // CDP*,CTP* の A4,A5 はデコードされていない
        !            52:        if (0x800 <= offset && offset < 0x880) {
        !            53:                offset &= ~0x30;
        !            54:        }
        !            55: 
        !            56:        return offset;
        !            57: }
        !            58: 
        !            59: uint64
        !            60: CMMUDevice::Read32(uint32 addr)
        !            61: {
        !            62:        uint32 id = (addr >> 12) & 0xff;
        !            63: 
        !            64:        m88200 *cmmu = GetCMMU(id);
        !            65:        if (cmmu == NULL) {
        !            66:                putlog(3, "未搭載 CMMU[%d] 読み込み $%08x", id, addr);
        !            67:                return 0xffffffff;
        !            68:        }
        !            69: 
        !            70:        uint32 offset = Decoder(addr);
        !            71:        uint32 data;
        !            72:        switch (offset) {
        !            73:         case IDR:
        !            74:                data = cmmu->GetIDR();
        !            75:                cmmu->putlog(2, "IDR  -> $%08x", data);
        !            76:                return data;
        !            77: 
        !            78:         case SCR:
        !            79:                data = cmmu->GetSCR();
        !            80:                cmmu->putlog(2, "SCR  -> $%08x", data);
        !            81:                return data;
        !            82: 
        !            83:         case SSR:
        !            84:                data = cmmu->GetSSR();
        !            85:                cmmu->putlog(2, "SSR  -> $%08x", data);
        !            86:                return data;
        !            87: 
        !            88:         case SAR:
        !            89:                data = cmmu->GetSAR();
        !            90:                cmmu->putlog(2, "SAR  -> $%08x", data);
        !            91:                return data;
        !            92: 
        !            93:         case SCTR:
        !            94:                data = cmmu->GetSCTR();
        !            95:                cmmu->putlog(2, "SCTR -> $%08x", data);
        !            96:                return data;
        !            97: 
        !            98:         case PFSR:
        !            99:                data = cmmu->GetPFSR();
        !           100:                cmmu->putlog(2, "PFSR -> $%08x", data);
        !           101:                return data;
        !           102: 
        !           103:         case PFAR:
        !           104:                data = cmmu->GetPFAR();
        !           105:                cmmu->putlog(2, "PFAR -> $%08x", data);
        !           106:                return data;
        !           107: 
        !           108:         case SAPR:
        !           109:                data = cmmu->GetSAPR();
        !           110:                cmmu->putlog(2, "SAPR -> $%08x", data);
        !           111:                return data;
        !           112: 
        !           113:         case UAPR:
        !           114:                data = cmmu->GetUAPR();
        !           115:                cmmu->putlog(2, "UAPR -> $%08x", data);
        !           116:                return data;
        !           117: 
        !           118:         case BWP0 ... BWP7:
        !           119:                // BWP は書き込み専用 (何が読めるだろうか)
        !           120:                return 0xffffffff;
        !           121: 
        !           122:         case CDP0 ... CDP3:
        !           123:         case CTP0 ... CTP3:
        !           124:                break;
        !           125: 
        !           126:         case CSSP:
        !           127:                data = cmmu->GetCSSP();
        !           128:                cmmu->putlog(2, "CSSP -> $%08x", data);
        !           129:                return data;
        !           130: 
        !           131:         default:
        !           132:                break;
        !           133:        }
        !           134:        putlog(0, "未実装読み込み $%08x", addr);
        !           135:        return 0xffffffff;
        !           136: }
        !           137: 
        !           138: uint64
        !           139: CMMUDevice::Write32(uint32 addr, uint32 data)
        !           140: {
        !           141:        uint32 id = (addr >> 12) & 0xff;
        !           142: 
        !           143:        m88200 *cmmu = GetCMMU(id);
        !           144:        if (cmmu == NULL) {
        !           145:                putlog(3, "未搭載 CMMU[%d] 書き込み $%08x <- $%08x", id, addr, data);
        !           146:                return 0;
        !           147:        }
        !           148: 
        !           149:        uint32 offset = Decoder(addr);
        !           150:        uint n;
        !           151:        switch (offset) {
        !           152:         case IDR:
        !           153:         {
        !           154:                uint32 newid = data >> 24;
        !           155:                if (id != newid) {
        !           156:                        cmmu->putlog(1, "ID 更新 $%02x", newid);
        !           157:                        cmmu->SetID(newid);
        !           158:                } else {
        !           159:                        cmmu->putlog(2, "IDR 書き込み(ID変更なし) <- $%08x", data);
        !           160:                }
        !           161:                return 0;
        !           162:         }
        !           163: 
        !           164:         case SCR:
        !           165:                cmmu->SetSCR(data);
        !           166:                return 0;
        !           167: 
        !           168:         case SSR:
        !           169:                cmmu->putlog(1, "SSR  <- $%08x", data);
        !           170:                cmmu->SetSSR(data);
        !           171:                return 0;
        !           172: 
        !           173:         case SAR:
        !           174:                cmmu->putlog(2, "SAR  <- $%08x", data);
        !           175:                cmmu->SetSAR(data);
        !           176:                return 0;
        !           177: 
        !           178:         case SCTR:
        !           179:                cmmu->SetSCTR(data);
        !           180:                return 0;
        !           181: 
        !           182:         case PFSR:
        !           183:                cmmu->SetPFSR(data);
        !           184:                return 0;
        !           185: 
        !           186:         case PFAR:
        !           187:                cmmu->SetPFAR(data);
        !           188:                return 0;
        !           189: 
        !           190:         case SAPR:
        !           191:                cmmu->SetSAPR(data);
        !           192:                return 0;
        !           193: 
        !           194:         case UAPR:
        !           195:                cmmu->SetUAPR(data);
        !           196:                return 0;
        !           197: 
        !           198:         case BWP0 ... BWP7:
        !           199:                n = (offset - BWP0) / 4;
        !           200:                assert(n < 8);
        !           201:                cmmu->SetBATC(n, data);
        !           202:                return 0;
        !           203: 
        !           204:         case CDP0 ... CDP3:
        !           205:         case CTP0 ... CTP3:
        !           206:                break;
        !           207: 
        !           208:         case CSSP:
        !           209:                cmmu->SetCSSP(data);
        !           210:                return 0;
        !           211: 
        !           212:         default:
        !           213:                break;
        !           214:        }
        !           215:        putlog(0, "未実装書き込み $%08x <- $%08x", addr, data);
        !           216:        PANIC(" ");
        !           217:        return 0;
        !           218: }
        !           219: 
        !           220: // Peek8() の下請け。32ビットで処理して後でバイトに分割するほうが楽。
        !           221: uint32
        !           222: CMMUDevice::Peek32(uint32 addr) const
        !           223: {
        !           224:        uint32 id = (addr >> 12) & 0xff;
        !           225: 
        !           226:        m88200 *cmmu = GetCMMU(id);
        !           227:        if (cmmu == NULL) {
        !           228:                return 0xffffffff;
        !           229:        }
        !           230: 
        !           231:        uint32 offset = Decoder(addr);
        !           232:        switch (offset) {
        !           233:         case IDR:
        !           234:                return cmmu->GetIDR();
        !           235: 
        !           236:         case SCR:
        !           237:                return cmmu->GetSCR();
        !           238: 
        !           239:         case SSR:
        !           240:                return cmmu->GetSSR();
        !           241: 
        !           242:         case SAR:
        !           243:                return cmmu->GetSAR();
        !           244: 
        !           245:         case SCTR:
        !           246:                return cmmu->GetSCTR();
        !           247: 
        !           248:         case PFSR:
        !           249:                return cmmu->GetPFSR();
        !           250: 
        !           251:         case PFAR:
        !           252:                return cmmu->GetPFAR();
        !           253: 
        !           254:         case SAPR:
        !           255:                return cmmu->GetSAPR();
        !           256: 
        !           257:         case UAPR:
        !           258:                return cmmu->GetUAPR();
        !           259: 
        !           260:         case BWP0 ... BWP7:
        !           261:                return 0xffffffff;
        !           262: 
        !           263:         case CDP0 ... CDP3:
        !           264:         case CTP0 ... CTP3:
        !           265:                break;
        !           266: 
        !           267:         case CSSP:
        !           268:                return cmmu->GetCSSP();
        !           269: 
        !           270:         default:
        !           271:                break;
        !           272:        }
        !           273:        return 0xffffffff;
        !           274: }
        !           275: 
        !           276: uint64
        !           277: CMMUDevice::Peek8(uint32 addr)
        !           278: {
        !           279:        uint32 data = Peek32(addr & ~3U);
        !           280:        switch (addr & 3) {
        !           281:         case 0:
        !           282:                return data >> 24;
        !           283:         case 1:
        !           284:                return (data >> 16) & 0xff;
        !           285:         case 2:
        !           286:                return (data >>  8) & 0xff;
        !           287:         case 3:
        !           288:                return data & 0xff;
        !           289:        }
        !           290:        __unreachable();
        !           291: }

unix.superglobalmegacorp.com

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