Skip to content

UNO for Vintage Computers v1.0.5

Choose a tag to compare

@jhonnaker1 jhonnaker1 released this 13 Aug 03:18

Changes since v1.0.4

  • MSX2 port added. Z80 like the ZX Spectrum port, but via SDCC rather than z88dk and with far better video to aim at. MSX2 rather than MSX1 for a concrete reason: the MSX1's VDP is the same TMS9918A as the TI-99/4A port, with the same "colour belongs to a group of eight character codes" constraint. The V9938 drops it and adds the two things this game wants -- a programmable palette (SCREEN 5 is 256x212, 16 colours out of 512, so the suits are the actual UNO red/yellow/green/blue rather than the nearest of fifteen fixed entries) and a hardware blitter, which is what makes full pixel-art cards affordable on a 3.58MHz Z80 where the Amiga and Atari ST ports need a 68000 for the same look. Glyphs come from the machine's own ROM font via the CGTBL pointer at 0x0004, so the cartridge carries no font of its own. AY-3-8910 PSG sound gives three real voices, so chords rather than beeps -- its tone constant 111861/Hz is identical to the TI-99/4A's SN76489, both being divided down from the same 3.579545MHz colourburst crystal. Ships as a flat 16K cartridge ROM (11,296 bytes used, so no bank switching, unlike the TI-99/4A) and runs unchanged on MSX2+ and turbo R.

    Bringing it up hit four traps worth recording, all written up in msx2/. Three are the V9938's: the command engine takes pixel coordinates for every command (the manual's "byte units" is about internal granularity, and only means a fill cannot start or stop on an odd pixel); NX == 0 means "the whole width" rather than "nothing", so a naive one-pixel-wide line paints a band across the screen; and the blitter shares the VRAM port with the CPU, so a fill that has been started but not finished will overwrite whatever the CPU writes behind it -- the symptom being that the first line of text after a screen clear vanishes and every later line is fine.

    The fourth is a genuine Z80 hardware erratum. SDCC's __critical compiles to an ld a,i interrupt-state save, and if a maskable interrupt is accepted during that one instruction the Z80 resets the P/V flag regardless of the real IFF2 state. The restore then concludes interrupts were already off, skips the matching ei, and they stay off permanently -- the frame counter stops and the game freezes mid-turn. With thousands of these per screen redraw against a VBLANK every 20ms, the first build survived about seventeen seconds. Plain di/ei instead. openMSX emulates the erratum faithfully, which is the only reason it was findable without real hardware.

  • MIT license added. The repo was public but carried no license, which meant default copyright -- no right to use, modify or redistribute any of it. It is now MIT (LICENSE), excluding the two vendored third-party directories that carry their own (c64os/inc/ and c64os/tools/). No machine ROMs are bundled anywhere.

  • Project renamed to "UNO for Vintage Computers." The old name described the first few ports, not a lineup that now spans five CPU families and eleven manufacturers. The GitHub repository slug stays commodore-uno so existing clones and links keep working.

  • Documentation audit across every port. The Notes section of the main README covered 7 of the 18 ports and now covers all of them, one entry each, ordered to match the table. Also fixed: the Foenix F256K had a table row and a shipping binary but no build instructions anywhere; the CoCo 3 row called the 6809 "a fifth CPU family" and the TI-99/4A row called the TMS9900 "a third", neither of which was right and which contradicted each other; and the TI-99/4A's colour ranges are 24 character codes holding a 23-glyph alphabet, not "24-glyph" ranges -- 24 because colour is assigned a whole 8-code group at a time.

How to run each one

  • uno-c64.prg — Commodore 64. x64sc uno-c64.prg in 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 $D6xx base, 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; see atari/README.md for the exact recipe.
  • uno-atari800xl-vbxe-bmp.xex — Atari 800XL + VBXE, bitmap-graphics edition. Same game as uno-atari800xl-vbxe.xex but 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 $D6xx base.
  • 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 .SYSTEM file. This is not a bootable disk image by itself — see the apple/ README section for how to inject it into a ProDOS disk image, then run it in MAME's apple2ee driver.
  • uno-amiga — Commodore Amiga, Kickstart 2.0+. In FS-UAE, put this binary in a folder alongside an s/startup-sequence file whose only line is uno-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 type uno-amiga at the AmigaDOS shell.)
  • uno-amiga-bmp — Commodore Amiga, Kickstart 2.0+, bitmap-graphics edition. Same game as uno-amiga but 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 an s/startup-sequence whose only line is uno-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 and U (see Controls).
  • uno-cbm510.prg — Commodore CBM-II (510/P500). xcbm5x0 uno-cbm510.prg in VICE.
  • uno-f256k.pgz — Foenix F256K. Copy it onto an F256 SD card image (or a real SD card), boot to SuperBASIC, and run /- uno (/- hands off to the pexec chainloader, which loads uno.pgz and its PGZ header names). Renders cards as solid colour tiles via the Vicky video chip, with real SID sound; keyboard only (,/. move, space plays, U draws, 1-9/0/A-J jump to a hand slot). Developed and verified against a f256k MAME driver.
  • uno-ti99-4a.rpk — Texas Instruments TI-99/4A, cartridge image. mame ti99_4a -cart uno-ti99-4a.rpk -ioport peb -ioport:peb:slot2 32kmem — the 32K expansion is required, because the cartridge copies the game into that RAM and runs it there. At the TI title screen press any key, then 2 to pick UNO from the console's selection list. Keyboard only (,/. move, space plays, U draws, 1-9/0/A-J jump to a hand slot) — the TI's arrows are FCTN+S/D/E/X and don't come back as plain ASCII. The .rpk is a zip; uno_b0.bin and uno_b1.bin inside it are the two 8K banks, in that order, for real hardware.
  • uno-msx2.rom — MSX2 (and MSX2+ / turbo R), 16K cartridge image. In openMSX: openmsx -machine Philips_NMS_8250 -carta uno-msx2.rom. It boots straight into the game — no BASIC, no menu, no keypress to get past a selection screen. This is the one asset here that needs no ROM of your own: openMSX ships the free C-BIOS, so -machine C-BIOS_MSX2 runs it too (and boots faster). Cursor keys or a joystick in port 1 move the cursor, space or return plays/confirms, U or cursor-up draws, 1-9/0/A-J jump to a hand slot. Real hardware works too — it's a plain 16K ROM image for a standard cartridge.
  • uno-zxspectrum.sna — Sinclair ZX Spectrum 48K, ready-to-run snapshot (no LOAD needed). mame spectrum -snapshot uno-zxspectrum.sna, or drag onto any emulator that accepts .sna files. 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.m inside a uno_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 VICE x64sc with 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 so uno_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.) in c64os/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.prg but 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 -rompath should point at it -- see coco/README.md). -run attaches the file and autotypes LOADM/EXEC for 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. Several machines can't do that, each for its own reason, and all land on the same fallback — ,/. to move and U to draw: the Amiga (its cursor keys didn't work reliably through the console input path), the Foenix F256K (arrow keys arrive through the kernel event queue with no ASCII, so they'd need raw scancodes), and the TI-99/4A (its arrows are FCTN+S/D/E/X and come back as control codes rather than plain ASCII). D would be the obvious draw key, but A-J are already the quick-play keys. The ZX Spectrum uses O/P/Q instead, since a real Spectrum keyboard has no cursor keys at all and 1-9/0 are already spoken for. The Atari ST/STE 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.