| } | } | ||||
| } | } | ||||
| class MMC{ | class MMC{ | ||||
| constructor(){ | constructor(){ | ||||
| this.__banks = []; | this.__banks = []; | ||||
| this.__addr = 0; | |||||
| this.__bnkidx = 0; | |||||
| } | } | ||||
| get size(){ | get size(){ | ||||
| get banks(){return this.__banks.length;} | get banks(){return this.__banks.length;} | ||||
| // TODO: Add a get/set for the memory address. This should handle banking and memory address offsets. | |||||
| // TODO: Add a get/set for memory data at the current address. | |||||
| // TODO: Add method for adding memory modules} | |||||
| // TODO: Add a connection between a memory address and the triggering of bank switching. | |||||
| get address(){return this.__addr;} | |||||
| set address(a){ | |||||
| if (a >= 0 && a < this.size){ | |||||
| this.__addr = a; | |||||
| offset = 0; | |||||
| for (let b=0; b < this.__banks.length; b++){ | |||||
| if (a >= offset && a < offset + this.__banks[b].mem.size){ | |||||
| this.__bnkidx = b; | |||||
| this.__banks[b].mem.address = a - offset; | |||||
| break; | |||||
| } else { | |||||
| offset += this.__banks[b].mem.size; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| get byte(){return (this.__banks.length > 0) ? this.__banks[this.__bnkidx].mem.byte : -1;} | |||||
| set byte(b){ | |||||
| if (this.__banks.length > 0){ | |||||
| this.__banks[this.__bnkidx].mem.byte = b; | |||||
| } | |||||
| } | |||||
| connectMemory(mem, addroff){ | |||||
| addroff = (typeof(addroff) === 'number' && addroff >= 0) ? addroff : -1; | |||||
| if (addroff < 0 || addroff === this.size){ | |||||
| this.__banks.push(new Bank(mem)); | |||||
| } else { | |||||
| offset = 0; | |||||
| for (let b=0; b < this.__banks.length; b++){ | |||||
| if (addroff === offset){ | |||||
| if (this.__banks[b].mem.size !== mem.size) | |||||
| throw new RangeError("Memory modules assigned to the same bank must be the same byte size."); | |||||
| this.__banks[b].addMemModule(mem); | |||||
| offset = -1; | |||||
| break; | |||||
| } else { | |||||
| offset += this.__banks[b].mem.size; | |||||
| } | |||||
| } | |||||
| if (offset >= 0) | |||||
| throw new RangeError("Cannot align memory module to bank at address " + addroff); | |||||
| } | |||||
| return this; | |||||
| } | |||||
| mmSwitchCallback(){ | |||||
| return (function(byte){ | |||||
| // TODO: Check the bits to determin which bank and bank index is being switched on. | |||||
| }).bind(this); | |||||
| } | |||||
| } | } | ||||
| module.exports = MMC; | module.exports = MMC; |