|
|
@@ -64,10 +64,10 @@ class MMC extends IMem{ |
|
|
|
set address(a){ |
|
|
|
if (a >= 0 && a < this.size){ |
|
|
|
this.__addr = a; |
|
|
|
offset = 0; |
|
|
|
let offset = 0; |
|
|
|
for (let s=0; s < this.__switches.length; s++){ |
|
|
|
if (a >= offset && a < offset + this.__switches[s].mem.size){ |
|
|
|
this.__sidx = b; |
|
|
|
this.__sidx = s; |
|
|
|
this.__switches[s].mem.address = a - offset; |
|
|
|
break; |
|
|
|
} else { |
|
|
@@ -77,7 +77,10 @@ class MMC extends IMem{ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
get byte(){return (this.__switches.length > 0) ? this.__switches[this.__sidx].mem.byte : -1;} |
|
|
|
get byte(){ |
|
|
|
return (this.__switches.length > 0) ? this.__switches[this.__sidx].mem.byte : -1; |
|
|
|
} |
|
|
|
|
|
|
|
set byte(b){ |
|
|
|
if (this.__switches.length > 0){ |
|
|
|
this.__switches[this.__sidx].mem.byte = b; |
|
|
@@ -88,18 +91,18 @@ class MMC extends IMem{ |
|
|
|
if (addr < 0 || addr > this.size) |
|
|
|
throw new RangeError("Memory address out of range."); |
|
|
|
let offset = 0; |
|
|
|
for (let i = 0; i < this.__switches.length; i++){ |
|
|
|
let mem = this.__switches[i].mem; |
|
|
|
let od = data; |
|
|
|
if (addr >= offset && addr < offset + mem.size){ |
|
|
|
if ((addr - offset) + d.length >= mem.size) |
|
|
|
od = data.slice(0, mem.size); |
|
|
|
mem.load(addr - offset, od); |
|
|
|
let doff = 0; |
|
|
|
let addre = addr + data.length; |
|
|
|
for (let s = 0; s < this.__switches.length; s++){ |
|
|
|
let mem = this.__switches[s].mem; |
|
|
|
if (addr < offset + mem.size && addre >= offset){ |
|
|
|
let a = (addr > offset) ? addr - offset : 0; |
|
|
|
let dlen = (mem.size - a < data.length - doff) ? |
|
|
|
mem.size - a : data.length - doff; |
|
|
|
mem.load(a, data.slice(doff, doff + dlen)); |
|
|
|
doff += dlen; |
|
|
|
} |
|
|
|
data = data.slice(mem.size); |
|
|
|
offset += mem.size; |
|
|
|
if (d.length > 0) |
|
|
|
addr = offset; |
|
|
|
} |
|
|
|
return this; |
|
|
|
} |