Skip to content

UNO for Vintage Computers v1.0.6

Choose a tag to compare

@jhonnaker1 jhonnaker1 released this 14 Aug 02:46

Changes since v1.0.5

  • MS-DOS port added, in three builds. A sixth CPU family for the repo -- Intel x86 -- built with Open Watcom for the 8088 in real mode, which is what buys the reach: one binary runs on a stock 1981 IBM PC or PC/XT, on a Pentium, on DOSBox and on FreeDOS alike. Nothing here needs a 286, not even the graphics builds -- a video card is not a CPU.

    uno-dos-cga.exe is CGA 80x25 colour text. Per-cell foreground and background gives the same solid card tiles as the X16/VBXE/F256/MEGA65 ports, but at twice the C64's width, so the whole hand fits as two straight rows of ten with no overlapping fan. The suits are the real UNO colours only because blinking is turned off: CGA's attribute byte has three bits of background, so backgrounds are normally the eight dark shades and yellow comes out brown -- clearing the blink bit re-purposes it as background intensity and unlocks all sixteen.

    uno-dos-ega.exe is EGA mode 10h: 640x350 in 16 colours, the highest resolution of any port in this repo. uno-dos-vga.exe is VGA mode 13h: 320x200 with a programmable 256-colour palette, so the suits are programmed to the actual UNO colours rather than picked from a fixed sixteen. Both share one ui_bmp.c over two backends that are about as far apart as PC graphics hardware gets -- EGA's four planes all sit at A000:0000 at once and a CPU write triggers the card's ALU (Set/Reset plus a bit mask, with the latches loaded by a dummy read), while mode 13h is one byte per pixel and a store, the simplest video hardware in the whole repo.

    Sound is the PC speaker, one square-wave voice via timer channel 2 of the 8253 -- so arpeggios where the MSX2 and TI-99/4A play chords. Its divider constant 1193182/Hz comes off the same NTSC colourburst crystal as those two machines' sound chips, making it the third in the repo to do so.

  • CGA snow, which is a hardware defect rather than a bug. The first working build speckled during CPU turns. The 6845 CRTC and the CPU share the regen buffer at B800:0000 with no arbitration, so a CPU write while the card is fetching display data costs the CRTC its cycle and puts garbage on screen. Every write now waits for bit 0 of 0x3DA -- but only on real CGA, since EGA and later never had the problem and should not pay the poll loop. Worth recording because it is invisible on modern hardware: developing against VGA would have shipped a port that snowed on exactly the machine it is named for.

  • A verification trick the other ports cannot use. DOS can write files, so these builds report what they actually drew instead of being screenshotted: the CGA build dumps its text buffer and attribute map as readable text, and the graphics builds dump raw pixels for a host script to turn into PNGs. That caught a layout bug, proved the bright-background trick had taken, and settled by reading a pixel whether a highlight was drawing when it was too thin to see.

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-dos-cga.exe — MS-DOS, CGA. The baseline build: runs on a stock IBM PC or PC/XT and on every PC since. In DOSBox or DOSBox-X, mount a folder containing it and run UNO.EXE; on real hardware or in 86Box (machine = IBM XT, video = CGA), copy it off the floppy image below. Arrow keys or U/space; 1-9/0/A-J jump to a hand slot; ESC quits to DOS.
  • uno-dos-ega.exe — MS-DOS, EGA. 640x350 in 16 colours, pixel-art cards. Needs an EGA card or better (-machine ega in DOSBox-X); same 8088 code as the CGA build, so no faster CPU is required. Same controls.
  • uno-dos-vga.exe — MS-DOS, VGA. 320x200 in 256 colours, with the suits programmed to the real UNO colours. Needs a VGA card (-machine vgaonly in DOSBox-X). Same controls.
  • uno-dos-floppy.img — all three of the above on a 1.44M FAT12 floppy image, which is the easiest way onto an emulated or real PC: attach it as drive A: and run A:\UNO.EXE, A:\UNOEGA.EXE or A:\UNOVGA.EXE depending on your video card.
  • 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.