update 0.8.2

This commit is contained in:
Rupert Hausberger 2015-01-11 01:43:06 +01:00
commit 210fc0e55d
22 changed files with 198 additions and 356 deletions

View file

@ -30,7 +30,7 @@
<script type="text/javascript" src="sae/cpu.js"></script> <script type="text/javascript" src="sae/cpu.js"></script>
<script type="text/javascript" src="sae/amiga.js"></script> <script type="text/javascript" src="sae/amiga.js"></script>
<script type="text/javascript" src="index.js"></script> <script type="text/javascript" src="index.js"></script>
<script type="text/javascript" src="ga.js"></script> <script type="text/javascript" src="ga.js"></script>
</head> </head>
<body onload="init()"> <body onload="init()">
<div id="base"> <div id="base">
@ -607,8 +607,8 @@
</div> </div>
<div style="height:6px"></div> <div style="height:6px"></div>
<div id="foot" class="foot" style="line-height:14px"> <div id="foot" class="foot" style="line-height:14px">
<span class="gray">2012-2013 Rupert Hausberger</span> | <span class="gray">2012-2015 Rupert Hausberger</span> |
<span class="gray">ver 0.8.1</span> | <span class="gray">ver 0.8.2</span> |
<a target="_blank" href="https://github.com/naTmeg/ScriptedAmigaEmulator">Source-code</a> | <a target="_blank" href="https://github.com/naTmeg/ScriptedAmigaEmulator">Source-code</a> |
<a target="_blank" href="readme.htm">Description</a> <a target="_blank" href="readme.htm">Description</a>
</div> </div>

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
*************************************************************************** ***************************************************************************
* Note: This file does not contain any emulator-code. * Note: This file does not contain any emulator-code.
@ -1030,6 +1029,9 @@ function init() {
} }
} }
function mainStart() {
return SAE({cmd: 'start'});
}
function start() { function start() {
document.body.style.backgroundColor = '#000'; document.body.style.backgroundColor = '#000';
styleDisplayBlock('base', 0); styleDisplayBlock('base', 0);
@ -1055,8 +1057,13 @@ function start() {
if (result.error != SAEE_None) { if (result.error != SAEE_None) {
stop(); stop();
alert(result.message); alert(result.message);
}*/ }*/
SAE({cmd:'start'});
if (BrowserDetect.browser == 'Firefox') { /* Thanks 'dmcoles' */
console.log('Enabling audio-start delay for Firefox...');
setTimeout(mainStart, 50);
} else
mainStart();
} }
function simpleStart2() { function simpleStart2() {

View file

@ -15,46 +15,29 @@
<img src="images/logo.png" alt="Scripted Amiga Emulator" /> <img src="images/logo.png" alt="Scripted Amiga Emulator" />
</div> </div>
<div class="readme"> <div class="readme">
<table> <ul>
<tr> <li><span class="fwb">Requirements</span>
<td> <ul>
<ul> <li>A very fast computer</li>
<li><span class="fwb">Requirements</span> <li>A browser capable of HTML5 with:
<ul> <ul>
<li>A very fast computer</li> <li>WegGL or Canvas 2D <span class="gray">(optional)</span></li>
<li>A browser capable of HTML5 with: <li>WebAudio <span class="gray">(optional)</span></li>
<ul> <li>FileReader <span class="gray">(GUI)</span></li>
<li>WegGL or Canvas 2D <span class="gray">(optional)</span></li> <li>Typed arrays</li>
<li>WebAudio <span class="gray">(optional)</span></li> </ul>
<li>FileReader <span class="gray">(GUI)</span></li> </li>
<li>Typed arrays</li> <li>A ROM:
</ul> <ul>
</li> <li>Amiga Kickstart 1.0-2.05 <span class="gray">(not included for copyright reasons)</span></li>
<li>A ROM: <li>AROS Kickstart <span class="gray">(included)</span></li>
<ul> </ul>
<li>Amiga Kickstart 1.0-2.05 <span class="gray">(not included for copyright reasons)</span></li> </li>
<li>AROS Kickstart <span class="gray">(included)</span></li> <li style="list-style-type:none"><br /></li>
</ul> <li>And a bunch of ADF-files to test <span class="gray">(optional)</span></li>
</li> </ul>
<li style="list-style-type:none"><br /></li> </li>
<li>And a bunch of ADF-files to test <span class="gray">(optional)</span></li> </ul>
</ul>
</li>
</ul>
</td>
<td>
<table>
<tr><td colspan="2"><span class="fwb">Supported browsers</span></td></tr>
<tr><td class="armb" style="color:green">Chrome</td><td>Very fast</td></tr>
<tr><td class="armb" style="color:orange">Firefox</td><td>Medium speed</td></tr>
<tr><td class="armb" style="color:orange">Opera</td><td>Slow speed, no audio</td></tr>
<tr><td class="armb" style="color:red">IE</td><td>No support</td></tr>
<tr><td class="armb">Other</td><td>Untested</td></tr>
</table>
</td>
</tr>
</table>
<div class="hr"></div>
<ul> <ul>
<li><span class="fwb">Goals</span> <li><span class="fwb">Goals</span>
<ul> <ul>
@ -131,80 +114,31 @@
</ul> </ul>
</li> </li>
</ul> </ul>
<!--<div class="hr"></div>
<table>
<tr><td colspan="3" class="acm"><span class="fwb">Fully working...</span></td></tr>
<tr>
<td>
<ul>
<li><span class="fwb">Games</span>
<ul>
<li>Alien Breed</li>
<li>Alien Breed Special Edition 92<span class="fwb"> (0.7)</span></li>
<li>Alien Breed Tower Assault<span class="fwb"> (0.6)</span></li>
<li>Boby Blows Galactic<span class="fwb"> (0.7)</span></li>
<li>Agony<span class="fwb"> (0.6.1)</span></li>
<li>Another World</li>
<li>Barbarian<span class="fwb"> (0.7)</span></li>
<li>Battle Chess</li>
<li>Blood Money</li>
<li>Crystal Hammer</li>
<li>Dynablaster<span class="fwb"> (0.7)</span></li>
<li>Firepower</li>
<li>Lotus Turbo Challenge 1/2<span class="fwb"> (0.6)</span></li>
<li>North'n South<span class="fwb"> (0.7)</span></li>
<li>Pinball Dreams</li>
<li>Pinball Fantasies (the demo with 1 desk)</li>
<li>Prince of Persia<span class="fwb"> (0.7)</span></li>
<li>Project-X<span class="fwb"> (0.7)</span></li>
<li>Project-X Special Edition '92<span class="fwb"> (0.6)</span></li>
<li>P.O.W.</li>
<li>Rubicon<span class="fwb"> (0.6)</span></li>
<li>R-Type 2</li>
<li>Shadow of the Beast 2<span class="fwb"> (0.6)</span></li>
<li>Terminator 2<span class="fwb"> (0.7)</span></li>
<li>Turrican 1/2</li>
<li>Turrican 3<span class="fwb"> (0.6)</span></li>
<li>Wings<span class="fwb"> (0.6)</span></li>
<li>Wings of Death<span class="fwb"> (0.6.1)</span></li>
</ul>
</li>
</ul>
</td>
<td>
<ul>
<li><span class="fwb">Demos</span>
<ul>
<li>Deja Vu</li>
<li>How to skin a cat</li>
<li>Project-X (demo-rolling)<span class="fwb"> (0.6)</span></li>
<li>State of the Art</li>
</ul>
</li>
</ul>
</td>
<td>
<ul>
<li><span class="fwb">Apps</span>
<ul>
<li>Devpak 2.14</li>
<li>DPaint 4.1</li>
<li>Protracker 3.61</li>
<li>SysInfo 3.24</li>
<li>Workbench 1.x</li>
<li>Workbench 2.04<span class="fwb"> (0.6)</span></li>
</ul>
</li>
</ul>
</td>
</tr>
<tr><td colspan="3" class="acm"><span class="fwb">Note:</span> The lists corresponds to Kickstart 1.3</td></tr>
</table>
<div class="hr"></div>-->
<ul> <ul>
<li><span class="fwb">History</span> <li><span class="fwb">History</span>
<ul> <ul>
<li>0.8.1 (19.01.2013): <li><span class="fwb">0.8.2 (10.01.2015)</span>
<ul>
<li>Audio
<ul>
<li>Fixed 'WebAudio'-output. All other dropped. Thanks 'dmcoles'.</li>
<li>Some speed optimizations.</li>
</ul>
</li>
<li>CPU
<ul>
<li>Fixed a bug in the DIVS-function in combination with negative numbers. Thanks 'dmcoles'.</li>
</ul>
</li>
<li>Common
<ul>
<li>Removed old copyright statements in the source files. Thanks 'swinkamor12'.</li>
</ul>
</li>
</ul>
</li>
<li style="list-style-type:none"><br/></li>
<li><span class="fwb">0.8.1 (19.01.2013):</span>
<ul> <ul>
<li>Common <li>Common
<ul> <ul>
@ -216,7 +150,7 @@
</ul> </ul>
</li> </li>
<li style="list-style-type:none"><br/></li> <li style="list-style-type:none"><br/></li>
<li>0.8.0 (16.01.2013): <li><span class="fwb">0.8.0 (16.01.2013):</span>
<ul> <ul>
<li>Display <li>Display
<ul> <ul>
@ -272,7 +206,7 @@
</ul> </ul>
</li> </li>
<li style="list-style-type:none"><br/></li> <li style="list-style-type:none"><br/></li>
<li>0.7.0 (24.12.2012): <li><span class="fwb">0.7.0 (24.12.2012):</span>
<ul> <ul>
<li>Common <li>Common
<ul> <ul>
@ -325,7 +259,7 @@
</ul> </ul>
</li> </li>
<li style="list-style-type:none"><br/></li> <li style="list-style-type:none"><br/></li>
<li>0.6.1 (05.11.2012): <li><span class="fwb">0.6.1 (05.11.2012):</span>
<ul> <ul>
<li>CPU <li>CPU
<ul> <ul>
@ -355,7 +289,7 @@
</ul> </ul>
</li> </li>
<li style="list-style-type:none"><br/></li> <li style="list-style-type:none"><br/></li>
<li>0.6 (25.10.2012): <li><span class="fwb">0.6 (25.10.2012):</span>
<ul> <ul>
<li>ROM <li>ROM
<ul> <ul>
@ -431,7 +365,7 @@
</ul> </ul>
</li> </li>
<li style="list-style-type:none"><br/></li> <li style="list-style-type:none"><br/></li>
<li>0.5 (01.09.2012): <li><span class="fwb">0.5 (01.09.2012):</span>
<ul> <ul>
<li>Initial.</li> <li>Initial.</li>
</ul> </ul>

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
*************************************************************************** ***************************************************************************
* Notes: Ported from WinUAE 2.5.0 * Notes: Ported from WinUAE 2.5.0
@ -380,28 +379,26 @@ function Audi0() {
var driver = { var driver = {
ctx: null, ctx: null,
moz: { src: null,
/*currentWritePosition: 0, node: null,
prebufferSize: 0,
tail: null,
tailPosition: null,*/
interval: null
},
def: {
node: null
},
paused:false paused:false
}; };
var sampleBuffer = { var sampleBuffer = {
size: 0, size: 0,
realSize: 0, data: {
data:0, left: null,
right: null
},
pos: 0, pos: 0,
rpos: 0,
rate: new MAvg(10) rate: new MAvg(10)
}; };
var ringBuffer = { var ringBuffer = {
size: 0, size: 0,
data:0, data: {
left: null,
right: null
},
usage:0, usage:0,
readPos: 0, readPos: 0,
writePos: 0 writePos: 0
@ -411,32 +408,18 @@ function Audi0() {
/*---------------------------------*/ /*---------------------------------*/
//this.init = function() //this.init = function()
{ {
var test; var test;
try { try {
test = new AudioContext(); test = new AudioContext();
if (test && test.createJavaScriptNode) if (test && (test.createJavaScriptNode || test.createScriptProcessor))
this.available |= SAEI_Audio_Default; this.available |= SAEI_Audio_WebAudio;
test = null; test = null;
} catch (e) { } catch (e) {}
try {
test = new webkitAudioContext();
if (test && test.createJavaScriptNode)
this.available |= SAEI_Audio_Webkit;
test = null;
} catch (e) {}
}
try { //console.log(this.available);
test = new Audio();
if (test && test.mozSetup)
this.available |= SAEI_Audio_Mozilla;
test = null;
} catch (e) {}
//console.log(this.available);
} }
/*---------------------------------*/ /*---------------------------------*/
@ -451,7 +434,7 @@ function Audi0() {
} }
} }
this.calc_sample_evtime = function (freq, longframe, linetoggle) { this.calc_sample_evtime = function (hz, longframe, linetoggle) {
var lines = 0.0; var lines = 0.0;
var hpos; var hpos;
@ -466,7 +449,7 @@ function Audi0() {
lines += 1.0; lines += 1.0;
} }
lines += AMIGA.playfield.maxvpos_nom; lines += AMIGA.playfield.maxvpos_nom;
scaled_sample_evtime_orig = Math.floor(hpos * lines * freq * CYCLE_UNIT / getRate(AMIGA.config.audio.rate)); scaled_sample_evtime_orig = Math.floor(hpos * lines * hz / getRate(AMIGA.config.audio.rate) / 4 * CYCLE_UNIT);
scaled_sample_evtime = scaled_sample_evtime_orig; scaled_sample_evtime = scaled_sample_evtime_orig;
/*#if 0 /*#if 0
lines -= AMIGA.playfield.maxvpos_nom; lines -= AMIGA.playfield.maxvpos_nom;
@ -485,12 +468,8 @@ function Audi0() {
return; return;
if (driver.ctx === null) { if (driver.ctx === null) {
if (this.available & SAEI_Audio_Default) if (this.available & SAEI_Audio_WebAudio)
driver.ctx = new AudioContext(); driver.ctx = new AudioContext();
else if (this.available & SAEI_Audio_Webkit)
driver.ctx = new webkitAudioContext();
else if (this.available & SAEI_Audio_Mozilla)
driver.ctx = new Audio();
} }
if (driver.ctx === null) { if (driver.ctx === null) {
if (confirm('Can\'t initialise WebAudio. Continue without audio-playback?')) { if (confirm('Can\'t initialise WebAudio. Continue without audio-playback?')) {
@ -500,50 +479,45 @@ function Audi0() {
Fatal(SAEE_Audio_WebAudio_Not_Avail, null); Fatal(SAEE_Audio_WebAudio_Not_Avail, null);
} }
this.filter.setup(AMIGA.config.audio.filter); this.filter.setup(AMIGA.config.audio.filter); /* A500 lowpass-filter */
/* A500 lowpass-filter */
var hz = AMIGA.config.video.ntsc ? 60 : 50; var hz = AMIGA.config.video.ntsc ? 60 : 50;
this.calc_sample_evtime(hz, 1, AMIGA.config.video.ntsc); this.calc_sample_evtime(hz, 1, AMIGA.config.video.ntsc);
sampleBuffer.size = SAMPLE_BUFFER_SIZE; sampleBuffer.size = SAMPLE_BUFFER_SIZE;
sampleBuffer.realSize = sampleBuffer.size << 1; sampleBuffer.data.left = new Float32Array(sampleBuffer.size);
sampleBuffer.data = new Float32Array(sampleBuffer.realSize << (AMIGA.config.audio.channels - 1)); if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo)
sampleBuffer.data.right = new Float32Array(sampleBuffer.size);
ringBuffer.size = sampleBuffer.size + (sampleBuffer.size >> 1); ringBuffer.size = sampleBuffer.size + (sampleBuffer.size >> 1);
ringBuffer.data = new Float32Array(ringBuffer.size << (AMIGA.config.audio.channels - 1)); ringBuffer.data.left = new Float32Array(ringBuffer.size);
if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo)
ringBuffer.data.right = new Float32Array(ringBuffer.size);
if (this.available & SAEI_Audio_WebAudio) {
var inputs = BrowserDetect.browser == 'Safari' ? 1 : 0;
if (driver.ctx.createJavaScriptNode)
driver.node = driver.ctx.createJavaScriptNode(sampleBuffer.size, inputs, AMIGA.config.audio.channels);
else if (driver.ctx.createScriptProcessor)
driver.node = driver.ctx.createScriptProcessor(sampleBuffer.size, inputs, AMIGA.config.audio.channels);
if ((this.available & SAEI_Audio_Default) || (this.available & SAEI_Audio_Webkit)) { if (driver.node) {
var inputs = BrowserDetect.browser == 'Safari' ? 1 : 0; driver.node.onaudioprocess = fillWebAudio;
//if (inputs == 1) BUG.info('Audio.setup() Safari fix enabled.'); driver.node.connect(driver.ctx.destination);
BUG.info('Audio.setup() enabled WebAudio, channels %d, rate %d', AMIGA.config.audio.channels, getRate(AMIGA.config.audio.rate));
driver.def.node = driver.ctx.createJavaScriptNode(sampleBuffer.size, inputs, AMIGA.config.audio.channels); }
driver.def.node.onaudioprocess = defFill; }
driver.def.node.connect(driver.ctx.destination);
BUG.info('Audio.setup() enabled webkit audio, channels %d, rate %d', AMIGA.config.audio.channels, getRate(AMIGA.config.audio.rate));
}
else if (this.available & SAEI_Audio_Mozilla) {
driver.ctx.mozSetup(AMIGA.config.audio.channels, getRate(AMIGA.config.audio.rate));
/*driver.moz.currentWritePosition = 0;
driver.moz.prebufferSize = getRate(AMIGA.config.audio.rate) >> 1; //prebuffer 500ms
driver.moz.tail = null;*/
//driver.moz.interval = setInterval(mozHandler, Math.floor(1000 / (getRate(AMIGA.config.audio.rate) / sampleBuffer.size)));
driver.moz.interval = setInterval(mozHandler, Math.floor(1000 / hz * (sampleBuffer.size / (getRate(AMIGA.config.audio.rate) / hz))));
BUG.info('Audio.setup() enabled mozilla audio, channels %d, rate %d', AMIGA.config.audio.channels, getRate(AMIGA.config.audio.rate));
}
}; };
this.cleanup = function () { this.cleanup = function () {
if (driver.ctx !== null) { if (driver.ctx !== null) {
if ((this.available & SAEI_Audio_Default) || (this.available & SAEI_Audio_Webkit)) { if (this.available & SAEI_Audio_WebAudio) {
driver.def.node.disconnect(0); if (driver.node) {
driver.def.node = null; driver.node.disconnect(driver.ctx.destination);
} driver.node = null;
else if (this.available & SAEI_Audio_Mozilla) { }
clearInterval(driver.moz.interval); }
}
} }
}; };
@ -551,26 +525,17 @@ function Audi0() {
if (!AMIGA.config.audio.enabled || AMIGA.config.audio.mode == SAEV_Config_Audio_Mode_Emul) return; if (!AMIGA.config.audio.enabled || AMIGA.config.audio.mode == SAEV_Config_Audio_Mode_Emul) return;
if (driver.ctx !== null) { if (driver.ctx !== null) {
if ((this.available & SAEI_Audio_Default) || (this.available & SAEI_Audio_Webkit)) { if (this.available & SAEI_Audio_WebAudio) {
if (driver.def.node) { if (driver.node) {
if (pause && !driver.paused) { if (pause && !driver.paused) {
driver.def.node.disconnect(0); driver.node.disconnect(driver.ctx.destination);
driver.paused = true; driver.paused = true;
} else if (!pause && driver.paused) { } else if (!pause && driver.paused) {
driver.def.node.connect(driver.ctx.destination); driver.node.connect(driver.ctx.destination);
driver.paused = false; driver.paused = false;
} }
} }
} }
else if (this.available & SAEI_Audio_Mozilla) {
if (pause && !driver.paused) {
clearInterval(driver.moz.interval);
driver.paused = true;
} else if (!pause && driver.paused) {
driver.moz.interval = setInterval(mozHandler, 100);
driver.paused = false;
}
}
} }
}; };
@ -587,6 +552,7 @@ function Audi0() {
prevcon = 0; prevcon = 0;
sampleBuffer.pos = 0; sampleBuffer.pos = 0;
sampleBuffer.rpos = 0;
sampleBuffer.rate.clr(); sampleBuffer.rate.clr();
ringBuffer.usage = 0; ringBuffer.usage = 0;
@ -625,6 +591,7 @@ function Audi0() {
//BUG.info('Audio.deactivate()'); //BUG.info('Audio.deactivate()');
this.pauseResume(1); this.pauseResume(1);
sampleBuffer.pos = 0; sampleBuffer.pos = 0;
sampleBuffer.rpos = 0;
sampleBuffer.rate.clr(); sampleBuffer.rate.clr();
this.event_reset(); this.event_reset();
}; };
@ -738,7 +705,6 @@ function Audi0() {
this.hsync = function () { this.hsync = function () {
if (work_to_do > 0) { if (work_to_do > 0) {
//work_to_do--;
if (--work_to_do == 0) if (--work_to_do == 0)
this.deactivate(); this.deactivate();
} }
@ -879,16 +845,18 @@ function Audi0() {
data2 = this.filter.filter(data2, 0); data2 = this.filter.filter(data2, 0);
data3 = this.filter.filter(data3, 1); data3 = this.filter.filter(data3, 1);
} }
//if (sampleBuffer.pos + 1 >= sampleBuffer.size) sampleBuffer.pos = 0;
if (sampleBuffer.pos < sampleBuffer.realSize) { if (sampleBuffer.pos < sampleBuffer.size) {
if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) { if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) {
sampleBuffer.data[(sampleBuffer.pos << 1) ] = inv32768 * data2; sampleBuffer.data.left[sampleBuffer.pos] = inv32768 * data2;
sampleBuffer.data[(sampleBuffer.pos << 1) + 1] = inv32768 * data3; sampleBuffer.data.right[sampleBuffer.pos] = inv32768 * data3;
sampleBuffer.pos++; sampleBuffer.pos++;
} else } else
sampleBuffer.data[sampleBuffer.pos++] = inv32768 * ((data2 + data3) * 0.5); sampleBuffer.data.left[sampleBuffer.pos++] = inv32768 * ((data2 + data3) * 0.5);
} else } //else
BUG.info('Audio.sample_handler() audio buffer over-run!'); //BUG.info('Audio.sample_handler() audio buffer over-run!');
}; };
this.sample_handler_crux = function () { this.sample_handler_crux = function () {
@ -939,13 +907,13 @@ function Audi0() {
data3 = this.filter.filter(data3, 1); data3 = this.filter.filter(data3, 1);
} }
if (sampleBuffer.pos < sampleBuffer.realSize) { if (sampleBuffer.pos < sampleBuffer.size) {
if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) { if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) {
sampleBuffer.data[(sampleBuffer.pos << 1) ] = inv32768 * data2; sampleBuffer.data.left[sampleBuffer.pos] = inv32768 * data2;
sampleBuffer.data[(sampleBuffer.pos << 1) + 1] = inv32768 * data3; sampleBuffer.data.right[sampleBuffer.pos] = inv32768 * data3;
sampleBuffer.pos++; sampleBuffer.pos++;
} else } else
sampleBuffer.data[sampleBuffer.pos++] = inv32768 * ((data2 + data3) * 0.5); sampleBuffer.data.left[sampleBuffer.pos++] = inv32768 * ((data2 + data3) * 0.5);
} else } else
BUG.info('Audio.sample_handler_crux() audio buffer over-run!'); BUG.info('Audio.sample_handler_crux() audio buffer over-run!');
}; };
@ -984,13 +952,13 @@ function Audi0() {
data3 = this.filter.filter(data3, 1); data3 = this.filter.filter(data3, 1);
} }
if (sampleBuffer.pos < sampleBuffer.realSize) { if (sampleBuffer.pos < sampleBuffer.size) {
if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) { if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) {
sampleBuffer.data[(sampleBuffer.pos << 1) ] = inv32768 * data2; sampleBuffer.data.left[sampleBuffer.pos] = inv32768 * data2;
sampleBuffer.data[(sampleBuffer.pos << 1) + 1] = inv32768 * data3; sampleBuffer.data.right[sampleBuffer.pos] = inv32768 * data3;
sampleBuffer.pos++; sampleBuffer.pos++;
} else } else
sampleBuffer.data[sampleBuffer.pos++] = inv32768 * ((data2 + data3) * 0.5); sampleBuffer.data.left[sampleBuffer.pos++] = inv32768 * ((data2 + data3) * 0.5);
} else } else
BUG.info('Audio.sample_handler_rh() audio buffer over-run!'); BUG.info('Audio.sample_handler_rh() audio buffer over-run!');
}; };
@ -1020,10 +988,10 @@ function Audi0() {
for (var i = 0; i < sampleBuffer.pos; i++) { for (var i = 0; i < sampleBuffer.pos; i++) {
var pos = ringBuffer.writePos + i < ringBuffer.size ? ringBuffer.writePos + i : ringBuffer.writePos + i - ringBuffer.size; var pos = ringBuffer.writePos + i < ringBuffer.size ? ringBuffer.writePos + i : ringBuffer.writePos + i - ringBuffer.size;
if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) { if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) {
ringBuffer.data[(pos << 1) ] = sampleBuffer.data[(i << 1) ]; ringBuffer.data.left[pos] = sampleBuffer.data.left[i];
ringBuffer.data[(pos << 1) + 1] = sampleBuffer.data[(i << 1) + 1]; ringBuffer.data.right[pos] = sampleBuffer.data.right[i];
} else } else
ringBuffer.data[pos] = sampleBuffer.data[i]; ringBuffer.data.left[pos] = sampleBuffer.data.left[i];
} }
ringBuffer.writePos += sampleBuffer.pos; if (ringBuffer.writePos >= ringBuffer.size) ringBuffer.writePos -= ringBuffer.size; ringBuffer.writePos += sampleBuffer.pos; if (ringBuffer.writePos >= ringBuffer.size) ringBuffer.writePos -= ringBuffer.size;
ringBuffer.usage += sampleBuffer.pos; ringBuffer.usage += sampleBuffer.pos;
@ -1035,10 +1003,10 @@ function Audi0() {
for (var i = 0; i < rest; i++) { for (var i = 0; i < rest; i++) {
var pos = ringBuffer.writePos + i < ringBuffer.size ? ringBuffer.writePos + i : ringBuffer.writePos + i - ringBuffer.size; var pos = ringBuffer.writePos + i < ringBuffer.size ? ringBuffer.writePos + i : ringBuffer.writePos + i - ringBuffer.size;
if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) { if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) {
ringBuffer.data[(pos << 1) ] = sampleBuffer.data[(i << 1) ]; ringBuffer.data.left[pos] = sampleBuffer.data.left[i];
ringBuffer.data[(pos << 1) + 1] = sampleBuffer.data[(i << 1) + 1]; ringBuffer.data.right[pos] = sampleBuffer.data.right[i];
} else } else
ringBuffer.data[pos] = sampleBuffer.data[i]; ringBuffer.data.left[pos] = sampleBuffer.data.left[i];
} }
ringBuffer.writePos += rest; if (ringBuffer.writePos >= ringBuffer.size) ringBuffer.writePos -= ringBuffer.size; ringBuffer.writePos += rest; if (ringBuffer.writePos >= ringBuffer.size) ringBuffer.writePos -= ringBuffer.size;
ringBuffer.usage += rest; ringBuffer.usage += rest;
@ -1052,15 +1020,19 @@ function Audi0() {
drop = false; drop = false;
} }
var playBuffer = new Float32Array(rate << (AMIGA.config.audio.channels - 1)); var playBuffer = {};
playBuffer.left = new Float32Array(rate);
if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo)
playBuffer.right = new Float32Array(rate);
if (ringBuffer.usage - rate >= 0) { if (ringBuffer.usage - rate >= 0) {
for (var i = 0; i < rate; i++) { for (var i = 0; i < rate; i++) {
var pos = ringBuffer.readPos + i < ringBuffer.size ? ringBuffer.readPos + i : ringBuffer.readPos + i - ringBuffer.size; var pos = ringBuffer.readPos + i < ringBuffer.size ? ringBuffer.readPos + i : ringBuffer.readPos + i - ringBuffer.size;
if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) { if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) {
playBuffer[(i << 1) ] = ringBuffer.data[(pos << 1) ]; playBuffer.left[i] = ringBuffer.data.left[pos];
playBuffer[(i << 1) + 1] = ringBuffer.data[(pos << 1) + 1]; playBuffer.right[i] = ringBuffer.data.right[pos];
} else } else
playBuffer[i] = ringBuffer.data[pos]; playBuffer.left[i] = ringBuffer.data.left[pos];
} }
ringBuffer.readPos += rate; if (ringBuffer.readPos >= ringBuffer.size) ringBuffer.readPos -= ringBuffer.size; ringBuffer.readPos += rate; if (ringBuffer.readPos >= ringBuffer.size) ringBuffer.readPos -= ringBuffer.size;
ringBuffer.usage -= rate; ringBuffer.usage -= rate;
@ -1075,7 +1047,7 @@ function Audi0() {
return [playBuffer, rate]; return [playBuffer, rate];
} }
function defFill(e) { function fillWebAudio(e) {
var rb = fillRingBuffer(); var rb = fillRingBuffer();
if (rb === false) return; if (rb === false) return;
var playBuffer = rb[0]; var playBuffer = rb[0];
@ -1088,65 +1060,14 @@ function Audi0() {
var data2 = e.outputBuffer.getChannelData(1); var data2 = e.outputBuffer.getChannelData(1);
for (var i = 0, j = 0.0; i < sampleBuffer.size; i++, j += step) { for (var i = 0, j = 0.0; i < sampleBuffer.size; i++, j += step) {
data1[i] = playBuffer[(j >> 0) << 1]; data1[i] = playBuffer.left[j >> 0];
data2[i] = playBuffer[((j >> 0) << 1) + 1]; data2[i] = playBuffer.right[j >> 0];
} }
} else { } else {
var data = e.outputBuffer.getChannelData(0); var data = e.outputBuffer.getChannelData(0);
for (var i = 0, j = 0.0; i < sampleBuffer.size; i++, j += step) for (var i = 0, j = 0.0; i < sampleBuffer.size; i++, j += step)
data[i] = playBuffer[j >> 0]; data[i] = playBuffer.left[j >> 0];
} }
} }
function mozFill(data) {
var rb = fillRingBuffer();
if (rb === false) return;
var playBuffer = rb[0];
var rate = rb[1];
var step = rate / sampleBuffer.size;
if (AMIGA.config.audio.channels == SAEV_Config_Audio_Channels_Stereo) {
for (var i = 0, j = 0.0; i < sampleBuffer.size; i++, j += step) {
data[i*2] = playBuffer[(j >> 0)*2];
data[i*2+1] = playBuffer[(j >> 0)*2+1];
}
} else {
for (var i = 0, j = 0.0; i < data.length; i++, j += step)
data[i] = playBuffer[j >> 0];
}
}
function mozHandler() {
var soundData = new Float32Array(sampleBuffer.realSize);
mozFill(soundData);
driver.ctx.mozWriteAudio(soundData);
}
/*function mozHandler_full() {
var written;
if (driver.moz.tail) {
written = driver.ctx.mozWriteAudio(driver.moz.tail.subarray(driver.moz.tailPosition));
driver.moz.currentWritePosition += written;
driver.moz.tailPosition += written;
if (driver.moz.tailPosition < driver.moz.tail.length) return;
driver.moz.tail = null;
}
var currentPosition = driver.ctx.mozCurrentSampleOffset();
var available = currentPosition + driver.moz.prebufferSize - driver.moz.currentWritePosition;
if (available > 0) {
var soundData = new Float32Array(available);
mozFill(soundData);
written = driver.ctx.mozWriteAudio(soundData);
if (written < soundData.length) {
driver.moz.tail = soundData;
driver.moz.tailPosition = written;
}
driver.moz.currentWritePosition += written;
}
}*/
} }

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
*************************************************************************** ***************************************************************************
* Notes: Ported from WinUAE 2.5.0 * Notes: Ported from WinUAE 2.5.0

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
*************************************************************************** ***************************************************************************
* Notes: Ported from WinUAE 2.5.0 * Notes: Ported from WinUAE 2.5.0

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/

