Implement everything for Gameboy Doctor
This commit is contained in:
parent
66c19caaee
commit
c52aa91f26
8 changed files with 136 additions and 14 deletions
|
@ -13,9 +13,9 @@ std::optional<Bus::MapEntry> Bus::find_entry(u16 addr)
|
|||
return {};
|
||||
}
|
||||
|
||||
void Bus::map_device(u16 start, u16 end, Mem_device* dev)
|
||||
void Bus::map_device(u16 start, u16 end, Mem_device* dev, u16 offset)
|
||||
{
|
||||
map.push_back(Bus::MapEntry{ Range(start,end), dev });
|
||||
map.push_back(Bus::MapEntry{ Range(start,end), offset, dev });
|
||||
}
|
||||
|
||||
void Bus::write8(u16 addr, u8 data)
|
||||
|
@ -24,7 +24,7 @@ void Bus::write8(u16 addr, u8 data)
|
|||
|
||||
if(!mapentry) return;
|
||||
|
||||
mapentry->dev->write8(addr - mapentry->range.start, data);
|
||||
mapentry->dev->write8(addr - mapentry->range.start + mapentry->offset, data);
|
||||
}
|
||||
|
||||
u8 Bus::read8(u16 addr)
|
||||
|
@ -33,19 +33,19 @@ u8 Bus::read8(u16 addr)
|
|||
|
||||
if(!mapentry) return 0xFFu;
|
||||
|
||||
return mapentry->dev->read8(addr - mapentry->range.start);
|
||||
return mapentry->dev->read8(addr - mapentry->range.start + mapentry->offset);
|
||||
}
|
||||
|
||||
void Bus::write16(u16 addr, u16 data)
|
||||
{
|
||||
auto mapentry = find_entry(addr);
|
||||
if(!mapentry) return;
|
||||
mapentry->dev->write16(addr - mapentry->range.start, data);
|
||||
mapentry->dev->write16(addr - mapentry->range.start + mapentry->offset, data);
|
||||
}
|
||||
|
||||
u16 Bus::read16(u16 addr)
|
||||
{
|
||||
auto mapentry = find_entry(addr);
|
||||
if(!mapentry) return 0xFFFFu;
|
||||
return mapentry->dev->read16(addr - mapentry->range.start);
|
||||
return mapentry->dev->read16(addr - mapentry->range.start + mapentry->offset);
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ class Bus : public Mem_device {
|
|||
private:
|
||||
struct MapEntry {
|
||||
Range range;
|
||||
u16 offset;
|
||||
Mem_device *dev;
|
||||
};
|
||||
|
||||
|
@ -17,7 +18,7 @@ private:
|
|||
public:
|
||||
Bus();
|
||||
|
||||
void map_device(u16 start, u16 end, Mem_device* dev);
|
||||
void map_device(u16 start, u16 end, Mem_device* dev, u16 offset = 0x0);
|
||||
|
||||
virtual void write8(u16 addr, u8 data);
|
||||
virtual u8 read8(u16 addr);
|
||||
|
|
|
@ -11,3 +11,9 @@ u8 BoundRegister::read8(u16 addr)
|
|||
if(addr) return 0xFF;
|
||||
return reg;
|
||||
}
|
||||
|
||||
void ConstRegister::write8(u16 addr, u8 data)
|
||||
{}
|
||||
|
||||
u8 ConstRegister::read8(u16 addr)
|
||||
{ return value; }
|
||||
|
|
|
@ -15,3 +15,16 @@ public:
|
|||
virtual void write8(u16 addr, u8 data);
|
||||
virtual u8 read8(u16 addr);
|
||||
};
|
||||
|
||||
class ConstRegister : public Mem_device {
|
||||
private:
|
||||
u8 value;
|
||||
public:
|
||||
inline
|
||||
ConstRegister(u8 value)
|
||||
: value(value)
|
||||
{}
|
||||
|
||||
virtual void write8(u16 addr, u8 data);
|
||||
virtual u8 read8(u16 addr);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue