<?xml version="1.0"?>
<rss version="2.0"><channel><title>Discussion Latest Topics</title><link>https://forums.atariage.com/forum/475-discussion/</link><description>Discussion Latest Topics</description><language>en</language><item><title>Tiamat (Live Coding with ELF and KeyPortari)</title><link>https://forums.atariage.com/topic/388720-tiamat-live-coding-with-elf-and-keyportari/</link><description><![CDATA[<p>
	Cross posting for visibility, Tiamat is a music programming language for the Atari 2600, I've been referencing the resources here (esp TinyELF-Basic) to come up with an ELF variant.<br />
	 
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="77359" data-embedcontent="" data-embedid="embed5825334510" src="https://forums.atariage.com/topic/386896-tiamat-poc-tia-music-programming-tool/?do=embed&amp;comment=5805617&amp;embedComment=5805617&amp;embedDo=findComment#findComment-5805617" style="height:291px;max-width:602px;"></iframe>

<p>
	 
</p>
]]></description><guid isPermaLink="false">388720</guid><pubDate>Mon, 09 Mar 2026 08:48:25 +0000</pubDate></item><item><title>Does one (or two) STA WSYNC give extra time for ELF computation?</title><link>https://forums.atariage.com/topic/387110-does-one-or-two-sta-wsync-give-extra-time-for-elf-computation/</link><description><![CDATA[<p>
	STA WSYNC blocks the CPU until the current TIA scanline finishes (usually it synchronizes the code to the next scanline). My question is about practical use as a cheap way to get more CPU time for computations that don't fit between two "normal" 6502 opcodes?
</p>
]]></description><guid isPermaLink="false">387110</guid><pubDate>Fri, 02 Jan 2026 19:02:33 +0000</pubDate></item><item><title>Binary stripping</title><link>https://forums.atariage.com/topic/386434-binary-stripping/</link><description><![CDATA[<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">386434</guid><pubDate>Mon, 08 Dec 2025 11:39:10 +0000</pubDate></item><item><title>memmove, memcopy or DMA copy/move</title><link>https://forums.atariage.com/topic/385992-memmove-memcopy-or-dma-copymove/</link><description><![CDATA[<p>
	What will work in ELF? Whats the best approach? Has anyone tried already?
</p>
]]></description><guid isPermaLink="false">385992</guid><pubDate>Tue, 18 Nov 2025 14:34:02 +0000</pubDate></item><item><title>ELF Basic Interpreter for the 2600</title><link>https://forums.atariage.com/topic/385281-elf-basic-interpreter-for-the-2600/</link><description><![CDATA[<p>
	Since PXE already runs a 6507 interpreter in ELF, why not port a 6502 BASIC (Atari BASIC / Tiny BASIC or or Steve Woziniak's Integer BASIC) to ELF? With a nice text kernel and a KeyPortari for input, the 2600 could become a neat little BASIC machine.<br />
	If we avoid the 6507 interpreter layer we may get more speed, a compact C implementation (e.g. TinyBasic.c) looks like a promising starting point:<br />
	<a href="http://www.ittybittycomputers.com/IttyBitty/TinyBasic/TinyBasic.c" rel="external nofollow">http://www.ittybittycomputers.com/IttyBitty/TinyBasic/TinyBasic.c<span></span></a>
</p>

<p>
	 
</p>

<p>
	<span>any ideas?</span>
</p>
]]></description><guid isPermaLink="false">385281</guid><pubDate>Mon, 20 Oct 2025 12:25:22 +0000</pubDate></item><item><title>Reading and storing high scores on the Chameleon Cart?</title><link>https://forums.atariage.com/topic/385466-reading-and-storing-high-scores-on-the-chameleon-cart/</link><description><![CDATA[<p>
	For my homebrews I normally use a SaveKey to store high scores or game progress. Since it relies on RIOT instructions to read and write data over the I/O ports, it's not an ideal fit for vcsLib.
</p>

<p>
	 
</p>

<p>
	Given that the Chameleon uses flash memory, would it be possible to store save data directly on the cart instead of relying on a SaveKey?
