#include #include #include namespace weee::core { video_interface::video_interface(mem &mem) { mem.register_read16_handler(0x0c002000, 0x0c0020ff, [&](ircolib::u32 addr) { return read16(addr); }); mem.register_read32_handler(0x0c002000, 0x0c0020ff, [&](ircolib::u32 addr) { return read32(addr); }); mem.register_write16_handler(0x0c002000, 0x0c0020ff, [&](ircolib::u32 addr, ircolib::u16 value) { write16(addr, value); }); mem.register_write32_handler(0x0c002000, 0x0c0020ff, [&](ircolib::u32 addr, ircolib::u32 value) { write32(addr, value); }); } ircolib::u16 video_interface::read16(ircolib::u32 addr) { switch (addr) { case 0x00: return vtr.raw; case 0x02: return dcr.raw; case 0x4a: return hsr.raw; case 0x6c: return viclk & 1; case 0x70: return 0x0280; default: ircolib::panic("video_interface::read16 from unimplemented addr 0x{:04X}", addr); return 0; } } ircolib::u32 video_interface::read32(ircolib::u32 addr) { switch (addr) { case 0x02: return dcr.raw; case 0x04: return htr0.raw; case 0x08: return htr1.raw; case 0x0c: return vto.raw; case 0x10: return vte.raw; case 0x14: return bbei.raw; case 0x18: return bboi.raw; case 0x1c: return tfbl.raw & 0x1ffffe00; case 0x24: return bfbl.raw & 0x10fffe00; case 0x4c: case 0x50: case 0x54: return fct0[addr - 0x4c].raw; case 0x58: case 0x5c: case 0x60: case 0x64: return fct1[addr - 0x58].raw; default: ircolib::panic("video_interface::read32 from unimplemented addr 0x{:04X}", addr); return 0; } } void video_interface::write16(ircolib::u32 addr, ircolib::u16 value) { switch (addr) { case 0x00: vtr.raw = value; break; case 0x02: dcr.raw = value; break; case 0x4a: hsr.raw = value; break; case 0x6c: viclk = value & 1; break; case 0x70: break; default: ircolib::panic("video_interface::write16 to unimplemented addr 0x{:04X} with value 0x{:04X}", addr, value); } } void video_interface::write32(ircolib::u32 addr, ircolib::u32 value) { switch (addr) { case 0x02: dcr.raw = value; break; case 0x04: htr0.raw = value; break; case 0x08: htr1.raw = value; break; case 0x0c: vto.raw = value; break; case 0x10: vte.raw = value; break; case 0x14: bbei.raw = value; break; case 0x18: bboi.raw = value; break; case 0x1c: tfbl.raw = value & 0x1ffffe00; break; case 0x24: bfbl.raw = value & 0x10fffe00; break; case 0x4c: case 0x50: case 0x54: fct0[addr - 0x4c].raw = value; break; case 0x58: case 0x5c: case 0x60: case 0x64: fct1[addr - 0x58].raw = value; break; default: ircolib::panic("video_interface::write32 to unimplemented addr 0x{:04X} with value 0x{:08X}", addr, value); } } } // namespace weee::core