forked from sent/waves
270 lines
14 KiB
JavaScript
270 lines
14 KiB
JavaScript
define(function() {
|
|
return {
|
|
busLock: null,
|
|
vicBank: null,
|
|
CHAREN: null,
|
|
HIRAM: null,
|
|
LORAM: null,
|
|
|
|
ram: null,
|
|
romBasic: null,
|
|
romKernal: null,
|
|
charRom: null,
|
|
|
|
r: function(addr) {
|
|
switch (addr & 0xF000) {
|
|
case 0x0000:
|
|
case 0x1000:
|
|
case 0x2000:
|
|
case 0x3000:
|
|
case 0x4000:
|
|
case 0x5000:
|
|
case 0x6000:
|
|
case 0x7000:
|
|
case 0x8000:
|
|
case 0x9000:
|
|
return this.ram[addr];
|
|
case 0xA000:
|
|
case 0xB000:
|
|
return (this.LORAM && this.HIRAM)
|
|
? this.romBasic[addr & 0x1FFF]
|
|
: this.ram[addr];
|
|
case 0xC000:
|
|
return this.ram[addr];
|
|
case 0xD000:
|
|
return (this.LORAM || this.HIRAM)
|
|
? (this.CHAREN
|
|
? this.io_r(addr & 0x0FFF)
|
|
: this.charRom[addr & 0x0FFF])
|
|
: this.ram[addr];
|
|
case 0xE000:
|
|
case 0xF000:
|
|
return this.HIRAM
|
|
? this.romKernal[addr & 0x1FFF]
|
|
: this.ram[addr];
|
|
}
|
|
},
|
|
w: function(addr, val) {
|
|
if (addr == 0x0001) {
|
|
this.CHAREN = !!(val & 4);
|
|
this.HIRAM = !!(val & 2);
|
|
this.LORAM = !!(val & 1);
|
|
} else if ((addr & 0xF000) == 0xD000 && this.CHAREN) {
|
|
this.io_w(addr & 0x0FFF, val);
|
|
}
|
|
this.ram[addr] = val;
|
|
},
|
|
io_r: function(addr) {
|
|
switch (addr & 0xF00) {
|
|
case 0x000:
|
|
case 0x100:
|
|
case 0x200:
|
|
case 0x300:
|
|
return this.owner.VIC.io_r(addr);
|
|
case 0x800:
|
|
case 0x900:
|
|
case 0xA00:
|
|
case 0xB00:
|
|
return this.owner.VIC.colorRam[addr & 0x03FF];
|
|
case 0xC00:
|
|
case 0xD00:
|
|
return this.owner.CIA.io_r(addr);
|
|
case 0xE00:
|
|
if ((addr & 0x00FF) == 0) {
|
|
return (
|
|
(this.owner.game.effects.rasterbars ? 1 : 0) +
|
|
(this.owner.game.effects.scrollshake ? 2 : 0) +
|
|
(this.owner.game.effects.sprite ? 4 : 0) +
|
|
(this.owner.game.effects.doublesprite ? 8 : 0)
|
|
);
|
|
}
|
|
break;
|
|
}
|
|
return 0;
|
|
},
|
|
io_w: function(addr, val) {
|
|
switch (addr & 0xF00) {
|
|
case 0x000:
|
|
case 0x100:
|
|
case 0x200:
|
|
case 0x300:
|
|
this.owner.VIC.io_w(addr, val);
|
|
break;
|
|
case 0x800:
|
|
case 0x900:
|
|
case 0xA00:
|
|
case 0xB00:
|
|
if ((addr & 0x03FF) >= 1000) {
|
|
return;
|
|
}
|
|
this.owner.VIC.colorRam[addr & 0x03FF] = val & 15;
|
|
break;
|
|
case 0xC00:
|
|
case 0xD00:
|
|
this.owner.CIA.io_w(addr, val);
|
|
break;
|
|
}
|
|
},
|
|
getState: function() {
|
|
return {
|
|
ram: new Uint8Array(this.ram),
|
|
busLock: this.busLock + 0
|
|
};
|
|
},
|
|
setState: function(state) {
|
|
this.ram = new Uint8Array(state.ram);
|
|
this.busLock = 0 + state.busLock;
|
|
},
|
|
reset: function() {
|
|
this.busLock = 0;
|
|
this.vicBank = 0;
|
|
this.CHAREN = true;
|
|
this.HIRAM = true;
|
|
this.LORAM = true;
|
|
},
|
|
init: function() {
|
|
var i, j;
|
|
|
|
this.ram = new Uint8Array(65536);
|
|
this.romBasic = new Uint8Array(8192);
|
|
this.romKernal = new Uint8Array(8192);
|
|
this.charRom = new Uint8Array(4096);
|
|
|
|
this.reset();
|
|
for (i = 0, j = this.charRomSrc.match(/.{2}/g); i < 4096; i++) {
|
|
this.charRom[i] = parseInt(j[i], 16);
|
|
}
|
|
},
|
|
charRomSrc: [
|
|
'3c666e6e60623c00183c667e666666007c66667c66667c003c66606060663c00',
|
|
'786c6666666c78007e60607860607e007e606078606060003c66606e66663c00',
|
|
'6666667e666666003c18181818183c001e0c0c0c0c6c3800666c7870786c6600',
|
|
'6060606060607e0063777f6b6363630066767e7e6e6666003c66666666663c00',
|
|
'7c66667c606060003c666666663c0e007c66667c786c66003c66603c06663c00',
|
|
'7e181818181818006666666666663c0066666666663c18006363636b7f776300',
|
|
'66663c183c6666006666663c181818007e060c1830607e003c30303030303c00',
|
|
'0c12307c3062fc003c0c0c0c0c0c3c0000183c7e181818180010307f7f301000',
|
|
'0000000000000000181818180000180066666600000000006666ff66ff666600',
|
|
'183e603c067c180062660c18306646003c663c3867663f00060c180000000000',
|
|
'0c18303030180c0030180c0c0c18300000663cff3c6600000018187e18180000',
|
|
'00000000001818300000007e0000000000000000001818000003060c18306000',
|
|
'3c666e7666663c001818381818187e003c66060c30607e003c66061c06663c00',
|
|
'060e1e667f0606007e607c0606663c003c66607c66663c007e660c1818181800',
|
|
'3c66663c66663c003c66663e06663c0000001800001800000000180000181830',
|
|
'0e18306030180e0000007e007e00000070180c060c1870003c66060c18001800',
|
|
'000000ffff000000081c3e7f7f1c3e001818181818181818000000ffff000000',
|
|
'0000ffff0000000000ffff000000000000000000ffff00003030303030303030',
|
|
'0c0c0c0c0c0c0c0c000000e0f038181818181c0f07000000181838f0e0000000',
|
|
'c0c0c0c0c0c0ffffc0e070381c0e070303070e1c3870e0c0ffffc0c0c0c0c0c0',
|
|
'ffff030303030303003c7e7e7e7e3c000000000000ffff00367f7f7f3e1c0800',
|
|
'6060606060606060000000070f1c1818c3e77e3c3c7ee7c3003c7e66667e3c00',
|
|
'1818666618183c000606060606060606081c3e7f3e1c0800181818ffff181818',
|
|
'c0c03030c0c0303018181818181818180000033e76363600ff7f3f1f0f070301',
|
|
'0000000000000000f0f0f0f0f0f0f0f000000000ffffffffff00000000000000',
|
|
'00000000000000ffc0c0c0c0c0c0c0c0cccc3333cccc33330303030303030303',
|
|
'00000000cccc3333fffefcf8f0e0c08003030303030303031818181f1f181818',
|
|
'000000000f0f0f0f1818181f1f000000000000f8f8181818000000000000ffff',
|
|
'0000001f1f181818181818ffff000000000000ffff181818181818f8f8181818',
|
|
'c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e00707070707070707ffff000000000000',
|
|
'ffffff00000000000000000000ffffff030303030303ffff00000000f0f0f0f0',
|
|
'0f0f0f0f00000000181818f8f8000000f0f0f0f000000000f0f0f0f00f0f0f0f',
|
|
'c39991919f99c3ffe7c39981999999ff83999983999983ffc3999f9f9f99c3ff',
|
|
'87939999999387ff819f9f879f9f81ff819f9f879f9f9fffc3999f919999c3ff',
|
|
'99999981999999ffc3e7e7e7e7e7c3ffe1f3f3f3f393c7ff9993878f879399ff',
|
|
'9f9f9f9f9f9f81ff9c8880949c9c9cff99898181919999ffc39999999999c3ff',
|
|
'839999839f9f9fffc399999999c3f1ff83999983879399ffc3999fc3f999c3ff',
|
|
'81e7e7e7e7e7e7ff999999999999c3ff9999999999c3e7ff9c9c9c9480889cff',
|
|
'9999c3e7c39999ff999999c3e7e7e7ff81f9f3e7cf9f81ffc3cfcfcfcfcfc3ff',
|
|
'f3edcf83cf9d03ffc3f3f3f3f3f3c3ffffe7c381e7e7e7e7ffefcf8080cfefff',
|
|
'ffffffffffffffffe7e7e7e7ffffe7ff999999ffffffffff99990099009999ff',
|
|
'e7c19fc3f983e7ff9d99f3e7cf99b9ffc399c3c79899c0fff9f3e7ffffffffff',
|
|
'f3e7cfcfcfe7f3ffcfe7f3f3f3e7cfffff99c300c399ffffffe7e781e7e7ffff',
|
|
'ffffffffffe7e7cfffffff81ffffffffffffffffffe7e7fffffcf9f3e7cf9fff',
|
|
'c39991899999c3ffe7e7c7e7e7e781ffc399f9f3cf9f81ffc399f9e3f999c3ff',
|
|
'f9f1e19980f9f9ff819f83f9f999c3ffc3999f839999c3ff8199f3e7e7e7e7ff',
|
|
'c39999c39999c3ffc39999c1f999c3ffffffe7ffffe7ffffffffe7ffffe7e7cf',
|
|
'f1e7cf9fcfe7f1ffffff81ff81ffffff8fe7f3f9f3e78fffc399f9f3e7ffe7ff',
|
|
'ffffff0000fffffff7e3c18080e3c1ffe7e7e7e7e7e7e7e7ffffff0000ffffff',
|
|
'ffff0000ffffffffff0000ffffffffffffffffff0000ffffcfcfcfcfcfcfcfcf',
|
|
'f3f3f3f3f3f3f3f3ffffff1f0fc7e7e7e7e7e3f0f8ffffffe7e7c70f1fffffff',
|
|
'3f3f3f3f3f3f00003f1f8fc7e3f1f8fcfcf8f1e3c78f1f3f00003f3f3f3f3f3f',
|
|
'0000fcfcfcfcfcfcffc381818181c3ffffffffffff0000ffc9808080c1e3f7ff',
|
|
'9f9f9f9f9f9f9f9ffffffff8f0e3e7e73c1881c3c381183cffc381999981c3ff',
|
|
'e7e79999e7e7c3fff9f9f9f9f9f9f9f9f7e3c180c1e3f7ffe7e7e70000e7e7e7',
|
|
'3f3fcfcf3f3fcfcfe7e7e7e7e7e7e7e7fffffcc189c9c9ff0080c0e0f0f8fcfe',
|
|
'ffffffffffffffff0f0f0f0f0f0f0f0fffffffff0000000000ffffffffffffff',
|
|
'ffffffffffffff003f3f3f3f3f3f3f3f3333cccc3333ccccfcfcfcfcfcfcfcfc',
|
|
'ffffffff3333cccc000103070f1f3f7ffcfcfcfcfcfcfcfce7e7e7e0e0e7e7e7',
|
|
'fffffffff0f0f0f0e7e7e7e0e0ffffffffffff0707e7e7e7ffffffffffff0000',
|
|
'ffffffe0e0e7e7e7e7e7e70000ffffffffffff0000e7e7e7e7e7e70707e7e7e7',
|
|
'3f3f3f3f3f3f3f3f1f1f1f1f1f1f1f1ff8f8f8f8f8f8f8f80000ffffffffffff',
|
|
'000000ffffffffffffffffffff000000fcfcfcfcfcfc0000ffffffff0f0f0f0f',
|
|
'f0f0f0f0ffffffffe7e7e70707ffffff0f0f0f0fffffffff0f0f0f0ff0f0f0f0',
|
|
'3c666e6e60623c0000003c063e663e000060607c66667c0000003c6060603c00',
|
|
'0006063e66663e0000003c667e603c00000e183e1818180000003e66663e067c',
|
|
'0060607c666666000018003818183c00000600060606063c0060606c786c6600',
|
|
'0038181818183c000000667f7f6b630000007c666666660000003c6666663c00',
|
|
'00007c66667c606000003e66663e060600007c666060600000003e603c067c00',
|
|
'00187e1818180e000000666666663e0000006666663c18000000636b7f3e3600',
|
|
'0000663c183c660000006666663e0c7800007e0c18307e003c30303030303c00',
|
|
'0c12307c3062fc003c0c0c0c0c0c3c0000183c7e181818180010307f7f301000',
|
|
'0000000000000000181818180000180066666600000000006666ff66ff666600',
|
|
'183e603c067c180062660c18306646003c663c3867663f00060c180000000000',
|
|
'0c18303030180c0030180c0c0c18300000663cff3c6600000018187e18180000',
|
|
'00000000001818300000007e0000000000000000001818000003060c18306000',
|
|
'3c666e7666663c001818381818187e003c66060c30607e003c66061c06663c00',
|
|
'060e1e667f0606007e607c0606663c003c66607c66663c007e660c1818181800',
|
|
'3c66663c66663c003c66663e06663c0000001800001800000000180000181830',
|
|
'0e18306030180e0000007e007e00000070180c060c1870003c66060c18001800',
|
|
'000000ffff000000183c667e666666007c66667c66667c003c66606060663c00',
|
|
'786c6666666c78007e60607860607e007e606078606060003c66606e66663c00',
|
|
'6666667e666666003c18181818183c001e0c0c0c0c6c3800666c7870786c6600',
|
|
'6060606060607e0063777f6b6363630066767e7e6e6666003c66666666663c00',
|
|
'7c66667c606060003c666666663c0e007c66667c786c66003c66603c06663c00',
|
|
'7e181818181818006666666666663c0066666666663c18006363636b7f776300',
|
|
'66663c183c6666006666663c181818007e060c1830607e00181818ffff181818',
|
|
'c0c03030c0c0303018181818181818183333cccc3333cccc3399cc663399cc66',
|
|
'0000000000000000f0f0f0f0f0f0f0f000000000ffffffffff00000000000000',
|
|
'00000000000000ffc0c0c0c0c0c0c0c0cccc3333cccc33330303030303030303',
|
|
'00000000cccc3333cc993366cc99336603030303030303031818181f1f181818',
|
|
'000000000f0f0f0f1818181f1f000000000000f8f8181818000000000000ffff',
|
|
'0000001f1f181818181818ffff000000000000ffff181818181818f8f8181818',
|
|
'c0c0c0c0c0c0c0c0e0e0e0e0e0e0e0e00707070707070707ffff000000000000',
|
|
'ffffff00000000000000000000ffffff0103066c7870600000000000f0f0f0f0',
|
|
'0f0f0f0f00000000181818f8f8000000f0f0f0f000000000f0f0f0f00f0f0f0f',
|
|
'c39991919f99c3ffffffc3f9c199c1ffff9f9f83999983ffffffc39f9f9fc3ff',
|
|
'fff9f9c19999c1ffffffc399819fc3fffff1e7c1e7e7e7ffffffc19999c1f983',
|
|
'ff9f9f83999999ffffe7ffc7e7e7c3fffff9fff9f9f9f9c3ff9f9f93879399ff',
|
|
'ffc7e7e7e7e7c3ffffff998080949cffffff8399999999ffffffc3999999c3ff',
|
|
'ffff839999839f9fffffc19999c1f9f9ffff83999f9f9fffffffc19fc3f983ff',
|
|
'ffe781e7e7e7f1ffffff99999999c1ffffff999999c3e7ffffff9c9480c1c9ff',
|
|
'ffff99c3e7c399ffffff999999c1f387ffff81f3e7cf81ffc3cfcfcfcfcfc3ff',
|
|
'f3edcf83cf9d03ffc3f3f3f3f3f3c3ffffe7c381e7e7e7e7ffefcf8080cfefff',
|
|
'ffffffffffffffffe7e7e7e7ffffe7ff999999ffffffffff99990099009999ff',
|
|
'e7c19fc3f983e7ff9d99f3e7cf99b9ffc399c3c79899c0fff9f3e7ffffffffff',
|
|
'f3e7cfcfcfe7f3ffcfe7f3f3f3e7cfffff99c300c399ffffffe7e781e7e7ffff',
|
|
'ffffffffffe7e7cfffffff81ffffffffffffffffffe7e7fffffcf9f3e7cf9fff',
|
|
'c39991899999c3ffe7e7c7e7e7e781ffc399f9f3cf9f81ffc399f9e3f999c3ff',
|
|
'f9f1e19980f9f9ff819f83f9f999c3ffc3999f839999c3ff8199f3e7e7e7e7ff',
|
|
'c39999c39999c3ffc39999c1f999c3ffffffe7ffffe7ffffffffe7ffffe7e7cf',
|
|
'f1e7cf9fcfe7f1ffffff81ff81ffffff8fe7f3f9f3e78fffc399f9f3e7ffe7ff',
|
|
'ffffff0000ffffffe7c39981999999ff83999983999983ffc3999f9f9f99c3ff',
|
|
'87939999999387ff819f9f879f9f81ff819f9f879f9f9fffc3999f919999c3ff',
|
|
'99999981999999ffc3e7e7e7e7e7c3ffe1f3f3f3f393c7ff9993878f879399ff',
|
|
'9f9f9f9f9f9f81ff9c8880949c9c9cff99898181919999ffc39999999999c3ff',
|
|
'839999839f9f9fffc399999999c3f1ff83999983879399ffc3999fc3f999c3ff',
|
|
'81e7e7e7e7e7e7ff999999999999c3ff9999999999c3e7ff9c9c9c9480889cff',
|
|
'9999c3e7c39999ff999999c3e7e7e7ff81f9f3e7cf9f81ffe7e7e70000e7e7e7',
|
|
'3f3fcfcf3f3fcfcfe7e7e7e7e7e7e7e7cccc3333cccc3333cc663399cc663399',
|
|
'ffffffffffffffff0f0f0f0f0f0f0f0fffffffff0000000000ffffffffffffff',
|
|
'ffffffffffffff003f3f3f3f3f3f3f3f3333cccc3333ccccfcfcfcfcfcfcfcfc',
|
|
'ffffffff3333cccc3366cc993366cc99fcfcfcfcfcfcfcfce7e7e7e0e0e7e7e7',
|
|
'fffffffff0f0f0f0e7e7e7e0e0ffffffffffff0707e7e7e7ffffffffffff0000',
|
|
'ffffffe0e0e7e7e7e7e7e70000ffffffffffff0000e7e7e7e7e7e70707e7e7e7',
|
|
'3f3f3f3f3f3f3f3f1f1f1f1f1f1f1f1ff8f8f8f8f8f8f8f80000ffffffffffff',
|
|
'000000ffffffffffffffffffff000000fefcf993878f9fffffffffff0f0f0f0f',
|
|
'f0f0f0f0ffffffffe7e7e70707ffffff0f0f0f0fffffffff0f0f0f0ff0f0f0f0'
|
|
].join('')
|
|
};
|
|
});
|