</p>
]]></description><guid isPermaLink="false">385466</guid><pubDate>Mon, 27 Oct 2025 08:21:27 +0000</pubDate></item><item><title>Chameleon Cart Build Template</title><link>https://forums.atariage.com/topic/385387-chameleon-cart-build-template/</link><description><![CDATA[<p>
	Here's a template to build for a physical release.
</p>

<p>
	 
</p>

<p style="background-color:#ffffff;color:#08141f;font-size:16px;">
	Run make from the source directory with an env var to specify the location of the preferred emulator and tv setting.
</p>

<pre style="border-color:rgba(59,59,59,0.15);border-style:solid;border-width:0px 0px 0px 4px;color:#08141f;font-size:16px;padding:15px;">ElfTemplate20251023\source&gt; make EMU_PATH=../../../Gopher2600/gopher2600.exe</pre>

<p>
	The bin folder will contain 3 files.
</p>

<p>
	ElfTemplate-dbg.bin - Includes all the symbols needed for Gopher2600 to profile and debug the code.<br />
	ElfTemplate.bin - Optimized bin to be distributed to others for playing in emulators and on plus/uno cart.<br />
	ElfTemplateChameleon128KB.elf - Linked with Chameleon Cart firmware. Use this to program the Chameleon Cart.
</p>

<p>
	 
</p>

<p>
	arm-none-eabi-gcc and python3 are required.
</p>

<p>
	 
</p>

<p>
	When programming the Chameleon Cart the st-link should be connected to the adapter on pins SWCLK, SWDIO, and GND. I like to leave the board inserted into the console, and the st-link attached so I can simply flash the cart, power cycle, test, repeat. <strong>The 5V from st-link should never be connected when the board is in the console.</strong>
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink" data-fileext="zip" data-fileid="1273584" href="https://forums.atariage.com/applications/core/interface/file/attachment.php?id=1273584&amp;key=41071fae86d78c3c4b0f9431668f9e87" rel="">ElfTemplate20251023.zip</a>
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="1273585" href="//media.invisioncic.com/r322239/monthly_2025_10/image.png.e92d74922532774cb951d56b83323f54.png" rel=""><img alt="image.thumb.png.898f8be2cdd5f2b834b7d70c4808fbcf.png" class="ipsImage ipsImage_thumbnailed" data-fileid="1273585" data-ratio="64.67" width="600" src="https://media.invisioncic.com/r322239/monthly_2025_10/image.thumb.png.898f8be2cdd5f2b834b7d70c4808fbcf.png" /></a>
</p>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="1273586" href="//media.invisioncic.com/r322239/monthly_2025_10/image.png.3e5d665c20cab1dd0bedaf9e9b8a6608.png" rel=""><img alt="image.thumb.png.f0026268d65050f29fe5e8fd18059206.png" class="ipsImage ipsImage_thumbnailed" data-fileid="1273586" data-ratio="64.67" width="600" src="https://media.invisioncic.com/r322239/monthly_2025_10/image.thumb.png.f0026268d65050f29fe5e8fd18059206.png" /></a>
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">385387</guid><pubDate>Fri, 24 Oct 2025 06:20:24 +0000</pubDate></item><item><title>Getting Started with ELF-VCS Development (not PXE!)</title><link>https://forums.atariage.com/topic/384902-getting-started-with-elf-vcs-development-not-pxe/</link><description><![CDATA[<h1>
	Getting Started with Atari 2600 ELF-VCS Development
</h1>

<p>
	<span style="background-color:#ffff00;"><strong>Note</strong>: If you're looking for <strong>PXE</strong> (the ELF-based batari Basic kernel) please see </span><a href="https://forums.atariage.com/topic/385318-pxe-kernel-templates-tutorials-and-documentation/?do=getNewComment" rel="" style="background-color:transparent;color:#006699;" title="PXE Kernel Templates, Tutorials and Documentation"><span style="background-color:#ffff00;">PXE Kernel Templates, Tutorials and Documentation</span></a><span style="background-color:#ffff00;">.</span>
</p>

<p>
	 
</p>

