Annotation of nono/vm/sio.cpp, revision 1.1.1.4

1.1       root        1: //
                      2: // nono
1.1.1.4 ! root        3: // Copyright (C) 2020 nono project
        !             4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
                      7: #include "sio.h"
                      8: #include "mpu.h"
                      9: 
                     10: //          IODevice
                     11: //              |
                     12: //              v
                     13: //        upd7201Device  (uPD7201 と Z8530 の共通部分)
                     14: //              |
                     15: //    +---------+----------+
                     16: //    v                    v
                     17: // SIODevice           SCCDevice
                     18: // (LUNA, uPD7201)     (X68030, Z8530)
                     19: 
1.1.1.3   root       20: std::unique_ptr<SIODevice> gSIO;
1.1       root       21: 
                     22: SIODevice::SIODevice()
                     23: {
                     24:        logname = "sio";
                     25:        devname = "SIO";
                     26:        devaddr = 0x51000000;
                     27: 
                     28:        cr.chan[0].desc = "Serial Console";
                     29:        cr.chan[1].desc = "Keyboard";
                     30: }
                     31: 
                     32: SIODevice::~SIODevice()
                     33: {
                     34: }
                     35: 
                     36: // 本体リセットスイッチによるリセット
                     37: void
                     38: SIODevice::ResetHard()
                     39: {
                     40:        // チップリセット
                     41:        Reset();
                     42: }
                     43: 
                     44: uint64
1.1.1.3   root       45: SIODevice::Read(uint32 addr)
1.1       root       46: {
                     47:        uint32 data;
                     48: 
1.1.1.3   root       49:        switch (addr) {
1.1       root       50:         case 0:
1.1.1.3   root       51:                data = ReadData(&cr.chan[0]);
1.1       root       52:                break;
                     53:         case 1:
                     54:                data = ReadCtrl(&cr.chan[0]);
                     55:                break;
                     56:         case 2:
1.1.1.3   root       57:                data = ReadData(&cr.chan[1]);
1.1       root       58:                break;
                     59:         case 3:
                     60:                data = ReadCtrl(&cr.chan[1]);
                     61:                break;
                     62:         default:
                     63:                __unreachable();
                     64:        }
                     65:        return data;
                     66: }
                     67: 
                     68: uint64
1.1.1.3   root       69: SIODevice::Write(uint32 addr, uint32 data)
1.1       root       70: {
1.1.1.3   root       71:        switch (addr) {
1.1       root       72:         case 0:
                     73:                WriteData(&cr.chan[0], data);
                     74:                return 0;
                     75: 
                     76:         case 1:
                     77:                WriteCtrl(&cr.chan[0], data);
                     78:                return 0;
                     79: 
                     80:         case 2:
                     81:                WriteData(&cr.chan[1], data);
                     82:                return 0;
                     83: 
                     84:         case 3:
                     85:                WriteCtrl(&cr.chan[1], data);
                     86:                return 0;
                     87:        }
                     88:        __unreachable();
                     89: }
                     90: 
                     91: uint64
1.1.1.3   root       92: SIODevice::Peek(uint32 addr)
1.1       root       93: {
1.1.1.3   root       94:        switch (addr) {
                     95:         case 0:
                     96:                return PeekData(&cr.chan[0]);
                     97: 
                     98:         case 1:
                     99:                return PeekCtrl(&cr.chan[0]);
                    100: 
                    101:         case 2:
                    102:                return PeekData(&cr.chan[1]);
                    103: 
                    104:         case 3:
                    105:                return PeekCtrl(&cr.chan[1]);
                    106:        }
                    107:        __unreachable();
1.1       root      108: }
                    109: 
                    110: // 割り込みを上げる
                    111: void
                    112: SIODevice::Interrupt()
                    113: {
                    114:        putlog(2, "Interrupt");
1.1.1.4 ! root      115:        gMPU->Interrupt(this, 6);
1.1       root      116: }

unix.superglobalmegacorp.com

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