Annotation of nono/vm/videoctlr.cpp, revision 1.1.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.