i8257+i8275
Real Fast Simulation
by Ruslan Alikberov
HTML
<body onload='main()'>
DMA Cycles : <input type=number min=1170 max=2340 value=2340 onchange='i8257_regs.counter = this.value'> <-- Change here<br />
<canvas id=TheScreen width=480 height=512></canvas><br />
<canvas id=TheVisual75 width=960 height=1024></canvas><br />
<canvas id=TheScreen75 width=960 height=1024></canvas><br />
<canvas id=TheFonts width=1536 height=8></canvas><br />
<var id=Table_KOI7>
0000 FF FF FF FF FF FF FF FF C7 C7 C7 C7 FF FF FF FF
0010 F8 F8 F8 F8 FF FF FF FF C0 C0 C0 C0 FF FF FF FF
0020 FF FF FF FF F8 F8 F8 F8 C7 C7 C7 C7 F8 F8 F8 F8
0030 F8 F8 F8 F8 F8 F8 F8 F8 C0 C0 C0 C0 F8 F8 F8 F8
0040 FF FF FF FF FF FF FF FF F3 F3 C0 D2 F3 F3 ED DE
0050 FF FF FF FF FF FF FF FF F3 E1 C0 F3 F3 F3 F3 F3
0060 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0070 F7 F3 D1 C0 C0 D1 F3 F7 F3 F3 F3 F3 F3 C0 E1 F3
0080 FF FF FF FF C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7 C7
0090 F8 F8 F8 F8 C7 C7 C7 C7 C0 C0 C0 C0 C7 C7 C7 C7
00A0 FF FF FF FF C0 C0 C0 C0 C7 C7 C7 C7 C0 C0 C0 C0
00B0 F8 F8 F8 F8 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0
00C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
00D0 FF FF FF FF FF FF FF FF F3 F3 F3 F3 F3 F3 F3 F3
00E0 FF FF FF C0 C0 FF FF FF FB F3 E2 C0 C0 E2 F3 FB
00F0 C7 DF DF D8 C2 FA FA FA FF FF FF FF FF FF FF FF
0100 FF FF FF FF FF FF FF FF FB FB FB FB FB FF FB FF
0110 F5 F5 F5 FF FF FF FF FF F5 F5 E0 F5 E0 F5 F5 FF
0120 FB F0 EB F1 FA E1 FB FF E7 E6 FD FB F7 EC FC FF
0130 FB F5 F5 F3 EA ED F2 FF F9 F9 FD FB FF FF FF FF
0140 FD FB F7 F7 F7 FB FD FF F7 FB FD FD FD FB F7 FF
0150 FF FB EA F1 EA FB FF FF FF FB FB E0 FB FB FF FF
0160 FF FF FF F3 F3 FB F7 FF FF FF FF E0 FF FF FF FF
0170 FF FF FF FF FF F3 F3 FF FF FE FD FB F7 EF FF FF
0180 F1 EE EC EA E6 EE F1 FF FB F3 FB FB FB FB F1 FF
0190 F1 EE FE F9 F7 EF E0 FF E0 FE FD F9 FE EE F1 FF
01A0 FD F9 F5 ED E0 FD FD FF E0 EF E1 FE FE EE F1 FF
01B0 F8 F7 EF E1 EE EE F1 FF E0 FE FD FB F7 F7 F7 FF
01C0 F1 EE EE F1 EE EE F1 FF F1 EE EE F0 FE FD E3 FF
01D0 FF F3 F3 FF FF F3 F3 FF F3 F3 FF F3 F3 FB F7...
CSS
var
{
display :none;
}
JavaScript
var hCnvScreen = null; // User outer screen
var hCnvScreen75 = null; // Buffered screen
var hCnvVisual75 = null; // Scrolled view
var hCnvFonts = null; // Fonts buffer
var hCtxScreen = null; // User context
var hCtxScreen75 = null; // i8275 context
var hCtxVisual75 = null; // i8275 clipper
var hCtxFonts = null; // Fonts context
//
var i8275_regs =
{
video_x :0,
video_y :0,
width :78,
height :30,
lines :8,
shifts :6,
user_x :0,
user_y :0
};
var i8257_regs =
{
counter :78 * 30
};
function
parseFontData(hCtx, source) {
var i, x, y;
var ponter;
var pixels = hCtx.getImageData(0, 0, hCtx.canvas.width, hCtx.canvas.height);
var buffer = pixels.data;
//
source
.split(/\r?\n/) // Данные таблицы разделяем на строки
.forEach
(function(row) {
if(row == "")
return;
row
.split(/\s+/) // Строки таблицы разделяем на столбцы
.forEach
(function(column) {
var data = parseInt(column, 16);
if(column.length != 2)
x = 6 * (data >> 3),
y = 7 & data;
else {
pointer = (y * hCtx.canvas.width + x) * 4;
for(i = 0; i < 6; ++ i, pointer += 4)
buffer[pointer + 0] =
buffer[pointer + 1] =
buffer[pointer + 2] = data & (32 >> i) ? 0x00 : 0xFF,
buffer[pointer + 3] = 0xFF;
++ y;
if(y >= hCtx.canvas.height)
y = 0,
x += 6;
}
});
});
hCtx.putImageData(pixels, 0, 0);
}
function
i8275_write(hCtx, hFonts, data, x, y) {
var dots = i8275_regs.shifts;
var lines = i8275_regs.lines;
var width = i8275_regs.width * 6;
var height = i8275_regs.height * lines;
var ascii, i = 0;
if(isFinite(x)) {
i8275_regs.user_x = x,
i8275_regs.user_y = y;
} else {
x = i8275_regs.user_x,
y = i8275_regs.user_y;
}
//x += i8275_regs.video_x;
//y += i8275_regs.video_y;
do {
ascii = typeof data == "number" ? Number(data) : data.charCodeAt(i ++);
// Выводим один символ четырежды, чтобы создать иллюзию скроллинга от сбоя ПДП-циклов
hCtx.drawImage(hFonts, ascii * dots, 0, dots, lines, x * dots, y *...