Path: blob/master/libsnes/bsnes/snes/chip/icd2/interface/interface.cpp
2 views
#ifdef ICD2_CPP12//called on rendered lines 0-143 (not on Vblank lines 144-153)3void ICD2::lcdScanline() {4if((GameBoy::lcd.status.ly & 7) == 0) {5lcd.row = (lcd.row + 1) & 3;6}78unsigned offset = (lcd.row * 160 * 8) + ((GameBoy::lcd.status.ly & 7) * 160);9memcpy(lcd.buffer + offset, GameBoy::lcd.screen + GameBoy::lcd.status.ly * 160, 160 * sizeof(uint16));10}1112void ICD2::joypWrite(bool p15, bool p14) {13//joypad handling14if(p15 == 1 && p14 == 1) {15if(joyp15lock == 0 && joyp14lock == 0) {16joyp15lock = 1;17joyp14lock = 1;18joyp_id = (joyp_id + 1) & 3;19}20}2122if(p15 == 0 && p14 == 1) joyp15lock = 0;23if(p15 == 1 && p14 == 0) joyp14lock = 0;2425//packet handling26if(p15 == 0 && p14 == 0) { //pulse27pulselock = false;28packetoffset = 0;29bitoffset = 0;30strobelock = true;31packetlock = false;32return;33}3435if(pulselock) return;3637if(p15 == 1 && p14 == 1) {38strobelock = false;39return;40}4142if(strobelock) {43if(p15 == 1 || p14 == 1) { //malformed packet44packetlock = false;45pulselock = true;46bitoffset = 0;47packetoffset = 0;48} else {49return;50}51}5253//p15:1, p14:0 = 054//p15:0, p14:1 = 155bool bit = (p15 == 0);56strobelock = true;5758if(packetlock) {59if(p15 == 1 && p14 == 0) {60if((joyp_packet[0] >> 3) == 0x11) {61mlt_req = joyp_packet[1] & 3;62if(mlt_req == 2) mlt_req = 3;63joyp_id = 0;64}6566if(packetsize < 64) packet[packetsize++] = joyp_packet;67packetlock = false;68pulselock = true;69}70return;71}7273bitdata = (bit << 7) | (bitdata >> 1);74if(++bitoffset < 8) return;7576bitoffset = 0;77joyp_packet[packetoffset] = bitdata;78if(++packetoffset < 16) return;79packetlock = true;80}8182void ICD2::videoRefresh(const uint16_t *data) {83}8485void ICD2::audioSample(int16_t center, int16_t left, int16_t right) {86audio.coprocessor_sample(left, right);87}8889bool ICD2::inputPoll(unsigned id) {90GameBoy::cpu.status.mlt_req = joyp_id & mlt_req;9192unsigned data = 0x00;93switch(joyp_id & mlt_req) {94case 0: data = ~r6004; break;95case 1: data = ~r6005; break;96case 2: data = ~r6006; break;97case 3: data = ~r6007; break;98}99100switch((GameBoy::Input)id) {101case GameBoy::Input::Start: return data & 0x80;102case GameBoy::Input::Select: return data & 0x40;103case GameBoy::Input::B: return data & 0x20;104case GameBoy::Input::A: return data & 0x10;105case GameBoy::Input::Down: return data & 0x08;106case GameBoy::Input::Up: return data & 0x04;107case GameBoy::Input::Left: return data & 0x02;108case GameBoy::Input::Right: return data & 0x01;109}110111return 0;112}113114void* ICD2::allocSharedMemory(const char* memtype, size_t amt, int initialByte) { return SNES::interface()->allocSharedMemory(memtype, amt, initialByte); }115void ICD2::freeSharedMemory(void* ptr) { SNES::interface()->freeSharedMemory(ptr); }116117#endif118119120