Annotation of nono/vm/videoctlr.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: #include "videoctlr.h"
        !             8: 
        !             9: // e82000..e823ff パレット
        !            10: // e82400..e824ff R0(e82400.w) のミラー
        !            11: // e82500..e825ff R1(e82500.w) のミラー
        !            12: // e82600..e826ff R2(e82600.w) のミラー
        !            13: // e82700..e82fff $00 が読めるようだ
        !            14: // 以上の 4KB をミラー。
        !            15: 
        !            16: std::unique_ptr<VideoCtlrDevice> gVideoCtlr;
        !            17: 
        !            18: VideoCtlrDevice::VideoCtlrDevice()
        !            19: {
        !            20:        logname = "videoctlr";
        !            21:        devname = "VideoCtlr";
        !            22:        devaddr = baseaddr;
        !            23:        devlen  = 0x2000;
        !            24: }
        !            25: 
        !            26: VideoCtlrDevice::~VideoCtlrDevice()
        !            27: {
        !            28: }
        !            29: 
        !            30: // addr は何ワード目のポートかという意味になるので
        !            31: // $E82002 が addr=1 (番目のワード)。
        !            32: uint64
        !            33: VideoCtlrDevice::Read(uint32 addr)
        !            34: {
        !            35:        uint32 data;
        !            36: 
        !            37:        if (addr < 0x400 / 2) {                 // パレット
        !            38:                data = palette.w[addr];
        !            39: 
        !            40:        } else if (addr < 0x500 / 2) {  // $E82400 (R0)
        !            41:                data = videoctlr.r0;
        !            42: 
        !            43:        } else if (addr < 0x600 / 2) {  // $E82500 (R1)
        !            44:                data = videoctlr.r1;
        !            45: 
        !            46:        } else if (addr < 0x700 / 2) {  // $E82600 (R2)
        !            47:                data = videoctlr.r2;
        !            48: 
        !            49:        } else {                                                // それ以降は $00 が読めるようだ
        !            50:                data = 0;
        !            51:        }
        !            52: 
        !            53:        return data;
        !            54: }
        !            55: 
        !            56: uint64
        !            57: VideoCtlrDevice::Write(uint32 addr, uint32 data)
        !            58: {
        !            59:        if (addr < 0x400 / 2) {                 // パレット
        !            60:                putlog(3, "パレット $%06x.W <- $%04x", baseaddr + addr * 2, data);
        !            61:                palette.w[addr] = data;
        !            62: 
        !            63:        } else if (addr < 0x500 / 2) {  // $E82400 (R0)
        !            64:                SetR0(data);
        !            65: 
        !            66:        } else if (addr < 0x600 / 2) {  // $E82500 (R1)
        !            67:                SetR1(data);
        !            68: 
        !            69:        } else if (addr < 0x700 / 2) {  // $E82600 (R2)
        !            70:                SetR2(data);
        !            71: 
        !            72:        } else {                                        // それ以降はたぶん何も起きない?
        !            73:        }
        !            74: 
        !            75:        return 0;
        !            76: }
        !            77: 
        !            78: uint64
        !            79: VideoCtlrDevice::Peek(uint32 addr)
        !            80: {
        !            81:        uint32 data;
        !            82: 
        !            83:        if (addr < 0x400 / 2) {                 // パレット
        !            84:                data = palette.w[addr];
        !            85: 
        !            86:        } else if (addr < 0x500 / 2) {  // $E82400 (R0)
        !            87:                data = videoctlr.r0;
        !            88: 
        !            89:        } else if (addr < 0x600 / 2) {  // $E82500 (R1)
        !            90:                data = videoctlr.r1;
        !            91: 
        !            92:        } else if (addr < 0x700 / 2) {  // $E82600 (R2)
        !            93:                data = videoctlr.r2;
        !            94: 
        !            95:        } else {                                        // それ以降は $00 が読めるようだ
        !            96:                data = 0;
        !            97:        }
        !            98: 
        !            99:        return data;
        !           100: }
        !           101: 
        !           102: // R0 への書き込み
        !           103: void
        !           104: VideoCtlrDevice::SetR0(uint32 data)
        !           105: {
        !           106:        putlog(0, "R0 <- $%04x 未実装書き込み", data);
        !           107:        videoctlr.r0 = data & 3;
        !           108: }
        !           109: 
        !           110: // R1 への書き込み
        !           111: void
        !           112: VideoCtlrDevice::SetR1(uint32 data)
        !           113: {
        !           114:        putlog(0, "R1 <- $%04x 未実装書き込み", data);
        !           115:        videoctlr.r1 = data & 0x3fff;
        !           116: }
        !           117: 
        !           118: // R2 への書き込み
        !           119: void
        !           120: VideoCtlrDevice::SetR2(uint32 data)
        !           121: {
        !           122:        putlog(0, "R2 <- $%04x 未実装書き込み", data);
        !           123:        videoctlr.r2 = (data & 0xff7f);
        !           124: }

unix.superglobalmegacorp.com

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