|
|
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: // LunaKeyboard で登録される。 ! 117: void ! 118: SIODevice::RxCh1(int arg) ! 119: { ! 120: Rx(1, arg); ! 121: } ! 122: ! 123: // 割り込みを上げる ! 124: void ! 125: SIODevice::Interrupt() ! 126: { ! 127: putlog(2, "Interrupt"); ! 128: gMPU->Interrupt(6); ! 129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.