<p>
	<strong>ELF-VCS </strong>is a<strong> C-level API</strong> (defined in <a href="https://github.com/Al-Nafuur/United-Carts-of-Atari/blob/main/source/STM32firmware/PlusCart/Inc/vcsLib.h" rel="external nofollow">vcsLib.h</a>) for developing Atari 2600 games that run on several flash cartridges (<a href="https://thebrewingacademy.com/products/uno-2600-cartridge" rel="external nofollow">UnoCart</a>, <a href="https://pcart.firmaplus.de/" rel="external nofollow">PlusCart</a>, <a href="https://phantomlogicstudios.com/" rel="external nofollow">Chameleon Cart</a>) as well as in popular emulators like <a href="https://stella-emu.github.io/downloads.html" rel="external nofollow">Stella</a> and <a href="https://github.com/JetSetIlly/Gopher2600/releases/latest" rel="external nofollow">Gopher2600</a>.
</p>

<p>
	 
</p>

<p>
	Beyond simply running your game logic, the ELF-VCS runtime provides a set of helper features, including:
</p>

<ul>
	<li>
		<p>
			Detecting <strong>NTSC vs PAL</strong>
		</p>
	</li>
	<li>
		<p>
			Detecting <strong>2600 vs 7800 hardware</strong>
		</p>
	</li>
	<li>
		<p>
			<strong>Bus Stuffing</strong> support (see <a href="https://forums.atariage.com/topic/385466-reading-and-storing-high-scores-on-the-chameleon-cart/#findComment-5744913" rel="">here</a>)
		</p>
	</li>
	<li>
		<p>
			Reading/writing <strong>flash memory</strong> for high scores and save data
		</p>
	</li>
	<li>
		<p>
			A built-in <strong>byte-reverse lookup table</strong> (handy for PF0/PF2 use and for reflecting sprites in software)
		</p>
	</li>
	<li>
		<p>
			Indicating whether your game is running on a <strong>Multi-Cart</strong> or <strong>Chameleon Cart</strong>
		</p>
	</li>
</ul>

<p>
	You can write your ELF-VCS game entirely in <strong>C</strong> using the ARM GNU toolchain, or in <strong>Rust</strong> using the Rust toolchain. In fact, any language can be used, as long as the output is a <strong>partially linked ELF file</strong> containing relocatable machine code and unresolved references to the <strong>vcsLib </strong>library. The runtime environment then provides its own vcsLib implementation at load time. 
</p>

<p>
	 
</p>

<p>
	On some hardware, such as the <strong>Chameleon Cart </strong>(a retail-ready flash cart), the ELF is eventually <strong>fully linked</strong> against a vcsL<code>ib</code> implementation that uses the SoC’s GPIOs, along with a small CRT and bootstrap code. This final linked binary is then flashed onto the cart.
</p>

<p>
	 
</p>

<p>
	For maximum compatibility, most ELF-VCS titles target the <strong>ARM Cortex-M0+</strong>, which is the CPU used in the Chameleon Cart. This core executes 16-bit Thumb-1 instructions (plus a small subset of Thumb-2), which are also supported by the UnoCart and PlusCart, making Cortex-M0+ the safest common target across all devices.
</p>

<p>
	 
</p>

<p>
	<strong>Follow the steps below to set up your environment and build your first C program using ELF-VCS:</strong>
</p>

<p>
	 
</p>

<hr />
<h2>
	1. Install the ARM GNU Toolchain
</h2>

<p>
	Download the <strong>Arm GNU Toolchain</strong> for your operating system:
</p>

<p>
	<span class="ipsEmoji">👉</span> <a href="https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads" rel="external nofollow">Arm GNU Toolchain Downloads</a> → pick the <strong>arm-none-eabi </strong>version for your OS, which targets AArch32 bare-metal.
</p>

<p>
	 
</p>

<p>
	After installation, check to see if the toolchain binaries (e.g. <code>arm-none-eabi-gcc</code>) are available in your system’s <code>PATH</code>.
</p>

<p>
	To test, run:
</p>

<div>
	<div dir="ltr">
		<pre class="ipsCode">arm-none-eabi-gcc --version</pre>
	</div>
</div>

<p>
	 
</p>

<p>
	 
</p>

