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

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()
                     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: uint64
1.1.1.6 ! root       37: SIODevice::Read(uint32 offset)
1.1       root       38: {
                     39:        uint32 data;
                     40: 
1.1.1.6 ! root       41:        switch (offset) {
1.1       root       42:         case 0:
1.1.1.3   root       43:                data = ReadData(&cr.chan[0]);
1.1       root       44:                break;
                     45:         case 1:
                     46:                data = ReadCtrl(&cr.chan[0]);
                     47:                break;
                     48:         case 2:
1.1.1.3   root       49:                data = ReadData(&cr.chan[1]);
1.1       root       50:                break;
                     51:         case 3:
                     52:                data = ReadCtrl(&cr.chan[1]);
                     53:                break;
                     54:         default:
                     55:                __unreachable();
                     56:        }
                     57:        return data;
                     58: }
                     59: 
                     60: uint64
1.1.1.6 ! root       61: SIODevice::Write(uint32 offset, uint32 data)
1.1       root       62: {
1.1.1.6 ! root       63:        switch (offset) {
1.1       root       64:         case 0:
                     65:                WriteData(&cr.chan[0], data);
                     66:                return 0;
                     67: 
                     68:         case 1:
                     69:                WriteCtrl(&cr.chan[0], data);
                     70:                return 0;
                     71: 
                     72:         case 2:
                     73:                WriteData(&cr.chan[1], data);
                     74:                return 0;
                     75: 
                     76:         case 3:
                     77:                WriteCtrl(&cr.chan[1], data);
                     78:                return 0;
                     79:        }
                     80:        __unreachable();
                     81: }
                     82: 
                     83: uint64
1.1.1.6 ! root       84: SIODevice::Peek(uint32 offset)
1.1       root       85: {
1.1.1.6 ! root       86:        switch (offset) {
1.1.1.3   root       87:         case 0:
                     88:                return PeekData(&cr.chan[0]);
                     89: 
                     90:         case 1:
                     91:                return PeekCtrl(&cr.chan[0]);
                     92: 
                     93:         case 2:
                     94:                return PeekData(&cr.chan[1]);
                     95: 
                     96:         case 3:
                     97:                return PeekCtrl(&cr.chan[1]);
                     98:        }
                     99:        __unreachable();
1.1       root      100: }
                    101: 
                    102: // 割り込みを上げる
                    103: void
                    104: SIODevice::Interrupt()
                    105: {
                    106:        putlog(2, "Interrupt");
1.1.1.5   root      107:        gInterrupt->AssertINT(this);
1.1       root      108: }

unix.superglobalmegacorp.com

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