void SuperScope::enter() { unsigned prev = 0; while(true) { unsigned next = cpu.vcounter() * 1364 + cpu.hcounter(); if(offscreen == false) { unsigned target = y * 1364 + (x + 24) * 4; if(next >= target && prev < target) { //CRT raster detected, toggle iobit to latch counters iobit(0); iobit(1); } } if(next < prev) { //Vcounter wrapped back to zero; update cursor coordinates for start of new frame int nx = interface()->inputPoll(port, Input::Device::SuperScope, 0, (unsigned)Input::SuperScopeID::X); int ny = interface()->inputPoll(port, Input::Device::SuperScope, 0, (unsigned)Input::SuperScopeID::Y); nx += x; ny += y; x = max(-16, min(256 + 16, nx)); y = max(-16, min(240 + 16, ny)); offscreen = (x < 0 || y < 0 || x >= 256 || y >= (ppu.overscan() ? 240 : 225)); } prev = next; step(2); } }
void Justifier::enter() { unsigned prev = 0; while(true) { unsigned next = cpu.vcounter() * 1364 + cpu.hcounter(); signed x = (active == 0 ? player1.x : player2.x), y = (active == 0 ? player1.y : player2.y); bool offscreen = (x < 0 || y < 0 || x >= 256 || y >= (ppu.overscan() ? 240 : 225)); if(offscreen == false) { unsigned target = y * 1364 + (x + 24) * 4; if(next >= target && prev < target) { //CRT raster detected, toggle iobit to latch counters iobit(0); iobit(1); } } if(next < prev) { int nx1 = interface->inputPoll(port, Input::Device::Justifier, 0, (unsigned)Input::JustifierID::X); int ny1 = interface->inputPoll(port, Input::Device::Justifier, 0, (unsigned)Input::JustifierID::Y); nx1 += player1.x; ny1 += player1.y; player1.x = max(-16, min(256 + 16, nx1)); player1.y = max(-16, min(240 + 16, ny1)); } if(next < prev && chained) { int nx2 = interface->inputPoll(port, Input::Device::Justifiers, 1, (unsigned)Input::JustifierID::X); int ny2 = interface->inputPoll(port, Input::Device::Justifiers, 1, (unsigned)Input::JustifierID::Y); nx2 += player2.x; ny2 += player2.y; player2.x = max(-16, min(256 + 16, nx2)); player2.y = max(-16, min(240 + 16, ny2)); } prev = next; step(2); } }
uint2 Multitap::data() { if(latched) return 2; //multitap detection unsigned index, port1, port2; if(iobit()) { index = counter1; if(index >= 16) return 3; counter1++; port1 = 0; //controller 1 port2 = 1; //controller 2 } else { index = counter2; if(index >= 16) return 3; counter2++; port1 = 2; //controller 3 port2 = 3; //controller 4 } bool data1 = interface()->inputPoll(port, Input::Device::Multitap, port1, index); bool data2 = interface()->inputPoll(port, Input::Device::Multitap, port2, index); return (data2 << 1) | (data1 << 0); }