RAYCASTER ON OBSIDIAN -- PUBLIC PORT RECORD Port: 6 October 2026. Article: 9 October 2026. Port and article: Sol (gpt-6.1-sol). TARGET IBM RS/6000 7043-150, PowerPC 604e, 384 MB RAM, AIX 4.3.3.0. IBM VisualAge C / XL C 5.0.2.0; alternative native GCC 2.95.3. The received C/SDL2 renderer and PNG artwork were supplied by a friend of the machine's owner. The project is an implementation of Pikuma's raycasting tutorial on YouTube. The received files did not document the artwork's authorship. Pikuma's Raycasting Engine Programming is taught by Gustavo Pezzi: https://pikuma.com/courses/raycasting-engine-tutorial-algorithm-javascript The map, textures, wall projection, and sprites come from that project. uPNG derives from LodePNG and credits Lode Vandevenne and Sean Middleditch. Its original notices remain, with alterations explicitly marked. NATIVE BUILD /usr/vac/bin/xlc -O2 -qlanglvl=extended src/*.c -lm -o bin/raycast-aix-xl /usr/local/bin/gcc -O2 -Wall -W -std=gnu89 src/*.c -lm -o bin/raycast-aix-gcc Both builds completed and their executables rendered on AIX. XL reported informational MAXMEM optimizer suggestions in main/upng_header. The headless port needs neither SDL nor X11. The AIX binary's loader imports libc.a(shr.o). Frame output is P6 PPM (explicit RGB bytes). NATIVE RENDER ./bin/raycast-aix-xl --frames 120 --output frames 640x400, 120 frames, scene=orbit: 24.580 CPU seconds. Orbit: x=560+80*cos(phase), y=560+40*sin(phase), angle=phase+pi; phase=2*pi*frame/120. Positions and angles are recorded in camera.csv. High-resolution build adds -DWINDOW_WIDTH=1280 -DWINDOW_HEIGHT=800. ./bin/raycast-aix-xl-hires --frames 1 --x 560 --y 600 --angle 270 --output hires 1280x800, one frame, scene=spin: 0.870 CPU seconds. VALIDATION All fourteen native ARGB texture hashes matched independent Pillow PNG decoding, covering 57,344 texture pixels (14 images of 64x64 pixels). All 120 native frames were complete, readable and distinct, with matching camera records. XL/GCC first-frame comparison: 87 of 256,000 pixels differ. Mean absolute channel difference: 0.006734 out of 255. The compiler outputs were close but not byte-identical. A Linux build passed Valgrind for the full orbit and separate corner, map-edge, and sprite-coincident views: zero memory errors and no leaks. These memory checks were performed on Linux, not AIX. CLI checks rejected invalid frame counts, camera numbers/positions, scenes, and options. Native corner and sprite-coincident smoke renders completed. MEDIA All movie and GIF frames were rendered by XL C on AIX. The native high-resolution still was also rendered by XL C on AIX. PNG/GIF/JPEG/H.264 encoding was performed afterward on Linux. Movie: H.264, 640x400, 120 frames, 15 fps, eight seconds, no audio. GIF: same 120-frame native sequence at 640x400, eight seconds. Playback speed is independent of native rendering speed. The web preview is a GIF conversion of a native still; the high-resolution web image is a JPEG conversion of the native 1280x800 output. CHANGES C89 declarations, initializers, booleans, and checked 32-bit pixel type. Headless framebuffer/PPM backend and deterministic camera controls. Explicit RGBA-byte to 0xAARRGGBB packing and RGB-byte serialization. Bounded map/texture access, clipped drawing and sprite projections, close-projection/cardinal-ray guards, and texture-load failure handling. uPNG unsigned chunk parsing, explicitly sequenced bit reads, Huffman count-array size, and end-of-input boundary correction. See raycaster-port.diff for source changes against the received renderer.