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

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

unix.superglobalmegacorp.com

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