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

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: 
1.1.1.8 ! root        7: //
        !             8: // システムポート
        !             9: //
        !            10: 
1.1       root       11: #include "sysport.h"
1.1.1.8 ! root       12: #include "keyboard.h"
        !            13: #include "mpu.h"
        !            14: #include "nmi.h"
1.1.1.4   root       15: #include "ram.h"
                     16: #include "romimg_x68k.h"
1.1       root       17: #include "sram.h"
                     18: 
1.1.1.8 ! root       19: // グローバル参照用
        !            20: SysportDevice *gSysport;
1.1.1.5   root       21: 
1.1.1.8 ! root       22: // コンストラクタ
1.1       root       23: SysportDevice::SysportDevice()
1.1.1.7   root       24:        : inherited("SystemPort")
1.1       root       25: {
1.1.1.7   root       26:        AddAlias("SysPort");
                     27: 
1.1       root       28:        devaddr = baseaddr;
                     29:        devlen  = 0x2000;
                     30: }
                     31: 
1.1.1.8 ! root       32: // デストラクタ
1.1       root       33: SysportDevice::~SysportDevice()
                     34: {
1.1.1.8 ! root       35:        gSysport = NULL;
1.1       root       36: }
                     37: 
1.1.1.8 ! root       38: // リセット
1.1.1.4   root       39: void
1.1.1.8 ! root       40: SysportDevice::ResetHard(bool poweron)
1.1.1.4   root       41: {
1.1.1.6   root       42:        sysport.contrast = 0;   // XXX 未調査
1.1.1.4   root       43:        sysport.ram_wait = 0;
                     44:        sysport.rom_wait = 0;
1.1.1.6   root       45:        sysport.key_ctrl = false;
1.1.1.4   root       46: }
                     47: 
1.1       root       48: uint64
1.1.1.5   root       49: SysportDevice::Read(uint32 offset)
1.1       root       50: {
                     51:        uint32 data;
                     52: 
1.1.1.5   root       53:        switch (offset) {
1.1       root       54:         case SYSPORT::CONTRAST:
                     55:                data = 0xf0 | sysport.contrast;
                     56:                break;
                     57:         case SYSPORT::SCOPE3D:
                     58:                data = 0xff;
                     59:                break;
                     60:         case SYSPORT::IMAGEUNIT:
                     61:                data = 0xff;
                     62:                break;
                     63:         case SYSPORT::KEY:
1.1.1.8 ! root       64:                // XXX bit3 以外は要実機確認
        !            65:                data = 0xf7;
        !            66:                if (gKeyboard->IsConnected()) {
        !            67:                        data |= 0x08;
        !            68:                }
1.1       root       69:                break;
                     70:         case SYSPORT::WAIT:
                     71:                data = 0xff;
                     72:                break;
                     73:         case SYSPORT::MPU:
                     74:                data = 0xdc;
                     75:                break;
                     76:         case SYSPORT::SRAMWP:
                     77:                data = 0xff;
                     78:                break;
1.1.1.3   root       79:         case SYSPORT::POWEROFF:
                     80:                data = 0xff;
                     81:                break;
                     82:         default:
                     83:                __unreachable();
1.1       root       84:        }
1.1.1.5   root       85:        putlog(1, "$%06X -> $%02x", gMPU->GetPaddr(), data);
1.1       root       86:        return data;
                     87: }
                     88: 
                     89: uint64
1.1.1.5   root       90: SysportDevice::Write(uint32 offset, uint32 data)
1.1       root       91: {
1.1.1.5   root       92:        switch (offset) {
1.1       root       93:         case SYSPORT::CONTRAST:
                     94:                sysport.contrast = data & 15;
                     95:                break;
                     96: 
                     97:         case SYSPORT::SCOPE3D:
                     98:         case SYSPORT::IMAGEUNIT:
                     99:                break;
                    100: 
                    101:         case SYSPORT::KEY:
1.1.1.3   root      102:                data &= 0x0e;
1.1.1.8 ! root      103:                // bit1
        !           104:                if ((data & 0x02)) {
1.1.1.3   root      105:                        putlog(0, "$E8E007 未サポート書き込み $%02x", data);
                    106:                }
1.1.1.8 ! root      107:                // bit2: NMI リセット
        !           108:                if ((data & 0x04)) {
        !           109:                        gNMI->NegateNMI();
        !           110:                }
1.1.1.6   root      111:                sysport.key_ctrl = (data & 0x08);
1.1       root      112:                break;
                    113: 
                    114:         case SYSPORT::WAIT:
1.1.1.4   root      115:         {
1.1       root      116:                // 設定値で保持
                    117:                sysport.rom_wait = data >> 4;
                    118:                sysport.ram_wait = data;
1.1.1.4   root      119: 
                    120:                // ROM に指示。常に設定値 + 2 でよい
                    121:                gIPLROM1->SetWait(sysport.rom_wait + 2);
                    122:                gIPLROM2->SetWait(sysport.rom_wait + 2);
                    123:                gCGROM->SetWait(sysport.rom_wait + 2);
                    124:                // RAM に指示。InsideOut p.124
                    125:                int wait = sysport.ram_wait;
                    126:                if (wait > 0)
                    127:                        wait += 2;
                    128:                gRAM->SetWait(wait);
1.1       root      129:                break;
1.1.1.4   root      130:         }
1.1       root      131: 
                    132:         case SYSPORT::MPU:
                    133:                break;
                    134: 
                    135:         case SYSPORT::SRAMWP:
                    136:                if (data == 0x31) {
                    137:                        gSRAM->write_enable(true);
                    138:                } else {
                    139:                        gSRAM->write_enable(false);
                    140:                }
                    141:                break;
                    142: 
                    143:         case SYSPORT::POWEROFF:
1.1.1.5   root      144:                putlog(0, "$e8e00f (POWEROFF) 未サポート書き込み %02x", data);
1.1       root      145:                break;
1.1.1.3   root      146: 
                    147:         default:
                    148:                __unreachable();
1.1       root      149:        }
                    150:        return 0;
                    151: }
                    152: 
                    153: uint64
1.1.1.5   root      154: SysportDevice::Peek(uint32 offset)
1.1       root      155: {
                    156:        uint32 data;
                    157: 
1.1.1.5   root      158:        switch (offset) {
1.1       root      159:         case SYSPORT::CONTRAST:
                    160:                data = 0xf0 | sysport.contrast;
                    161:                break;
                    162:         case SYSPORT::SCOPE3D:
                    163:                data = 0xff;
                    164:                break;
                    165:         case SYSPORT::IMAGEUNIT:
                    166:                data = 0xff;
                    167:                break;
                    168:         case SYSPORT::KEY:
1.1.1.8 ! root      169:                // XXX bit3 以外は要実機確認
        !           170:                data = 0xf7;
        !           171:                if (gKeyboard->IsConnected()) {
        !           172:                        data |= 0x08;
        !           173:                }
1.1       root      174:                break;
                    175:         case SYSPORT::WAIT:
                    176:                data = 0xff;
                    177:                break;
                    178:         case SYSPORT::MPU:
                    179:                data = 0xdc;
                    180:                break;
                    181:         case SYSPORT::SRAMWP:
                    182:                data = 0xff;
                    183:                break;
1.1.1.3   root      184:         case SYSPORT::POWEROFF:
1.1       root      185:                data = 0xff;
                    186:                break;
1.1.1.3   root      187:         default:
                    188:                __unreachable();
1.1       root      189:        }
                    190:        return data;
                    191: }

unix.superglobalmegacorp.com

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