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

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2017 [email protected]
                      4: //
                      5: 
                      6: #include "vicon.h"
                      7: 
1.1.1.2 ! root        8: std::unique_ptr<ViconDevice> gVicon;
1.1       root        9: 
                     10: ViconDevice::ViconDevice()
                     11: {
                     12:        logname = "vicon";
                     13:        devname = "Vicon";
                     14:        devaddr = baseaddr;
                     15:        devlen  = 0x2000;
                     16: }
                     17: 
                     18: ViconDevice::~ViconDevice()
                     19: {
                     20: }
                     21: 
1.1.1.2 ! root       22: // アドレスデコーダ
        !            23: inline uint64
        !            24: ViconDevice::Decoder(uint32 addr) const
        !            25: {
        !            26:        // 折り返しは?
        !            27:        return addr - baseaddr;
        !            28: }
        !            29: 
1.1       root       30: uint64
                     31: ViconDevice::Read8(uint32 addr)
                     32: {
1.1.1.2 ! root       33:        uint32 offset = Decoder(addr);
1.1       root       34:        uint32 data;
                     35: 
                     36:        if (offset < 0x400) {
                     37:                // パレット
                     38:                return palette.b[HB(offset)];
                     39:        }
                     40: 
                     41:        // レジスタ
                     42:        switch (offset) {
                     43:         case 0x401:
                     44:                data = read_r0();
                     45:                break;
                     46: 
                     47:         case 0x500:
                     48:                data = read_r1H();
                     49:                break;
                     50:         case 0x501:
                     51:                data = read_r1L();
                     52:                break;
                     53: 
                     54:         case 0x600:
                     55:                data = read_r2H();
                     56:                break;
                     57:         case 0x601:
                     58:                data = read_r2L();
                     59:                break;
                     60: 
                     61:         default:
                     62:                PANIC("Vicon $%06x.B 未実装読み込み", addr);
                     63:                break;
                     64:        }
                     65:        return data;
                     66: }
                     67: 
                     68: uint64
                     69: ViconDevice::Read16(uint32 addr)
                     70: {
1.1.1.2 ! root       71:        uint32 offset = Decoder(addr);
1.1       root       72:        uint32 data;
                     73: 
                     74:        if (offset < 0x400) {
                     75:                return palette.w[offset / 2];
                     76:        }
                     77: 
                     78:        // レジスタ
                     79:        switch (offset) {
                     80:         case 0x400:
                     81:                data = read_r0();
                     82:                break;
                     83: 
                     84:         case 0x500:
                     85:                data = (read_r1H() << 8) | read_r1L();
                     86:                break;
                     87: 
                     88:         case 0x600:
                     89:                data = (read_r2H() << 8) | read_r2L();
                     90:                break;
                     91: 
                     92:         default:
                     93:                PANIC("Vicon $%06x.W 未実装読み込み", addr);
                     94:                break;
                     95:        }
                     96:        return data;
                     97: }
                     98: 
                     99: uint64
                    100: ViconDevice::Write8(uint32 addr, uint32 data)
                    101: {
1.1.1.2 ! root      102:        uint32 offset = Decoder(addr);
1.1       root      103: 
                    104:        if (offset < 0x400) {
                    105:                putlog(3, "パレット $%06x.B <- $%02x", addr, data);
                    106:                palette.b[HB(offset)] = data;
                    107:                return 0;
                    108:        }
                    109: 
                    110:        // レジスタ
                    111:        switch (offset) {
                    112:         case 0x400:
                    113:                break;
                    114:         case 0x401:
                    115:                write_r0(data);
                    116:                break;
                    117: 
                    118:         case 0x500:
                    119:                write_r1H(data);
                    120:                break;
                    121:         case 0x501:
                    122:                write_r1L(data);
                    123:                break;
                    124: 
                    125:         case 0x600:
                    126:                write_r2H(data);
                    127:                break;
                    128:         case 0x601:
                    129:                write_r2L(data);
                    130:                break;
                    131: 
                    132:         default:
                    133:                PANIC("Vicon $%06x.B <- $%02x 未実装書き込み", addr, data);
                    134:                break;
                    135:        }
                    136:        return 0;
                    137: }
                    138: 
                    139: uint64
                    140: ViconDevice::Write16(uint32 addr, uint32 data)
                    141: {
1.1.1.2 ! root      142:        uint32 offset = Decoder(addr);
1.1       root      143: 
                    144:        if (offset < 0x400) {
                    145:                if (offset < 0x200) {
                    146:                        putlog(3, "Gパレット $%06x [$%02x] <- $%04x",
                    147:                                addr, offset / 2, data);
                    148:                } else {
                    149:                        putlog(3, "Tパレット $%06x [$%02x] <- $%04x",
                    150:                                addr, (offset - 0x200) / 2, data);
                    151:                }
                    152:                palette.w[offset / 2] = data;
                    153:                return 0;
                    154:        }
                    155: 
                    156:        // レジスタ
                    157:        switch (offset) {
                    158:         case 0x400:
                    159:                write_r0(data);
                    160:                break;
                    161: 
                    162:         case 0x500:
                    163:                write_r1H(data >> 8);
                    164:                write_r1L(data & 0xff);
                    165:                break;
                    166: 
                    167:         case 0x600:
                    168:                write_r2H(data >> 8);
                    169:                write_r2L(data & 0xff);
                    170:                break;
                    171: 
                    172:         default:
                    173:                PANIC("Vicon $%06x.W <- $%04x 未実装書き込み", addr, data);
                    174:                break;
                    175:        }
                    176:        return 0;
                    177: }
                    178: 
                    179: uint64
                    180: ViconDevice::Peek8(uint32 addr)
                    181: {
1.1.1.2 ! root      182:        uint32 offset = Decoder(addr);
1.1       root      183:        uint32 data;
                    184: 
                    185:        if (offset < 0x400) {
                    186:                return palette.b[HB(offset)];
                    187:        }
                    188: 
                    189:        switch (offset) {
                    190:         case 0x401:
                    191:                data = read_r0();
                    192:                break;
                    193: 
                    194:         case 0x500:
                    195:                data = read_r1H();
                    196:                break;
                    197:         case 0x501:
                    198:                data = read_r1L();
                    199:                break;
                    200: 
                    201:         case 0x600:
                    202:                data = read_r2H();
                    203:                break;
                    204:         case 0x601:
                    205:                data = read_r2L();
                    206:                break;
                    207: 
                    208:         default:
                    209:                data = 0xff;
                    210:                break;
                    211:        }
                    212:        return data;
                    213: }
                    214: 
                    215: uint32
