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

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2017 [email protected]
                      4: //
                      5: 
                      6: #include "sysport.h"
                      7: #include "sram.h"
                      8: 
                      9: SysportDevice::SysportDevice()
                     10: {
                     11:        logname = "sysport";
                     12:        devname = "Sysport";
                     13:        devaddr = baseaddr;
                     14:        devlen  = 0x2000;
                     15: }
                     16: 
                     17: SysportDevice::~SysportDevice()
                     18: {
                     19: }
                     20: 
1.1.1.2 ! root       21: // アドレスデコーダ
        !            22: inline uint64
        !            23: SysportDevice::Decoder(uint32 addr) const
        !            24: {
        !            25:        // 折り返しは?
        !            26:        addr -= baseaddr;
        !            27: 
        !            28:        // 偶数アドレスはバスエラー?
        !            29:        if ((addr & 1) == 0)
        !            30:                return (uint64)-1;
        !            31: 
        !            32:        return addr >> 1;
        !            33: }
        !            34: 
1.1       root       35: uint64
                     36: SysportDevice::Read8(uint32 addr)
                     37: {
                     38:        uint32 data;
                     39: 
1.1.1.2 ! root       40:        switch (Decoder(addr)) {
        !            41:         default:
        !            42:                return (uint64)-1;
1.1       root       43: 
                     44:         case SYSPORT::CONTRAST:
                     45:                data = 0xf0 | sysport.contrast;
                     46:                break;
                     47:         case SYSPORT::SCOPE3D:
                     48:                data = 0xff;
                     49:                break;
                     50:         case SYSPORT::IMAGEUNIT:
                     51:                data = 0xff;
                     52:                break;
                     53:         case SYSPORT::KEY:
1.1.1.2 ! root       54:                // キーボードは接続されてることにする
        !            55:                data = 0x08;
1.1       root       56:                break;
                     57:         case SYSPORT::WAIT:
                     58:                data = 0xff;
                     59:                break;
                     60:         case SYSPORT::MPU:
                     61:                data = 0xdc;
                     62:                break;
                     63:         case SYSPORT::SRAMWP:
                     64:                data = 0xff;
                     65:                break;
                     66:        }
                     67:        putlog(1, "$%06X -> $%02x", addr, data);
                     68:        return data;
                     69: }
                     70: 
                     71: uint64
                     72: SysportDevice::Read16(uint32 addr)
                     73: {
                     74:        return (0xff00 | Read8(addr + 1));
                     75: }
                     76: 
                     77: uint64
                     78: SysportDevice::Write8(uint32 addr, uint32 data)
                     79: {
1.1.1.2 ! root       80:        switch (Decoder(addr)) {
        !            81:         default:
1.1       root       82:                return (uint64)-1;
                     83: 
                     84:         case SYSPORT::CONTRAST:
                     85:                sysport.contrast = data & 15;
                     86:                break;
                     87: 
                     88:         case SYSPORT::SCOPE3D:
                     89:         case SYSPORT::IMAGEUNIT:
                     90:                break;
                     91: 
                     92:         case SYSPORT::KEY:
                     93:                putlog(0, "$E8E007 未サポート書き込み %02x", data);
                     94:                break;
                     95: 
                     96:         case SYSPORT::WAIT:
                     97:                // 設定値で保持
                     98:                sysport.rom_wait = data >> 4;
                     99:                sysport.ram_wait = data;
                    100:                break;
                    101: 
                    102:         case SYSPORT::MPU:
                    103:                break;
                    104: 
                    105:         case SYSPORT::SRAMWP:
                    106:                if (data == 0x31) {
                    107:                        gSRAM->write_enable(true);
                    108:                } else {
                    109:                        gSRAM->write_enable(false);
                    110:                }
                    111:                break;
                    112: 
                    113:         case SYSPORT::POWEROFF:
                    114:                putlog(0, "$E8E00F (POWEROFF) 未サポート書き込み %02x", data);
                    115:                break;
                    116:        }
                    117:        return 0;
                    118: }
                    119: 
                    120: uint64
                    121: SysportDevice::Write16(uint32 addr, uint32 data)
                    122: {
                    123:        return Write8(addr + 1, data & 0xff);
                    124: }
                    125: 
                    126: uint64
                    127: SysportDevice::Peek8(uint32 addr)
                    128: {
                    129:        uint32 data;
                    130: 
1.1.1.2 ! root      131:        switch (Decoder(addr)) {
1.1       root      132:         case SYSPORT::CONTRAST:
                    133:                data = 0xf0 | sysport.contrast;
                    134:                break;
                    135:         case SYSPORT::SCOPE3D:
                    136:                data = 0xff;
                    137:                break;
                    138:         case SYSPORT::IMAGEUNIT:
                    139:                data = 0xff;
                    140:                break;
                    141:         case SYSPORT::KEY:
                    142:                data = 0xff;
                    143:                break;
                    144:         case SYSPORT::WAIT:
                    145:                data = 0xff;
                    146:                break;
                    147:         case SYSPORT::MPU:
                    148:                data = 0xdc;
                    149:                break;
                    150:         case SYSPORT::SRAMWP:
                    151:                data = 0xff;
                    152:                break;
                    153:         default:
                    154:                data = 0xff;
                    155:                break;
                    156:        }
                    157:        return data;
                    158: }

unix.superglobalmegacorp.com

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