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

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

unix.superglobalmegacorp.com

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