One canvas to rule them all.
This commit is contained in:
parent
c02ea762d8
commit
566630920f
|
@ -49,7 +49,7 @@
|
|||
<script type="text/javascript" src="js/ram.js"></script>
|
||||
<script type="text/javascript" src="js/applesoft/decompiler.js"></script>
|
||||
<script type="text/javascript" src="js/intbasic/decompiler.js"></script>
|
||||
<script type="text/javascript" src="js/canvas2.js"></script>
|
||||
<script type="text/javascript" src="js/canvas.js"></script>
|
||||
<script type="text/javascript" src="js/apple2io.js"></script>
|
||||
<script type="text/javascript" src="js/cards/langcard.js"></script>
|
||||
<script type="text/javascript" src="js/cards/parallel.js"></script>
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
<script type="text/javascript" src="js/mmu.js"></script>
|
||||
<script type="text/javascript" src="js/applesoft/decompiler.js"></script>
|
||||
<script type="text/javascript" src="js/intbasic/decompiler.js"></script>
|
||||
<script type="text/javascript" src="js/canvas2e.js"></script>
|
||||
<script type="text/javascript" src="js/canvas.js"></script>
|
||||
<script type="text/javascript" src="js/apple2io.js"></script>
|
||||
<script type="text/javascript" src="js/cards/parallel.js"></script>
|
||||
<script type="text/javascript" src="js/cards/disk2.js"></script>
|
||||
|
|
|
@ -36,7 +36,7 @@ var scanlines = false;
|
|||
*
|
||||
***************************************************************************/
|
||||
|
||||
function LoresPage(page, charset, context)
|
||||
function LoresPage(page, charset, e, context)
|
||||
{
|
||||
'use strict';
|
||||
|
||||
|
@ -119,12 +119,6 @@ function LoresPage(page, charset, context)
|
|||
_init();
|
||||
|
||||
return {
|
||||
start: function() {
|
||||
var self = this;
|
||||
window.setInterval(function() {
|
||||
self.blink();
|
||||
}, 267);
|
||||
},
|
||||
bank0: function() {
|
||||
var self = this;
|
||||
return {
|
||||
|
@ -189,19 +183,29 @@ function LoresPage(page, charset, context)
|
|||
// 000001cd eabab000 -> 000abcde
|
||||
var ab = (adj & 0x18),
|
||||
cd = (page & 0x03) << 1,
|
||||
e = adj >> 7;
|
||||
ee = adj >> 7;
|
||||
var idx, jdx;
|
||||
var row = ab | cd | e;
|
||||
var row = ab | cd | ee;
|
||||
var b;
|
||||
|
||||
var data = _imageData.data;
|
||||
if ((row < 24) && (col < 40)) {
|
||||
var color;
|
||||
if (textMode || hiresMode || (mixedMode && row > 19)) {
|
||||
var flash = ((val & 0xc0) == 0x40) &&
|
||||
_blink && !_80colMode && !altCharMode;
|
||||
fore = flash ? _black : (_greenMode ? _green : _white);
|
||||
back = flash ? (_greenMode ? _green : _white) : _black;
|
||||
if (e) {
|
||||
var flash = ((val & 0xc0) == 0x40) &&
|
||||
_blink && !_80colMode && !altCharMode;
|
||||
fore = flash ? _black : (_greenMode ? _green : _white);
|
||||
back = flash ? (_greenMode ? _green : _white) : _black;
|
||||
} else {
|
||||
if (val & 0x80 || ((val & 0x40) && _blink)) {
|
||||
fore = _greenMode ? _green : _white;
|
||||
back = _black;
|
||||
} else {
|
||||
fore = _black;
|
||||
back = _greenMode ? _green : _white;
|
||||
}
|
||||
}
|
||||
|
||||
if (_80colMode) {
|
||||
if (!enhanced) {
|
||||
|
@ -238,15 +242,29 @@ function LoresPage(page, charset, context)
|
|||
back = _colors[_buffer[1][base] & 0x0f];
|
||||
}
|
||||
|
||||
for (jdx = 0; jdx < 8; jdx++) {
|
||||
b = charset[val * 8 + jdx];
|
||||
for (idx = 0; idx < 7; idx++) {
|
||||
color = (b & 0x01) ? back : fore;
|
||||
_drawPixel(data, off, color);
|
||||
b >>= 1;
|
||||
off += 8;
|
||||
if (e) {
|
||||
for (jdx = 0; jdx < 8; jdx++) {
|
||||
b = charset[val * 8 + jdx];
|
||||
for (idx = 0; idx < 7; idx++) {
|
||||
color = (b & 0x01) ? back : fore;
|
||||
_drawPixel(data, off, color);
|
||||
b >>= 1;
|
||||
off += 8;
|
||||
}
|
||||
off += 546 * 4 + 560 * 4;
|
||||
}
|
||||
} else {
|
||||
for (jdx = 0; jdx < 8; jdx++) {
|
||||
b = charset[val * 8 + jdx];
|
||||
b <<= 1;
|
||||
for (idx = 0; idx < 7; idx++) {
|
||||
color = (b & 0x80) ? fore : back;
|
||||
_drawPixel(data, off, color);
|
||||
b <<= 1;
|
||||
off += 8;
|
||||
}
|
||||
off += 546 * 4 + 560 * 4;
|
||||
}
|
||||
off += 546 * 4 + 560 * 4;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -275,7 +293,7 @@ function LoresPage(page, charset, context)
|
|||
}
|
||||
for (jdx = 0; jdx < 8; jdx++) {
|
||||
color = _colors[(jdx < 4) ?
|
||||
(val & 0x0f) : (val >> 4)];
|
||||
(val & 0x0f) : (val >> 4)];
|
||||
for (idx = 0; idx < 7; idx++) {
|
||||
_drawHalfPixel(data, off, color);
|
||||
off += 4;
|
||||
|
@ -306,8 +324,7 @@ function LoresPage(page, charset, context)
|
|||
}
|
||||
} else {
|
||||
for (jdx = 0; jdx < 8; jdx++) {
|
||||
color = _colors[(jdx < 4) ?
|
||||
(val & 0x0f) : (val >> 4)];
|
||||
color = _colors[(jdx < 4) ? (val & 0x0f) : (val >> 4)];
|
||||
for (idx = 0; idx < 7; idx++) {
|
||||
_drawPixel(data, off, color);
|
||||
off += 8;
|
||||
|
@ -355,6 +372,22 @@ function LoresPage(page, charset, context)
|
|||
context.putImageData(_imageData, 0, 0, 0, 0, 560, 384);
|
||||
}
|
||||
},
|
||||
start: function() {
|
||||
var self = this;
|
||||
setInterval(function() {
|
||||
self.blink();
|
||||
}, 267);
|
||||
return this._start();
|
||||
},
|
||||
end: function() {
|
||||
return this._end();
|
||||
},
|
||||
read: function(page, off) {
|
||||
return this._read(page, off, 0);
|
||||
},
|
||||
write: function(page, off, val) {
|
||||
return this._write(page, off, val, 0);
|
||||
},
|
||||
getState: function() {
|
||||
return {
|
||||
page: _page,
|
||||
|
@ -767,6 +800,18 @@ function HiresPage(page, context)
|
|||
context.putImageData(_imageData, 0, 0, 0, 0, 560, 384);
|
||||
}
|
||||
},
|
||||
start: function() {
|
||||
return this._start();
|
||||
},
|
||||
end: function() {
|
||||
return this._end();
|
||||
},
|
||||
read: function(page, off) {
|
||||
return this._read(page, off, 0);
|
||||
},
|
||||
write: function(page, off, val) {
|
||||
return this._write(page, off, val, 0);
|
||||
},
|
||||
getState: function() {
|
||||
return {
|
||||
page: _page,
|
||||
|
@ -788,7 +833,7 @@ function HiresPage(page, context)
|
|||
};
|
||||
}
|
||||
|
||||
function VideoModes(gr, hgr, gr2, hgr2) {
|
||||
function VideoModes(gr, hgr, gr2, hgr2, e) {
|
||||
var _grs = [gr, gr2];
|
||||
var _hgrs = [hgr, hgr2];
|
||||
var _seq = '';
|
||||
|
@ -836,6 +881,7 @@ function VideoModes(gr, hgr, gr2, hgr2) {
|
|||
}
|
||||
},
|
||||
_80col: function(on) {
|
||||
if (!e) { return; }
|
||||
var old = _80colMode;
|
||||
_80colMode = on;
|
||||
|
||||
|
@ -848,6 +894,7 @@ function VideoModes(gr, hgr, gr2, hgr2) {
|
|||
}
|
||||
},
|
||||
altchar: function(on) {
|
||||
if (!e) { return; }
|
||||
var old = altCharMode;
|
||||
altCharMode = on;
|
||||
if (old != on) {
|
||||
|
@ -867,6 +914,7 @@ function VideoModes(gr, hgr, gr2, hgr2) {
|
|||
}
|
||||
},
|
||||
doublehires: function(on) {
|
||||
if (!e) { return; }
|
||||
var old = doubleHiresMode;
|
||||
doubleHiresMode = on;
|
||||
|
499
js/canvas2.js
499
js/canvas2.js
|
@ -1,499 +0,0 @@
|
|||
/* Copyright 2010-2016 Will Scullin <scullin@scullinsteel.com>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that
|
||||
* copyright notice and this permission notice appear in supporting
|
||||
* documentation. No representations are made about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express or
|
||||
* implied warranty.
|
||||
*/
|
||||
|
||||
/*globals allocMemPages: false,
|
||||
base64_encode: false, base64_decode: false */
|
||||
/*exported LoresPage, HiresPage, VideoModes*/
|
||||
|
||||
var textMode = true;
|
||||
var mixedMode = true;
|
||||
var hiresMode = false;
|
||||
var pageMode = 1;
|
||||
var scanlines = false;
|
||||
var multiScreen = false;
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Text/Lores Graphics
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
function LoresPage(page, charset, context)
|
||||
{
|
||||
'use strict';
|
||||
|
||||
// $00-$3F inverse
|
||||
// $40-$7F flashing
|
||||
// $80-$FF normal
|
||||
|
||||
var _page = page;
|
||||
var _imageData;
|
||||
var _buffer = [];
|
||||
var _refreshing = false;
|
||||
var _greenMode = false;
|
||||
var _blink = false;
|
||||
|
||||
var _black = [0x00,0x00,0x00];
|
||||
var _white = [0xff,0xff,0xff];
|
||||
var _green = [0x00,0xff,0x80];
|
||||
|
||||
var _colors = [
|
||||
[0x00,0x00,0x00], // black
|
||||
[0xdd,0x00,0x33], // 0x1 deep red
|
||||
[0x00,0x00,0x99], // 0x2 dark blue
|
||||
[0xdd,0x00,0xdd], // 0x3 purple
|
||||
[0x00,0x77,0x00], // 0x4 dark green
|
||||
[0x55,0x55,0x55], // 0x5 dark gray
|
||||
[0x23,0x22,0xff], // 0x6 medium blue
|
||||
[0x66,0xaa,0xff], // 0x7 light blue
|
||||
[0x88,0x55,0x22], // 0x8 brown
|
||||
[0xff,0x66,0x00], // 0x9 orange
|
||||
[0xaa,0xaa,0xaa], // 0xa light gray
|
||||
[0xff,0x99,0x88], // 0xb pink
|
||||
[0x00,0xdd,0x00], // 0xc green
|
||||
[0xff,0xff,0x00], // 0xd yellow
|
||||
[0x00,0xff,0x99], // 0xe aquamarine
|
||||
[0xff,0xff,0xff] // 0xf white
|
||||
];
|
||||
|
||||
function _init() {
|
||||
var idx;
|
||||
_imageData = context.createImageData(560, 384);
|
||||
for (idx = 0; idx < 560 * 384 * 4; idx++) {
|
||||
_imageData.data[idx] = 0xff;
|
||||
}
|
||||
_buffer = allocMemPages(0x4);
|
||||
}
|
||||
|
||||
function _drawPixel(data, off, color) {
|
||||
var c0 = color[0], c1 = color[1], c2 = color[2];
|
||||
data[off + 0] = data[off + 4] = c0;
|
||||
data[off + 1] = data[off + 5] = c1;
|
||||
data[off + 2] = data[off + 6] = c2;
|
||||
if (!scanlines) {
|
||||
data[off + 560 * 4] = data[off + 560 * 4 + 4] = c0;
|
||||
data[off + 560 * 4 + 1] = data[off + 560 * 4 + 5] = c1;
|
||||
data[off + 560 * 4 + 2] = data[off + 560 * 4 + 6] = c2;
|
||||
} else {
|
||||
data[off + 560 * 4] = data[off + 560 * 4 + 4] = c0 >> 1;
|
||||
data[off + 560 * 4 + 1] = data[off + 560 * 4 + 5] = c1 >> 1;
|
||||
data[off + 560 * 4 + 2] = data[off + 560 * 4 + 6] = c2 >> 1;
|
||||
}
|
||||
}
|
||||
|
||||
function _drawHalfPixel(data, off, color) {
|
||||
var c0 = color[0], c1 = color[1], c2 = color[2];
|
||||
data[off + 0] = c0;
|
||||
data[off + 1] = c1;
|
||||
data[off + 2] = c2;
|
||||
if (!scanlines) {
|
||||
data[off + 560 * 4] = c0;
|
||||
data[off + 560 * 4 + 1] = c1;
|
||||
data[off + 560 * 4 + 2] = c2;
|
||||
} else {
|
||||
data[off + 560 * 4] = c0 >> 1;
|
||||
data[off + 560 * 4 + 1] = c1 >> 1;
|
||||
data[off + 560 * 4 + 2] = c2 >> 1;
|
||||
}
|
||||
}
|
||||
|
||||
_init();
|
||||
|
||||
return {
|
||||
start: function() {
|
||||
var self = this;
|
||||
window.setInterval(function() {
|
||||
self.blink();
|
||||
}, 267);
|
||||
return (0x04 * _page);
|
||||
},
|
||||
end: function() { return (0x04 * _page) + 0x03; },
|
||||
read: function(page, off) {
|
||||
var addr = (page << 8) | off,
|
||||
base = addr - 0x400 * _page;
|
||||
return _buffer[base];
|
||||
},
|
||||
write: function(page, off, val) {
|
||||
var addr = (page << 8) | off,
|
||||
base = addr - 0x400 * _page;
|
||||
|
||||
if (_buffer[base] === val && !_refreshing)
|
||||
return;
|
||||
_buffer[base] = val;
|
||||
|
||||
var col = (base % 0x80) % 0x28,
|
||||
adj = off - col;
|
||||
|
||||
// 000001cd eabab000 -> 000abcde
|
||||
var ab = (adj & 0x18),
|
||||
cd = (page & 0x03) << 1,
|
||||
e = adj >> 7;
|
||||
|
||||
var row = ab | cd | e, color, idx, jdx, b;
|
||||
|
||||
if ((row < 24) && (col < 40)) {
|
||||
var data = _imageData.data, fore, back;
|
||||
off = (col * 14 + row * 560 * 8 * 2) * 4;
|
||||
|
||||
if (textMode || hiresMode || (mixedMode && row > 19)) {
|
||||
if (val & 0x80 || ((val & 0x40) && _blink)) {
|
||||
fore = _greenMode ? _green : _white;
|
||||
back = _black;
|
||||
} else {
|
||||
fore = _black;
|
||||
back = _greenMode ? _green : _white;
|
||||
}
|
||||
for (jdx = 0; jdx < 8; jdx++) {
|
||||
b = charset[val * 8 + jdx];
|
||||
b <<= 1;
|
||||
for (idx = 0; idx < 7; idx++) {
|
||||
color = (b & 0x80) ? fore : back;
|
||||
_drawPixel(data, off, color);
|
||||
b <<= 1;
|
||||
off += 8;
|
||||
}
|
||||
off += 546 * 4 + 560 * 4;
|
||||
}
|
||||
} else {
|
||||
if (_greenMode) {
|
||||
fore = _green;
|
||||
back = _black;
|
||||
for (jdx = 0; jdx < 8; jdx++) {
|
||||
b = (jdx < 4) ? (val & 0x0f) : (val >> 4);
|
||||
b |= (b << 4);
|
||||
b |= (b << 8);
|
||||
if ((col & 0x1) !== 0) {
|
||||
b <<= 2;
|
||||
}
|
||||
for (idx = 0; idx < 14; idx++) {
|
||||
color = (b & 0x8000) ? fore : back;
|
||||
_drawHalfPixel(data, off, color);
|
||||
b <<= 1;
|
||||
off += 4;
|
||||
}
|
||||
off += 546 * 4 + 560 * 4;
|
||||
}
|
||||
} else {
|
||||
for (jdx = 0; jdx < 8; jdx++) {
|
||||
b = (jdx < 4) ? (val & 0x0f) : (val >> 4);
|
||||
color = _colors[b];
|
||||
for (idx = 0; idx < 7; idx++) {
|
||||
_drawPixel(data, off, color);
|
||||
off += 8;
|
||||
}
|
||||
off += 546 * 4 + 560 * 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
refresh: function() {
|
||||
var addr = 0x400 * _page;
|
||||
_refreshing = true;
|
||||
for (var idx = 0; idx < 0x400; idx++, addr++) {
|
||||
this.write(addr >> 8, addr & 0xff, _buffer[idx]);
|
||||
}
|
||||
_refreshing = false;
|
||||
},
|
||||
blink: function() {
|
||||
var addr = 0x400 * _page;
|
||||
_refreshing = true;
|
||||
_blink = !_blink;
|
||||
for (var idx = 0; idx < 0x400; idx++, addr++) {
|
||||
var b = _buffer[idx];
|
||||
if ((b & 0xC0) == 0x40) {
|
||||
this.write(addr >> 8, addr & 0xff, _buffer[idx]);
|
||||
}
|
||||
}
|
||||
_refreshing = false;
|
||||
},
|
||||
green: function(on) {
|
||||
_greenMode = on;
|
||||
this.refresh();
|
||||
},
|
||||
blit: function(mixed) {
|
||||
if (mixed) {
|
||||
context.putImageData(_imageData, 0, 0, 0, 320, 560, 64);
|
||||
} else {
|
||||
context.putImageData(_imageData, 0, 0, 0, 0, 560, 384);
|
||||
}
|
||||
},
|
||||
getState: function() {
|
||||
return {
|
||||
page: _page,
|
||||
green: _green,
|
||||
buffer: base64_encode(_buffer)
|
||||
};
|
||||
},
|
||||
setState: function(state) {
|
||||
_page = state.page;
|
||||
_green = state.green;
|
||||
_buffer = base64_decode(state.buffer);
|
||||
|
||||
this.refresh();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function HiresPage(page, context)
|
||||
{
|
||||
var _page = page;
|
||||
var _imageData;
|
||||
|
||||
var orangeCol = [0xff, 0x65, 0x00];
|
||||
var greenCol = [0x00, 0xff, 0x00];
|
||||
var blueCol = [0x09, 0x2a, 0xff];
|
||||
var violetCol = [0xc9, 0x39, 0xc7];
|
||||
var whiteCol = [0xff, 0xff, 0xff];
|
||||
var blackCol = [0x00, 0x00, 0x00];
|
||||
|
||||
var _buffer = [];
|
||||
var _refreshing = false;
|
||||
|
||||
var _green = [0x00, 0xff, 0x80];
|
||||
var _greenMode = false;
|
||||
|
||||
function _init() {
|
||||
var idx;
|
||||
_imageData = context.createImageData(560, 384);
|
||||
for (idx = 0; idx < 560 * 384 * 4; idx++) {
|
||||
_imageData.data[idx] = 0xff;
|
||||
}
|
||||
_buffer = allocMemPages(0x20);
|
||||
}
|
||||
|
||||
function _drawPixel(data, off, color) {
|
||||
var c0 = color[0], c1 = color[1], c2 = color[2];
|
||||
|
||||
data[off + 0] = data[off + 4] = c0;
|
||||
data[off + 1] = data[off + 5] = c1;
|
||||
data[off + 2] = data[off + 6] = c2;
|
||||
if (!scanlines) {
|
||||
data[off + 560 * 4] = data[off + 560 * 4 + 4] = c0;
|
||||
data[off + 560 * 4 + 1] = data[off + 560 * 4 + 5] = c1;
|
||||
data[off + 560 * 4 + 2] = data[off + 560 * 4 + 6] = c2;
|
||||
} else {
|
||||
data[off + 560 * 4] = data[off + 560 * 4 + 4] = c0 >> 1;
|
||||
data[off + 560 * 4 + 1] = data[off + 560 * 4 + 5] = c1 >> 1;
|
||||
data[off + 560 * 4 + 2] = data[off + 560 * 4 + 6] = c2 >> 1;
|
||||
}
|
||||
}
|
||||
|
||||
_init();
|
||||
|
||||
return {
|
||||
start: function() { return (0x20 * _page); },
|
||||
end: function() { return (0x020 * _page) + 0x1f; },
|
||||
read: function(page, off) {
|
||||
var addr = (page << 8) | off,
|
||||
base = addr - 0x2000 * _page;
|
||||
return _buffer[base];
|
||||
},
|
||||
write: function(page, off, val) {
|
||||
function dim(c) {
|
||||
return [c[0] * 0.75, c[1] * 0.75, c[2] * 0.75];
|
||||
}
|
||||
var addr = (page << 8) | off,
|
||||
base = addr - 0x2000 * _page;
|
||||
if (_buffer[base] === val && !_refreshing)
|
||||
return;
|
||||
_buffer[base] = val;
|
||||
|
||||
var hbs = val & 0x80;
|
||||
val &= 0x7f;
|
||||
|
||||
var col = (base % 0x80) % 0x28,
|
||||
adj = off - col;
|
||||
|
||||
// 000001cd eabab000 -> 000abcde
|
||||
var ab = (adj & 0x18),
|
||||
cd = (page & 0x03) << 1,
|
||||
e = adj >> 7;
|
||||
|
||||
var rowa = ab | cd | e,
|
||||
rowb = base >> 10;
|
||||
|
||||
if ((rowa < 24) && (col < 40)) {
|
||||
var data = _imageData.data,
|
||||
dy = rowa * 8 + rowb,
|
||||
dx = col * 14 - 2,
|
||||
b0 = col > 0 ? _buffer[base - 1] : 0,
|
||||
b2 = col < 39 ? _buffer[base + 1] : 0;
|
||||
val |= (b2 & 0x3) << 7;
|
||||
var v0 = b0 & 0x20, v1 = b0 & 0x40, v2 = val & 0x1,
|
||||
odd = (col & 0x1) === 0,
|
||||
color,
|
||||
oddCol = (hbs ? orangeCol : greenCol),
|
||||
evenCol = (hbs ? blueCol : violetCol);
|
||||
|
||||
off = dx * 4 + dy * 560 * 4 * 2;
|
||||
for (var idx = 0; idx < 9; idx++, off += 8) {
|
||||
val >>= 1;
|
||||
|
||||
if (v1) {
|
||||
if (_greenMode) {
|
||||
color = _green;
|
||||
} else if (v0 || v2) {
|
||||
color = whiteCol;
|
||||
} else {
|
||||
color = odd ? oddCol : evenCol;
|
||||
}
|
||||
} else {
|
||||
if (_greenMode) {
|
||||
color = blackCol;
|
||||
} else if (odd && v2 && v0) {
|
||||
color = v0 ? dim(evenCol) : evenCol;
|
||||
} else if (!odd && v0 && v2) {
|
||||
color = v2 ? dim(oddCol) : oddCol;
|
||||
} else {
|
||||
color = blackCol;
|
||||
}
|
||||
}
|
||||
|
||||
if (dx > -1 && dx < 560) {
|
||||
_drawPixel(data, off, color);
|
||||
}
|
||||
dx += 2;
|
||||
|
||||
v0 = v1;
|
||||
v1 = v2;
|
||||
v2 = val & 0x01;
|
||||
odd = !odd;
|
||||
}
|
||||
}
|
||||
},
|
||||
refresh: function() {
|
||||
var addr = 0x2000 * _page;
|
||||
_refreshing = true;
|
||||
for (var idx = 0; idx < 0x2000; idx++, addr++) {
|
||||
this.write(addr >> 8, addr & 0xff, _buffer[idx]);
|
||||
}
|
||||
_refreshing = false;
|
||||
},
|
||||
green: function(on) {
|
||||
_greenMode = on;
|
||||
this.refresh();
|
||||
},
|
||||
blit: function(mixed) {
|
||||
if (mixed) {
|
||||
context.putImageData(_imageData, 0, 0, 0, 0, 560, 320);
|
||||
} else {
|
||||
context.putImageData(_imageData, 0, 0, 0, 0, 560, 384);
|
||||
}
|
||||
},
|
||||
getState: function() {
|
||||
return {
|
||||
page: _page,
|
||||
green: _greenMode,
|
||||
buffer: base64_encode(_buffer)
|
||||
};
|
||||
},
|
||||
setState: function(state) {
|
||||
_page = state.page;
|
||||
_greenMode = state.green;
|
||||
_buffer = base64_decode(state.buffer);
|
||||
|
||||
this.refresh();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function VideoModes(gr,hgr,gr2,hgr2) {
|
||||
var _grs = [gr, gr2];
|
||||
var _hgrs = [hgr, hgr2];
|
||||
|
||||
function _refresh() {
|
||||
_grs[0].refresh();
|
||||
_grs[1].refresh();
|
||||
_hgrs[0].refresh();
|
||||
_hgrs[1].refresh();
|
||||
}
|
||||
|
||||
return {
|
||||
refresh: function() {
|
||||
_refresh();
|
||||
},
|
||||
text: function(on) {
|
||||
var old = textMode;
|
||||
textMode = on;
|
||||
if (old != on) {
|
||||
_refresh();
|
||||
}
|
||||
},
|
||||
hires: function(on) {
|
||||
var old = hiresMode;
|
||||
hiresMode = on;
|
||||
if (old != on) {
|
||||
_refresh();
|
||||
}
|
||||
},
|
||||
mixed: function(on) {
|
||||
var old = mixedMode;
|
||||
mixedMode = on;
|
||||
if (old != on) {
|
||||
_refresh();
|
||||
}
|
||||
},
|
||||
page: function(pageNo) {
|
||||
pageMode = pageNo;
|
||||
},
|
||||
blit: function() {
|
||||
if (multiScreen) {
|
||||
_grs[0].blit();
|
||||
_grs[1].blit();
|
||||
_hgrs[0].blit();
|
||||
_hgrs[1].blit();
|
||||
} else {
|
||||
if (hiresMode && !textMode) {
|
||||
if (mixedMode) {
|
||||
_grs[pageMode - 1].blit(true);
|
||||
_hgrs[pageMode - 1].blit(true);
|
||||
} else {
|
||||
_hgrs[pageMode - 1].blit();
|
||||
}
|
||||
} else {
|
||||
_grs[pageMode - 1].blit();
|
||||
}
|
||||
}
|
||||
},
|
||||
getState: function() {
|
||||
return {
|
||||
grs: [_grs[0].getState(), _grs[1].getState()],
|
||||
hgrs: [_hgrs[0].getState(), _hgrs[1].getState()],
|
||||
textMode: textMode,
|
||||
mixedMode: mixedMode,
|
||||
hiresMode: hiresMode,
|
||||
pageMode: pageMode
|
||||
};
|
||||
},
|
||||
setState: function(state) {
|
||||
textMode = state.textMode;
|
||||
mixedMode = state.mixedMode;
|
||||
hiresMode = state.hiresMode;
|
||||
pageMode = state.pageMode;
|
||||
|
||||
_grs[0].setState(state.grs[0]);
|
||||
_grs[1].setState(state.grs[1]);
|
||||
_hgrs[0].setState(state.hgrs[0]);
|
||||
_hgrs[1].setState(state.hgrs[1]);
|
||||
},
|
||||
green: function(on) {
|
||||
_grs[0].green(on);
|
||||
_grs[1].green(on);
|
||||
_hgrs[0].green(on);
|
||||
_hgrs[1].green(on);
|
||||
},
|
||||
scanlines: function(on) {
|
||||
scanlines = on;
|
||||
_refresh();
|
||||
}
|
||||
};
|
||||
}
|
|
@ -70,15 +70,15 @@ function DiskII(io, slot, callbacks)
|
|||
DRIVEWRITEMODE: 0x8F // Q7H
|
||||
};
|
||||
|
||||
// var DO = [0x0,0x7,0xE,0x6,0xD,0x5,0xC,0x4,
|
||||
// 0xB,0x3,0xA,0x2,0x9,0x1,0x8,0xF];
|
||||
// var DO = [0x0,0x7,0xE,0x6,0xD,0x5,0xC,0x4,
|
||||
// 0xB,0x3,0xA,0x2,0x9,0x1,0x8,0xF];
|
||||
var _DO = [
|
||||
0x0,0xD,0xB,0x9,0x7,0x5,0x3,0x1,
|
||||
0xE,0xC,0xA,0x8,0x6,0x4,0x2,0xF
|
||||
];
|
||||
|
||||
// var PO = [0x0,0x8,0x1,0x9,0x2,0xa,0x3,0xb,
|
||||
// 0x4,0xc,0x5,0xd,0x6,0xe,0x7,0xf];
|
||||
// var PO = [0x0,0x8,0x1,0x9,0x2,0xa,0x3,0xb,
|
||||
// 0x4,0xc,0x5,0xd,0x6,0xe,0x7,0xf];
|
||||
var _PO = [
|
||||
0x0,0x2,0x4,0x6,0x8,0xa,0xc,0xe,
|
||||
0x1,0x3,0x5,0x7,0x9,0xb,0xd,0xf
|
||||
|
@ -130,7 +130,7 @@ function DiskII(io, slot, callbacks)
|
|||
];
|
||||
|
||||
function _debug() {
|
||||
console.log.apply(this, arguments);
|
||||
// console.log.apply(this, arguments);
|
||||
}
|
||||
|
||||
function _init() {
|
||||
|
@ -507,9 +507,9 @@ function DiskII(io, slot, callbacks)
|
|||
}
|
||||
|
||||
var _phase_delta = [[ 0, 1, 2,-1],
|
||||
[-1, 0, 1, 2],
|
||||
[-2,-1, 0, 1],
|
||||
[ 1,-2,-1, 0]];
|
||||
[-1, 0, 1, 2],
|
||||
[-2,-1, 0, 1],
|
||||
[ 1,-2,-1, 0]];
|
||||
|
||||
function setPhase(phase, on) {
|
||||
// _debug('phase ' + phase + (on ? ' on' : ' off'));
|
||||
|
@ -670,7 +670,7 @@ function DiskII(io, slot, callbacks)
|
|||
0xc8,0xd0,0xee,0xe6,0x27,0xe6,0x3d,0xa5,
|
||||
0x3d,0xcd,0x00,0x08,0xa6,0x2b,0x90,0xdb,
|
||||
0x4c,0x01,0x08,0x00,0x00,0x00,0x00,0x00 ];
|
||||
/*
|
||||
/*
|
||||
var diskII_13 = [
|
||||
0xa2,0x20,0xa0,0x00,0xa9,0x03,0x85,0x3c,
|
||||
0x18,0x88,0x98,0x24,0x3c,0xf0,0xf5,0x26,
|
||||
|
|
39
js/main2.js
39
js/main2.js
|
@ -28,7 +28,8 @@
|
|||
pauseRun, step,
|
||||
restoreState, saveState,
|
||||
dumpProgram, PageDebug,
|
||||
multiScreen
|
||||
multiScreen,
|
||||
enhanced
|
||||
*/
|
||||
|
||||
var kHz = 1023;
|
||||
|
@ -91,9 +92,12 @@ function DriveLights()
|
|||
{
|
||||
return {
|
||||
driveLight: function(drive, on) {
|
||||
$('#disk' + drive).css('background-image',
|
||||
on ? 'url(css/red-on-16.png)' :
|
||||
'url(css/red-off-16.png)');
|
||||
$('#disk' + drive).css(
|
||||
'background-image',
|
||||
on ?
|
||||
'url(css/red-on-16.png)' :
|
||||
'url(css/red-off-16.png)'
|
||||
);
|
||||
},
|
||||
dirty: function() {
|
||||
// $('#disksave' + drive).button('option', 'disabled', !dirty);
|
||||
|
@ -330,7 +334,7 @@ function doLoadHTTP(drive, _url) {
|
|||
req.responseType = 'arraybuffer';
|
||||
|
||||
req.onload = function() {
|
||||
var parts = url.split(/[\/\.]/);
|
||||
var parts = url.split(/[/.]/);
|
||||
var name = decodeURIComponent(parts[parts.length - 2]);
|
||||
var ext = parts[parts.length - 1].toLowerCase();
|
||||
if (disk2.setBinary(drive, name, ext, req.response)) {
|
||||
|
@ -381,6 +385,7 @@ if (canvas4) {
|
|||
}
|
||||
|
||||
var romVersion = prefs.readPref('computer_type2');
|
||||
var enhanced = false;
|
||||
var rom;
|
||||
var char_rom = apple2_charset;
|
||||
switch (romVersion) {
|
||||
|
@ -406,8 +411,8 @@ default:
|
|||
rom = new Apple2ROM();
|
||||
}
|
||||
|
||||
var gr = new LoresPage(1, char_rom, context1);
|
||||
var gr2 = new LoresPage(2, char_rom, context2);
|
||||
var gr = new LoresPage(1, char_rom, false, context1);
|
||||
var gr2 = new LoresPage(2, char_rom, false, context2);
|
||||
var hgr = new HiresPage(1, context3);
|
||||
var hgr2 = new HiresPage(2, context4);
|
||||
|
||||
|
@ -416,7 +421,7 @@ var ram1 = new RAM(0x00, 0x03),
|
|||
ram3 = new RAM(0x60, 0xBF);
|
||||
|
||||
|
||||
var vm = new VideoModes(gr, hgr, gr2, hgr2);
|
||||
var vm = new VideoModes(gr, hgr, gr2, hgr2, false);
|
||||
var dumper = new ApplesoftDump(cpu);
|
||||
|
||||
var drivelights = new DriveLights();
|
||||
|
@ -942,17 +947,17 @@ $(function() {
|
|||
}
|
||||
evt.preventDefault();
|
||||
})
|
||||
.mouseup(function(evt) {
|
||||
if (!gamepad) {
|
||||
io.buttonUp(evt.which == 1 ? 0 : 1);
|
||||
}
|
||||
})
|
||||
.bind('contextmenu', function(evt) { evt.preventDefault(); });
|
||||
.mouseup(function(evt) {
|
||||
if (!gamepad) {
|
||||
io.buttonUp(evt.which == 1 ? 0 : 1);
|
||||
}
|
||||
})
|
||||
.bind('contextmenu', function(evt) { evt.preventDefault(); });
|
||||
|
||||
$('body').mousemove(_mousemove);
|
||||
|
||||
$('input,textarea').focus(function() { focused = true; })
|
||||
.blur(function() { focused = false; });
|
||||
.blur(function() { focused = false; });
|
||||
|
||||
keyboard.create($('#keyboard'));
|
||||
|
||||
|
@ -973,9 +978,7 @@ $(function() {
|
|||
});
|
||||
}
|
||||
|
||||
if (romVersion != 'original') {
|
||||
reset();
|
||||
}
|
||||
reset();
|
||||
run();
|
||||
setInterval(updateKHz, 1000);
|
||||
updateSound();
|
||||
|
|
28
js/main2e.js
28
js/main2e.js
|
@ -89,8 +89,8 @@ function DriveLights()
|
|||
return {
|
||||
driveLight: function(drive, on) {
|
||||
$('#disk' + drive).css('background-image',
|
||||
on ? 'url(css/red-on-16.png)' :
|
||||
'url(css/red-off-16.png)');
|
||||
on ? 'url(css/red-on-16.png)' :
|
||||
'url(css/red-off-16.png)');
|
||||
},
|
||||
dirty: function() {
|
||||
// $('#disksave' + drive).button('option', 'disabled', !dirty);
|
||||
|
@ -327,7 +327,7 @@ function doLoadHTTP(drive, _url) {
|
|||
req.responseType = 'arraybuffer';
|
||||
|
||||
req.onload = function() {
|
||||
var parts = url.split(/[\/\.]/);
|
||||
var parts = url.split(/[/.]/);
|
||||
var name = decodeURIComponent(parts[parts.length - 2]);
|
||||
var ext = parts[parts.length - 1].toLowerCase();
|
||||
if (req.response.byteLength >= 400 * 1024) {
|
||||
|
@ -401,12 +401,12 @@ if (canvas4) {
|
|||
context4 = context1;
|
||||
}
|
||||
|
||||
var gr = new LoresPage(1, char_rom, context1);
|
||||
var gr2 = new LoresPage(2, char_rom, context2);
|
||||
var gr = new LoresPage(1, char_rom, true, context1);
|
||||
var gr2 = new LoresPage(2, char_rom, true, context2);
|
||||
var hgr = new HiresPage(1, context3);
|
||||
var hgr2 = new HiresPage(2, context4);
|
||||
|
||||
var vm = new VideoModes(gr, hgr, gr2, hgr2);
|
||||
var vm = new VideoModes(gr, hgr, gr2, hgr2, true);
|
||||
var dumper = new ApplesoftDump(cpu);
|
||||
|
||||
var drivelights = new DriveLights();
|
||||
|
@ -919,20 +919,20 @@ $(function() {
|
|||
}
|
||||
evt.preventDefault();
|
||||
})
|
||||
.mouseup(function(evt) {
|
||||
if (!gamepad) {
|
||||
io.buttonUp(evt.which == 1 ? 0 : 1);
|
||||
}
|
||||
})
|
||||
.bind('contextmenu', function(evt) { evt.preventDefault(); });
|
||||
.mouseup(function(evt) {
|
||||
if (!gamepad) {
|
||||
io.buttonUp(evt.which == 1 ? 0 : 1);
|
||||
}
|
||||
})
|
||||
.bind('contextmenu', function(evt) { evt.preventDefault(); });
|
||||
|
||||
$('body').mousemove(_mousemove);
|
||||
|
||||
$('body > div').hover(function() { focused = false; },
|
||||
function() { focused = true; });
|
||||
function() { focused = true; });
|
||||
|
||||
$('input,textarea').focus(function() { focused = true; })
|
||||
.blur(function() { focused = false; });
|
||||
.blur(function() { focused = false; });
|
||||
|
||||
keyboard.create($('#keyboard'));
|
||||
|
||||
|
|
Loading…
Reference in New Issue