Annotation of nono/vm/scc.cpp, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2017 [email protected]
                      4: //
                      5: 
                      6: #include "scc.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: SCCDevice::SCCDevice()
                     20: {
                     21:        logname = "scc";
                     22:        devname = "SCC";
                     23:        devaddr = baseaddr;
                     24:        devlen  = 0x2000;
                     25: }
                     26: 
                     27: SCCDevice::~SCCDevice()
                     28: {
                     29: }
                     30: 
                     31: // Z8530 は RD と WR を同時に Low にするとリセットがかかる。
                     32: // 回路図からは PEDEC から繋がってるという以上のことは分からないけど
                     33: // 普通に考えればハードリセットでリセットされるよな。
                     34: void
                     35: SCCDevice::ResetHard()
                     36: {
                     37:        Reset();
                     38: }
                     39: 
                     40: uint64
                     41: SCCDevice::Read8(uint32 addr)
                     42: {
                     43:        uint32 an = addr - devaddr;
                     44: 
                     45:        switch (an) {
                     46:         case 1:        // $E98001
                     47:                return ReadCtrl(&cr.chan[1]);
                     48: 
                     49:         case 3:        // $E98003
                     50:                // マウス非接続は 0x00 ?
                     51:                putlog(0, "ChB データレジスタ読み込み (未実装)");
                     52:                return 0x00;
                     53: 
                     54:         case 5:        // $E98005
                     55:                return ReadCtrl(&cr.chan[0]);
                     56: 
                     57:         case 7:        // $E98007
                     58:                putlog(0, "ChA データレジスタ読み込み (未実装)");
                     59:                return ReadData(0);
                     60: 
                     61:         default:
                     62:                break;
                     63:        }
                     64:        putlog(0, "未実装レジスタ読み込み");
                     65:        return (uint64)-1;
                     66: }
                     67: 
                     68: uint64
                     69: SCCDevice::Read16(uint32 addr)
                     70: {
                     71:        return 0xff00 | Read8(addr + 1);
                     72: }
                     73: 
                     74: uint64
                     75: SCCDevice::Write8(uint32 addr, uint32 data)
                     76: {
                     77:        uint32 an = addr - devaddr;
                     78: 
                     79:        switch (an) {
                     80:         case 1:        // $E98001
                     81:                WriteCtrl(&cr.chan[1], data);
                     82:                return 0;
                     83: 
                     84:         case 3:        // $E98003
                     85:                WriteData(&cr.chan[1], data);
                     86:                return 0;
                     87: 
                     88:         case 5:        // $E98005
                     89:                WriteCtrl(&cr.chan[0], data);
                     90:                return 0;
                     91: 
                     92:         case 7:        // $E98007
                     93:                WriteData(&cr.chan[0], data);
                     94:                return 0;
                     95: 
                     96:         default:
                     97:                break;
                     98:        }
                     99:        putlog(0, "未実装レジスタ書き込み");
                    100:        return (uint64)-1;
                    101: }
                    102: 
                    103: uint64
                    104: SCCDevice::Write16(uint32 addr, uint32 data)
                    105: {
                    106:        return Write8(addr + 1, data);
                    107: }
                    108: 
                    109: uint64
                    110: SCCDevice::Peek8(uint32 addr)
                    111: {
                    112:        // XXX
                    113:        return 0xff;
                    114: }
                    115: 
                    116: // Z8530 制御ポート読み込み
                    117: uint8
                    118: SCCDevice::ReadCtrl(struct SIO::channel *chan)
                    119: {
                    120:        return inherited::ReadCtrl(chan);
                    121: }
                    122: 
                    123: // Z8530 制御ポート書き込み
                    124: void
                    125: SCCDevice::WriteCtrl(struct SIO::channel *chan, uint32 data)
                    126: {
                    127:        switch (chan->ptr) {
                    128:         case 0:        // WR0
                    129:                chan->cr0 = data;
                    130: 
                    131:                switch ((chan->cr0 & SIO::WR0_CMD) >> 3) {
                    132:                 case 0:
                    133:                 case 1:
                    134:                        // コマンド 0、1 がレジスタ切り替え
                    135:                        chan->ptr = chan->cr0 & SIO::WR0_PTR;
                    136:                        putlog(3, "WR0%s <- $%02x (ptr=%d)", chan->name, data, chan->ptr);
                    137:                        break;
                    138: 
                    139:                 case 2:        // Reset Ext/Status Interrupts
                    140:                        putlog(0, "WR0 Reset Ext/Status Interrupts 未実装");
                    141:                        break;
                    142:                 case 3:        // Send Abort
                    143:                        putlog(0, "WR0 Send Abort 未実装");
                    144:                        break;
                    145:                 case 4:        // Enable Int on Next Rx Character
                    146:                        putlog(0, "WR0 Enable Int on Next Rx Character 未実装");
                    147:                        break;
                    148:                 case 5:        // Reset Tx Int Pending
                    149:                        putlog(0, "WR0 Reset Tx Int Pending 未実装");
                    150:                        break;
                    151:                 case 6:        // Error Reset
                    152:                        putlog(0, "WR0 Error Reset 未実装");
                    153:                        break;
                    154:                 case 7:        // Reset Highest IUS
                    155:                        putlog(0, "WR0 Reset Highest IUS");
                    156:                        break;
                    157:                }
                    158:                break;
                    159: 
                    160:         case 2:        // WR2
                    161:                // Z8530 の WR2 は A/B 共通でベクタ設定
                    162:                putlog(2, "WR2 <- $%02x ベクタ設定", data);
                    163:                cr.vector = data;
                    164:                // アクセス後は WR0 へ戻す
                    165:                chan->ptr = 0;
                    166:                break;
                    167: 
                    168:         case 1:        // WR1
                    169:         case 3:
                    170:         case 4:
                    171:         case 5:
                    172:         case 6:
                    173:         case 7:
                    174:                inherited::WriteCtrl(chan, data);
                    175:                break;
                    176: 
                    177:         case 8:        // WR8
                    178:                WriteData(chan, data);
                    179:                // アクセス後は WR0 へ戻す
                    180:                chan->ptr = 0;
                    181:                break;
                    182: 
                    183:         case 9:        // WR9
                    184:                putlog(2, "WR%d%s <- $%02x", chan->ptr, chan->name, data);
                    185:                switch ((data & 0xc0) >> 6) {
                    186:                 case 0:        // No Reset
                    187:                        break;
                    188:                 case 1:        // Channel Reset A
                    189:                        ResetChannel(&cr.chan[0]);
                    190:                        break;
                    191:                 case 2:        // Channel Reset B
                    192:                        ResetChannel(&cr.chan[1]);
                    193:                        break;
                    194:                 case 3:        // Force Hardware Reset
                    195:                        Reset();
                    196:                        break;
                    197:                 default:
                    198:                        __unreachable();
                    199:                }
                    200:                // アクセス後は WR0 へ戻す
                    201:                chan->ptr = 0;
                    202:                break;
                    203: 
                    204:         case 11:       // WR11
                    205:                putlog(2, "WR%d%s <- $%02x (未実装)", chan->ptr, chan->name, data);
                    206:                chan->wr11 = data;
                    207:                // アクセス後は WR0 へ戻す
                    208:                chan->ptr = 0;
                    209:                break;
                    210: 
                    211:         case 12:       // WR12
                    212:                chan->tc = (chan->tc & 0xff00) | data;
                    213:                putlog(2, "WR%d%s TC(L)=%04x", chan->ptr, chan->name, chan->tc);
                    214:                // アクセス後は WR0 へ戻す
                    215:                chan->ptr = 0;
                    216:                break;
                    217: 
                    218:         case 13:       // WR13
                    219:                chan->tc = (chan->tc & 0x00ff) | (data << 8);
                    220:                putlog(2, "WR%d%s TC(H)=%04x", chan->ptr, chan->name, chan->tc);
                    221:                // アクセス後は WR0 へ戻す
                    222:                chan->ptr = 0;
                    223:                break;
                    224: 
                    225:         case 14:       // WR14
                    226:                putlog(2, "WR%d%s <- $%02x (未実装)", chan->ptr, chan->name, data);
                    227:                chan->wr14 = data;
                    228:                // アクセス後は WR0 へ戻す
                    229:                chan->ptr = 0;
                    230:                break;
                    231: 
                    232:         case 15:       // WR15
                    233:                putlog(2, "WR%d%s <- $%02x (未実装)", chan->ptr, chan->name, data);
                    234:                chan->wr15 = data;
                    235:                // アクセス後は WR0 へ戻す
                    236:                chan->ptr = 0;
                    237:                break;
                    238: 
                    239:         default:
                    240:                PANIC("未実装レジスタ書き込み WR%d%s <- $%02x",
                    241:                        chan->ptr, chan->name, data);
                    242:                break;
                    243:        }
                    244: }
                    245: 
                    246: // 割り込みを上げる
                    247: void
                    248: SCCDevice::Interrupt()
                    249: {
                    250:        putlog(0, "割り込み(未実装)");
                    251:        gMPU->Interrupt(5, 0x50/*XXX*/);
                    252: }

unix.superglobalmegacorp.com

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