<hr />
<h2>
	2. Download the ELF-VCS Library Header
</h2>

<p>
	Download the <a href="https://raw.githubusercontent.com/Al-Nafuur/United-Carts-of-Atari/main/source/STM32firmware/PlusCart/Inc/vcsLib.h" rel="external nofollow">latest vcsLib.h</a> header file, which provides the interface for Atari ELF-VCS development.
</p>

<p>
	Place it in the same directory where you’ll write your code.
</p>

<p>
	 
</p>

<hr />
<h2>
	3. Write Your First Program
</h2>

<p>
	Create a file named <strong><code>main.c</code></strong> and paste a simple example into it. For instance:
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="com">#include</span><span class="pln"> </span><span class="str">"vcsLib.h"</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> elf_main</span><span class="pun">(</span><span class="typ">uint32_t</span><span class="pun">*</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="com">// Always reset PC first, cause it's going to be close to the end of the 6507 address space</span><span class="pln">
	vcsJmp3</span><span class="pun">();</span><span class="pln">
	
	</span><span class="com">// Init TIA and RIOT RAM</span><span class="pln">
	vcsLda2</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
	</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">256</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		vcsSta3</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="com">// 3 lines of VSYNC</span><span class="pln">
		vcsLda2</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
		vcsSta3</span><span class="pun">(</span><span class="pln">VSYNC</span><span class="pun">);</span><span class="pln">
		</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			vcsSta3</span><span class="pun">(</span><span class="pln">WSYNC</span><span class="pun">);</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
		vcsLda2</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
		vcsSta3</span><span class="pun">(</span><span class="pln">VSYNC</span><span class="pun">);</span><span class="pln">

		</span><span class="com">// 37 lines of VBLANK</span><span class="pln">
		</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">37</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			vcsSta3</span><span class="pun">(</span><span class="pln">WSYNC</span><span class="pun">);</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
		vcsSta3</span><span class="pun">(</span><span class="pln">VBLANK</span><span class="pun">);</span><span class="pln"> </span><span class="com">// disable blanking</span><span class="pln">

		</span><span class="com">// 192 lines of COLUBK</span><span class="pln">
		</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">192</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			vcsLdx2</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
			vcsStx3</span><span class="pun">(</span><span class="pln">COLUBK</span><span class="pun">);</span><span class="pln">
			vcsJmp3</span><span class="pun">();</span><span class="pln">
			vcsSta3</span><span class="pun">(</span><span class="pln">WSYNC</span><span class="pun">);</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	
		vcsWrite5</span><span class="pun">(</span><span class="pln">VBLANK</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// enter blanking</span><span class="pln">

		</span><span class="com">// 30 lines of Overscan</span><span class="pln">
		</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">30</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
			vcsSta3</span><span class="pun">(</span><span class="pln">WSYNC</span><span class="pun">);</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre> </pre>

<hr />
<h2>
	4. Compile Your Program
</h2>

<p>
	Use the Arm GNU Toolchain to build the program into a <code>.bin</code> file:
</p>

<pre class="ipsCode">arm-none-eabi-gcc -r -mlong-calls -fno-exceptions -march=armv6-m main.c -o main.bin -O3 -Wall -lgcc</pre>

<div>
	<div>
		<div>
			<div>
				 
			</div>
		</div>
	</div>
</div>

<p>
	If compilation succeeds, you’ll get <strong><code>main.bin</code></strong>, which is a playable ROM.
</p>

<p>
	 
</p>

<hr />
<h2>
	5. Run in an Emulator
</h2>

<p>
	Open <strong><code>main.bin</code></strong> in an Atari 2600/7800 emulator such as:
</p>

<ul>
	<li>
		<p>
			<a href="https://stella-emu.github.io/downloads.html" rel="external nofollow">Stella</a>
		</p>
	</li>
	<li>
		<p>
			<a href="https://github.com/JetSetIlly/Gopher2600/releases/latest" rel="external nofollow">Gopher2600</a>
		</p>
	</li>
</ul>

<p>
	 
</p>

<p>
	Or load them into your UnoCart or PlusCart (note: you'll need to have a recent firmware installed on these carts).
</p>

<p>
	 
</p>

<hr />
<h2>
	6. Explore More Examples
</h2>

<p>
	To see more advanced programs, clone the <a href="https://github.com/dionoid/ELF-VCS-examples" rel="external nofollow">ELF-VCS examples repository</a>:
</p>

<pre class="ipsCode">git clone https://github.com/dionoid/ELF-VCS-examples</pre>

<div>
	<div dir="ltr">
		 
	</div>
</div>

<p>
	This repo includes:
</p>

<ul>
	<li>
		<p>
			Multiple example programs
		</p>
	</li>
	<li>
		<p>
			A <strong>DevContainer</strong> for <a href="https://www.docker.com/products/docker-desktop/" rel="external nofollow">Docker Desktop</a>, preconfigured with the ARM GNU Toolchain.<br />
			→ This means you can build projects without installing the toolchain locally.
		</p>
	</li>
</ul>

<p>
	 
</p>

<hr />
<p>
	<span class="ipsEmoji">✅</span> <strong>You’re ready to start making Atari 2600/7800 homebrew with ELF-VCS!</strong>
</p>

<hr />
<p>
	 
</p>
]]></description><guid isPermaLink="false">384902</guid><pubDate>Thu, 02 Oct 2025 10:52:40 +0000</pubDate></item><item><title>Protecting the PXE Dev Kit Cart (simple shell mod)</title><link>https://forums.atariage.com/topic/385616-protecting-the-pxe-dev-kit-cart-simple-shell-mod/</link><description><![CDATA[<p>
	For those who own a <strong><a href="https://phantomlogicstudios.com/#ed-886194139" rel="external nofollow">PXE Dev Kit</a> </strong>for the Chameleon Cart, here's a small tip to help protect it from physical damage.
