Merge pull request #4 from whscullin/whscullin/audit_fixes_1

Fix things revealed by zellyn/a2audit
This commit is contained in:
Will Scullin 2017-03-05 14:53:56 -08:00 committed by GitHub
commit dc146bf630
5 changed files with 114 additions and 86 deletions

View File

@ -111,26 +111,34 @@ function Apple2IO(cpu, callbacks)
} }
} }
function _access(off) { function _access(off, val) {
var result = 0; var result = 0;
var now = cpu.cycles(); var now = cpu.cycles();
var delta = now - _trigger; var delta = now - _trigger;
switch (off) { switch (off) {
case LOC.CLR80VID: case LOC.CLR80VID:
// _debug('80 Column Mode off'); if ('_80col' in callbacks && val !== undefined) {
if ('_80col' in callbacks) callbacks._80col(false); _debug('80 Column Mode off');
callbacks._80col(false);
}
break; break;
case LOC.SET80VID: case LOC.SET80VID:
// _debug('80 Column Mode on'); if ('_80col' in callbacks && val !== undefined) {
if ('_80col' in callbacks) callbacks._80col(true); _debug('80 Column Mode on');
callbacks._80col(true);
}
break; break;
case LOC.CLRALTCH: case LOC.CLRALTCH:
// _debug('Alt Char off'); if ('altchar' in callbacks && val !== undefined) {
if ('altchar' in callbacks) callbacks.altchar(false); _debug('Alt Char off');
callbacks.altchar(false);
}
break; break;
case LOC.SETALTCH: case LOC.SETALTCH:
// _debug('Alt Char on'); if ('altchar' in callbacks && val !== undefined) {
if ('altchar' in callbacks) callbacks.altchar(true); _debug('Alt Char on');
callbacks.altchar(true);
}
break; break;
case LOC.CLRTEXT: case LOC.CLRTEXT:
_debug('Graphics Mode'); _debug('Graphics Mode');
@ -227,7 +235,7 @@ function Apple2IO(cpu, callbacks)
case LOC.STROBE: case LOC.STROBE:
_key &= 0x7f; _key &= 0x7f;
if (_buffer.length > 0) { if (_buffer.length > 0) {
var val = _buffer.shift(); val = _buffer.shift();
if (val == '\n') { if (val == '\n') {
val = '\r'; val = '\r';
} }
@ -372,7 +380,7 @@ function Apple2IO(cpu, callbacks)
switch (page) { switch (page) {
case 0xc0: case 0xc0:
this.ioSwitch(off); this.ioSwitch(off, val);
break; break;
case 0xc1: case 0xc1:
case 0xc2: case 0xc2:

View File

@ -24,8 +24,7 @@ function LanguageCard(io, slot, rom) {
var _readbsr = false; var _readbsr = false;
var _writebsr = false; var _writebsr = false;
var _bsr2 = false; var _bsr2 = false;
var _prewrite = false;
var _last = 0x00;
var _read1 = null; var _read1 = null;
var _read2 = null; var _read2 = null;
@ -48,7 +47,8 @@ function LanguageCard(io, slot, rom) {
} }
function _debug() { function _debug() {
// debug.apply(arguments); /*eslint no-console: 0 */
// console.debug.apply(null, arguments);
} }
_init(); _init();
@ -83,64 +83,72 @@ function LanguageCard(io, slot, rom) {
_READWRBSR1: 0x8f _READWRBSR1: 0x8f
}; };
function _access(off) { function _access(off, val) {
var result = 0; var result = 0;
switch (off) { switch (off) {
case LOC.READBSR2: case LOC.READBSR2: // 0xC080
case LOC._READBSR2: case LOC._READBSR2: // 0xC084
_readbsr = true; _readbsr = true;
_writebsr = false; _writebsr = false;
_bsr2 = true; _bsr2 = true;
_prewrite = false;
_debug('Bank 2 Read'); _debug('Bank 2 Read');
break; break;
case LOC.WRITEBSR2: case LOC.WRITEBSR2: // 0xC081
case LOC._WRITEBSR2: case LOC._WRITEBSR2: // 0xC085
_readbsr = false; _readbsr = false;
_writebsr = ((_last & 0xF3) == (off & 0xF3)); _writebsr = _prewrite;
_bsr2 = true; _bsr2 = true;
_prewrite = true;
_debug('Bank 2 Write'); _debug('Bank 2 Write');
break; break;
case LOC.OFFBSR2: case LOC.OFFBSR2: // 0xC082
case LOC._OFFBSR2: case LOC._OFFBSR2: // 0xC086
_readbsr = false; _readbsr = false;
_writebsr = false; _writebsr = false;
_bsr2 = true; _bsr2 = true;
_prewrite = false;
_debug('Bank 2 Off'); _debug('Bank 2 Off');
break; break;
case LOC.READWRBSR2: case LOC.READWRBSR2: // 0xC083
case LOC._READWRBSR2: case LOC._READWRBSR2: // 0xC087
_readbsr = true; _readbsr = true;
_writebsr = ((_last & 0xF3) == (off & 0xF3)); _writebsr = _prewrite;
_bsr2 = true; _bsr2 = true;
_prewrite = true;
_debug('Bank 2 Read/Write'); _debug('Bank 2 Read/Write');
break; break;
case LOC.READBSR1: case LOC.READBSR1: // 0xC088
case LOC._READBSR1: case LOC._READBSR1: // 0xC08C
_readbsr = true; _readbsr = true;
_writebsr = false; _writebsr = false;
_bsr2 = false; _bsr2 = false;
_prewrite = false;
_debug('Bank 1 Read'); _debug('Bank 1 Read');
break; break;
case LOC.WRITEBSR1: case LOC.WRITEBSR1: // 0xC089
case LOC._WRITEBSR1: case LOC._WRITEBSR1: // 0xC08D
_readbsr = false; _readbsr = false;
_writebsr = ((_last & 0xF3) == (off & 0xF3)); _writebsr = _prewrite;
_bsr2 = false; _bsr2 = false;
_prewrite = true;
_debug('Bank 1 Write'); _debug('Bank 1 Write');
break; break;
case LOC.OFFBSR1: case LOC.OFFBSR1: // 0xC08A
case LOC._OFFBSR1: case LOC._OFFBSR1: // 0xC08E
_readbsr = false; _readbsr = false;
_writebsr = false; _writebsr = false;
_bsr2 = false; _bsr2 = false;
_prewrite = false;
_debug('Bank 1 Off'); _debug('Bank 1 Off');
break; break;
case LOC.READWRBSR1: case LOC.READWRBSR1: // 0xC08B
case LOC._READWRBSR1: case LOC._READWRBSR1: // 0xC08F
_readbsr = true; _readbsr = true;
_writebsr = ((_last & 0xF3) == (off & 0xF3)); _writebsr = _prewrite;
_bsr2 = false; _bsr2 = false;
_prewrite = true;
_debug('Bank 1 Read/Write'); _debug('Bank 1 Read/Write');
break; break;
@ -155,7 +163,10 @@ function LanguageCard(io, slot, rom) {
default: default:
break; break;
} }
_last = off;
if (val !== undefined) {
_prewrite = false;
}
if (_readbsr) { if (_readbsr) {
_read1 = _bsr2 ? _bank2 : _bank1; _read1 = _bsr2 ? _bank2 : _bank1;
@ -207,7 +218,7 @@ function LanguageCard(io, slot, rom) {
readbsr: _readbsr, readbsr: _readbsr,
writebsr: _writebsr, writebsr: _writebsr,
bsr2: _bsr2, bsr2: _bsr2,
last: _last, prewrite: _prewrite,
bank1: _bank1.getState(), bank1: _bank1.getState(),
bank2: _bank2.getState() bank2: _bank2.getState()
}; };
@ -219,7 +230,7 @@ function LanguageCard(io, slot, rom) {
_bank1.setState(state.bank1); _bank1.setState(state.bank1);
_bank2.setState(state.bank2); _bank2.setState(state.bank2);
_access(-1); _access(-1);
_last = state.last; _prewrite = state.prewrite;
} }
}; };
} }

View File

@ -784,7 +784,6 @@ function _keydown(evt) {
io.keyDown(0x1b); io.keyDown(0x1b);
} else if (evt.keyCode == 16) { // Shift } else if (evt.keyCode == 16) { // Shift
keyboard.shiftKey(true); keyboard.shiftKey(true);
io.buttonDown(2);
} else if (evt.keyCode == 17) { // Control } else if (evt.keyCode == 17) { // Control
keyboard.controlKey(true); keyboard.controlKey(true);
} }
@ -796,7 +795,6 @@ function _keyup(evt) {
if (evt.keyCode == 16) { // Shift if (evt.keyCode == 16) { // Shift
keyboard.shiftKey(false); keyboard.shiftKey(false);
io.buttonUp(2);
} else if (evt.keyCode == 17) { // Control } else if (evt.keyCode == 17) { // Control
keyboard.controlKey(false); keyboard.controlKey(false);
} }

View File

@ -766,7 +766,6 @@ function _keydown(evt) {
io.keyDown(0x1b); io.keyDown(0x1b);
} else if (evt.keyCode == 16) { // Shift } else if (evt.keyCode == 16) { // Shift
keyboard.shiftKey(true); keyboard.shiftKey(true);
io.buttonDown(2);
} else if (evt.keyCode == 17) { // Control } else if (evt.keyCode == 17) { // Control
keyboard.controlKey(true); keyboard.controlKey(true);
} else if (evt.keyCode == 91 || evt.keyCode == 93) { // Command } else if (evt.keyCode == 91 || evt.keyCode == 93) { // Command
@ -782,7 +781,6 @@ function _keyup(evt) {
if (evt.keyCode == 16) { // Shift if (evt.keyCode == 16) { // Shift
keyboard.shiftKey(false); keyboard.shiftKey(false);
io.buttonUp(2);
} else if (evt.keyCode == 17) { // Control } else if (evt.keyCode == 17) { // Control
keyboard.controlKey(false); keyboard.controlKey(false);
} else if (evt.keyCode == 91 || evt.keyCode == 93) { // Command } else if (evt.keyCode == 91 || evt.keyCode == 93) { // Command

101
js/mmu.js
View File

@ -29,6 +29,7 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
var _bank1; var _bank1;
var _readbsr; var _readbsr;
var _writebsr; var _writebsr;
var _prewrite;
// Auxilliary ROM // Auxilliary ROM
var _intcxrom; var _intcxrom;
@ -112,6 +113,7 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
_bank1 = true; _bank1 = true;
_readbsr = false; _readbsr = false;
_writebsr = false; _writebsr = false;
_prewrite = false;
_auxRamRead = false; _auxRamRead = false;
_auxRamWrite = false; _auxRamWrite = false;
@ -125,11 +127,9 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
} }
function _debug() { function _debug() {
// debug.apply(this, arguments); // console.debug.apply(this, arguments);
} }
var _last = 0x00;
function Switches() { function Switches() {
var locs = {}; var locs = {};
@ -187,9 +187,11 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
var mem60_BF = [new RAM(0x60,0xBF), new RAM(0x60,0xBF)]; var mem60_BF = [new RAM(0x60,0xBF), new RAM(0x60,0xBF)];
var memC0_C0 = [switches]; var memC0_C0 = [switches];
var memC1_CF = [io, auxRom]; var memC1_CF = [io, auxRom];
var memD0_DF = [rom, var memD0_DF = [
new RAM(0xD0,0xDF), new RAM(0xD0,0xDF), rom,
new RAM(0xD0,0xDF), new RAM(0xD0,0xDF)]; new RAM(0xD0,0xDF), new RAM(0xD0,0xDF),
new RAM(0xD0,0xDF), new RAM(0xD0,0xDF)
];
var memE0_FF = [rom, new RAM(0xE0,0xFF), new RAM(0xE0,0xFF)]; var memE0_FF = [rom, new RAM(0xE0,0xFF), new RAM(0xE0,0xFF)];
io.setSlot(3, auxRom); io.setSlot(3, auxRom);
@ -391,7 +393,7 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
case LOC._80STOREOFF: case LOC._80STOREOFF:
if (val !== undefined) { if (val !== undefined) {
_80store = false; _80store = false;
// _debug('80 Store Off'); _debug('80 Store Off');
} else { } else {
// Chain to io for keyboard // Chain to io for keyboard
result = io.ioSwitch(off, val); result = io.ioSwitch(off, val);
@ -400,7 +402,7 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
case LOC._80STOREON: case LOC._80STOREON:
if (val !== undefined) { if (val !== undefined) {
_80store = true; _80store = true;
// _debug('80 Store On'); _debug('80 Store On');
} else } else
result = 0; result = 0;
break; break;
@ -436,13 +438,13 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
case LOC.INTCXROMOFF: case LOC.INTCXROMOFF:
if (val !== undefined) { if (val !== undefined) {
_intcxrom = false; _intcxrom = false;
// _debug('Int CX ROM Off'); _debug('Int CX ROM Off');
} }
break; break;
case LOC.INTCXROMON: case LOC.INTCXROMON:
if (val !== undefined) { if (val !== undefined) {
_intcxrom = true; _intcxrom = true;
// _debug('Int CX ROM On'); _debug('Int CX ROM On');
} }
break; break;
case LOC.ALTZPOFF: // 0x08 case LOC.ALTZPOFF: // 0x08
@ -473,14 +475,16 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
// Graphics Switches // Graphics Switches
case LOC.PAGE1: case LOC.PAGE1:
_page2 = false; if (_80store) {
if (!_80store) { _page2 = false;
} else {
result = io.ioSwitch(off, val); result = io.ioSwitch(off, val);
} }
break; break;
case LOC.PAGE2: case LOC.PAGE2:
_page2 = true; if (_80store) {
if (!_80store) { _page2 = true;
} else {
result = io.ioSwitch(off, val); result = io.ioSwitch(off, val);
} }
break; break;
@ -488,60 +492,68 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
// Language Card Switches // Language Card Switches
case LOC.READBSR2: // 0xC080 case LOC.READBSR2: // 0xC080
case LOC._READBSR2: case LOC._READBSR2: // 0xC084
_bank1 = false; _bank1 = false;
_readbsr = true; _readbsr = true;
_writebsr = false; _writebsr = false;
_debug('Bank 2 Read'); _prewrite = false;
// _debug('Bank 2 Read');
break; break;
case LOC.WRITEBSR2: // 0xC081 case LOC.WRITEBSR2: // 0xC081
case LOC._WRITEBSR2: case LOC._WRITEBSR2: // 0xC085
_bank1 = false; _bank1 = false;
_readbsr = false; _readbsr = false;
_writebsr = _writebsr || ((_last & 0xF3) == (off & 0xF3)); _writebsr = _prewrite;
_debug('Bank 2 Write'); _prewrite = true;
// _debug('Bank 2 Write');
break; break;
case LOC.OFFBSR2: // 0xC082 case LOC.OFFBSR2: // 0xC082
case LOC._OFFBSR2: case LOC._OFFBSR2: // 0xC086
_bank1 = false; _bank1 = false;
_readbsr = false; _readbsr = false;
_writebsr = false; _writebsr = false;
_debug('Bank 2 Off'); _prewrite = false;
// _debug('Bank 2 Off');
break; break;
case LOC.READWRBSR2: // 0xC083 case LOC.READWRBSR2: // 0xC083
case LOC._READWRBSR2: case LOC._READWRBSR2: // 0xC087
_bank1 = false; _bank1 = false;
_readbsr = true; _readbsr = true;
_writebsr = _writebsr || ((_last & 0xF3) == (off & 0xF3)); _writebsr = _prewrite;
_debug('Bank 2 Read/Write'); _prewrite = true;
// _debug('Bank 2 Read/Write');
break; break;
case LOC.READBSR1: // 0xC088 case LOC.READBSR1: // 0xC088
case LOC._READBSR1: case LOC._READBSR1: // 0xC08c
_bank1 = true; _bank1 = true;
_readbsr = true; _readbsr = true;
_writebsr = false; _writebsr = false;
_debug('Bank 1 Read'); _prewrite = false;
// _debug('Bank 1 Read');
break; break;
case LOC.WRITEBSR1: // 0xC089 case LOC.WRITEBSR1: // 0xC089
case LOC._WRITEBSR1: case LOC._WRITEBSR1: // 0xC08D
_bank1 = true; _bank1 = true;
_readbsr = false; _readbsr = false;
_writebsr = _writebsr || ((_last & 0xF3) == (off & 0xF3)); _writebsr = _prewrite;
_debug('Bank 1 Write'); _prewrite = true;
// _debug('Bank 1 Write');
break; break;
case LOC.OFFBSR1: // 0xC08A case LOC.OFFBSR1: // 0xC08A
case LOC._OFFBSR1: case LOC._OFFBSR1: // 0xC08E
_bank1 = true; _bank1 = true;
_readbsr = false; _readbsr = false;
_writebsr = false; _writebsr = false;
_debug('Bank 1 Off'); _prewrite = false;
// _debug('Bank 1 Off');
break; break;
case LOC.READWRBSR1: // 0xC08B case LOC.READWRBSR1: // 0xC08B
case LOC._READWRBSR1: case LOC._READWRBSR1: // 0xC08F
_bank1 = true; _bank1 = true;
_readbsr = true; _readbsr = true;
_writebsr = _writebsr || ((_last & 0xF3) == (off & 0xF3)); _writebsr = _prewrite;
_debug('Bank 1 Read/Write'); _prewrite = true;
//_debug('Bank 1 Read/Write');
break; break;
// Status registers // Status registers
@ -587,7 +599,10 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
debug('MMU missing register ' + toHex(off)); debug('MMU missing register ' + toHex(off));
break; break;
} }
_last = off;
if (val !== undefined) {
_prewrite = false;
}
if (result !== undefined) if (result !== undefined)
return result; return result;
@ -601,11 +616,6 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
return { return {
start: function mmu_start() { start: function mmu_start() {
// Fake call start to register switches
io.start();
lores1.start();
lores2.start();
return 0x00; return 0x00;
}, },
end: function mmu_end() { end: function mmu_end() {
@ -615,6 +625,7 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
debug('reset'); debug('reset');
_initSwitches(); _initSwitches();
_updateBanks(); _updateBanks();
io.reset();
}, },
read: function mmu_read(page, off, debug) { read: function mmu_read(page, off, debug) {
return _readPages[page].read(page, off, debug); return _readPages[page].read(page, off, debug);
@ -630,7 +641,7 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
readbsr: _readbsr, readbsr: _readbsr,
writebsr: _writebsr, writebsr: _writebsr,
bank1: _bank1, bank1: _bank1,
last: _last, prewrite: _prewrite,
intcxrom: _intcxrom, intcxrom: _intcxrom,
slot3rom: _slot3rom, slot3rom: _slot3rom,
@ -645,8 +656,10 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
mem02_03: [mem02_03[0].getState(), mem02_03[1].getState()], mem02_03: [mem02_03[0].getState(), mem02_03[1].getState()],
mem0C_1F: [mem0C_1F[0].getState(), mem0C_1F[1].getState()], mem0C_1F: [mem0C_1F[0].getState(), mem0C_1F[1].getState()],
mem60_BF: [mem60_BF[0].getState(), mem60_BF[1].getState()], mem60_BF: [mem60_BF[0].getState(), mem60_BF[1].getState()],
memD0_DF: [memD0_DF[0].getState(), memD0_DF[1].getState(), memD0_DF: [
memD0_DF[2].getState(), memD0_DF[3].getState()], memD0_DF[0].getState(), memD0_DF[1].getState(),
memD0_DF[2].getState(), memD0_DF[3].getState()
],
memE0_FF: [memE0_FF[0].getState(), memE0_FF[1].getState()] memE0_FF: [memE0_FF[0].getState(), memE0_FF[1].getState()]
}; };
}, },
@ -680,7 +693,7 @@ function MMU(cpu, lores1, lores2, hires1, hires2, io, rom)
memE0_FF[1].setState(state.memE0_FF[1]); memE0_FF[1].setState(state.memE0_FF[1]);
_access(-1); _access(-1);
_last = state.last; _prewrite = state.prewrite;
} }
}; };
} }