mirror of
https://github.com/exoticorn/microw8.git
synced 2026-01-20 19:26:43 +01:00
Compare commits
2 Commits
09e4fcbf14
...
440e150896
| Author | SHA1 | Date | |
|---|---|---|---|
| 440e150896 | |||
| 77b2e27346 |
2313
Cargo.lock
generated
2313
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
16
Cargo.toml
16
Cargo.toml
@@ -11,21 +11,21 @@ native = ["wasmtime", "uw8-window", "cpal", "rubato" ]
|
|||||||
browser = ["warp", "tokio", "tokio-stream", "webbrowser"]
|
browser = ["warp", "tokio", "tokio-stream", "webbrowser"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
wasmtime = { version = "5.0.0", optional = true }
|
wasmtime = { version = "12.0.0", optional = true }
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
env_logger = "0.10"
|
env_logger = "0.10"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
uw8-window = { path = "uw8-window", optional = true }
|
uw8-window = { path = "uw8-window", optional = true }
|
||||||
notify-debouncer-mini = { version = "0.2.1", default-features = false }
|
notify-debouncer-mini = { version = "0.4.1", default-features = false }
|
||||||
pico-args = "0.5"
|
pico-args = "0.5"
|
||||||
curlywas = { git = "https://github.com/exoticorn/curlywas.git", rev = "0e7ea50" }
|
curlywas = { git = "https://github.com/exoticorn/curlywas.git", rev = "0e7ea50" }
|
||||||
wat = "1"
|
wat = "1"
|
||||||
uw8-tool = { path = "uw8-tool" }
|
uw8-tool = { path = "uw8-tool" }
|
||||||
same-file = "1"
|
same-file = "1"
|
||||||
warp = { version = "0.3.3", optional = true }
|
warp = { version = "0.3.5", optional = true }
|
||||||
tokio = { version = "1.24.0", features = ["sync", "rt"], optional = true }
|
tokio = { version = "1.32.0", features = ["sync", "rt"], optional = true }
|
||||||
tokio-stream = { version = "0.1.11", features = ["sync"], optional = true }
|
tokio-stream = { version = "0.1.14", features = ["sync"], optional = true }
|
||||||
webbrowser = { version = "0.8.6", optional = true }
|
webbrowser = { version = "0.8.11", optional = true }
|
||||||
ansi_term = "0.12.1"
|
ansi_term = "0.12.1"
|
||||||
cpal = { version = "0.14.2", optional = true }
|
cpal = { version = "0.15.2", optional = true }
|
||||||
rubato = { version = "0.12.0", optional = true }
|
rubato = { version = "0.14.0", optional = true }
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ export fn sndGes(t: i32) -> f32 {
|
|||||||
let phase = channelState!GesChannelState.Phase;
|
let phase = channelState!GesChannelState.Phase;
|
||||||
|
|
||||||
let inline pulseWidth = channelReg?1;
|
let inline pulseWidth = channelReg?1;
|
||||||
let phaseShift = (pulseWidth - 128) * 255;
|
|
||||||
let invPhaseInc = 1 as f32 / phaseInc as f32;
|
let invPhaseInc = 1 as f32 / phaseInc as f32;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
@@ -131,7 +130,7 @@ export fn sndGes(t: i32) -> f32 {
|
|||||||
let phaseInc = (freq * (65536.0 / 44100.0)) as i32;
|
let phaseInc = (freq * (65536.0 / 44100.0)) as i32;
|
||||||
|
|
||||||
let phase = channelState!GesChannelState.Phase;
|
let phase = channelState!GesChannelState.Phase;
|
||||||
if modSrc > ch {
|
if modSrc < ch {
|
||||||
phase = phase - (phaseInc << 6);
|
phase = phase - (phaseInc << 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,16 +16,14 @@ pub struct FileWatcher {
|
|||||||
impl FileWatcher {
|
impl FileWatcher {
|
||||||
pub fn new() -> Result<FileWatcher> {
|
pub fn new() -> Result<FileWatcher> {
|
||||||
let (tx, rx) = mpsc::channel();
|
let (tx, rx) = mpsc::channel();
|
||||||
let debouncer = new_debouncer(Duration::from_millis(100), None, move |res| match res {
|
let debouncer = new_debouncer(Duration::from_millis(100), move |res| match res {
|
||||||
Ok(events) => {
|
Ok(events) => {
|
||||||
for event in events {
|
for event in events {
|
||||||
let _ = tx.send(event);
|
let _ = tx.send(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(errs) => {
|
Err(err) => {
|
||||||
for err in errs {
|
eprintln!("Error watching for file changes: {err}");
|
||||||
eprintln!("Error watching for file changes: {err}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})?;
|
})?;
|
||||||
Ok(FileWatcher {
|
Ok(FileWatcher {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use cpal::traits::*;
|
|||||||
use rubato::Resampler;
|
use rubato::Resampler;
|
||||||
use uw8_window::{Window, WindowConfig};
|
use uw8_window::{Window, WindowConfig};
|
||||||
use wasmtime::{
|
use wasmtime::{
|
||||||
Engine, GlobalType, Memory, MemoryType, Module, Mutability, Store, TypedFunc, ValType,
|
Engine, Func, GlobalType, Memory, MemoryType, Module, Mutability, Store, TypedFunc, ValType,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct MicroW8 {
|
pub struct MicroW8 {
|
||||||
@@ -90,7 +90,7 @@ impl super::Runtime for MicroW8 {
|
|||||||
let memory = wasmtime::Memory::new(&mut store, MemoryType::new(4, Some(4)))?;
|
let memory = wasmtime::Memory::new(&mut store, MemoryType::new(4, Some(4)))?;
|
||||||
|
|
||||||
let mut linker = wasmtime::Linker::new(&self.engine);
|
let mut linker = wasmtime::Linker::new(&self.engine);
|
||||||
linker.define("env", "memory", memory)?;
|
linker.define(&store, "env", "memory", memory)?;
|
||||||
|
|
||||||
let loader_instance = linker.instantiate(&mut store, &self.loader_module)?;
|
let loader_instance = linker.instantiate(&mut store, &self.loader_module)?;
|
||||||
let load_uw8 = loader_instance.get_typed_func::<i32, i32>(&mut store, "load_uw8")?;
|
let load_uw8 = loader_instance.get_typed_func::<i32, i32>(&mut store, "load_uw8")?;
|
||||||
@@ -255,15 +255,12 @@ fn add_native_functions(
|
|||||||
}
|
}
|
||||||
})?;
|
})?;
|
||||||
for i in 0..16 {
|
for i in 0..16 {
|
||||||
linker.define(
|
let global = wasmtime::Global::new(
|
||||||
"env",
|
&mut *store,
|
||||||
&format!("g_reserved{}", i),
|
GlobalType::new(ValType::I32, Mutability::Const),
|
||||||
wasmtime::Global::new(
|
0.into(),
|
||||||
&mut *store,
|
|
||||||
GlobalType::new(ValType::I32, Mutability::Const),
|
|
||||||
0.into(),
|
|
||||||
)?,
|
|
||||||
)?;
|
)?;
|
||||||
|
linker.define(&store, "env", &format!("g_reserved{}", i), global)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -276,14 +273,18 @@ fn instantiate_platform(
|
|||||||
) -> Result<wasmtime::Instance> {
|
) -> Result<wasmtime::Instance> {
|
||||||
let platform_instance = linker.instantiate(&mut *store, &platform_module)?;
|
let platform_instance = linker.instantiate(&mut *store, &platform_module)?;
|
||||||
|
|
||||||
for export in platform_instance.exports(&mut *store) {
|
let exports: Vec<(String, Func)> = platform_instance
|
||||||
linker.define(
|
.exports(&mut *store)
|
||||||
"env",
|
.map(|e| {
|
||||||
export.name(),
|
(
|
||||||
export
|
e.name().to_owned(),
|
||||||
.into_func()
|
e.into_func()
|
||||||
.expect("platform surely only exports functions"),
|
.expect("platform surely only exports functions"),
|
||||||
)?;
|
)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
for (name, func) in exports {
|
||||||
|
linker.define(&store, "env", &name, func)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(platform_instance)
|
Ok(platform_instance)
|
||||||
@@ -310,7 +311,7 @@ fn init_sound(
|
|||||||
let memory = wasmtime::Memory::new(&mut store, MemoryType::new(4, Some(4)))?;
|
let memory = wasmtime::Memory::new(&mut store, MemoryType::new(4, Some(4)))?;
|
||||||
|
|
||||||
let mut linker = wasmtime::Linker::new(engine);
|
let mut linker = wasmtime::Linker::new(engine);
|
||||||
linker.define("env", "memory", memory)?;
|
linker.define(&store, "env", "memory", memory)?;
|
||||||
add_native_functions(&mut linker, &mut store)?;
|
add_native_functions(&mut linker, &mut store)?;
|
||||||
|
|
||||||
let platform_instance = instantiate_platform(&mut linker, &mut store, platform_module)?;
|
let platform_instance = instantiate_platform(&mut linker, &mut store, platform_module)?;
|
||||||
@@ -373,8 +374,8 @@ fn init_sound(
|
|||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
let rs = rubato::FftFixedIn::new(44100, sample_rate, 128, 1, 2)?;
|
let rs = rubato::FftFixedIn::new(44100, sample_rate, 128, 1, 2)?;
|
||||||
let input_buffers = rs.input_buffer_allocate();
|
let input_buffers = rs.input_buffer_allocate(true);
|
||||||
let output_buffers = rs.output_buffer_allocate();
|
let output_buffers = rs.output_buffer_allocate(true);
|
||||||
Some(Resampler {
|
Some(Resampler {
|
||||||
resampler: rs,
|
resampler: rs,
|
||||||
input_buffers,
|
input_buffers,
|
||||||
@@ -423,6 +424,14 @@ fn init_sound(
|
|||||||
mem[64..68].copy_from_slice(¤t_time.to_le_bytes());
|
mem[64..68].copy_from_slice(¤t_time.to_le_bytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn clamp_sample(s: f32) -> f32 {
|
||||||
|
if s.is_nan() {
|
||||||
|
0.0
|
||||||
|
} else {
|
||||||
|
s.max(-1.0).min(1.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(ref mut resampler) = resampler {
|
if let Some(ref mut resampler) = resampler {
|
||||||
while !buffer.is_empty() {
|
while !buffer.is_empty() {
|
||||||
let copy_size = resampler.output_buffers[0]
|
let copy_size = resampler.output_buffers[0]
|
||||||
@@ -433,10 +442,12 @@ fn init_sound(
|
|||||||
resampler.input_buffers[0].clear();
|
resampler.input_buffers[0].clear();
|
||||||
resampler.input_buffers[1].clear();
|
resampler.input_buffers[1].clear();
|
||||||
for _ in 0..resampler.resampler.input_frames_next() {
|
for _ in 0..resampler.resampler.input_frames_next() {
|
||||||
resampler.input_buffers[0]
|
resampler.input_buffers[0].push(clamp_sample(
|
||||||
.push(snd.call(&mut store, (sample_index,)).unwrap_or(0.0));
|
snd.call(&mut store, (sample_index,)).unwrap_or(0.0),
|
||||||
resampler.input_buffers[1]
|
));
|
||||||
.push(snd.call(&mut store, (sample_index + 1,)).unwrap_or(0.0));
|
resampler.input_buffers[1].push(clamp_sample(
|
||||||
|
snd.call(&mut store, (sample_index + 1,)).unwrap_or(0.0),
|
||||||
|
));
|
||||||
sample_index = sample_index.wrapping_add(2);
|
sample_index = sample_index.wrapping_add(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -462,7 +473,7 @@ fn init_sound(
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for v in buffer {
|
for v in buffer {
|
||||||
*v = snd.call(&mut store, (sample_index,)).unwrap_or(0.0);
|
*v = clamp_sample(snd.call(&mut store, (sample_index,)).unwrap_or(0.0));
|
||||||
sample_index = sample_index.wrapping_add(1);
|
sample_index = sample_index.wrapping_add(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -475,6 +486,7 @@ fn init_sound(
|
|||||||
move |err| {
|
move |err| {
|
||||||
dbg!(err);
|
dbg!(err);
|
||||||
},
|
},
|
||||||
|
None,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
Ok(Uw8Sound { stream, tx })
|
Ok(Uw8Sound { stream, tx })
|
||||||
|
|||||||
810
uw8-window/Cargo.lock
generated
810
uw8-window/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -6,13 +6,13 @@ edition = "2021"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
winit = "0.27.5"
|
winit = "0.28.6"
|
||||||
env_logger = "0.10"
|
env_logger = "0.10"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
pico-args = "0.5"
|
pico-args = "0.5"
|
||||||
wgpu = "0.15"
|
wgpu = "0.17"
|
||||||
pollster = "0.2.5"
|
pollster = "0.3.0"
|
||||||
bytemuck = { version = "1.13", features = [ "derive" ] }
|
bytemuck = { version = "1.13", features = [ "derive" ] }
|
||||||
anyhow = "1"
|
anyhow = "1"
|
||||||
minifb = { version = "0.23.0", default-features = false, features = ["x11"] }
|
minifb = { version = "0.25.0", default-features = false, features = ["x11"] }
|
||||||
winapi = { version = "0.3.9", features = [ "timeapi" ] }
|
winapi = { version = "0.3.9", features = [ "timeapi" ] }
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ fn row_factor(offset: f32) -> f32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn col_factor(offset: f32) -> f32 {
|
fn col_factor(offset: f32) -> f32 {
|
||||||
let offset = max(0.0, abs(offset) - 0.4);
|
let o = max(0.0, abs(offset) - 0.4);
|
||||||
return 1.0 / (1.0 + offset * offset * 16.0);
|
return 1.0 / (1.0 + o * o * 16.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sample_screen(tex_coords: vec2<f32>) -> vec4<f32> {
|
fn sample_screen(tex_coords: vec2<f32>) -> vec4<f32> {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use crate::{Input, WindowConfig, WindowImpl};
|
use crate::{Input, WindowConfig, WindowImpl};
|
||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, Result};
|
||||||
use std::{num::NonZeroU32, time::Instant};
|
use std::time::Instant;
|
||||||
|
|
||||||
use winit::{
|
use winit::{
|
||||||
dpi::PhysicalSize,
|
dpi::PhysicalSize,
|
||||||
@@ -500,7 +500,7 @@ impl PaletteScreenMode {
|
|||||||
&bytemuck::cast_slice(pixels),
|
&bytemuck::cast_slice(pixels),
|
||||||
wgpu::ImageDataLayout {
|
wgpu::ImageDataLayout {
|
||||||
offset: 0,
|
offset: 0,
|
||||||
bytes_per_row: NonZeroU32::new(320),
|
bytes_per_row: Some(320),
|
||||||
rows_per_image: None,
|
rows_per_image: None,
|
||||||
},
|
},
|
||||||
wgpu::Extent3d {
|
wgpu::Extent3d {
|
||||||
@@ -522,7 +522,7 @@ impl PaletteScreenMode {
|
|||||||
&bytemuck::cast_slice(palette),
|
&bytemuck::cast_slice(palette),
|
||||||
wgpu::ImageDataLayout {
|
wgpu::ImageDataLayout {
|
||||||
offset: 0,
|
offset: 0,
|
||||||
bytes_per_row: NonZeroU32::new(256 * 4),
|
bytes_per_row: Some(256 * 4),
|
||||||
rows_per_image: None,
|
rows_per_image: None,
|
||||||
},
|
},
|
||||||
wgpu::Extent3d {
|
wgpu::Extent3d {
|
||||||
|
|||||||
Reference in New Issue
Block a user