source clean up, out of range error

This commit is contained in:
JustBurn 2012-05-08 22:12:05 +01:00
parent 723a89c8b2
commit 0d2d428a2b
3 changed files with 188 additions and 89 deletions

View File

@ -12,7 +12,7 @@
<h1>NDS Homebrew VRAM Banks Selector</h1> <h1>NDS Homebrew VRAM Banks Selector</h1>
<h4>For the VRAM BG Allocation Conflict Viewer tool <a href="vram.html">click here</a></h4> <h4>For the VRAM BG Allocation Conflict Viewer tool <a href="vram.html">click here</a></h4>
<h4>Please contact mtheall in #dsdev on irc.blitzed.org regarding errors, discrepancies, suggestions, or bugs with this tool</h4> <h4>Please contact mtheall in #dsdev on irc.blitzed.org regarding errors, discrepancies, suggestions, or bugs with this tool</h4>
<h4>Link for sharing: <span id='ShareLink'>Javascript must be enabled</span></h4> <h4>Link for sharing: <span id='ShareLink'>Loading...</span></h4>
<hr /> <hr />
<h2 id='Notify'>None</h2> <h2 id='Notify'>None</h2>
<table class='main'> <table class='main'>
@ -433,14 +433,14 @@
<thead> <thead>
<tr><td class='left'>Function call</td></tr> <tr><td class='left'>Function call</td></tr>
</thead> </thead>
<tr><td class='left' id='FunctionCall'>Javascript must be enabled</td></tr> <tr><td class='left' id='FunctionCall'>Loading...</td></tr>
</table> </table>
<p>&nbsp;</p> <p>&nbsp;</p>
<table> <table>
<thead> <thead>
<tr><td class='left'>CPU Access</td></tr> <tr><td class='left'>CPU Access</td></tr>
</thead> </thead>
<tr><td class='left' id='CPUAccess'>Javascript must be enabled</td></tr> <tr><td class='left' id='CPUAccess'>Loading...</td></tr>
</table> </table>
</td> </td>
</tr></table> </tr></table>

View File