View file

@ -1,23 +1,20 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/
const SAEV_Version = 0; const SAEV_Version = 0;
const SAEV_Revision = 8; const SAEV_Revision = 8;
const SAEV_Revision_Sub = 1; const SAEV_Revision_Sub = 2;
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* info */ /* info */
const SAEI_Audio_Default = 1; const SAEI_Audio_WebAudio = 1;
const SAEI_Audio_Webkit = 2;
const SAEI_Audio_Mozilla = 4;
const SAEI_Video_Canvas2D = 1; const SAEI_Video_Canvas2D = 1;
const SAEI_Video_WebGL = 2; const SAEI_Video_WebGL = 2;

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
*************************************************************************** ***************************************************************************
* Notes: Ported from WinUAE 2.5.0 * Notes: Ported from WinUAE 2.5.0

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
*************************************************************************** ***************************************************************************
* *
@ -1063,7 +1062,7 @@ function CPU() {
regs.pc = fault.pc; regs.pc = fault.pc;
return exception(5); return exception(5);
} else { } else {
var quo = ~~(d / s); var quo = ~~(d / s); /* Thanks 'dmcoles' */
if (quo < 0) quo += 0x10000; if (quo < 0) quo += 0x10000;
@ -5253,4 +5252,4 @@ function CPU() {
cycle_spc(cpu_cycles); cycle_spc(cpu_cycles);
} }
} }
} }

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
*************************************************************************** ***************************************************************************
* Notes: Ported from WinUAE 2.5.0 * Notes: Ported from WinUAE 2.5.0

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/
@ -392,7 +391,7 @@ function Events() {
adjust += curr_time - vsyncwaittime; adjust += curr_time - vsyncwaittime;
adjust += clockadjust; adjust += clockadjust;
console.log(adjust); //console.log(adjust);
vsyncwaittime = curr_time + vsynctimebase - adjust; vsyncwaittime = curr_time + vsynctimebase - adjust;
vsyncmintime = curr_time; vsyncmintime = curr_time;

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/
/* /*

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
*************************************************************************** ***************************************************************************
* Notes: * Notes:

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/

View file

@ -1,10 +1,9 @@
/************************************************************************** /**************************************************************************
* SAE - Scripted Amiga Emulator * SAE - Scripted Amiga Emulator
* *
* https://github.com/naTmeg/ScriptedAmigaEmulator * 2012-2015 Rupert Hausberger
* *
* ©2012 Rupert Hausberger * https://github.com/naTmeg/ScriptedAmigaEmulator
* Commercial use is prohibited.
* *
**************************************************************************/ **************************************************************************/