diff --git a/emulator/frontends/pixels/assets/moa-genesis/interface.js b/emulator/frontends/pixels/assets/moa-genesis/interface.js
index ede3227..fc20f53 100644
--- a/emulator/frontends/pixels/assets/moa-genesis/interface.js
+++ b/emulator/frontends/pixels/assets/moa-genesis/interface.js
@@ -1,6 +1,40 @@
import * as Emulator from './moa-genesis.js';
+function initialize_emulator() {
+ let host = Emulator.new_host();
+ let system = Emulator.load_system(host, Emulator.get_load_system_fn());
+
+ let last_update = performance.now();
+ setTimeout(function refreshFrame() {
+ let current = performance.now();
+ let diff = current - last_update;
+let realdiff = current - last_update;
+ //let remaining = Math.max((16 * Emulator.get_speed()) - diff, 0);
+ last_update = current;
+
+ let runtime = Emulator.run_system_for(system, diff * 1_000_000);
+ if (Emulator.is_running()) {
+ let remaining = Math.max(diff - runtime - (diff * 0.1), 1);
+ console.log(realdiff, diff, runtime, remaining);
+ setTimeout(refreshFrame, remaining);
+ }
+ }, 0);
+ /*
+ setTimeout(function refreshFrame() {
+ let run_time = run_system_for(system, 66_000_000);
+ setTimeout(refreshFrame, 66 - run_time);
+ }, 0);
+ */
+
+ Emulator.host_run_loop(host);
+}
+
+window.addEventListener("load", () => {
+ Emulator.default();
+});
+
+// Load a new ROM file
var reader = new FileReader();
reader.onloadend = function (e) {
var data = new Uint8Array(reader.result);
@@ -15,36 +49,8 @@ file_input.addEventListener("change", e => {
reader.readAsArrayBuffer(file_input.files[0])
});
-function initialize_emulator() {
- let host = Emulator.new_host();
- let system = Emulator.load_system(host, Emulator.get_load_system_fn());
-
- let last_update = performance.now();
- setTimeout(function refreshFrame() {
- let current = performance.now();
- let diff = Math.min(current - last_update, 100);
- let remaining = Math.max((16 * Emulator.get_speed()) - diff, 0);
- //console.log(diff, remaining);
- last_update = current;
-
- Emulator.run_system_for(system, diff * 1_000_000);
- if (Emulator.is_running()) {
- setTimeout(refreshFrame, remaining);
- }
- }, 0);
- /*
- setTimeout(function refreshFrame() {
- let run_time = run_system_for(system, 66_000_000);
- setTimeout(refreshFrame, 66 - run_time);
- }, 0);
- */
-
- Emulator.host_run_loop(host);
-}
-
document.getElementById("reset").addEventListener("click", () => {
Emulator.request_stop();
- //start();
});
document.getElementById("power").addEventListener("click", () => {
@@ -58,12 +64,9 @@ document.getElementById("speed").addEventListener("change", (e) => {
Emulator.set_speed(e.target.value);
});
-var file_input = document.getElementById("rom-file");
+// Update the frame rate display
var frame_rate_el = document.getElementById("frame-rate");
var frame_rate = setInterval(function () {
frame_rate_el.value = Emulator.get_frames_since();
}, 1000);
-window.addEventListener("load", () => {
- Emulator.default();
-});
diff --git a/emulator/frontends/pixels/src/web.rs b/emulator/frontends/pixels/src/web.rs
index 2efdfec..c90fde7 100644
--- a/emulator/frontends/pixels/src/web.rs
+++ b/emulator/frontends/pixels/src/web.rs
@@ -116,14 +116,15 @@ pub fn create_window(event_loop: &EventLoop) -> Rc {
WindowBuilder::new()
.with_canvas(Some(canvas))
.with_title("Hello Pixels + Web")
- .with_inner_size(size)
- .with_min_inner_size(size)
+ //.with_inner_size(size)
+ //.with_min_inner_size(size)
.build(event_loop)
.expect("WindowBuilder error")
};
let window = Rc::new(window);
+ /*
// Retrieve current width and height dimensions of browser client window
let get_window_size = || {
let client_window = web_sys::window().unwrap();
@@ -133,10 +134,9 @@ pub fn create_window(event_loop: &EventLoop) -> Rc {
)
};
- let window = Rc::clone(&window);
-
// Initialize winit window with current dimensions of browser client
window.set_inner_size(get_window_size());
+ */
let client_window = web_sys::window().unwrap();
@@ -155,6 +155,7 @@ pub fn create_window(event_loop: &EventLoop) -> Rc {
.expect("couldn't append canvas to document body");
*/
+ /*
{
let window = window.clone();
// Listen for resize event on browser client. Adjust winit window dimensions
@@ -168,6 +169,7 @@ pub fn create_window(event_loop: &EventLoop) -> Rc {
.unwrap();
closure.forget();
}
+ */
/*
let mut update_timer = Instant::now();
diff --git a/todo.txt b/todo.txt
index 1e94252..14bc886 100644
--- a/todo.txt
+++ b/todo.txt
@@ -21,15 +21,12 @@
* can you make the debugger more accessible, so a web interface could access the data and display it, in light of the fact that println isn't available in wasm
Web Assembly:
- * the frame rate is pretty bad. It's definitely faster with a smaller window
+ * can you make the web interface nicer with like... a picture of a genesis or something
+ * would a different pixel format help at all?
+
* can you limit the size of the window that pixels generates?
* can you automatically adjust the speed based on the calculated framerate (if you moved that to Rust)
- * can you limit the frame rate in pixels so that you if it were to run too fast, it would limit it to 60Hz
- * the system run is taking 40 to 50ms per frame in web assembly. Can you cut that by 4 times?
-
- * add sound to web assembly
- * add run/stop and ability to change speed through the web interface
- * can you make the web interface nicer with like... a picture of a genesis or something
+ * enable sound in web assembly
* add ability to disable one or the other audio chips in the genesis
@@ -38,11 +35,7 @@ Web Assembly:
* should you have a separate attenuation value for each input in the mixer so that you can make one chip quieter (the sn76489 is pretty loud, and I added a fixed offset to the attenuation for now)
-* I need some better function for dealing with memory, like a function that copies data with a loop, or allows offset reading of
- a fixed piece of data..., the trick is what function are the most common. You can use generics
-* there is an issue with Mortal Kombat 2 where it will crash randomly at the start of a fight. The code is actually swapping
- stacks a bunch of times, and at some point, the stack is corrupted or something and it `rts`s to the wrong address...
Audio:
@@ -89,12 +82,11 @@ Debugger:
Genesis/Mega Drive:
+ * there is an issue with Mortal Kombat 2 where it will crash randomly at the start of a fight. The code is actually swapping
+ stacks a bunch of times, and at some point, the stack is corrupted or something and it `rts`s to the wrong address...
+
* implement sn76489 and ym2612 for audio
- * in some games the controller doesn't seem to work at all (Earthworm Jim, and Mortal Kombat)
- * refactor to print line by line, so that colour palette changes have an effect
* there's a bug when Sonic 2 goes to the demo screen, it's all corrupted (could it be a dma copy error)
- * colours are still broken in Sonic1
- * sonic3 needs some kind of nvram to run
* the 68000/Z80 bank switching is probably buggy
* the H/V counters are not accurate because it seems to count at different speeds in the blanking period (time vs return value numbers don't divide properly)
@@ -111,8 +103,6 @@ Macintosh:
68000:
- * check all instructions in the docs
-
* unimplemented: BFFFO, BFINS, NBCD, RTD
* >=MC68020 undecoded & unimplemented: BKPT, CALLM, CAS, CAS2, CHK2, CMP2, RTM, PACK, TRAPcc, UNPK
@@ -120,15 +110,11 @@ Macintosh:
* add support for FPU
* Coprocessor instructions: cpBcc, cpDBcc, cpGEN, cpScc, cpTRAPcc
- * add more m68k tests and try to test against a working impl (m68k-test-suite project)
-
Z80:
* add instruction timings to Z80
* unimplemented: CPD, CPDR, CPI, CPIR, DAA, IND, INDR, INI, INIR, INic, INx, OTDR, OTIR, OUTD, OUTI, OUTic, OUTx, RETI, RETN, RLD, RRD
-* work on mac128/512
-* work on sega genesis
* can you eventually make the system connections all configurable via a config file?