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

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;
1.1.1.2 ! root       17:        vdisp_event.SetName("CRTC2 V-DISP");
1.1       root       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.