1.1.1.2 ! root      216: ViconDevice::read_r0() const
1.1       root      217: {
                    218:        return vicon.r0;
                    219: }
                    220: 
                    221: uint32
1.1.1.2 ! root      222: ViconDevice::read_r1H() const
1.1       root      223: {
                    224:        return vicon.r1 >> 8;
                    225: }
                    226: 
                    227: uint32
1.1.1.2 ! root      228: ViconDevice::read_r1L() const
1.1       root      229: {
                    230:        return vicon.r1 & 0xff;
                    231: }
                    232: 
                    233: uint32
1.1.1.2 ! root      234: ViconDevice::read_r2H() const
1.1       root      235: {
                    236:        return vicon.r2 >> 8;
                    237: }
                    238: 
                    239: uint32
1.1.1.2 ! root      240: ViconDevice::read_r2L() const
1.1       root      241: {
                    242:        return vicon.r2 & 0xff;
                    243: }
                    244: 
                    245: void
                    246: ViconDevice::write_r0(uint32 data)
                    247: {
                    248:        putlog(0, "R0 <- $%02x 未実装書き込み", data);
                    249:        vicon.r0 = data & 3;
                    250: }
                    251: 
                    252: void
                    253: ViconDevice::write_r1H(uint32 data)
                    254: {
                    255:        putlog(0, "R1(H) <- $%02x 未実装書き込み", data);
                    256:        vicon.r1 &= 0x00ff;
                    257:        vicon.r1 |= (data & 0x3f00);
                    258: }
                    259: 
                    260: void
                    261: ViconDevice::write_r1L(uint32 data)
                    262: {
                    263:        putlog(0, "R1(L) <- $%02x 未実装書き込み", data);
                    264:        vicon.r1 &= 0xff00;
                    265:        vicon.r1 |= (data & 0x00ff);
                    266: }
                    267: 
                    268: void
                    269: ViconDevice::write_r2H(uint32 data)
                    270: {
                    271:        putlog(0, "R2(H) <- $%02x 未実装書き込み", data);
                    272:        vicon.r2 &= 0x00ff;
                    273:        vicon.r2 |= (data & 0xff00);
                    274: }
                    275: 
                    276: void
                    277: ViconDevice::write_r2L(uint32 data)
                    278: {
                    279:        putlog(0, "R2(L) <- $%02x 未実装書き込み", data);
                    280:        vicon.r2 &= 0xff00;
                    281:        vicon.r2 |= (data & 0x007f);
                    282: }

unix.superglobalmegacorp.com

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