</p>

<p>
	 
</p>

<p>
	Since the board has exposed <strong>SMCs</strong>, it can get damaged if something drops onto it. To prevent that, I reused a <strong>standard cartridge shell</strong> (one of the later types with holes under the front label) and modified it to fit the PXE adapter.
</p>

<p>
	 
</p>

<p>
	Using a <strong>Dremel</strong>, I cut a small <strong>square opening</strong> in the side of the shell so the adapter can plug in cleanly while keeping the rest of the cart protected.
</p>

<p>
	It's a simple mod, but it gives the cart a much sturdier feel when inserting into my 2600 and adds peace of mind during storage.
</p>

<p>
	 
</p>

<p>
	Here are a couple of pictures showing the result:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpeg" data-fileid="1276653" href="//media.invisioncic.com/r322239/monthly_2025_11/image.jpeg.804f1fa6e6be196022b33b24d7681e29.jpeg" rel=""><img alt="image.thumb.jpeg.8815ae1ca74ce2a0c480435b1eac8df3.jpeg" class="ipsImage ipsImage_thumbnailed" data-fileid="1276653" data-ratio="133.33" width="450" src="https://media.invisioncic.com/r322239/monthly_2025_11/image.thumb.jpeg.8815ae1ca74ce2a0c480435b1eac8df3.jpeg" /></a>     <a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpeg" data-fileid="1276654" href="//media.invisioncic.com/r322239/monthly_2025_11/image.jpeg.2ab42d9f4aa311e1031ad524afcbcbcd.jpeg" rel=""><img alt="image.thumb.jpeg.02afac5ecbeba7ecfffad269cd5ed52c.jpeg" class="ipsImage ipsImage_thumbnailed" data-fileid="1276654" data-ratio="133.33" width="450" src="https://media.invisioncic.com/r322239/monthly_2025_11/image.thumb.jpeg.02afac5ecbeba7ecfffad269cd5ed52c.jpeg" /></a>
</p>

<p>
	 
</p>

<p>
	Hopefully this helps others who want to keep their dev kits safe <span><img alt=":)" data-emoticon="" src="https://media.invisioncic.com/r322239/emoticons/atariage_icon_smile.gif" title=":)" /></span>
</p>

<p>
	 
</p>

