65 lines
3.0 KiB
Plaintext
65 lines
3.0 KiB
Plaintext
uxn rom metadata proposal
|
|
|
|
by d6
|
|
|
|
currently uxn rom files are just the data that will be loaded into the VMs
|
|
memory on start up (starting with address 0x100 since the zero page is
|
|
skipped). this means that the maximum rom size is 65280 bytes, although
|
|
most roms are much smaller since trailing zeros can be left out.
|
|
|
|
this simplicity is great, but comes with some (possible) downsides:
|
|
|
|
- roms aren't identifiable beyond their file name
|
|
- roms don't contain any attribution information, credits, or licenses
|
|
- roms don't contain a version information (rom version or uxn version)
|
|
- roms don't contain any icon or preview information
|
|
|
|
while it would be nice to add all of these things that would create a major
|
|
burden on assembler and emulator authors. i think there's an easier path
|
|
forward.
|
|
|
|
i propose adding four bytes to the start of every rom:
|
|
|
|
- the literal 3 bytes "uxn"
|
|
- a fourth mode byte
|
|
|
|
this proposal just covers mode 0 and mode 1, but in the future we have up to
|
|
254 other modes to use (though we might choose to forbid those later to keep
|
|
things simple).
|
|
|
|
the "uxn0" format would be exactly what we have now, just with those four
|
|
bytes at the start. assembler authors could choose to only support creating
|
|
"uxn0" roms without very much extra effort over what they do now. emulator
|
|
authors could easily adapt their current work to read this format. rom files
|
|
that lack a "uxn" at the start could continue to work as they do now.
|
|
|
|
the "uxn1" format would provide some extra metadata:
|
|
|
|
- total-size (2 bytes): total metadata size (including "uxn1")
|
|
- uxn-version (2 bytes): 0x0000 for unspecified, 0x0001 for current
|
|
- name-size (1 byte): size of the following name string in bytes
|
|
- name (n bytes): the name string (ASCII/UTF-8)
|
|
- version-size (1 byte): size of the version string in bytes
|
|
- version (n bytes): the version string (ASCII/UTF-8)
|
|
- author-size (1 byte): size of the author string in bytes
|
|
- author (n bytes): the author string (ASCII/UTF-8)
|
|
- desc-size (2 bytes): size of the description string in bytes (4096 max)
|
|
- desc (n bytes): the description string (ASCII/UTF-8)
|
|
- icon-type (1 byte): the size and depth of the icon
|
|
- icon-palette (n bytes): the icon's color theme
|
|
- icon-chr (n bytes): the icon's CHR data
|
|
|
|
the minimal "uxn1" header size (assuming the strings and icon are all empty)
|
|
would be 10 bytes (2 + 2 + 1 + 1 + 1 + 2 + 1). emulator implementors could
|
|
read total-size and then seek past this metadata to read the rom data.
|
|
|
|
the icon types would be:
|
|
|
|
- 0x00: no icon provided (0-byte icon-palette, 0-byte icon-chr)
|
|
- 0x01: 1-bit 16x16 icon (2-byte icon-palette, 32-byte icon-chr)
|
|
- 0x02: 1-bit 32x32 icon (2-byte icon-palette, 128-byte icon-chr)
|
|
- 0x03: 1-bit 64x64 icon (2-byte icon-palette, 512-byte icon-chr)
|
|
- 0x81: 2-bit 16x16 icon (6-byte icon-palette, 64-byte icon-chr)
|
|
- 0x82: 2-bit 32x32 icon (6-byte icon-palette, 256-byte icon-chr)
|
|
- 0x83: 2-bit 64x64 icon (6-byte icon-palette, 1024-byte icon-chr)
|