From fe14bb6370466ce28a94855b5dba39b907844291 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Mon, 27 Jul 2026 01:50:07 -0500 Subject: [PATCH] Serial support bugs fixed. --- examples/serial/serial.c | 4 ++++ examples/sertest/sertest.c | 33 +++++++++++++++++++++++++++++++++ make/amiga.mk | 8 +++++++- make/atarist.mk | 8 +++++++- make/dos.mk | 9 ++++++++- make/iigs.mk | 7 ++++++- 6 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 examples/sertest/sertest.c diff --git a/examples/serial/serial.c b/examples/serial/serial.c index 771dd3e..ddd17e2 100644 --- a/examples/serial/serial.c +++ b/examples/serial/serial.c @@ -188,6 +188,10 @@ int main(void) { serialCfg.flow = JL_SERIAL_FLOW_NONE; serialCfg.unit = 0u; linkOpen = jlSerialOpen(JL_SERIAL_DEFAULT, &serialCfg); + if (linkOpen) { + // Greet on connect -- also a TX heartbeat that a loopback peer can see. + sendBytes(gBanner, (uint16_t)(sizeof(gBanner) - 1u)); + } buildPalette(screen); jlScbSetRange(screen, 0, SURFACE_HEIGHT - 1, 0); diff --git a/examples/sertest/sertest.c b/examples/sertest/sertest.c new file mode 100644 index 0000000..67bd1d9 --- /dev/null +++ b/examples/sertest/sertest.c @@ -0,0 +1,33 @@ +// Minimal headless serial self-test -- NO jlInit (no video/graphics), so it +// runs even where the graphics HAL can't (e.g. AROS on the Amiga). Opens the +// DEFAULT port at 9600 8N1, sends a banner (TX heartbeat), then echoes every +// received byte forever. A host serial peer verifies banner (TX) + echo (RX). +#include + +int main(void) { + jlSerialConfigT cfg; + static const char banner[] = "JLSERTEST-READY\r\n"; + + cfg.baud = 9600u; + cfg.dataBits = 8u; + cfg.stopBits = 1u; + cfg.parity = JL_SERIAL_PARITY_NONE; + cfg.flow = JL_SERIAL_FLOW_NONE; + cfg.unit = 0u; + if (!jlSerialOpen(JL_SERIAL_DEFAULT, &cfg)) { + return 1; + } + jlSerialWrite((const uint8_t *)banner, (uint16_t)(sizeof(banner) - 1u)); + + for (;;) { + uint8_t buf[64]; + uint16_t n; + + jlSerialPoll(); + n = jlSerialRead(buf, (uint16_t)sizeof(buf)); + if (n > 0u) { + jlSerialWrite(buf, n); + } + } + /* not reached */ +} diff --git a/make/amiga.mk b/make/amiga.mk index 5eb935a..6fd5f59 100644 --- a/make/amiga.mk +++ b/make/amiga.mk @@ -70,6 +70,8 @@ KEYS_SRC := $(EXAMPLES)/keys/keys.c KEYS_BIN := $(BINDIR)/Keys SERIAL_SRC := $(EXAMPLES)/serial/serial.c SERIAL_BIN := $(BINDIR)/Serial +SERTEST_SRC := $(EXAMPLES)/sertest/sertest.c +SERTEST_BIN := $(BINDIR)/SerTest SAVE_SRC := $(EXAMPLES)/save/save.c SAVE_BIN := $(BINDIR)/Save JOY_SRC := $(EXAMPLES)/joy/joy.c @@ -137,7 +139,7 @@ DATA_DIR := $(BINDIR)/DATA DATA_FILES := $(DATA_DIR)/test.mod $(DATA_DIR)/test.sfx .PHONY: all amiga clean-amiga -all amiga: $(LIB) $(HELLO_BIN) $(PATTERN_BIN) $(DRAW_BIN) $(KEYS_BIN) $(SERIAL_BIN) $(SAVE_BIN) $(JOY_BIN) $(SPRITE_BIN) $(AUDIO_BIN) $(UBER_BIN) $(ADV_BIN) $(ADV2_BIN) $(AGI_BIN) $(STAXI_BIN) $(DATA_FILES) $(STAXI_ASSET_DSTS) +all amiga: $(LIB) $(HELLO_BIN) $(PATTERN_BIN) $(DRAW_BIN) $(KEYS_BIN) $(SERIAL_BIN) $(SERTEST_BIN) $(SAVE_BIN) $(JOY_BIN) $(SPRITE_BIN) $(AUDIO_BIN) $(UBER_BIN) $(ADV_BIN) $(ADV2_BIN) $(AGI_BIN) $(STAXI_BIN) $(DATA_FILES) $(STAXI_ASSET_DSTS) $(BUILD)/obj/core/%.o: $(SRC_CORE)/%.c @mkdir -p $(dir $@) @@ -201,6 +203,10 @@ $(SERIAL_BIN): $(SERIAL_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) +$(SERTEST_BIN): $(SERTEST_SRC) $(LIB) + @mkdir -p $(dir $@) + $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) + $(SAVE_BIN): $(SAVE_SRC) $(LIB) @mkdir -p $(dir $@) $(AMIGA_CC) $(CFLAGS) $< $(LIB) -o $@ $(LDFLAGS) diff --git a/make/atarist.mk b/make/atarist.mk index d770004..d2bd0c7 100644 --- a/make/atarist.mk +++ b/make/atarist.mk @@ -57,6 +57,8 @@ KEYS_SRC := $(EXAMPLES)/keys/keys.c KEYS_BIN := $(BINDIR)/KEYS.PRG SERIAL_SRC := $(EXAMPLES)/serial/serial.c SERIAL_BIN := $(BINDIR)/SERIAL.PRG +SERTEST_SRC := $(EXAMPLES)/sertest/sertest.c +SERTEST_BIN := $(BINDIR)/SERTEST.PRG SAVE_SRC := $(EXAMPLES)/save/save.c SAVE_BIN := $(BINDIR)/SAVE.PRG JOY_SRC := $(EXAMPLES)/joy/joy.c @@ -117,7 +119,7 @@ DATA_DIR := $(BINDIR)/DATA DATA_FILES := $(DATA_DIR)/test.mod $(DATA_DIR)/test.sfx .PHONY: all atarist clean-atarist -all atarist: $(LIB) $(LIBXMP_AR) $(HELLO_BIN) $(PATTERN_BIN) $(DRAW_BIN) $(KEYS_BIN) $(SERIAL_BIN) $(SAVE_BIN) $(JOY_BIN) $(SPRITE_BIN) $(AUDIO_BIN) $(UBER_BIN) $(ADV_BIN) $(ADV2_BIN) $(AGI_BIN) $(STAXI_BIN) $(DATA_FILES) $(STAXI_ASSET_DSTS) +all atarist: $(LIB) $(LIBXMP_AR) $(HELLO_BIN) $(PATTERN_BIN) $(DRAW_BIN) $(KEYS_BIN) $(SERIAL_BIN) $(SERTEST_BIN) $(SAVE_BIN) $(JOY_BIN) $(SPRITE_BIN) $(AUDIO_BIN) $(UBER_BIN) $(ADV_BIN) $(ADV2_BIN) $(AGI_BIN) $(STAXI_BIN) $(DATA_FILES) $(STAXI_ASSET_DSTS) $(BUILD)/obj/core/%.o: $(SRC_CORE)/%.c @mkdir -p $(dir $@) @@ -188,6 +190,10 @@ $(SERIAL_BIN): $(SERIAL_SRC) $(LIB) @mkdir -p $(dir $@) $(ST_CC) $(CFLAGS) $< $(LIB) $(LIBXMP_AR) -o $@ $(LDFLAGS) +$(SERTEST_BIN): $(SERTEST_SRC) $(LIB) + @mkdir -p $(dir $@) + $(ST_CC) $(CFLAGS) $< $(LIB) $(LIBXMP_AR) -o $@ $(LDFLAGS) + $(SAVE_BIN): $(SAVE_SRC) $(LIB) @mkdir -p $(dir $@) $(ST_CC) $(CFLAGS) $< $(LIB) $(LIBXMP_AR) -o $@ $(LDFLAGS) diff --git a/make/dos.mk b/make/dos.mk index d853de7..48276b9 100644 --- a/make/dos.mk +++ b/make/dos.mk @@ -53,6 +53,8 @@ KEYS_SRC := $(EXAMPLES)/keys/keys.c KEYS_BIN := $(BINDIR)/KEYS.EXE SERIAL_SRC := $(EXAMPLES)/serial/serial.c SERIAL_BIN := $(BINDIR)/SERIAL.EXE +SERTEST_SRC := $(EXAMPLES)/sertest/sertest.c +SERTEST_BIN := $(BINDIR)/SERTEST.EXE SAVE_SRC := $(EXAMPLES)/save/save.c SAVE_BIN := $(BINDIR)/SAVE.EXE JOY_SRC := $(EXAMPLES)/joy/joy.c @@ -132,7 +134,7 @@ STAXI_ASSET_DSTS += $(STAXI_SPC_RUN) MKSTLEVEL_BIN := $(REPO_DIR)/build/tools/mkstlevel .PHONY: all dos clean-dos -all dos: $(LIB) $(LIBXMP_AR) $(HELLO_BIN) $(PATTERN_BIN) $(DRAW_BIN) $(KEYS_BIN) $(SERIAL_BIN) $(SAVE_BIN) $(JOY_BIN) $(SPRITE_BIN) $(AUDIO_BIN) $(UBER_BIN) $(ADV_BIN) $(ADV2_BIN) $(AGI_BIN) $(STAXI_BIN) $(DATA_FILES) $(STAXI_ASSET_DSTS) +all dos: $(LIB) $(LIBXMP_AR) $(HELLO_BIN) $(PATTERN_BIN) $(DRAW_BIN) $(KEYS_BIN) $(SERIAL_BIN) $(SERTEST_BIN) $(SAVE_BIN) $(JOY_BIN) $(SPRITE_BIN) $(AUDIO_BIN) $(UBER_BIN) $(ADV_BIN) $(ADV2_BIN) $(AGI_BIN) $(STAXI_BIN) $(DATA_FILES) $(STAXI_ASSET_DSTS) $(BUILD)/obj/core/%.o: $(SRC_CORE)/%.c @mkdir -p $(dir $@) @@ -191,6 +193,11 @@ $(SERIAL_BIN): $(SERIAL_SRC) $(LIB) $(DOS_CC) $(CFLAGS) $< $(LIB) $(LIBXMP_AR) -o $@ $(DOS_EMBED_DPMI) $@ +$(SERTEST_BIN): $(SERTEST_SRC) $(LIB) + @mkdir -p $(dir $@) + $(DOS_CC) $(CFLAGS) $< $(LIB) $(LIBXMP_AR) -o $@ + $(DOS_EMBED_DPMI) $@ + $(SAVE_BIN): $(SAVE_SRC) $(LIB) @mkdir -p $(dir $@) $(DOS_CC) $(CFLAGS) $< $(LIB) $(LIBXMP_AR) -o $@ diff --git a/make/iigs.mk b/make/iigs.mk index 8579d85..ac8984d 100644 --- a/make/iigs.mk +++ b/make/iigs.mk @@ -57,6 +57,7 @@ PATTERN_SRC := $(EXAMPLES)/pattern/pattern.c DRAW_SRC := $(EXAMPLES)/draw/draw.c KEYS_SRC := $(EXAMPLES)/keys/keys.c SERIAL_SRC := $(EXAMPLES)/serial/serial.c +SERTEST_SRC := $(EXAMPLES)/sertest/sertest.c SAVE_SRC := $(EXAMPLES)/save/save.c JOY_SRC := $(EXAMPLES)/joy/joy.c SPRITE_SRC := $(EXAMPLES)/sprite/sprite.c @@ -89,7 +90,7 @@ all iigs: iigs-lib iigs-clang-smoke # NTP replayer from disk (see the $(BINDIR)/AUDIO rule). Leaving them # out made `make iigs` silently test 8-day-old STAXI binaries against # new assets (the 2026-07-20 gear-out/no-flame reports). -iigs-examples: $(BINDIR)/PATTERN $(BINDIR)/DRAW $(BINDIR)/KEYS $(BINDIR)/SERIAL $(BINDIR)/SAVE $(BINDIR)/JOY \ +iigs-examples: $(BINDIR)/PATTERN $(BINDIR)/DRAW $(BINDIR)/KEYS $(BINDIR)/SERIAL $(BINDIR)/SERTEST $(BINDIR)/SAVE $(BINDIR)/JOY \ $(BINDIR)/SPRITE $(BINDIR)/UBER $(BINDIR)/ADV $(BINDIR)/ADV2 \ $(BINDIR)/AGI $(BINDIR)/STAXI $(BINDIR)/AUDIO @@ -198,6 +199,10 @@ $(BINDIR)/SERIAL: $(SERIAL_SRC) $(LIB) $(IIGS_CLANG_BUILD) @mkdir -p $(dir $@) $(DEP_DIR) $(IIGS_CLANG_BUILD) -M $(DEP_DIR)/SERIAL.d $(INCLUDES) -o $@ $(SERIAL_SRC) $(LIB) +$(BINDIR)/SERTEST: $(SERTEST_SRC) $(LIB) $(IIGS_CLANG_BUILD) + @mkdir -p $(dir $@) $(DEP_DIR) + $(IIGS_CLANG_BUILD) -M $(DEP_DIR)/SERTEST.d $(INCLUDES) -o $@ $(SERTEST_SRC) $(LIB) + $(BINDIR)/SAVE: $(SAVE_SRC) $(LIB) $(IIGS_CLANG_BUILD) @mkdir -p $(dir $@) $(DEP_DIR) $(IIGS_CLANG_BUILD) -M $(DEP_DIR)/SAVE.d $(INCLUDES) -o $@ $(SAVE_SRC) $(LIB)