888 lines
40 KiB
JavaScript
888 lines
40 KiB
JavaScript
/*-------------------------------------------------------------------------
|
|
| SAE - Scripted Amiga Emulator
|
|
| https://github.com/naTmeg/ScriptedAmigaEmulator
|
|
|
|
|
| Copyright (C) 2012-2016 Rupert Hausberger
|
|
|
|
|
| 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 2
|
|
| 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.
|
|
|
|
|
| Note: ported from WinUAE 3.2.x
|
|
-------------------------------------------------------------------------*/
|
|
/* global constants */
|
|
|
|
const SAEC_Custom_DMAF_AUD0EN = 1 << 0;
|
|
const SAEC_Custom_DMAF_AUD1EN = 1 << 1;
|
|
const SAEC_Custom_DMAF_AUD2EN = 1 << 2;
|
|
const SAEC_Custom_DMAF_AUD3EN = 1 << 3;
|
|
const SAEC_Custom_DMAF_DSKEN = 1 << 4;
|
|
const SAEC_Custom_DMAF_SPREN = 1 << 5;
|
|
const SAEC_Custom_DMAF_BLTEN = 1 << 6;
|
|
const SAEC_Custom_DMAF_COPEN = 1 << 7;
|
|
const SAEC_Custom_DMAF_BPLEN = 1 << 8;
|
|
const SAEC_Custom_DMAF_DMAEN = 1 << 9;
|
|
const SAEC_Custom_DMAF_BLTPRI = 1 << 10;
|
|
const SAEC_Custom_DMAF_BZERO = 1 << 13;
|
|
const SAEC_Custom_DMAF_BBUSY = 1 << 14;
|
|
const SAEC_Custom_DMAF_SETCLR = 1 << 15;
|
|
|
|
const SAEC_Custom_INTF_TBE = 1 << 0;
|
|
const SAEC_Custom_INTF_DSKBLK = 1 << 1;
|
|
//const SAEC_Custom_INTF_PORTS = 1 << 3;
|
|
//const SAEC_Custom_INTF_COPER = 1 << 4;
|
|
const SAEC_Custom_INTF_VERTB = 1 << 5;
|
|
const SAEC_Custom_INTF_BLIT = 1 << 6;
|
|
//const SAEC_Custom_INTF_AUD0 = 1 << 7;
|
|
//const SAEC_Custom_INTF_AUD1 = 1 << 8;
|
|
//const SAEC_Custom_INTF_AUD2 = 1 << 9;
|
|
//const SAEC_Custom_INTF_AUD3 = 1 << 10;
|
|
const SAEC_Custom_INTF_RBF = 1 << 11;
|
|
const SAEC_Custom_INTF_DSKSYN = 1 << 12;
|
|
//const SAEC_Custom_INTF_EXTER = 1 << 13;
|
|
const SAEC_Custom_INTF_INTEN = 1 << 14;
|
|
const SAEC_Custom_INTF_SETCLR = 1 << 15;
|
|
|
|
/*---------------------------------*/
|
|
/* global references */
|
|
|
|
var SAER_Custom_put16_real = null;
|
|
|
|
/*---------------------------------*/
|
|
/* global variables */
|
|
|
|
var SAEV_Custom_bank = null;
|
|
|
|
var SAEV_Custom_dmacon = 0;
|
|
var SAEV_Custom_intreq = 0;
|
|
var SAEV_Custom_intena = 0;
|
|
var SAEV_Custom_adkcon = 0;
|
|
var SAEV_Custom_last_value = 0;
|
|
|
|
/*---------------------------------*/
|
|
/* global functions */
|
|
|
|
function SAEF_Custom_dmaen(dmamask) {
|
|
return (SAEV_Custom_dmacon & dmamask) != 0 && (SAEV_Custom_dmacon & SAEC_Custom_DMAF_DMAEN) != 0;
|
|
}
|
|
|
|
/*---------------------------------*/
|
|
|
|
function SAEO_Custom() {
|
|
var readMap = null;
|
|
var writeMap = null;
|
|
|
|
//var last_custom_value = 0; -> SAEV_Custom_last_value
|
|
|
|
//var dmacon = 0; -> SAEV_Custom_dmacon
|
|
//var intreq = 0; -> SAEV_Custom_intreq
|
|
//var intena = 0; -> SAEV_Custom_intena
|
|
//var adkcon = 0; -> SAEV_Custom_adkcon
|
|
var intreq_internal = 0;
|
|
var intena_internal = 0;
|
|
|
|
const INT_PROCESSING_DELAY = 3 * SAEC_Events_CYCLE_UNIT;
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
this.setup = function () {
|
|
createReadMap();
|
|
createWriteMap();
|
|
}
|
|
this.reset = function () {
|
|
SAEV_Custom_dmacon = 0;
|
|
SAEV_Custom_intena = intena_internal = 0;
|
|
intreq_internal = 0;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
function DMACONR(hpos) {
|
|
SAER.playfield.decide_line(hpos);
|
|
SAER.playfield.decide_fetch_safe(hpos);
|
|
SAEV_Custom_dmacon &= ~(0x4000 | 0x2000);
|
|
SAEV_Custom_dmacon |= (((SAEV_Blitter_interrupt || (!SAEV_Blitter_interrupt && SAEV_config.chipset.agnusBltBusyBug && !SAER_Blitter_blt_info.got_cycle)) ? 0 : 0x4000) | (SAER_Blitter_blt_info.blitzero ? 0x2000 : 0));
|
|
return SAEV_Custom_dmacon;
|
|
}
|
|
function DMACON(v, hpos) {
|
|
var oldcon = SAEV_Custom_dmacon;
|
|
|
|
SAER.playfield.decide_line(hpos);
|
|
SAER.playfield.decide_fetch_safe(hpos);
|
|
|
|
if (v & 0x8000) SAEV_Custom_dmacon |= v & 0x7FFF; else SAEV_Custom_dmacon &= ~v;
|
|
SAEV_Custom_dmacon &= 0x07FF;
|
|
|
|
var changed = SAEV_Custom_dmacon ^ oldcon;
|
|
var oldcop = (oldcon & SAEC_Custom_DMAF_COPEN) != 0 && (oldcon & SAEC_Custom_DMAF_DMAEN) != 0;
|
|
var newcop = (SAEV_Custom_dmacon & SAEC_Custom_DMAF_COPEN) != 0 && (SAEV_Custom_dmacon & SAEC_Custom_DMAF_DMAEN) != 0;
|
|
|
|
if (oldcop != newcop) {
|
|
if (newcop && !oldcop) {
|
|
SAER.copper.compute_spcflag_copper(hpos);
|
|
} else if (!newcop) {
|
|
SAER.copper.copper_stop();
|
|
}
|
|
}
|
|
|
|
if ((SAEV_Custom_dmacon & SAEC_Custom_DMAF_BLTPRI) > (oldcon & SAEC_Custom_DMAF_BLTPRI) && SAEV_Blitter_bltstate != SAEC_Blitter_bltstate_DONE)
|
|
SAEF_setSpcFlags(SAEC_spcflag_BLTNASTY);
|
|
|
|
if (SAEF_Custom_dmaen(SAEC_Custom_DMAF_BLTEN) && SAEV_Blitter_bltstate == SAEC_Blitter_bltstate_INIT)
|
|
SAER.blitter.blitter_check_start();
|
|
|
|
if ((SAEV_Custom_dmacon & (SAEC_Custom_DMAF_BLTPRI | SAEC_Custom_DMAF_BLTEN | SAEC_Custom_DMAF_DMAEN)) != (SAEC_Custom_DMAF_BLTPRI | SAEC_Custom_DMAF_BLTEN | SAEC_Custom_DMAF_DMAEN))
|
|
SAEF_clrSpcFlags(SAEC_spcflag_BLTNASTY);
|
|
|
|
if (changed & (SAEC_Custom_DMAF_DMAEN | 0x0f))
|
|
SAER.audio.state_machine();
|
|
|
|
if (changed & (SAEC_Custom_DMAF_DMAEN | SAEC_Custom_DMAF_BPLEN))
|
|
SAER.playfield.set_bitplane_maybe_start_hpos(hpos);
|
|
}
|
|
|
|
/*---------------------------------*/
|
|
|
|
function INTREQR() {
|
|
return SAEV_Custom_intreq;
|
|
}
|
|
this.INTREQ_0 = function(v) {
|
|
var old = SAEV_Custom_intreq;
|
|
|
|
if (v & 0x8000) SAEV_Custom_intreq |= v & 0x7FFF; else SAEV_Custom_intreq &= ~v;
|
|
|
|
//if ((old & 0x0800) && !(SAEV_Custom_intreq & 0x0800)) serial_rbf_clear();
|
|
|
|
var old2 = intreq_internal;
|
|
intreq_internal = SAEV_Custom_intreq;
|
|
if (old == SAEV_Custom_intreq && old2 == intreq_internal)
|
|
return false;
|
|
if (v & 0x8000)
|
|
SAER.m68k.doint();
|
|
return true;
|
|
}
|
|
this.INTREQ = function(v) {
|
|
if (this.INTREQ_0(v)) {
|
|
//serial_check_irq();
|
|
SAER.devices.rethink();
|
|
}
|
|
}
|
|
|
|
/*---------------------------------*/
|
|
|
|
function INTENAR() {
|
|
return SAEV_Custom_intena;
|
|
}
|
|
function INTENA(v, hpos) {
|
|
var old = SAEV_Custom_intena;
|
|
|
|
if (v & 0x8000) SAEV_Custom_intena |= v & 0x7FFF; else SAEV_Custom_intena &= ~v;
|
|
|
|
if (!(v & 0x8000) && old == SAEV_Custom_intena && SAEV_Custom_intena == intena_internal)
|
|
return;
|
|
|
|
intena_internal = SAEV_Custom_intena;
|
|
if (v & 0x8000)
|
|
SAER.m68k.doint();
|
|
}
|
|
|
|
/*---------------------------------*/
|
|
|
|
function ADKCONR() {
|
|
return SAEV_Custom_adkcon;
|
|
}
|
|
function ADKCON(v, hpos) {
|
|
if (SAEV_config.audio.mode != SAEC_Config_Audio_Mode_Off)
|
|
SAER.audio.update();
|
|
|
|
SAER.disk.update(hpos);
|
|
SAER.disk.update_adkcon(hpos, v);
|
|
|
|
if (v & 0x8000) SAEV_Custom_adkcon |= v & 0x7FFF; else SAEV_Custom_adkcon &= ~v;
|
|
|
|
SAER.audio.update_adkmasks();
|
|
//if ((v >> 11) & 1) serial_uartbreak((SAEV_Custom_adkcon >> 11) & 1);
|
|
}
|
|
|
|
/*---------------------------------*/
|
|
|
|
this.send_interrupt = function(num, delay) {
|
|
this.INTREQ_0(SAEC_Custom_INTF_SETCLR | num);
|
|
}
|
|
|
|
/*---------------------------------*/
|
|
|
|
/*
|
|
var irq_nmi = 0;
|
|
this.NMI_delayed = function() {
|
|
irq_nmi = 1;
|
|
}*/
|
|
|
|
this.intlev = function() {
|
|
var imask = intreq_internal & intena_internal;
|
|
/*if (irq_nmi) {
|
|
irq_nmi = 0;
|
|
return 7;
|
|
}*/
|
|
if (imask && (intena_internal & SAEC_Custom_INTF_INTEN)) { //0x4000)) {
|
|
if (imask & (0x4000 | 0x2000)) return 6; // 13 14
|
|
if (imask & (0x1000 | 0x0800)) return 5; // 11 12
|
|
if (imask & (0x0400 | 0x0200 | 0x0100 | 0x0080)) return 4; // 7 8 9 10
|
|
if (imask & (0x0040 | 0x0020 | 0x0010)) return 3; // 4 5 6
|
|
if (imask & 0x0008) return 2; // 3
|
|
if (imask & (0x0001 | 0x0002 | 0x0004)) return 1; // 0 1 2
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
function get16_real(hpos, addr, noput, isbyte) {
|
|
var v = false;
|
|
|
|
addr &= 0xfff;
|
|
try {
|
|
v = readMap[(addr & 0x1fe) >> 1](hpos);
|
|
} catch(e) {
|
|
if (!(e instanceof Error))
|
|
throw e;
|
|
/* OCS/ECS:
|
|
* reading write-only register causes write with last value in chip
|
|
* bus (custom registers, chipram, slowram)
|
|
* and finally returns either all ones or something weird if DMA happens
|
|
* in next (or previous) cycle.. FIXME.
|
|
*
|
|
* OCS-only special case: DFF000 (BLTDDAT) will always return whatever was left in bus
|
|
*
|
|
* AGA:
|
|
* Can also return last CPU accessed value
|
|
* Remembers old SAEV_Custom_last_value
|
|
*/
|
|
v = SAEV_Custom_last_value;
|
|
SAER.playfield.set_line_cyclebased();
|
|
if (!noput) {
|
|
var l;
|
|
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
|
|
l = 0;
|
|
} else {
|
|
// last chip bus value (read or write) is written to register
|
|
/*if (SAEV_config.cpu.compatible && SAEV_config.cpu.model == SAEC_Config_CPU_Model_68000) { //FIX 68000 prefetch not implemented
|
|
if (isbyte)
|
|
l = (SAER_CPU_regs.chipset_latch_rw << 8) | (SAER_CPU_regs.chipset_latch_rw & 0xff);
|
|
else
|
|
l = SAER_CPU_regs.chipset_latch_rw;
|
|
} else
|
|
l = SAER_CPU_regs.chipset_latch_rw;
|
|
*/
|
|
l = 0;
|
|
}
|
|
SAER.playfield.decide_line(hpos);
|
|
SAER.playfield.decide_fetch_safe(hpos);
|
|
var r = put16_real(hpos, addr, l, true);
|
|
|
|
/* CPU gets back (OCS/ECS only):
|
|
- if last cycle was DMA cycle: DMA cycle data
|
|
- if last cycle was not DMA cycle: FFFF or some ANDed old data. */
|
|
|
|
/*var c = SAER_Events_cycle_line[hpos] & SAEC_Events_cycle_line_MASK;
|
|
var bmdma = SAER.playfield.is_bitplane_dma(hpos);
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
|
|
if (bmdma || (c > SAEC_Events_cycle_line_REFRESH && c < SAEC_Events_cycle_line_CPU))
|
|
v = SAEV_Custom_last_value;
|
|
else if (c == SAEC_Events_cycle_line_CPU)
|
|
v = SAER_CPU_regs.db;
|
|
else
|
|
v = SAEV_Custom_last_value >>> ((addr & 2) ? 0 : 16);
|
|
} else {
|
|
if (bmdma || (c > SAEC_Events_cycle_line_REFRESH && c < SAEC_Events_cycle_line_CPU))
|
|
v = SAEV_Custom_last_value;
|
|
else
|
|
// refresh checked because refresh cycles do not always set SAEV_Custom_last_value for performance reasons.
|
|
v = 0xffff;
|
|
}*/
|
|
var bmdma = SAER.playfield.is_bitplane_dma(hpos);
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
|
|
if (bmdma)
|
|
v = SAEV_Custom_last_value & 0xffff;
|
|
else
|
|
v = (SAEV_Custom_last_value >>> ((addr & 2) ? 0 : 16)) & 0xffff;
|
|
} else {
|
|
if (bmdma)
|
|
v = SAEV_Custom_last_value & 0xffff;
|
|
else
|
|
v = 0xffff;
|
|
}
|
|
|
|
//SAEF_log("Custom.get16_real() %08x read = %04x. value written = %04x", 0xdff000 | addr, v, l);
|
|
return v;
|
|
}
|
|
}
|
|
return v;
|
|
}
|
|
|
|
function get16_2(addr, isbyte) {
|
|
var hpos = SAER.events.current_hpos();
|
|
|
|
SAER.copper.sync_copper_with_cpu(hpos, 1);
|
|
//var v =
|
|
return get16_real(hpos, addr, false, isbyte);
|
|
/*#ifdef ACTION_REPLAY
|
|
#ifdef ACTION_REPLAY_COMMON
|
|
addr &= 0x1ff;
|
|
ar_custom[addr + 0] = (uae_u8)(v >> 8);
|
|
ar_custom[addr + 1] = (uae_u8)(v);
|
|
#endif
|
|
#endif
|
|
return v;*/
|
|
}
|
|
function get8(addr) {
|
|
if ((addr & 0xffff) < 0x8000 && SAEV_config.chipset.fatGaryRev >= 0)
|
|
return SAER.memory.dummyGet(addr, 1, false, 0);
|
|
|
|
return (get16_2(addr & ~1, true) >> (addr & 1 ? 0 : 8)) & 0xff;
|
|
}
|
|
function get16(addr) {
|
|
if ((addr & 0xffff) < 0x8000 && SAEV_config.chipset.fatGaryRev >= 0)
|
|
return SAER.memory.dummyGet(addr, 2, false, 0);
|
|
|
|
if (addr & 1) {
|
|
/* think about move.w $dff005,d0.. (68020+ only) */
|
|
addr &= ~1;
|
|
return ((get16_2(addr, false) << 8) & 0xff00) | (get16_2(addr + 2, false) >> 8);
|
|
}
|
|
return get16_2(addr, false);
|
|
}
|
|
function getInst16(addr) {
|
|
if (SAEV_config.cpu.model >= SAEC_Config_CPU_Model_68020)
|
|
return SAEF_Memory_dummyGetInst16(addr);
|
|
return get16(addr);
|
|
}
|
|
function get32(addr) {
|
|
if ((addr & 0xffff) < 0x8000 && SAEV_config.chipset.fatGaryRev >= 0)
|
|
return SAER.memory.dummyGet(addr, 4, false, 0);
|
|
|
|
return ((get16(addr) << 16) | get16(addr + 2)) >>> 0;
|
|
}
|
|
function getInst32(addr) {
|
|
if (SAEV_config.cpu.model >= SAEC_Config_CPU_Model_68020)
|
|
return SAEF_Memory_dummyGetInst32(addr);
|
|
return get32(addr);
|
|
}
|
|
|
|
/*---------------------------------*/
|
|
|
|
function put16_real(hpos, addr, value, noget) {
|
|
addr &= 0x1FE;
|
|
value &= 0xffff;
|
|
|
|
/*#ifdef ACTION_REPLAY
|
|
#ifdef ACTION_REPLAY_COMMON
|
|
ar_custom[addr+0]=(uae_u8)(value>>8);
|
|
ar_custom[addr+1]=(uae_u8)(value);
|
|
#endif
|
|
#endif*/
|
|
|
|
try {
|
|
writeMap[addr >> 1](value, hpos);
|
|
} catch(e) {
|
|
if (!(e instanceof Error))
|
|
throw e;
|
|
/* writing to read-only register causes read access */
|
|
if (!noget) {
|
|
//SAEF_log("Custom.put16_real() %04x written", addr);
|
|
get16_real(hpos, addr, true, false);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
SAER_Custom_put16_real = put16_real;
|
|
|
|
function put16(addr, value) {
|
|
var hpos = SAER.events.current_hpos();
|
|
if ((addr & 0xffff) < 0x8000 && SAEV_config.chipset.fatGaryRev >= 0) {
|
|
SAER.memory.dummyPut(addr, 2, value);
|
|
return;
|
|
}
|
|
SAER.copper.sync_copper_with_cpu(hpos, 1);
|
|
if (addr & 1) {
|
|
addr &= ~1;
|
|
put16_real(hpos, addr, (value >> 8) | (value & 0xff00), 0);
|
|
put16_real(hpos, addr + 2, ((value << 8) & 0xff00) | (value & 0x00ff), 0);
|
|
return;
|
|
}
|
|
put16_real(hpos, addr, value, 0);
|
|
}
|
|
function put8(addr, value) {
|
|
if ((addr & 0xffff) < 0x8000 && SAEV_config.chipset.fatGaryRev >= 0) {
|
|
SAER.memory.dummyPut(addr, 1, value);
|
|
return;
|
|
}
|
|
var rval;
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
|
|
if (addr & 1)
|
|
rval = value & 0xff;
|
|
else
|
|
rval = (value << 8) | (value & 0xff);
|
|
} else
|
|
rval = (value << 8) | (value & 0xff);
|
|
|
|
/*if (currprefs.cs_bytecustomwritebug) {
|
|
if (addr & 1)
|
|
put16(addr & ~1, rval);
|
|
else
|
|
put16(addr, value << 8);
|
|
} else*/
|
|
put16(addr & ~1, rval);
|
|
}
|
|
function put32(addr, value) {
|
|
if ((addr & 0xffff) < 0x8000 && SAEV_config.chipset.fatGaryRev >= 0) {
|
|
SAER.memory.dummyPut(addr, 4, value);
|
|
return;
|
|
}
|
|
put16(addr & 0xfffe, value >>> 16);
|
|
put16((addr + 2) & 0xfffe, value & 0xffff);
|
|
}
|
|
|
|
SAEV_Custom_bank = new SAEO_Memory_addrbank(
|
|
get32, get16, get8,
|
|
put32, put16, put8,
|
|
SAEF_Memory_defaultXLate, SAEF_Memory_defaultCheck, null, null, "Custom chipset",
|
|
getInst32, getInst16,
|
|
//SAEC_Memory_addrbank_flag_IO, S_READ, S_WRITE, null, 0x1ff, 0xdff000
|
|
SAEC_Memory_addrbank_flag_IO, null, 0x1ff, 0xdff000
|
|
);
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
function createReadMap() {
|
|
var i;
|
|
|
|
readMap = new Array(0x100);
|
|
for (i = 0; i < readMap.length; i++) readMap[i] = false;
|
|
|
|
readMap[0x002 >> 1] = DMACONR;
|
|
readMap[0x004 >> 1] = function() { return SAER.playfield.VPOSR(); };
|
|
readMap[0x006 >> 1] = function() { return SAER.playfield.VHPOSR(); };
|
|
readMap[0x00A >> 1] = function() { return SAER.input.JOY0DAT(); };
|
|
readMap[0x00C >> 1] = function() { return SAER.input.JOY1DAT(); };
|
|
readMap[0x00E >> 1] = function() { return SAER.playfield.CLXDAT(); };
|
|
readMap[0x010 >> 1] = ADKCONR;
|
|
readMap[0x012 >> 1] = function() { return SAER.input.POT0DAT(); };
|
|
readMap[0x014 >> 1] = function() { return SAER.input.POT1DAT(); };
|
|
readMap[0x016 >> 1] = function() { return SAER.input.POTGOR(); };
|
|
readMap[0x018 >> 1] = function() { return SAER.serial.SERDATR(); };
|
|
readMap[0x01A >> 1] = function(hpos) { return SAER.disk.DSKBYTR(hpos); };
|
|
readMap[0x01C >> 1] = INTENAR;
|
|
readMap[0x01E >> 1] = INTREQR;
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE)
|
|
readMap[0x07C >> 1] = function() { return SAER.playfield.DENISEID(); };
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
|
|
readMap[0x180 >> 1] = function() { return SAER.playfield.COLOR_READ(0); };
|
|
readMap[0x182 >> 1] = function() { return SAER.playfield.COLOR_READ(1); };
|
|
readMap[0x184 >> 1] = function() { return SAER.playfield.COLOR_READ(2); };
|
|
readMap[0x186 >> 1] = function() { return SAER.playfield.COLOR_READ(3); };
|
|
readMap[0x188 >> 1] = function() { return SAER.playfield.COLOR_READ(4); };
|
|
readMap[0x18A >> 1] = function() { return SAER.playfield.COLOR_READ(5); };
|
|
readMap[0x18C >> 1] = function() { return SAER.playfield.COLOR_READ(6); };
|
|
readMap[0x18E >> 1] = function() { return SAER.playfield.COLOR_READ(7); };
|
|
readMap[0x190 >> 1] = function() { return SAER.playfield.COLOR_READ(8); };
|
|
readMap[0x192 >> 1] = function() { return SAER.playfield.COLOR_READ(9); };
|
|
readMap[0x194 >> 1] = function() { return SAER.playfield.COLOR_READ(10); };
|
|
readMap[0x196 >> 1] = function() { return SAER.playfield.COLOR_READ(11); };
|
|
readMap[0x198 >> 1] = function() { return SAER.playfield.COLOR_READ(12); };
|
|
readMap[0x19A >> 1] = function() { return SAER.playfield.COLOR_READ(13); };
|
|
readMap[0x19C >> 1] = function() { return SAER.playfield.COLOR_READ(14); };
|
|
readMap[0x19E >> 1] = function() { return SAER.playfield.COLOR_READ(15); };
|
|
readMap[0x1A0 >> 1] = function() { return SAER.playfield.COLOR_READ(16); };
|
|
readMap[0x1A2 >> 1] = function() { return SAER.playfield.COLOR_READ(17); };
|
|
readMap[0x1A4 >> 1] = function() { return SAER.playfield.COLOR_READ(18); };
|
|
readMap[0x1A6 >> 1] = function() { return SAER.playfield.COLOR_READ(19); };
|
|
readMap[0x1A8 >> 1] = function() { return SAER.playfield.COLOR_READ(20); };
|
|
readMap[0x1AA >> 1] = function() { return SAER.playfield.COLOR_READ(21); };
|
|
readMap[0x1AC >> 1] = function() { return SAER.playfield.COLOR_READ(22); };
|
|
readMap[0x1AE >> 1] = function() { return SAER.playfield.COLOR_READ(23); };
|
|
readMap[0x1B0 >> 1] = function() { return SAER.playfield.COLOR_READ(24); };
|
|
readMap[0x1B2 >> 1] = function() { return SAER.playfield.COLOR_READ(25); };
|
|
readMap[0x1B4 >> 1] = function() { return SAER.playfield.COLOR_READ(26); };
|
|
readMap[0x1B6 >> 1] = function() { return SAER.playfield.COLOR_READ(27); };
|
|
readMap[0x1B8 >> 1] = function() { return SAER.playfield.COLOR_READ(28); };
|
|
readMap[0x1BA >> 1] = function() { return SAER.playfield.COLOR_READ(29); };
|
|
readMap[0x1BC >> 1] = function() { return SAER.playfield.COLOR_READ(30); };
|
|
readMap[0x1BE >> 1] = function() { return SAER.playfield.COLOR_READ(31); };
|
|
}
|
|
}
|
|
|
|
function createWriteMap() {
|
|
var i;
|
|
|
|
writeMap = new Array(0x100);
|
|
for (i = 0; i < writeMap.length; i++) writeMap[i] = false;
|
|
|
|
writeMap[0x00E >> 1] = function(value, hpos) { SAER.playfield.CLXDAT(); };
|
|
writeMap[0x020 >> 1] = function(value, hpos) { SAER.disk.DSKPTH(value); };
|
|
writeMap[0x022 >> 1] = function(value, hpos) { SAER.disk.DSKPTL(value); };
|
|
writeMap[0x024 >> 1] = function(value, hpos) { SAER.disk.DSKLEN(value, hpos); };
|
|
writeMap[0x026 >> 1] = function(value, hpos) { /* SAER.disk.DSKDAT(value); */ };
|
|
writeMap[0x028 >> 1] = function(value, hpos) { SAER.playfield.REFPTR(value); };
|
|
writeMap[0x02A >> 1] = function(value, hpos) { SAER.playfield.VPOSW(value); };
|
|
writeMap[0x02C >> 1] = function(value, hpos) { SAER.playfield.VHPOSW(value); };
|
|
writeMap[0x02E >> 1] = function(value, hpos) { SAER.copper.COPCON(value); };
|
|
writeMap[0x030 >> 1] = function(value, hpos) { SAER.serial.SERDAT(value); };
|
|
writeMap[0x032 >> 1] = function(value, hpos) { SAER.serial.SERPER(value); };
|
|
writeMap[0x034 >> 1] = function(value, hpos) { SAER.input.POTGO(value); };
|
|
writeMap[0x036 >> 1] = function(value, hpos) { SAER.input.JOYTEST(value); };
|
|
/* 038 STREQU S * * * Strobe for horiz sync with VB and EQU
|
|
03A STRVBL S * * * Strobe for horiz sync with VB (vert blank)
|
|
03C STRHOR S * * * Strobe for horiz sync
|
|
03E STRLONG S * * * Strobe for identification of long horiz line*/
|
|
writeMap[0x040 >> 1] = function(value, hpos) { SAER.blitter.BLTCON0(hpos, value); };
|
|
writeMap[0x042 >> 1] = function(value, hpos) { SAER.blitter.BLTCON1(hpos, value); };
|
|
writeMap[0x044 >> 1] = function(value, hpos) { SAER.blitter.BLTAFWM(hpos, value); };
|
|
writeMap[0x046 >> 1] = function(value, hpos) { SAER.blitter.BLTALWM(hpos, value); };
|
|
writeMap[0x048 >> 1] = function(value, hpos) { SAER.blitter.BLTCPTH(hpos, value); };
|
|
writeMap[0x04A >> 1] = function(value, hpos) { SAER.blitter.BLTCPTL(hpos, value); };
|
|
writeMap[0x04C >> 1] = function(value, hpos) { SAER.blitter.BLTBPTH(hpos, value); };
|
|
writeMap[0x04E >> 1] = function(value, hpos) { SAER.blitter.BLTBPTL(hpos, value); };
|
|
writeMap[0x050 >> 1] = function(value, hpos) { SAER.blitter.BLTAPTH(hpos, value); };
|
|
writeMap[0x052 >> 1] = function(value, hpos) { SAER.blitter.BLTAPTL(hpos, value); };
|
|
writeMap[0x054 >> 1] = function(value, hpos) { SAER.blitter.BLTDPTH(hpos, value); };
|
|
writeMap[0x056 >> 1] = function(value, hpos) { SAER.blitter.BLTDPTL(hpos, value); };
|
|
writeMap[0x058 >> 1] = function(value, hpos) { SAER.blitter.BLTSIZE(hpos, value); };
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) {
|
|
writeMap[0x05A >> 1] = function(value, hpos) { SAER.blitter.BLTCON0L(hpos, value); };
|
|
writeMap[0x05C >> 1] = function(value, hpos) { SAER.blitter.BLTSIZV(hpos, value); };
|
|
writeMap[0x05E >> 1] = function(value, hpos) { SAER.blitter.BLTSIZH(hpos, value); };
|
|
}
|
|
writeMap[0x060 >> 1] = function(value, hpos) { SAER.blitter.BLTCMOD(hpos, value); };
|
|
writeMap[0x062 >> 1] = function(value, hpos) { SAER.blitter.BLTBMOD(hpos, value); };
|
|
writeMap[0x064 >> 1] = function(value, hpos) { SAER.blitter.BLTAMOD(hpos, value); };
|
|
writeMap[0x066 >> 1] = function(value, hpos) { SAER.blitter.BLTDMOD(hpos, value); };
|
|
/* - */
|
|
writeMap[0x070 >> 1] = function(value, hpos) { SAER.blitter.BLTCDAT(hpos, value); };
|
|
writeMap[0x072 >> 1] = function(value, hpos) { SAER.blitter.BLTBDAT(hpos, value); };
|
|
writeMap[0x074 >> 1] = function(value, hpos) { SAER.blitter.BLTADAT(hpos, value); };
|
|
/*if (SAEV_config.chipset.mask & (SAEC_Config_Chipset_Mask_ECS_AGNUS | SAEC_Config_Chipset_Mask_ECS_DENISE)) {
|
|
078 SPRHDAT W * * Ext. logic UHRES sprite pointer and data identifier
|
|
07A BPLHDAT W * * Ext. logic UHRES bit plane identifier
|
|
}*/
|
|
writeMap[0x07E >> 1] = function(value, hpos) { SAER.disk.DSKSYNC(hpos, value); };
|
|
writeMap[0x080 >> 1] = function(value, hpos) { SAER.copper.COP1LCH(value); };
|
|
writeMap[0x082 >> 1] = function(value, hpos) { SAER.copper.COP1LCL(value); };
|
|
writeMap[0x084 >> 1] = function(value, hpos) { SAER.copper.COP2LCH(value); };
|
|
writeMap[0x086 >> 1] = function(value, hpos) { SAER.copper.COP2LCL(value); };
|
|
writeMap[0x088 >> 1] = function(value, hpos) { SAER.copper.COPJMP(1, 0); };
|
|
writeMap[0x08A >> 1] = function(value, hpos) { SAER.copper.COPJMP(2, 0); };
|
|
writeMap[0x08E >> 1] = function(value, hpos) { SAER.playfield.DIWSTRT(hpos, value); };
|
|
writeMap[0x090 >> 1] = function(value, hpos) { SAER.playfield.DIWSTOP(hpos, value); };
|
|
writeMap[0x092 >> 1] = function(value, hpos) { SAER.playfield.DDFSTRT(hpos, value); };
|
|
writeMap[0x094 >> 1] = function(value, hpos) { SAER.playfield.DDFSTOP(hpos, value); };
|
|
writeMap[0x096 >> 1] = DMACON;
|
|
writeMap[0x098 >> 1] = function(value, hpos) { SAER.playfield.CLXCON(value); };
|
|
writeMap[0x09A >> 1] = INTENA;
|
|
writeMap[0x09C >> 1] = function(value, hpos) { SAER.custom.INTREQ(value); };
|
|
writeMap[0x09E >> 1] = ADKCON;
|
|
writeMap[0x0A0 >> 1] = function(value, hpos) { SAER.audio.AUDxLCH(0, value); };
|
|
writeMap[0x0A2 >> 1] = function(value, hpos) { SAER.audio.AUDxLCL(0, value); };
|
|
writeMap[0x0A4 >> 1] = function(value, hpos) { SAER.audio.AUDxLEN(0, value); };
|
|
writeMap[0x0A6 >> 1] = function(value, hpos) { SAER.audio.AUDxPER(0, value); };
|
|
writeMap[0x0A8 >> 1] = function(value, hpos) { SAER.audio.AUDxVOL(0, value); };
|
|
writeMap[0x0AA >> 1] = function(value, hpos) { SAER.audio.AUDxDAT(0, value); };
|
|
writeMap[0x0B0 >> 1] = function(value, hpos) { SAER.audio.AUDxLCH(1, value); };
|
|
writeMap[0x0B2 >> 1] = function(value, hpos) { SAER.audio.AUDxLCL(1, value); };
|
|
writeMap[0x0B4 >> 1] = function(value, hpos) { SAER.audio.AUDxLEN(1, value); };
|
|
writeMap[0x0B6 >> 1] = function(value, hpos) { SAER.audio.AUDxPER(1, value); };
|
|
writeMap[0x0B8 >> 1] = function(value, hpos) { SAER.audio.AUDxVOL(1, value); };
|
|
writeMap[0x0BA >> 1] = function(value, hpos) { SAER.audio.AUDxDAT(1, value); };
|
|
writeMap[0x0C0 >> 1] = function(value, hpos) { SAER.audio.AUDxLCH(2, value); };
|
|
writeMap[0x0C2 >> 1] = function(value, hpos) { SAER.audio.AUDxLCL(2, value); };
|
|
writeMap[0x0C4 >> 1] = function(value, hpos) { SAER.audio.AUDxLEN(2, value); };
|
|
writeMap[0x0C6 >> 1] = function(value, hpos) { SAER.audio.AUDxPER(2, value); };
|
|
writeMap[0x0C8 >> 1] = function(value, hpos) { SAER.audio.AUDxVOL(2, value); };
|
|
writeMap[0x0CA >> 1] = function(value, hpos) { SAER.audio.AUDxDAT(2, value); };
|
|
writeMap[0x0D0 >> 1] = function(value, hpos) { SAER.audio.AUDxLCH(3, value); };
|
|
writeMap[0x0D2 >> 1] = function(value, hpos) { SAER.audio.AUDxLCL(3, value); };
|
|
writeMap[0x0D4 >> 1] = function(value, hpos) { SAER.audio.AUDxLEN(3, value); };
|
|
writeMap[0x0D6 >> 1] = function(value, hpos) { SAER.audio.AUDxPER(3, value); };
|
|
writeMap[0x0D8 >> 1] = function(value, hpos) { SAER.audio.AUDxVOL(3, value); };
|
|
writeMap[0x0DA >> 1] = function(value, hpos) { SAER.audio.AUDxDAT(3, value); };
|
|
writeMap[0x0E0 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTH(hpos, value, 0); };
|
|
writeMap[0x0E2 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTL(hpos, value, 0); };
|
|
writeMap[0x0E4 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTH(hpos, value, 1); };
|
|
writeMap[0x0E6 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTL(hpos, value, 1); };
|
|
writeMap[0x0E8 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTH(hpos, value, 2); };
|
|
writeMap[0x0EA >> 1] = function(value, hpos) { SAER.playfield.BPLxPTL(hpos, value, 2); };
|
|
writeMap[0x0EC >> 1] = function(value, hpos) { SAER.playfield.BPLxPTH(hpos, value, 3); };
|
|
writeMap[0x0EE >> 1] = function(value, hpos) { SAER.playfield.BPLxPTL(hpos, value, 3); };
|
|
writeMap[0x0F0 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTH(hpos, value, 4); };
|
|
writeMap[0x0F2 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTL(hpos, value, 4); };
|
|
writeMap[0x0F4 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTH(hpos, value, 5); };
|
|
writeMap[0x0F6 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTL(hpos, value, 5); };
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
|
|
writeMap[0x0F8 >> 1] = function(value, hpos) { SAER.playfield.BPLxPTH(hpos, value, 6); };
|
|
writeMap[0x0FA >> 1] = function(value, hpos) { SAER.playfield.BPLxPTL(hpos, value, 6); };
|
|
writeMap[0x0FC >> 1] = function(value, hpos) { SAER.playfield.BPLxPTH(hpos, value, 7); };
|
|
writeMap[0x0FE >> 1] = function(value, hpos) { SAER.playfield.BPLxPTL(hpos, value, 7); };
|
|
}
|
|
writeMap[0x100 >> 1] = function(value, hpos) { SAER.playfield.BPLCON0(hpos, value); };
|
|
writeMap[0x102 >> 1] = function(value, hpos) { SAER.playfield.BPLCON1(hpos, value); };
|
|
writeMap[0x104 >> 1] = function(value, hpos) { SAER.playfield.BPLCON2(hpos, value); };
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE)
|
|
writeMap[0x106 >> 1] = function(value, hpos) { SAER.playfield.BPLCON3(hpos, value); };
|
|
writeMap[0x108 >> 1] = function(value, hpos) { SAER.playfield.BPL1MOD(hpos, value); };
|
|
writeMap[0x10A >> 1] = function(value, hpos) { SAER.playfield.BPL2MOD(hpos, value); };
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
|
|
writeMap[0x10C >> 1] = function(value, hpos) { SAER.playfield.BPLCON4(hpos, value); };
|
|
writeMap[0x10E >> 1] = function(value, hpos) { SAER.playfield.CLXCON2(value); };
|
|
}
|
|
writeMap[0x110 >> 1] = function(value, hpos) { SAER.playfield.BPLxDAT(hpos, 0, value); };
|
|
writeMap[0x112 >> 1] = function(value, hpos) { SAER.playfield.BPLxDAT(hpos, 1, value); };
|
|
writeMap[0x114 >> 1] = function(value, hpos) { SAER.playfield.BPLxDAT(hpos, 2, value); };
|
|
writeMap[0x116 >> 1] = function(value, hpos) { SAER.playfield.BPLxDAT(hpos, 3, value); };
|
|
writeMap[0x118 >> 1] = function(value, hpos) { SAER.playfield.BPLxDAT(hpos, 4, value); };
|
|
writeMap[0x11A >> 1] = function(value, hpos) { SAER.playfield.BPLxDAT(hpos, 5, value); };
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA) {
|
|
writeMap[0x11C >> 1] = function(value, hpos) { SAER.playfield.BPLxDAT(hpos, 6, value); };
|
|
writeMap[0x11E >> 1] = function(value, hpos) { SAER.playfield.BPLxDAT(hpos, 7, value); };
|
|
}
|
|
writeMap[0x120 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTH(hpos, value, 0); };
|
|
writeMap[0x122 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTL(hpos, value, 0); };
|
|
writeMap[0x124 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTH(hpos, value, 1); };
|
|
writeMap[0x126 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTL(hpos, value, 1); };
|
|
writeMap[0x128 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTH(hpos, value, 2); };
|
|
writeMap[0x12A >> 1] = function(value, hpos) { SAER.playfield.SPRxPTL(hpos, value, 2); };
|
|
writeMap[0x12C >> 1] = function(value, hpos) { SAER.playfield.SPRxPTH(hpos, value, 3); };
|
|
writeMap[0x12E >> 1] = function(value, hpos) { SAER.playfield.SPRxPTL(hpos, value, 3); };
|
|
writeMap[0x130 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTH(hpos, value, 4); };
|
|
writeMap[0x132 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTL(hpos, value, 4); };
|
|
writeMap[0x134 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTH(hpos, value, 5); };
|
|
writeMap[0x136 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTL(hpos, value, 5); };
|
|
writeMap[0x138 >> 1] = function(value, hpos) { SAER.playfield.SPRxPTH(hpos, value, 6); };
|
|
writeMap[0x13A >> 1] = function(value, hpos) { SAER.playfield.SPRxPTL(hpos, value, 6); };
|
|
writeMap[0x13C >> 1] = function(value, hpos) { SAER.playfield.SPRxPTH(hpos, value, 7); };
|
|
writeMap[0x13E >> 1] = function(value, hpos) { SAER.playfield.SPRxPTL(hpos, value, 7); };
|
|
writeMap[0x140 >> 1] = function(value, hpos) { SAER.playfield.SPRxPOS(hpos, value, 0); };
|
|
writeMap[0x142 >> 1] = function(value, hpos) { SAER.playfield.SPRxCTL(hpos, value, 0); };
|
|
writeMap[0x144 >> 1] = function(value, hpos) { SAER.playfield.SPRxDATA(hpos, value, 0); };
|
|
writeMap[0x146 >> 1] = function(value, hpos) { SAER.playfield.SPRxDATB(hpos, value, 0); };
|
|
writeMap[0x148 >> 1] = function(value, hpos) { SAER.playfield.SPRxPOS(hpos, value, 1); };
|
|
writeMap[0x14A >> 1] = function(value, hpos) { SAER.playfield.SPRxCTL(hpos, value, 1); };
|
|
writeMap[0x14C >> 1] = function(value, hpos) { SAER.playfield.SPRxDATA(hpos, value, 1); };
|
|
writeMap[0x14E >> 1] = function(value, hpos) { SAER.playfield.SPRxDATB(hpos, value, 1); };
|
|
writeMap[0x150 >> 1] = function(value, hpos) { SAER.playfield.SPRxPOS(hpos, value, 2); };
|
|
writeMap[0x152 >> 1] = function(value, hpos) { SAER.playfield.SPRxCTL(hpos, value, 2); };
|
|
writeMap[0x154 >> 1] = function(value, hpos) { SAER.playfield.SPRxDATA(hpos, value, 2); };
|
|
writeMap[0x156 >> 1] = function(value, hpos) { SAER.playfield.SPRxDATB(hpos, value, 2); };
|
|
writeMap[0x158 >> 1] = function(value, hpos) { SAER.playfield.SPRxPOS(hpos, value, 3); };
|
|
writeMap[0x15A >> 1] = function(value, hpos) { SAER.playfield.SPRxCTL(hpos, value, 3); };
|
|
writeMap[0x15C >> 1] = function(value, hpos) { SAER.playfield.SPRxDATA(hpos, value, 3); };
|
|
writeMap[0x15E >> 1] = function(value, hpos) { SAER.playfield.SPRxDATB(hpos, value, 3); };
|
|
writeMap[0x160 >> 1] = function(value, hpos) { SAER.playfield.SPRxPOS(hpos, value, 4); };
|
|
writeMap[0x162 >> 1] = function(value, hpos) { SAER.playfield.SPRxCTL(hpos, value, 4); };
|
|
writeMap[0x164 >> 1] = function(value, hpos) { SAER.playfield.SPRxDATA(hpos, value, 4); };
|
|
writeMap[0x166 >> 1] = function(value, hpos) { SAER.playfield.SPRxDATB(hpos, value, 4); };
|
|
writeMap[0x168 >> 1] = function(value, hpos) { SAER.playfield.SPRxPOS(hpos, value, 5); };
|
|
writeMap[0x16A >> 1] = function(value, hpos) { SAER.playfield.SPRxCTL(hpos, value, 5); };
|
|
writeMap[0x16C >> 1] = function(value, hpos) { SAER.playfield.SPRxDATA(hpos, value, 5); };
|
|
writeMap[0x16E >> 1] = function(value, hpos) { SAER.playfield.SPRxDATB(hpos, value, 5); };
|
|
writeMap[0x170 >> 1] = function(value, hpos) { SAER.playfield.SPRxPOS(hpos, value, 6); };
|
|
writeMap[0x172 >> 1] = function(value, hpos) { SAER.playfield.SPRxCTL(hpos, value, 6); };
|
|
writeMap[0x174 >> 1] = function(value, hpos) { SAER.playfield.SPRxDATA(hpos, value, 6); };
|
|
writeMap[0x176 >> 1] = function(value, hpos) { SAER.playfield.SPRxDATB(hpos, value, 6); };
|
|
writeMap[0x178 >> 1] = function(value, hpos) { SAER.playfield.SPRxPOS(hpos, value, 7); };
|
|
writeMap[0x17A >> 1] = function(value, hpos) { SAER.playfield.SPRxCTL(hpos, value, 7); };
|
|
writeMap[0x17C >> 1] = function(value, hpos) { SAER.playfield.SPRxDATA(hpos, value, 7); };
|
|
writeMap[0x17E >> 1] = function(value, hpos) { SAER.playfield.SPRxDATB(hpos, value, 7); };
|
|
writeMap[0x180 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 0); };
|
|
writeMap[0x182 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 1); };
|
|
writeMap[0x184 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 2); };
|
|
writeMap[0x186 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 3); };
|
|
writeMap[0x188 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 4); };
|
|
writeMap[0x18A >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 5); };
|
|
writeMap[0x18C >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 6); };
|
|
writeMap[0x18E >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 7); };
|
|
writeMap[0x190 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 8); };
|
|
writeMap[0x192 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 9); };
|
|
writeMap[0x194 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 10); };
|
|
writeMap[0x196 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 11); };
|
|
writeMap[0x198 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 12); };
|
|
writeMap[0x19A >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 13); };
|
|
writeMap[0x19C >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 14); };
|
|
writeMap[0x19E >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 15); };
|
|
writeMap[0x1A0 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 16); };
|
|
writeMap[0x1A2 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 17); };
|
|
writeMap[0x1A4 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 18); };
|
|
writeMap[0x1A6 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 19); };
|
|
writeMap[0x1A8 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 20); };
|
|
writeMap[0x1AA >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 21); };
|
|
writeMap[0x1AC >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 22); };
|
|
writeMap[0x1AE >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 23); };
|
|
writeMap[0x1B0 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 24); };
|
|
writeMap[0x1B2 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 25); };
|
|
writeMap[0x1B4 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 26); };
|
|
writeMap[0x1B6 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 27); };
|
|
writeMap[0x1B8 >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 28); };
|
|
writeMap[0x1BA >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 29); };
|
|
writeMap[0x1BC >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 30); };
|
|
writeMap[0x1BE >> 1] = function(value, hpos) { SAER.playfield.COLOR_WRITE(hpos, value & 0xfff, 31); };
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) {
|
|
writeMap[0x1C0 >> 1] = function(value, hpos) { SAER.playfield.HTOTAL(value); };
|
|
writeMap[0x1C2 >> 1] = function(value, hpos) { SAER.playfield.HSSTOP(value); };
|
|
writeMap[0x1C4 >> 1] = function(value, hpos) { SAER.playfield.HBSTRT(value); };
|
|
writeMap[0x1C6 >> 1] = function(value, hpos) { SAER.playfield.HBSTOP(value); };
|
|
writeMap[0x1C8 >> 1] = function(value, hpos) { SAER.playfield.VTOTAL(value); };
|
|
writeMap[0x1CA >> 1] = function(value, hpos) { SAER.playfield.VSSTOP(value); };
|
|
writeMap[0x1CC >> 1] = function(value, hpos) { SAER.playfield.VBSTRT(value); };
|
|
writeMap[0x1CE >> 1] = function(value, hpos) { SAER.playfield.VBSTOP(value); };
|
|
/* 1D0 SPRHSTRT W * * UHRES sprite vertical start
|
|
1D2 SPRHSTOP W * * UHRES sprite vertical stop
|
|
1D4 BPLHSTRT W * * UHRES bit plane vertical start
|
|
1D6 BPLHSTOP W * * UHRES bit plane vertical stop
|
|
1D8 HHPOSW W * * DUAL mode hires H beam counter write
|
|
1DA HHPOSR R * * DUAL mode hires H beam counter read*/
|
|
writeMap[0x1DC >> 1] = function(value, hpos) { SAER.playfield.BEAMCON0(value); };
|
|
writeMap[0x1DE >> 1] = function(value, hpos) { SAER.playfield.HSSTRT(value); };
|
|
writeMap[0x1E0 >> 1] = function(value, hpos) { SAER.playfield.VSSTRT(value); };
|
|
writeMap[0x1E2 >> 1] = function(value, hpos) { SAER.playfield.HCENTER(value); };
|
|
}
|
|
if (SAEV_config.chipset.mask & (SAEC_Config_Chipset_Mask_ECS_AGNUS | SAEC_Config_Chipset_Mask_ECS_DENISE))
|
|
writeMap[0x1E4 >> 1] = function(value, hpos) { SAER.playfield.DIWHIGH(hpos, value); };
|
|
/* 1E6 BPLHMOD W * * UHRES bit plane modulo
|
|
1E8 SPRHPTH W * * UHRES sprite pointer (high 5 bits)
|
|
1EA SPRHPTL W * * UHRES sprite pointer (low 15 bits)
|
|
1EC BPLHPTH W * * VRam (UHRES) bitplane pointer (hi 5 bits)
|
|
1EE BPLHPTL W * * VRam (UHRES) bitplane pointer (lo 15 bits)
|
|
*/
|
|
if (SAEV_config.chipset.mask & SAEC_Config_Chipset_Mask_AGA)
|
|
writeMap[0x1FC >> 1] = function(value, hpos) { SAER.playfield.FMODE(hpos, value); };
|
|
|
|
writeMap[0x1FE >> 1] = function(value, hpos) { SAER.playfield.FNULL(value); };
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
function SAEO_Devices() {
|
|
this.virtualdevice_init = function() {
|
|
//#ifdef AUTOCONFIG
|
|
SAER.autoconf.init(); //rtarea_setup
|
|
//#endif
|
|
//#ifdef FILESYS
|
|
SAER.autoconf.setup(); //rtarea_init
|
|
/*uaeres_install();
|
|
hardfile_install();
|
|
#endif
|
|
#ifdef AUTOCONFIG*/
|
|
SAER.expansion.setup();
|
|
/*emulib_install();
|
|
uaeexe_install();
|
|
#endif
|
|
#ifdef FILESYS
|
|
filesys_install();
|
|
#endif
|
|
#ifdef CDTV
|
|
cdtvcr_reset();
|
|
#endif*/
|
|
}
|
|
|
|
this.reset = function(hardreset) {
|
|
SAER.gayle.reset(hardreset);
|
|
//idecontroller_reset();
|
|
SAER.memory.a1000_reset();
|
|
SAER.disk.reset();
|
|
SAER.cia.reset();
|
|
SAER.gayle.reset(0);
|
|
/*#ifdef WITH_TOCCATA
|
|
sndboard_reset();
|
|
#endif*/
|
|
//#ifdef AUTOCONFIG
|
|
SAER.expansion.reset();
|
|
SAER.autoconf.reset();
|
|
//#endif
|
|
}
|
|
|
|
this.vsync_pre = function() {
|
|
//SAER.audio.vsync(); empty
|
|
SAER.cia.vsync();
|
|
/*inputdevice_vsync();
|
|
filesys_vsync();
|
|
sampler_vsync();
|
|
clipboard_vsync();
|
|
#ifdef RETROPLATFORM
|
|
rp_vsync();
|
|
#endif
|
|
#ifdef CD32
|
|
cd32_fmv_vsync_handler();
|
|
#endif
|
|
statusline_vsync();
|
|
*/
|
|
}
|
|
|
|
this.vsync_post = function() {
|
|
/*#ifdef WITH_TOCCATA
|
|
sndboard_vsync();
|
|
#endif*/
|
|
}
|
|
|
|
this.hsync = function(onvsync) {
|
|
/*#ifdef CD32
|
|
AKIKO_hsync_handler();
|
|
cd32_fmv_hsync_handler();
|
|
#endif
|
|
#ifdef CDTV
|
|
CDTV_hsync_handler();
|
|
CDTVCR_hsync_handler();
|
|
#endif*/
|
|
SAER.blitter.decide_blitter(-1);
|
|
/*#ifdef PICASSO96
|
|
picasso_handle_hsync();
|
|
#endif
|
|
#ifdef WITH_TOCCATA
|
|
sndboard_hsync();
|
|
#endif*/
|
|
SAER.disk.hsync();
|
|
if (SAEV_config.audio.mode != SAEC_Config_Audio_Mode_Off)
|
|
SAER.audio.hsync();
|
|
|
|
//SAER.cia.hsync(); //OWN empty
|
|
//serial_hsynchandler();
|
|
if (SAEV_config.chipset.ide >= 0 || SAEV_config.chipset.pcmcia) //OWN ATT
|
|
SAER.gayle.hsync();
|
|
//idecontroller_hsync();
|
|
}
|
|
|
|
this.rethink = function() {
|
|
SAER.cia.rethink();
|
|
/*#ifdef CDTV
|
|
rethink_cdtv();
|
|
rethink_cdtvcr();
|
|
#endif
|
|
#ifdef CD32
|
|
rethink_akiko();
|
|
rethink_cd32fmv();
|
|
#endif
|
|
#ifdef WITH_TOCCATA
|
|
sndboard_rethink();
|
|
#endif*/
|
|
SAER.gayle.rethink();
|
|
//idecontroller_rethink();
|
|
//SAER.autoconf.rethink_traps(); //empty
|
|
}
|
|
|
|
this.update_sound = function(clk, syncadjust) {
|
|
SAER.audio.update_sound(clk);
|
|
//update_sndboard_sound (clk / syncadjust);
|
|
//update_cda_sound(clk / syncadjust);
|
|
}
|
|
|
|
/*this.update_sync = function(svpos, syncadjust) {
|
|
cd32_fmv_set_sync(svpos, syncadjust);
|
|
}*/
|
|
}
|