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

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"
1.1.1.5   root        8: #include "interrupt.h"
1.1       root        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()
1.1.1.7 ! root       23:        : inherited("SIO")
1.1       root       24: {
                     25:        devaddr = 0x51000000;
                     26: 
                     27:        cr.chan[0].desc = "Serial Console";
                     28:        cr.chan[1].desc = "Keyboard";
1.1.1.7 ! root       29: 
        !            30:        // LUNA では SIO と呼ぶほうが通りがいい。
        !            31:        monitor.Regist(ID_MONITOR_SIO);
1.1       root       32: }
                     33: 
                     34: SIODevice::~SIODevice()
                     35: {
                     36: }
                     37: 
                     38: uint64
1.1.1.6   root       39: SIODevice::Read(uint32 offset)
1.1       root       40: {
                     41:        uint32 data;
                     42: 
1.1.1.6   root       43:        switch (offset) {
1.1       root       44:         case 0:
1.1.1.3   root       45:                data = ReadData(&cr.chan[0]);
1.1       root       46:                break;
                     47:         case 1:
                     48:                data = ReadCtrl(&cr.chan[0]);
                     49:                break;
                     50:         case 2:
1.1.1.3   root       51:                data = ReadData(&cr.chan[1]);
1.1       root       52:                break;
                     53:         case 3:
                     54:                data = ReadCtrl(&cr.chan[1]);
                     55:                break;
                     56:         default:
                     57:                __unreachable();
                     58:        }
                     59:        return data;
                     60: }
                     61: 
                     62: uint64
1.1.1.6   root       63: SIODevice::Write(uint32 offset, uint32 data)
1.1       root       64: {
1.1.1.6   root       65:        switch (offset) {
1.1       root       66:         case 0:
                     67:                WriteData(&cr.chan[0], data);
                     68:                return 0;
                     69: 
                     70:         case 1:
                     71:                WriteCtrl(&cr.chan[0], data);
                     72:                return 0;
                     73: 
                     74:         case 2:
                     75:                WriteData(&cr.chan[1], data);
                     76:                return 0;
                     77: 
                     78:         case 3:
                     79:                WriteCtrl(&cr.chan[1], data);
                     80:                return 0;
                     81:        }
                     82:        __unreachable();
                     83: }
                     84: 
                     85: uint64
1.1.1.6   root       86: SIODevice::Peek(uint32 offset)
1.1       root       87: {
1.1.1.6   root       88:        switch (offset) {
1.1.1.3   root       89:         case 0:
                     90:                return PeekData(&cr.chan[0]);
                     91: 
                     92:         case 1:
                     93:                return PeekCtrl(&cr.chan[0]);
                     94: 
                     95:         case 2:
                     96:                return PeekData(&cr.chan[1]);
                     97: 
                     98:         case 3:
                     99:                return PeekCtrl(&cr.chan[1]);
                    100:        }
                    101:        __unreachable();
1.1       root      102: }
                    103: 
                    104: // 割り込みを上げる
                    105: void
                    106: SIODevice::Interrupt()
                    107: {
                    108:        putlog(2, "Interrupt");
1.1.1.5   root      109:        gInterrupt->AssertINT(this);
1.1       root      110: }

unix.superglobalmegacorp.com

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