// read with io public int Read(int address) { var page = (address & 0xF000) >> 12; switch (page) { case 0x0A: if (address >= 0xA000 && address < 0xA7C0) { return(_floppyRom[address & 0x7FF]); } switch (address) { case 0xA7C0: const int tapeDrivePresent = 0x80; return(_ports[0] | tapeDrivePresent | (_input.LightPenClick ? 0x20 : 0)); case 0xA7C1: return(_ports[1] | (_input.IsKeyPressed((Mo5Key)(_ports[1] & 0xFE)) ? 0 : 0x80)); case 0xA7C2: return(_ports[2]); case 0xA7C3: return(_ports[3] | ~_machine.Initn()); case 0xA7CB: return((_carflags & 0x3F) | ((_carflags & 0x80) >> 1) | ((_carflags & 0x40) << 1)); case 0xA7CC: return(((_ports[0x0E] & 4) != 0) ? JoystickPosition : _ports[0x0C]); case 0xA7CD: return(((_ports[0x0F] & 4) != 0) ? JoystickAction | SoundMem : _ports[0x0D]); case 0xA7CE: return(4); case 0xA7D8: return(~_machine.Initn()); case 0xA7E1: return(0xFF); //0 means printer error #53 case 0xA7E6: return(_machine.Iniln() << 1); case 0xA7E7: return(_machine.Initn()); default: if (address < 0xA800) { return(_ports[address & 0x3F]); } return(0); } case 0x0B: SwitchMemo5Bank(address); return(_mem[_mapper[page]][address & 0xFFF] & 0xFF); default: return(_mem[_mapper[page]][address & 0xFFF] & 0xFF); } }