<p>
	I’m now looking for a <strong>good label design</strong> to finish it off, probably something inspired by the rainbow-striped <strong>Chameleon Cart logo</strong> (see below). I think that style would fit perfectly on this shell. Maybe <a contenteditable="false" data-ipshover="" data-ipshover-target="https://forums.atariage.com/profile/81172-8bitpoet/?do=hovercard" data-mentionid="81172" href="https://forums.atariage.com/profile/81172-8bitpoet/" rel="">@8bitPoet</a> has some ideas or suggestions? <span><img alt=":)" data-emoticon="" src="https://media.invisioncic.com/r322239/emoticons/atariage_icon_smile.gif" title=":)" /></span>
</p>

<p>
	<img alt="image.png.59ebbd2b6996c1219e7f3f153f0459da.png" class="ipsImage ipsImage_thumbnailed" data-fileid="1276658" data-ratio="63.33" width="300" src="https://media.invisioncic.com/r322239/monthly_2025_11/image.png.59ebbd2b6996c1219e7f3f153f0459da.png" />
</p>
]]></description><guid isPermaLink="false">385616</guid><pubDate>Sun, 02 Nov 2025 20:59:15 +0000</pubDate></item><item><title>Using esp8266.h/.c for networking in ELF?</title><link>https://forums.atariage.com/topic/384925-using-esp8266hc-for-networking-in-elf/</link><description><![CDATA[<p>
	Hello everyone,
</p>

<p>
	 
</p>

<p>
	I'd like to start a discussion about adding networking to Atari 2600 ELF games using the PlusCart’s WiFi. Currently the ELF format support (via UCA firmware) only provides basic functions (VCSLib) for running on hardware. I'm wondering if we could also tap into the PlusCart's <strong>ESP8266</strong> library (esp8266.h/.c in the firmware) to give ELF games online features.
</p>

<p>
	 
</p>

<p>
	The goal is to provide ELF game developers with easy network APIs (highscores, online modes, etc.), similar to PlusROM functions.
</p>

<p>
	 
</p>

<p>
	At first this would only work on real PlusCart hardware, but emulators like Stella and Gopher2600 already emulate PlusROM, so they should be able to handle these calls too
</p>

<p>
	 
</p>

<p>
	The current esp8266 library was designed mostly for the PlusStore communication, but I believe it can be generalized. I'd love to hear thoughts or advice: Has anyone tried hooking network routines into ELF before? Do you think we can simply reuse the existing ESP8266 lib, or are there pitfalls I'm missing? Any feedback or suggestions would be greatly appreciated!
</p>

<p>
	 
</p>

<p>
	Thanks, and looking forward to the discussion.
</p>
]]></description><guid isPermaLink="false">384925</guid><pubDate>Thu, 02 Oct 2025 22:20:13 +0000</pubDate></item><item><title>Using Rust to build ELF-VCS?</title><link>https://forums.atariage.com/topic/384920-using-rust-to-build-elf-vcs/</link><description><![CDATA[<p>
	I’ve been experimenting with the <strong>Rust toolchain</strong> to build ELF-VCS binaries. You can see a simple example here: <a href="https://github.com/dionoid/ELF-VCS-examples/blob/main/rust-examples/simple/main.rs" rel="external nofollow">https://github.com/dionoid/ELF-VCS-examples/blob/main/rust-examples/simple/main.rs</a>
</p>

<p>
	 
</p>

<p>
	The resulting binary runs in Stella, but I’m not sure if this is the best way to set up a Rust build for ELF-VCS.
</p>

<p>
	I’d love to hear if anyone has suggestions for improvements or more idiomatic approaches.
</p>

<p>
	 
</p>

<p>
	Here’s the command I used to build:
</p>

<pre class="ipsCode">rustc --target=thumbv6m-none-eabi \
   -C panic=abort \
   -C opt-level=3 \
   -C relocation-model=pic \
   -C target-feature=+long-calls \
   -C link-arg=-r \
   -C link-arg=-u \
   -C link-arg=elf_main \
   -C link-arg=--discard-all \
   --emit=link \
   main.rs -o main.bin</pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">384920</guid><pubDate>Thu, 02 Oct 2025 21:05:59 +0000</pubDate></item></channel></rss>
