Iconvex Retro

iconvex_retro adds pure-Elixir codecs for machines and media whose character sets were measured in card punches, six-bit words, terminal glyph ROMs, and video-memory cells rather than modern octets.

It contains exactly the frozen package surface:

Install

def deps do
[
{:iconvex, "~> 0.1.1"},
{:iconvex_retro, "~> 0.1"}
]
end

Starting the application installs every route and provider atomically. Stopping it removes them atomically; a collision rolls the entire transaction back.

Six-bit machines

{:ok, bytes} = Iconvex.convert("HELLO", "UTF-8", "DEC-SIXBIT")
{:ok, "HELLO"} = Iconvex.convert(bytes, "DEC-SIXBIT", "UTF-8")
{:ok, packed} =
Iconvex.Retro.Packed.encode_from_utf8(
"HELLO",
"DEC-SIXBIT-PACKED-MSB"
)
{:ok, "HELLO"} =
Iconvex.Retro.Packed.decode_to_utf8(
packed,
"DEC-SIXBIT-PACKED-MSB"
)

The same packed API covers CDC Display Code, FIELDATA, PDP-1 concise codes, Apple-1 Signetics 2513, UNIVAC I, DEC national replacement sets, and DEC terminal graphics.

Punched cards as real 12-bit values

Logical card codecs preserve masks as twelve contiguous bits. Explicit 16BE and 16LE word transports remain normal registry codecs.

alias Iconvex.Retro.IBM7040HReport
{:ok, card_bits} = IBM7040HReport.encode_packed(~c"HELLO")
{:ok, ~c"HELLO"} = IBM7040HReport.decode_packed(card_bits)
{:ok, words} = Iconvex.convert("HELLO", "UTF-8", "IBM-7040-H-REPORT-16BE")
{:ok, "HELLO"} = Iconvex.convert(words, "IBM-7040-H-REPORT-16BE", "UTF-8")

The package includes IBM 7040/7044, IBM 1401, CDC 167 and 6000, University of Iowa reconstructions, and all ten IBM 24/26 Figure 23 arrangements.

Video memory and terminal ROMs

The WG2 N5028 family provides 70 separately named mappings for Apple II, Atari, Commodore, TRS-80, ZX Spectrum, teletext, RISC OS, and other historical systems. Video order and interchange order remain separate encodings.

{:ok, utf8} = Iconvex.convert(memory, "ATASCII-GRAPHICS-VIDEO", "UTF-8")
{:ok, screen_bytes} = Iconvex.convert("┌─┐", "UTF-8", "IBMGRAPH")

Other source-qualified highlights include Kermit JIS7 Kanji, DEC Hebrew and SI 960, DEC Special/Technical, TI-83 Plus, TI-89 AMS 2.0, Mattel Aquarius, Stanford RFC 698 graphics, ABC 800 character mode, and Kermit vendor sets.

Discover the exact surface

Iconvex.Retro.encodings() # 192 registry names
Iconvex.Retro.non_octet_encodings() # 23 logical names
Iconvex.Retro.packed_profiles() # 57 width/order maps
Iconvex.Retro.provider_ids() # IBMGRAPH providers

The machine-readable authority is SURFACE_MANIFEST.tsv; the three generated CSV inventories are convenient release views. Run:

elixir tools/generate_surface_module.exs --check

to prove that the public module and inventories still match the frozen manifest.

Verification and provenance

The test suite ports the original family tests and fixtures, exhausts byte and fixed-width domains where finite, checks the complete Unicode scalar corpus for accidental encoder keys, exercises streaming/error offsets, and runs focused performance gates against independent source-derived loops.

Large historical scans remain repository-only evidence. The Hex artifact ships compact transcriptions, mapping attachments, required notices, and runtime tables. Original Iconvex code is LGPL-2.1-or-later; separately licensed inputs retain their Apache-2.0, Unicode-3.0, or Kermit BSD-3-Clause terms.