mirror of
https://github.com/exoticorn/microw8.git
synced 2026-01-20 11:16:42 +01:00
Compare commits
13 Commits
v0.2.2
...
9c0200155f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c0200155f | ||
| 09e4fcbf14 | |||
| dbeb242fb2 | |||
|
|
937ccf60c9 | ||
| 4fe4bce0ad | |||
| fe86153562 | |||
| c9dadaca2e | |||
| 5dc3e281ce | |||
| ce3afb821f | |||
| 2652a351ad | |||
| 9109722409 | |||
| f861c262a1 | |||
| bbfb5eba49 |
6
.github/workflows/ci.yml
vendored
6
.github/workflows/ci.yml
vendored
@@ -30,9 +30,9 @@ jobs:
|
||||
run: sudo apt-get install -y libxkbcommon-dev libasound2-dev
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
- name: Cache build dirs
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/bin/
|
||||
@@ -44,7 +44,7 @@ jobs:
|
||||
- name: Build
|
||||
run: cargo build --release --verbose
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: uw8-${{ matrix.build }}
|
||||
path: target/release/${{ matrix.exe }}
|
||||
|
||||
6
.github/workflows/main.yml
vendored
6
.github/workflows/main.yml
vendored
@@ -8,12 +8,12 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
- name: build_and_deploy
|
||||
uses: shalzz/zola-deploy-action@v0.14.1
|
||||
uses: shalzz/zola-deploy-action@70a101a14bbdeed13e7a42a9ed06b35c9e9e826e
|
||||
env:
|
||||
# Target branch
|
||||
PAGES_BRANCH: gh-pages
|
||||
BUILD_DIR: site
|
||||
# Provide personal access token
|
||||
TOKEN: $GITHUB_ACTOR:${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
13
Cargo.lock
generated
13
Cargo.lock
generated
@@ -2069,6 +2069,15 @@ dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "notify-debouncer-mini"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e23e9fa24f094b143c1eb61f90ac6457de87be6987bc70746e0179f7dbc9007b"
|
||||
dependencies = [
|
||||
"notify",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-complex"
|
||||
version = "0.4.3"
|
||||
@@ -3374,7 +3383,7 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
|
||||
|
||||
[[package]]
|
||||
name = "uw8"
|
||||
version = "0.2.1"
|
||||
version = "0.2.2"
|
||||
dependencies = [
|
||||
"ansi_term",
|
||||
"anyhow",
|
||||
@@ -3382,7 +3391,7 @@ dependencies = [
|
||||
"curlywas",
|
||||
"env_logger",
|
||||
"log",
|
||||
"notify",
|
||||
"notify-debouncer-mini",
|
||||
"pico-args 0.5.0",
|
||||
"rubato",
|
||||
"same-file",
|
||||
|
||||
@@ -16,7 +16,7 @@ anyhow = "1"
|
||||
env_logger = "0.10"
|
||||
log = "0.4"
|
||||
uw8-window = { path = "uw8-window", optional = true }
|
||||
notify = "5"
|
||||
notify-debouncer-mini = { version = "0.2.1", default-features = false }
|
||||
pico-args = "0.5"
|
||||
curlywas = { git = "https://github.com/exoticorn/curlywas.git", rev = "0e7ea50" }
|
||||
wat = "1"
|
||||
|
||||
6
examples/tinygo/build.sh
Executable file
6
examples/tinygo/build.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
tinygo build -o cart.wasm -target target.json ./main.go
|
||||
uw8 filter-exports cart.wasm cart.wasm && \
|
||||
#wasm-opt -Oz --fast-math --strip-producers -o cart.wasm cart.wasm && \
|
||||
uw8 pack -l 9 cart.wasm cart.uw8
|
||||
38
examples/tinygo/main.go
Normal file
38
examples/tinygo/main.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"math"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
//go:wasm-module env
|
||||
//export atan2
|
||||
func atan2(x, y float32) float32
|
||||
|
||||
//go:wasm-module env
|
||||
//export time
|
||||
func time() float32
|
||||
|
||||
func sqrt(v float32) float32 {
|
||||
return float32(math.Sqrt(float64(v)))
|
||||
}
|
||||
|
||||
var FRAMEBUFFER = (*[320 * 240]byte)(unsafe.Pointer(uintptr(120)))
|
||||
|
||||
//export upd
|
||||
func upd() {
|
||||
var i int
|
||||
for i < 320*240 {
|
||||
t := time() * 63.0
|
||||
x := float32(i%320 - 160)
|
||||
y := float32(i/320 - 120)
|
||||
d := float32(40000.0) / sqrt(x*x+y*y)
|
||||
u := atan2(x, y) * 512.0 / 3.141
|
||||
c := uint8((int(d+t*2.0) ^ int(u+t)) >> 4)
|
||||
FRAMEBUFFER[i] = c
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
}
|
||||
23
examples/tinygo/target.json
Normal file
23
examples/tinygo/target.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"llvm-target": "wasm32--wasi",
|
||||
"build-tags": [ "tinygo.wasm" ],
|
||||
"goos": "js",
|
||||
"goarch": "wasm",
|
||||
"linker": "wasm-ld",
|
||||
"libc": "wasi-libc",
|
||||
"cflags": [
|
||||
"--target=wasm32--wasi",
|
||||
"--sysroot={root}/lib/wasi-libc/sysroot",
|
||||
"-Oz"
|
||||
],
|
||||
"ldflags": [
|
||||
"--no-entry",
|
||||
"--export-all",
|
||||
"--import-memory",
|
||||
"--initial-memory=262144",
|
||||
"--global-base=81920",
|
||||
"-zstack-size=4096",
|
||||
"--strip-all"
|
||||
],
|
||||
"wasm-abi": "js"
|
||||
}
|
||||
@@ -1,23 +1,35 @@
|
||||
use anyhow::{anyhow, bail, Result};
|
||||
use notify::{Event, EventKind, RecommendedWatcher, Watcher};
|
||||
use std::{collections::BTreeSet, path::PathBuf, sync::mpsc};
|
||||
use notify_debouncer_mini::{
|
||||
new_debouncer,
|
||||
notify::{self, RecommendedWatcher},
|
||||
DebouncedEvent, DebouncedEventKind, Debouncer,
|
||||
};
|
||||
use std::{collections::BTreeSet, path::PathBuf, sync::mpsc, time::Duration};
|
||||
|
||||
pub struct FileWatcher {
|
||||
watcher: RecommendedWatcher,
|
||||
debouncer: Debouncer<RecommendedWatcher>,
|
||||
watched_files: BTreeSet<PathBuf>,
|
||||
directories: BTreeSet<PathBuf>,
|
||||
rx: mpsc::Receiver<Event>,
|
||||
rx: mpsc::Receiver<DebouncedEvent>,
|
||||
}
|
||||
|
||||
impl FileWatcher {
|
||||
pub fn new() -> Result<FileWatcher> {
|
||||
let (tx, rx) = mpsc::channel();
|
||||
let watcher = notify::recommended_watcher(move |res| match res {
|
||||
Ok(event) => _ = tx.send(event),
|
||||
Err(err) => eprintln!("Error watching for file changes: {err}"),
|
||||
let debouncer = new_debouncer(Duration::from_millis(100), None, move |res| match res {
|
||||
Ok(events) => {
|
||||
for event in events {
|
||||
let _ = tx.send(event);
|
||||
}
|
||||
}
|
||||
Err(errs) => {
|
||||
for err in errs {
|
||||
eprintln!("Error watching for file changes: {err}");
|
||||
}
|
||||
}
|
||||
})?;
|
||||
Ok(FileWatcher {
|
||||
watcher,
|
||||
debouncer,
|
||||
watched_files: BTreeSet::new(),
|
||||
directories: BTreeSet::new(),
|
||||
rx,
|
||||
@@ -29,7 +41,8 @@ impl FileWatcher {
|
||||
let parent = path.parent().ok_or_else(|| anyhow!("File has no parent"))?;
|
||||
|
||||
if !self.directories.contains(parent) {
|
||||
self.watcher
|
||||
self.debouncer
|
||||
.watcher()
|
||||
.watch(parent, notify::RecursiveMode::NonRecursive)?;
|
||||
self.directories.insert(parent.to_path_buf());
|
||||
}
|
||||
@@ -41,13 +54,11 @@ impl FileWatcher {
|
||||
pub fn poll_changed_file(&self) -> Result<Option<PathBuf>> {
|
||||
match self.rx.try_recv() {
|
||||
Ok(event) => match event.kind {
|
||||
EventKind::Create(_) | EventKind::Modify(_) => {
|
||||
for path in event.paths {
|
||||
let handle = same_file::Handle::from_path(&path)?;
|
||||
DebouncedEventKind::Any => {
|
||||
let handle = same_file::Handle::from_path(&event.path)?;
|
||||
for file in &self.watched_files {
|
||||
if handle == same_file::Handle::from_path(file)? {
|
||||
return Ok(Some(path));
|
||||
}
|
||||
return Ok(Some(event.path));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,17 +2,18 @@ import "env.memory" memory(4);
|
||||
import "env.pow" fn pow(f32, f32) -> f32;
|
||||
import "env.sin" fn sin(f32) -> f32;
|
||||
import "env.cls" fn cls(i32);
|
||||
import "env.exp" fn exp(f32) -> f32;
|
||||
import "env.rectangle" fn rectangle(f32, f32, f32, f32, i32);
|
||||
|
||||
include "../platform/src/ges.cwa"
|
||||
|
||||
export fn snd(t: i32) -> f32 {
|
||||
gesSnd(t)
|
||||
sndGes(t)
|
||||
}
|
||||
|
||||
export fn upd() {
|
||||
80?0 = 32!32 / 200 & 2 | 0x41;
|
||||
80?3 = (32!32 / 400)%7*12/7 + 40;
|
||||
80?3 = (32!32 / 400)%8*12/7 + 40;
|
||||
let pulse = (32!32 * 256 / 2000) & 511;
|
||||
if pulse >= 256 {
|
||||
pulse = 511 - pulse;
|
||||
|
||||
@@ -767,7 +767,10 @@ fn remap_function(
|
||||
De::End => En::End,
|
||||
De::Br { relative_depth } => En::Br(relative_depth),
|
||||
De::BrIf { relative_depth } => En::BrIf(relative_depth),
|
||||
De::BrTable { .. } => todo!(),
|
||||
De::BrTable { targets } => En::BrTable(
|
||||
targets.targets().collect::<Result<Vec<u32>, _>>()?.into(),
|
||||
targets.default(),
|
||||
),
|
||||
De::Return => En::Return,
|
||||
De::Call { function_index } => En::Call(
|
||||
*function_map
|
||||
|
||||
@@ -41,7 +41,10 @@ impl Window {
|
||||
async fn create(window_config: WindowConfig) -> Result<Window> {
|
||||
let event_loop = EventLoop::new();
|
||||
let window = WindowBuilder::new()
|
||||
.with_inner_size(PhysicalSize::new(640u32, 480))
|
||||
.with_inner_size(PhysicalSize::new(
|
||||
(320. * window_config.scale).round() as u32,
|
||||
(240. * window_config.scale).round() as u32,
|
||||
))
|
||||
.with_min_inner_size(PhysicalSize::new(320u32, 240))
|
||||
.with_title("MicroW8")
|
||||
.with_fullscreen(if window_config.fullscreen {
|
||||
@@ -72,7 +75,13 @@ impl Window {
|
||||
|
||||
let surface_config = wgpu::SurfaceConfiguration {
|
||||
present_mode: wgpu::PresentMode::AutoNoVsync,
|
||||
..surface.get_default_config(&adapter, window.inner_size().width, window.inner_size().height).expect("Surface incompatible with adapter")
|
||||
..surface
|
||||
.get_default_config(
|
||||
&adapter,
|
||||
window.inner_size().width,
|
||||
window.inner_size().height,
|
||||
)
|
||||
.expect("Surface incompatible with adapter")
|
||||
};
|
||||
|
||||
let filter: Box<dyn Filter> = create_filter(
|
||||
@@ -354,7 +363,7 @@ impl PaletteScreenMode {
|
||||
format: wgpu::TextureFormat::R8Uint,
|
||||
usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
|
||||
label: None,
|
||||
view_formats: &[]
|
||||
view_formats: &[],
|
||||
});
|
||||
|
||||
let palette_texture = device.create_texture(&wgpu::TextureDescriptor {
|
||||
@@ -369,7 +378,7 @@ impl PaletteScreenMode {
|
||||
format: wgpu::TextureFormat::Rgba8UnormSrgb,
|
||||
usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
|
||||
label: None,
|
||||
view_formats: &[]
|
||||
view_formats: &[],
|
||||
});
|
||||
|
||||
let screen_texture = device.create_texture(&wgpu::TextureDescriptor {
|
||||
@@ -384,7 +393,7 @@ impl PaletteScreenMode {
|
||||
format: wgpu::TextureFormat::Rgba8UnormSrgb,
|
||||
usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::RENDER_ATTACHMENT,
|
||||
label: None,
|
||||
view_formats: &[]
|
||||
view_formats: &[],
|
||||
});
|
||||
|
||||
let framebuffer_texture_view =
|
||||
|
||||
@@ -15,7 +15,7 @@ struct FpsCounter {
|
||||
}
|
||||
|
||||
impl Window {
|
||||
pub fn new(config: WindowConfig) -> Result<Window> {
|
||||
pub fn new(mut config: WindowConfig) -> Result<Window> {
|
||||
let fps_counter = if config.fps_counter {
|
||||
Some(FpsCounter {
|
||||
start: Instant::now(),
|
||||
@@ -24,6 +24,7 @@ impl Window {
|
||||
} else {
|
||||
None
|
||||
};
|
||||
config.scale = config.scale.max(1.).min(20.);
|
||||
if config.enable_gpu {
|
||||
match gpu::Window::new(config) {
|
||||
Ok(window) => {
|
||||
@@ -71,6 +72,7 @@ pub struct WindowConfig {
|
||||
filter: u32,
|
||||
fullscreen: bool,
|
||||
fps_counter: bool,
|
||||
scale: f32,
|
||||
}
|
||||
|
||||
impl Default for WindowConfig {
|
||||
@@ -80,6 +82,7 @@ impl Default for WindowConfig {
|
||||
filter: 5,
|
||||
fullscreen: false,
|
||||
fps_counter: false,
|
||||
scale: 2.,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -102,6 +105,10 @@ impl WindowConfig {
|
||||
}
|
||||
self.fullscreen = args.contains("--fullscreen");
|
||||
self.fps_counter = args.contains("--fps");
|
||||
self.scale = args
|
||||
.opt_value_from_str("--scale")
|
||||
.unwrap()
|
||||
.unwrap_or(self.scale);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user