// Cycle-by-cycle port of chunk5 TransformVertex7EBC (L7EBC..L80B0) // and TransformVertex80C5 (L80C5). These are the polygon vertex // transform routines that read 4 stream bytes (xLo, xHi, zLo, zHi), // subtract camera-section deltas at $66/$67/$6A/$6B, run the // auto-scale loop (L7F1A), apply the 2x3 rotation matrix at $79/$7B/ // $7D + $85/$87/$89, and write the 6-byte result (16-bit X/Y/Z) into // the caller's vertex slot. // // Faithful to the original 6502 -- 8-bit byte arithmetic, carry/V/N // flag handling, exact algorithm order. Reads from and writes to a // 64K RAM buffer that mirrors the Apple II zero page and chunk5's // scratch slots. #ifndef CHUNK5_TRANSFORM_H #define CHUNK5_TRANSFORM_H #include // Run TransformVertex7EBC on the 4 vertex bytes at `stream+1..stream+4`. // `ram` is the 64K RAM image (zero page reads at $4A..$52, $66..$6B, // $79/$7B/$7D, $85/$87/$89). `destSlot` is the caller-supplied X // register equivalent ($CB for v1 = vertex 1, $D4 for v2 = vertex 2) // -- the 6-byte result is written to ram[destSlot..destSlot+5]. // // Returns the byte advance for $8B (always 5: opcode + 4 vertex bytes). int chunk5TransformVertex7EBC(uint8_t *ram, const uint8_t *stream, uint8_t destSlot); // Same as above but uses the transform-A work-counter bias (#$C7) // instead of transform-B's (#$51). The actual matrix multiply and // vertex math is identical. int chunk5TransformVertex80C5(uint8_t *ram, const uint8_t *stream, uint8_t destSlot); #endif