/*-------------------------------------------------------------------------
| 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: This file does not contain any emulator-code.
-------------------------------------------------------------------------*/
const URL_DATABASE = "http://"+window.location.hostname+"/db";
const URL_DATABASE_GAMES = URL_DATABASE+"/games";
const URL_DATABASE_DEMOS = URL_DATABASE+"/demos";
const URL_DATABASE_DEMOS_AGA = URL_DATABASE+"/demos_aga";
const URL_DATABASE_TOOLS = URL_DATABASE+"/tools";
/*---------------------------------*/
/* dbEntry types */
const DBT_GAME = 1;
const DBT_DEMO = 2;
const DBT_DAGA = 3;
const DBT_TOOL = 4;
/* dbEntry flags */
const DBF_MDC = 1; /* require manual disk-change by user */
const DBF_NOT = 2; /* disable turbo-mode for floppies */
const DBF_COL = 4; /* enable collision-detection */
const DBF_BIM = 8; /* enable immediate blitter */
const DBF_ECS = 16; /* ECS required */
const DBF_AGA = 32; /* AGA required */
const DBF_030 = 64; /* 68030 enabled */
function dbEntry(t,nd, n,d,p,l,y, f,no) {
this.id = Math.random() * 0xffffffff >>> 0;
this.type = t;
this.numdisks = nd;
this.name = n;
this.developer = d;
this.publisher = p;
this.license = l;
this.year = y;
this.flags = f;
this.notes = no;
}
const DB_IDS = [[
"cfg_game",
"cfg_demo",
"cfg_demo_aga",
"cfg_tool"
], [
"cfg_floppy_select_game",
"cfg_floppy_select_demo",
"cfg_floppy_select_demo_aga",
"cfg_floppy_select_tool"
]];
const DB_URLS = [
URL_DATABASE_GAMES,
URL_DATABASE_DEMOS,
URL_DATABASE_DEMOS_AGA,
URL_DATABASE_TOOLS
];
/*---------------------------------*/
function mkA(url, name) { return ''+name+''; }
const URL_ENABLE_SOFTWARE = mkA("http://blockyskies.com", "Enable Software");
const URL_TEAM_HOI = mkA("http://www.sevensheaven.nl", "Team Hoi");
const URL_RETROGURU = mkA("http://www.retroguru.com", "retroguru");
const URL_LOEWENSTEIN = mkA("http://www.richard-loewenstein.de", "Richard Löwenstein");
const URL_HECKMECK = mkA("http://heckmeck.de", "Alexander Grupe");
const URL_AROS = mkA("http://aros.org", "aros.org");
const URL_AROS_LIC = mkA("http://aros.org/license.html", "APL");
const URL_SYSINFO = mkA("http://sysinfo.d0.se", "Nic Wilson");
const db = [
new dbEntry(DBT_GAME,1, "Air Ace II", "SEUCK","","PD", "1989", 0, "Loading takes very long."),
new dbEntry(DBT_GAME,1, "Asteroids", "Vertical Developments","","PD", "1979", 0, ""),
new dbEntry(DBT_GAME,1, "BlockySkies", URL_ENABLE_SOFTWARE,"","FW", "2016", 0, ""),
new dbEntry(DBT_GAME,1, "Crazy Sue", "Jumpshoe,Hironymous","","PD", "1991", 0, "Loading can take some time."),
new dbEntry(DBT_GAME,1, "Deluxe Galaga 2.4", "Edgar Vigdal","","FW", "1994", DBF_COL, ""),
new dbEntry(DBT_GAME,2, "Hoi", URL_TEAM_HOI,"Hollyware","FW", "1992", DBF_MDC, "Press the LMB to skip the intro and insert the 2nd disk manually.
Cheat (move mouse-over)"),
new dbEntry(DBT_GAME,1, "Norse Gods", URL_LOEWENSTEIN,"","FW", "1991", 0, ""),
new dbEntry(DBT_GAME,1, "Pollymorf", "Andrew Campbell","","PD", "1993", 0, "Loading takes some time, just wait."),
new dbEntry(DBT_GAME,1, "Sqrxz", URL_RETROGURU,"","FW", "2012", 0, "The color-stripes are normal, just wait..."),
new dbEntry(DBT_GAME,1, "Sqrxz 2", URL_RETROGURU,"","FW", "2012", 0, "After the start, click the RMB for the trainer menu. The color-stripes are normal, just wait..."),
new dbEntry(DBT_GAME,1, "Super Obliteration", "David Papworth","","FW", "1993", 0, ""),
new dbEntry(DBT_GAME,1, "Tanx", "Robertz Gaz","","PD", "1991", 0, ""),
new dbEntry(DBT_GAME,1, "Zerosphere", URL_HECKMECK,"","FW", "2015", 0, ""),
new dbEntry(DBT_DEMO,1, "242", "Virtual Dreams","","", "1992", 0, ""),
new dbEntry(DBT_DEMO,2, "9 Fingers", "Spaceballs","","", "1993", DBF_NOT, ""),
new dbEntry(DBT_DEMO,1, "Alpha and Omega", "Pure Metal Coders","","", "1991", DBF_NOT, ""),
new dbEntry(DBT_DEMO,1, "Copper Master", "Angels","","", "1990", 0, ""),
new dbEntry(DBT_DEMO,1, "Deja Vu", "Anarchy","","", "1992", 0, ""),
new dbEntry(DBT_DEMO,1, "Ecliptica", "TRSI","","", "1991", DBF_ECS, "The blue flashing in the beginning is normal. Just wait..."),
new dbEntry(DBT_DEMO,1, "Elysium", "Sanity","","", "1991", 0, ""),
new dbEntry(DBT_DEMO,1, "Enigma", "Phenomena","","", "1991", 0, ""),
new dbEntry(DBT_DEMO,1, "Global Trash", "Silents","","", "1992", 0, ""),
new dbEntry(DBT_DEMO,2, "Hardwired", "Crionics, Silents","","", "1992", DBF_MDC|DBF_BIM, "Insert the 2nd disk manually and click the RMB when done."),
new dbEntry(DBT_DEMO,1, "HipHop Hater", "Mathias Olsson","","", "1991", 0, ""),
new dbEntry(DBT_DEMO,1, "Ice", "Silents","","", "1991", 0, "Press the LMB at the intro-screen."),
new dbEntry(DBT_DEMO,1, "Lost World", "Balance DK","","", "1992", 0, "Press the LMB at the intro-screen."),
new dbEntry(DBT_DEMO,1, "Mental Hangover", "Scoopex","","", "1992", 0, ""),
new dbEntry(DBT_DEMO,1, "Multica", "Andromeda","","", "1992", 0, "Press the LMB at the intro-screen."),
new dbEntry(DBT_DEMO,1, "Project-X (demo rolling)", "Team 17","","", "1992", 0, "Press 'Fire' to skip to the 2nd level anytime."),
new dbEntry(DBT_DEMO,1, "Rampage", "TEK","","", "1994", DBF_NOT, "Press the LMB at the intro-screen."),
new dbEntry(DBT_DEMO,1, "State of the Art", "Spaceballs","","", "1992", 0, ""),
new dbEntry(DBT_DEMO,1, "Static Chaos", "Silents","","", "1992", 0, ""),
new dbEntry(DBT_DEMO,1, "Technological Death","Mad Elks","","", "1993", DBF_BIM, ""),
new dbEntry(DBT_DEMO,1, "Total Destruction", "Crionics","","", "1990", 0, ""),
new dbEntry(DBT_DEMO,1, "Wayfarer", "Spaceballs","","", "1992", 0, ""),
new dbEntry(DBT_DEMO,1, "World of Commodore", "Sanity","","", "1992", 0, ""),
new dbEntry(DBT_DAGA,1, "Atome", "Skarla","","", "1996", DBF_AGA|DBF_030, ""),
new dbEntry(DBT_DAGA,2, "Burning Chrome", "Haujobb","","", "1996", DBF_AGA|DBF_030, "Open the disk AC1: by double-click and then double-click 'BurningChrome' once."),
new dbEntry(DBT_DAGA,1, "C42", "Case, Groo, Juliet","","", "1995", DBF_AGA|DBF_030, ""),
new dbEntry(DBT_DAGA,2, "Control", "Oxygene","","", "1995", DBF_AGA|DBF_030|DBF_MDC, "When asked, insert the 2nd disk manually."),
new dbEntry(DBT_DAGA,1, "Crazy Sexy Cool", "Essence","","", "1995", DBF_AGA|DBF_030, ""),
new dbEntry(DBT_DAGA,2, "Deep", "CNCD & Parallax","","", "1995", DBF_AGA, ""),
new dbEntry(DBT_DAGA,1, "Friday at Eight", "Polka Brothers","","", "1994", DBF_AGA, ""),
new dbEntry(DBT_DAGA,1, "Full Moon", "Virtual Dreams, Fairlight","","", "1993", DBF_AGA, ""),
new dbEntry(DBT_DAGA,1, "Gevalia", "Polka Brothers","","", "1994", DBF_AGA, ""),
new dbEntry(DBT_DAGA,1, "Nexus 7", "Andromeda","","", "1994", DBF_AGA|DBF_030, ""),
new dbEntry(DBT_DAGA,1, "Not Again", "Sanity, Complex, Avena, Lego","","", "1992", DBF_AGA, "Press the RMB to get to the next section anytime."),
new dbEntry(DBT_DAGA,2, "Origin", "Complex","","", "1993", DBF_AGA|DBF_NOT, ""),
new dbEntry(DBT_DAGA,1, "Real", "Complex","","", "1994", DBF_AGA|DBF_NOT, "In the last 3d-scene, hold the LMB to rotate and the RMB to walk around. (the scene which does have graphics errors)"),
new dbEntry(DBT_DAGA,1, "Roots", "Sanity","","", "1994", DBF_AGA, ""),
new dbEntry(DBT_DAGA,2, "Switchback", "Rebels","","", "1994", DBF_AGA|DBF_030, ""), /* 68030 */
new dbEntry(DBT_DAGA,4, "Twisted", "Polka Brothers","","", "1994", DBF_AGA, ""),
new dbEntry(DBT_DAGA,2, "Vision", "Oxygene","","", "1995", DBF_AGA, ""),
new dbEntry(DBT_DAGA,4, "Wild", "Anadune, Nah Color","","", "1996", DBF_MDC|DBF_AGA, "When asked, change the disks manually."),
new dbEntry(DBT_TOOL,1, "AROS Bootdisk", URL_AROS,"",URL_AROS_LIC, "2016", 0, "Press 'Cancel' when asked for a Live-CD."),
new dbEntry(DBT_TOOL,1, "AIBB 6.5", "Peter LaMonte Koop","","FW", "1993", 0, "Type 'aibb' at the console. Be very patient at the 'Evaluating System...' screen."),
new dbEntry(DBT_TOOL,1, "SysInfo 4.0", URL_SYSINFO,"","FW", "2012", 0, "Type 'sysinfo' (y=z) at the console."),
new dbEntry(DBT_TOOL,1, "X-Copy 2.0", "Cachet","","FW", "1989", 0, "")
];
var dbUrl = "";
var dbGrp = 0;
var dbNum = 0;
/*---------------------------------*/
const AROS_ROM_FILE = "aros-amiga-m68k-rom.bin";
const AROS_ROM_CRC = 0xE8A40832; /* also edit roms.js on change */
const AROS_EXT_FILE = "aros-amiga-m68k-ext.bin";
const AROS_EXT_CRC = 0x5C39D820;
/*---------------------------------*/
const MAX_FILENAME = 40;
const MODE_Database = 0;
const MODE_Advanced = 1;
var mode = MODE_Database; /* current mode */
/* page-ids in the advanced-mode */
const PID_None = 0;
const PID_Model = 1;
const PID_CPU = 2;
const PID_Chipset = 3;
const PID_RAM = 4;
const PID_ROM = 5;
const PID_ROM_Info = 6;
const PID_Floppy = 7;
const PID_Floppy_Info = 8;
const PID_Mount = 9;
const PID_Mount_Setup = 10;
const PID_Video = 11;
const PID_Audio = 12;
const PID_Ports = 13;
var page = PID_None; /* current page in the advanced-config */
var useAROS = false; /* use AROS in the advanced-config */
var romNum = -1; /* current rom-id if rom-info is shown */
var defRomInfo = null; /* kickstart rom-info */
var defRomEncrypted = null; /* kickstart-rom is encrypted */
var extRomInfo = null; /* extended rom-info */
var extRomEncrypted = null; /* extended-rom is encrypted */
var romKeyInfo = null; /* romkey-info */
var amaxInfo = null; /* amax rom-info */
var floppyNum = -1; /* current floppy-unit if floppy-info is shown */
var mountConfigNum = -1; /* current mount-unit if mount-info is shown */
var paused = false; /* is the emualtion currently paused? */
var dskchg = false; /* disk-change requester in database-mode */
var dskchgList = []; /* list of floppies to change, created dynamicaly */
var cache = null; /* asynchronous file-cache */
/*---------------------------------*/
var sae = null; /* SAE instance */
var cfg = null; /* reference to the config-object */
var inf = null; /* reference to the info-object */
/*-----------------------------------------------------------------------*/
/* utils */
function decodeURL(url) {
return decodeURIComponent(url.replace(/\+/g, " "));
}
/*function addItemToURL() {
if (mode == MODE_Database) {
var dbe = dbNum > 0 ? db[dbNum - 1] : null;
if (dbe !== null) {
var name = dbe.name;
while (true) {
var tmp = name.replace(" ", "_");
if (tmp == name) break;
name = tmp;
}
window.location.hash = name;
} else
window.location.hash = "";
} else
window.location.hash = "";
}*/
/*---------------------------------*/
/* CRC-32 checksumming */
const crc32Table = (function() {
var table = new Uint32Array(256);
var n, c, k;
for (n = 0; n < 256; n++) {
c = n;
for (k = 0; k < 8; k++)
c = ((c >>> 1) ^ (c & 1 ? 0xedb88320 : 0)) >>> 0;
table[n] = c;
}
return table;
})();
function crc32(data) {
var length = data.length;
var offset = 0;
var crc = 0xffffffff;
while (length-- > 0)
crc = crc32Table[(crc ^ data.charCodeAt(offset++)) & 0xff] ^ (crc >>> 8);
return (crc ^ 0xffffffff) >>> 0;
}
if (crc32("The quick brown fox jumps over the lazy dog") != 0x414fa339)
alert("CRC32-hash testing failed. SAE will not work. This is an internal bug!?");
/*---------------------------------*/
function isDecKey(event, signed) {
if (signed === true)
return (event.charCode >= 48 && event.charCode <= 57) || event.charCode == 45;
else
return event.charCode >= 48 && event.charCode <= 57;
}
function isHexKey(event) {
return (
(event.charCode >= 48 && event.charCode <= 57) || //0-9
(event.charCode >= 65 && event.charCode <= 70) || //A-F
(event.charCode >= 97 && event.charCode <= 102) //a-f
);
}
function setDisabled(id, d) {
document.getElementById(id).disabled = d;
}
function setInnerHTML(id, t) {
document.getElementById(id).innerHTML = t;
}
/*---------------------------------*/
/* checkbox-input */
function getCheckbox(id) {
return document.getElementById(id).checked;
}
function setCheckbox(id, checked) {
document.getElementById(id).checked = checked;
}
/*---------------------------------*/
/* select-input */
function getSelect(id, asString) {
if (typeof asString == "undefined") asString = false;
var e = document.getElementById(id);
for (var i = 0; i < e.length; i++) {
if (e[i].selected)
return asString ? e[i].value : Number(e[i].value);
}
//alert(sprintf("getSelect() ERROR id '%s'", id));
return false;
}
function setSelect(id, v) {
var e = document.getElementById(id);
/*for (var i = 0; i < e.length; i++) {
if (e[i].selected) {
e[i].selected = false;
break;
}
}*/
var vs = String(v);
for (var i = 0; i < e.length; i++) {
if (e[i].value === vs) {
e[i].selected = true;
//break;
return;
}
}
//alert(sprintf("setSelect() ERROR id '%s', value '%s'", id, vs));
}
/*---------------------------------*/
/* radio-input */
function getRadio(name, asString) {
if (typeof asString == "undefined") asString = false;
var e = document.getElementsByName(name);
for (var i = 0; i < e.length; i++) {
if (e[i].checked)
return asString ? e[i].value : Number(e[i].value);
}
//alert(sprintf("getRadio() ERROR name '%s'", name));
return false;
}
function setRadio(name, v) {
var e = document.getElementsByName(name);
for (var i = 0; i < e.length; i++) {
if (e[i].checked)
e[i].checked = false;
}
var vs = String(v);
for (var i = 0; i < e.length; i++) {
if (e[i].value === vs) {
e[i].checked = true;
return;
}
}
//alert(sprintf("setRadio() ERROR name '%s', value '%s'", name, vs));
}
/*---------------------------------*/
/* text-input */
function getText(id, asString) {
if (typeof asString == "undefined") asString = false;
var e = document.getElementById(id);
return asString ? e.value : Number(e.value);
}
function setText(id, v) {
document.getElementById(id).value = typeof v === "string" ? v : String(v);
}
function setText2(id, v) {
document.getElementById(id).innerHTML = typeof v === "string" ? v : String(v);
}
/*---------------------------------*/
/* style-display */
function styleDisplayBlock(id, show) {
var e = document.getElementById(id);
e.style.display = show ? "block" : "none";
}
function styleDisplayInline(id, show) {
var e = document.getElementById(id);
e.style.display = show ? "inline" : "none";
}
function styleDisplayTable(id, show) {
var e = document.getElementById(id);
e.style.display = show ? "table" : "none";
}
function styleDisplayTableRow(id, show) {
var e = document.getElementById(id);
e.style.display = show ? "table-row" : "none";
}
function styleDisplayTableCell(id, show) {
var e = document.getElementById(id);
e.style.display = show ? "table-cell" : "none";
}
/*---------------------------------*/
function freezeButtons(f, l) {
if (f) {
if (mode == MODE_Database) {
setDisabled("cfg_database_start", 1);
setInnerHTML("cfg_database_start", "Loading...");
setDisabled("cfg_database_config", 1);
} else {
setDisabled("cfg_start", 1);
if (l) setInnerHTML("cfg_start", "Loading...");
//setDisabled("cfg_back", 1);
}
} else {
if (mode == MODE_Database) {
setDisabled("cfg_database_start", 0);
setInnerHTML("cfg_database_start", "Start");
setDisabled("cfg_database_config", 0);
} else {
setDisabled("cfg_start", 0);
if (l) setInnerHTML("cfg_start", "Start");
//setDisabled("cfg_back", 0);
}
}
}
function switchPauseResume(p) {
var e = document.getElementById("controls_pr");
if (p) {
e.innerHTML = "Resume";
e.onclick = function() { pause(false); };
} else {
e.innerHTML = "Pause";
e.onclick = function() { pause(true); };
}
}
function switchBaseEmul(emul) {
if (emul) {
document.body.style.backgroundColor = "#000000";
styleDisplayBlock("base", 0);
styleDisplayBlock("emul", 1);
} else {
styleDisplayBlock("emul", 0);
styleDisplayBlock("base", 1);
document.body.style.backgroundColor = "#f8f8f8";
}
}
/*---------------------------------*/
function fireButtonName(fire) {
switch (fire) {
case 0: return "None";
case 16: return "Shift";
case 17: return "Ctrl";
case 13: return "Enter";
case 32: return "Space";
case 8: return "Backspace";
case 96: return "Numpad 0";
case 106: return "Numpad *";
case 107: return "Numpad ";
case 109: return "Numpad -";
case 110: return "Numpad .";
case 111: return "Numpad /";
case 46: return "Delete";
case 45: return "Insert";
case 34: return "Page down";
case 33: return "Page up";
case 35: return "End";
case 36: return "Home";
case 19: return "Pause";
case 144: return "Num lock";
case 145: return "Scroll lock";
case 49: return "1";
case 50: return "2";
default: return "ERROR";
}
}
/*---------------------------------*/
function saee2text(err) {
switch (err) {
case SAEE_NotRunning: return "The emulator is not running.";
case SAEE_NoTimer: return "No timing-functions avail. Please upgrade your browser.";
case SAEE_NoMemory: return "Out of memory.";
case SAEE_Assert: return "Assertiation failed.";
case SAEE_Internal: return "Internal emulator error.";
case SAEE_Config_Invalid: return "Invalid configuration.";
case SAEE_Config_Compressed: return "A ZIP file was detected. Compressed files are not yet supported.";
case SAEE_CPU_Internal: return "Internal CPU-error.";
case SAEE_CPU_Requires68020: return "The selected kickstart-rom does require a 68020 and 32bit address-space";
case SAEE_CPU_Requires680EC20: return "The selected kickstart-rom does require a 68020.";
case SAEE_CPU_Requires68030: return "The selected kickstart-rom does require a 68030.";
case SAEE_CPU_Requires68040: return "The selected kickstart-rom does require a 68040/68060.";
case SAEE_Memory_NoKickstartRom: return "The kickstart-rom is missing.";
case SAEE_Memory_NoExtendedRom: return "An extended-rom is required but missing.\n\nGo to the ROM-page and select a rom from disk...";
case SAEE_Memory_RomSize: return "The kickstart- or extended-rom does have an invalid size.";
case SAEE_Memory_RomKey: return "A ROM-keyfile is required. (Cloanto)";
case SAEE_Memory_RomDecode: return "Invalid ROM-keyfile. (Cloanto)";
case SAEE_Memory_RomChecksum: return "Checksum-error at the kickstart- or extended-rom.";
case SAEE_Memory_RomUnknown: return "Unknown ROM.";
case SAEE_Video_ElementNotFound: return "Video DIV-element not found. Check 'cfg.video.id'";
case SAEE_Video_RequiresCanvas: return "This browser does not support 'Canvas'. Please upgrade to an actual version.";
case SAEE_Video_RequiresWegGl: return "This browser does not support 'WebGL'. Please upgrade to an actual version.";
case SAEE_Video_ComphileShader: return "Can not compile the required shader-program.";
case SAEE_Video_LinkShader: return "Can not link the required shader-program.";
case SAEE_Audio_RequiresWebAudio: return "This browser does not support 'WebAudio'. Please upgrade to an actual version.";
default: return "("+err+")";
}
}
/*-----------------------------------------------------------------------*/
/* database */
function dbInit() {
function addOption(select, text, value) {
var option = document.createElement("option");
if (text.length)
option.text = text;
option.value = String(value);
if (value == 0) {
option.style.fontWeight = "bold";
option.disabled = "disabled";
}
select.add(option, null);
}
for (var dbt = 1; dbt <= 4; dbt++) {
var s = document.getElementById(DB_IDS[0][dbt - 1]);
for (var i = 0; i < db.length; i++) {
if (db[i].type == dbt)
addOption(s, db[i].name, 1 + i);
}
}
for (var dbt = 1; dbt <= 4; dbt++) {
var s = document.getElementById(DB_IDS[1][dbt - 1]);
for (var i = 0; i < db.length; i++) {
if (db[i].type == dbt) {
if (!(db[i].flags & DBF_MDC)) /* skip items that require manual disk-change */
addOption(s, db[i].name, 1 + i);
}
}
}
}
function dbFindTypeNamePos(type, name) {
for (var i = 0; i < db.length; i++) {
if (db[i].type == type && db[i].name == name)
return i;
}
return -1;
}
function dbFindId(id) {
for (var i = 0; i < db.length; i++) {
if (db[i].id == id)
return db[i];
}
return null;
}
/*-----------------------------------------------------------------------*/
/* asynchronous file cache */
const S_PENDING = 1;
const S_ERROR = 2;
const S_VALID = 3;
function CacheItem(url) {
this.state = S_PENDING;
this.url = url;
//this.path = "";
this.name = "";
this.data = "";
this.size = 0;
this.crc32 = 0;
}
function Cache() {
var items = [];
function find(url) {
for (var i = 0; i < items.length; i++) {
if (items[i].url == url)
return items[i];
}
return false;
}
function load(url, handler) {
var client = new XMLHttpRequest();
client.onload = handler;
client.open("GET", url);
client.overrideMimeType("text\/plain; charset=x-user-defined"); /* we want binary data */
client.send();
}
this.req = function(path, name, size, crc, dst) {
var url = path + "/" + name;
var item = null;
if (dst !== false)
dst.clr();
if ((item = find(url)) !== false) {
if (dst !== false) {
//dst.path = item.path;
dst.name = item.name;
dst.data = item.data;
dst.size = item.size;
dst.crc32 = item.crc32;
}
//console.log("cache.req() '"+url+"' is cached.");
return true;
}
item = new CacheItem(url);
items.push(item);
//console.log("cache.req() start downloading '"+url+"'...");
load(url, function() {
if (this.status == 200) {
if (this.responseText.length == size) {
/*if (crc !== false) {
var hash = crc32(this.responseText);
if (hash != crc) {
item.state = S_ERROR;
alert(sprintf("Wrong checksum for '%s'\n\n(should be $%08x, but is $%08x)\n\nTry to flush the browser-cache with 'Ctrl+Shift+Del' and press F5 to reload...", url, crc, hash));
return;
}
}*/
//item.path = path;
item.name = name;
item.data = this.responseText;
item.size = size;
item.crc32 = crc;
item.state = S_VALID;
if (dst !== false) {
//dst.path = item.path;
dst.name = item.name;
dst.data = item.data;
dst.size = item.size;
dst.crc32 = item.crc32;
}
//console.log("cache.req() downloaded of '"+url+"' done.");
} else {
item.state = S_ERROR;
alert(sprintf("Wrong file-length for '%s'\n\n(should be %d, but is %d)", url, size, this.responseText.length));
}
} else {
item.state = S_ERROR;
alert(sprintf("Error while downloading '%s' (http status: %d)", url, this.status));
}
});
return false;
}
this.state = function() {
for (var i = 0; i < items.length; i++) {
if (items[i].state != S_VALID)
return items[i].state;
}
return S_VALID;
}
}
/*---------------------------------*/
function loadFile(e, callback) {
var reader = new FileReader();
reader.onload = callback;
reader.readAsBinaryString(e);
}
/*-----------------------------------------------------------------------*/
/* database cfg */
function setDatabaseConfig() {
//setSelect("cfg_video_resolution_1", cfg.video.hresolution);
//setCheckbox("cfg_video_skip_1", cfg.video.framerate != 1);
styleDisplayBlock("config_database", 1);
styleDisplayTableCell("controls_disk", 0);
}
function getDatabaseEntryFilename(dbe, disk, adf) {
if (dbe.numdisks == 1)
return dbe.name + (adf ? ".adf" : "");
else
return dbe.name + " (Disk "+String(disk+1)+")" + (adf ? ".adf" : "");
}
function getDatabaseFloppy() {
if (dbNum == 0) { /* nothing selected */
for (var i = 0; i < 4; i++) {
cfg.floppy.drive[i].type = i == 0 ? SAEC_Config_Floppy_Type_35_DD : SAEC_Config_Floppy_Type_None;
cfg.floppy.drive[i].file.clr();
}
cfg.floppy.speed = SAEC_Config_Floppy_Speed_Original;
return true;
}
if (typeof db[dbNum - 1] == "undefined") {
//alert("bug!");
return false;
}
var dbe = db[dbNum - 1];
dskchgList = [];
if (dbe.flags & DBF_MDC) { /* manual disk-change required */
if (dbe.numdisks == 1)
dskchgList.push(dbe.name);
else {
for (var n = 0; n < dbe.numdisks; n++)
dskchgList.push(getDatabaseEntryFilename(dbe, n, false));
}
/* request DF0 immediately */
cfg.floppy.drive[0].type = SAEC_Config_Floppy_Type_35_DD;
var filename = getDatabaseEntryFilename(dbe, 0, true);
cache.req(dbUrl, filename, 0xdc000, false, cfg.floppy.drive[0].file);
/* precache DF1-DF3 for later */
for (var n = 1; n < dbe.numdisks; n++) {
cfg.floppy.drive[n].type = SAEC_Config_Floppy_Type_None; /* disable for now. will be enabled when a disk is inserted */
cfg.floppy.drive[n].file.clr();
filename = getDatabaseEntryFilename(dbe, n, true);
cache.req(dbUrl, filename, 0xdc000, false, false);
}
} else { /* request all disks immediately */
for (var n = 0; n < dbe.numdisks; n++) {
var filename = getDatabaseEntryFilename(dbe, n, true);
cfg.floppy.drive[n].type = SAEC_Config_Floppy_Type_35_DD;
cache.req(dbUrl, filename, 0xdc000, false, cfg.floppy.drive[n].file);
}
for (var n = dbe.numdisks; n < 4; n++) {
cfg.floppy.drive[n].type = SAEC_Config_Floppy_Type_None;
cfg.floppy.drive[n].file.clr();
}
}
cfg.floppy.speed = (dbe.flags & DBF_NOT) == 0 ? SAEC_Config_Floppy_Speed_Turbo : SAEC_Config_Floppy_Speed_Original;
return true;
}
function getDatabaseConfig() {
var dbe = dbNum > 0 ? db[dbNum - 1] : null;
if (dbe !== null) {
if (dbe.flags & DBF_AGA)
sae.setModel(SAEC_Model_A1200, 0); /* set an A1200 for AGA */
else if (dbe.flags & DBF_ECS)
sae.setModel(SAEC_Model_A500P, 0); /* set an A500+ for ECS */
else
sae.setModel(SAEC_Model_A500, 0); /* set an A500 for OCS */
if (dbe.flags & DBF_030)
cfg.cpu.model = SAEC_Config_CPU_Model_68030;
cfg.memory.z2FastSize = 4 << 20; /* give 4MB Zorro2 memory */
cfg.chipset.colLevel = SAEC_Config_Chipset_ColLevel_None;
if (dbe.flags & DBF_COL)
cfg.chipset.colLevel = SAEC_Config_Chipset_ColLevel_Sprite_Playfield; /* enable collision-detection */
if (dbe.flags & DBF_BIM)
cfg.chipset.blitter.immediate = true;
} else {
sae.setModel(SAEC_Model_A500, 0);
cfg.memory.z2FastSize = 4 << 20; /* give 4MB Zorro2 memory */
}
cache.req(URL_DATABASE, AROS_ROM_FILE, 0x80000, AROS_ROM_CRC, cfg.memory.rom);
cache.req(URL_DATABASE, AROS_EXT_FILE, 0x80000, AROS_EXT_CRC, cfg.memory.extRom);
if (!getDatabaseFloppy())
return false;
cfg.video.id = "myVideo"; /* html-div element to add video-output */
/*cfg.video.hresolution = getSelect("cfg_video_resolution_1");
if (cfg.video.hresolution == SAEC_Config_Video_HResolution_LoRes)
cfg.video.vresolution = SAEC_Config_Video_VResolution_NonDouble;
else
cfg.video.vresolution = SAEC_Config_Video_VResolution_Double;
cfg.video.framerate = getCheckbox("cfg_video_skip_1") ? 2 : 1;*/
//cfg.video.size_win.width = SAEC_Video_DEF_AMIGA_WIDTH << cfg.video.hresolution;
//cfg.video.size_win.height = SAEC_Video_DEF_AMIGA_HEIGHT << cfg.video.hresolution;
setHooks();
return true;
}
/*-----------------------------------------------------------------------*/
/* advanced cfg */
function setRomName() {
var e = document.getElementById("cfg_rom_name");
if (cfg.memory.rom.name.length) {
if (defRomInfo !== null) {
var name = defRomInfo.name;
e.className = (defRomInfo.type & SAEC_RomType_ALL_KICK) ? "green" : "orange";
setDisabled("cfg_rom_info", 0);
} else {
var name = cfg.memory.rom.name;
e.className = "orange";
setDisabled("cfg_rom_info", 1);
}
e.innerHTML = name.length > MAX_FILENAME ? name.substr(0, MAX_FILENAME)+" [...]" : name;
styleDisplayInline("cfg_rom_remove", 1);
styleDisplayInline("cfg_rom_info", 1);
} else {
e.className = "red";
e.innerHTML = "<unset> (required)";
styleDisplayInline("cfg_rom_remove", 0);
styleDisplayInline("cfg_rom_info", 0);
document.getElementById("cfg_rom_file").value = "";
}
}
function setExtName() {
var e = document.getElementById("cfg_ext_name");
if (cfg.memory.extRom.name.length) {
if (extRomInfo !== null) {
var name = extRomInfo.name;
e.className = (extRomInfo.type & SAEC_RomType_ALL_EXT) ? "green" : "orange";
setDisabled("cfg_ext_info", 0);
} else {
var name = cfg.memory.extRom.name;
e.className = "orange";
setDisabled("cfg_ext_info", 1);
}
e.innerHTML = name.length > MAX_FILENAME ? name.substr(0, MAX_FILENAME)+" [...]" : name;
styleDisplayInline("cfg_ext_remove", 1);
styleDisplayInline("cfg_ext_info", 1);
} else {
e.className = "gray";
e.innerHTML = "<unset>";
styleDisplayInline("cfg_ext_remove", 0);
styleDisplayInline("cfg_ext_info", 0);
document.getElementById("cfg_ext_file").value = "";
}
}
function setKeyName() {
var e = document.getElementById("cfg_key_name");
if (cfg.memory.romKey.name.length) {
if (romKeyInfo !== null) {
var name = romKeyInfo.name;
e.className = (romKeyInfo.type & SAEC_RomType_KEY) ? "green" : "orange";
setDisabled("cfg_key_info", 0);
} else {
var name = cfg.memory.romKey.name;
e.className = "orange";
setDisabled("cfg_key_info", 1);
}
e.innerHTML = name.length > MAX_FILENAME ? name.substr(0, MAX_FILENAME)+" [...]" : name;
styleDisplayInline("cfg_key_remove", 1);
styleDisplayInline("cfg_key_info", 1);
} else {
if (defRomEncrypted || extRomEncrypted) {
e.className = "red";
e.innerHTML = "<unset> (required)";
} else {
e.className = "gray";
e.innerHTML = "<unset>";
}
styleDisplayInline("cfg_key_remove", 0);
styleDisplayInline("cfg_key_info", 0);
document.getElementById("cfg_key_file").value = "";
}
}
function setAMaxName() {
var e = document.getElementById("cfg_amax_name");
if (cfg.memory.amaxRom.name.length) {
if (amaxInfo !== null) {
var name = amaxInfo.name;
e.className = (amaxInfo.type & SAEC_RomType_AMAX) ? "green" : "orange";
setDisabled("cfg_amax_info", 0);
} else {
var name = cfg.memory.amaxRom.name;
e.className = "orange";
setDisabled("cfg_amax_info", 1);
}
e.innerHTML = name.length > MAX_FILENAME ? name.substr(0, MAX_FILENAME)+" [...]" : name;
styleDisplayInline("cfg_amax_remove", 1);
styleDisplayInline("cfg_amax_info", 1);
} else {
e.className = "gray";
e.innerHTML = "<unset>";
styleDisplayInline("cfg_amax_remove", 0);
styleDisplayInline("cfg_amax_info", 0);
document.getElementById("cfg_amax_file").value = "";
}
}
function setFloppyName(n) {
var e = document.getElementById("cfg_df"+n+"_name");
if (cfg.floppy.drive[n].file.size) {
e.className = "";
if (cfg.floppy.drive[n].file.name.length > MAX_FILENAME)
e.innerHTML = cfg.floppy.drive[n].file.name.substr(0, MAX_FILENAME)+" [...]";
else
e.innerHTML = cfg.floppy.drive[n].file.name;
styleDisplayInline("cfg_df"+n+"_eject", 1);
styleDisplayInline("cfg_df"+n+"_info", 1);
} else {
e.className = "gray";
e.innerHTML = "<unset>";
styleDisplayInline("cfg_df"+n+"_eject", 0);
styleDisplayInline("cfg_df"+n+"_info", 0);
}
}
function setMountName(n) {
var ci = cfg.mount.config[n].ci;
var e = document.getElementById("cfg_mount_"+n+"_name");
if (ci.file.name.length) {
e.className = "";
if (ci.file.name.length > MAX_FILENAME)
e.innerHTML = ci.file.name.substr(0, MAX_FILENAME)+" [...]";
else
e.innerHTML = ci.file.name;
styleDisplayInline("cfg_mount_"+n+"_remove", 1);
if (n < 4) styleDisplayInline("cfg_mount_"+n+"_setup", 1);
} else {
e.className = "gray";
e.innerHTML = "<unset>";
styleDisplayInline("cfg_mount_"+n+"_remove", 0);
if (n < 4) styleDisplayInline("cfg_mount_"+n+"_setup", 0);
}
}
function setAdvandedFloppy(n) {
if (cfg.floppy.drive[n].type != SAEC_Config_Floppy_Type_None) {
setCheckbox("cfg_df"+n+"_enabled", true);
setSelect("cfg_df"+n+"_type", cfg.floppy.drive[n].type);
setCheckbox("cfg_df"+n+"_wp", cfg.floppy.drive[n].file.prot);
setFloppyName(n);
styleDisplayInline("cfg_df"+n+"_grp", 1);
} else {
setCheckbox("cfg_df"+n+"_enabled", false);
styleDisplayInline("cfg_df"+n+"_grp", 0);
}
}
function setAdvandedMount(n) {
var ci = cfg.mount.config[n].ci;
if (ci.controller_type != 0) {
if (ci.controller_type == SAEC_Config_Mount_Controller_Type_MB_IDE) {
setSelect("cfg_mount_"+n+"_controller_media", ci.controller_media_type);
setSelect("cfg_mount_"+n+"_controller_level", ci.unit_feature_level);
}
if (ci.controller_type != SAEC_Config_Mount_Controller_Type_PCMCIA_IDE)
setCheckbox("cfg_mount_"+n+"_readonly", ci.readonly);
setMountName(n);
setCheckbox("cfg_mount_"+n+"_enabled", true);
styleDisplayInline("cfg_mount_"+n+"_grp", 1);
} else {
setCheckbox("cfg_mount_"+n+"_enabled", false);
styleDisplayInline("cfg_mount_"+n+"_grp", 0);
}
}
function fixAdvandedConfig() {
/* video */
if (cfg.video.enabled) {
if (!inf.video.canvas && !inf.video.webGL)
cfg.video.enabled = false;
else if (SAEV_config.video.api == SAEC_Config_Video_API_WebGL && !inf.video.webGL)
SAEV_config.video.api = SAEC_Config_Video_API_Canvas;
}
/* audio */
if (cfg.audio.mode >= SAEC_Config_Audio_Mode_On) {
if (!inf.audio.webAudio)
cfg.audio.mode = SAEC_Config_Audio_Mode_Off_Emul;
}
}
function setAdvandedConfig() {
fixAdvandedConfig();
/* cpu */
setRadio("cfg_cpu_model", cfg.cpu.model);
setRadio("cfg_cpu_speed", cfg.cpu.speed);
setCheckbox("cfg_cpu_compatible", cfg.cpu.compatible);
setCheckbox("cfg_cpu_address_space_32", cfg.cpu.addressSpace24 == false);
/* chipset */
if (cfg.chipset.mask & SAEC_Config_Chipset_Mask_AGA)
setRadio("cfg_chipset_mask", 3);
else if ((cfg.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) && (cfg.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE)) {
setRadio("cfg_chipset_mask", 2);
setSelect("cfg_chipset_mask_ecs", 3);
} else if (cfg.chipset.mask & SAEC_Config_Chipset_Mask_ECS_AGNUS) {
setRadio("cfg_chipset_mask", 2);
setSelect("cfg_chipset_mask_ecs", 1);
} else if (cfg.chipset.mask & SAEC_Config_Chipset_Mask_ECS_DENISE) {
setRadio("cfg_chipset_mask", 2);
setSelect("cfg_chipset_mask_ecs", 2);
} else
setRadio("cfg_chipset_mask", 1);
setRadio("cfg_chipset_ntsc", cfg.chipset.ntsc ? 1 : 0);
setSelect("cfg_chipset_cl", cfg.chipset.colLevel);
setRadio("cfg_blitter_immediate", cfg.chipset.blitter.immediate ? 0 : 1);
setSelect("cfg_blitter_waiting", cfg.chipset.blitter.waiting);
/* chipset features */
//setSelect("cfg_chipset_features", cfg.chipset.compatible);
switch (cfg.chipset.compatible) {
case SAEC_Config_Chipset_Compatible_Generic: setSelect("cfg_chipset_features", "generic"); break;
case SAEC_Config_Chipset_Compatible_A500: setSelect("cfg_chipset_features", "A500"); break;
case SAEC_Config_Chipset_Compatible_A500P: setSelect("cfg_chipset_features", "A500P"); break;
case SAEC_Config_Chipset_Compatible_A600: setSelect("cfg_chipset_features", "A600"); break;
case SAEC_Config_Chipset_Compatible_A1000: setSelect("cfg_chipset_features", "A1000"); break;
case SAEC_Config_Chipset_Compatible_A1000V: setSelect("cfg_chipset_features", "A1000V"); break;
case SAEC_Config_Chipset_Compatible_A1200: setSelect("cfg_chipset_features", "A1200"); break;
case SAEC_Config_Chipset_Compatible_A2000: setSelect("cfg_chipset_features", "A2000"); break;
case SAEC_Config_Chipset_Compatible_A3000: setSelect("cfg_chipset_features", "A3000"); break;
case SAEC_Config_Chipset_Compatible_A4000: setSelect("cfg_chipset_features", "A4000"); break;
//case SAEC_Config_Chipset_Compatible_A4000T: setSelect("cfg_chipset_features", "A4000T"); break;
//case SAEC_Config_Chipset_Compatible_CDTV: setSelect("cfg_chipset_features", "CDTV"); break;
//case SAEC_Config_Chipset_Compatible_CDTVCR: setSelect("cfg_chipset_features", "CDTVCR"); break;
//case SAEC_Config_Chipset_Compatible_CD32: setSelect("cfg_chipset_features", "CD32"); break;
case SAEC_Config_Chipset_Compatible_Manual: setSelect("cfg_chipset_features", "manual"); break;
}
styleDisplayBlock("cfg_chipset_features_grp", cfg.chipset.compatible == SAEC_Config_Chipset_Compatible_Manual);
{
setSelect("cfg_chipset_cia_tod", cfg.chipset.cia.tod);
setCheckbox("cfg_chipset_cia_todbug", cfg.chipset.cia.todBug);
setCheckbox("cfg_chipset_cia_overlay", cfg.chipset.cia.overlay);
setCheckbox("cfg_chipset_cia_type6526", cfg.chipset.cia.type6526);
setSelect("cfg_chipset_rtc_type", cfg.chipset.rtc.type);
setSelect("cfg_chipset_ide", cfg.chipset.ide == -1 ? 0 : cfg.chipset.ide);
setCheckbox("cfg_chipset_pcmcia", cfg.chipset.pcmcia);
setCheckbox("cfg_chipset_agnus_dip", cfg.chipset.agnusDIP);
setCheckbox("cfg_rom_mirror_a8", cfg.chipset.mirrorA8);
setCheckbox("cfg_rom_mirror_e0", cfg.chipset.mirrorE0);
setCheckbox("cfg_chipset_z3autoconfig", cfg.chipset.z3AutoConfig);
}
/* ram */
setSelect("cfg_mem_chip", cfg.memory.chipSize >> 10);
setSelect("cfg_mem_slow", cfg.memory.bogoSize >> 10);
setSelect("cfg_mem_ramsey_low", cfg.memory.ramsey.lowSize >> 10);
setSelect("cfg_mem_ramsey_high", cfg.memory.ramsey.highSize >> 10);
setSelect("cfg_mem_z2fast", cfg.memory.z2FastSize >> 10);
setCheckbox("cfg_mem_z2fastautoconfig", cfg.memory.z2FastAutoConfig);
setSelect("cfg_mem_z3fast", cfg.memory.z3FastSize >> 10);
setSelect("cfg_mem_z3mapping", cfg.memory.z3Mapping);
/* rom */
setCheckbox("cfg_rom_use_aros", useAROS);
styleDisplayBlock("cfg_rom_grp", useAROS ? false : true);
if (!useAROS) {
setRomName();
setExtName();
setKeyName();
setAMaxName();
}
setCheckbox("cfg_rom_kickshifter", cfg.memory.kickShifter);
/* floppy */
for (var i = 0; i < 4; i++)
setAdvandedFloppy(i);
setSelect("cfg_floppy_speed", cfg.floppy.speed);
setCheckbox("cfg_floppy_autoext2", cfg.floppy.autoEXT2 != 0);
/* mount */
for (var i = 0; i < 6; i++)
setAdvandedMount(i);
/* video */
setCheckbox("cfg_video_enabled", cfg.video.enabled);
setDisabled("cfg_video_enabled", !inf.video.canvas && !inf.video.webGL);
//if (cfg.video.enabled)
{
setSelect("cfg_video_api", cfg.video.api);
setDisabled("cfg_video_api", inf.video.webGL == false);
setSelect("cfg_video_color_mode", cfg.video.colorMode);
setCheckbox("cfg_video_antialias", cfg.video.antialias);
//setRadio("cfg_video_fs", cfg.video.apmode[0].gfx_fullscreen);
//setText("cfg_video_win_width", cfg.video.size_win.width);
//setText("cfg_video_win_height", cfg.video.size_win.height);
//setText("cfg_video_fs_width", cfg.video.size_fs.width);
//setText("cfg_video_fs_height", cfg.video.size_fs.height);
setSelect("cfg_video_resolution", cfg.video.hresolution);
setSelect("cfg_video_linemode", cfg.video.pscanlines == 1 ? 2 : cfg.video.vresolution);
setSelect("cfg_video_interlace", cfg.video.iscanlines);
setDisabled("cfg_video_interlace", cfg.video.vresolution == SAEC_Config_Video_VResolution_NonDouble);
setCheckbox("cfg_video_skip", cfg.video.framerate != 1);
setCheckbox("cfg_video_xcenter", cfg.video.xcenter != 0);
setCheckbox("cfg_video_ycenter", cfg.video.ycenter != 0);
setText("cfg_video_brightness", cfg.video.luminance);
setText("cfg_video_contrast", cfg.video.contrast);
setText("cfg_video_gamma", cfg.video.gamma);
setText("cfg_video_alpha", cfg.video.alpha);
setDisabled("cfg_video_alpha", cfg.video.colorMode < 5);
setText("cfg_video_background", sprintf("%06X", cfg.video.backgroundColor));
setDisabled("cfg_video_background", cfg.video.colorMode < 5);
setCheckbox("cfg_video_blackerthanblack", cfg.video.blackerThanBlack);
setCheckbox("cfg_video_refreshindicator", cfg.video.refreshIndicator);
styleDisplayBlock("cfg_video_error_webgl", inf.video.webGL == false);
}
styleDisplayBlock("cfg_video_grp", cfg.video.enabled != 0);
styleDisplayBlock("cfg_video_error_canvas", inf.video.canvas == false && inf.video.webGL == false);
/* audio */
setCheckbox("cfg_audio_enabled", cfg.audio.mode != SAEC_Config_Audio_Mode_Off);
setSelect("cfg_audio_buffer_frames", cfg.audio.bufferFrames);
setSelect("cfg_audio_mode", cfg.audio.mode);
setDisabled("cfg_audio_mode", inf.audio.webAudio == false);
setSelect("cfg_audio_filter", cfg.audio.filter);
setSelect("cfg_audio_filtertype", cfg.audio.filterType);
setSelect("cfg_audio_freq", cfg.audio.freq);
setSelect("cfg_audio_separation", cfg.audio.stereoSeparation);
setSelect("cfg_audio_delay", cfg.audio.stereoDelay);
setSelect("cfg_audio_channels", cfg.audio.channels);
setSelect("cfg_audio_interpolation", cfg.audio.interpol);
styleDisplayBlock("cfg_audio_grp", cfg.audio.mode != SAEC_Config_Audio_Mode_Off);
styleDisplayBlock("cfg_audio_error", inf.audio.webAudio == false);
/* ports */
setSelect("cfg_ports_0", cfg.ports[0].type);
setSelect("cfg_ports_0_move", cfg.ports[0].move);
setSelect("cfg_ports_0_fire_1", cfg.ports[0].fire[0]);
setSelect("cfg_ports_0_fire_2", cfg.ports[0].fire[1]);
styleDisplayInline("cfg_ports_0_grp", cfg.ports[0].type == SAEC_Config_Ports_Type_Joy0);
setSelect("cfg_ports_1", cfg.ports[1].type);
setSelect("cfg_ports_1_move", cfg.ports[1].move);
setSelect("cfg_ports_1_fire_1", cfg.ports[1].fire[0]);
setSelect("cfg_ports_1_fire_2", cfg.ports[1].fire[1]);
styleDisplayInline("cfg_ports_1_grp", cfg.ports[1].type == SAEC_Config_Ports_Type_Joy1);
setCheckbox("cfg_keyborad_enabled", cfg.keyboard.enabled);
setCheckbox("cfg_serial_enabled", cfg.serial.enabled);
styleDisplayTableCell("controls_disk", 1);
}
function getAdvandedFloppy() {
for (var n = 0; n < 4; n++) {
if (getCheckbox("cfg_df"+n+"_enabled")) {
cfg.floppy.drive[n].type = getSelect("cfg_df"+n+"_type");
cfg.floppy.drive[n].file.prot = getCheckbox("cfg_df"+n+"_wp");
}
}
cfg.floppy.speed = getSelect("cfg_floppy_speed");
cfg.floppy.autoEXT2 = getCheckbox("cfg_floppy_autoext2") ? 1 : 0;
}
function getAdvandedMount() {
for (var n = 0; n < 6; n++) {
var ci = cfg.mount.config[n].ci;
if (getCheckbox("cfg_mount_"+n+"_enabled")) {
if (n < 4) {
ci.controller_type = SAEC_Config_Mount_Controller_Type_MB_IDE;
ci.controller_unit = n;
ci.controller_media_type = getSelect("cfg_mount_"+n+"_controller_media");
ci.unit_feature_level = getSelect("cfg_mount_"+n+"_controller_level");
} else if (n == 4)
ci.controller_type = SAEC_Config_Mount_Controller_Type_PCMCIA_SRAM;
else
ci.controller_type = SAEC_Config_Mount_Controller_Type_PCMCIA_IDE;
if (n != 5)
ci.readonly = getCheckbox("cfg_mount_"+n+"_readonly");
} else
ci.controller_type = 0;
}
}
function getAdvandedConfig() {
/* cpu */
cfg.cpu.model = getRadio("cfg_cpu_model");
cfg.cpu.speed = getRadio("cfg_cpu_speed");
cfg.cpu.compatible = getCheckbox("cfg_cpu_compatible");
cfg.cpu.addressSpace24 = getCheckbox("cfg_cpu_address_space_32") ? false : true;
/* chipset */
cfg.chipset.mask = SAEC_Config_Chipset_Mask_OCS;
switch (getRadio("cfg_chipset_mask")) {
case 1: break;
case 2: {
switch (getSelect("cfg_chipset_mask_ecs")) {
case 1: cfg.chipset.mask |= SAEC_Config_Chipset_Mask_ECS_AGNUS; break;
case 2: cfg.chipset.mask |= SAEC_Config_Chipset_Mask_ECS_DENISE; break;
case 3: cfg.chipset.mask |= (SAEC_Config_Chipset_Mask_ECS_AGNUS | SAEC_Config_Chipset_Mask_ECS_DENISE); break;
}
break;
}
case 3: cfg.chipset.mask |= (SAEC_Config_Chipset_Mask_ECS_AGNUS | SAEC_Config_Chipset_Mask_ECS_DENISE | SAEC_Config_Chipset_Mask_AGA); break;
}
cfg.chipset.ntsc = getRadio("cfg_chipset_ntsc") == 1;
cfg.chipset.colLevel = getSelect("cfg_chipset_cl");
cfg.chipset.blitter.immediate = getRadio("cfg_blitter_immediate") == 0;
cfg.chipset.blitter.waiting = getSelect("cfg_blitter_waiting");
//cfg.chipset.compatible = getSelect("cfg_chipset_features");
switch (getSelect("cfg_chipset_features", true)) {
case "generic": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_Generic; break;
case "A500": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A500; break;
case "A500P": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A500P; break;
case "A600": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A600; break;
case "A1000": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A1000; break;
case "A1000V": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A1000V; break;
case "A1200": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A1200; break;
case "A2000": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A2000; break;
case "A3000": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A3000; break;
case "A4000": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A4000; break;
//case "A4000T": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_A4000T; break;
//case "CDTV": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_CDTV; break;
//case "CDTVCR": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_CDTVCR; break;
//case "CD32": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_CD32; break;
case "manual": cfg.chipset.compatible = SAEC_Config_Chipset_Compatible_Manual; break;
}
if (cfg.chipset.compatible == SAEC_Config_Chipset_Compatible_Manual) {
cfg.chipset.cia.tod = getSelect("cfg_chipset_cia_tod");
cfg.chipset.cia.todBug = getCheckbox("cfg_chipset_cia_todbug");
cfg.chipset.cia.overlay = getCheckbox("cfg_chipset_cia_overlay");
cfg.chipset.cia.type6526 = getCheckbox("cfg_chipset_cia_type6526");
cfg.chipset.rtc.type = getSelect("cfg_chipset_rtc_type");
cfg.chipset.ide = getSelect("cfg_chipset_ide");
cfg.chipset.pcmcia = getCheckbox("cfg_chipset_pcmcia");
cfg.chipset.agnusDIP = getCheckbox("cfg_chipset_agnus_dip");
cfg.chipset.mirrorA8 = getCheckbox("cfg_rom_mirror_a8");
cfg.chipset.mirrorE0 = getCheckbox("cfg_rom_mirror_e0");
cfg.chipset.z3AutoConfig = getCheckbox("cfg_chipset_z3autoconfig");
}
/* ram */
cfg.memory.chipSize = getSelect("cfg_mem_chip") << 10;
cfg.memory.bogoSize = getSelect("cfg_mem_slow") << 10;
cfg.memory.ramsey.lowSize = getSelect("cfg_mem_ramsey_low") << 10;
cfg.memory.ramsey.highSize = getSelect("cfg_mem_ramsey_high") << 10;
cfg.memory.z2FastSize = getSelect("cfg_mem_z2fast") << 10;
cfg.memory.z2FastAutoConfig = getCheckbox("cfg_mem_z2fastautoconfig");
cfg.memory.z3FastSize = getSelect("cfg_mem_z3fast") << 10;
cfg.memory.z3Mapping = getSelect("cfg_mem_z3mapping");
/* rom */
useAROS = getCheckbox("cfg_rom_use_aros");
if (useAROS) {
cache.req(URL_DATABASE, AROS_ROM_FILE, 0x80000, AROS_ROM_CRC, cfg.memory.rom);
cache.req(URL_DATABASE, AROS_EXT_FILE, 0x80000, AROS_EXT_CRC, cfg.memory.extRom);
cfg.memory.romKey.clr();
} else {
if (cfg.memory.rom.size == 0) {
alert(saee2text(SAEE_Memory_NoKickstartRom));
changePage(PID_ROM);
return false;
}
}
cfg.memory.kickShifter = getCheckbox("cfg_rom_kickshifter");
/* floppy */
getAdvandedFloppy();
/* mount */
getAdvandedMount()
/* video */
cfg.video.id = "myVideo";
cfg.video.enabled = getCheckbox("cfg_video_enabled");
if (cfg.video.enabled) {
cfg.video.api = getSelect("cfg_video_api");
cfg.video.colorMode = getSelect("cfg_video_color_mode");
cfg.video.antialias = getCheckbox("cfg_video_antialias");
//cfg.video.apmode[0].gfx_fullscreen = getRadio("cfg_video_fs");
//cfg.video.size_win.width = getText("cfg_video_win_width");
//cfg.video.size_win.height = getText("cfg_video_win_height");
//cfg.video.size_fs.width = getText("cfg_video_fs_width");
//cfg.video.size_fs.height = getText("cfg_video_fs_height");
cfg.video.hresolution = getSelect("cfg_video_resolution");
switch (getSelect("cfg_video_linemode")) {
case 0:
cfg.video.vresolution = SAEC_Config_Video_VResolution_NonDouble;
cfg.video.pscanlines = 0;
cfg.video.iscanlines = 0;
break;
case 1:
cfg.video.vresolution = SAEC_Config_Video_VResolution_Double;
cfg.video.pscanlines = 0;
cfg.video.iscanlines = getSelect("cfg_video_interlace");
break;
case 2:
cfg.video.vresolution = SAEC_Config_Video_VResolution_Double;
cfg.video.pscanlines = 1;
cfg.video.iscanlines = getSelect("cfg_video_interlace");
break;
}
cfg.video.framerate = getCheckbox("cfg_video_skip") ? 2 : 1;
cfg.video.xcenter = getCheckbox("cfg_video_xcenter") ? 2 : 0;
cfg.video.ycenter = getCheckbox("cfg_video_ycenter") ? 2 : 0;
cfg.video.luminance = getText("cfg_video_brightness");
cfg.video.contrast = getText("cfg_video_contrast");
cfg.video.gamma = getText("cfg_video_gamma");
cfg.video.backgroundColor = Number("0x"+getText("cfg_video_background", true));
cfg.video.alpha = getText("cfg_video_alpha");
cfg.video.blackerThanBlack = getCheckbox("cfg_video_blackerthanblack");
cfg.video.refreshIndicator = getCheckbox("cfg_video_refreshindicator");
cfg.video.size_win.width = SAEC_Video_DEF_AMIGA_WIDTH << cfg.video.hresolution;
cfg.video.size_win.height = SAEC_Video_DEF_AMIGA_HEIGHT << cfg.video.vresolution;
}
/* audio */
if (getCheckbox("cfg_audio_enabled"))
cfg.audio.mode = getSelect("cfg_audio_mode");
else
cfg.audio.mode = SAEC_Config_Audio_Mode_Off;
if (cfg.audio.mode != SAEC_Config_Audio_Mode_Off) {
cfg.audio.bufferFrames = getSelect("cfg_audio_buffer_frames");
cfg.audio.filter = getSelect("cfg_audio_filter");
cfg.audio.filterType = getSelect("cfg_audio_filtertype");
cfg.audio.freq = getSelect("cfg_audio_freq");
cfg.audio.stereoSeparation = getSelect("cfg_audio_separation");
cfg.audio.stereoDelay = getSelect("cfg_audio_delay");
cfg.audio.channels = getSelect("cfg_audio_channels");
cfg.audio.interpol = getSelect("cfg_audio_interpolation");
}
/* ports */
cfg.ports[0].type = getSelect("cfg_ports_0");
if (cfg.ports[0].type == SAEC_Config_Ports_Type_Joy0) {
cfg.ports[0].move = getSelect("cfg_ports_0_move");
cfg.ports[0].fire[0] = getSelect("cfg_ports_0_fire_1");
cfg.ports[0].fire[1] = getSelect("cfg_ports_0_fire_2");
if (cfg.ports[0].fire[0] != SAEC_Config_Ports_Fire_None && cfg.ports[0].fire[0] == cfg.ports[0].fire[1]) {
alert("Fire-button 1/2 on port 0 can\"t be the same.");
return false;
}
}
cfg.ports[1].type = getSelect("cfg_ports_1");
if (cfg.ports[1].type == SAEC_Config_Ports_Type_Joy1) {
cfg.ports[1].move = getSelect("cfg_ports_1_move");
cfg.ports[1].fire[0] = getSelect("cfg_ports_1_fire_1");
cfg.ports[1].fire[1] = getSelect("cfg_ports_1_fire_2");
if (cfg.ports[1].fire[0] != SAEC_Config_Ports_Fire_None && cfg.ports[1].fire[0] == cfg.ports[1].fire[1]) {
alert("Fire-button 1/2 on port 1 can\"t be the same.");
return false;
}
}
cfg.keyboard.enabled = getCheckbox("cfg_keyborad_enabled");
cfg.serial.enabled = getCheckbox("cfg_serial_enabled");
/* hooks */
setHooks();
return true;
}
/*-----------------------------------------------------------------------*/
/* main */
function start() {
var s = cache.state();
if (s == S_VALID) { /* all files are downloaded or cached, go! */
freezeButtons(false, true);
var err = sae.start(); /* this does start the emulator */
if (err != SAEE_None)
alert(saee2text(err));
}
else if (s == S_PENDING) { /* files are still downloading, wait... */
setTimeout(start, 250);
}
else /*if (s == S_ERROR)*/ { /* XMLHttpRequest-error */
freezeButtons(false, true);
}
}
/*function delayedStart() {
if (SAEC_Info.browser.id == SAEC_Info_Brower_ID_Firefox) { // Thanks "dmcoles"
console.log("delayedStart() enabling audio-start delay for Firefox...");
setTimeout(start, 50);
} else
start();
}*/
function databaseStart() {
if (getDatabaseConfig()) {
freezeButtons(true, true);
//addItemToURL();
//delayedStart();
start();
}
}
function advandedStart() {
if (getAdvandedConfig()) {
freezeButtons(true, true);
//delayedStart();
start();
}
}
function stop() {
sae.stop(); /* send stop-request */
}
function pause(p) {
sae.pause(p); /* send pause-request */
}
function reset() {
sae.reset(false, false);
}
/*---------------------------------*/
function init() {
cache = new Cache();
sae = new ScriptedAmigaEmulator(); /* create emulator */
inf = sae.getInfo(); /* reference to cfg */
cfg = sae.getConfig(); /* reference to cfg */
//console.log(inf);
//console.log(cfg);
initHooks();
dbInit();
setDatabaseConfig();
if (window.location.hash.length > 1) {
var start = false;
var name = decodeURL(window.location.hash.substr(1));
while (true) {
var tmp = name.replace("_", " ");
if (tmp == name) break;
name = tmp;
}
var pos;
if ((pos = dbFindTypeNamePos(DBT_GAME, name)) != -1) {
setSelect("cfg_game", pos+1);
preSelect(DBT_GAME);
start = true;
}
if (!start) {
if ((pos = dbFindTypeNamePos(DBT_DEMO, name)) != -1) {
setSelect("cfg_demo", pos+1);
preSelect(DBT_DEMO);
start = true;
}
}
if (!start) {
if ((pos = dbFindTypeNamePos(DBT_DAGA, name)) != -1) {
setSelect("cfg_demo_aga", pos+1);
preSelect(DBT_DAGA);
start = true;
}
}
if (!start) {
if ((pos = dbFindTypeNamePos(DBT_TOOL, name)) != -1) {
//document.getElementById("cfg_tool")[pos+1].selected = true;
setSelect("cfg_tool", pos+1);
preSelect(DBT_TOOL);
start = true;
}
}
if (start)
databaseStart();
}
}
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------*/
function switchCfg(m) {
if (m == MODE_Database) {
if (mode == MODE_Advanced) {
if (!confirm("Going back to the database will reset the current configuration.\n\nAre you sure?"))
return;
} else {
alert("Click this logo in the advanced-config, if you want to return here.");
return;
}
}
mode = m;
styleDisplayBlock("config_database", m == MODE_Database);
styleDisplayBlock("config_advanced", m == MODE_Advanced);
sae.setDefaults();
if (m == MODE_Database) {
if (page == PID_Floppy_Info && floppyNum != -1)
floppyCloseInfo();
else if (page == PID_Mount_Setup && mountConfigNum != -1)
mountCloseSetup(false);
setDatabaseConfig();
changePage(PID_None);
} else /*if (m == MODE_Advanced)*/ {
preSelect(0);
setAdvandedConfig();
if (page == PID_None)
changePage(PID_Model);
}
}
/*-----------------------------------------------------------------------*/
/* database cfg */
function preSelect(grp) {
function insertRow1(table, item) {
var row = table.insertRow(-1);
var cell = row.insertCell(-1);
cell.innerHTML = item;
cell.colSpan = 4;
}
function insertRow2(table, item) {
var row = table.insertRow(-1);
var cell1 = row.insertCell(-1);
var cell2 = row.insertCell(-1);
cell1.className = "arm";
cell1.innerHTML = ''+item[0]+'';
cell2.className = "alm";
cell2.innerHTML = item[1];
cell2.colSpan = 3;
cell2.style.width = "100%";
}
function insertRow4(table, item1, item2) {
var row = table.insertRow(-1);
var cell1 = row.insertCell(-1);
var cell2 = row.insertCell(-1);
if (item1 !== false) {
cell1.className = "arm";
cell1.innerHTML = ''+item1[0]+'';
cell2.className = "alm";
cell2.innerHTML = item1[1];
}
cell1 = row.insertCell(-1);
cell2 = row.insertCell(-1);
cell2.style.width = "50%";
if (item2 !== false) {
cell1.className = "arm";
cell1.innerHTML = ''+item2[0]+'';
cell2.className = "alm";
cell2.innerHTML = item2[1];
}
}
/* remove old box */
var div = document.getElementById("config_database_info");
var table = document.getElementById("config_database_info_content");
if (table)
div.removeChild(table);
var id = "";
if (dbGrp > 0 && dbGrp != grp) {
id = DB_IDS[0][dbGrp - 1];
setSelect(id, 0);
}
if (grp > 0) {
id = DB_IDS[0][grp - 1];
dbUrl = DB_URLS[grp - 1];
dbGrp = grp;
dbNum = getSelect(id);
} else {
dbGrp = 0;
dbNum = 0;
dbUrl = "";
return; /* no group selected */
}
if (dbNum == 0) /* no entry selected */
return;
/* create new box */
var dbe = db[dbNum - 1];
styleDisplayTableCell("controls_disk", (dbe.flags & DBF_MDC) != 0);
var href = dbe.name;
while (true) {
var tmp = href.replace(" ", "_");
if (tmp == href) break;
href = tmp;
}
href = "http://" + window.location.hostname + "/#" + href;
var nameLink = dbe.name+" (share)";
var license = "";
if (dbe.license.length) {
if (dbe.license == "PD") license = "Public Domain";
else if (dbe.license == "FW") license = "Freeware";
else license = dbe.license;
}
if (grp == DBT_GAME) {
var keys = [
["Movement","Arrows"],
["Fire", fireButtonName(16)],
["Alt-fire", fireButtonName(17)]
];
var ctrl = "";
for (var i = 0; i < keys.length; i++)
ctrl += keys[i][0]+": "+keys[i][1]+"
";
var ctrl = "
| "+keys[i][0]+": | "+keys[i][1]+" |