From ddb534049cfe665fce29127049bb84fd10eb9aa1 Mon Sep 17 00:00:00 2001 From: Rich Stephens Date: Wed, 29 Oct 2025 15:32:48 -0400 Subject: [PATCH 1/3] CoCo - implement lobby mount CoCo - Add lobby-enabled config to firmware CoCo/Apple/Atari - fix lobby mount so it will work more than once. --- .../device_specific/BUILD_COCO/autorun.dsk | Bin 161280 -> 161280 bytes lib/FileSystem/fnFsTNFS.cpp | 5 +++ lib/FileSystem/fnFsTNFS.h | 1 + lib/device/drivewire/fuji.cpp | 32 +++++++++++++++--- lib/device/iwm/fuji.cpp | 17 +++++++--- lib/device/sio/fuji.cpp | 16 ++++++--- 6 files changed, 58 insertions(+), 13 deletions(-) diff --git a/data/webui/device_specific/BUILD_COCO/autorun.dsk b/data/webui/device_specific/BUILD_COCO/autorun.dsk index 6f999c9d77d752d15afdfc621defa09e8f9d2a89..9492c8435145f768f47e17b5e2ba541a5a75deaa 100644 GIT binary patch delta 12159 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 Ug_e-@x~V#E$eW?7rRk3U1Iwn}qW}N^ delta 12765 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 diff --git a/lib/FileSystem/fnFsTNFS.cpp b/lib/FileSystem/fnFsTNFS.cpp index 614757984..b427aec8a 100644 --- a/lib/FileSystem/fnFsTNFS.cpp +++ b/lib/FileSystem/fnFsTNFS.cpp @@ -135,6 +135,11 @@ bool FileSystemTNFS::start(const char *host, uint16_t port, const char * mountpa return true; } +bool FileSystemTNFS::is_started() +{ + return _started; +} + bool FileSystemTNFS::exists(const char* path) { tnfsStat tstat; diff --git a/lib/FileSystem/fnFsTNFS.h b/lib/FileSystem/fnFsTNFS.h index 6dd593e4b..273aa13d6 100644 --- a/lib/FileSystem/fnFsTNFS.h +++ b/lib/FileSystem/fnFsTNFS.h @@ -33,6 +33,7 @@ class FileSystemTNFS : public FileSystem FileHandler * filehandler_open(const char* path, const char* mode = FILE_READ) override; #endif + bool is_started(); bool exists(const char* path) override; bool remove(const char* path) override; diff --git a/lib/device/drivewire/fuji.cpp b/lib/device/drivewire/fuji.cpp index 90f2169d6..424af8db6 100644 --- a/lib/device/drivewire/fuji.cpp +++ b/lib/device/drivewire/fuji.cpp @@ -16,6 +16,7 @@ #include "fnSystem.h" #include "fnConfig.h" #include "fsFlash.h" +#include "fnFsTNFS.h" #include "fnWiFi.h" #include "led.h" @@ -1355,6 +1356,7 @@ void drivewireFuji::insert_boot_device(uint8_t d) bIsDragon = (fnSystem.digital_read(PIN_EPROM_A14) == DIGI_HIGH && fnSystem.digital_read(PIN_EPROM_A15) == DIGI_HIGH); #endif /* ESP_PLATFORM */ + const char *boot_img = nullptr; fnFile *fBoot = NULL; size_t sz = 0; @@ -1365,16 +1367,38 @@ void drivewireFuji::insert_boot_device(uint8_t d) case 0: if (bIsDragon) { - fBoot = fsFlash.fnfile_open(config_atr_dragon); + boot_img = config_atr_dragon; } else { - fBoot = fsFlash.fnfile_open(config_atr_coco); + boot_img = config_atr_coco; } + fBoot = fsFlash.fnfile_open(boot_img); break; case 1: - fBoot = fsFlash.fnfile_open(mount_and_boot_atr); + boot_img = mount_and_boot_atr; + fBoot = fsFlash.fnfile_open(boot_img); break; + case 2: + Debug_printf("Mounting lobby server\n"); + if (!fnTNFS.is_started()) + { + Debug_printf("Starting TNFS connection\n"); + if (!fnTNFS.start("tnfs.fujinet.online")) + { + Debug_printf("TNFS failed to start.\n"); + fBoot = NULL; + return; + } + } + + Debug_printf("Opening lobby.\n"); + boot_img = "/COCO/lobby.dsk"; + fBoot = fnTNFS.fnfile_open(boot_img); + break; + default: + Debug_printf("Invalid boot mode: %d\n", d); + return; } if (fBoot) @@ -1382,7 +1406,7 @@ void drivewireFuji::insert_boot_device(uint8_t d) fnio::fseek(fBoot, 0, SEEK_END); sz = fnio::ftell(fBoot); fnio::fseek(fBoot, 0, SEEK_SET); - _bootDisk.mount(fBoot, bIsDragon ? config_atr_dragon : config_atr_coco, sz); + _bootDisk.mount(fBoot, boot_img, sz); _bootDisk.is_config_device = true; _bootDisk.device_active = true; diff --git a/lib/device/iwm/fuji.cpp b/lib/device/iwm/fuji.cpp index 5456524a9..edba0cd78 100644 --- a/lib/device/iwm/fuji.cpp +++ b/lib/device/iwm/fuji.cpp @@ -1282,12 +1282,19 @@ void iwmFuji::insert_boot_device(uint8_t d) break; case 2: Debug_printf("Mounting lobby server\n"); - if (fnTNFS.start("tnfs.fujinet.online")) + if (!fnTNFS.is_started()) { - Debug_printf("opening lobby.\n"); - boot_img = "/APPLE2/_lobby.po"; - fBoot = fnTNFS.fnfile_open(boot_img); - } + Debug_printf("Starting TNFS connection\n"); + if (!fnTNFS.start("tnfs.fujinet.online")) + { + Debug_printf("TNFS failed to start.\n"); + fBoot = NULL; + return; + } + + Debug_printf("opening lobby.\n"); + boot_img = "/APPLE2/_lobby.po"; + fBoot = fnTNFS.fnfile_open(boot_img); break; default: Debug_printf("Invalid boot mode: %d\n", d); diff --git a/lib/device/sio/fuji.cpp b/lib/device/sio/fuji.cpp index 0e71e521d..ff57d1db5 100644 --- a/lib/device/sio/fuji.cpp +++ b/lib/device/sio/fuji.cpp @@ -2051,12 +2051,20 @@ void sioFuji::insert_boot_device(uint8_t d) break; case 2: Debug_printf("Mounting lobby server\n"); - if (fnTNFS.start("tnfs.fujinet.online")) + if (!fnTNFS.is_started()) { - Debug_printf("opening lobby.\n"); - fBoot = fnTNFS.fnfile_open("/ATARI/_lobby.xex"); - _bootDisk.mount(fBoot, "/ATARI/_lobby.xex", 0); + Debug_printf("Starting TNFS connection\n"); + if (!fnTNFS.start("tnfs.fujinet.online")) + { + Debug_printf("TNFS failed to start.\n"); + fBoot = NULL; + return; + } } + + Debug_printf("opening lobby.\n"); + fBoot = fnTNFS.fnfile_open("/ATARI/_lobby.xex"); + _bootDisk.mount(fBoot, "/ATARI/_lobby.xex", 0); break; } #else From 9ec90b8eadea73dd165704553c393d64fd96df9e Mon Sep 17 00:00:00 2001 From: Rich Stephens Date: Wed, 29 Oct 2025 15:55:22 -0400 Subject: [PATCH 2/3] Fix Atari/Apple build --- lib/device/iwm/fuji.cpp | 1 - lib/device/sio/fuji.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/lib/device/iwm/fuji.cpp b/lib/device/iwm/fuji.cpp index edba0cd78..cd695a2ce 100644 --- a/lib/device/iwm/fuji.cpp +++ b/lib/device/iwm/fuji.cpp @@ -1288,7 +1288,6 @@ void iwmFuji::insert_boot_device(uint8_t d) if (!fnTNFS.start("tnfs.fujinet.online")) { Debug_printf("TNFS failed to start.\n"); - fBoot = NULL; return; } diff --git a/lib/device/sio/fuji.cpp b/lib/device/sio/fuji.cpp index ff57d1db5..31a86abd7 100644 --- a/lib/device/sio/fuji.cpp +++ b/lib/device/sio/fuji.cpp @@ -2057,7 +2057,6 @@ void sioFuji::insert_boot_device(uint8_t d) if (!fnTNFS.start("tnfs.fujinet.online")) { Debug_printf("TNFS failed to start.\n"); - fBoot = NULL; return; } } From 6363cd952993bc8860ee89e0f6eccae63e1264af Mon Sep 17 00:00:00 2001 From: Rich Stephens Date: Wed, 29 Oct 2025 16:01:17 -0400 Subject: [PATCH 3/3] Fix Apple (again) --- lib/device/iwm/fuji.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/device/iwm/fuji.cpp b/lib/device/iwm/fuji.cpp index cd695a2ce..93d4c5f26 100644 --- a/lib/device/iwm/fuji.cpp +++ b/lib/device/iwm/fuji.cpp @@ -1290,6 +1290,7 @@ void iwmFuji::insert_boot_device(uint8_t d) Debug_printf("TNFS failed to start.\n"); return; } + } Debug_printf("opening lobby.\n"); boot_img = "/APPLE2/_lobby.po";