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

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: 
                     19: SIODevice *gSIO;
                     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
                     44: SIODevice::Read8(uint32 addr)
                     45: {
                     46:        uint32 data;
                     47: 
                     48:        // アドレスは8バイト単位でミラーのようだ。
                     49:        uint32 an = addr & 7;
                     50: 
                     51:        // 奇数バイトは偶数バイトのミラーが見えるようだ。
                     52:        switch (an / 2) {
                     53:         case 0:
                     54:                data = ReadData(0);
                     55:                break;
                     56:         case 1:
                     57:                data = ReadCtrl(&cr.chan[0]);
                     58:                break;
                     59:         case 2:
                     60:                data = ReadData(1);
                     61:                break;
                     62:         case 3:
                     63:                data = ReadCtrl(&cr.chan[1]);
                     64:                break;
                     65:         default:
                     66:                __unreachable();
                     67:        }
                     68:        return data;
                     69: }
                     70: 
                     71: uint64
                     72: SIODevice::Read16(uint32 addr)
                     73: {
                     74:        uint32 data = Read8(addr);
                     75: 
                     76:        // 奇数バイトは偶数バイトのミラーが見えるようだ。
                     77:        return (data << 8) | data;
                     78: }
                     79: 
                     80: uint64
                     81: SIODevice::Write8(uint32 addr, uint32 data)
                     82: {
                     83:        // アドレスは8バイト単位でミラーのようだ。
                     84:        uint32 an = addr & 7;
                     85: 
                     86:        // 奇数バイトは偶数バイトのミラーが見えるようだ。
                     87:        // XXX 書き込み側は確認してないけど
                     88:        switch (an / 2) {
                     89:         case 0:
                     90:                WriteData(&cr.chan[0], data);
                     91:                return 0;
                     92: 
                     93:         case 1:
                     94:                WriteCtrl(&cr.chan[0], data);
                     95:                return 0;
                     96: 
                     97:         case 2:
                     98:                WriteData(&cr.chan[1], data);
                     99:                return 0;
                    100: 
                    101:         case 3:
                    102:                WriteCtrl(&cr.chan[1], data);
                    103:                return 0;
                    104:        }
                    105:        __unreachable();
                    106: }
                    107: 
                    108: uint64
                    109: SIODevice::Write16(uint32 addr, uint32 data)
                    110: {
                    111:        // バイト書き込み1回だけになるはず?
                    112:        return Write8(addr, data);
                    113: }
                    114: 
                    115: // 割り込みを上げる
                    116: void
                    117: SIODevice::Interrupt()
                    118: {
                    119:        putlog(2, "Interrupt");
                    120:        gMPU->Interrupt(6);
                    121: }

unix.superglobalmegacorp.com

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