<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://zeroboardcomputer.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Getting_Started</id>
	<title>Getting Started - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://zeroboardcomputer.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Getting_Started"/>
	<link rel="alternate" type="text/html" href="https://zeroboardcomputer.com/wiki/index.php?title=Getting_Started&amp;action=history"/>
	<updated>2026-06-03T23:29:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://zeroboardcomputer.com/wiki/index.php?title=Getting_Started&amp;diff=9&amp;oldid=prev</id>
		<title>Jbyrd: ZBC wiki page from Getting_Started.wiki</title>
		<link rel="alternate" type="text/html" href="https://zeroboardcomputer.com/wiki/index.php?title=Getting_Started&amp;diff=9&amp;oldid=prev"/>
		<updated>2025-12-01T12:06:39Z</updated>

		<summary type="html">&lt;p&gt;ZBC wiki page from Getting_Started.wiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Getting Started with Zero Board Computer =&lt;br /&gt;
&lt;br /&gt;
This guide walks you through your first steps with the Zero Board Computer (ZBC) system. We&amp;#039;ll use MAME as the reference implementation, but these concepts apply to any ZBC-compliant system.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
=== Software Requirements ===&lt;br /&gt;
&lt;br /&gt;
To get started with ZBC, you need:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A ZBC implementation&amp;#039;&amp;#039;&amp;#039; - MAME is the reference implementation and supports hundreds of CPU architectures&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A toolchain&amp;#039;&amp;#039;&amp;#039; for your target CPU - compiler, assembler, and binutils (gcc, clang, llvm-mos, etc.)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Basic command-line familiarity&amp;#039;&amp;#039;&amp;#039; - running commands and understanding file paths&lt;br /&gt;
&lt;br /&gt;
=== Installing MAME ===&lt;br /&gt;
&lt;br /&gt;
MAME can be obtained from:&lt;br /&gt;
* Official website: https://www.mamedev.org/&lt;br /&gt;
* Package managers: &amp;lt;code&amp;gt;apt install mame&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;brew install mame&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
* Source code: Build from https://github.com/mamedev/mame&lt;br /&gt;
&lt;br /&gt;
Verify installation:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mame -version&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alternative Implementations ===&lt;br /&gt;
&lt;br /&gt;
While this guide uses MAME, the concepts apply to any ZBC implementation:&lt;br /&gt;
* FPGA-based hardware implementations&lt;br /&gt;
* Other emulators supporting the ZBC specification&lt;br /&gt;
* Custom software implementations&lt;br /&gt;
&lt;br /&gt;
The commands and behavior should be consistent across compliant implementations.&lt;br /&gt;
&lt;br /&gt;
== Quick Start: Running Your First ZBC System ==&lt;br /&gt;
&lt;br /&gt;
=== List Available Systems ===&lt;br /&gt;
&lt;br /&gt;
MAME includes ZBC implementations for many CPU architectures. To see what&amp;#039;s available:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mame -listfull zbc*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This shows all ZBC systems, for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zbcz80          Zero Board Computer (Zilog Z80)&lt;br /&gt;
zbcm6502        Zero Board Computer (MOS Technology 6502)&lt;br /&gt;
zbcm68000       Zero Board Computer (Motorola 68000)&lt;br /&gt;
zbci386         Zero Board Computer (Intel 80386)&lt;br /&gt;
zbcarm7         Zero Board Computer (ARM7 TDMI)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run a ZBC System ===&lt;br /&gt;
&lt;br /&gt;
Start a ZBC system without loading a program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mame zbcz80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You&amp;#039;ll see the MAME window open with the MC6847 text display showing the boot screen.&lt;br /&gt;
&lt;br /&gt;
=== Understanding the Boot Screen ===&lt;br /&gt;
&lt;br /&gt;
The boot screen displays essential system information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Zero Board Computer&lt;br /&gt;
Zilog Z80&lt;br /&gt;
&lt;br /&gt;
Load Address: 0x0200&lt;br /&gt;
Available RAM: 63488 bytes&lt;br /&gt;
Semihost: 0xFC00-0xFDFF&lt;br /&gt;
Video RAM: 0xFE00-0xFEFF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This information tells you:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CPU name&amp;#039;&amp;#039;&amp;#039; - The specific processor in this ZBC system&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Load address&amp;#039;&amp;#039;&amp;#039; - Where programs are loaded into memory (0x0200 for most 16-bit CPUs)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Available RAM&amp;#039;&amp;#039;&amp;#039; - How much memory your programs can use (from load address to semihosting buffer)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Semihost buffer&amp;#039;&amp;#039;&amp;#039; - Address range for the semihosting I/O peripheral&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Video RAM&amp;#039;&amp;#039;&amp;#039; - Address range for the text display memory&lt;br /&gt;
&lt;br /&gt;
{{Note|The boot screen is automatically cleared when your program writes to video RAM. It&amp;#039;s only visible when no program is loaded or when the loaded program hasn&amp;#039;t accessed the display yet.}}&lt;br /&gt;
&lt;br /&gt;
== Loading Your First Program ==&lt;br /&gt;
&lt;br /&gt;
=== Creating a Simple Binary ===&lt;br /&gt;
&lt;br /&gt;
Let&amp;#039;s create the simplest possible program - an infinite loop.&lt;br /&gt;
&lt;br /&gt;
For Z80 assembly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; loop.asm - Infinite loop at address 0x0200&lt;br /&gt;
    org 0x0200&lt;br /&gt;
loop:&lt;br /&gt;
    jp loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assemble it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
z80asm -o loop.bin loop.asm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or for 6502:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; loop.asm - Infinite loop at address 0x0200&lt;br /&gt;
    .org $0200&lt;br /&gt;
loop:&lt;br /&gt;
    jmp loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assemble it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ca65 loop.asm &amp;amp;&amp;amp; ld65 -o loop.bin -t none loop.o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Loading via Quickload ===&lt;br /&gt;
&lt;br /&gt;
The quickload mechanism loads raw binary files directly into memory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mame zbcz80 -quik loop.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What happens:&lt;br /&gt;
# MAME initializes the ZBC system&lt;br /&gt;
# CPU boots and displays the boot screen&lt;br /&gt;
# Quickload device detects the binary file&lt;br /&gt;
# Binary is loaded into RAM at the load address (0x0200)&lt;br /&gt;
# Video RAM becomes writable (was read-only for boot screen)&lt;br /&gt;
# CPU continues executing from load address&lt;br /&gt;
&lt;br /&gt;
Your program is now running! In this case, it&amp;#039;s just looping forever, but the CPU is executing your code.&lt;br /&gt;
&lt;br /&gt;
=== Alternative Quickload Syntax ===&lt;br /&gt;
&lt;br /&gt;
You can also use the longer form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mame zbcz80 -quickload loop.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both &amp;lt;code&amp;gt;-quik&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-quickload&amp;lt;/code&amp;gt; work identically.&lt;br /&gt;
&lt;br /&gt;
== Understanding Memory Addresses ==&lt;br /&gt;
&lt;br /&gt;
Different CPU architectures have different address space sizes, which affects memory layout.&lt;br /&gt;
&lt;br /&gt;
=== 16-bit CPUs (Z80, 6502, 8086) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Address Range       Size        Purpose&lt;br /&gt;
0x0000-0x01FF      512 bytes    Low memory (vectors, stack, boot code)&lt;br /&gt;
0x0200-0xFBFF      63,488 bytes Available RAM&lt;br /&gt;
0xFC00-0xFDFF      1,024 bytes  Semihosting buffer&lt;br /&gt;
0xFE00-0xFEFF      512 bytes    Video RAM&lt;br /&gt;
0xFF00-0xFFFF      256 bytes    Reserved region&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 32-bit CPUs (68000, ARM, i386) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Address Range           Size            Purpose&lt;br /&gt;
0x00000000-0x000001FF  512 bytes        Low memory&lt;br /&gt;
0x00000200-0xFFFFF9FF  ~4 GB            Available RAM&lt;br /&gt;
0xFFFFFA00-0xFFFFFDFF  1,024 bytes      Semihosting buffer&lt;br /&gt;
0xFFFFFE00-0xFFFFFFFF  512 bytes        Video RAM&lt;br /&gt;
0xFFFF0000-0xFFFFFFFF  64 KB            Reserved region&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|The load address and memory layout are calculated automatically based on the CPU&amp;#039;s address space width. Check the boot screen for exact addresses on your target CPU.}}&lt;br /&gt;
&lt;br /&gt;
== Writing to the Display ==&lt;br /&gt;
&lt;br /&gt;
The MC6847 text display is memory-mapped, making it simple to use.&lt;br /&gt;
&lt;br /&gt;
=== Display Specifications ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Size&amp;#039;&amp;#039;&amp;#039;: 32 columns × 16 rows = 512 characters&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Character set&amp;#039;&amp;#039;&amp;#039;: Standard ASCII (0x20-0x7F)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Organization&amp;#039;&amp;#039;&amp;#039;: Row 0 at offset 0, Row 1 at offset 32, etc.&lt;br /&gt;
&lt;br /&gt;
=== Example: Display a Character ===&lt;br /&gt;
&lt;br /&gt;
Z80 assembly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; Display &amp;#039;A&amp;#039; in top-left corner&lt;br /&gt;
    ld a, &amp;#039;A&amp;#039;&lt;br /&gt;
    ld hl, 0xFE00        ; Video RAM address (16-bit CPUs)&lt;br /&gt;
    ld (hl), a&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    jp loop              ; Infinite loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6502 assembly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; Display &amp;#039;A&amp;#039; in top-left corner&lt;br /&gt;
    lda #&amp;#039;A&amp;#039;&lt;br /&gt;
    sta $FE00            ; Video RAM address (16-bit CPUs)&lt;br /&gt;
&lt;br /&gt;
loop:&lt;br /&gt;
    jmp loop             ; Infinite loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Screen Position Calculation ===&lt;br /&gt;
&lt;br /&gt;
To calculate the memory offset for a specific row and column:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
offset = row * 32 + column&lt;br /&gt;
address = video_ram_base + offset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, row 5, column 10:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
offset = 5 * 32 + 10 = 170 (0xAA)&lt;br /&gt;
address = 0xFE00 + 0xAA = 0xFEAA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using the Semihosting Plugin ==&lt;br /&gt;
&lt;br /&gt;
For programs that need file I/O, console output, or other host services, enable the semihosting plugin.&lt;br /&gt;
&lt;br /&gt;
=== Enabling Semihosting ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mame zbcz80 -quik program.bin -plugin semihost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The semihosting plugin provides:&lt;br /&gt;
* File I/O operations (open, read, write, close, seek)&lt;br /&gt;
* Console output (character and string writes)&lt;br /&gt;
* Timing services (clock, elapsed time)&lt;br /&gt;
* System operations (execute host commands, get command line)&lt;br /&gt;
&lt;br /&gt;
See [[Semihosting Overview]] for details on using the semihosting interface from your programs.&lt;br /&gt;
&lt;br /&gt;
== Configuring the VSync Interrupt ==&lt;br /&gt;
&lt;br /&gt;
The ZBC system includes a configurable jumper (JP1) that controls how the video controller&amp;#039;s VSync signal connects to CPU interrupts.&lt;br /&gt;
&lt;br /&gt;
=== Accessing JP1 Configuration ===&lt;br /&gt;
&lt;br /&gt;
In MAME:&lt;br /&gt;
# Run your ZBC system: &amp;lt;code&amp;gt;mame zbcz80 -quik program.bin&amp;lt;/code&amp;gt;&lt;br /&gt;
# Press &amp;#039;&amp;#039;&amp;#039;TAB&amp;#039;&amp;#039;&amp;#039; to open the MAME menu&lt;br /&gt;
# Navigate to &amp;#039;&amp;#039;&amp;#039;Machine Configuration&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Select &amp;#039;&amp;#039;&amp;#039;JP1: VSync Interrupt&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Choose position: &amp;#039;&amp;#039;&amp;#039;Disabled&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;IRQ&amp;#039;&amp;#039;&amp;#039;, or &amp;#039;&amp;#039;&amp;#039;NMI&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== JP1 Positions ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Disabled (Default)&amp;#039;&amp;#039;&amp;#039; - No interrupts, simplest mode for basic programs&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IRQ&amp;#039;&amp;#039;&amp;#039; - Maskable interrupts at ~60Hz, useful for timing and multitasking&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;NMI&amp;#039;&amp;#039;&amp;#039; - Non-maskable interrupts at ~60Hz, guaranteed periodic execution&lt;br /&gt;
&lt;br /&gt;
{{Warning|If you enable IRQ or NMI mode, your program MUST provide proper interrupt handlers. Without handlers, the system will crash as interrupt return addresses pile up on the stack.}}&lt;br /&gt;
&lt;br /&gt;
See [[Interrupt System (JP1 Jumper)]] for programming considerations and interrupt handler requirements.&lt;br /&gt;
&lt;br /&gt;
== Common Issues and Solutions ==&lt;br /&gt;
&lt;br /&gt;
=== Boot Screen Stays Visible ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause&amp;#039;&amp;#039;&amp;#039;: Your program hasn&amp;#039;t written to video RAM yet, or hasn&amp;#039;t started executing.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Verify program binary is correct size&lt;br /&gt;
* Check that load address matches your program&amp;#039;s expectations&lt;br /&gt;
* Ensure program enters a loop or continues execution&lt;br /&gt;
&lt;br /&gt;
=== Program Doesn&amp;#039;t Execute ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause&amp;#039;&amp;#039;&amp;#039;: Some CPUs require boot code (reset vectors, exception tables) to start executing.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Check if your CPU has a template specialization (Z80, 6502, 68000 do)&lt;br /&gt;
* CPUs without specialization may need boot code in your binary&lt;br /&gt;
* Consult [[CPU Support and Initialization]] for your architecture&lt;br /&gt;
&lt;br /&gt;
=== Wrong Memory Addresses ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause&amp;#039;&amp;#039;&amp;#039;: Memory layout varies by CPU address space width.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Always check the boot screen for correct addresses&lt;br /&gt;
* Use formulas from [[Memory Layout and Addressing]]&lt;br /&gt;
* Different CPUs have different video RAM and semihosting addresses&lt;br /&gt;
&lt;br /&gt;
== Next Steps ==&lt;br /&gt;
&lt;br /&gt;
Now that you&amp;#039;ve run your first ZBC system, explore further:&lt;br /&gt;
&lt;br /&gt;
* [[System Overview]] - Understand the complete system architecture&lt;br /&gt;
* [[Memory Layout and Addressing]] - Master memory organization across CPUs&lt;br /&gt;
* [[Video Display (MC6847)]] - Learn advanced display programming&lt;br /&gt;
* [[Semihosting Overview]] - Access host services from your programs&lt;br /&gt;
* [[Writing Programs for ZBC]] - Comprehensive development guide&lt;br /&gt;
* [[Example Programs]] - Learn from working examples&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[What is Zero Board Computer]] - Complete introduction to ZBC&lt;br /&gt;
* [[Quickload System]] - Details on program loading&lt;br /&gt;
* [[CPU Support and Initialization]] - CPU-specific boot requirements&lt;br /&gt;
&lt;br /&gt;
{{ZBC Navigation}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Overview]]&lt;br /&gt;
[[Category:User Guides]]&lt;br /&gt;
[[Category:Getting Started]]&lt;/div&gt;</summary>
		<author><name>Jbyrd</name></author>
	</entry>
</feed>