mirror of
https://github.com/whscullin/apple2js.git
synced 2024-01-12 14:14:38 +00:00
Merge pull request #4 from whscullin/whscullin/audit_fixes_1
Fix things revealed by zellyn/a2audit
This commit is contained in:
commit
dc146bf630
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
101
js/mmu.js
@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user