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

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2018 [email protected]
        !             4: //
        !             5: 
        !             6: #include "crtc2.h"
        !             7: #include "renderer.h"
        !             8: 
        !             9: CRTC2Device::CRTC2Device()
        !            10: {
        !            11:        logname = "crtc2";
        !            12:        devname = "CRTC2";
        !            13:        devaddr = 0xd1000000;
        !            14: 
        !            15:        vdisp_event.dev = this;
        !            16:        vdisp_event.func = (DeviceCallback_t)&CRTC2Device::VDispCallback;
        !            17:        vdisp_event.name = "CRTC2 V-DISP";
        !            18: }
        !            19: 
        !            20: CRTC2Device::~CRTC2Device()
        !            21: {
        !            22: }
        !            23: 
        !            24: void
        !            25: CRTC2Device::ResetHard()
        !            26: {
        !            27:        // リセット信号で初期化されるレジスタ (他は維持)
        !            28:        reg[30] = 0;
        !            29:        reg[31] = 0;
        !            30:        reg[32] = 0;
        !            31: 
        !            32:        // 未確認
        !            33:        ar = 0;
        !            34: 
        !            35:        // XXX 適当
        !            36:        // すぐに垂直帰線期間を開始する
        !            37:        vdisp_event.time = 0;
        !            38:        vdisp_event.code = 1;
        !            39:        gScheduler->AddEvent(&vdisp_event);
        !            40: }
        !            41: 
        !            42: uint64
        !            43: CRTC2Device::Read8(uint32 addr)
        !            44: {
        !            45:        uint32 an = addr - devaddr;
        !            46:        uint32 data;
        !            47: 
        !            48:        switch (an) {
        !            49:         case 0:        // アドレスレジスタ
        !            50:                // アドレスレジスタは書き込み専用
        !            51:                // XXX 何が読めるか
        !            52:                data = 0xff;
        !            53:                putlog(1, "書き込み専用レジスタ AR の読み出し");
        !            54:                break;
        !            55: 
        !            56:         case 1:        // データレジスタ
        !            57:                switch (ar) {
        !            58:                 case 12 ... 25:        // 読み出し可能
        !            59:                 case 28 ... 31:
        !            60:                 case 33:
        !            61:                 case 36 ... 39:
        !            62:                        data = reg[ar];
        !            63:                        putlog(2, "R%02d -> $%02x", ar, data);
        !            64:                        break;
        !            65: 
        !            66:                 case 40 ... 63:        // 範囲外
        !            67:                        // 未使用レジスタの読み出しは $00 (p.17)
        !            68:                        data = 0;
        !            69:                        putlog(1, "未使用レジスタ読み込み R%02d", ar);
        !            70:                        break;
        !            71: 
        !            72:                 default:                       // 書き込み専用レジスタ
        !            73:                        // 読み出しは 0 になる (p.112)
        !            74:                        data = 0;
        !            75:                        putlog(1, "書き込み専用レジスタ R%02d の読み出し", ar);
        !            76:                        break;
        !            77:                }
        !            78:                break;
        !            79: 
        !            80:         default:
        !            81:                data = 0xff;
        !            82:                putlog(0, "未実装バイト読み込み $%08x", addr);
        !            83:                break;
        !            84:        }
        !            85:        return data;
        !            86: }
        !            87: 
        !            88: uint64
        !            89: CRTC2Device::Read16(uint32 addr)
        !            90: {
        !            91:        putlog(0, "未実装ワード読み込み $%08x", addr);
        !            92:        return 0xffff;
        !            93: }
        !            94: 
        !            95: uint64
        !            96: CRTC2Device::Read32(uint32 addr)
        !            97: {
        !            98:        putlog(0, "未実装ロング読み込み $%08x", addr);
        !            99:        return 0xffffffff;
        !           100: }
        !           101: 
        !           102: uint64
        !           103: CRTC2Device::Write8(uint32 addr, uint32 data)
        !           104: {
        !           105:        uint32 an = addr - devaddr;
        !           106:        switch (an) {
        !           107:         case 0:        // アドレスレジスタ
        !           108:                ar = data & 0x3f;
        !           109:                putlog(3, "アドレスレジスタ <- $%02x", ar);
        !           110:                return 0;
        !           111: 
        !           112:         case 1:        // データレジスタ
        !           113:                switch (ar) {
        !           114:                 case 16 ... 17:        // 読み出し専用レジスタ
        !           115:                 case 28:
        !           116:                        putlog(1, "読み出し専用レジスタへの書き込み R%02d <- $%02x",
        !           117:                                ar, data);
        !           118:                        break;
        !           119: 
        !           120:                 case 40 ... 63:        // 範囲外
        !           121:                        putlog(1, "未使用レジスタ書き込み R%02d <- $%02x", ar, data);
        !           122:                        break;
        !           123: 
        !           124:                 default:                       // 書き込み可能レジスタ
        !           125:                        reg[ar] = data;
        !           126:                        putlog(2, "R%02d <- $%02x", ar, data);
        !           127:                        break;
        !           128:                }
        !           129:                return 0;
        !           130: 
        !           131:         default:
        !           132:                putlog(3, "未実装バイト書き込み $%08x <- %02x", addr, data);
        !           133:                return 0;
        !           134:        }
        !           135: }
        !           136: 
        !           137: uint64
        !           138: CRTC2Device::Write16(uint32 addr, uint32 data)
        !           139: {
        !           140:        putlog(0, "未実装ワード書き込み $%08x <- %04x", addr, data);
        !           141:        return 0;
        !           142: }
        !           143: 
        !           144: uint64
        !           145: CRTC2Device::Write32(uint32 addr, uint32 data)
        !           146: {
        !           147:        putlog(0, "未実装ロング書き込み $%08x <- %08x", addr, data);
        !           148:        return 0;
        !           149: }
        !           150: 
        !           151: uint64
        !           152: CRTC2Device::Peek8(uint32 addr)
        !           153: {
        !           154:        uint32 an = addr - devaddr;
        !           155:        switch (an) {
        !           156:         case 0:        // アドレスレジスタ
        !           157:                return ar;
        !           158: 
        !           159:         case 1:        // データレジスタ
        !           160:                return reg[ar];
        !           161: 
        !           162:         default:
        !           163:                return 0xff;
        !           164:        }
        !           165: }
        !           166: 
        !           167: // 垂直表示・帰線イベント
        !           168: // arg == 1 なら表示期間開始、arg == 0 なら帰線期間開始。
        !           169: void
        !           170: CRTC2Device::VDispCallback(int arg)
        !           171: {
        !           172:        // 今はここで1画面まるごと作成
        !           173:        if (arg) {
        !           174:                // Render に作画指示
        !           175:                gRenderer->Render();
        !           176:        }
        !           177: 
        !           178:        // 次のタイミングを計算
        !           179:        // XXX まだ CRTC から計算していない
        !           180:        if (arg) {
        !           181:                // 垂直表示期間
        !           182:                vdisp_event.time = 16234.496_usec;      // 1024*Ht
        !           183:        } else {
        !           184:                // 垂直帰線期間
        !           185:                vdisp_event.time = 507.328_usec;        // 32*Ht
        !           186:        }
        !           187:        vdisp_event.code = 1 - arg;
        !           188:        gScheduler->AddEvent(&vdisp_event);
        !           189: }

unix.superglobalmegacorp.com

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