Annotation of nono/vm/bus.cpp, revision 1.1.1.8

1.1       root        1: //
                      2: // nono
1.1.1.3   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
1.1.1.8 ! root        7: //
        !             8: // 物理バスアクセス?
        !             9: //
        !            10: 
        !            11: // addr はそれぞれアラインされていること
        !            12: 
1.1       root       13: #include "bus.h"
                     14: #include "ram.h"
                     15: 
                     16: IODevice *devtable[256];
                     17: 
1.1.1.5   root       18: // RAM へのアクセスは、アクセスアドレスが direct_ram_size 未満なら ram[] を
                     19: // 直接アクセスし、そうでなければデバイスクラス経由でアクセスする。
                     20: // 高速モードでは RAM デバイスを経由すること自体とその中でアクセスウェイトを
                     21: // 計算する分を回避したい。
                     22: int direct_ram_size;
                     23: 
1.1       root       24: uint64
1.1.1.2   root       25: vm_phys_read_8(uint32 addr)
1.1       root       26: {
                     27:        uint64 data;
                     28: 
1.1.1.5   root       29:        if (addr < direct_ram_size) {
1.1.1.6   root       30:                data = mainram[HLB(addr)];
1.1       root       31:        } else {
                     32:                IODevice *dev = ::devtable[addr >> 24];
                     33:                data = dev->Read8(addr);
                     34:        }
                     35:        return data;
                     36: }
                     37: 
                     38: uint64
1.1.1.2   root       39: vm_phys_read_16(uint32 addr)
1.1       root       40: {
                     41:        uint64 data;
                     42: 
1.1.1.7   root       43:        if (__predict_false((addr & 1) != 0))
1.1.1.8 ! root       44:                VMPANIC("unaligned access $%08x", addr);
1.1.1.4   root       45: 
1.1.1.5   root       46:        if (addr < direct_ram_size) {
1.1.1.6   root       47:                data = *(uint16 *)&mainram[HLW(addr)];
1.1       root       48:        } else {
                     49:                IODevice *dev = ::devtable[addr >> 24];
                     50:                data = dev->Read16(addr);
                     51:        }
                     52:        return data;
                     53: }
                     54: 
                     55: uint64
1.1.1.2   root       56: vm_phys_read_32(uint32 addr)
1.1       root       57: {
                     58:        uint64 data;
                     59: 
1.1.1.7   root       60:        if (__predict_false((addr & 3) != 0))
1.1.1.8 ! root       61:                VMPANIC("unaligned access $%08x", addr);
1.1       root       62: 
1.1.1.5   root       63:        if (addr < direct_ram_size) {
1.1.1.6   root       64:                data = *(uint32 *)&mainram[addr];
1.1       root       65:        } else {
                     66:                IODevice *dev = ::devtable[addr >> 24];
                     67:                data = dev->Read32(addr);
                     68:        }
                     69:        return data;
                     70: }
                     71: 
                     72: uint64
1.1.1.2   root       73: vm_phys_write_8(uint32 addr, uint32 data)
1.1       root       74: {
1.1.1.5   root       75:        if (addr < direct_ram_size) {
1.1.1.6   root       76:                mainram[HLB(addr)] = data;
1.1       root       77:                return 0;
                     78:        } else {
                     79:                IODevice *dev = ::devtable[addr >> 24];
                     80:                return dev->Write8(addr, data);
                     81:        }
                     82: }
                     83: 
                     84: uint64
1.1.1.2   root       85: vm_phys_write_16(uint32 addr, uint32 data)
1.1       root       86: {
1.1.1.7   root       87:        if (__predict_false((addr & 1) != 0))
1.1.1.8 ! root       88:                VMPANIC("unaligned access $%08x", addr);
1.1.1.4   root       89: 
1.1.1.5   root       90:        if (addr < direct_ram_size) {
1.1.1.6   root       91:                *(uint16 *)&mainram[HLW(addr)] = data;
1.1       root       92:                return 0;
                     93:        } else {
                     94:                IODevice *dev = ::devtable[addr >> 24];
                     95:                return dev->Write16(addr, data);
                     96:        }
                     97: }
                     98: 
                     99: uint64
1.1.1.2   root      100: vm_phys_write_32(uint32 addr, uint32 data)
1.1       root      101: {
1.1.1.7   root      102:        if (__predict_false((addr & 3) != 0))
1.1.1.8 ! root      103:                VMPANIC("unaligned access $%08x", addr);
1.1.1.4   root      104: 
1.1.1.5   root      105:        if (addr < direct_ram_size) {
1.1.1.6   root      106:                *(uint32 *)&mainram[addr] = data;
1.1       root      107:                return 0;
                    108:        } else {
                    109:                IODevice *dev = ::devtable[addr >> 24];
                    110:                return dev->Write32(addr, data);
                    111:        }
                    112: }
                    113: 
                    114: uint64
1.1.1.2   root      115: vm_phys_peek_8(uint32 addr)
1.1       root      116: {
                    117:        uint64 data;
                    118: 
1.1.1.5   root      119:        if (addr < direct_ram_size) {
1.1.1.6   root      120:                data = mainram[HLB(addr)];
1.1       root      121:        } else {
                    122:                IODevice *dev = ::devtable[addr >> 24];
                    123:                data = dev->Peek8(addr);
                    124:        }
                    125:        return data;
                    126: }

unix.superglobalmegacorp.com

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