/* Web64 SDK header printout: web64/fixed.h * Generated by scripts/copy-web64-ide-source.mjs. * The IDE resolves this header as a read-only virtual SDK document. */ #ifndef WEB64_FIXED_H #define WEB64_FIXED_H #include /* Web64 fixed-point ABI contract v1. 8.8 layout: high byte is integer part, low byte is fraction; signed range -128.0..+127.99609375. 16.16 layout: high word is integer part, low word is fraction; this secondary tier exposes no-runtime constants, conversions, floor/to-int, and wrapping add/sub macros. 16.16 multiply/divide helpers are intentionally absent until executable 6502 implementations and tests exist. Default add/sub helpers wrap; saturation, rounding, and checked/debug behavior use explicit public names. web64_fix8_mul truncates toward zero; web64_fix8_mul_round rounds nearest with half ties away from zero. web64_fix8_div reports compile-time zero divisors and returns 0 for dynamic zero in v1. web64_fix8_lerp uses amount/256; amount 255 approaches b but is not endpoint-exact. web64_angle8 maps 0..255 to one full turn; sin/cos return signed 8.8 from a 256-entry full-wave table. Trig endpoints are exact: sin(64)=0x0100 and sin(192)=0xff00; cosine is sine(angle+64). Negative conversions, floor, ceil, and shift-derived lowering must be emitted from this contract, not host-language shifts. WEB64_FIX8_FROM_INT keeps standard shift semantics; typed 8-bit inputs lower directly to fraction=0/integer=value byte placement. Runtime helper modules are dependency-selected by referenced helper family. Vector helpers accept overlapping out/a/b pointers; invalid pointers are caller error. */ typedef int16_t web64_fix8_8; typedef uint16_t web64_ufix8_8; typedef int32_t web64_fix16_16; typedef uint32_t web64_ufix16_16; typedef uint8_t web64_angle8; typedef struct { web64_fix8_8 x; web64_fix8_8 y; } Web64FixVec2; typedef struct { Web64FixVec2 position; Web64FixVec2 velocity; Web64FixVec2 acceleration; } Web64Motion2D; #define WEB64_FIX8_ONE 0x0100 #define WEB64_FIX8_HALF 0x0080 #define WEB64_FIX8_MIN 0x8000 #define WEB64_FIX8_MAX 0x7fff #define WEB64_FIX8_FROM_RAW(value) ((web64_fix8_8)(value)) #define WEB64_FIX8_RAW(value) ((uint16_t)(value)) #define WEB64_FIX8_FROM_INT(value) ((value) << 8) #define WEB64_FIX8_TO_INT(value) ((value) >> 8) #define WEB64_FIX8_FRACTION(value) ((value) & 0x00ff) #define WEB64_FIX8_FROM_RATIO(numerator, denominator) (((numerator) << 8) / (denominator)) #define web64_fix8_from_int(value) WEB64_FIX8_FROM_INT(value) #define web64_fix8_to_int(value) WEB64_FIX8_TO_INT(value) #define web64_fix8_floor(value) ((value) & 0xff00) #define web64_fix8_round(value) (((value) + 0x0080) & 0xff00) #define web64_fix8_ceil(value) (((value) + 0x00ff) & 0xff00) #define web64_fix8_add_wrap(a, b) ((web64_fix8_8)((a) + (b))) #define web64_fix8_sub_wrap(a, b) ((web64_fix8_8)((a) - (b))) #define WEB64_UFIX8_FROM_RAW(value) ((web64_ufix8_8)(value)) #define WEB64_UFIX8_RAW(value) ((uint16_t)(value)) #define WEB64_UFIX8_FROM_INT(value) ((web64_ufix8_8)((value) << 8)) #define WEB64_UFIX8_TO_INT(value) ((uint8_t)((value) >> 8)) #define WEB64_UFIX8_FRACTION(value) ((value) & 0x00ff) #define WEB64_UFIX8_FROM_RATIO(numerator, denominator) (((uint16_t)(numerator) << 8) / (denominator)) #define web64_ufix8_from_int(value) WEB64_UFIX8_FROM_INT(value) #define web64_ufix8_to_int(value) WEB64_UFIX8_TO_INT(value) #define web64_ufix8_add_wrap(a, b) ((web64_ufix8_8)((a) + (b))) #define web64_ufix8_sub_wrap(a, b) ((web64_ufix8_8)((a) - (b))) #define WEB64_FIX16_ONE 0x00010000 #define WEB64_FIX16_HALF 0x00008000 #define WEB64_FIX16_MIN 0x80000000 #define WEB64_FIX16_MAX 0x7fffffff #define WEB64_FIX16_FROM_INT(value) ((web64_fix16_16)(value) << 16) #define WEB64_FIX16_TO_INT(value) ((value) >> 16) #define WEB64_FIX16_FRACTION(value) ((value) & 0x0000ffff) #define WEB64_FIX16_FROM_RATIO(numerator, denominator) (((web64_fix16_16)(numerator) << 16) / (denominator)) #define web64_fix16_from_int(value) WEB64_FIX16_FROM_INT(value) #define web64_fix16_to_int(value) WEB64_FIX16_TO_INT(value) #define web64_fix16_floor(value) ((value) & 0xffff0000) #define web64_fix16_add_wrap(a, b) ((web64_fix16_16)((a) + (b))) #define web64_fix16_sub_wrap(a, b) ((web64_fix16_16)((a) - (b))) _web64_rt web64_fix8_8 web64_fix8_mul(web64_fix8_8 a, web64_fix8_8 b); _web64_rt web64_fix8_8 web64_fix8_mul_round(web64_fix8_8 a, web64_fix8_8 b); _web64_rt web64_fix8_8 web64_fix8_div(web64_fix8_8 a, web64_fix8_8 b); _web64_rt web64_fix8_8 web64_sin8(web64_angle8 angle); _web64_rt web64_fix8_8 web64_cos8(web64_angle8 angle); _web64_rt web64_ufix8_8 web64_ufix8_mul(web64_ufix8_8 a, web64_ufix8_8 b); _web64_rt web64_ufix8_8 web64_ufix8_div(web64_ufix8_8 a, web64_ufix8_8 b); _web64_rt web64_fix8_8 web64_fix8_lerp(web64_fix8_8 a, web64_fix8_8 b, uint8_t amount); _web64_rt web64_fix8_8 web64_fix8_abs(web64_fix8_8 value); _web64_rt web64_fix8_8 web64_fix8_min(web64_fix8_8 a, web64_fix8_8 b); _web64_rt web64_fix8_8 web64_fix8_max(web64_fix8_8 a, web64_fix8_8 b); _web64_rt web64_fix8_8 web64_fix8_clamp(web64_fix8_8 value, web64_fix8_8 min_value, web64_fix8_8 max_value); _web64_rt web64_fix8_8 web64_fix8_add_sat(web64_fix8_8 a, web64_fix8_8 b); _web64_rt web64_fix8_8 web64_fix8_sub_sat(web64_fix8_8 a, web64_fix8_8 b); _web64_rt void web64_fixvec2_add(Web64FixVec2 *out, const Web64FixVec2 *a, const Web64FixVec2 *b); _web64_rt void web64_fixvec2_sub(Web64FixVec2 *out, const Web64FixVec2 *a, const Web64FixVec2 *b); _web64_rt void web64_fixvec2_scale(Web64FixVec2 *out, const Web64FixVec2 *value, web64_fix8_8 scale); _web64_rt void web64_motion2d_integrate(Web64Motion2D *motion); /* Short 8.8 helper aliases. */ #define f8_mul_round web64_fix8_mul_round #define f8_div web64_fix8_div #define uf8_mul web64_ufix8_mul #define uf8_div web64_ufix8_div #define f8_lerp web64_fix8_lerp #define f8_abs web64_fix8_abs #define f8_min web64_fix8_min #define f8_max web64_fix8_max #define f8_clamp web64_fix8_clamp #define f8_add_sat web64_fix8_add_sat #define f8_sub_sat web64_fix8_sub_sat #define f8_sin web64_sin8 #define f8_cos web64_cos8 #define v2f8_add web64_fixvec2_add #define v2f8_sub web64_fixvec2_sub #define v2f8_scale web64_fixvec2_scale #define m2d_int web64_motion2d_integrate #endif