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

1.1       root        1: //
                      2: // nono
1.1.1.3   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
                      7: #include "sysport.h"
1.1.1.3   root        8: #include "mfp.h"
1.1.1.4   root        9: #include "ram.h"
                     10: #include "romimg_x68k.h"
1.1       root       11: #include "sram.h"
                     12: 
1.1.1.5   root       13: std::unique_ptr<SysportDevice> gSysport;
                     14: 
1.1       root       15: SysportDevice::SysportDevice()
1.1.1.7 ! root       16:        : inherited("SystemPort")
1.1       root       17: {
1.1.1.7 ! root       18:        AddAlias("SysPort");
        !            19: 
1.1       root       20:        devaddr = baseaddr;
                     21:        devlen  = 0x2000;
                     22: }
                     23: 
                     24: SysportDevice::~SysportDevice()
                     25: {
                     26: }
                     27: 
1.1.1.4   root       28: void
                     29: SysportDevice::ResetHard()
                     30: {
1.1.1.6   root       31:        sysport.contrast = 0;   // XXX 未調査
1.1.1.4   root       32:        sysport.ram_wait = 0;
                     33:        sysport.rom_wait = 0;
1.1.1.6   root       34:        sysport.key_ctrl = false;
1.1.1.4   root       35: }
                     36: 
1.1       root       37: uint64
1.1.1.5   root       38: SysportDevice::Read(uint32 offset)
1.1       root       39: {
                     40:        uint32 data;
                     41: 
1.1.1.5   root       42:        switch (offset) {
1.1       root       43:         case SYSPORT::CONTRAST:
                     44:                data = 0xf0 | sysport.contrast;
                     45:                break;
                     46:         case SYSPORT::SCOPE3D:
                     47:                data = 0xff;
                     48:                break;
                     49:         case SYSPORT::IMAGEUNIT:
                     50:                data = 0xff;
                     51:                break;
                     52:         case SYSPORT::KEY:
1.1.1.2   root       53:                // キーボードは接続されてることにする
                     54:                data = 0x08;
1.1       root       55:                break;
                     56:         case SYSPORT::WAIT:
                     57:                data = 0xff;
                     58:                break;
                     59:         case SYSPORT::MPU:
                     60:                data = 0xdc;
                     61:                break;
                     62:         case SYSPORT::SRAMWP:
                     63:                data = 0xff;
                     64:                break;
1.1.1.3   root       65:         case SYSPORT::POWEROFF:
                     66:                data = 0xff;
                     67:                break;
                     68:         default:
                     69:                __unreachable();
1.1       root       70:        }
1.1.1.5   root       71:        putlog(1, "$%06X -> $%02x", gMPU->GetPaddr(), data);
1.1       root       72:        return data;
                     73: }
                     74: 
                     75: uint64
1.1.1.5   root       76: SysportDevice::Write(uint32 offset, uint32 data)
1.1       root       77: {
1.1.1.5   root       78:        switch (offset) {
1.1       root       79:         case SYSPORT::CONTRAST:
                     80:                sysport.contrast = data & 15;
                     81:                break;
                     82: 
                     83:         case SYSPORT::SCOPE3D:
                     84:         case SYSPORT::IMAGEUNIT:
                     85:                break;
                     86: 
                     87:         case SYSPORT::KEY:
1.1.1.3   root       88:                data &= 0x0e;
                     89:                // bit1,2
                     90:                if ((data & 0x06)) {
                     91:                        putlog(0, "$E8E007 未サポート書き込み $%02x", data);
                     92:                }
1.1.1.6   root       93:                sysport.key_ctrl = (data & 0x08);
1.1       root       94:                break;
                     95: 
                     96:         case SYSPORT::WAIT:
1.1.1.4   root       97:         {
1.1       root       98:                // 設定値で保持
                     99:                sysport.rom_wait = data >> 4;
                    100:                sysport.ram_wait = data;
1.1.1.4   root      101: 
                    102:                // ROM に指示。常に設定値 + 2 でよい
                    103:                gIPLROM1->SetWait(sysport.rom_wait + 2);
                    104:                gIPLROM2->SetWait(sysport.rom_wait + 2);
                    105:                gCGROM->SetWait(sysport.rom_wait + 2);
                    106:                // RAM に指示。InsideOut p.124
                    107:                int wait = sysport.ram_wait;
                    108:                if (wait > 0)
                    109:                        wait += 2;
                    110:                gRAM->SetWait(wait);
1.1       root      111:                break;
1.1.1.4   root      112:         }
1.1       root      113: 
                    114:         case SYSPORT::MPU:
                    115:                break;
                    116: 
                    117:         case SYSPORT::SRAMWP:
                    118:                if (data == 0x31) {
                    119:                        gSRAM->write_enable(true);
                    120:                } else {
                    121:                        gSRAM->write_enable(false);
                    122:                }
                    123:                break;
                    124: 
                    125:         case SYSPORT::POWEROFF:
1.1.1.5   root      126:                putlog(0, "$e8e00f (POWEROFF) 未サポート書き込み %02x", data);
1.1       root      127:                break;
1.1.1.3   root      128: 
                    129:         default:
                    130:                __unreachable();
1.1       root      131:        }
                    132:        return 0;
                    133: }
                    134: 
                    135: uint64
1.1.1.5   root      136: SysportDevice::Peek(uint32 offset)
1.1       root      137: {
                    138:        uint32 data;
                    139: 
1.1.1.5   root      140:        switch (offset) {
1.1       root      141:         case SYSPORT::CONTRAST:
                    142:                data = 0xf0 | sysport.contrast;
                    143:                break;
                    144:         case SYSPORT::SCOPE3D:
                    145:                data = 0xff;
                    146:                break;
                    147:         case SYSPORT::IMAGEUNIT:
                    148:                data = 0xff;
                    149:                break;
                    150:         case SYSPORT::KEY:
                    151:                data = 0xff;
                    152:                break;
                    153:         case SYSPORT::WAIT:
                    154:                data = 0xff;
                    155:                break;
                    156:         case SYSPORT::MPU:
                    157:                data = 0xdc;
                    158:                break;
                    159:         case SYSPORT::SRAMWP:
                    160:                data = 0xff;
                    161:                break;
1.1.1.3   root      162:         case SYSPORT::POWEROFF:
1.1       root      163:                data = 0xff;
                    164:                break;
1.1.1.3   root      165:         default:
                    166:                __unreachable();
1.1       root      167:        }
                    168:        return data;
                    169: }

unix.superglobalmegacorp.com

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