From d1556f7be8ff28fe281988fee75d45021f76f132 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sun, 8 May 2022 00:41:11 +0200 Subject: [PATCH] add support for writing debug output to the console --- platform/bin/platform.uw8 | Bin 3757 -> 3771 bytes platform/src/platform.cwa | 42 ++++++++++++++++++++++---------------- src/run-web.html | 2 +- src/run_native.rs | 10 +++++++++ test/log.cwa | 7 +++++++ web/src/audiolet.js | 10 +++++++++ web/src/microw8.js | 10 +++++++++ 7 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 test/log.cwa diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index e0f701c877d0d016c09cb5258e6f03f07b7788df..f4ffb3636522e397386d86f5aa32689d00e472b4 100644 GIT binary patch literal 3771 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 XY17Ufs5h%>gDVE2h^~e~mCM#f4s~gX diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index e1f0e45..daf4946 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -4,6 +4,7 @@ import "env.sin" fn sin(f32) -> f32; import "env.cos" fn cos(f32) -> f32; import "env.pow" fn pow(f32, f32) -> f32; import "env.exp" fn exp(f32) -> f32; +import "env.logChar" fn logChar(i32); export fn time() -> f32 { (0!64) as f32 / 1000 as f32 @@ -60,7 +61,7 @@ export fn cls(col: i32) { let i: i32; textCursorX = 0; textCursorY = 0; - graphicsText = 0; + outputChannel = 0; col = (col & 255) * 0x1010101; loop pixels { i!120 = col; @@ -305,7 +306,7 @@ global mut textCursorX = 0; global mut textCursorY = 0; global mut textColor = 15; global mut bgColor = 0; -global mut graphicsText = 0; +global mut outputChannel = 0; export fn printChar(char: i32) { loop chars { @@ -317,6 +318,18 @@ export fn printChar(char: i32) { global mut controlCodeLength = 0; fn printSingleChar(char: i32) { + if char >= 4 & char <= 6 { + outputChannel = char - 4; + textCursorX = 0; + textCursorY = 0; + return; + } + + if outputChannel >= 2 { + logChar(char); + return; + } + controlCodeLength?0x12d20 = char; controlCodeLength = controlCodeLength + 1; char = 0x12d20?0; @@ -330,13 +343,6 @@ fn printSingleChar(char: i32) { return; } - if char == 4 | char == 5 { - graphicsText = char == 5; - textCursorX = 0; - textCursorY = 0; - return; - } - if char == 7 { 80?0 = 80?0 ^ 2; return; @@ -344,7 +350,7 @@ fn printSingleChar(char: i32) { if char == 8 { textCursorX = textCursorX - 8; - if !graphicsText & textCursorX < 0 { + if !outputChannel & textCursorX < 0 { textCursorX = 320-8; printSingleChar(11); } @@ -352,7 +358,7 @@ fn printSingleChar(char: i32) { } if char == 9 { - if !graphicsText & textCursorX >= 320 { + if !outputChannel & textCursorX >= 320 { printChar(0xd0a); } textCursorX = textCursorX + 8; @@ -361,7 +367,7 @@ fn printSingleChar(char: i32) { if char == 10 { textCursorY = textCursorY + 8; - if !graphicsText & textCursorY >= 240 { + if !outputChannel & textCursorY >= 240 { textCursorY = 240 - 8; let i: i32; loop scroll_copy { @@ -375,7 +381,7 @@ fn printSingleChar(char: i32) { if char == 11 { textCursorY = textCursorY - 8; - if !graphicsText & textCursorY < 0 { + if !outputChannel & textCursorY < 0 { textCursorY = 0; let i = 320 * (240 - 8); loop scroll_copy { @@ -415,8 +421,8 @@ fn printSingleChar(char: i32) { } if char == 31 { - textCursorX = 0x12d20?1 * (8 - graphicsText * 6); - textCursorY = 0x12d20?2 * (8 - graphicsText * 7); + textCursorX = 0x12d20?1 * (8 - outputChannel * 6); + textCursorY = 0x12d20?2 * (8 - outputChannel * 7); return; } @@ -441,7 +447,7 @@ data(0x12d00) { } fn drawChar(char: i32) { - if !graphicsText & textCursorX >= 320 { + if !outputChannel & textCursorX >= 320 { printChar(0xd0a); } @@ -449,7 +455,7 @@ fn drawChar(char: i32) { loop rows { let bits = (char * 8 + y)?0x13400; let x = 0; - if graphicsText { + if outputChannel { loop pixels { if (bits := bits << 1) & 256 { setPixel(textCursorX + x, textCursorY + y, textColor); @@ -501,7 +507,7 @@ export fn setBackgroundColor(col: i32) { } export fn setCursorPosition(x: i32, y: i32) { - let lazy scale = select(graphicsText, 1, 8); + let lazy scale = select(outputChannel, 1, 8); textCursorX = x * scale; textCursorY = y * scale; } diff --git a/src/run-web.html b/src/run-web.html index cfe6dcb..7ae3e00 100644 --- a/src/run-web.html +++ b/src/run-web.html @@ -1 +1 @@ -uw8-run
\ No newline at end of file +uw8-run
\ No newline at end of file diff --git a/src/run_native.rs b/src/run_native.rs index 1449048..8502253 100644 --- a/src/run_native.rs +++ b/src/run_native.rs @@ -293,6 +293,16 @@ fn add_native_functions( for i in 10..64 { linker.func_wrap("env", &format!("reserved{}", i), || {})?; } + let log_line = std::sync::Mutex::new(String::new()); + linker.func_wrap("env", "logChar", move |c: i32| { + let mut log_line = log_line.lock().unwrap(); + if c == 10 { + println!("{}", log_line); + log_line.clear(); + } else { + log_line.push(c as u8 as char); + } + })?; for i in 0..16 { linker.define( "env", diff --git a/test/log.cwa b/test/log.cwa new file mode 100644 index 0000000..b373ab7 --- /dev/null +++ b/test/log.cwa @@ -0,0 +1,7 @@ +include "../examples/include/microw8-api.cwa" + +export fn upd() { + printChar('\06f: '); + printInt(32!32 * 6 / 100); + printChar('\n\4'); +} \ No newline at end of file diff --git a/web/src/audiolet.js b/web/src/audiolet.js index 4f8bb2b..e794277 100644 --- a/web/src/audiolet.js +++ b/web/src/audiolet.js @@ -37,6 +37,16 @@ class APU extends AudioWorkletProcessor { importObject.env['reserved' + i] = () => { }; } + let logLine = ''; + importObject.env['logChar'] = (c) => { + if(c == 10) { + console.log(logLine); + logLine = ''; + } else { + logLine += String.fromCharCode(c); + } + }; + for (let i = 0; i < 16; ++i) { importObject.env['g_reserved' + i] = 0; } diff --git a/web/src/microw8.js b/web/src/microw8.js index a4fdbea..6f8e2bf 100644 --- a/web/src/microw8.js +++ b/web/src/microw8.js @@ -206,6 +206,16 @@ export default function MicroW8(screen, config = {}) { importObject.env['reserved' + i] = () => { }; } + let logLine = ''; + importObject.env['logChar'] = (c) => { + if(c == 10) { + console.log(logLine); + logLine = ''; + } else { + logLine += String.fromCharCode(c); + } + }; + for (let i = 0; i < 16; ++i) { importObject.env['g_reserved' + i] = 0; }