unsigned short stackPop16 (void){ unsigned short value = 0; //reading is done this way to support correct timing unsigned short temp1 = readMemory8(registers.SP); unsigned short temp2 = readMemory8(registers.SP + 1) << 8; value = temp1 | temp2; registers.SP += 2; return value; }
/* * Expected timing (fresh DMA): * M = 0: write to $FF46 happens * M = 1: nothing (OAM still accessible) * M = 2: new DMA starts, OAM reads will return $FF * Expected timing (restarted DMA): * M = 0: write to $FF46 happens. Previous DMA is running (OAM *not* accessible) * M = 1: previous DMA is running (OAM *not* accessible) * M = 2: new DMA starts, OAM reads will return $FF */ void updateDMA (){ if (dmastate.start){ //directMemoryAccess(dmastate.address); dmastate.running = TRUE; dmastate.start = FALSE; dmastate.timer = 0; //dmastate.timer = 640; } if (dmastate.prepare){ dmastate.start = TRUE; dmastate.prepare = FALSE; } if (dmastate.running){ gpu_reading = 1; memory[0xFE00 + dmastate.timer] = readMemory8(dmastate.address + dmastate.timer); gpu_reading = 0; dmastate.timer += 1; if (dmastate.timer > 160){ dmastate.running = FALSE; dmastate.timer = 0; } } }
unsigned long MemoryForCpu::read8_se(unsigned long addr) { unsigned char c; if(port->read8(addr, &c)) return signExtend8(c); if(ifont->read8(addr, &c)) return signExtend8(c); if(rommmp->read8(addr, &c)) return signExtend8(c); return signExtend8(readMemory8(addr)); }
unsigned char MemoryForCpu::read8_0e(unsigned long addr) { unsigned char c; if(port->read8(addr, &c)) return c; if(ifont->read8(addr, &c)) return c; if(rommmp->read8(addr, &c)) return c; return readMemory8(addr); }
/** * readMemory16 - read 2 bytes from memory * * @address the position to read from */ unsigned short readMemory16(unsigned short address) { return (readMemory8(address) | (readMemory8(address + 1) << 8)); }