UNO for Vintage Computers v1.0.3
Changes since v1.0.2
-
Amiga: bitmap-graphics build added. A second Amiga build (
make bmp) that renders the game as pixel-art cards in a custom 320x256, 16-colour lores screen instead of the text build's console.device characters -- the same card/hand design as the Atari ST and X16/VBXE bitmap builds. It draws through graphics.library, so unlike the ST port (which hand-masks four bitplanes) the planar framebuffer is the OS's job and the card bodies areRectFill()s that run on the blitter; text is the topaz ROM font viaText(), so no embedded font is needed. The text build (uno-amiga) is unchanged. Source inamiga/(gfx.c/ui_bmp.c/main_bmp.c). -
Atari ST/STE port added. The second 68000 machine here, and a completely different target from the Amiga -- GEMDOS/TOS rather than AmigaOS, so it needs its own toolchain (vbcc with the
m68k-ataritarget, built from source; there's no Homebrew package and the old cross-mint tap is gone). It's also the only machine in the collection with no text mode at all, and its framebuffer isn't chunky -- it's four bitplanes interleaved by word, so a pixel's colour is assembled from the same bit position across four separate 16-bit words. The video layer masks whole 16-pixel word groups across all four planes and draws card faces as nested fills to stay at word speed. Full-colour pixel-art cards and a fanned hand in 320x200/16 colours. The palette is written in STE 4-bit-per-gun encoding, whose extra bit sits in bit 3 as the least significant bit and is simply ignored by a plain ST -- 4096 colours on an STE, a graceful fallback to the ST's 512, from one code path -- and the title screen tells you which machine it detected. Carries its own 8x8 font (the ROM font is only reachable via Line-A/VDI), YM2149 sound through XBIOSDosound(). Source inste/.Bringing it up also surfaced a latent bug the 6502 ports had been hiding for the whole life of the project: the shared
GameStateput a singledraw_countbyte between the twoCardarrays, landingdiscard_pileon odd offset 217.Cardis two bytes with byte alignment, so that's legal -- but the compiler renders a two-byteCardassignment as onemove.w, and a 68000 traps on a word access to an odd address. Harmless everywhere else, an instant Address Error here. -
Atari 800XL VBXE: bitmap-graphics build added. A third Atari build (
make all-vbxe-bmp) that renders the game in the VBXE Overlay's SR mode -- a real 320x192, 8bpp chunky framebuffer with a 256-entry 24-bit palette -- instead of the text overlay. Pixel-art card faces (drop shadow, suit border, corner values, centre badge) and a fanned overlapping hand, with the Atari ROM charset blitted into the framebuffer for text. Selecting the mode meant deriving the SR-mode XDL from Altirra's ownkOvModeTable(the graphics entry needs the GMON control bit rather than text's TMON). Same rules, input and POKEY sound as the text build; the textuno-atari800xl-vbxe.xexis unchanged. -
Commander X16: bitmap-graphics build added. A second, separate X16 build (
make bmp) that renders the whole game in a 320x240 256-colour bitmap framebuffer instead of text/tiles -- pixel-drawn card faces (drop shadow, suit border, centre pip) and a fanned overlapping hand -- built on the KERNAL's GRAPH_* framebuffer API. Same rules/input/sound as the text build; the textuno-cx16.prgis unchanged. Source inx16/(ui_bmp.c/vbmp.c/graph.s). -
Commander X16 port added. The modern 8-bit machine, via cc65's
cx16target. Talks straight to its VERA video chip -- per-cell foreground+background color for solid colored card tiles with legal-move dimming (unplayable cards darkened so the playable ones stand out) and a bolder pulsing selection highlight, a real hardware-sprite card toss (VERA has 128 sprites, so genuine sprite motion rather than the VBXE port's redraw), and VERA PSG sound -- the same feature set as the C64/VBXE ports. Source inx16/. -
MEGA65 port added. The modern Commodore-65 recreation. Compiles as a cc65
c64-target binary that runs in C64 mode and brings up the VIC-IV video chip through mega65-libc for a per-cell-color 40-column screen (color-bordered card boxes), a VIC-II hardware-sprite card toss on every play, and SID sound directly mapped at$D400. (80-column would need native C65 mode, which a C64-mode binary can't reach; legal-move dimming and stereo dual-SID are noted follow-ups.) Source inmega65/. -
PET 8032 build added. Same 4032 hardware family (monochrome, keyboard only), just 80x25 instead of 40x25 -- separate build target, source is
pet/src/main8032.c/petvid8032.c/ui8032.c. Not attached to v1.0.2 even though it landed before that release. -
CBM-II (510/P500) port added. The one CBM-II model with a real VIC-II and SID (same chips as the C64), reached through cc65's
pokebsys()/peekbsys()since they live in a separate bank-switched "system bank" plain pointers can't reach. Full-color card borders and SID sound effects. -
ZX Spectrum port added. A genuinely different toolchain from every other port here: Z80 (not 6502) via z88dk instead of cc65. 32x24 text over a bitmap with per-8x8-cell ink/paper color (the classic Spectrum "attribute clash"), cards shown as bracketed color-letter labels like the VIC-20/PET/Atari ports,
O/P/Q"keys as joystick" scheme since a real Spectrum has no cursor keys, 1-bit beeper sound. -
C64 OS port added. A real windowed application for Greg Naçu's C64 OS (not a shortcut to the bare-metal C64 port above) -- its own menu, real keyboard-event handling, and the full game engine hand-ported to 6502 assembly against C64 OS's TMP-syntax SDK, since C64 OS predates and isn't compatible with the cc65/C toolchain every other port here uses. Source and design notes in
c64os/. -
C64 OS port: rendering performance fix. Every redraw used to re-run the full sequence of
ctxdraw_calls straight against live screen memory, even for things like closing a menu where nothing in the game had actually changed -- visibly slow. Now the app renders into a private off-screen layer buffer gated by a dirty flag, and only blits that buffer to the real screen (a fast raw memory copy) when nothing needs to be redrawn. Sameuno-c64os.zipasset below, just rebuilt. -
Tandy CoCo 3 port added. Another genuinely different toolchain: 6809 via CMOC instead of cc65. Cards are still shown as bracketed
[label:COLORLETTER+VALUE]like the PET/VIC-20/Atari/ZX Spectrum ports (CoCo3's text mode has no redefinable character generator, so it can't do the C64 port's custom card-shaped tiles), but each card renders in its actual suit color -- the GIME's text-attribute foreground and background turned out to be two independent banks of programmable palette registers, so every color is explicitly set rather than left at boot defaults. Source and hardware notes incoco/. -
ZX Spectrum port: real per-suit card colors. Same upgrade as the CoCo 3 port above -- cards now render in their actual color instead of a single ink, since the Spectrum's famous "attribute clash" turns out to only bite at sub-cell bitmap graphics, not plain text (one character already is one attribute cell). Along the way, found and fixed a real bug: the console driver defaulted every printed character's background to white regardless of what the screen was cleared to, so white text was rendering as an invisible white-on-white block. Same
uno-zxspectrum.snaasset below, just rebuilt. -
C128 port: 40-column build brought to C64 parity, 80-column VDC colors fixed. The 40-column (VIC-IIe) build was missing everything the C64 port's later animation/sound work added -- sprite-based card-toss animation, deal-in animation, blinking hand cursor, win-screen border flourish, and most of the distinct SID sound effects -- all ported over now. The 80-column (VDC) build had a real, longstanding color bug: its color constants were copy-pasted from the VIC-II's palette without checking whether the VDC (8563/8568) shares it -- it doesn't, it's a separate RGBI-based color chip with its own 16-entry table, so cards only ever showed in shades of blue and green, never red or yellow. Fixed with the VDC's real documented palette. The VDC build also now runs in C128's 2MHz fast mode (verified first that this doesn't break the frame-pacing timer it depends on, even though the VIC-II's own unwatched picture goes incoherent at that speed, same well-known tradeoff every 2MHz C128 program makes).
-
Atari 800XL VBXE port added, then upgraded to C64-port parity. A second Atari build for machines fitted with a VBXE (Video Board XE) FPGA video card: 80-column overlay text mode with real per-character color. The bringup turned into a register-level archaeology project -- the widely-circulated 2009 VBXE v1.0-beta manual documents a palette protocol and a MEMAC banking register that simply don't exist on the FX core all real software (and Altirra's emulation) targets, so writes to them were silently dropped. Root-caused by reading Altirra's own
vbxe.cppand four working VBXE codebases; the full bug-by-bug field guide is inatari/README.md. Once working, brought up to the same feature level as the C64/C128 ports: cards render as solid colored tiles (not bracketed color-letters) with the value centered in a contrasting color, playing a card animates a small colored block from hand to discard pile (the redraw-based equivalent of the C64 port's hardware-sprite toss, since VBXE has no hardware sprites), hands deal in card-by-card at the start of each round, the selection cursor blinks, and winning triggers a rainbow flourish across the win screen.
How to run each one
- uno-c64.prg — Commodore 64.
x64sc uno-c64.prgin VICE, or a real C64 + disk/cart tool. - uno-c128-40col.prg — Commodore 128, 40-column (VIC-IIe).
x128 uno-c128-40col.prg. - uno-c128-80col-vdc.prg — Commodore 128, 80-column (VDC chip).
x128 uno-c128-80col-vdc.prg. - uno-plus4.prg — Commodore Plus/4.
xplus4 uno-plus4.prg. - uno-pet4032.prg — Commodore PET 4032, 40-column (keyboard only, no joystick port).
xpet uno-pet4032.prg. - uno-pet8032.prg — Commodore PET 8032, 80-column (same family as the 4032).
xpet -model 8032 uno-pet8032.prg. - uno-vic20.prg — Commodore VIC-20 + memory expansion.
xvic -memory all uno-vic20.prg. - uno-atari800xl.xex — Atari 800XL.
atari800 -xl -xlxe_rom <your ATARIXL.ROM> -nobasic uno-atari800xl.xex(you need your own Atari XL ROM dump; not included here). - uno-atari800xl-vbxe.xex — Atari 800XL + VBXE. In Altirra: configure the machine as an XL with 64K memory (not a RAMBO-style expansion -- the cc65 runtime's XL check fails under those), a real Atari XL OS ROM, and the VBXE device at the default
$D6xxbase, then boot the.xex. Now with legal-move highlighting (cards you can't play are dimmed in their own darkened suit color so the playable ones stand out; an all-unplayable hand shows a "press UP to draw" hint) and a bolder pulsing selection cursor. Verified in AltirraSDL/AltirraBridge; seeatari/README.mdfor the exact recipe. - uno-atari800xl-vbxe-bmp.xex — Atari 800XL + VBXE, bitmap-graphics edition. Same game as
uno-atari800xl-vbxe.xexbut rendered in the VBXE's 320x192 256-colour framebuffer (pixel-drawn card faces, fanned hand) instead of the text overlay. Same Altirra setup as the text VBXE build above: XL with 64K memory, a real Atari XL OS ROM, and the VBXE device at the default$D6xxbase. - uno-atariste.tos — Atari ST or STE. In Hatari, put it on an emulated GEMDOS drive and autostart it:
hatari --machine ste --tos <your tos.img> --harddrive <folder containing uno-atariste.tos> --auto 'C:\UNO-ATARISTE.TOS'(you need your own TOS ROM, or free EmuTOS; not included here). Or just copy it onto a floppy/hard-drive image and double-click it from the GEM desktop. Runs on a plain ST too -- it detects which machine it's on and drops from the STE's 4096-colour palette to the ST's 512 automatically. Keyboard only (see Controls). - uno-apple2e.system — Apple IIe (enhanced), ProDOS
.SYSTEMfile. This is not a bootable disk image by itself — see theapple/README section for how to inject it into a ProDOS disk image, then run it in MAME'sapple2eedriver. - uno-amiga — Commodore Amiga, Kickstart 2.0+. In FS-UAE, put this binary in a folder alongside an
s/startup-sequencefile whose only line isuno-amiga, then mount that folder as the boot hard drive with a Kickstart 2.0+ ROM — it autostarts on boot, no disk image and no shell typing needed:fs-uae --amiga-model=A1200 --kickstart_file=<your kickstart.rom> --hard_drive_0=<that folder>. (To run it by hand instead, drop the startup-sequence and typeuno-amigaat the AmigaDOS shell.) - uno-amiga-bmp — Commodore Amiga, Kickstart 2.0+, bitmap-graphics edition. Same game as
uno-amigabut rendered as pixel-art cards in a 320x256 16-colour screen instead of colored text. Run it the same way in FS-UAE: put it in a folder with ans/startup-sequencewhose only line isuno-amiga-bmp, then mount that folder as the boot hard drive with a Kickstart 2.0+ ROM and it autostarts on boot (fs-uae --amiga-model=A1200 --kickstart_file=<your kickstart.rom> --hard_drive_0=<that folder>). Movement is comma/period andU(see Controls). - uno-cbm510.prg — Commodore CBM-II (510/P500).
xcbm5x0 uno-cbm510.prgin VICE. - uno-zxspectrum.sna — Sinclair ZX Spectrum 48K, ready-to-run snapshot (no
LOADneeded).mame spectrum -snapshot uno-zxspectrum.sna, or drag onto any emulator that accepts.snafiles. You need your own ZX Spectrum 48K ROM for MAME; not included here. - uno-c64os.zip — C64 OS application bundle (
about.t/main.o/menu.minside auno_1.0/folder). This one's different from every other asset here: it's not a standalone binary you hand to an emulator, it's an app you install into an existing C64 OS boot volume. You need C64 OS itself already set up first (real hardware, or VICEx64scwith a CMD HD/SD2IEC image and the C64 OS.dhd-- C64 OS is Greg Naçu's commercial product and isn't included here). To install: unzip souno_1.0/lands directly inside/os/applications/on that volume, then launch it from C64 OS's own file manager or app menu. Full setup walkthrough (VICE device numbers, JiffyDOS test harness, etc.) inc64os/README.md. - uno-mega65.prg — MEGA65. In Xemu's
xmega65(with a MEGA65 ROM):xmega65 -rom <mega65-rom.bin> -prg uno-mega65.prg. Renders cards as color-bordered boxes on the VIC-IV (40-column) with SID sound; keyboard or joystick. Real hardware works too. - uno-cx16.prg — Commander X16. In the x16 emulator (with its
rom.bin):./x16emu -prg uno-cx16.prg -run. Renders cards as solid VERA color tiles with legal-move highlighting and a real hardware-sprite card toss; keyboard or joystick. Real hardware works too. - uno-cx16-bmp.prg — Commander X16, bitmap-graphics edition. Same game as
uno-cx16.prgbut rendered in a 320x240 256-colour framebuffer (pixel-drawn card faces, fanned hand) via the KERNAL GRAPH API../x16emu -prg uno-cx16-bmp.prg -run. - uno-coco3.bin — Tandy Color Computer 3, Disk Basic machine-language file. In XRoar:
xroar -machine coco3 -run uno-coco3.bin(needs your own CoCo 3 ROM; XRoar's default ROM search path or-rompathshould point at it -- seecoco/README.md).-runattaches the file and autotypesLOADM/EXECfor you.
Controls
Joystick (where the hardware has a port) or keyboard: cursor left/right to pick a card, space/return to play or confirm, cursor up to draw, or jump straight to a card with 1-9, 0, A-J. Two exceptions — the Amiga port uses comma/period for left/right and U to draw (its cursor keys didn't work reliably through the console input path), and the ZX Spectrum port uses O/P/Q since a real Spectrum keyboard has no cursor keys at all and 1-9/0 are already the quick-play keys. The Atari ST/STE port is keyboard-only (cursor keys and space): the ST's joystick ports sit behind the IKBD, which only reports sticks after being switched out of mouse mode and serviced on an interrupt vector -- and Hatari can map the cursor keys to a joystick anyway.
Full source, per-platform build instructions, and design notes are in the main README.