ScriptedAmigaEmulator/sae/expansion.js
Rupert Hausberger fbf36a4fa5 update 0.9.0
2016-07-15 19:44:16 +02:00

1570 lines
49 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 references */
var SAER_Expansion_expamem_bank = null;
var SAER_Expansion_z3fastmem_bank = null;
/*---------------------------------*/
function SAEO_Expansion() {
const BOARD_AUTOCONFIG_Z2 = 2;
const BOARD_AUTOCONFIG_Z3 = 3;
const BOARD_NONAUTOCONFIG_BEFORE = 4;
const BOARD_NONAUTOCONFIG_AFTER_Z2 = 5;
const BOARD_NONAUTOCONFIG_AFTER_Z3 = 6;
const BOARD_IGNORE = 7;
const MAX_EXPANSION_BOARD_SPACE = 16;
//const KS12_BOOT_HACK = 1;
//const EXP_DEBUG = 0;
/*---------------------------------*/
/* 00 / 02 */
/* er_Type */
const Z2_MEM_8MB = 0x00; /* Size of Memory Block */
const Z2_MEM_4MB = 0x07;
const Z2_MEM_2MB = 0x06;
const Z2_MEM_1MB = 0x05;
const Z2_MEM_512KB = 0x04;
const Z2_MEM_256KB = 0x03;
const Z2_MEM_128KB = 0x02;
const Z2_MEM_64KB = 0x01;
/* extended definitions */
const Z3_MEM_16MB = 0x00;
const Z3_MEM_32MB = 0x01;
const Z3_MEM_64MB = 0x02;
const Z3_MEM_128MB = 0x03;
const Z3_MEM_256MB = 0x04;
const Z3_MEM_512MB = 0x05;
const Z3_MEM_1GB = 0x06;
const chainedconfig = 0x08; /* Next config is part of the same card */
const rom_card = 0x10; /* ROM vector is valid */
const add_memory = 0x20; /* Link RAM into free memory list */
/* Type of Expansion Card */
const protoautoconfig = 0x40;
const zorroII = 0xc0;
const zorroIII = 0x80;
/*---------------------------------*/
/* 04 - 06 & 10-16 */
/* Manufacturer */
const commodore_g = 513; /* Commodore Braunschweig (Germany) */
const commodore = 514; /* Commodore West Chester */
const gvp = 2017; /* GVP */
const ass = 2102; /* Advanced Systems & Software */
const hackers_id = 2011; /* Special ID for test cards */
/* Card Type */
const commodore_a2091 = 3; /* A2091 / A590 Card from C= */
const commodore_a2091_ram = 10; /* A2091 / A590 Ram on HD-Card */
const commodore_a2232 = 70; /* A2232 Multiport Expansion */
const ass_nexus_scsi = 1; /* Nexus SCSI Controller */
const gvp_series_2_scsi = 11;
const gvp_iv_24_gfx = 32;
/*---------------------------------*/
/* 08 - 0A */
/* er_Flags */
const Z3_SS_MEM_SAME = 0x00;
const Z3_SS_MEM_AUTO = 0x01;
const Z3_SS_MEM_64KB = 0x02;
const Z3_SS_MEM_128KB = 0x03;
const Z3_SS_MEM_256KB = 0x04;
const Z3_SS_MEM_512KB = 0x05;
const Z3_SS_MEM_1MB = 0x06; /* Zorro III card subsize */
const Z3_SS_MEM_2MB = 0x07;
const Z3_SS_MEM_4MB = 0x08;
const Z3_SS_MEM_6MB = 0x09;
const Z3_SS_MEM_8MB = 0x0a;
const Z3_SS_MEM_10MB = 0x0b;
const Z3_SS_MEM_12MB = 0x0c;
const Z3_SS_MEM_14MB = 0x0d;
const Z3_SS_MEM_defunct1 = 0x0e;
const Z3_SS_MEM_defunct2 = 0x0f;
const force_z3 = 0x10; /* *MUST* be set if card is Z3 */
const ext_size = 0x20; /* Use extended size table for bits 0-2 of er_Type */
const no_shutup = 0x40; /* Card cannot receive Shut_up_forever */
const care_addr = 0x80; /* Z2=Adress HAS to be $200000-$9fffff Z3=1->mem,0=io */
/*---------------------------------*/
/* 40-42 */
/* ec_interrupt (unused) */
const enable_irq = 0x01; /* enable Interrupt */
const reset_card = 0x04; /* Reset of Expansion Card - must be 0 */
const card_int2 = 0x10; /* READ ONLY: IRQ 2 active */
const card_irq6 = 0x20; /* READ ONLY: IRQ 6 active */
const card_irq7 = 0x40; /* READ ONLY: IRQ 7 active */
const does_irq = 0x80; /* READ ONLY: Card currently throws IRQ */
/*---------------------------------*/
/* ROM defines (DiagVec) */
const rom_4bit = (0x00<<14); /* ROM width */
const rom_8bit = (0x01<<14);
const rom_16bit = (0x02<<14);
const rom_never = (0x00<<12); /* Never run Boot Code */
const rom_install = (0x01<<12); /* run code at install time */
const rom_binddrv = (0x02<<12); /* run code with binddrivers */
//var chipdone = false;
/*const FILESYS_DIAGPOINT = 0x01e0;
const FILESYS_BOOTPOINT = 0x01e6;
const FILESYS_DIAGAREA = 0x2000;
uaecptr ROM_filesys_resname, ROM_filesys_resid;
uaecptr ROM_filesys_diagentry;
uaecptr ROM_hardfile_resname, ROM_hardfile_resid;
uaecptr ROM_hardfile_init;*/
/*---------------------------------*/
function card_data() {
this.initrc = null; //addrbank *(*initrc)(struct romconfig*);
this.initnum = null; //addrbank *(*initnum)(int);
this.map = null; //addrbank *(*map)(void);
this.rc = null; //struct romconfig *
this.name = "";
this.flags = 0;
this.zorro = 0;
}
var cards = new Array(MAX_EXPANSION_BOARD_SPACE);
for (var vi = 0; vi < MAX_EXPANSION_BOARD_SPACE; vi++)
cards[vi] = new card_data();
var ecard = 0, cardno = 0, cardid = 0;
/* Autoconfig address space at 0xE80000 */
const Z3BASE_UAE = 0x10000000;
const Z3BASE_REAL = 0x40000000;
var expamem = new Uint8Array(65536);
var expamem_lo = 0; //u8
var expamem_hi = 0; //u16
var expamem_z2_pointer = 0;
var expamem_z2_size = 0;
var expamem_z3_pointer = 0;
var expamem_z3_size = 0;
var expamem_z3_sum = 0;
var expamem_board_size = 0;
var expamem_board_pointer = 0
var expamem_bank_current = null;
var z3hack_override = false;
//var z3num = 0;
/*-----------------------------------------------------------------------*/
/* Autoconfig base */
function isnonautoconfig(v) {
return v == BOARD_NONAUTOCONFIG_AFTER_Z2 ||
v == BOARD_NONAUTOCONFIG_AFTER_Z3 ||
v == BOARD_NONAUTOCONFIG_BEFORE;
}
/* Ugly hack for >2M chip RAM in single pool
* We can't add it any later or early boot menu
* stops working because it sets kicktag at the end
* of chip ram...
*/
/*function addextrachip(sysbase) {
var cs = SAEV_config.memory.chipSize;
if (cs <= 0x00200000)
return;
if (sysbase & 0x80000001)
return;
if (!SAER_Memory_check(sysbase, 1000))
return;
var ml = SAER_Memory_get32(sysbase + 322);
if (!SAER_Memory_check(ml, 32))
return;
var next = 0;
while ((next = SAER_Memory_get32(ml))) {
if (!SAER_Memory_check(ml, 32))
return;
var upper = SAER_Memory_get32(ml + 24);
var lower = SAER_Memory_get32(ml + 20);
if (lower & 0xffff0000) {
ml = next;
continue;
}
var attr = SAER_Memory_get16(ml + 14);
if ((attr & 0x8002) != 2) {
ml = next;
continue;
}
if (upper >= cs)
return;
var added = cs - upper;
var first = SAER_Memory_get32(ml + 16);
SAER_Memory_put32(ml + 24, cs); // mh_Upper
SAER_Memory_put32(ml + 28, SAER_Memory_get32(ml + 28) + added); // mh_Free
while (first) {
next = first;
first = SAER_Memory_get32(next);
}
var bytes = SAER_Memory_get32(next + 4);
if (next + bytes == 0x00200000) {
SAER_Memory_put32 (next + 4, cs - next);
} else {
SAER_Memory_put32(0x00200000 + 0, 0);
SAER_Memory_put32(0x00200000 + 4, added);
SAER_Memory_put32(next, 0x00200000);
}
return;
}
}*/
/*this.set_expamem_z3_hack_override = function(overridenoz3hack) {
z3hack_override = overridenoz3hack;
}*/
function expamem_z3hack(p) {
if (z3hack_override) return false;
return p.memory.z3Mapping == SAEC_Config_Memory_z3Mapping_Auto || p.memory.z3Mapping == SAEC_Config_Memory_z3Mapping_SAE; // || cpuboard_memorytype(p) == BOARD_MEMORY_BLIZZARD_12xx;
}
function expamem_map_clear() {
SAEF_warn("expamem_map_clear() got called. Shouldn't happen.");
return null;
}
function expamem_init_clear() {
//memset(expamem, 0xff, sizeof expamem);
SAEF_memset(expamem,0, 0xff, 65536);
}
/* autoconfig area is "non-existing" after last device */
function expamem_init_clear_zero() {
SAER_Memory_mapBanks(SAEV_Memory_dummyBank, 0xe8, 1, 0);
if (!SAEV_config.cpu.addressSpace24)
SAER_Memory_mapBanks(SAEV_Memory_dummyBank, 0xff000000 >>> 16, 1, 0);
}
function expamem_init_clear2() {
expamem_bank.name = "Autoconfig Z2";
expamemz3_bank.name = "Autoconfig Z3";
expamem_init_clear_zero();
ecard = cardno;
}
function expamem_init_last() {
expamem_init_clear2();
SAEF_log("Memory map after autoconfig:");
SAER.memory.map_dump();
return null;
}
function expamem_read(addr) {
var b = (expamem[addr] & 0xf0) | (expamem[addr + 2] >> 4);
if (addr == 0 || addr == 2 || addr == 0x40 || addr == 0x42)
return b;
b = ~b;
return b & 0xff;
}
function expamem_write(addr, value) {
addr &= 0xffff;
if (addr == 0 || addr == 2 || addr == 0x40 || addr == 0x42) {
expamem[addr] = (value & 0xf0);
expamem[addr + 2] = (value & 0x0f) << 4;
} else {
expamem[addr] = ~(value & 0xf0);
expamem[addr + 2] = ~((value & 0x0f) << 4);
}
}
function expamem_type() {
return expamem_read(0) & 0xc0;
}
function call_card_init(index) {
var ab;
expamem_bank.name = cards[ecard].name ? cards[ecard].name : "None";
if (cards[ecard].initnum)
ab = cards[ecard].initnum(0);
else
ab = cards[ecard].initrc(cards[ecard].rc);
expamem_z3_size = 0;
/*if (ab === expamem_none) { //cpu-boards
expamem_init_clear();
expamem_init_clear_zero();
SAER_Memory_mapBanks(expamem_bank, 0xE8, 1, 0);
if (!SAEV_config.cpu.addressSpace24)
SAER_Memory_mapBanks(SAEV_Memory_dummyBank, 0xff000000 >>> 16, 1, 0);
expamem_bank_current = null;
return;
}*/
if (ab === false) { //expamem_null) {
expamem_next(null, null);
return;
}
var abe = ab;
if (abe === null)
abe = expamem_bank;
if (abe !== expamem_bank) {
for (var i = 0; i < 16 * 4; i++)
expamem[i] = abe.get8(i);
}
var code = expamem_read(0);
if ((code & 0xc0) == zorroII) {
// Z2
code &= 7;
if (code == 0)
expamem_z2_size = 8 * 1024 * 1024;
else
expamem_z2_size = 32768 << code;
expamem_board_size = expamem_z2_size;
expamem_board_pointer = expamem_z2_pointer;
} else if ((code & 0xc0) == zorroIII) {
// Z3
if (expamem_z3_sum < Z3BASE_UAE) {
expamem_z3_sum = SAEV_config.memory.z3AutoConfigStart;
if (SAEV_config.memory.ramsey.highSize >= 128 * 1024 * 1024 && expamem_z3_sum == Z3BASE_UAE)
expamem_z3_sum += (SAEV_config.memory.ramsey.highSize - 128 * 1024 * 1024) + 16 * 1024 * 1024;
if (!expamem_z3hack(SAEV_config))
expamem_z3_sum = Z3BASE_REAL;
//if (expamem_z3_sum == Z3BASE_UAE)
// expamem_z3_sum += currprefs.z3chipmem_size;
}
expamem_z3_pointer = expamem_z3_sum;
code &= 7;
if (expamem_read(8) & ext_size)
expamem_z3_size = (16 * 1024 * 1024) << code;
else
expamem_z3_size = 16 * 1024 * 1024;
expamem_z3_sum += expamem_z3_size;
var expamem_z3_pointer_old = expamem_z3_pointer;
// align 32M boards (FastLane is 32M and needs to be aligned)
if (expamem_z3_size <= 32 * 1024 * 1024)
expamem_z3_pointer = ((expamem_z3_pointer + expamem_z3_size - 1) & ~(expamem_z3_size - 1)) >>> 0;
expamem_z3_sum += expamem_z3_pointer - expamem_z3_pointer_old;
expamem_board_size = expamem_z3_size;
expamem_board_pointer = expamem_z3_pointer;
} else if ((code & 0xc0) == 0x40) {
// 0x40 = "Box without init/diagnostic code"
// proto autoconfig "box" size.
//expamem_z2_size = (1 << ((code >> 3) & 7)) * 4096;
// much easier this way, all old-style boards were made for
// A1000 and didn"t have passthrough connector.
expamem_z2_size = 65536;
expamem_board_size = expamem_z2_size;
expamem_board_pointer = expamem_z2_pointer;
}
if (ab !== null) {
// non-null: not using expamem_bank
expamem_bank_current = ab;
if ((cards[ecard].flags & 1) && SAEV_config.chipset.z3AutoConfig && !SAEV_config.cpu.addressSpace24) {
SAER_Memory_mapBanks(expamemz3_bank, 0xff000000 >>> 16, 1, 0);
SAER_Memory_mapBanks(SAEV_Memory_dummyBank, 0xE8, 1, 0);
} else {
SAER_Memory_mapBanks(expamem_bank, 0xE8, 1, 0);
if (!SAEV_config.cpu.addressSpace24)
SAER_Memory_mapBanks(SAEV_Memory_dummyBank, 0xff000000 >>> 16, 1, 0);
}
} else {
if ((cards[ecard].flags & 1) && SAEV_config.chipset.z3AutoConfig && !SAEV_config.cpu.addressSpace24) {
expamem_bank_current = expamem_bank;
SAER_Memory_mapBanks(expamemz3_bank, 0xff000000 >>> 16, 1, 0);
SAER_Memory_mapBanks(SAEV_Memory_dummyBank, 0xE8, 1, 0);
} else {
expamem_bank_current = null;
SAER_Memory_mapBanks(expamem_bank, 0xE8, 1, 0);
if (!SAEV_config.cpu.addressSpace24)
SAER_Memory_mapBanks(SAEV_Memory_dummyBank, 0xff000000 >>> 16, 1, 0);
}
}
}
function boardmessage(mapped, success) {
var type = expamem_read(0);
var size = expamem_board_size;
var sizemod = "K";
//size /= 1024;
size >>>= 10;
if (size > 8 * 1024) {
sizemod = "M";
//size /= 1024;
size >>>= 10;
}
SAEF_log("memory.boardmessage() Card %d: Z%d 0x%08x %4d%s %s %s%s",
ecard + 1, (type & 0xc0) == zorroII ? 2 : ((type & 0xc0) == zorroIII ? 3 : 1),
expamem_board_pointer, size, sizemod,
type & rom_card ? "ROM" : (type & add_memory ? "RAM" : "IO "),
mapped.name,
success ? "" : " SHUT UP"
);
/*#if 0
for (var i = 0; i < 16; i++) {
SAEF_log("%s%02X", i > 0 ? "." : "", expamem_read(i * 4));
}
SAEF_log("\n");
#endif*/
}
function expamem_shutup(mapped) {
if (mapped)
boardmessage(mapped, false);
}
function expamem_next(mapped, next) {
if (mapped)
boardmessage(mapped, true);
expamem_init_clear();
expamem_init_clear_zero();
for (;;) {
++ecard;
if (ecard >= cardno)
break;
var ec = cards[ecard];
if (ec.initrc && isnonautoconfig(ec.zorro)) {
ec.initrc(cards[ecard].rc);
} else {
call_card_init(ecard);
break;
}
}
if (ecard >= cardno) {
expamem_init_clear2();
expamem_init_last();
}
}
/*-----------------------------------------------------------------------*/
/* BANK Z2-Fast memory */
function fastmem_get32(addr) {
addr = (addr & fastmem_bank.mask) >>> 0;
//var m = fastmem_bank.baseaddr + addr; return do_get_mem_long ((uae_u32 *)m);
return ((fastmem_bank.baseaddr[addr] << 24) | (fastmem_bank.baseaddr[addr+1] << 16) | (fastmem_bank.baseaddr[addr+2] << 8) | fastmem_bank.baseaddr[addr+3]) >>> 0;
}
function fastmem_get16(addr) {
addr = (addr & fastmem_bank.mask) >>> 0;
//var m = fastmem_bank.baseaddr + addr; return do_get_mem_word ((uae_u16 *)m);
return (fastmem_bank.baseaddr[addr] << 8) | fastmem_bank.baseaddr[addr+1];
}
function fastmem_get8(addr) {
addr = (addr & fastmem_bank.mask) >>> 0;
return fastmem_bank.baseaddr[addr];
}
function fastmem_put32(addr, l) {
addr = (addr & fastmem_bank.mask) >>> 0;
//var m = fastmem_bank.baseaddr + addr; do_put_mem_long ((uae_u32 *)m, l);
fastmem_bank.baseaddr[addr] = l >>> 24;
fastmem_bank.baseaddr[addr+1] = (l >>> 16) & 0xff;
fastmem_bank.baseaddr[addr+2] = (l >>> 8) & 0xff;
fastmem_bank.baseaddr[addr+3] = l & 0xff;
}
function fastmem_put16(addr, w) {
addr = (addr & fastmem_bank.mask) >>> 0;
//var m = fastmem_bank.baseaddr + addr; do_put_mem_word ((uae_u16 *)m, w);
fastmem_bank.baseaddr[addr] = w >> 8;
fastmem_bank.baseaddr[addr+1] = w & 0xff;
}
function fastmem_put8(addr, b) {
addr = (addr & fastmem_bank.mask) >>> 0;
fastmem_bank.baseaddr[addr] = b;
}
function fastmem_check(addr, size) {
addr = (addr & fastmem_bank.mask) >>> 0;
return (addr + size) <= fastmem_bank.allocated;
}
function fastmem_xlate(addr) {
addr = (addr & fastmem_bank.mask) >>> 0;
//return fastmem_bank.baseaddr + addr;
return addr;
}
var fastmem_bank = new SAEO_Memory_addrbank(
fastmem_get32, fastmem_get16, fastmem_get8,
fastmem_put32, fastmem_put16, fastmem_put8,
fastmem_xlate, fastmem_check, null, "fast", "Fast memory",
fastmem_get32, fastmem_get16,
//SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE, 0, 0
SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE
);
/*---------------------------------*/
/*var fastmem2_bank = new SAEO_Memory_addrbank(
fastmem2_get32, fastmem2_get16, fastmem2_get8,
fastmem2_put32, fastmem2_put16, fastmem2_put8,
fastmem2_xlate, fastmem2_check, null, "fast2", "Fast memory 2",
fastmem2_get32, fastmem2_get16,
//SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE, 0, 0
SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE
};*/
/*-----------------------------------------------------------------------*/
function fastmem_autoconfig(boardnum, zorro, type, serial, allocated) {
var mid = 0;
var pid;
var flags = care_addr;
//DEVICE_MEMORY_CALLBACK dmc = null;
//struct romconfig *dmc_rc = null;
var ac = new Uint8Array(16);
/*if (boardnum == 1) {
} else if (boardnum == 0) {
for (int i = 0; expansionroms[i].name; i++) {
const struct expansionromtype *erc = &expansionroms[i];
if (((erc->zorro == zorro) || (zorro < 0 && erc->zorro >= BOARD_NONAUTOCONFIG_BEFORE)) && cfgfile_board_enabled(&currprefs, erc->romtype, 0)) {
struct romconfig *rc = get_device_romconfig(&currprefs, erc->romtype, 0);
if (erc->subtypes) {
const struct expansionsubromtype *srt = &erc->subtypes[rc->subtype];
if (srt->memory_mid) {
mid = srt->memory_mid;
pid = srt->memory_pid;
serial = srt->memory_serial;
if (!srt->memory_after)
type |= chainedconfig;
}
} else {
if (erc->memory_mid) {
mid = erc->memory_mid;
pid = erc->memory_pid;
serial = erc->memory_serial;
if (!erc->memory_after)
type |= chainedconfig;
}
}
dmc = erc->memory_callback;
dmc_rc = rc;
break;
}
}
}*/
if (!mid) {
if (zorro <= 2) {
//pid = SAEV_config.memory.maprom ? 1 : 81;
pid = 81;
} else {
var subsize = (allocated == 0x100000 ? Z3_SS_MEM_1MB
: allocated == 0x200000 ? Z3_SS_MEM_2MB
: allocated == 0x400000 ? Z3_SS_MEM_4MB
: allocated == 0x800000 ? Z3_SS_MEM_8MB
: Z3_SS_MEM_SAME);
//pid = SAEV_config.memory.maprom ? 3 : 83;
pid = 83;
flags |= force_z3 | (allocated > 0x800000 ? ext_size : subsize);
}
mid = cardid;
}
ac[0x00 / 4] = type;
ac[0x04 / 4] = pid;
ac[0x08 / 4] = flags;
ac[0x10 / 4] = mid >> 8;
ac[0x14 / 4] = mid & 0xff;
ac[0x18 / 4] = serial >>> 24;
ac[0x1c / 4] = (serial >>> 16) & 0xff;
ac[0x20 / 4] = (serial >>> 8) & 0xff;
ac[0x24 / 4] = serial & 0xff;
//if (dmc && dmc_rc) dmc(dmc_rc, ac, allocated);
expamem_write(0x00, ac[0x00 / 4]);
expamem_write(0x04, ac[0x04 / 4]);
expamem_write(0x08, ac[0x08 / 4]);
expamem_write(0x10, ac[0x10 / 4]);
expamem_write(0x14, ac[0x14 / 4]);
expamem_write(0x18, ac[0x18 / 4]); /* ser.no. Byte 0 */
expamem_write(0x1c, ac[0x1c / 4]); /* ser.no. Byte 1 */
expamem_write(0x20, ac[0x20 / 4]); /* ser.no. Byte 2 */
expamem_write(0x24, ac[0x24 / 4]); /* ser.no. Byte 3 */
expamem_write(0x28, 0x00); /* ROM-Offset hi */
expamem_write(0x2c, 0x00); /* ROM-Offset lo */
expamem_write(0x40, 0x00); /* Ctrl/Statusreg.*/
}
/*---------------------------------*/
/* Expansion Card (ZORRO II) */
function expamem_map_fastcard_2(boardnum) {
var start = ((expamem_hi | (expamem_lo >> 4)) << 16) >>> 0;
//var ab = fastbanks[boardnum * 2 + ((start < 0x00A00000) ? 0 : 1)];
var ab = fastmem_bank;
var size = ab.allocated;
ab.start = start;
if (ab.start)
SAER.memory.map_banks_z2(ab, ab.start >>> 16, size >>> 16);
return ab;
}
function expamem_init_fastcard_2(boardnum) {
var type = add_memory | zorroII;
//var allocated = boardnum ? fastmem2_bank.allocated : fastmem_bank.allocated;
var allocated = fastmem_bank.allocated;
var serial = 1;
if (allocated == 0)
return false; //expamem_null;
expamem_init_clear();
if (allocated == 65536) type |= Z2_MEM_64KB;
else if (allocated == 131072) type |= Z2_MEM_128KB;
else if (allocated == 262144) type |= Z2_MEM_256KB;
else if (allocated == 524288) type |= Z2_MEM_512KB;
else if (allocated == 0x100000) type |= Z2_MEM_1MB;
else if (allocated == 0x200000) type |= Z2_MEM_2MB;
else if (allocated == 0x400000) type |= Z2_MEM_4MB;
else if (allocated == 0x800000) type |= Z2_MEM_8MB;
/*if (boardnum == 1) {
const a2630_autoconfig = [ 0xe7, 0x51, 0x40, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ];
if (ISCPUBOARD(BOARD_COMMODORE, BOARD_COMMODORE_SUB_A26x0)) {
for (int i = 1; i < 16; i++)
expamem_write(i * 4, a2630_autoconfig[i]);
type &= 7;
type |= a2630_autoconfig[0] & ~7;
expamem_write(0, type);
return null;
}
}*/
fastmem_autoconfig(boardnum, BOARD_AUTOCONFIG_Z2, type, serial, allocated);
fastmem_autoconfig(boardnum, -1, type, serial, allocated);
return null;
}
function expamem_init_fastcard(boardnum) {
return expamem_init_fastcard_2(0);
}
function expamem_map_fastcard() {
return expamem_map_fastcard_2(0);
}
/*function expamem_init_fastcard2(boardnum) {
return expamem_init_fastcard_2(1);
}
function expamem_map_fastcard2() {
return expamem_map_fastcard_2(1);
}*/
/*this.expansion_is_next_board_fastram = function() {
return ecard + 1 < MAX_EXPANSION_BOARD_SPACE && cards[ecard + 1].map == expamem_map_fastcard;
}*/
/*---------------------------------*/
/* Expansion Card (Zorro III) */
function expamem_map_z3fastmem_2(bank, ptr, size, allocated, chip) {
var z3fs = expamem_z3_pointer;
var start = ptr.start;
if (expamem_z3hack(SAEV_config)) {
if (z3fs && start != z3fs) {
SAEF_warn("memory.expamem_map_z3fastmem_2() Z3MEM mapping changed from $%08x to $%08x", start, z3fs);
map_banks(SAEV_Memory_dummyBank, start >>> 16, size >>> 16, allocated);
ptr.start = z3fs;
SAER.memory.map_banks_z3(bank, start >>> 16, size >>> 16);
}
} else {
SAER.memory.map_banks_z3(bank, z3fs >>> 16, size >>> 16);
//start = z3fs; //OWN unneeded
ptr.start = z3fs;
}
return bank;
}
function expamem_map_z3fastmem() {
var ptr = { start:z3fastmem_bank.start };
var bank = expamem_map_z3fastmem_2(z3fastmem_bank, ptr, SAEV_config.memory.z3FastSize, z3fastmem_bank.allocated, 0);
z3fastmem_bank.start = ptr.start;
return bank;
}
/*function expamem_map_z3fastmem2() {
var ptr = { start:z3fastmem2_bank.start };
var bank = expamem_map_z3fastmem_2(z3fastmem2_bank, ptr, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated, 0);
z3fastmem2_bank.start = ptr.start;
return bank;
}*/
function expamem_init_z3fastmem_2(boardnum, bank, start, size, allocated) {
var code = (allocated == 0x100000 ? Z2_MEM_1MB
: allocated == 0x200000 ? Z2_MEM_2MB
: allocated == 0x400000 ? Z2_MEM_4MB
: allocated == 0x800000 ? Z2_MEM_8MB
: allocated == 0x1000000 ? Z3_MEM_16MB
: allocated == 0x2000000 ? Z3_MEM_32MB
: allocated == 0x4000000 ? Z3_MEM_64MB
: allocated == 0x8000000 ? Z3_MEM_128MB
: allocated == 0x10000000 ? Z3_MEM_256MB
: allocated == 0x20000000 ? Z3_MEM_512MB
: Z3_MEM_1GB);
if (allocated < 0x1000000)
code = Z3_MEM_16MB; /* Z3 physical board size is always at least 16M */
expamem_init_clear();
fastmem_autoconfig(boardnum, BOARD_AUTOCONFIG_Z3, add_memory | zorroIII | code, 1, allocated);
SAER.memory.map_banks_z3(bank, start >>> 16, size >>> 16);
return null;
}
function expamem_init_z3fastmem(devnum) {
return expamem_init_z3fastmem_2(0, z3fastmem_bank, z3fastmem_bank.start, SAEV_config.memory.z3FastSize, z3fastmem_bank.allocated);
}
/*function expamem_init_z3fastmem2(devnum) {
return expamem_init_z3fastmem_2(1, z3fastmem2_bank, z3fastmem2_bank.start, currprefs.z3fastmem2_size, z3fastmem2_bank.allocated);
}*/
/*---------------------------------*/
/* BANK Z3 memory */
function z3fastmem_get32(addr) {
addr = (addr & z3fastmem_bank.mask) >>> 0;
//var m = z3fastmem_bank.baseaddr + addr; return do_get_mem_long ((uae_u32 *)m);
return ((z3fastmem_bank.baseaddr[addr] << 24) | (z3fastmem_bank.baseaddr[addr+1] << 16) | (z3fastmem_bank.baseaddr[addr+2] << 8) | z3fastmem_bank.baseaddr[addr+3]) >>> 0;
}
function z3fastmem_get16(addr) {
addr = (addr & z3fastmem_bank.mask) >>> 0;
//var m = z3fastmem_bank.baseaddr + addr; return do_get_mem_word ((uae_u16 *)m);
return (z3fastmem_bank.baseaddr[addr] << 8) | z3fastmem_bank.baseaddr[addr+1];
}
function z3fastmem_get8(addr) {
addr = (addr & z3fastmem_bank.mask) >>> 0;
return z3fastmem_bank.baseaddr[addr];
}
function z3fastmem_put32(addr, l) {
addr = (addr & z3fastmem_bank.mask) >>> 0;
//var m = z3fastmem_bank.baseaddr + addr; do_put_mem_long ((uae_u32 *)m, l);
z3fastmem_bank.baseaddr[addr] = l >>> 24;
z3fastmem_bank.baseaddr[addr+1] = (l >>> 16) & 0xff;
z3fastmem_bank.baseaddr[addr+2] = (l >>> 8) & 0xff;
z3fastmem_bank.baseaddr[addr+3] = l & 0xff;
}
function z3fastmem_put16(addr, w) {
addr = (addr & z3fastmem_bank.mask) >>> 0;
//var m = z3fastmem_bank.baseaddr + addr; do_put_mem_word ((uae_u16 *)m, w);
z3fastmem_bank.baseaddr[addr] = w >> 8;
z3fastmem_bank.baseaddr[addr+1] = w & 0xff;
}
function z3fastmem_put8(addr, b) {
addr = (addr & z3fastmem_bank.mask) >>> 0;
z3fastmem_bank.baseaddr[addr] = b;
}
function z3fastmem_check(addr, size) {
addr = (addr & z3fastmem_bank.mask) >>> 0;
return (addr + size) <= z3fastmem_bank.allocated;
}
function z3fastmem_xlate(addr) {
addr = (addr & z3fastmem_bank.mask) >>> 0;
//return z3fastmem_bank.baseaddr + addr;
return addr;
}
var z3fastmem_bank = new SAEO_Memory_addrbank(
z3fastmem_get32, z3fastmem_get16, z3fastmem_get8,
z3fastmem_put32, z3fastmem_put16, z3fastmem_put8,
z3fastmem_xlate, z3fastmem_check, null, "z3", "Zorro III Fast RAM",
z3fastmem_get32, z3fastmem_get16,
//SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE, 0, 0
SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE
);
SAER_Expansion_z3fastmem_bank = z3fastmem_bank;
/*MEMORY_FUNCTIONS(z3fastmem2);
var z3fastmem2_bank = new SAEO_Memory_addrbank(
z3fastmem2_get32, z3fastmem2_get16, z3fastmem2_get8,
z3fastmem2_put32, z3fastmem2_put16, z3fastmem2_put8,
z3fastmem2_xlate, z3fastmem2_check, null, "z3_2", "Zorro III Fast RAM #2",
z3fastmem2_get32, z3fastmem2_get16,
//SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE, 0, 0
SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE
);
MEMORY_FUNCTIONS(z3chipmem);
var z3chipmem_bank = new SAEO_Memory_addrbank(
z3chipmem_get32, z3chipmem_get16, z3chipmem_get8,
z3chipmem_put32, z3chipmem_put16, z3chipmem_put8,
z3chipmem_xlate, z3chipmem_check, null, "z3_chip", "MegaChipRAM",
z3chipmem_get32, z3chipmem_get16,
//SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE, 0, 0
SAEC_Memory_addrbank_flag_RAM | SAEC_Memory_addrbank_flag_THREADSAFE
);*/
/*-----------------------------------------------------------------------*/
/* Autoconfig setup/cleanup/reset */
function mapped_malloc(ab) {
ab.startmask = ab.start;
try {
//ab.baseaddr = xcalloc(uae_u8, ab.allocated + 4);
ab.baseaddr = new Uint8Array(ab.allocated + 4);
return true;
} catch (e) {
ab.baseaddr = null;
return false;
}
}
function mapped_free(ab) {
//xfree(ab.baseaddr);
ab.baseaddr = null;
}
function free_fastmemory(boardnum) {
if (boardnum == 0)
mapped_free(fastmem_bank);
//else
//mapped_free(fastmem2_bank);
}
this.free_fastmemory_ext = function(boardnum) {
free_fastmemory(boardnum);
}
//function mapped_malloc_dynamic(curr, changed, bank, max, name) {
function mapped_malloc_dynamic(curr, bank, max, name) {
var alloc = curr.size;
bank.allocated = 0;
bank.baseaddr = null;
bank.mask = 0;
if (!alloc)
return false;
while (alloc >= max * 1024 * 1024) {
bank.mask = alloc - 1;
bank.allocated = alloc;
bank.label = name;
if (mapped_malloc(bank)) {
curr.size = alloc;
//changed.size = alloc;
return true;
}
SAEF_warn("expansion.mapped_malloc_dynamic() out of memory for '%s'. (%d bytes)", name, alloc);
alloc >>>= 1;
}
return false;
}
/*uaecptr expansion_startaddress(uaecptr addr, uae_u32 size) {
if (!size)
return addr;
if (size < 16 * 1024 * 1024)
size = 16 * 1024 * 1024;
if (!expamem_z3hack(SAEV_config))
return (addr + size - 1) & ~(size - 1);
return addr;
}*/
function allocate() { //allocate_expamem
/*z3chipmem_bank.start = Z3BASE_UAE;
if (SAEV_config.memory.ramsey.highSize >= 128 * 1024 * 1024)
z3chipmem_bank.start += (SAEV_config.memory.ramsey.highSize - 128 * 1024 * 1024) + 16 * 1024 * 1024;*/
z3fastmem_bank.start = SAEV_config.memory.z3AutoConfigStart;
if (!expamem_z3hack(SAEV_config))
z3fastmem_bank.start = Z3BASE_REAL;
if (z3fastmem_bank.start == Z3BASE_UAE) {
if (SAEV_config.memory.ramsey.highSize >= 128 * 1024 * 1024)
z3fastmem_bank.start += (SAEV_config.memory.ramsey.highSize - 128 * 1024 * 1024) + 16 * 1024 * 1024;
//z3fastmem_bank.start += currprefs.z3chipmem_size;
}
/*z3fastmem2_bank.start = z3fastmem_bank.start + SAEV_config.memory.z3FastSize;
if (currprefs.z3chipmem_size && z3fastmem_bank.start - z3chipmem_bank.start < currprefs.z3chipmem_size)
currprefs.z3chipmem_size = changed_prefs.z3chipmem_size = 0;*/
if (fastmem_bank.allocated != SAEV_config.memory.z2FastSize) {
free_fastmemory(0);
fastmem_bank.allocated = SAEV_config.memory.z2FastSize;
fastmem_bank.mask = fastmem_bank.allocated - 1;
//fastmem_nojit_bank.allocated = fastmem_bank.allocated;
//fastmem_nojit_bank.mask = fastmem_bank.mask;
if (fastmem_bank.allocated) {
mapped_malloc(fastmem_bank);
/*fastmem_nojit_bank.baseaddr = fastmem_bank.baseaddr;
if (fastmem_bank.baseaddr == 0) {
SAEF_error("Out of memory for fastmem card.");
fastmem_bank.allocated = 0;
fastmem_nojit_bank.allocated = 0;
}*/
}
SAER.memory.hardreset(1);
}
/*if (fastmem2_bank.allocated != currprefs.fastmem2_size) {
free_fastmemory(1);
fastmem2_bank.allocated = currprefs.fastmem2_size;
fastmem2_bank.mask = fastmem2_bank.allocated - 1;
fastmem2_nojit_bank.allocated = fastmem2_bank.allocated;
fastmem2_nojit_bank.mask = fastmem2_bank.mask;
if (fastmem2_bank.allocated) {
mapped_malloc (&fastmem2_bank);
fastmem2_nojit_bank.baseaddr = fastmem2_bank.baseaddr;
if (fastmem2_bank.baseaddr == 0) {
SAEF_error("Out of memory for fastmem2 card.");
fastmem2_bank.allocated = 0;
fastmem2_nojit_bank.allocated = 0;
}
}
SAER.memory.hardreset(1);
}*/
if (z3fastmem_bank.allocated != SAEV_config.memory.z3FastSize) {
mapped_free(z3fastmem_bank);
//mapped_malloc_dynamic(SAEV_config.memory.z3FastSize, &changed_prefs.z3fastmem_size, z3fastmem_bank, 1, "z3");
var curr = { size:SAEV_config.memory.z3FastSize };
mapped_malloc_dynamic(curr, z3fastmem_bank, 1, "z3");
SAEV_config.memory.z3FastSize = curr.size;
SAER.memory.hardreset(1);
}
/*if (z3fastmem2_bank.allocated != currprefs.z3fastmem2_size) {
mapped_free (&z3fastmem2_bank);
z3fastmem2_bank.allocated = currprefs.z3fastmem2_size;
z3fastmem2_bank.mask = z3fastmem2_bank.allocated - 1;
if (z3fastmem2_bank.allocated) {
mapped_malloc (&z3fastmem2_bank);
if (z3fastmem2_bank.baseaddr == 0) {
SAEF_error("Out of memory for 32 bit fast memory #2.");
z3fastmem2_bank.allocated = 0;
}
}
SAER.memory.hardreset(1);
}
if (z3chipmem_bank.allocated != currprefs.z3chipmem_size) {
mapped_free (&z3chipmem_bank);
mapped_malloc_dynamic(&currprefs.z3chipmem_size, &changed_prefs.z3chipmem_size, &z3chipmem_bank, 16, "z3_chip");
SAER.memory.hardreset(1);
}*/
}
/*-----------------------------------------------------------------------*/
/*static bool add_fastram_after_expansion(int zorro)
{
for (int i = 0; expansionroms[i].name; i++) {
const struct expansionromtype *ert = &expansionroms[i];
if (ert->zorro == zorro) {
for (int j = 0; j < MAX_DUPLICATE_EXPANSION_BOARDS; j++) {
struct romconfig *rc = get_device_romconfig(&currprefs, ert->romtype, j);
if (rc) {
if (ert->subtypes) {
const struct expansionsubromtype *srt = &ert->subtypes[rc->subtype];
return srt->memory_after;
}
return ert->memory_after;
}
}
}
}
return false;
}
static void add_expansions(int zorro)
{
for (int i = 0; expansionroms[i].name; i++) {
const struct expansionromtype *ert = &expansionroms[i];
if (ert->zorro == zorro) {
for (int j = 0; j < MAX_DUPLICATE_EXPANSION_BOARDS; j++) {
struct romconfig *rc = get_device_romconfig(&currprefs, ert->romtype, j);
if (rc) {
if (zorro == 1) {
ert->init(rc);
if (ert->init2)
ert->init2(rc);
} else {
cards[cardno].flags = 0;
cards[cardno].name = ert->name;
cards[cardno].initrc = ert->init;
cards[cardno].rc = rc;
cards[cardno].zorro = zorro;
cards[cardno++].map = null;
if (ert->init2) {
cards[cardno].flags = 0;
cards[cardno].name = ert->name;
cards[cardno].initrc = ert->init2;
cards[cardno].rc = rc;
cards[cardno].zorro = zorro;
cards[cardno++].map = null;
}
}
}
}
}
}
}*/
this.reset = function() { //expamem_reset()
var do_mount = 1;
ecard = 0;
cardno = 0;
//cardid = currprefs.uae_hide ? commodore : hackers_id;
cardid = true ? commodore : hackers_id;
//chipdone = false;
allocate();
expamem_bank.name = "Autoconfig [reset]";
if (SAER.autoconf.need_uae_boot_rom() == 0)
do_mount = 0;
if (SAEV_AutoConf_boot_rom_type <= 0)
do_mount = 0;
/* check if Kickstart version is below 1.3 */
if (SAER.memory.ks12orolder() && do_mount) { //&& currprefs.uaeboard < 2) {
/*#if KS12_BOOT_HACK
do_mount = -1;
if (SAER.memory.ks11orolder()) {
filesys_start = 0xe90000;
SAER.memory.map_banks_z2(&filesys_bank, filesys_start >>> 16, 1);
expamem_init_filesys(0);
expamem_map_filesys_update();
}
#else*/
SAEF_log("expansion.reset() Kickstart version is below 1.3! Disabling automount devices.");
do_mount = 0;
//#endif
}
//add possible non-autoconfig boards
//add_expansions(BOARD_NONAUTOCONFIG_BEFORE);
var fastmem_after = false;
if (SAEV_config.memory.z2FastAutoConfig) {
//fastmem_after = add_fastram_after_expansion(BOARD_AUTOCONFIG_Z2);
if (!fastmem_after && fastmem_bank.baseaddr !== null && (fastmem_bank.allocated <= 262144 || SAEV_config.memory.chipSize <= 2 * 1024 * 1024)) {
cards[cardno].flags = 0;
cards[cardno].name = "Z2Fast";
cards[cardno].initnum = expamem_init_fastcard;
cards[cardno++].map = expamem_map_fastcard;
}
/*if (fastmem2_bank.baseaddr !== null && (fastmem2_bank.allocated <= 262144 || SAEV_config.memory.chipSize <= 2 * 1024 * 1024)) {
cards[cardno].flags = 0;
cards[cardno].name = "Z2Fast2";
cards[cardno].initnum = expamem_init_fastcard2;
cards[cardno++].map = expamem_map_fastcard2;
}*/
} else {
if (fastmem_bank.baseaddr !== null) {
fastmem_bank.name = "Fast memory (non-autoconfig)";
SAER_Memory_mapBanks(fastmem_bank, 0x00200000 >>> 16, fastmem_bank.allocated >>> 16, 0);
}
/*if (fastmem2_bank.baseaddr !== null) {
fastmem2_bank.name = "Fast memory 2 (non-autoconfig)";
SAER_Memory_mapBanks(fastmem2_bank, (0x00200000 + fastmem_bank.allocated) >>> 16, fastmem2_bank.allocated >>> 16, 0);
}*/
}
// immediately after Z2Fast so that they can be emulated as A590/A2091 with fast ram.
//add_expansions(BOARD_AUTOCONFIG_Z2);
//add_expansions(BOARD_NONAUTOCONFIG_AFTER_Z2);
/*if (fastmem_after && SAEV_config.memory.z2FastAutoConfig) {
if (fastmem_bank.baseaddr != null && (fastmem_bank.allocated <= 262144 || SAEV_config.memory.chipSize <= 2 * 1024 * 1024)) {
cards[cardno].flags = 0;
cards[cardno].name = "Z2Fast";
cards[cardno].initnum = expamem_init_fastcard;
cards[cardno++].map = expamem_map_fastcard;
}
}*/
/*#ifdef CDTV
if (currprefs.cs_cdtvcd && !currprefs.cs_cdtvcr) {
cards[cardno].flags = 0;
cards[cardno].name = "CDTV DMAC";
cards[cardno].initrc = cdtv_init;
cards[cardno++].map = null;
}
#endif
#ifdef CD32
if (currprefs.cs_cd32cd && SAEV_config.memory.z2FastSize == 0 && SAEV_config.memory.chipSize <= 0x200000 && currprefs.cs_cd32fmv) {
cards[cardno].flags = 0;
cards[cardno].name = "CD32MPEG";
cards[cardno].initnum = expamem_init_cd32fmv;
cards[cardno++].map = expamem_map_cd32fmv;
}
#endif
#ifdef A2065
if (currprefs.a2065name[0]) {
cards[cardno].flags = 0;
cards[cardno].name = "A2065";
cards[cardno].initnum = a2065_init;
cards[cardno++].map = null;
}
#endif
#ifdef FILESYS
if (do_mount && currprefs.uaeboard < 2) {
cards[cardno].flags = 0;
cards[cardno].name = "UAEFS";
cards[cardno].initnum = expamem_init_filesys;
cards[cardno++].map = expamem_map_filesys;
}
if (currprefs.uaeboard) {
cards[cardno].flags = 0;
cards[cardno].name = "UAEBOARD";
cards[cardno].initnum = expamem_init_uaeboard;
cards[cardno++].map = expamem_map_uaeboard;
}
#endif
#ifdef WITH_TOCCATA
if (currprefs.sound_toccata) {
cards[cardno].flags = 0;
cards[cardno].name = "Toccata";
cards[cardno++].initnum = sndboard_init;
}
#endif
if (currprefs.monitoremu == MONITOREMU_FIRECRACKER24) {
cards[cardno].flags = 0;
cards[cardno].name = "FireCracker24";
cards[cardno++].initnum = specialmonitor_autoconfig_init;
}*/
/* Z3 boards last */
if (!SAEV_config.cpu.addressSpace24) {
if (z3fastmem_bank.baseaddr !== null) {
var alwaysmapz3 = SAEV_config.memory.z3Mapping != SAEC_Config_Memory_z3Mapping_Real;
z3num = 0;
cards[cardno].flags = 2 | 1;
cards[cardno].name = "Z3Fast";
cards[cardno].initnum = expamem_init_z3fastmem;
cards[cardno++].map = expamem_map_z3fastmem;
if (alwaysmapz3 || expamem_z3hack(SAEV_config))
SAER.memory.map_banks_z3(z3fastmem_bank, z3fastmem_bank.start >>> 16, SAEV_config.memory.z3FastSize >>> 16);
/*if (z3fastmem2_bank.baseaddr != null) {
cards[cardno].flags = 2 | 1;
cards[cardno].name = "Z3Fast2";
cards[cardno].initnum = expamem_init_z3fastmem2;
cards[cardno++].map = expamem_map_z3fastmem2;
if (alwaysmapz3 || expamem_z3hack(SAEV_config))
SAER.memory.map_banks_z3(z3fastmem2_bank, z3fastmem2_bank.start >>> 16, currprefs.z3fastmem2_size >>> 16);
}*/
}
/*if (z3chipmem_bank.baseaddr != null)
SAER.memory.map_banks_z3(z3chipmem_bank, z3chipmem_bank.start >>> 16, currprefs.z3chipmem_size >>> 16);
add_expansions(BOARD_AUTOCONFIG_Z3);*/
}
//add_expansions(BOARD_NONAUTOCONFIG_AFTER_Z3);
expamem_z2_pointer = 0;
expamem_z3_pointer = 0;
expamem_z3_sum = 0;
if (cardno == 0)
expamem_init_clear_zero();
else
call_card_init(0);
}
this.setup = function() { //expansion_init()
fastmem_bank.allocated = 0;
fastmem_bank.mask = fastmem_bank.start = 0;
fastmem_bank.baseaddr = null;
/*fastmem_nojit_bank.allocated = 0;
fastmem_nojit_bank.mask = fastmem_nojit_bank.start = 0;
fastmem_nojit_bank.baseaddr = null;
fastmem2_bank.allocated = 0;
fastmem2_bank.mask = fastmem2_bank.start = 0;
fastmem2_bank.baseaddr = null;
fastmem2_nojit_bank.allocated = 0;
fastmem2_nojit_bank.mask = fastmem2_nojit_bank.start = 0;
fastmem2_nojit_bank.baseaddr = null;
z3fastmem_bank.allocated = 0;
z3fastmem_bank.mask = z3fastmem_bank.start = 0;
z3fastmem_bank.baseaddr = null;
z3fastmem2_bank.allocated = 0;
z3fastmem2_bank.mask = z3fastmem2_bank.start = 0;
z3fastmem2_bank.baseaddr = null;
z3chipmem_bank.allocated = 0;
z3chipmem_bank.mask = z3chipmem_bank.start = 0;
z3chipmem_bank.baseaddr = null;*/
/*#ifdef FILESYS
filesys_start = 0;
#endif*/
allocate();
/*#ifdef FILESYS
if (currprefs.uaeboard < 2) {
filesys_bank.allocated = 0x10000;
if (!mapped_malloc (&filesys_bank)) {
SAEF_error("virtual memory exhausted (filesysory)!");
exit(0);
}
}
#endif
if (currprefs.uaeboard) {
uaeboard_bank.allocated = 0x10000;
mapped_malloc(&uaeboard_bank);
}*/
}
this.cleanup = function() {
mapped_free(fastmem_bank);
/*mapped_free(fastmem2_bank);
mapped_free(z3fastmem_bank);
mapped_free(z3fastmem2_bank);
mapped_free(z3chipmem_bank);
fastmem_nojit_bank.baseaddr = null;
fastmem2_nojit_bank.baseaddr = null;*/
/*#ifdef FILESYS
mapped_free (&filesys_bank);
#endif
if (currprefs.uaeboard)
mapped_free(&uaeboard_bank);*/
}
function clear_bank(ab) {
if (ab.baseaddr !== null && ab.allocated) {
//memset(ab->baseaddr, 0, ab->allocated > 0x800000 ? 0x800000 : ab->allocated);
SAEF_memset(ab.baseaddr,0, 0, ab.allocated > 0x800000 ? 0x800000 : ab.allocated);
}
}
this.clear = function() { //expansion_clear()
clear_bank(fastmem_bank);
/*clear_bank(fastmem2_bank);
clear_bank(z3fastmem_bank);
clear_bank(z3fastmem2_bank);
clear_bank(z3chipmem_bank);*/
}
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*var expamem_null = new SAEO_Memory_addrbank(
null, null, null,
null, null, null,
null, null, null, null, "",
null, null,
//0, 0, 0
0
);
var expamem_none = new SAEO_Memory_addrbank(
null, null, null,
null, null, null,
null, null, null, null, "",
null, null,
//0, 0, 0
0
);*/
/*-----------------------------------------------------------------------*/
/* BANK Autoconfig Z2 */
function expamem_get32(addr) {
if (expamem_bank_current && expamem_bank_current !== expamem_bank)
return expamem_bank_current.get32(addr);
SAEF_warn("expamem_get32() Z2 READ.L from address $%08x PC=%x", addr, SAER_CPU_getPC());
return ((expamem_get16(addr) << 16) | expamem_get16(addr + 2)) >>> 0;
}
function expamem_get16(addr) {
if (expamem_bank_current && expamem_bank_current !== expamem_bank)
return expamem_bank_current.get16(addr);
if (expamem_type() != zorroIII) {
if (expamem_bank_current && expamem_bank_current !== expamem_bank)
return expamem_bank_current.get8(addr) << 8;
}
SAEF_warn("expamem_get16() READ.W from address $%08x PC=%x", addr, SAER_CPU_getPC());
return (expamem_get8(addr) << 8) | expamem_get8(addr + 1);
}
function expamem_get8(addr) {
/*if (!chipdone) {
chipdone = true;
addextrachip(SAER_Memory_get32(4));
}*/
if (expamem_bank_current && expamem_bank_current !== expamem_bank)
return expamem_bank_current.get8(addr);
return expamem[addr & 0xffff];
/*addr &= 0xFFFF;
var b = expamem[addr];
#if EXP_DEBUG
SAEF_log("expamem_get8 %x %x", addr, b);
#endif
return b;*/
}
function expamem_put32(addr, value) {
if (expamem_bank_current && expamem_bank_current !== expamem_bank) {
expamem_bank_current.put32(addr, value);
return;
}
SAEF_warn("expamem_put32() Z2 WRITE.L to address $%08x : value $%08x", addr, value);
}
function expamem_put16(addr, value) {
/*#if EXP_DEBUG
SAEF_log("expamem_put16 %x %x", addr, value);
#endif*/
value &= 0xffff;
if (ecard >= cardno)
return;
if (expamem_type() != zorroIII)
SAEF_warn("expamem_put16() WRITE.W to address $%08x : value $%x PC=%08x", addr, value, SAER_CPU_getPC());
switch (addr & 0xff) {
case 0x48:
// A2630 boot rom writes WORDs to Z2 boards!
if (expamem_type() == zorroII) {
expamem_lo = 0;
expamem_hi = (value >> 8) & 0xff;
expamem_z2_pointer = (expamem_hi | (expamem_lo >> 4)) << 16;
expamem_board_pointer = expamem_z2_pointer;
if (cards[ecard].map) {
expamem_next(cards[ecard].map(), null);
return;
}
if (expamem_bank_current && expamem_bank_current !== expamem_bank) {
expamem_bank_current.put8(addr, value >> 8);
return;
}
}
break;
case 0x44:
if (expamem_type() == zorroIII) {
expamem_hi = value & 0xff00;
var addr = ((expamem_hi | (expamem_lo >> 4)) << 16) >>> 0;
if (!expamem_z3hack(SAEV_config))
expamem_z3_pointer = addr;
else {
if (addr != expamem_z3_pointer) {
SAEF_warn("expansion.expamem_put16() hack %08x %08x", addr, expamem_z3_pointer);
SAER_Memory_put16(SAER_CPU_regs.a[3] + 0x20, expamem_z3_pointer >>> 16); //ATT regs.regs[11]
SAER_Memory_put16(SAER_CPU_regs.a[3] + 0x28, expamem_z3_pointer >>> 16);
}
}
expamem_board_pointer = expamem_z3_pointer;
}
if (cards[ecard].map) {
expamem_next(cards[ecard].map(), null);
return;
}
break;
case 0x4c:
if (cards[ecard].map) {
expamem_next(null, null);
return;
}
break;
}
if (expamem_bank_current && expamem_bank_current !== expamem_bank)
expamem_bank_current.put16(addr, value);
}
function expamem_put8(addr, value) {
/*#if EXP_DEBUG
SAEF_log("expamem_put8 %x %x", addr, value);
#endif*/
value &= 0xff;
if (ecard >= cardno)
return;
if (expamem_type() == protoautoconfig) {
switch (addr & 0xff) {
case 0x22: {
expamem_hi = value & 0x7f;
expamem_z2_pointer = 0xe80000 | (expamem_hi * 4096);
expamem_board_pointer = expamem_z2_pointer;
if (cards[ecard].map) {
expamem_next(cards[ecard].map(), null);
return;
}
}
}
} else {
switch (addr & 0xff) {
case 0x48:
if (expamem_type() == zorroII) {
expamem_hi = value & 0xff;
expamem_z2_pointer = (expamem_hi | (expamem_lo >> 4)) << 16;
expamem_board_pointer = expamem_z2_pointer;
if (cards[ecard].map) {
expamem_next(cards[ecard].map(), null);
return;
}
} else {
expamem_lo = value & 0xff;
}
break;
case 0x4a:
if (expamem_type() == zorroII)
expamem_lo = value & 0xff;
break;
case 0x4c:
if (cards[ecard].map) {
expamem_next(expamem_bank_current, null);
return;
}
break;
}
}
if (expamem_bank_current && expamem_bank_current !== expamem_bank)
expamem_bank_current.put8(addr, value);
}
var expamem_bank = new SAEO_Memory_addrbank(
expamem_get32, expamem_get16, expamem_get8,
expamem_put32, expamem_put16, expamem_put8,
SAEF_Memory_defaultXLate, SAEF_Memory_defaultCheck, null, null, "Autoconfig Z2",
SAEF_Memory_dummyGetInst32, SAEF_Memory_dummyGetInst16,
//SAEC_Memory_addrbank_flag_IO | SAEC_Memory_addrbank_flag_SAFE | SAEC_Memory_addrbank_flag_PPCIOSPACE, S_READ, S_WRITE
SAEC_Memory_addrbank_flag_IO | SAEC_Memory_addrbank_flag_SAFE | SAEC_Memory_addrbank_flag_PPCIOSPACE
);
SAER_Expansion_expamem_bank = expamem_bank;
/*-----------------------------------------------------------------------*/
/* BANK Autoconfig Z3 */
function expamemz3_get8(addr) {
if (!expamem_bank_current)
return 0;
var reg = addr & 0xff;
if (addr & 0x100)
reg += 2;
return expamem_bank_current.get8(reg);
}
function expamemz3_get16(addr) {
SAEF_warn("expansion.expamemz3_get16() READ.W from address $%08x PC=%x", addr, SAER_CPU_getPC());
return (expamemz3_get8(addr) << 8) | expamemz3_get8(addr + 1);
}
function expamemz3_get32(addr) {
SAEF_warn("expansion.expamemz3_get32() READ.L from address $%08x PC=%x", addr, SAER_CPU_getPC());
return ((expamemz3_get16(addr) << 16) | expamemz3_get16(addr + 2)) >>> 0;
}
function expamemz3_put8(addr, value) {
if (!expamem_bank_current)
return;
var reg = addr & 0xff;
if (addr & 0x100)
reg += 2;
if (reg == 0x48) {
if (expamem_type() == zorroII) {
expamem_hi = value & 0xff;
expamem_z2_pointer = ((expamem_hi | (expamem_lo >> 4)) << 16) >>> 0;
expamem_board_pointer = expamem_z2_pointer;
} else {
expamem_lo = value & 0xff;
}
} else if (reg == 0x4a) {
if (expamem_type() == zorroII)
expamem_lo = value & 0xff;
}
expamem_bank_current.put8(reg, value);
}
function expamemz3_put16(addr, value) {
if (!expamem_bank_current)
return;
var reg = addr & 0xff;
if (addr & 0x100)
reg += 2;
if (reg == 0x44) {
if (expamem_type() == zorroIII) {
expamem_hi = value & 0xff00;
var z3_pointer = ((expamem_hi | (expamem_lo >> 4)) << 16) >>> 0;
if (!expamem_z3hack(SAEV_config))
expamem_z3_pointer = z3_pointer;
else {
if (z3_pointer != expamem_z3_pointer) {
SAEF_warn("expansion.expamemz3_put16() hack %08x %08x", addr, expamem_z3_pointer);
SAER_Memory_put16(SAER_CPU_regs.a[3] + 0x20, expamem_z3_pointer >>> 16); //ATT regs.regs[11]
SAER_Memory_put16(SAER_CPU_regs.a[3] + 0x28, expamem_z3_pointer >>> 16);
}
}
expamem_board_pointer = expamem_z3_pointer;
}
}
expamem_bank_current.put16(reg, value);
}
function expamemz3_put32(addr, value) {
SAEF_warn("expansion.expamemz3_put32() WRITE.L to address $%08x, value $%08x", addr, value);
}
var expamemz3_bank = new SAEO_Memory_addrbank(
expamemz3_get32, expamemz3_get16, expamemz3_get8,
expamemz3_put32, expamemz3_put16, expamemz3_put8,
SAEF_Memory_defaultXLate, SAEF_Memory_defaultCheck, null, null, "Autoconfig Z3",
SAEF_Memory_dummyGetInst32, SAEF_Memory_dummyGetInst16,
//SAEC_Memory_addrbank_flag_IO | SAEC_Memory_addrbank_flag_SAFE | SAEC_Memory_addrbank_flag_PPCIOSPACE, S_READ, S_WRITE
SAEC_Memory_addrbank_flag_IO | SAEC_Memory_addrbank_flag_SAFE | SAEC_Memory_addrbank_flag_PPCIOSPACE
);
/*-----------------------------------------------------------------------*/
/*#ifdef CD32
static addrbank *expamem_map_cd32fmv (void) {
return cd32_fmv_init (expamem_z2_pointer);
}
static addrbank *expamem_init_cd32fmv (int devnum) {
int ids[] = { 23, -1 };
struct romlist *rl = getromlistbyids (ids, NULL);
struct romdata *rd;
struct zfile *z;
expamem_init_clear ();
if (!rl)
return NULL;
write_log (_T("CD32 FMV ROM '%s' %d.%d\n"), rl->path, rl->rd->ver, rl->rd->rev);
rd = rl->rd;
z = read_rom (rd);
if (z) {
zfile_fread (expamem, 128, 1, z);
zfile_fclose (z);
}
return NULL;
}
#endif*/
}