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

View File

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

View File

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

View File

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