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

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2017 [email protected]
                      4: //
                      5: 
                      6: #include "dmac.h"
                      7: 
                      8: DMACDevice::DMACDevice()
                      9: {
                     10:        logname = "dmac";
                     11:        devname = "DMAC";
                     12:        devaddr = baseaddr;
                     13:        devlen  = 0x2000;
                     14: }
                     15: 
                     16: DMACDevice::~DMACDevice()
                     17: {
                     18: }
                     19: 
                     20: uint64
                     21: DMACDevice::Read8(uint32 addr)
                     22: {
                     23:        uint8 data;
                     24:        int ch;
                     25: 
                     26:        ch = (addr - baseaddr) / 0x40;
                     27:        struct DMAC::channel *chan = &dmac.chan[ch];
                     28:        int n = (addr - baseaddr) % 0x40; 
                     29:        switch (n) {
                     30:         case DMAC::CSR:
                     31:                data = chan->csr;
                     32:                break;
                     33: 
                     34:         case DMAC::CER:
                     35:                data = chan->cer;
                     36:                break;
                     37: 
                     38:         case DMAC::DCR:
                     39:                data = chan->dcr;
                     40:                break;
                     41: 
                     42:         case DMAC::OCR:
                     43:                data = chan->ocr;
                     44:                break;
                     45: 
                     46:         case DMAC::SCR:
                     47:                data = chan->scr;
                     48:                break;
                     49: 
                     50:         case DMAC::CCR:
                     51:                data = chan->ccr;
                     52:                break;
                     53: 
                     54:         case DMAC::MTC:
                     55:                data = chan->mtc >> 8;
                     56:                break;
                     57:         case DMAC::MTC + 1:
                     58:                data = chan->mtc & 0xff;
                     59:                break;
                     60: 
                     61:         case DMAC::MAR:
                     62:                data = chan->mar >> 24;
                     63:                break;
                     64:         case DMAC::MAR + 1:
                     65:                data = (chan->mar >> 16) & 0xff;
                     66:                break;
                     67:         case DMAC::MAR + 2:
                     68:                data = (chan->mar >> 8) & 0xff;
                     69:                break;
                     70:         case DMAC::MAR + 3:
                     71:                data = chan->mar & 0xff;
                     72:                break;
                     73: 
                     74:         case DMAC::DAR:
                     75:                data = chan->dar >> 24;
                     76:                break;
                     77:         case DMAC::DAR + 1:
                     78:                data = (chan->dar >> 16) & 0xff;
                     79:                break;
                     80:         case DMAC::DAR + 2:
                     81:                data = (chan->dar >> 8) & 0xff;
                     82:                break;
                     83:         case DMAC::DAR + 3:
                     84:                data = chan->dar & 0xff;
                     85:                break;
                     86: 
                     87:         case DMAC::BTC:
                     88:                data = chan->btc >> 8;
                     89:                break;
                     90:         case DMAC::BTC + 1:
                     91:                data = chan->btc & 0xff;
                     92:                break;
                     93: 
                     94:         case DMAC::BAR:
                     95:                data = chan->bar >> 24;
                     96:                break;
                     97:         case DMAC::BAR + 1:
                     98:                data = (chan->bar >> 16) & 0xff;
                     99:                break;
                    100:         case DMAC::BAR + 2:
                    101:                data = (chan->bar >> 8) & 0xff;
                    102:                break;
                    103:         case DMAC::BAR + 3:
                    104:                data = chan->bar & 0xff;
                    105:                break;
                    106: 
                    107:         case DMAC::NIV:
                    108:                data = chan->niv;
                    109:                break;
                    110: 
                    111:         case DMAC::EIV:
                    112:                data = chan->eiv;
                    113:                break;
                    114: 
                    115:         case DMAC::MFC:
                    116:                data = chan->mfc;
                    117:                break;
                    118: 
                    119:         case DMAC::CPR:
                    120:                data = chan->cpr;
                    121:                break;
                    122: 
                    123:         case DMAC::DFC:
                    124:                data = chan->dfc;
                    125:                break;
                    126: 
                    127:         case DMAC::BFC:
                    128:                data = chan->bfc;
                    129:                break;
                    130: 
                    131:         case DMAC::GCR:
                    132:                if (ch == 3) {
                    133:                        data = dmac.gcr;
                    134:                        break;
                    135:                } else {
                    136:                        data = 0xff;
                    137:                }
                    138:                break;
                    139: 
                    140:         default:
                    141:                data = 0xff;
                    142:                break;
                    143:        }
                    144: 
                    145:        return data;
                    146: }
                    147: 
                    148: uint64
                    149: DMACDevice::Write8(uint32 addr, uint32 data)
                    150: {
                    151:        int ch;
                    152: 
                    153:        ch = (addr - baseaddr) / 0x40;
                    154:        struct DMAC::channel *chan = &dmac.chan[ch];
                    155:        int n = (addr - baseaddr) % 0x40; 
                    156:        switch (n) {
                    157:         case DMAC::CSR:
                    158:                write_csr(ch, data);
                    159:                break;
                    160: 
                    161:         case DMAC::CER:
                    162:                // Read only
                    163:                break;
                    164: 
                    165:         case DMAC::DCR:
                    166:                chan->dcr = data & 0xfb;
                    167:                break;
                    168: 
                    169:         case DMAC::OCR:
                    170:                chan->ocr = data;
                    171:                break;
                    172: 
                    173:         case DMAC::SCR:
                    174:                chan->scr = data & 0x0f;
                    175:                break;
                    176: 
                    177:         case DMAC::CCR:
                    178:                write_ccr(ch, data);
                    179:                break;
                    180: 
                    181:         case DMAC::MTC:
                    182:                chan->mtc = (chan->mtc & 0x00ff) | (data << 8);
                    183:                break;
                    184:         case DMAC::MTC + 1:
                    185:                chan->mtc = (chan->mtc & 0xff00) | data;
                    186:                break;
                    187: 
                    188:         case DMAC::MAR:
                    189:                chan->mar = (chan->mar & 0x00ffffff) | (data << 24);
                    190:                break;
                    191:         case DMAC::MAR + 1:
                    192:                chan->mar = (chan->mar & 0xff00ffff) | (data << 16);
                    193:                break;
                    194:         case DMAC::MAR + 2:
                    195:                chan->mar = (chan->mar & 0xffff00ff) | (data << 8);
                    196:                break;
                    197:         case DMAC::MAR + 3:
                    198:                chan->mar = (chan->mar & 0xffffff00) | data;
                    199:                break;
                    200: 
                    201:         case DMAC::DAR:
                    202:                chan->dar = (chan->dar & 0x00ffffff) | (data << 24);
                    203:                break;
                    204:         case DMAC::DAR + 1:
                    205:                chan->dar = (chan->dar & 0xff00ffff) | (data << 16);
                    206:                break;
                    207:         case DMAC::DAR + 2:
                    208:                chan->dar = (chan->dar & 0xffff00ff) | (data << 8);
                    209:                break;
                    210:         case DMAC::DAR + 3:
                    211:                chan->dar = (chan->dar & 0xffffff00) | data;
                    212:                break;
                    213: 
                    214:         case DMAC::BTC:
                    215:                chan->btc = (chan->btc & 0x00ff) | (data << 8);
                    216:                break;
                    217:         case DMAC::BTC + 1:
                    218:                chan->btc = (chan->btc & 0xff00) | data;
                    219:                break;
                    220: 
                    221:         case DMAC::BAR:
                    222:                chan->bar = (chan->bar & 0x00ffffff) | (data << 24);
                    223:                break;
                    224:         case DMAC::BAR + 1:
                    225:                chan->bar = (chan->bar & 0xff00ffff) | (data << 16);
                    226:                break;
                    227:         case DMAC::BAR + 2:
                    228:                chan->bar = (chan->bar & 0xffff00ff) | (data << 8);
                    229:                break;
                    230:         case DMAC::BAR + 3:
                    231:                chan->bar = (chan->bar & 0xffffff00) | data;
                    232:                break;
                    233: 
                    234:         case DMAC::NIV:
                    235:                chan->niv = data;
                    236:                break;
                    237: 
                    238:         case DMAC::EIV:
                    239:                chan->eiv = data;
                    240:                break;
                    241: 
                    242:         case DMAC::MFC:
                    243:                chan->mfc = data & 7;
                    244:                break;
                    245: 
                    246:         case DMAC::CPR:
                    247:                chan->cpr = data & 3;
                    248:                break;
                    249: 
                    250:         case DMAC::DFC:
                    251:                chan->dfc = data & 7;
                    252:                break;
                    253: 
                    254:         case DMAC::BFC:
                    255:                chan->bfc = data & 7;
                    256:                break;
                    257: 
                    258:         case DMAC::GCR:
                    259:                if (ch == 3) {
                    260:                        dmac.gcr = data;
                    261:                }
                    262:                break;
                    263: 
                    264:         default:
                    265:                break;
                    266:        }
                    267:        return 0;
                    268: }
                    269: 
                    270: uint64
                    271: DMACDevice::Peek8(uint32 addr)
                    272: {
                    273:        uint8 data;
                    274:        int ch;
                    275: 
                    276:        ch = (addr - baseaddr) / 0x40;
                    277:        struct DMAC::channel *chan = &dmac.chan[ch];
                    278:        int n = (addr - baseaddr) % 0x40; 
                    279:        switch (n) {
                    280:         case DMAC::CSR:
                    281:                data = chan->csr;
                    282:                break;
                    283: 
                    284:         case DMAC::CER:
                    285:                data = chan->cer;
                    286:                break;
                    287: 
                    288:         case DMAC::DCR:
                    289:                data = chan->dcr;
                    290:                break;
                    291: 
                    292:         case DMAC::OCR:
                    293:                data = chan->ocr;
                    294:                break;
                    295: 
                    296:         case DMAC::SCR:
                    297:                data = chan->scr;
                    298:                break;
                    299: 
                    300:         case DMAC::CCR:
                    301:                data = chan->ccr;
                    302:                break;
                    303: 
                    304:         case DMAC::MTC:
                    305:                data = chan->mtc >> 8;
                    306:                break;
                    307:         case DMAC::MTC + 1:
                    308:                data = chan->mtc & 0xff;
                    309:                break;
                    310: 
                    311:         case DMAC::MAR:
                    312:                data = chan->mar >> 24;
                    313:                break;
                    314:         case DMAC::MAR + 1:
                    315:                data = (chan->mar >> 16) & 0xff;
                    316:                break;
                    317:         case DMAC::MAR + 2:
                    318:                data = (chan->mar >> 8) & 0xff;
                    319:                break;
                    320:         case DMAC::MAR + 3:
                    321:                data = chan->mar & 0xff;
                    322:                break;
                    323: 
                    324:         case DMAC::DAR:
                    325:                data = chan->dar >> 24;
                    326:                break;
                    327:         case DMAC::DAR + 1:
                    328:                data = (chan->dar >> 16) & 0xff;
                    329:                break;
                    330:         case DMAC::DAR + 2:
                    331:                data = (chan->dar >> 8) & 0xff;
                    332:                break;
                    333:         case DMAC::DAR + 3:
                    334:                data = chan->dar & 0xff;
                    335:                break;
                    336: 
                    337:         case DMAC::BTC:
                    338:                data = chan->btc >> 8;
                    339:                break;
                    340:         case DMAC::BTC + 1:
                    341:                data = chan->btc & 0xff;
                    342:                break;
                    343: 
                    344:         case DMAC::BAR:
                    345:                data = chan->bar >> 24;
                    346:                break;
                    347:         case DMAC::BAR + 1:
                    348:                data = (chan->bar >> 16) & 0xff;
                    349:                break;
                    350:         case DMAC::BAR + 2:
                    351:                data = (chan->bar >> 8) & 0xff;
                    352:                break;
                    353:         case DMAC::BAR + 3:
                    354:                data = chan->bar & 0xff;
                    355:                break;
                    356: 
                    357:         case DMAC::NIV:
                    358:                data = chan->niv;
                    359:                break;
                    360: 
                    361:         case DMAC::EIV:
                    362:                data = chan->eiv;
                    363:                break;
                    364: 
                    365:         case DMAC::MFC:
                    366:                data = chan->mfc;
                    367:                break;
                    368: 
                    369:         case DMAC::CPR:
                    370:                data = chan->cpr;
                    371:                break;
                    372: 
                    373:         case DMAC::DFC:
                    374:                data = chan->dfc;
                    375:                break;
                    376: 
                    377:         case DMAC::BFC:
                    378:                data = chan->bfc;
                    379:                break;
                    380: 
                    381:         case DMAC::GCR:
                    382:                if (ch == 3) {
                    383:                        data = dmac.gcr;
                    384:                        break;
                    385:                } else {
                    386:                        data = 0xff;
                    387:                }
                    388:                break;
                    389: 
                    390:         default:
                    391:                data = 0xff;
                    392:                break;
                    393:        }
                    394: 
                    395:        return data;
                    396: }
                    397: 
                    398: void
                    399: DMACDevice::write_csr(int ch, uint32 data)
                    400: {
                    401:        putlog(1, "write_csr[%d] <- $%02x 未実装書き込み", ch, data);
                    402: }
                    403: 
                    404: void
                    405: DMACDevice::write_ccr(int ch, uint32 data)
                    406: {
                    407:        putlog(1, "write_ccr[%d] <- $%02x 未実装書き込み", ch, data);
                    408: }
                    409: 

unix.superglobalmegacorp.com

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