https://github.com/guidobonerz/go64u
Ultimate64 Command CLI
https://github.com/guidobonerz/go64u
c64 cli commodore-64 ffmpeg-wrapper ftp go rest-api rtmp stream twitch udp ultimate64
Last synced: about 2 months ago
JSON representation
Ultimate64 Command CLI
- Host: GitHub
- URL: https://github.com/guidobonerz/go64u
- Owner: guidobonerz
- Created: 2025-11-26T21:49:56.000Z (7 months ago)
- Default Branch: main
- Last Pushed: 2026-04-19T16:54:44.000Z (about 2 months ago)
- Last Synced: 2026-04-19T18:37:49.289Z (about 2 months ago)
- Topics: c64, cli, commodore-64, ffmpeg-wrapper, ftp, go, rest-api, rtmp, stream, twitch, udp, ultimate64
- Language: Go
- Homepage:
- Size: 30.4 MB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# go64u
Ultimate64 Remote CLI
**go64u** is a tool for remote interaction with the Ultimate64 computer.
```
go64u [command] [flags]
```
## How to start
### Option 1 - UI Mode
```
go64u
```
### Option 2 - Terminal Mode (REPL)
```
go64u --terminal
```
### Option 3 - CLI Mode
```
go64u
```
---
## Global Flags
| Flag | Short | Type | Default | Description |
|------|-------|------|---------|-------------|
| `--terminal` | – | bool | `false` | Run the application in terminal (REPL) mode |
| `--device` | `-d` | string | *(from config)* | Set device. Needed in non-terminal mode |
---
## Machine Commands
### `devices`
Show device configurations.
### `message [message] [x] [y]`
Writes a message on screen at a given position.
### `pause`
Pauses the U64 by pulling the DMA line low at a safe moment. This stops the CPU. Note that this does not stop any timers.
### `poweroff`
Shuts down the U64. Note that it is likely that you won't receive a valid response.
### `readmem [address]`
Reads several bytes from memory by a given length.
| Flag | Short | Type | Default | Description |
|------|-------|------|---------|-------------|
| `--length` | `-l` | uint16 | `1` | Length of data to read |
| `--output` | `-o` | string | `output.bin` | Output file name |
| `--type` | `-t` | string | `file` | Output type: `file` or `bin` |
### `reboot`
Reboots the U64. Re-initializes the cartridge configuration and sends a reset to the machine.
### `reset`
Resets the U64. The current configuration is not changed.
### `resume`
Resumes the U64 after pause. The DMA line is released and the CPU will continue where it left off.
### `togglemenu`
Toggles the on-screen menu. Does the same thing as pressing the Menu button on an 1541 Ultimate cartridge or briefly pressing the Multi Button on the Ultimate 64.
### `writemem [address] [value]`
Sets one byte in memory (POKE). Writes a byte value (00-ff) to a memory address (0-ffff).
---
## Runner Commands
### `crt [file]`
Loads a cartridge file into the U64 and automatically starts it. The machine resets with the attached cartridge active. It does not alter the configuration of the Ultimate.
### `load [file] [address]`
Loads a program into the U64. The machine resets and loads the attached program into memory using DMA. It does not automatically run the program.
### `mount [drive] [file]`
Mounts a disk image (d64/g64/d71/g71/d81) on a given drive.
### `run [file] [address]`
Loads a program into the U64 and automatically starts it. The machine resets, loads the attached program into memory using DMA, then automatically runs the program.
### `unmount [drive]`
Unmounts a disk image from a given drive.
---
## File Commands
### `ls [path/diskimage]`
List files of the internal drive (USB Stick, SD Card, Disk Images, etc.).
| Flag | Short | Type | Default | Description |
|------|-------|------|---------|-------------|
| `--memaddress` | `-m` | bool | `false` | Display the start address of a program if possible |
| `--filter` | `-f` | string | *(empty)* | Filter the list by a match pattern like `*.prg` |
---
## Drive Commands
### `drives`
Show drive info.
---
## Stream Commands
### `audio [command]`
Starts/Stops the audio stream.
| Command | Description |
|---------|-------------|
| `audio start` | Start the audio stream |
| `audio stop` | Stop the audio stream |
### `debug [command]`
Starts/Stops the debug stream. Audio and video streams will be stopped.
| Command | Description |
|---------|-------------|
| `debug start` | Start the debug stream (audio/video streams will be stopped) |
| `debug stop` | Stop the debug stream |
### `video [command]`
Starts/Stops the video stream.
| Command | Description |
|---------|-------------|
| `video start` | Start the video stream |
| `video stop` | Stop the video stream |
---
## VIC Commands
### `screenmem`
Shows the current VIC states of D011/D016/D018 and the memory bank setup.
### `screenshot`
Takes a screenshot of the current screen.
| Flag | Type | Default | Description |
|------|------|---------|-------------|
| `--scale` | int | `100` | Scale factor in percent (%) |
---
## Platform Commands
### `info`
Show device info.
### `online`
Check if the selected device is online (responds to HTTP requests).
---
## Terminal Mode (REPL)
Terminal mode is started with `go64u --terminal`. It provides an interactive REPL where all standard commands are available plus the following **terminal-only commands**:
### `asc`
Interactive audio stream controller. Lets you select from configured devices, play/stop audio streams, and switch between devices interactively.
### `cd [path/diskimage]`
Change the folder on the internal drive. Only available in terminal mode because it maintains a persistent working directory across commands.
### `device [device_key]`
Switch the active device within the terminal session. Shows the current device if no key is provided.
### `query`
Query packages matching a filter. By default the filter is set to the current year and type=d64.
| Flag | Type | Default | Description |
|------|------|---------|-------------|
| `--name` | string | *(empty)* | Filter by name |
| `--group` | string | *(empty)* | Filter by group |
| `--handle` | string | *(empty)* | Filter by handle |
| `--category` | string | *(empty)* | Filter by category |
| `--repo` | string | *(empty)* | Filter by repository |
| `--subcat` | string | *(empty)* | Filter by subcategory |
| `--year` | string | *(current year)* | Filter by year |
| `--rating` | string | *(empty)* | Filter by rating |
| `--type` | string | *(empty)* | Filter by type |
| `--latest` | string | *(current month)* | Filter by latest |
| `--offset` | int | `0` | Result offset |
| `--limit` | int | `80` | Result limit |
| `--ignoreDefaults` | bool | `false` | Ignore default filters |
| `--get` | bool | `false` | Download the files |
### `quit`
Quit the terminal and exit the application.
### `stream`
Stream to your favourite streaming platform (e.g. Twitch/YouTube). Starts both video and audio streams and pipes them through an RTMP encoder.
| Flag | Type | Default | Description |
|------|------|---------|-------------|
| `--target` | string | *(empty)* | Streaming platform (e.g. twitch, youtube) |
| `--record` | string | *(empty)* | Record locally: `audio`, `video`, or `both` |
| `--no-overlay` | string | *(empty)* | Disable overlay for: `stream`, `record`, or `both` |
---
### Database Sub-REPL
After entering `query` (or its dedicated database mode), the following sub-commands are available within the database REPL:
#### `category`
Show categories.
#### `filter`
Show/set active filters.
#### `list`
List filtered results.
#### `quit`
Leave the database sub-REPL.
---
## GUI Frontend (Gio UI)
The graphical interface is launched without the `--terminal` flag and uses the **Gio UI** framework (`gioui.org`). The window has a resolution of 800x680 pixels with a dark Material Design theme.
### Layout
The layout consists of three areas:
1. **Toolbar** (top) – Control buttons for the selected device
2. **Main area** – Device cards (left) + Video monitor grid (right)
3. **Footer** (bottom) – Status line with hover hints
### Toolbar Functions
| Button | Function |
|--------|----------|
| Play/Stop | Start/Stop all streams for the selected device |
| Pause | Pause the U64 (DMA line low) |
| Audio | Enable/Disable audio monitoring with playback |
| Video | Enable/Disable video monitoring |
| Snapshot | Save a screenshot as PNG to the configured folder |
| Record | Start/Stop MP4 recording (video + audio) |
| Cast | Start/Stop streaming to a platform (e.g. Twitch) |
| Overlay | Enable/Disable the stream overlay |
| CRT | Enable/Disable the CRT scanline effect |
| Reset | Send a reset to the U64 |
| Power Off | Shut down the U64 |
### Device Cards
Each configured device is displayed as a card with rounded corners. The card shows:
- Device name and description
- Online status indicator (green = online, red = offline, gray = unchecked)
The online check runs automatically every 5 seconds in the background.
### Video Monitor
- Displays active video feeds in a grid layout
- Supports multiple simultaneous device streams
- Native resolution: 384x272 pixels (Ultimate64)
- Scaling with rounded corners
- Optional CRT scanline effect (sine wave-based brightness modulation)
### Audio Waveform
- Real-time stereo waveform visualization
- Two channels with visible gap
- Updated live during audio playback
### Drag & Drop (Windows)
On Windows, files can be dragged and dropped onto a device monitor window. The file is automatically routed to the correct device based on the drop position in the grid.
### Recording & Streaming
- **Recording**: Saves as MP4 to the configured `RecordingFolder`
- **Casting**: Streams live to configured platforms (e.g. Twitch) via the `StreamingTargets` configuration
- Both use the `StreamRenderer` for video encoding, audio mixing, and optional overlay compositing
### Audio System
- Framework: `ebitengine/oto/v3`
- 48 kHz sample rate, stereo, 16-bit signed LE
- Real-time playback and monitoring
---
## Screenshots
### Folder structure with icons

### Audio Stream Player - Terminal

### Stream Player - Monitor

---
## Installation
Create an environment variable **GO64U_CONFIG_PATH** where the **.go64u.yaml** file is located.
The structure of the file is currently as follows:
```yaml
LogLevel: quiet
Devices:
DEVICE_NAME[n]:
Description: "Device name"
IsDefault: true
IpAddress:
VideoPort: 11000
AudioPort: 11001
DebugPort: 11002
StreamingTargets:
: rtmp://live.twitch.tv/app/
: rtmp://
LogLevel: ffmpeg_loglevel
DumpFolder:
RecordingFolder:
ScreenshotFolder:
DownloadFolder:
Overlay:
X: 700
Y: 200
WIDTH: 800
HEIGHT: 600
ImagePath:
```
> **Note:** If you have more than one Ultimate64 board, you have to choose different ports for each board.
> **Note:** If you want to stream the U64 stream via RTMP to Twitch, YouTube, etc. you need to install ffmpeg.
---
## Todo
- List and change dir (local and remote)
- Disassembler with dialect option