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

1.1       root        1: //
                      2: // nono
1.1.1.4   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
1.1.1.8   root        7: //
                      8: // CRTC-II (HD6445)
                      9: //
                     10: 
1.1       root       11: #include "crtc2.h"
                     12: #include "renderer.h"
1.1.1.8   root       13: #include "scheduler.h"
1.1       root       14: 
1.1.1.8   root       15: // コンストラクタ
1.1       root       16: CRTC2Device::CRTC2Device()
1.1.1.10  root       17:        : inherited(OBJ_CRTC2)
1.1       root       18: {
1.1.1.8   root       19:        vdisp_event.func = ToEventCallback(&CRTC2Device::VDispCallback);
                     20:        vdisp_event.Regist("CRTC2 V-DISP");
1.1       root       21: }
                     22: 
1.1.1.8   root       23: // デストラクタ
1.1       root       24: CRTC2Device::~CRTC2Device()
                     25: {
1.1.1.10  root       26: }
                     27: 
                     28: // 初期化
                     29: bool
                     30: CRTC2Device::Init()
                     31: {
                     32:        if (inherited::Init() == false) {
                     33:                return false;
                     34:        }
                     35: 
                     36:        renderer = GetRenderer();
                     37: 
                     38:        return true;
1.1       root       39: }
                     40: 
1.1.1.8   root       41: // リセット
1.1       root       42: void
1.1.1.8   root       43: CRTC2Device::ResetHard(bool poweron)
1.1       root       44: {
                     45:        // リセット信号で初期化されるレジスタ (他は維持)
                     46:        reg[30] = 0;
                     47:        reg[31] = 0;
                     48:        reg[32] = 0;
                     49: 
                     50:        // 未確認
                     51:        ar = 0;
                     52: 
                     53:        // XXX 適当
                     54:        // すぐに垂直帰線期間を開始する
                     55:        vdisp_event.time = 0;
                     56:        vdisp_event.code = 1;
1.1.1.10  root       57:        scheduler->RestartEvent(vdisp_event);
1.1       root       58: }
                     59: 
1.1.1.11! root       60: busdata
1.1.1.6   root       61: CRTC2Device::Read(uint32 offset)
1.1       root       62: {
                     63:        uint32 data;
                     64: 
1.1.1.6   root       65:        switch (offset) {
1.1       root       66:         case 0:        // アドレスレジスタ
                     67:                // アドレスレジスタは書き込み専用
                     68:                // XXX 何が読めるか
                     69:                data = 0xff;
1.1.1.9   root       70:                putlog(1, "Read write-only register AR");
1.1       root       71:                break;
                     72: 
                     73:         case 1:        // データレジスタ
                     74:                switch (ar) {
                     75:                 case 12 ... 25:        // 読み出し可能
                     76:                 case 28 ... 31:
                     77:                 case 33:
                     78:                 case 36 ... 39:
                     79:                        data = reg[ar];
                     80:                        putlog(2, "R%02d -> $%02x", ar, data);
                     81:                        break;
                     82: 
                     83:                 case 40 ... 63:        // 範囲外
                     84:                        // 未使用レジスタの読み出しは $00 (p.17)
                     85:                        data = 0;
1.1.1.9   root       86:                        putlog(1, "Read unused register R%02d", ar);
1.1       root       87:                        break;
                     88: 
                     89:                 default:                       // 書き込み専用レジスタ
                     90:                        // 読み出しは 0 になる (p.112)
                     91:                        data = 0;
1.1.1.9   root       92:                        putlog(1, "Read write-only register R%02d", ar);
1.1       root       93:                        break;
                     94:                }
                     95:                break;
                     96: 
                     97:         default:
1.1.1.10  root       98:                VMPANIC("corrupted offset=%d", offset);
1.1       root       99:        }
1.1.1.11! root      100: 
        !           101:        busdata bd = data;
        !           102:        // XXX wait?
        !           103:        return bd;
1.1       root      104: }
                    105: 
1.1.1.11! root      106: busdata
1.1.1.6   root      107: CRTC2Device::Write(uint32 offset, uint32 data)
1.1       root      108: {
1.1.1.6   root      109:        switch (offset) {
1.1       root      110:         case 0:        // アドレスレジスタ
                    111:                ar = data & 0x3f;
1.1.1.9   root      112:                putlog(3, "Address Register <- $%02x", ar);
1.1.1.11! root      113:                break;
1.1       root      114: 
                    115:         case 1:        // データレジスタ
                    116:                switch (ar) {
                    117:                 case 16 ... 17:        // 読み出し専用レジスタ
                    118:                 case 28:
1.1.1.9   root      119:                        putlog(1, "Write read-only register R%02d <- $%02x", ar, data);
1.1       root      120:                        break;
                    121: 
                    122:                 case 40 ... 63:        // 範囲外
1.1.1.9   root      123:                        putlog(1, "Write unused register R%02d <- $%02x", ar, data);
1.1       root      124:                        break;
                    125: 
                    126:                 default:                       // 書き込み可能レジスタ
                    127:                        reg[ar] = data;
                    128:                        putlog(2, "R%02d <- $%02x", ar, data);
                    129:                        break;
                    130:                }
1.1.1.11! root      131:                break;
1.1       root      132: 
                    133:         default:
1.1.1.10  root      134:                VMPANIC("corrupted offset=%d", offset);
1.1.1.11! root      135:                break;
1.1       root      136:        }
1.1.1.11! root      137: 
        !           138:        // XXX wait?
        !           139:        return 0;
1.1       root      140: }
                    141: 
1.1.1.11! root      142: busdata
1.1.1.6   root      143: CRTC2Device::Peek(uint32 offset)
1.1       root      144: {
1.1.1.6   root      145:        switch (offset) {
1.1       root      146:         case 0:        // アドレスレジスタ
                    147:                return ar;
                    148: 
                    149:         case 1:        // データレジスタ
                    150:                return reg[ar];
                    151: 
                    152:         default:
1.1.1.10  root      153:                return 0xff;
1.1       root      154:        }
                    155: }
                    156: 
                    157: // 垂直表示・帰線イベント
1.1.1.5   root      158: // ev.code が 1 なら表示期間開始(V-disp)、0 なら帰線期間開始(V-blank)。
1.1       root      159: void
1.1.1.5   root      160: CRTC2Device::VDispCallback(Event& ev)
1.1       root      161: {
1.1.1.5   root      162:        int& vdisp = ev.code;
                    163: 
1.1       root      164:        // 今はここで1画面まるごと作成
1.1.1.5   root      165:        if (vdisp) {
1.1       root      166:                // Render に作画指示
1.1.1.10  root      167:                renderer->Render();
1.1       root      168:        }
                    169: 
                    170:        // 次のタイミングを計算
                    171:        // XXX まだ CRTC から計算していない
1.1.1.5   root      172:        if (vdisp) {
1.1       root      173:                // 垂直表示期間
1.1.1.5   root      174:                ev.time = 16234.496_usec;       // 1024*Ht
                    175:                ev.code = 0;
1.1       root      176:        } else {
                    177:                // 垂直帰線期間
1.1.1.5   root      178:                ev.time = 507.328_usec;         // 32*Ht
                    179:                ev.code = 1;
1.1       root      180:        }
1.1.1.10  root      181:        scheduler->StartEvent(ev);
1.1       root      182: }

unix.superglobalmegacorp.com

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