/* tap.js: Tape file handling for JSSpeccy, a ZX Spectrum emulator in Javascript This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Contact details: Matthew Westcott, 14 Daisy Hill Drive, Adlington, Chorley, Lancs PR6 9NE UNITED KINGDOM */ var tapeBlocks = []; var nextTapeBlockIndex = 0; function loadTap(tap) { var nextByte = 0; while (nextByte < tap.length) { var lowByte = tap.charCodeAt(nextByte++); var highByte = tap.charCodeAt(nextByte++); var blockLength = lowByte | (highByte << 8); tapeBlocks.push(tap.slice(nextByte, nextByte + blockLength)); nextByte += blockLength; } } function loadTapeBlock() { var tapeBlock = tapeBlocks[nextTapeBlockIndex]; nextTapeBlockIndex = (nextTapeBlockIndex + 1) % tapeBlocks.length; if (z80.f_ & 0x01) { /* carry set => LOAD */ if (z80.a_ == tapeBlock.charCodeAt(0)) { blockLength = (z80.d << 8) | z80.e; address = (z80.ixh << 8) | z80.ixl; for (i = 0; i < Math.min(blockLength, tapeBlock.length - 1); i++) { if (address >= 0x4000) { memory[address] = tapeBlock.charCodeAt(i + 1); } address = (address + 1) & 0xffff; } paintFullScreen(); if (blockLength > tapeBlock.length - 1) { /* block ended prematurely; signal tape loading error */ z80.f &= 0xfe; /* reset carry flag */ } else { z80.f |= 0x01; /* reset carry flag */ } } else { /* flag byte does not match - signal tape loading error */ z80.f &= 0xfe; /* reset carry flag */ } } else { /* carry reset => VERIFY */ z80.f |= 0x01; /* just return success. TODO: implement VERIFY properly... */ } z80.pc = 0x05e2; /* address at which to exit tape trap */ }