@ -1,4 +1,5 @@
function getParameterByName(name) { function getParameterByName(name)
{
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regex = new RegExp("[\\#&]" + name + "=([^&#]*)"); var regex = new RegExp("[\\#&]" + name + "=([^&#]*)");
var results = regex.exec(window.location.hash); var results = regex.exec(window.location.hash);
@ -8,7 +9,8 @@ function getParameterByName(name) {
return decodeURIComponent(results[1].replace(/\+/g, " ")); return decodeURIComponent(results[1].replace(/\+/g, " "));
} }
function hasParameterByName(name) { function hasParameterByName(name)
{
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regex = new RegExp("[\\#&]" + name + "=([^&#]*)"); var regex = new RegExp("[\\#&]" + name + "=([^&#]*)");
var results = regex.exec(window.location.hash); var results = regex.exec(window.location.hash);
@ -18,18 +20,23 @@ function hasParameterByName(name) {
return true; return true;
} }
function OListSize(obj) { function OListSize(obj)
{
var size = 0; var size = 0;
for (key in obj) { for (key in obj)
{
if (obj.hasOwnProperty(key)) size++; if (obj.hasOwnProperty(key)) size++;
} }
return size; return size;
} }
function OListGet(obj, idx) { function OListGet(obj, idx)
{
var off = 0; var off = 0;
for (key in obj) { for (key in obj)
if (obj.hasOwnProperty(key)) { {
if (obj.hasOwnProperty(key))
{
if (idx == off) return obj[key]; if (idx == off) return obj[key];
off++; off++;
} }
@ -37,11 +44,15 @@ function OListGet(obj, idx) {
return null; return null;
} }
function OListSet(obj, idx, val) { function OListSet(obj, idx, val)
{
var off = 0; var off = 0;
for (key in obj) { for (key in obj)
if (obj.hasOwnProperty(key)) { {
if (idx == off) { if (obj.hasOwnProperty(key))
{
if (idx == off)
{
obj[key] = val; obj[key] = val;
return; return;
} }
@ -218,7 +229,8 @@ var CPUAccessMap = {
var Sel = {'A':'', 'B':'', 'C':'', 'D':'', 'E':'', 'F':'', 'G':'', 'H':'', 'I':''}; var Sel = {'A':'', 'B':'', 'C':'', 'D':'', 'E':'', 'F':'', 'G':'', 'H':'', 'I':''};
var Err = {'A':'', 'B':'', 'C':'', 'D':'', 'E':'', 'F':'', 'G':'', 'H':'', 'I':''}; var Err = {'A':'', 'B':'', 'C':'', 'D':'', 'E':'', 'F':'', 'G':'', 'H':'', 'I':''};
function loadp() { function loadp()
{
var i, allElem = document.forms["banks"].elements; var i, allElem = document.forms["banks"].elements;
// Load parameters // Load parameters
@ -233,7 +245,8 @@ function loadp() {
if (hasParameterByName('I')) Sel['I'] = getParameterByName('I'); if (hasParameterByName('I')) Sel['I'] = getParameterByName('I');
// Mark selected items // Mark selected items
for (var i=0; i < allElem.length; i++) { for (var i=0; i < allElem.length; i++)
{
Elem = allElem[i]; Elem = allElem[i];
if (Sel[Elem.name] == Elem.value) if (Sel[Elem.name] == Elem.value)
Elem.checked = true; Elem.checked = true;
@ -243,16 +256,19 @@ function loadp() {
upd(); upd();
} }
function upd() { function upd()
{
var allElem = document.forms["banks"].elements; var allElem = document.forms["banks"].elements;
var i, a, b, ShareLink; var i, a, b, ShareLink;
var numerr = 0; var numerr = 0;
// Find selected items // Find selected items
for (var i = 0; i < allElem.length; i++) { for (var i = 0; i < allElem.length; i++)
{
Elem = allElem[i]; Elem = allElem[i];
ElemName = Elem.name + "_" + Elem.value; ElemName = Elem.name + "_" + Elem.value;
if (Elem.checked) { if (Elem.checked)
{
Sel[Elem.name] = Elem.value; Sel[Elem.name] = Elem.value;
} }
} }
@ -261,17 +277,23 @@ function upd() {
for (var a = 0; a < 9; a++) for (var a = 0; a < 9; a++)
OListSet(Err, a, 0); OListSet(Err, a, 0);
for (var a = 0; a < 9; a++) { for (var a = 0; a < 9; a++)
for (var b = a+1; b < 9; b++) { {
for (var b = a+1; b < 9; b++)
{
cma = BankingMap['m'+OListGet(Sel, a)]; cma = BankingMap['m'+OListGet(Sel, a)];
cmb = BankingMap['m'+OListGet(Sel, b)]; cmb = BankingMap['m'+OListGet(Sel, b)];
for (c = 0; c < OListSize(cma); c++) { for (c = 0; c < OListSize(cma); c++)
if (cmb.indexOf(cma.charAt(c)) != -1) { {
if (OListGet(Err, a) == 0) { if (cmb.indexOf(cma.charAt(c)) != -1)
{
if (OListGet(Err, a) == 0)
{
numerr++; numerr++;
OListSet(Err, a, 1); OListSet(Err, a, 1);
} }
if (OListGet(Err, b) == 0) { if (OListGet(Err, b) == 0)
{
numerr++; numerr++;
OListSet(Err, b, 1); OListSet(Err, b, 1);
} }
@ -281,10 +303,12 @@ function upd() {
} }
// Mark valid/conflicts on the table // Mark valid/conflicts on the table
for (var i=0; i < allElem.length; i++) { for (var i=0; i < allElem.length; i++)
{
Elem = allElem[i]; Elem = allElem[i];
ElemName = Elem.name + "_" + Elem.value; ElemName = Elem.name + "_" + Elem.value;
if (Elem.checked) { if (Elem.checked)
{
if (Err[Elem.name] == 0) if (Err[Elem.name] == 0)
document.getElementById(ElemName).className = 'g'; document.getElementById(ElemName).className = 'g';
else else
@ -296,7 +320,8 @@ function upd() {
// Write result // Write result
Notify = document.getElementById('Notify'); Notify = document.getElementById('Notify');
if (numerr == 0) { if (numerr == 0)
{
Notify.style.color = "#008000"; Notify.style.color = "#008000";
Notify.innerHTML = "No conflict found "; Notify.innerHTML = "No conflict found ";
} }
@ -316,7 +341,8 @@ function upd() {
// Generate the function call // Generate the function call
FCall = document.getElementById('FunctionCall'); FCall = document.getElementById('FunctionCall');
if (numerr == 0) { if (numerr == 0)
{
FCall.innerHTML = "<span class='func'>vramSetBankA</span>(<span class='deff'>VRAM_A_" + BankingMap['f'+Sel['A']] + "</span>);<br />"; FCall.innerHTML = "<span class='func'>vramSetBankA</span>(<span class='deff'>VRAM_A_" + BankingMap['f'+Sel['A']] + "</span>);<br />";
FCall.innerHTML += "<span class='func'>vramSetBankB</span>(<span class='deff'>VRAM_B_" + BankingMap['f'+Sel['B']] + "</span>);<br />"; FCall.innerHTML += "<span class='func'>vramSetBankB</span>(<span class='deff'>VRAM_B_" + BankingMap['f'+Sel['B']] + "</span>);<br />";
FCall.innerHTML += "<span class='func'>vramSetBankC</span>(<span class='deff'>VRAM_C_" + BankingMap['f'+Sel['C']] + "</span>);<br />"; FCall.innerHTML += "<span class='func'>vramSetBankC</span>(<span class='deff'>VRAM_C_" + BankingMap['f'+Sel['C']] + "</span>);<br />";
@ -332,7 +358,8 @@ function upd() {
// Generate the cpu access // Generate the cpu access
CPUAcc = document.getElementById('CPUAccess'); CPUAcc = document.getElementById('CPUAccess');
if (numerr == 0) { if (numerr == 0)
{
CPUAcc.innerHTML = "<b>A:</b> " + CPUAccessMap['A_'+Sel['A']] + "<br />"; CPUAcc.innerHTML = "<b>A:</b> " + CPUAccessMap['A_'+Sel['A']] + "<br />";
CPUAcc.innerHTML += "<b>B:</b> " + CPUAccessMap['B_'+Sel['B']] + "<br />"; CPUAcc.innerHTML += "<b>B:</b> " + CPUAccessMap['B_'+Sel['B']] + "<br />";
CPUAcc.innerHTML += "<b>C:</b> " + CPUAccessMap['C_'+Sel['C']] + "<br />"; CPUAcc.innerHTML += "<b>C:</b> " + CPUAccessMap['C_'+Sel['C']] + "<br />";

190
vram.js
View File

@ -1,4 +1,5 @@
function getParameterByName(name) { function getParameterByName(name)
{
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regex = new RegExp("[\\#&]" + name + "=([^&#]*)"); var regex = new RegExp("[\\#&]" + name + "=([^&#]*)");
var results = regex.exec(window.location.hash); var results = regex.exec(window.location.hash);
@ -8,7 +9,8 @@ function getParameterByName(name) {
return decodeURIComponent(results[1].replace(/\+/g, " ")); return decodeURIComponent(results[1].replace(/\+/g, " "));
} }
function hasParameterByName(name) { function hasParameterByName(name)
{
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regex = new RegExp("[\\#&]" + name + "=([^&#]*)"); var regex = new RegExp("[\\#&]" + name + "=([^&#]*)");
var results = regex.exec(window.location.hash); var results = regex.exec(window.location.hash);
@ -18,7 +20,8 @@ function hasParameterByName(name) {
return true; return true;
} }
function V2Digits(size) { function V2Digits(size)
{
return Math.round(size * 100) / 100; return Math.round(size * 100) / 100;
} }
@ -61,7 +64,8 @@ var Function_Call;
var CPU_Access; var CPU_Access;
var MaxAllocated; var MaxAllocated;
function loadp() { function loadp()
{
var i, j; var i, j;
// Initialize 2D array // Initialize 2D array
@ -85,7 +89,8 @@ function loadp() {
if (hasParameterByName('NT2')) document.forms['bgvram'].NT2.options.selectedIndex = (getParameterByName('NT2') / 32) - 1; if (hasParameterByName('NT2')) document.forms['bgvram'].NT2.options.selectedIndex = (getParameterByName('NT2') / 32) - 1;
if (hasParameterByName('MB2')) document.forms['bgvram'].MB2.options.selectedIndex = getParameterByName('MB2'); if (hasParameterByName('MB2')) document.forms['bgvram'].MB2.options.selectedIndex = getParameterByName('MB2');
if (hasParameterByName('TB2')) document.forms['bgvram'].TB2.options.selectedIndex = getParameterByName('TB2'); if (hasParameterByName('TB2')) document.forms['bgvram'].TB2.options.selectedIndex = getParameterByName('TB2');
if (hasParameterByName('S2')) { if (hasParameterByName('S2'))
{
document.forms['bgvram'].TS2.options.selectedIndex = getParameterByName('S2'); document.forms['bgvram'].TS2.options.selectedIndex = getParameterByName('S2');
document.forms['bgvram'].RS2.options.selectedIndex = getParameterByName('S2'); document.forms['bgvram'].RS2.options.selectedIndex = getParameterByName('S2');
document.forms['bgvram'].ERS2.options.selectedIndex = getParameterByName('S2'); document.forms['bgvram'].ERS2.options.selectedIndex = getParameterByName('S2');
@ -96,7 +101,8 @@ function loadp() {
if (hasParameterByName('NT3')) document.forms['bgvram'].NT3.options.selectedIndex = (getParameterByName('NT3') / 32) - 1; if (hasParameterByName('NT3')) document.forms['bgvram'].NT3.options.selectedIndex = (getParameterByName('NT3') / 32) - 1;
if (hasParameterByName('MB3')) document.forms['bgvram'].MB3.options.selectedIndex = getParameterByName('MB3'); if (hasParameterByName('MB3')) document.forms['bgvram'].MB3.options.selectedIndex = getParameterByName('MB3');
if (hasParameterByName('TB3')) document.forms['bgvram'].TB3.options.selectedIndex = getParameterByName('TB3'); if (hasParameterByName('TB3')) document.forms['bgvram'].TB3.options.selectedIndex = getParameterByName('TB3');
if (hasParameterByName('S3')) { if (hasParameterByName('S3'))
{
document.forms['bgvram'].TS3.options.selectedIndex = getParameterByName('S3'); document.forms['bgvram'].TS3.options.selectedIndex = getParameterByName('S3');
document.forms['bgvram'].RS3.options.selectedIndex = getParameterByName('S3'); document.forms['bgvram'].RS3.options.selectedIndex = getParameterByName('S3');
document.forms['bgvram'].ERS3.options.selectedIndex = getParameterByName('S3'); document.forms['bgvram'].ERS3.options.selectedIndex = getParameterByName('S3');
@ -105,7 +111,8 @@ function loadp() {
} }
// Set all options to a valid state // Set all options to a valid state
for (i=0; i<document.forms['bgvram'].length; i++) { for (i=0; i<document.forms['bgvram'].length; i++)
{
j = document.forms['bgvram'].elements[i]; j = document.forms['bgvram'].elements[i];
if ((j.type == 'select-one') && (j.selectedIndex == -1)) j.selectedIndex = 0; if ((j.type == 'select-one') && (j.selectedIndex == -1)) j.selectedIndex = 0;
} }
@ -114,97 +121,124 @@ function loadp() {
upd(); upd();
} }
function bg_alloc_from(bgnum, bgtype, size, maxtiles, mapbase, tilebase) { function bg_alloc_from(bgnum, bgtype, size, maxtiles, mapbase, tilebase)
{
var i, j, sz, sz_t, sz_m, bgcstatus; var i, j, sz, sz_t, sz_m, bgcstatus;
bgnum *= 2; bgnum *= 2;
if (bgtype == 0) return; if (bgtype == 0) return;
if (bgtype == 1) { if (bgtype == 1)
{
sz_t = maxtiles / 32; sz_t = maxtiles / 32;
sz = Math.ceil(sz_t); sz = Math.ceil(sz_t);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_TileBase * 32) + (tilebase * 8) + i; j = (DISPCNT_TileBase * 32) + (tilebase * 8) + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum][j] = 1; if (j >= 0) VRAM_BGMapping[bgnum][j] = 1;
if (j > MaxAllocated) MaxAllocated = j;
} }
sz_m = BGType_TSiz[size]; sz_m = BGType_TSiz[size];
sz = Math.ceil(sz_m); sz = Math.ceil(sz_m);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_MapBase * 32) + mapbase + i; j = (DISPCNT_MapBase * 32) + mapbase + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum+1][j] = 1; if (j >= 0) VRAM_BGMapping[bgnum+1][j] = 1;
if (j > MaxAllocated) MaxAllocated = j;
} }
} }
else if (bgtype == 2) { else if (bgtype == 2)
{
sz_t = maxtiles / 64; sz_t = maxtiles / 64;
sz = Math.ceil(sz_t); sz = Math.ceil(sz_t);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_TileBase * 32) + (tilebase * 8) + i; j = (DISPCNT_TileBase * 32) + (tilebase * 8) + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum][j] = 1; if (j >= 0) VRAM_BGMapping[bgnum][j] = 1;
if (j > MaxAllocated) MaxAllocated = j;
} }
sz_m = BGType_TSiz[size]; sz_m = BGType_TSiz[size];
sz = Math.ceil(sz_m); sz = Math.ceil(sz_m);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_MapBase * 32) + mapbase + i; j = (DISPCNT_MapBase * 32) + mapbase + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum+1][j] = 1; if (j >= 0) VRAM_BGMapping[bgnum+1][j] = 1;
if (j > MaxAllocated) MaxAllocated = j;
} }
} }
else if (bgtype == 3) { else if (bgtype == 3)
{
sz_t = maxtiles / 32; sz_t = maxtiles / 32;
sz = Math.ceil(sz_t); sz = Math.ceil(sz_t);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_TileBase * 32) + (tilebase * 8) + i; j = (DISPCNT_TileBase * 32) + (tilebase * 8) + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum][j] = 1; if (j >= 0) VRAM_BGMapping[bgnum][j] = 1;
if (j > MaxAllocated) MaxAllocated = j;
} }
sz_m = BGType_RSiz[size]; sz_m = BGType_RSiz[size];
sz = Math.ceil(sz_m); sz = Math.ceil(sz_m);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_MapBase * 32) + mapbase + i; j = (DISPCNT_MapBase * 32) + mapbase + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum+1][j] = 1; if (j >= 0) VRAM_BGMapping[bgnum+1][j] = 1;
if (j > MaxAllocated) MaxAllocated = j;
} }
} }
else if (bgtype == 4) { else if (bgtype == 4)
{
sz_t = maxtiles / 32; sz_t = maxtiles / 32;
sz = Math.ceil(sz_t); sz = Math.ceil(sz_t);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_TileBase * 32) + (tilebase * 8) + i; j = (DISPCNT_TileBase * 32) + (tilebase * 8) + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum][j] = 1; if (j >= 0) VRAM_BGMapping[bgnum][j] = 1;
if (j > MaxAllocated) MaxAllocated = j;
} }
sz_m = BGType_ERSiz[size]; sz_m = BGType_ERSiz[size];
sz = Math.ceil(sz_m); sz = Math.ceil(sz_m);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_MapBase * 32) + mapbase + i; j = (DISPCNT_MapBase * 32) + mapbase + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum+1][j] = 1; if (j >= 0) VRAM_BGMapping[bgnum+1][j] = 1;
if (j > MaxAllocated) MaxAllocated = j;
} }
} }
else if (bgtype == 5) { else if (bgtype == 5)
{
sz_t = BGType_B8Siz[size]; sz_t = BGType_B8Siz[size];
sz = Math.ceil(sz_t); sz = Math.ceil(sz_t);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_MapBase * 32) + (mapbase * 8) + i; j = (DISPCNT_MapBase * 32) + (mapbase * 8) + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum][j] = 2; if (j >= 0) VRAM_BGMapping[bgnum][j] = 2;
if (j > MaxAllocated) MaxAllocated = j;
} }
sz_m = 0; sz_m = 0;
} }
else if (bgtype == 6) { else if (bgtype == 6)
{
sz_t = BGType_B16Siz[size]; sz_t = BGType_B16Siz[size];
sz = Math.ceil(sz_t); sz = Math.ceil(sz_t);
for (i=0; i<sz; i++) { for (i=0; i<sz; i++)
{
j = (DISPCNT_MapBase * 32) + (mapbase * 8) + i; j = (DISPCNT_MapBase * 32) + (mapbase * 8) + i;
if (j >= 256) j = 256; if (j >= 256) j = 256;
if (j >= 0) VRAM_BGMapping[bgnum][j] = 2; if (j >= 0) VRAM_BGMapping[bgnum][j] = 2;
if (j > MaxAllocated) MaxAllocated = j;
} }
sz_m = 0; sz_m = 0;
@ -213,15 +247,18 @@ function bg_alloc_from(bgnum, bgtype, size, maxtiles, mapbase, tilebase) {
VRAM_BGSpace[bgnum+1] = sz_m * 2; VRAM_BGSpace[bgnum+1] = sz_m * 2;
} }
function bg_alloc_conflict() { function bg_alloc_conflict()
{
var i, j, bg, numweight; var i, j, bg, numweight;
var ret = 1; var ret = 1;
for (i=0; i<256; i++) { for (i=0; i<256; i++)
{
VRAM_BGError[i] = 0; VRAM_BGError[i] = 0;
numweight = 0; numweight = 0;
// Mark weight // Mark weight
for (bg=0; bg<8; bg+=2) { for (bg=0; bg<8; bg+=2)
{
if (SubEngine && (i >= 64) && (VRAM_BGMapping[bg][i] != 0)) numweight += 4; if (SubEngine && (i >= 64) && (VRAM_BGMapping[bg][i] != 0)) numweight += 4;
if (VRAM_BGMapping[bg+1][i] != 0) numweight += 4; if (VRAM_BGMapping[bg+1][i] != 0) numweight += 4;
if (VRAM_BGMapping[bg][i] == 1) numweight++; if (VRAM_BGMapping[bg][i] == 1) numweight++;
@ -233,7 +270,8 @@ function bg_alloc_conflict() {
{ {
if (SubEngine && (i >= 64)) if (SubEngine && (i >= 64))
{ {
for (bg=0; bg<8; bg++) { for (bg=0; bg<8; bg++)
{
VRAM_BGMapping[bg][i] = 5; VRAM_BGMapping[bg][i] = 5;
} }
} }
@ -242,8 +280,10 @@ function bg_alloc_conflict() {
// Mark warnings // Mark warnings
if ((numweight >= 2) && (numweight < 5)) if ((numweight >= 2) && (numweight < 5))
{ {
for (bg=0; bg<8; bg+=2) { for (bg=0; bg<8; bg+=2)
if (VRAM_BGMapping[bg][i] > 0) { {
if (VRAM_BGMapping[bg][i] > 0)
{
VRAM_BGMapping[bg][i] = 3; VRAM_BGMapping[bg][i] = 3;
ret = 2; ret = 2;
} }
@ -253,7 +293,8 @@ function bg_alloc_conflict() {
// Mark errors // Mark errors
if (numweight >= 5) if (numweight >= 5)
{ {
for (bg=0; bg<8; bg+=2) { for (bg=0; bg<8; bg+=2)
{
if (SubEngine && (i >= 64)) if (SubEngine && (i >= 64))
{ {
if (VRAM_BGMapping[bg][i] > 0) if (VRAM_BGMapping[bg][i] > 0)
@ -276,8 +317,10 @@ function bg_alloc_conflict() {
} }
} }
VRAM_BGError[256] = 0; VRAM_BGError[256] = 0;
for (bg=0; bg<8; bg++) { for (bg=0; bg<8; bg++)
if (VRAM_BGMapping[bg][256] > 0) { {
if (VRAM_BGMapping[bg][256] > 0)
{
// Mark out of range // Mark out of range
VRAM_BGError[256] = 1; VRAM_BGError[256] = 1;
ret = 4; ret = 4;
@ -286,7 +329,8 @@ function bg_alloc_conflict() {
return ret; return ret;
} }
function bg_allocation() { function bg_allocation()
{
var i, sz, szopt, maxtiles, mapbase, tilebase; var i, sz, szopt, maxtiles, mapbase, tilebase;
var bgtype0, bgtype1, bgtype2, bgtype3; var bgtype0, bgtype1, bgtype2, bgtype3;
var wmode, a, b; var wmode, a, b;
@ -302,7 +346,8 @@ function bg_allocation() {
if (DISPCNT_TileBase != 0) ShareLink += "&TS=" + DISPCNT_TileBase; if (DISPCNT_TileBase != 0) ShareLink += "&TS=" + DISPCNT_TileBase;
// Setup array // Setup array
for (i=0; i<257; i++) { for (i=0; i<257; i++)
{
VRAM_BGMapping[0][i] = 0; VRAM_BGMapping[0][i] = 0;
VRAM_BGMapping[1][i] = 0; VRAM_BGMapping[1][i] = 0;
VRAM_BGMapping[2][i] = 0; VRAM_BGMapping[2][i] = 0;
@ -316,7 +361,8 @@ function bg_allocation() {
// Show/Hide controls // Show/Hide controls
i = document.forms['bgvram'].T0.options.selectedIndex; i = document.forms['bgvram'].T0.options.selectedIndex;
if (i > 0) { if (i > 0)
{
document.getElementById('BG_TS0').style.display = ""; document.getElementById('BG_TS0').style.display = "";
document.getElementById('BG_NT0').style.display = ""; document.getElementById('BG_NT0').style.display = "";
document.getElementById('BG_MB0').style.display = ""; document.getElementById('BG_MB0').style.display = "";
@ -330,7 +376,8 @@ function bg_allocation() {
document.getElementById('BG_TB0').style.display = "none"; document.getElementById('BG_TB0').style.display = "none";
} }
i = document.forms['bgvram'].T1.options.selectedIndex; i = document.forms['bgvram'].T1.options.selectedIndex;
if (i > 0) { if (i > 0)
{
document.getElementById('BG_TS1').style.display = ""; document.getElementById('BG_TS1').style.display = "";
document.getElementById('BG_NT1').style.display = ""; document.getElementById('BG_NT1').style.display = "";
document.getElementById('BG_MB1').style.display = ""; document.getElementById('BG_MB1').style.display = "";
@ -344,7 +391,8 @@ function bg_allocation() {
document.getElementById('BG_TB1').style.display = "none"; document.getElementById('BG_TB1').style.display = "none";
} }
i = document.forms['bgvram'].T2.options.selectedIndex; i = document.forms['bgvram'].T2.options.selectedIndex;
if (i > 0) { if (i > 0)
{
document.getElementById('BG_TS2').style.display = (i < 3) ? "" : "none"; document.getElementById('BG_TS2').style.display = (i < 3) ? "" : "none";
document.getElementById('BG_RS2').style.display = (i == 3) ? "" : "none"; document.getElementById('BG_RS2').style.display = (i == 3) ? "" : "none";
document.getElementById('BG_ERS2').style.display = (i == 4) ? "" : "none"; document.getElementById('BG_ERS2').style.display = (i == 4) ? "" : "none";
@ -368,7 +416,8 @@ function bg_allocation() {
document.getElementById('BG_TB2').style.display = "none"; document.getElementById('BG_TB2').style.display = "none";
} }
i = document.forms['bgvram'].T3.options.selectedIndex; i = document.forms['bgvram'].T3.options.selectedIndex;
if (i > 0) { if (i > 0)
{
document.getElementById('BG_TS3').style.display = (i < 3) ? "" : "none"; document.getElementById('BG_TS3').style.display = (i < 3) ? "" : "none";
document.getElementById('BG_RS3').style.display = (i == 3) ? "" : "none"; document.getElementById('BG_RS3').style.display = (i == 3) ? "" : "none";
document.getElementById('BG_ERS3').style.display = (i == 4) ? "" : "none"; document.getElementById('BG_ERS3').style.display = (i == 4) ? "" : "none";
@ -397,7 +446,8 @@ function bg_allocation() {
maxtiles = document.forms['bgvram'].NT0.options[document.forms['bgvram'].NT0.options.selectedIndex].value; maxtiles = document.forms['bgvram'].NT0.options[document.forms['bgvram'].NT0.options.selectedIndex].value;
mapbase = document.forms['bgvram'].MB0.options.selectedIndex; mapbase = document.forms['bgvram'].MB0.options.selectedIndex;
tilebase = document.forms['bgvram'].TB0.options.selectedIndex; tilebase = document.forms['bgvram'].TB0.options.selectedIndex;
if (bgtype0 > 0) { if (bgtype0 > 0)
{
ShareLink += "&T0=" + bgtype0 + "&NT0=" + maxtiles + "&MB0=" + mapbase + "&TB0=" + tilebase; ShareLink += "&T0=" + bgtype0 + "&NT0=" + maxtiles + "&MB0=" + mapbase + "&TB0=" + tilebase;
} }
switch (bgtype0) switch (bgtype0)
@ -417,7 +467,8 @@ function bg_allocation() {
document.getElementById('BG_DESC0').innerHTML = "* 16 colors tiles<br />* 16 Palettes"; document.getElementById('BG_DESC0').innerHTML = "* 16 colors tiles<br />* 16 Palettes";
} break; } break;
} }
if (bgtype0 > 0) { if (bgtype0 > 0)
{
ShareLink += "&S0=" + sz; ShareLink += "&S0=" + sz;
bgcodesnippet += "<span class='func'>bgInit" + (SubEngine ? "Sub" : "") + "</span>(<span class='numm'>0</span>"; bgcodesnippet += "<span class='func'>bgInit" + (SubEngine ? "Sub" : "") + "</span>(<span class='numm'>0</span>";
bgcodesnippet += ", <span class='deff'>BgType_" + document.forms['bgvram'].T0.options[document.forms['bgvram'].T0.options.selectedIndex].value + "</span>"; bgcodesnippet += ", <span class='deff'>BgType_" + document.forms['bgvram'].T0.options[document.forms['bgvram'].T0.options.selectedIndex].value + "</span>";
@ -431,7 +482,8 @@ function bg_allocation() {
maxtiles = document.forms['bgvram'].NT1.options[document.forms['bgvram'].NT1.options.selectedIndex].value; maxtiles = document.forms['bgvram'].NT1.options[document.forms['bgvram'].NT1.options.selectedIndex].value;
mapbase = document.forms['bgvram'].MB1.options.selectedIndex; mapbase = document.forms['bgvram'].MB1.options.selectedIndex;
tilebase = document.forms['bgvram'].TB1.options.selectedIndex; tilebase = document.forms['bgvram'].TB1.options.selectedIndex;
if (bgtype1 > 0) { if (bgtype1 > 0)
{
ShareLink += "&T1=" + bgtype1 + "&NT1=" + maxtiles + "&MB1=" + mapbase + "&TB1=" + tilebase; ShareLink += "&T1=" + bgtype1 + "&NT1=" + maxtiles + "&MB1=" + mapbase + "&TB1=" + tilebase;
} }
switch (bgtype1) switch (bgtype1)
@ -451,7 +503,8 @@ function bg_allocation() {
document.getElementById('BG_DESC1').innerHTML = "* 16 colors tiles<br />* 16 Palettes"; document.getElementById('BG_DESC1').innerHTML = "* 16 colors tiles<br />* 16 Palettes";
} break; } break;
} }
if (bgtype1 > 0) { if (bgtype1 > 0)
{
ShareLink += "&S1=" + sz; ShareLink += "&S1=" + sz;
bgcodesnippet += "<span class='func'>bgInit" + (SubEngine ? "Sub" : "") + "</span>(<span class='numm'>1</span>"; bgcodesnippet += "<span class='func'>bgInit" + (SubEngine ? "Sub" : "") + "</span>(<span class='numm'>1</span>";
bgcodesnippet += ", <span class='deff'>BgType_" + document.forms['bgvram'].T1.options[document.forms['bgvram'].T1.options.selectedIndex].value + "</span>"; bgcodesnippet += ", <span class='deff'>BgType_" + document.forms['bgvram'].T1.options[document.forms['bgvram'].T1.options.selectedIndex].value + "</span>";
@ -468,7 +521,8 @@ function bg_allocation() {
maxtiles = document.forms['bgvram'].NT2.options[document.forms['bgvram'].NT2.options.selectedIndex].value; maxtiles = document.forms['bgvram'].NT2.options[document.forms['bgvram'].NT2.options.selectedIndex].value;
mapbase = document.forms['bgvram'].MB2.options.selectedIndex; mapbase = document.forms['bgvram'].MB2.options.selectedIndex;
tilebase = document.forms['bgvram'].TB2.options.selectedIndex; tilebase = document.forms['bgvram'].TB2.options.selectedIndex;
if (bgtype2 > 0) { if (bgtype2 > 0)
{
ShareLink += "&T2=" + bgtype2 + "&NT2=" + maxtiles + "&MB2=" + mapbase + "&TB2=" + tilebase; ShareLink += "&T2=" + bgtype2 + "&NT2=" + maxtiles + "&MB2=" + mapbase + "&TB2=" + tilebase;
} }
switch (bgtype2) switch (bgtype2)
@ -508,7 +562,8 @@ function bg_allocation() {
document.getElementById('BG_DESC2').innerHTML = "* 32768 colors bitmap (+ 1-Bit Alpha)<br />Note1: Refer to BgSize_B8_256x256 but<br />only the top 256x192 is used."; document.getElementById('BG_DESC2').innerHTML = "* 32768 colors bitmap (+ 1-Bit Alpha)<br />Note1: Refer to BgSize_B8_256x256 but<br />only the top 256x192 is used.";
} break; } break;
} }
if (bgtype2 > 0) { if (bgtype2 > 0)
{
ShareLink += "&S2=" + sz; ShareLink += "&S2=" + sz;
bgcodesnippet += "<span class='func'>bgInit" + (SubEngine ? "Sub" : "") + "</span>(<span class='numm'>2</span>"; bgcodesnippet += "<span class='func'>bgInit" + (SubEngine ? "Sub" : "") + "</span>(<span class='numm'>2</span>";
bgcodesnippet += ", <span class='deff'>BgType_" + document.forms['bgvram'].T2.options[document.forms['bgvram'].T2.options.selectedIndex].value + "</span>"; bgcodesnippet += ", <span class='deff'>BgType_" + document.forms['bgvram'].T2.options[document.forms['bgvram'].T2.options.selectedIndex].value + "</span>";
@ -532,7 +587,8 @@ function bg_allocation() {
maxtiles = document.forms['bgvram'].NT3.options[document.forms['bgvram'].NT3.options.selectedIndex].value; maxtiles = document.forms['bgvram'].NT3.options[document.forms['bgvram'].NT3.options.selectedIndex].value;
mapbase = document.forms['bgvram'].MB3.options.selectedIndex; mapbase = document.forms['bgvram'].MB3.options.selectedIndex;
tilebase = document.forms['bgvram'].TB3.options.selectedIndex; tilebase = document.forms['bgvram'].TB3.options.selectedIndex;
if (bgtype3 > 0) { if (bgtype3 > 0)
{
ShareLink += "&T3=" + bgtype3 + "&NT3=" + maxtiles + "&MB3=" + mapbase + "&TB3=" + tilebase; ShareLink += "&T3=" + bgtype3 + "&NT3=" + maxtiles + "&MB3=" + mapbase + "&TB3=" + tilebase;
} }
switch (bgtype3) switch (bgtype3)
@ -572,7 +628,8 @@ function bg_allocation() {
document.getElementById('BG_DESC3').innerHTML = "* 32768 colors bitmap (+ 1-Bit Alpha)<br />Note1: Refer to BgSize_B8_256x256 but<br />only the top 256x192 is used."; document.getElementById('BG_DESC3').innerHTML = "* 32768 colors bitmap (+ 1-Bit Alpha)<br />Note1: Refer to BgSize_B8_256x256 but<br />only the top 256x192 is used.";
} break; } break;
} }
if (bgtype3 > 0) { if (bgtype3 > 0)
{
ShareLink += "&S3=" + sz; ShareLink += "&S3=" + sz;
bgcodesnippet += "<span class='func'>bgInit" + (SubEngine ? "Sub" : "") + "</span>(<span class='numm'>3</span>"; bgcodesnippet += "<span class='func'>bgInit" + (SubEngine ? "Sub" : "") + "</span>(<span class='numm'>3</span>";
bgcodesnippet += ", <span class='deff'>BgType_" + document.forms['bgvram'].T3.options[document.forms['bgvram'].T3.options.selectedIndex].value + "</span>"; bgcodesnippet += ", <span class='deff'>BgType_" + document.forms['bgvram'].T3.options[document.forms['bgvram'].T3.options.selectedIndex].value + "</span>";
@ -617,7 +674,8 @@ function bg_allocation() {
// Get a working mode out of a list of combinations // Get a working mode out of a list of combinations
wmode = WorkModes[bgtype3 + bgtype2*8]; wmode = WorkModes[bgtype3 + bgtype2*8];
if (largebitmap) { if (largebitmap)
{
if ((bgtype0 == 0) && (bgtype1 == 0) && (bgtype3 == 0)) if ((bgtype0 == 0) && (bgtype1 == 0) && (bgtype3 == 0))
wmode = 6; wmode = 6;
else else
@ -625,10 +683,16 @@ function bg_allocation() {
} }
// Generate report // Generate report
if (wmode < 0) { if (wmode < 0)
{
document.getElementById('Recommended_Mode').innerHTML = "<b>Error:</b> Invalid background type combination!"; document.getElementById('Recommended_Mode').innerHTML = "<b>Error:</b> Invalid background type combination!";
document.getElementById('Working_Engines').innerHTML = "<b>Error:</b> Combination won't work on hardware!"; document.getElementById('Working_Engines').innerHTML = "<b>Error:</b> Combination won't work on hardware!";
} }
else if (MaxAllocated >= 256)
{
document.getElementById('Recommended_Mode').innerHTML = "<b>Mode " + wmode + "</b> will support your options.";
document.getElementById('Working_Engines').innerHTML = "<b>Error:</b> Graphics out of range!";
}
else else
{ {
document.getElementById('Recommended_Mode').innerHTML = "<b>Mode " + wmode + "</b> will support your options."; document.getElementById('Recommended_Mode').innerHTML = "<b>Mode " + wmode + "</b> will support your options.";
@ -649,7 +713,8 @@ function bg_allocation() {
document.getElementById('Working_Engines').innerHTML = "Works for Main Engine only!<br />For Sub Engine map, use DISPCNT 64KB steps of 0."; document.getElementById('Working_Engines').innerHTML = "Works for Main Engine only!<br />For Sub Engine map, use DISPCNT 64KB steps of 0.";
} }
if ((wmode >= 0) && (bgcstatus < 3)) { if ((wmode >= 0) && (bgcstatus < 3))
{
document.getElementById('Report').innerHTML = "All options valid."; document.getElementById('Report').innerHTML = "All options valid.";
document.getElementById('Report').style.color = "#00A000"; document.getElementById('Report').style.color = "#00A000";
} }
@ -670,7 +735,8 @@ function bg_allocation() {
} }
} }
function bg_allocation_table() { function bg_allocation_table()
{
var tableid, table, tr, td, i, j, k; var tableid, table, tr, td, i, j, k;
tableid = document.getElementById('BGAllocationTable'); tableid = document.getElementById('BGAllocationTable');
tableid.innerHTML = ""; tableid.innerHTML = "";
@ -681,22 +747,26 @@ function bg_allocation_table() {
tr = document.createElement('TR'); tr = document.createElement('TR');
tr.innerHTML = "<td>Gfx</td><td>Map</td><td>Gfx</td><td>Map</td><td>Gfx</td><td>Map</td><td>Gfx</td><td>Map</td>"; tr.innerHTML = "<td>Gfx</td><td>Map</td><td>Gfx</td><td>Map</td><td>Gfx</td><td>Map</td><td>Gfx</td><td>Map</td>";
table.appendChild(tr); table.appendChild(tr);
for (i=0; i<256; i++) { for (i=0; i<256; i++)
{
tr = document.createElement('TR'); tr = document.createElement('TR');
// Boundary // Boundary
if (((i % 64) == 0) && (i != 0)) { if (((i % 64) == 0) && (i != 0))
{
tr.innerHTML = "<td colspan='11'>" + (i*2) + "KiB Boundary</td>"; tr.innerHTML = "<td colspan='11'>" + (i*2) + "KiB Boundary</td>";
table.appendChild(tr); table.appendChild(tr);
tr = document.createElement('TR'); tr = document.createElement('TR');
} }
// Tile Base // Tile Base
if ((i % 8) == 0) { if ((i % 8) == 0)
{
j = -(DISPCNT_TileBase * 4) + (i / 8); j = -(DISPCNT_TileBase * 4) + (i / 8);
td = document.createElement('TD'); td = document.createElement('TD');
for (k=0; k<8; k++) if (VRAM_BGError[i+k]) td.style.backgroundColor = "#DFAFAF"; for (k=0; k<8; k++) if (VRAM_BGError[i+k]) td.style.backgroundColor = "#DFAFAF";
if ((j >= 0) && (j < 16)) { if ((j >= 0) && (j < 16))
{
td.innerHTML = j; td.innerHTML = j;
} }
else else
@ -722,10 +792,10 @@ function bg_allocation_table() {
tr.appendChild(td); tr.appendChild(td);
// Mark cells // Mark cells
for (j=0; j<8; j++) { for (j=0; j<8; j++)
{
td = document.createElement('TD'); td = document.createElement('TD');
td.style.backgroundColor = ColorCode[VRAM_BGMapping[j][i]]; td.style.backgroundColor = ColorCode[VRAM_BGMapping[j][i]];
if (VRAM_BGMapping[j][i] != 0) MaxAllocated = i;
tr.appendChild(td); tr.appendChild(td);
} }
@ -745,7 +815,8 @@ function bg_allocation_table() {
td.colSpan = 3; td.colSpan = 3;
tr.appendChild(td); tr.appendChild(td);
if (VRAM_BGError[256]) td.style.backgroundColor = "#DFAFAF"; if (VRAM_BGError[256]) td.style.backgroundColor = "#DFAFAF";
for (j=0; j<8; j++) { for (j=0; j<8; j++)
{
td = document.createElement('TD'); td = document.createElement('TD');
if (VRAM_BGMapping[j][256] == 0) if (VRAM_BGMapping[j][256] == 0)
td.style.backgroundColor = ColorCode[5]; td.style.backgroundColor = ColorCode[5];
@ -759,7 +830,8 @@ function bg_allocation_table() {
tableid.appendChild(table); tableid.appendChild(table);
} }
function upd() { function upd()
{
var i, a, b; var i, a, b;
// Clear globals // Clear globals