Div(isions of time)
Hello everyone! This time, I actually remembered to make a devlog! Let’s dive in!
Div(vy up Labour)
Remember how I added the number of ticks each instruction took as a return value from the execute() fn? Well, it actually got put to use now! There is an internal 16-bit timer in the Sharp SM83, the upper 8 bits of which are exposed at memory address 0xff04. Programming this was pretty easy once I realised I could have read_byte() and write_byte() directly access the counter (Originally, I was going to have an update_div thingy probably and have the bte in memory and the accumulator be separate rather than this simpler approach).
pub fn read_byte(&self, address: u16) -> u8 {
let address = address as usize;
match address {
VRAM_BEGIN..=VRAM_END => self.gpu.read_vram(address - VRAM_BEGIN),
0xff04 => (self.div_accumulator >> 8) as u8,
_ => self.memory[address],
}
}
pub fn write_byte(&mut self, address: u16, byte: u8) {
let address = address as usize;
match address {
VRAM_BEGIN..=VRAM_END => self.gpu.write_vram(address - VRAM_BEGIN, byte),
// Any write to div resets it and its accumulator
0xff04 => self.div_accumulator = 0,
_ => self.memory[address] = byte,
};
}
Now, last time, I set up interrupts, so with div set up, it was time to set up timer interrupts.
TIMA Time
What actually triggers timer interrupts, rather than div, is a separate timer called TIMA (0xff05 in memory). TIMA has settings set in TAC (0xff07 in memory). Bits 0 and 1 of TAC dictate which bit of the DIV accumulator (let’s call it divacc) to watch to see when TIMA should be incremented. Bit 2 dictates whether TIMA should be incremented at all.
TIMA gets incremented whenever the indicated bit of divacc falls from 1 → 0. This can sometimes be as few as every 16 ticks, and since instructions can take up to 24 ticks, this can cause the bit to go from 1 → 0 → 1, which means that you can’t just check the new divacc against the old one to see whether the bit fell, though I tried this as a temporary solution. This is what I had to do instead (see screenshot). I wish it could be prettier, but what can you do?
Anyways, y’all, see you next time!
Comments 0
No comments yet. Be the first!
Sign in to join the conversation.