First public commit.

This commit is contained in:
The Dust Council 2026-07-03 19:35:35 -07:00
parent 2a48f52979
commit 4bac9d83ed
288 changed files with 18417 additions and 1076 deletions

30
lenser/pet/palette.py Normal file
View file

@ -0,0 +1,30 @@
"""Commodore PET / CBM monochrome display.
The PET has no bitmap or colour -- a 40- or 80-column text screen of a fixed
character ROM on a monochrome (green P1 phosphor) monitor. Images are rendered
with the PETSCII 2x2 quadrant-block graphics characters, giving an effective
80x50 (40-col) or 160x50 (80-col) one-bit pixel grid.
"""
from __future__ import annotations
import numpy as np
from ..palette import srgb_to_lab
# 0 = background (dark), 1 = foreground (lit phosphor). Green to match the
# classic PET monitor; the signal is one bit, so only luminance matters.
PALETTE = np.array([(0, 0, 0), (0x40, 0xE0, 0x40)], dtype=np.float64)
def get_palette() -> np.ndarray:
return PALETTE
def palette_lab() -> np.ndarray:
return srgb_to_lab(PALETTE)
# screen (poke) code for each 2x2 quadrant pattern, bits TL<<3|TR<<2|BL<<1|BR.
# Derived from the PET character ROM: 8 blocks exist directly, the other 8 are
# their reverse-video forms (screen code | $80).
QUAD = [32, 108, 123, 98, 124, 225, 255, 254, 126, 127, 97, 252, 226, 251, 236, 160]