Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CLAUDE.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -163,7 +163,8 @@ to the ip65 layout.

### UCI test scripts

Scripts under `tools/uci/` require a U64E at 192.168.1.81 and use
Scripts under `tools/uci/` require a U64E (default 192.168.1.81,
overridable via the `U64_HOST` environment variable) and use
`DeviceLock` + `enable_uci`/`disable_uci`:

- `boot_check.py` — verify UCI firmware detection and boot banner
Expand Down
21 changes: 21 additions & 0 deletions LICENSE
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 JC-000

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
19 changes: 12 additions & 7 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -18,11 +18,11 @@ An HTTPS client for the Commodore 64 in 6502 assembly. Implements TLS 1.3 over T
│ │ Record Layer │ Handshake Proto │ │ tls_record.asm, tls_handshake.asm
│ └──────┬───────┴────────┬─────────┘ │
│ │ │ │
│ ┌──────┴───────┐ ┌─────┴──────────┐ │
│ │ AEAD │ │ Key Schedule │ │ (crypto modules)
│ │ ChaCha20- │ │ HKDF-SHA256 │ │ hkdf.asm
│ │ Poly1305 │ │ ECDHE P-256 │ │
│ └──────────────┘ └────────────────┘ │
│ ┌──────┴───────┐ ┌─────┴──────────┐
│ │ AEAD │ │ Key Schedule │ │ (crypto modules)
│ │ ChaCha20- │ │ HKDF-SHA256 │ │ hkdf.asm
│ │ Poly1305 │ │ ECDHE P-256 │
│ └──────────────┘ └────────────────┘
├─────────────────────────────────────────┤
│ Network ABI (src/net_abi.inc) │ net_init / net_tcp_* / net_dns_*
├──────────────────────┬──────────────────┤
Expand DownExpand Up@@ -114,7 +114,12 @@ The Makefile automatically builds ip65 from the submodule into a flat binary blo

## Project Status

Current status (40 KB binary, 537 labels):
Current status:

- 38 KB binary (ip65 build), 1738 labels
- 38 KB binary (uci build), 1816 labels

Progress:

- [x] Project structure and build system
- [x] ip65 submodule integration — 6.8 KB binary blob at $2000 (TCP/UDP/DNS/DHCP/ARP + RR-Net CS8900a)
Expand DownExpand Up@@ -205,7 +210,7 @@ The setup script creates `br-c64` with `tap-c64-0`/`tap-c64-1`, assigns `10.0.65

### Ultimate 64 Elite Hardware Tests (UCI backend)

Scripts under `tools/uci/` drive a real Ultimate 64 Elite over the network (default `192.168.1.81`), exercising the **UCI backend only** (built with `make BACKEND=uci`). They DMA the PRG into RAM, run the boot, and snapshot UCI/TLS state on completion or timeout. These scripts do not run under VICE.
Scripts under `tools/uci/` drive a real Ultimate 64 Elite over the network (default `192.168.1.81`, overridable via the `U64_HOST` environment variable), exercising the **UCI backend only** (built with `make BACKEND=uci`). They DMA the PRG into RAM, run the boot, and snapshot UCI/TLS state on completion or timeout. These scripts do not run under VICE.

```bash
python3 tools/uci/boot_check.py # UCI firmware detection
Expand Down
13 changes: 9 additions & 4 deletions tools/uci/boot_check.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,27 +3,32 @@
Phase 1b boot check for the UCI backend.

Uploads build/c64-https.prg (assumed to have been built with
`make BACKEND=uci`) to the U64E at 192.168.1.81, waits for the PRG
to boot, reads screen RAM at $0400 (40x25 = 1000 bytes), decodes the
Commodore screen-code bytes to ASCII, and prints the non-empty lines.
`make BACKEND=uci`) to the U64E (default 192.168.1.81, overridable via
U64_HOST), waits for the PRG to boot, reads screen RAM at $0400
(40x25 = 1000 bytes), decodes the Commodore screen-code bytes to
ASCII, and prints the non-empty lines.

Pass criterion: screen contains printable text (not a uniform field
of spaces or garbage). This only verifies the PRG loads and runs on
real hardware — no UCI commands are exercised.

Usage:
python3 tools/uci/boot_check.py

Environment:
U64_HOST — U64E address (default 192.168.1.81)
"""
from __future__ import annotations

import os
import sys
import time
from pathlib import Path

from c64_test_harness.backends.device_lock import DeviceLock
from c64_test_harness.backends.ultimate64_client import Ultimate64Client

HOST = "192.168.1.81"
HOST = os.environ.get("U64_HOST", "192.168.1.81")
PRG_PATH = Path(__file__).resolve().parents[2] / "build" / "c64-https.prg"


Expand Down
6 changes: 5 additions & 1 deletion tools/uci/phase2_check.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,9 +20,13 @@

Usage:
python3 tools/uci/phase2_check.py

Environment:
U64_HOST — U64E address (default 192.168.1.81)
"""
from __future__ import annotations

import os
import sys
import time
from pathlib import Path
Expand All@@ -32,7 +36,7 @@
from c64_test_harness.backends.ultimate64_client import Ultimate64Client
from c64_test_harness.uci_network import enable_uci, disable_uci

HOST = "192.168.1.81"
HOST = os.environ.get("U64_HOST", "192.168.1.81")
REPO_ROOT = Path(__file__).resolve().parents[2]
PRG_PATH = REPO_ROOT / "build" / "c64-https.prg"
LABELS_PATH = REPO_ROOT / "build" / "labels.txt"
Expand Down