Bitmap, stipple, and raster paint editors on CADR and Genera
The MIT CADR and Symbolics Genera materials preserve two quite different ideas of an interactive raster editor.
- CADR
PAINTis a full-screen, direct-framebuffer painting program. Its patterns, brushes, menu, work surface, and volatile saved copy all live in or mirror the screen raster. It offers freehand patterned painting, single-pixel drawing, lines, circles, and bitmap-font text, but no durable image-file workflow. - Genera's Bitmap Editor is a selectable Dynamic Windows application over a reusable, coordinate-aware raster-plane library. It edits named image objects, supports one-bit and deeper rasters, keeps black and gray planes, registers, an explicit crop box, undo history, geometric transforms, image-file import and export, and hardcopy.
- Genera's Stipple Editor inherits the Bitmap Editor machinery but specializes the bounding box as a repeating one-bit tile. Its ordinary
Saveproduces a live stipple object; it does not by itself create a persistent file.
These are a conceptual family, not a proven straight source lineage. In particular, the Genera implementation inspected here does not identify the CADR PAINT source as its ancestor. Its closest explicit implementation context is the later Font Editor framework described in FED and the Font Editor generations.
“Complete” below means complete for the local command definitions, menu cells, and gestures in the pinned implementations. It does not mean that a site patch, dynamically loaded image-format system, or another Genera release cannot add a command or format.
Programs and evidence boundary
| Program | Preserved evidence | Established status | Runtime status in this audit |
|---|---|---|---|
System 46 PAINT |
Public LMIO1; PAINT 7, DRAW 21, loader, and PAINT QFASL at commit 8e978d7 |
Complete source-visible UI and framebuffer implementation; the loader targets the compiled PAINT artifact. | No System 46 load band is currently connected to the harness. |
System 46 NPAINT |
Public LMIO1; NPAINT 10 |
An older, object/message-based implementation of the same PAINT entry point. |
No System 46 runtime observation. |
Maintained LM-3 NPAINT |
Public demo/npaint.lisp and io1/draw.lisp at check-in 4df393c |
A lightly modernized copy of the System 46 NPAINT source, retained outside the active HACKS system. |
System 303-0 did not have PAINT loaded. Loading the source was blocked before evaluation by the preserved machine's file-service/pathname setup. |
| Genera Bitmap Editor | Licensed Genera 8.5 source and installed Help | Complete implementation-level architecture, commands, gestures, image-object workflow, and source/help discrepancies. | Not run in this audit; the licensed Genera harness was reserved by a parallel application audit. |
| Genera Stipple Editor | Licensed Genera 8.5 source and the installed Graphic Editor book | Complete implementation-level specialization and installed command dictionary. | Not run in this audit. |
The public archive inventory dates NPAINT 10 to 14 January 1979, PAINT 7 and DRAW 21 to 16 February 1980, and the compiled PAINT and DRAW artifacts to 3 March 1980. This establishes that PAINT 7 is the later source in this snapshot. It does not prove that the surviving QFASL was compiled byte-for-byte from that exact source generation.
Both public source generations define a function named PAINT (later source, older source); neither defines an `NPAINT` entry point. NPAINT is therefore a historical file name here, not the program name typed by the operator. No primary source inspected in this audit expands the initial N, so its meaning remains unknown.
CADR PAINT
What the two source generations represent
The later PAINT 7 and older NPAINT 10 expose essentially the same visible program, but they represent their raster regions differently.
NPAINT 10 defines a PAINT-AREA-CLASS whose instances know a source array, origin, dimensions, and optional buffer array. Brush and paint selection copy the chosen patch into a buffer, and BITBLT composes those buffered bits into the screen. The maintained LM-3 file changes old quoted message selectors to the newer form and adds a mode line, but an exact diff shows no redesign of the UI.
PAINT 7 replaces that object protocol with compact structures and specialized halfword operations over the screen buffer. Its PAINT-AREA carries both one-bit and 32-bit views of the same storage, and its inner brush routine aligns pattern words and combines them directly. This is an optimization and data-model rewrite, not evidence for a different visible application.
The later file also declares PAINT-LINE-ITEM, PAINT-PATH, and PAINT-TEXT structures. The active UI does not build a retained object scene from them. Painting and shape commits alter the framebuffer immediately; these declarations should not be misread as an Illustrator-like document model.
DRAW 21 supplies the vector and circle rasterizers used by PAINT. It offers both ordinary and raster-coordinate entry points. The raster variants use the screen convention of an upper-left origin and increasing Y downward, and accept logical raster operations such as IOR, AND-complement, and XOR.
Startup and visible layout
The entry point is PAINT, with an optional input routine and a flag controlling initialization. The default input routine is the mouse. With initialization enabled, PAINT clears the screen and reconstructs the pattern and brush palette.
The program expects the old display representation for which its screen and halfword-array operations were written. The later source explicitly switches to the CPT screen when the current screen has an incompatible plane mask and notes that this version is intended for 32-bit television storage. This is one reason that source presence alone does not establish portability to the maintained System 303 window environment.
The screen is divided functionally rather than into independent windows:
- a strip near the top holds nine paint-pattern swatches followed by eight brush swatches;
- the main framebuffer is the drawing surface, including the regions occupied by the palette and menu;
- the lower-left portion is temporarily made the console stream for prompts;
- a 120-by-12-pixel label at the upper right shows the current mode; and
- the menu is drawn directly into the screen rather than hosted in a separate window pane.
Because the UI is part of the same raster, Restore Pallet (the spelling in the source) is a functional repair command. It redraws palette bits that painting or other screen activity has damaged. It also reruns palette initialization, so it resets the primary paint, alternate paint, and brush to their source defaults.
Mouse-switch protocol
The source names the physical controls top, middle, and bottom; this page retains those names rather than guessing how a particular host mouse maps them.
| Control | Context | Effect |
|---|---|---|
| Top switch | Over a paint swatch | Make that swatch the current primary paint immediately. |
| Top switch | Over a brush swatch | Select that brush immediately. |
| Top switch | Over the menu | Point at a menu item and make its mode pending. |
| Middle switch | A menu mode is pending | Enter or execute the pending mode and clear the menu cursor. |
| Middle switch | Ordinary painting modes | Apply the primary paint or advance the current modal operation. |
| Bottom switch | Ordinary painting modes | Apply the alternate paint; initially that paint is all zeroes and therefore acts as an eraser. |
| Bottom switch | Line/circle mode | Toggle between line and circle, including while a rubber-band preview is active. |
| Bottom switch | Text mode | If the typed argument names a bound array, adopt that array as the text font and clear the pending text. |
After entering Select Brush, Select Paint, or Select Alternate Paint, the operator points at the desired swatch and presses a drawing switch. The three handlers do not distinguish middle from bottom, so either dispatches the same selection and returns to Normal mode. Top over the palette remains the direct primary-paint/brush shortcut described above.
The brush cursor is clamped so that half its width and height remain within the screen. It blinks by XOR when idle. PAINT slows the blink while painting, and some modes suppress it because cursor XOR would interfere with rapid drawing.
Complete mode behavior
| Mode | Middle switch | Bottom switch | Preview and completion |
|---|---|---|---|
| Normal | Clear the brush mask region, combine the selected repeating paint through the mask, and write it back. | Perform the same operation with alternate paint. | Continuous while held. |
| XOR | XOR the brush mask into the picture; the selected primary paint pattern is not consulted. | Use ordinary alternate-paint composition, not XOR. | Continuous while held. This asymmetry is literal implementation behavior. |
| Draw Direct | Set the pointed screen pixel to one. | Set the pointed pixel to zero. | Continuous, with cursor blinking inhibited. |
| Draw Lines And Circles | First press sets the base point; second press commits the preview with IOR and returns to base-point state. | Toggle line/circle. | The moving candidate is repeatedly drawn and erased with XOR. |
| Text | Commit the blinking text at the current mouse point and clear the argument for the next placement. | Treat the argument as a possible bound font-array name. | Pending text is rendered in XOR using the current font, initially the screen default. |
| Exit | Selecting the menu cell enters its exit handler immediately. | No separate bottom-switch binding. | Restores the previous console output structure and returns true. |
The XOR-mode bottom-switch behavior is easy to miss in a feature summary. XOR does not globally transform both drawing buttons into toggles; it changes only the primary/middle path.
Keyboard input
PAINT does not have a command-key table comparable to Zwei. Its keyboard path is small and modal:
| Key | Effect |
|---|---|
Break |
Exit PAINT. |
Escape |
Invoke the ordinary keyboard escape handler. |
Rubout |
Remove the final character from the pending argument string, if any. |
| Any character code below octal 200 | Attempt to append it to the fixed 50-character pending argument array; the source has no explicit overflow handling. |
| Modifier bits | Discarded before dispatch. |
Ordinary typed characters matter visibly only in Text mode. The source interns the whole pending string when the bottom switch is used to choose a font; it accepts the choice only when the resulting symbol is bound to an array. This is a powerful but unsafe historical interface: it selects a live Lisp array by symbol name rather than choosing from a validated font menu.
Text is not retained as editable text. Its XOR preview is committed directly to the screen raster. PAINT does not remember a string, font, or position object that can later be selected and changed.
Pattern and brush palette
The source contains nine paint seeds, each four rows high, and eight brush seeds, each sixteen rows high. Initialization expands them into live UI rasters:
- each paint swatch occupies 40 by 40 pixels; the four-row seed repeats vertically and its short bit sequence repeats horizontally with phase alignment;
- each brush swatch occupies 20 by 20 pixels; its sixteen source rows are shifted into the displayed mask and the remaining area is padding; and
- paint swatches begin 42 pixels apart, while brushes begin 24 pixels apart.
This corrects two tempting but wrong readings of the source constants: the paint swatches are not 32 by 32, and the brush swatches are not merely the 16-by-16 seed arrays. The user selects the expanded screen regions.
The initial alternate paint is the first, all-zero pattern. The initial primary paint is the fifth pattern in source order, and the initial brush is the fourth mask. Visual names such as “spray”, “brick”, or “circle” are not assigned here: the source provides bit rows but no authoritative semantic names, and a runtime palette has not yet been reached.
The older NPAINT buffers a selected pattern or brush, insulating its active semantics from later damage to the visible swatch. The optimized PAINT source instead reads from the live screen location during its halfword composition. That architectural difference makes Restore Pallet especially consequential, but a complete behavioral comparison after overwriting a selected PAINT-7 swatch remains a runtime TODO.
Save and restore are volatile screen snapshots
Save Screen allocates an ART-16B array if necessary and copies the complete framebuffer halfword array into it. Restore Screen copies that array back; if no saved array is bound, it does nothing.
There is no pathname, image header, archive member, or file-format selector in this workflow. The saved object is a Lisp-memory copy of the whole screen, including the editor UI, not a durable painting document. It is closer to a single volatile framebuffer checkpoint than to either an image archive or a VM snapshot: it contains screen words only, not the Lisp process, menus, globals, or machine state needed to resume PAINT.
The loader reinforces this narrow boundary. LOAD.PAINT loads compiled Mouse, Menu, and Paint components; it does not install an image codec or persistent painting format.
Maintained LM-3 status and fresh runtime probe
The LM-3 Fossil tree retains NPAINT as l/sys/demo/npaint.lisp, with the draw primitives in l/sys/io1/draw.lisp. The active HACKS system lists ABACUS, ALARM, BEEPS, CROCK, DOCTOR, MUNCH, QIX, and other demos, but not NPAINT. The file is therefore retained source, not a declared default HACKS component.
A fresh isolated System 303-0 run on 18 July 2026 established:
(FBOUNDP 'PAINT)returnedNILin the booted load band.- Loading
SYS: DEMO; NPAINTrequested a login to the configuredAMS-BRIDGE-1file host and failed because that host was unavailable. - A bounded attempt to use the harness's local bridge reached its special
lispmlogin, but host-keyboard pathname punctuation was translated into an incorrect guest pathname before source evaluation. - The session was stopped cleanly without modifying its private disk or source copies.
This run proves only that PAINT is not preloaded and that the retained source is not presently loadable through the default preserved file-service path. It does not prove that NPAINT is incompatible with System 303. No PAINT UI appeared, so the run supplies no confirmation for menu rendering, palette appearance, or the four stale Area cells.
The ignored capture 0004-fboundp-paint.png has PNG SHA-256 a170e293a11855520e7c92c2163b09333a533310aecc6d614187744a003f2552 and pixel SHA-256 58033154753f9e1c4f572c6077f6708e1028ec2bcb11ced70e288bb0c9c6a190. It was not curated into the museum: a screenshot of a false FBOUNDP result does not materially illustrate PAINT's visible behavior. Publication should wait for a successfully reached application state and the per-image review in the screenshot rights policy.
Genera Bitmap Editor
Entry and pane layout
The selectable program's pretty name is Bitmap editor, and its Select key is }. Code can also call EDIT-IMAGE or EDIT-BITMAP, choosing writable, fixed-size, or read-only behavior and optionally waiting for the activity to finish.
The standard frame contains:
- a one-line title;
- an actual-size sample at the upper left;
- a dynamically tiled register pane at the upper right;
- a large magnified grid;
- Help and Undo/Redo/Skip menus;
- a central drawing-command menu;
- current drawing-mode and gray-plane menus; and
- a four-line scrolling command interactor.
The main application defaults to a 64-by-64 bounding box when no image is selected. Create Image accepts width and height of at least one, depths 1, 2, 4, 8, or 24 bits per pixel, and optionally supplies standard color maps for four- or eight-bit images.
Direct drawing gestures
| Gesture on a grid point | Immediate operation |
|---|---|
| Left press and drag | Draw through the current mode; a continuous stroke can change modifiers while it is in progress. |
| Control-Left | Temporarily erase in one-bit mode, or paint the background value in foreground/background mode. |
| Meta-Left | Temporarily draw in one-bit mode, or paint the foreground value in foreground/background mode. |
| Control-Meta-Left | Pass over points without altering them. |
| Middle | Cycle Draw to Erase, Erase to Flip, Flip to Draw; for deep rasters cycle Foreground and Background. |
The implementation recomputes Control and Meta state during a drag, not only on the initial press. A user can therefore switch a single gesture between setting, clearing, and passing over cells without releasing the mouse.
One-bit images expose Draw, Erase, and Flip. When the selected image has a non-bit element type, the editor automatically switches to Foreground and Background fill modes. Set Pixel changes either fill value, can sample a value from a grid point, and can use the color chooser when a color map exists.
No application-specific character key table occurs in the source. Command names are entered through the command interactor, while the menus and presentations provide mouse accelerators. The } Select key is the only literal application-selection character defined locally. Ordinary Dynamic Windows Help, completion, editing, and command-processor controls remain inherited and are not duplicated as if they were Bitmap Editor commands.
Shape semantics and a flood discrepancy
Lines and rectangles use direct raster-plane primitives; rectangles are filled. Polygon and spline drawing render through a temporary bitmap stream and then copy the result through the current ALU. Polygon and spline require at least three points. Shape commands save the affected subplane for undo.
For Draw/Erase/Flip mode, Flood Region deliberately uses XOR, so it complements the four-connected region whose pixels match the seed. In Foreground/Background mode it fills with the selected pixel value.
The active flood implementation always returns a raster plane, but the command still tests for a false result and reports that the region is not closed. That error path belonged to the commented-out previous algorithm, which returned false when it could not find enclosing boundaries. It is unreachable through the active definition inspected here.
There is a second source-visible edge case. The active algorithm defines its maximum coordinate as origin plus width or height and tests it inclusively. For a default-zero region connected to the raster edge, reads at that one-past edge also return zero, so the result can include a one-cell apron outside the logical plane. Runtime confirmation and a determination of whether later patches mask this effect remain TODO.
Scale and bounding-box edge cases
Set Scale accepts only a positive integer. Zoom/Expand enforces a minimum scale of one. Zoom by Factor, however, accepts any number and passes the rounded product to the same internal setter without validating the result. A factor of zero, a negative factor, or a small factor that rounds to zero can therefore install a scale that other redisplay code does not expect. This is a source-visible validation gap, not yet a reproduced runtime failure.
Refit Bounding Box examines nonzero black pixels only; gray reference pixels do not enlarge the result. Saving crops to the editing edges derived from the box. In read-only mode, saving back is rejected. In fixed-size mode, the box is kept at the image's size and copied only within the original dimensions.
Named images, files, and formats
The persistence path has three distinct layers:
- edits alter the Bitmap Editor's black raster plane;
Save Imagecopies the bounding-box region into a live Genera named-image object; andWrite Image Fileserializes a chosen named image through a currently registered image-file-format handler.
Stopping after step 2 does not necessarily write a host or Lisp-machine file. Conversely, Read Image File can read several explicit or wildcard pathnames, optionally rotate or trim each result, attach its source pathname and format, assign a unique name when necessary, and register the resulting images. The user then chooses one with Edit Image.
The file-format registry is dynamic. The base Image Substrate always defines Symbolics BIN; distributed source modules additionally define handlers for XBM, PBM, PPM, CBM, XIM, XWD, Utah RLE, TIFF, PCX, IMG, GIF, and Truevision, while separate Color and PostScript systems define their own image and PostScript handlers. Which names appear in a running Bitmap Editor depends on which systems and patches are loaded.
BIN is a Symbolics binary form-dump containing image objects and can be loaded to reconstitute those objects. It is serialized application data, not a disk archive and not a VM snapshot. The other listed formats are image interchanges with different read/write capabilities; source presence should not be promoted to a claim that every handler is active or fully interoperable in the cold museum world.
The generic reader still contains special options for PICT and MacPaint, including optional Macintosh file headers and rotation guidance. No PICT or MacPaint DEFINE-IMAGE-FILE-FORMAT registration was found in the inspected distributed source tree, while the older installed Help exposes a dedicated MacPaint command. This is release/help drift or a missing separately loaded component, not evidence that MacPaint is available in the audited runtime.
Deep-raster support is real but qualified
The implementation creates and displays 2-, 4-, 8-, and 24-bit rasters, carries color maps through black, gray, and register planes, draws menu swatches for foreground/background values, and replaces Boolean Draw/Erase/Flip with fill modes for non-bit images. Those are concrete deep-raster facilities.
The same source labels its color adapter as a collection of “kludges” and contains an old save-path comment saying an adjustment is temporary until the editor supports deep rasters, even though the code preserves the current plane's element type. The defensible conclusion is partial and historically layered color support, not “one-bit only” and not “fully verified 24-bit paint program.” Actual editing, color-map selection, and round-trip results for every supported depth remain runtime TODOs.
Genera Stipple Editor
Purpose and layout
The Stipple Editor designs the repeating one-bit fill patterns used by the Graphic Editor and graphics substrate. It is a selectable program named Stipple editor with Select key |, and the Graphic Editor can also open it as a modal designer that returns a new stipple object.
Its fixed 500-by-500 frame contains, in order:
- a one-line title;
- a sample occupying roughly the top quarter of the remaining space;
- the magnified editing grid;
- a two-line accepting-values pane for
Nameand optionalGray levelfrom zero through one; - the drawing-mode menu;
- the draw-command menu; and
- a three-line command interactor.
There is no register pane, no separate gray-command menu, and no standalone image sample/register split. The black and gray planes and base command table still exist through inheritance.
Tile and sample representation
A new editor starts with an 8-by-8 bounding box. Editing an existing stipple uses its declared repeat width and height and fits the grid with an extra factor of four. The sample first copies the bounding-box cell horizontally into a raster whose width is the least common multiple of the cell width and 32, then tiles that raster across the pane. Any cell or box change therefore invalidates the complete sample.
The least-common-multiple padding is a storage and BITBLT alignment detail, not an enlargement of the logical repeat. On save, the resulting stipple array records the original cell width as its X phase and retains the chosen name and gray-level metadata.
Controls and complete local command surface
Stipple drawing uses the same grid gestures, one-bit Draw/Erase/Flip modes, Control/Meta temporary modes, shapes, transforms, black/gray planes, view, bounding box, Help, and undo commands listed for the base Bitmap Editor.
Its complete installed/source command set is therefore:
Center View,Clear All,Clear Gray,Clear Undo History,Command Help,Draw Line,Draw Point,Draw Polygon,Draw Rectangle,Draw Spline,Flood Region,Help,Merge Gray,Move Black,Move Bounding Box,Move Gray,Move View,Refresh, all three named Reflection commands,Rotate,Set Drawing Mode,Set Pixel,Set Scale,Snap Bounding Box, both Stretch commands,Swap Gray,Swap Region,Undo,Redo,Undo Skip,Zoom by Factor, andZoom/Expand;Save, which constructs the current live stipple object; andDone/Exit Stipple Editor, which returns the object to a modal caller or buries the standalone activity.
The inherited register command names also occur in the installed Stipple Editor dictionary: clear, retrieve into black/gray, and store black/gray. This conflicts with the implementation layout. There is no register pane to present a register argument, and store/undo code requests that pane when redrawing. The commands are inherited at the command-table level, but usable register interaction in Stipple Editor is not established. Treat it as a source/help inconsistency until a live run determines whether the command processor hides, rejects, or errors on those operations.
Gray-plane commands are similarly absent from a visible gray menu but have ordinary command arguments and remain inherited by name. Their usability should also be confirmed in the running activity rather than inferred from menu absence.
Like the Bitmap Editor, the Stipple Editor defines no local character-command table beyond its | Select key. Name and Gray level are edited in the accepting-values pane; commands are invoked through menus, presentations, or the command interactor.
Save, Done, and persistence
Save constructs a GRAPHICS:STIPPLE-ARRAY, copies the bounding-box cell across the aligned width, and stores it as the object currently being edited. Done returns that object when the editor was opened modally or clears it and buries the ordinary selectable activity.
For a newly designed pattern, the reliable implementation-level workflow is therefore edit, Save, then Done. Done alone does not reconstruct the array from unsaved grid changes.
The installed Graphic Editor book says that a new stipple remains embedded in drawings that use it but is not retained in the sample-pattern menu across a reboot. Its statement that stipples cannot be saved refers to this absence of a persistent interactive Save-to-file workflow, not to an inability to create a live stipple object.
The source contains a separate WRITE-DEFSTIPPLE-FORM utility. It writes a Lisp definition form containing the repeat dimensions, name, and bit rows. No Stipple Editor command calls it. It is a valuable preservation/export path, but using it requires explicit Lisp evaluation or a museum script and should not be described as a visible menu feature.
Cross-system comparison
| Question | CADR PAINT | Genera Bitmap Editor | Genera Stipple Editor |
|---|---|---|---|
| Authoritative editable object | The live screen framebuffer | Extensible black raster plane plus bounding box, later copied into a named image | One-bit tile in the black plane, later copied into a stipple array |
| Secondary plane | No | Gray reference/merge plane | Inherited gray plane |
| Brushes/patterns | Eight fixed brush masks and nine fixed repeating paints drawn into the screen | Pixel brush plus drawing modes; no equivalent fixed brush-shape palette in this implementation | Pixel editing of one repeating pattern |
| Shapes | Direct points, lines, circles, bitmap-font text | Points, filled rectangles, lines, polygons, cubic splines, flood | Same inherited shapes |
| Coordinates | Physical screen raster | Unbounded editing coordinates with negative values and a separate view | Same raster-plane coordinates, bounded logically by repeat box |
| Undo | No operation history; one full-screen volatile save slot | Per-action undo/redo/skip history | Inherited per-action history |
| Durable save | None in PAINT | Named image in memory, then generic file writer | No direct file command; live stipple object, with a source-only definition writer |
| Color/depth | One-bit drawing semantics over old screen storage | One-bit and source-supported 2/4/8/24-bit images, with qualified color support | One-bit stipple cells plus gray-level metadata |
| UI model | One full-screen loop, direct menu and palette pixels | Dynamic Windows panes, command processor, presentations, menus | Specialized Dynamic Windows frame over the same base framework |
The biggest discontinuity is persistence. CADR's Save Screen is a volatile copy of visible words. Genera's Save Image produces a named application object, and Write Image File separately serializes it. Stipple Save constructs a graphics design object but still leaves persistent definition writing outside the visible activity.
Implementation findings not evident from the manuals
The source audit adds or corrects the following points:
- System 46
NPAINTandPAINTare source generations of the samePAINTentry point, not two independently invokable applications. - Four Area-menu labels have no handler in either public CADR generation or the LM-3 copy.
- PAINT's XOR mode changes only the primary/middle drawing path; alternate paint remains ordinary composition.
- CADR's paint and brush UI regions are 40-by-40 and 20-by-20 expanded rasters, not the seed dimensions.
- PAINT saves the complete framebuffer in memory and has no image file format.
- Bitmap Editor register retrieval OR-composes into the destination instead of replacing it.
- Modifier state is re-read during a Bitmap Editor stroke, allowing mode changes without releasing the mouse.
Set Pixeland generic image writing are present in current source even though the older Bitmap Help dictionary does not list them.- The current flood function makes the old “region not closed” command error unreachable and has an inclusive one-past-edge case for boundary-connected default pixels.
Zoom by Factorcan install a zero or negative scale because it bypasses the positive-integer validation used bySet Scale.- Stipple Help inherits register commands although the Stipple frame has no register pane.
- Stipple
Savemakes a live tiled object; durable Lisp-source export exists only as an unexposed utility.
Preservation and reconstruction guidance
CADR
The public source is sufficient to reconstruct PAINT's algorithms, menus, palette seeds, and controls without extracting a proprietary load band. A faithful runnable reconstruction still needs an old-screen compatibility layer or a port of the framebuffer assumptions. The maintained LM-3 NPAINT is useful as a cross-check, but its presence in the Fossil repository does not make it an active System 303 application.
A future runtime recovery should:
- make the pinned
demo/npaint.lispavailable through the harness's local file service without changing its bytes; - record whether legacy
DEFCLASSand direct screen operations load in System 303; - capture the initial palette and all four menus;
- test every mouse-switch path, especially the four handlerless Area labels;
- demonstrate Normal, XOR, direct, line, circle, and text modes on disposable pixels; and
- retain the session and only curate the smallest screenshot needed for the resulting historical claim.
Genera
The licensed source and installed Help remain local, ignored research inputs. This article paraphrases behavior and records checksums; it does not reproduce source or Help payloads. A future live audit should use the isolated Genera harness and separately exercise:
- a one-bit named image and a deep image;
- all five drawing modes and mid-stroke modifiers;
- black/gray merging and register OR retrieval;
- crop-box movement versus view movement;
- the flood and zoom edge cases;
- generic format availability in the actual loaded world;
- Stipple Save-then-Done and Done-without-Save; and
- inherited register and gray commands in the pane-reduced Stipple frame.
No Genera screenshot is included because no Bitmap or Stipple frame was reached in this audit. Source-derived pane descriptions are labeled as such and must not be silently promoted to runtime observations. When a frame is reached, review a specific, minimal screenshot under the publication policy and place only the reviewed image in docs/assets/genera-screenshots/.
Related museum material includes the public CADR visual-assets inventory, CADR color inks and raster patterns, and the Genera image/world recovery boundary.
Evidence and provenance
Public CADR and LM-3 files
| Artifact | Size | SHA-256 | Role |
|---|---|---|---|
System 46 src/lmio1/paint.7 |
33,675 | c5dd82f468f0ab685c2588615f69789220b114f212c966a0595107cb6ebcf60b |
Later direct-screen implementation |
System 46 src/lmio1/npaint.10 |
38,832 | 7969c4e49f907f638529feb347dcc0d6a860c1b662a295f3d3ecabd6b8979cc9 |
Older buffered-object implementation |
System 46 src/lmio1/draw.21 |
13,160 | a3490fb55ee56246c741171a751d56a4b225b14571c4c417db09cd7f324ae510 |
Line and circle rasterizers |
System 46 src/lmio1/load.paint |
89 | f79e151c58d573946fbaf0448c2a88ea71a7b3561ab725a462a04156505cfab7 |
Compiled-component loader |
System 46 src/lmio1/paint.qfasl |
20,787 | 6ca641c88bcd9c38e177ec36388431bffceaa4ce55f18b164607eaa056406468 |
Preserved compiled PAINT artifact |
LM-3 l/sys/demo/npaint.lisp |
38,829 | 4bb4419317211db252a06632519424d0ac4b532419059662a49d5e887e64a0c5 |
Maintained NPAINT copy |
LM-3 l/sys/io1/draw.lisp |
13,212 | 5db9b81fe33f14ca447ec4715c0b75227a2fe2a6253f7fb26ed26c46d3506098 |
Maintained draw primitives |
The System 46 snapshot is pinned at Git commit 8e978d7d1704096a63edd4386a3b8326a2e584af. The maintained LM-3 source is pinned at Fossil check-in 4df393c68d7f083ce42d5c377039d26043cc18a9031ace28258dc97f4137eb91. They were verified locally on 18 July 2026.
Licensed Genera research inputs
| Logical artifact | Size | SHA-256 | Evidence use |
|---|---|---|---|
bitmap-editor/bitmap-editor.lisp.~284~ |
99,439 | adf7a77c865743ec3c0d225789cd6f9e2535f08cf4565a56a7633230fc3f09fd |
Program framework, commands, panes, gestures, images, registers, bounding box |
bitmap-editor/raster-plane.lisp.~67~ |
28,982 | f2a56137eec430fd19b8ca7d332ff40b292f90d688314c18600f09529aeed2c6 |
Raster representation, transforms, flood, growth |
bitmap-editor/stipple-editor.lisp.~15~ |
10,677 | 7cf4f5e637c912c90fbd42923ce46662648c82f354987795af277ea213230bac |
Stipple frame, tiling, Save/Done, source-form writer |
bitmap-editor/sysdcl.lisp.~49~ |
3,288 | 8b513b8f584dc852d6254985d58aaf2e45ef8a75fb76b87bcc473306d7fb643a |
Subsystem order and category |
bitmap-editor/color-kludges.lisp.~4~ |
7,830 | 697dc88dc864e808e1fe32d84cf9183ca9db7a760d13b8128d15b4923b26846f |
Deep-raster/color rendering adapters |
image-substrate/file-formats.lisp.~27~ |
38,632 | 0cf15874adb102eb2f7951d12069ea820bdd19e5995482819cac5adf729d8021 |
Dynamic registry, BIN, generic read/write commands |
| Extracted Bitmap Editor Help text | 32,916 | 151a2f4500a1865afcc5df2e28110e6158c5ed21f52332d0e252cebede60c562 |
143-record installed command and program dictionary |
| Extracted Using the Graphic Editor text | 78,709 | 46676e83a32cee62c2743ff03a6d2d7d01be76958feda4940c826d8ad48a954d |
Stipple workflow and command dictionary |
The source and decoded Help remain ignored local inputs. The table is evidence-only metadata and does not convey a redistribution claim.
System 303 runtime record
| Field | Value |
|---|---|
| Session | d31-paint-cadr-20260718, generation 1 |
| Load band | System 303-0 |
| Base and private disk at start | bb16e46ad81decfe1efe691d36b6aa4ce3fd4ffb82474365de3520989d397cb5 |
| Private disk after stop | bb16e46ad81decfe1efe691d36b6aa4ce3fd4ffb82474365de3520989d397cb5 (unchanged) |
| Public umbrella revision | d1250f90044f09b6c92014a9aef65f9574e1bcbf8a7163004e53cc6dbed0f2d6 |
| Public System / USite / Chaos revisions | 4df393c68d7f083ce42d5c377039d26043cc18a9031ace28258dc97f4137eb91; 8f717978b458b40adf1e238aaf177f5bc54ef46881268e03b787ba57b0d30a0e; db2953fde68d726a605d1d1699bab6c926ef252bd4991f692bae6ee5a634764e |
| Public usim check-in | 330d8248ec2e12af071e287920e681600f75df9ffd854aada5f8a64c9adad64d |
| Private source revisions at copy time | Same System, USite, and Chaos revisions as above |
| Private System / USite / Chaos tree hashes | 21f5215de973aa6ccbddb817f2d64edd95ee1014c3028a9b0711ea7c741b807e; adbb720339db225e6635977a869cf3f3d50b507e614b37a976f4a6548d212a81; 34ab197641aae909e9a224edc307020fddec263e732207a74573d51dac0daa87 (all unchanged during the run) |
usim_sha256_at_start / usim_sha256_at_exec |
707a77d23e28ea1c45ae0eb0145dc181fa7ba649b9defc30044d4f847ac2c5be / same |
| Private machine artifacts | promh.mcr 2c667f99f014a7130a55b255d31df02588d9396beace78abfe9325269e4ff3e6; promh.sym e9e3dd6a541511dd9541ae96b99dae19cb185d8b79fa09959f21fa52224f233d; ucadr.sym 9071decf16fa8f11d7970c4662db0d6e95600fe43ec86ac41c77b37dbd7caa2a |
| Toolchain | Python 3.11.14; Guix channel commit 230aa373f315f247852ee07dff34146e9b480aec; manifest SHA-256 3adae999bbe420182f22adc2499fcc82449a46eaf580a362de9c0e718fa6b37d |
| Selected window | LOCAL-CADR [running], 768 by 963 at (0,0) |
| Final status | usim exit 0; Xvfb exit 0; forced_stop: false; state_may_be_incomplete: false |
The execution-time usim hash comes from run.json, not from a screenshot sidecar. Raw session files and all unreviewed captures remain under ignored build/cadr-computer-use/ storage.
Public sources
- MIT CADR System 46,
LMIO1; PAINT 7,NPAINT 10,DRAW 21,LOAD.PAINT, and the archive inventory. - System 46 source license.
- LM-3 System 303,
demo/npaint.lisp,io1/draw.lisp, and theHACKSsystem declaration.