velxio/test/test_custom_chips/sdk/examples/galaksija-display.c

107 lines
8.1 KiB
C
Raw Normal View History

/*
* galaksija-display - Galaksija (1983) 32x16 text video rendered from its
* memory-mapped video RAM (Phase 3, project/multichip-bus/). Passive BUS SNOOP:
feat(chipbus): Galaksija home computer gallery example + browser perf throttle Ships the full Galaksija (1983 Z80 home computer) as a runnable Retro gallery example, plus the pieces needed to run a multi-chip bus live in the browser. Gallery example (examples-retro-intel.ts, id 'galaksija-z80-computer'): Z80 + galaksija-rom (public-domain ROM A+B) + ram-64k + inverter (A13 decode) + galaksija-display + a power-on reset chip, wired chip-to-chip over the bus (76 wires), no board. Click Resume and it boots the real ROM to the "READY" prompt on the green display. Chip wasm is embedded (wasmBase64) so it runs without a backend compile. - ChipRuntime.tickTimers gains a wall-clock budget (CustomChipPart passes 6 ms): a faithful-but-slow event-driven bus can't run a real-time CPU in one animation frame, so without a cap a Z80 fetching over the settle kernel froze the tab. With the budget the sim advances slower than real time (boots over a few seconds) and the UI stays responsive; fast single-chip examples finish under budget and are unaffected. - galaksija-display: blits its framebuffer on a ~30 fps timer instead of on every character write, so a clear-screen burst doesn't flood the canvas. - reset-gen: power-on reset (pulses RESET high, ties WAIT/BUSREQ/INT/NMI high) so the machine boots on Resume without a manual reset. - chipbus flag now defaults ON (override with ?chipbus=off): chip-to-chip buses are a core capability; single-chip and board nets never take this path, so the only thing enabled is multi-chip buses, previously broken. Verified live in the browser: the example boots and renders "@'READY" with the ">_" prompt, responsive. Full suite 2084 pass (5 pre-existing, unrelated env failures). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:49:33 +07:00
* watches WR + address + data; on a write into 0x2800-0x2BFF it draws the
* character into a 256x128 framebuffer. Never drives the bus.
*
feat(chipbus): Galaksija home computer gallery example + browser perf throttle Ships the full Galaksija (1983 Z80 home computer) as a runnable Retro gallery example, plus the pieces needed to run a multi-chip bus live in the browser. Gallery example (examples-retro-intel.ts, id 'galaksija-z80-computer'): Z80 + galaksija-rom (public-domain ROM A+B) + ram-64k + inverter (A13 decode) + galaksija-display + a power-on reset chip, wired chip-to-chip over the bus (76 wires), no board. Click Resume and it boots the real ROM to the "READY" prompt on the green display. Chip wasm is embedded (wasmBase64) so it runs without a backend compile. - ChipRuntime.tickTimers gains a wall-clock budget (CustomChipPart passes 6 ms): a faithful-but-slow event-driven bus can't run a real-time CPU in one animation frame, so without a cap a Z80 fetching over the settle kernel froze the tab. With the budget the sim advances slower than real time (boots over a few seconds) and the UI stays responsive; fast single-chip examples finish under budget and are unaffected. - galaksija-display: blits its framebuffer on a ~30 fps timer instead of on every character write, so a clear-screen burst doesn't flood the canvas. - reset-gen: power-on reset (pulses RESET high, ties WAIT/BUSREQ/INT/NMI high) so the machine boots on Resume without a manual reset. - chipbus flag now defaults ON (override with ?chipbus=off): chip-to-chip buses are a core capability; single-chip and board nets never take this path, so the only thing enabled is multi-chip buses, previously broken. Verified live in the browser: the example boots and renders "@'READY" with the ">_" prompt, responsive. Full suite 2084 pass (5 pre-existing, unrelated env failures). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:49:33 +07:00
* Galaksija stores ASCII codes in video RAM (it writes "READY" as 0x52,0x45,..).
* Rendered with the public-domain IBM/VGA 8x8 font (font8x8 by Daniel Hepper /
* Marcel Sondaar), green-on-black phosphor. font8x8: 1 byte/row, bit 0 (LSB) =
* leftmost pixel, 1 = lit. The framebuffer is BLITTED on a ~30 fps timer (not
* on every character write) so a fast clear-screen burst does not flood the
* host canvas with repaints.
*/
#include "velxio-chip.h"
#include <stdint.h>
#include <stdbool.h>
#define COLS 32
#define ROWS 16
#define FB_W (COLS*8)
#define FB_H (ROWS*8)
static const uint8_t font8x8[1024] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3c,0x3c,0x18,0x18,0x00,0x18,0x00,
0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x36,0x7f,0x36,0x7f,0x36,0x36,0x00,
0x0c,0x3e,0x03,0x1e,0x30,0x1f,0x0c,0x00,0x00,0x63,0x33,0x18,0x0c,0x66,0x63,0x00,
0x1c,0x36,0x1c,0x6e,0x3b,0x33,0x6e,0x00,0x06,0x06,0x03,0x00,0x00,0x00,0x00,0x00,
0x18,0x0c,0x06,0x06,0x06,0x0c,0x18,0x00,0x06,0x0c,0x18,0x18,0x18,0x0c,0x06,0x00,
0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00,0x00,0x0c,0x0c,0x3f,0x0c,0x0c,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x06,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x60,0x30,0x18,0x0c,0x06,0x03,0x01,0x00,
0x3e,0x63,0x73,0x7b,0x6f,0x67,0x3e,0x00,0x0c,0x0e,0x0c,0x0c,0x0c,0x0c,0x3f,0x00,
0x1e,0x33,0x30,0x1c,0x06,0x33,0x3f,0x00,0x1e,0x33,0x30,0x1c,0x30,0x33,0x1e,0x00,
0x38,0x3c,0x36,0x33,0x7f,0x30,0x78,0x00,0x3f,0x03,0x1f,0x30,0x30,0x33,0x1e,0x00,
0x1c,0x06,0x03,0x1f,0x33,0x33,0x1e,0x00,0x3f,0x33,0x30,0x18,0x0c,0x0c,0x0c,0x00,
0x1e,0x33,0x33,0x1e,0x33,0x33,0x1e,0x00,0x1e,0x33,0x33,0x3e,0x30,0x18,0x0e,0x00,
0x00,0x0c,0x0c,0x00,0x00,0x0c,0x0c,0x00,0x00,0x0c,0x0c,0x00,0x00,0x0c,0x0c,0x06,
0x18,0x0c,0x06,0x03,0x06,0x0c,0x18,0x00,0x00,0x00,0x3f,0x00,0x00,0x3f,0x00,0x00,
0x06,0x0c,0x18,0x30,0x18,0x0c,0x06,0x00,0x1e,0x33,0x30,0x18,0x0c,0x00,0x0c,0x00,
0x3e,0x63,0x7b,0x7b,0x7b,0x03,0x1e,0x00,0x0c,0x1e,0x33,0x33,0x3f,0x33,0x33,0x00,
0x3f,0x66,0x66,0x3e,0x66,0x66,0x3f,0x00,0x3c,0x66,0x03,0x03,0x03,0x66,0x3c,0x00,
0x1f,0x36,0x66,0x66,0x66,0x36,0x1f,0x00,0x7f,0x46,0x16,0x1e,0x16,0x46,0x7f,0x00,
0x7f,0x46,0x16,0x1e,0x16,0x06,0x0f,0x00,0x3c,0x66,0x03,0x03,0x73,0x66,0x7c,0x00,
0x33,0x33,0x33,0x3f,0x33,0x33,0x33,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,
0x78,0x30,0x30,0x30,0x33,0x33,0x1e,0x00,0x67,0x66,0x36,0x1e,0x36,0x66,0x67,0x00,
0x0f,0x06,0x06,0x06,0x46,0x66,0x7f,0x00,0x63,0x77,0x7f,0x7f,0x6b,0x63,0x63,0x00,
0x63,0x67,0x6f,0x7b,0x73,0x63,0x63,0x00,0x1c,0x36,0x63,0x63,0x63,0x36,0x1c,0x00,
0x3f,0x66,0x66,0x3e,0x06,0x06,0x0f,0x00,0x1e,0x33,0x33,0x33,0x3b,0x1e,0x38,0x00,
0x3f,0x66,0x66,0x3e,0x36,0x66,0x67,0x00,0x1e,0x33,0x07,0x0e,0x38,0x33,0x1e,0x00,
0x3f,0x2d,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x3f,0x00,
0x33,0x33,0x33,0x33,0x33,0x1e,0x0c,0x00,0x63,0x63,0x63,0x6b,0x7f,0x77,0x63,0x00,
0x63,0x63,0x36,0x1c,0x1c,0x36,0x63,0x00,0x33,0x33,0x33,0x1e,0x0c,0x0c,0x1e,0x00,
0x7f,0x63,0x31,0x18,0x4c,0x66,0x7f,0x00,0x1e,0x06,0x06,0x06,0x06,0x06,0x1e,0x00,
0x03,0x06,0x0c,0x18,0x30,0x60,0x40,0x00,0x1e,0x18,0x18,0x18,0x18,0x18,0x1e,0x00,
0x08,0x1c,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,
0x0c,0x0c,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x30,0x3e,0x33,0x6e,0x00,
0x07,0x06,0x06,0x3e,0x66,0x66,0x3b,0x00,0x00,0x00,0x1e,0x33,0x03,0x33,0x1e,0x00,
0x38,0x30,0x30,0x3e,0x33,0x33,0x6e,0x00,0x00,0x00,0x1e,0x33,0x3f,0x03,0x1e,0x00,
0x1c,0x36,0x06,0x0f,0x06,0x06,0x0f,0x00,0x00,0x00,0x6e,0x33,0x33,0x3e,0x30,0x1f,
0x07,0x06,0x36,0x6e,0x66,0x66,0x67,0x00,0x0c,0x00,0x0e,0x0c,0x0c,0x0c,0x1e,0x00,
0x30,0x00,0x30,0x30,0x30,0x33,0x33,0x1e,0x07,0x06,0x66,0x36,0x1e,0x36,0x67,0x00,
0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x33,0x7f,0x7f,0x6b,0x63,0x00,
0x00,0x00,0x1f,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x1e,0x33,0x33,0x33,0x1e,0x00,
0x00,0x00,0x3b,0x66,0x66,0x3e,0x06,0x0f,0x00,0x00,0x6e,0x33,0x33,0x3e,0x30,0x78,
0x00,0x00,0x3b,0x6e,0x66,0x06,0x0f,0x00,0x00,0x00,0x3e,0x03,0x1e,0x30,0x1f,0x00,
0x08,0x0c,0x3e,0x0c,0x0c,0x2c,0x18,0x00,0x00,0x00,0x33,0x33,0x33,0x33,0x6e,0x00,
0x00,0x00,0x33,0x33,0x33,0x1e,0x0c,0x00,0x00,0x00,0x63,0x6b,0x7f,0x7f,0x36,0x00,
0x00,0x00,0x63,0x36,0x1c,0x36,0x63,0x00,0x00,0x00,0x33,0x33,0x33,0x3e,0x30,0x1f,
0x00,0x00,0x3f,0x19,0x0c,0x26,0x3f,0x00,0x38,0x0c,0x0c,0x07,0x0c,0x0c,0x38,0x00,
0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00,0x07,0x0c,0x0c,0x38,0x0c,0x0c,0x07,0x00,
0x6e,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
feat(chipbus): Galaksija home computer gallery example + browser perf throttle Ships the full Galaksija (1983 Z80 home computer) as a runnable Retro gallery example, plus the pieces needed to run a multi-chip bus live in the browser. Gallery example (examples-retro-intel.ts, id 'galaksija-z80-computer'): Z80 + galaksija-rom (public-domain ROM A+B) + ram-64k + inverter (A13 decode) + galaksija-display + a power-on reset chip, wired chip-to-chip over the bus (76 wires), no board. Click Resume and it boots the real ROM to the "READY" prompt on the green display. Chip wasm is embedded (wasmBase64) so it runs without a backend compile. - ChipRuntime.tickTimers gains a wall-clock budget (CustomChipPart passes 6 ms): a faithful-but-slow event-driven bus can't run a real-time CPU in one animation frame, so without a cap a Z80 fetching over the settle kernel froze the tab. With the budget the sim advances slower than real time (boots over a few seconds) and the UI stays responsive; fast single-chip examples finish under budget and are unaffected. - galaksija-display: blits its framebuffer on a ~30 fps timer instead of on every character write, so a clear-screen burst doesn't flood the canvas. - reset-gen: power-on reset (pulses RESET high, ties WAIT/BUSREQ/INT/NMI high) so the machine boots on Resume without a manual reset. - chipbus flag now defaults ON (override with ?chipbus=off): chip-to-chip buses are a core capability; single-chip and board nets never take this path, so the only thing enabled is multi-chip buses, previously broken. Verified live in the browser: the example boots and renders "@'READY" with the ">_" prompt, responsive. Full suite 2084 pass (5 pre-existing, unrelated env failures). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:49:33 +07:00
typedef struct { vx_pin a[14]; vx_pin d[8]; vx_pin wr; int wr_last; vx_buffer fb; vx_timer paint; bool dirty; } chip_t;
static chip_t G;
static uint8_t fbpix[FB_W*FB_H*4];
static uint16_t read_addr(void){ uint16_t v=0; for(int i=0;i<14;i++) if(vx_pin_read(G.a[i])) v|=(1u<<i); return v; }
static uint8_t read_data(void){ uint8_t v=0; for(int i=0;i<8;i++) if(vx_pin_read(G.d[i])) v|=(1u<<i); return v; }
static void put_px(int x,int y,uint8_t lit){ if((unsigned)x<FB_W&&(unsigned)y<FB_H){ int o=(y*FB_W+x)*4; fbpix[o]=lit?0x33:0x00; fbpix[o+1]=lit?0xE0:0x12; fbpix[o+2]=lit?0x33:0x00; fbpix[o+3]=0xFF; } }
feat(chipbus): Galaksija home computer gallery example + browser perf throttle Ships the full Galaksija (1983 Z80 home computer) as a runnable Retro gallery example, plus the pieces needed to run a multi-chip bus live in the browser. Gallery example (examples-retro-intel.ts, id 'galaksija-z80-computer'): Z80 + galaksija-rom (public-domain ROM A+B) + ram-64k + inverter (A13 decode) + galaksija-display + a power-on reset chip, wired chip-to-chip over the bus (76 wires), no board. Click Resume and it boots the real ROM to the "READY" prompt on the green display. Chip wasm is embedded (wasmBase64) so it runs without a backend compile. - ChipRuntime.tickTimers gains a wall-clock budget (CustomChipPart passes 6 ms): a faithful-but-slow event-driven bus can't run a real-time CPU in one animation frame, so without a cap a Z80 fetching over the settle kernel froze the tab. With the budget the sim advances slower than real time (boots over a few seconds) and the UI stays responsive; fast single-chip examples finish under budget and are unaffected. - galaksija-display: blits its framebuffer on a ~30 fps timer instead of on every character write, so a clear-screen burst doesn't flood the canvas. - reset-gen: power-on reset (pulses RESET high, ties WAIT/BUSREQ/INT/NMI high) so the machine boots on Resume without a manual reset. - chipbus flag now defaults ON (override with ?chipbus=off): chip-to-chip buses are a core capability; single-chip and board nets never take this path, so the only thing enabled is multi-chip buses, previously broken. Verified live in the browser: the example boots and renders "@'READY" with the ">_" prompt, responsive. Full suite 2084 pass (5 pre-existing, unrelated env failures). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:49:33 +07:00
static void render_cell(int col,int row,uint8_t ch){ uint8_t c=ch&0x7f; for(int line=0;line<8;line++){ uint8_t bits=font8x8[c*8+line]; for(int px=0;px<8;px++) put_px(col*8+px,row*8+line,(bits>>px)&1);} G.dirty=true; }
static void on_wr(void* u, vx_pin p, int value){ (void)u;(void)p; if(G.wr_last==0&&value==1){ uint16_t a=read_addr(); if((a&0x3C00)==0x2800){ uint16_t off=a&0x3FF; int row=off/COLS,col=off%COLS; if(row<ROWS) render_cell(col,row,read_data()); } } G.wr_last=value; }
feat(chipbus): Galaksija home computer gallery example + browser perf throttle Ships the full Galaksija (1983 Z80 home computer) as a runnable Retro gallery example, plus the pieces needed to run a multi-chip bus live in the browser. Gallery example (examples-retro-intel.ts, id 'galaksija-z80-computer'): Z80 + galaksija-rom (public-domain ROM A+B) + ram-64k + inverter (A13 decode) + galaksija-display + a power-on reset chip, wired chip-to-chip over the bus (76 wires), no board. Click Resume and it boots the real ROM to the "READY" prompt on the green display. Chip wasm is embedded (wasmBase64) so it runs without a backend compile. - ChipRuntime.tickTimers gains a wall-clock budget (CustomChipPart passes 6 ms): a faithful-but-slow event-driven bus can't run a real-time CPU in one animation frame, so without a cap a Z80 fetching over the settle kernel froze the tab. With the budget the sim advances slower than real time (boots over a few seconds) and the UI stays responsive; fast single-chip examples finish under budget and are unaffected. - galaksija-display: blits its framebuffer on a ~30 fps timer instead of on every character write, so a clear-screen burst doesn't flood the canvas. - reset-gen: power-on reset (pulses RESET high, ties WAIT/BUSREQ/INT/NMI high) so the machine boots on Resume without a manual reset. - chipbus flag now defaults ON (override with ?chipbus=off): chip-to-chip buses are a core capability; single-chip and board nets never take this path, so the only thing enabled is multi-chip buses, previously broken. Verified live in the browser: the example boots and renders "@'READY" with the ">_" prompt, responsive. Full suite 2084 pass (5 pre-existing, unrelated env failures). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:49:33 +07:00
static void on_paint(void* u){ (void)u; if(G.dirty){ vx_buffer_write(G.fb,0,fbpix,sizeof(fbpix)); G.dirty=false; } }
void chip_setup(void){
char name[4];
for(int i=0;i<14;i++){ name[0]='A'; if(i<10){name[1]='0'+i;name[2]=0;} else {name[1]='1';name[2]='0'+(i-10);name[3]=0;} G.a[i]=vx_pin_register(name,VX_INPUT);}
for(int i=0;i<8;i++){ name[0]='D';name[1]='0'+i;name[2]=0; G.d[i]=vx_pin_register(name,VX_INPUT);}
G.wr=vx_pin_register("WR",VX_INPUT); G.wr_last=vx_pin_read(G.wr);
uint32_t w,h; G.fb=vx_framebuffer_init(&w,&h);
for(int i=0;i<FB_W*FB_H;i++){ fbpix[i*4]=0;fbpix[i*4+1]=0x12;fbpix[i*4+2]=0;fbpix[i*4+3]=0xFF; }
feat(chipbus): Galaksija home computer gallery example + browser perf throttle Ships the full Galaksija (1983 Z80 home computer) as a runnable Retro gallery example, plus the pieces needed to run a multi-chip bus live in the browser. Gallery example (examples-retro-intel.ts, id 'galaksija-z80-computer'): Z80 + galaksija-rom (public-domain ROM A+B) + ram-64k + inverter (A13 decode) + galaksija-display + a power-on reset chip, wired chip-to-chip over the bus (76 wires), no board. Click Resume and it boots the real ROM to the "READY" prompt on the green display. Chip wasm is embedded (wasmBase64) so it runs without a backend compile. - ChipRuntime.tickTimers gains a wall-clock budget (CustomChipPart passes 6 ms): a faithful-but-slow event-driven bus can't run a real-time CPU in one animation frame, so without a cap a Z80 fetching over the settle kernel froze the tab. With the budget the sim advances slower than real time (boots over a few seconds) and the UI stays responsive; fast single-chip examples finish under budget and are unaffected. - galaksija-display: blits its framebuffer on a ~30 fps timer instead of on every character write, so a clear-screen burst doesn't flood the canvas. - reset-gen: power-on reset (pulses RESET high, ties WAIT/BUSREQ/INT/NMI high) so the machine boots on Resume without a manual reset. - chipbus flag now defaults ON (override with ?chipbus=off): chip-to-chip buses are a core capability; single-chip and board nets never take this path, so the only thing enabled is multi-chip buses, previously broken. Verified live in the browser: the example boots and renders "@'READY" with the ">_" prompt, responsive. Full suite 2084 pass (5 pre-existing, unrelated env failures). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:49:33 +07:00
vx_buffer_write(G.fb,0,fbpix,sizeof(fbpix)); G.dirty=false;
vx_pin_watch(G.wr,VX_EDGE_BOTH,on_wr,0);
feat(chipbus): Galaksija home computer gallery example + browser perf throttle Ships the full Galaksija (1983 Z80 home computer) as a runnable Retro gallery example, plus the pieces needed to run a multi-chip bus live in the browser. Gallery example (examples-retro-intel.ts, id 'galaksija-z80-computer'): Z80 + galaksija-rom (public-domain ROM A+B) + ram-64k + inverter (A13 decode) + galaksija-display + a power-on reset chip, wired chip-to-chip over the bus (76 wires), no board. Click Resume and it boots the real ROM to the "READY" prompt on the green display. Chip wasm is embedded (wasmBase64) so it runs without a backend compile. - ChipRuntime.tickTimers gains a wall-clock budget (CustomChipPart passes 6 ms): a faithful-but-slow event-driven bus can't run a real-time CPU in one animation frame, so without a cap a Z80 fetching over the settle kernel froze the tab. With the budget the sim advances slower than real time (boots over a few seconds) and the UI stays responsive; fast single-chip examples finish under budget and are unaffected. - galaksija-display: blits its framebuffer on a ~30 fps timer instead of on every character write, so a clear-screen burst doesn't flood the canvas. - reset-gen: power-on reset (pulses RESET high, ties WAIT/BUSREQ/INT/NMI high) so the machine boots on Resume without a manual reset. - chipbus flag now defaults ON (override with ?chipbus=off): chip-to-chip buses are a core capability; single-chip and board nets never take this path, so the only thing enabled is multi-chip buses, previously broken. Verified live in the browser: the example boots and renders "@'READY" with the ">_" prompt, responsive. Full suite 2084 pass (5 pre-existing, unrelated env failures). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 23:49:33 +07:00
G.paint=vx_timer_create(on_paint,0); vx_timer_start(G.paint,33000000ULL,true); /* ~30 fps blit */
}