| @@ -33,6 +33,10 @@ function CnvIdx(x, y, am, off){ | |||
| off -= (off > 3) ? 4 : 0; | |||
| res.tileidx = (off * 64) + ((Math.floor(y/8) * 16) + Math.floor(x / 8)); | |||
| break; | |||
| case NESBank.ACCESSMODE_1T: | |||
| res.side = (off >= 256) ? 1 : 0; | |||
| res.tileidx = (off >= 256) ? off - 256 : off; | |||
| break; | |||
| } | |||
| res.x = x%8; | |||
| @@ -53,6 +57,8 @@ function AdjOffsetToNewMode(nmode, omode, ooff){ | |||
| return Math.floor(ooff * 0.5); | |||
| case NESBank.ACCESSMODE_1K: | |||
| return Math.floor(ooff * 0.25); | |||
| case NESBank.ACCESSMODE_1T: | |||
| return Math.floor(ooff / 256); | |||
| } | |||
| } | |||
| return ooff; | |||
| @@ -62,6 +68,8 @@ function AdjOffsetToNewMode(nmode, omode, ooff){ | |||
| return ooff * 2; | |||
| case NESBank.ACCESSMODE_1K: | |||
| return Math.floor(ooff * 0.5); | |||
| case NESBank.ACCESSMODE_1T: | |||
| return Math.floor(ooff * 0.0078125); // divide by 128 | |||
| } | |||
| break; | |||
| case NESBank.ACCESSMODE_1K: | |||
| @@ -70,6 +78,18 @@ function AdjOffsetToNewMode(nmode, omode, ooff){ | |||
| return ooff * 4; | |||
| case NESBank.ACCESSMODE_2K: | |||
| return ooff * 2; | |||
| case NESBank.ACCESSMODE_1T: | |||
| return Math.floor(ooff * 0.015625); // divide by 64 | |||
| } | |||
| break; | |||
| case NESBank.ACCESSMODE_1T: | |||
| switch(omode){ | |||
| case NESBank.ACCESSMODE_4K: | |||
| return ooff * 256; | |||
| case NESBank.ACCESSMODE_2K: | |||
| return ooff * 128; | |||
| case NESBank.ACCESSMODE_1K: | |||
| return ooff * 64; | |||
| } | |||
| break; | |||
| } | |||
| @@ -95,6 +115,11 @@ export default class NESBank extends ISurface{ | |||
| var handle_datachanged = Utils.debounce((function(side, idx){ | |||
| var sendEmit = false; | |||
| switch(this.__AccessMode){ | |||
| case NESBank.ACCESSMODE_1T: | |||
| if (side === Math.floor(this.__AccessOffset / 256)){ | |||
| if (idx === this.__AccessOffset) | |||
| sendEmit = true; | |||
| } | |||
| case NESBank.ACCESSMODE_1K: | |||
| if (side === Math.floor(this.__AccessOffset / 4)){ | |||
| if (Math.floor(idx / 64) === Math.floor(this.__AccessOffset/4)) | |||
| @@ -148,6 +173,9 @@ export default class NESBank extends ISurface{ | |||
| case NESBank.ACCESSMODE_1K: | |||
| this.__AccessMode = NESBank.ACCESSMODE_1K; | |||
| break; | |||
| case NESBank.ACCESSMODE_1T: | |||
| this.__AccessMode = NESBank.ACCESSMODE_1T; | |||
| break; | |||
| default: | |||
| throw new ValueError("Unknown Access Mode."); | |||
| } | |||
| @@ -178,6 +206,9 @@ export default class NESBank extends ISurface{ | |||
| if (o < 0 || o >= 8) | |||
| throw new RangeError("Access Offset is out of bounds based on current Access Mode."); | |||
| break; | |||
| case NESBank.ACCESSMODE_1T: | |||
| if (o < 0 || o >= 512) | |||
| throw new RangeError("Access Offset is out of bounds based on current Access Mode."); | |||
| } | |||
| this.__AccessOffset = o; | |||
| @@ -193,6 +224,8 @@ export default class NESBank extends ISurface{ | |||
| return 4; | |||
| case NESBank.ACCESSMODE_1K: | |||
| return 8; | |||
| case NESBank.ACCESSMODE_1T: | |||
| return 512; | |||
| } | |||
| return 0; | |||
| } | |||
| @@ -250,6 +283,10 @@ export default class NESBank extends ISurface{ | |||
| offset += 16; | |||
| } | |||
| break; | |||
| case NESBank.ACCESSMODE_1T: | |||
| var list = (this.__AccessOffset < 256) ? this.__LP : this.__RP; | |||
| var idx = this.__AccessOffset % 256; | |||
| buff = list[idx].chr; | |||
| } | |||
| return buff; | |||
| } | |||
| @@ -290,13 +327,21 @@ export default class NESBank extends ISurface{ | |||
| } | |||
| } | |||
| get width(){return (this.__AccessMode == NESBank.ACCESSMODE_8K) ? 256 : 128;} | |||
| get width(){ | |||
| if (this.__AccessMode == NESBank.ACCESSMODE_8K) | |||
| return 256; | |||
| if (this.__AccessMode == NESBank.ACCESSMODE_1T) | |||
| return 8; | |||
| return 128; | |||
| } | |||
| get height(){ | |||
| switch(this.__AccessMode){ | |||
| case NESBank.ACCESSMODE_2K: | |||
| return 64; | |||
| case NESBank.ACCESSMODE_1K: | |||
| return 32; | |||
| case NESBank.ACCESSMODE_1T: | |||
| return 8; | |||
| } | |||
| return 128; | |||
| } | |||
| @@ -494,6 +539,15 @@ export default class NESBank extends ISurface{ | |||
| idx += 16; | |||
| } | |||
| break; | |||
| case 16: | |||
| if (offset < 0) | |||
| offset = AdjOffsetToNewMode(NESBank.ACCESSMODE_1T, this.__AccessMode, this.__AccessOffset); | |||
| if (offset >= 512) | |||
| throw new RangeError("Offset mismatch based on Buffer length."); | |||
| var list = (offset < 256) ? this.__LP : this.__RP; | |||
| var idx = offset % 256; | |||
| list[idx].chr = buff; | |||
| break; | |||
| default: | |||
| throw new RangeError("Buffer length does not match any of the supported bank sizes."); | |||
| } | |||
| @@ -653,3 +707,4 @@ NESBank.ACCESSMODE_8K = 0; | |||
| NESBank.ACCESSMODE_1K = 1; | |||
| NESBank.ACCESSMODE_2K = 2; | |||
| NESBank.ACCESSMODE_4K = 3; | |||
| NESBank.ACCESSMODE_1T = 4; | |||