25#define PICO9918_SECTION_SCRATCH_X(name)
26#define PICO9918_SECTION_SCRATCH_Y(name)
29#define PICO9918_UNINITIALIZED(decl) decl
32#define PICO9918_IN_FLASH_FUNC(fn) fn
51#ifndef PICO9918_HOST_SET_INT
52#define PICO9918_HOST_SET_INT(active) pico9918_interrupt_dispatch(PICO9918_INST (active))
73#define PICO9918_FILL_BORDER pico9918_fill_border
75#define PICO9918_FILL32_INIT(inst, srcPtr) \
78 (inst).src = (srcPtr); \
81#define PICO9918_FILL32_SET_COUNT(inst, n) \
84 (inst).count = (unsigned)(n); \
87#define PICO9918_FILL32_TRIGGER(inst, dstPtr) \
90 uint32_t _v = *(const uint32_t*)(inst).src; \
91 uint32_t* _d = (uint32_t*)(dstPtr); \
92 for (unsigned _i = 0; _i < (inst).count; ++_i) _d[_i] = _v; \
95#define PICO9918_FILL32_WAIT(inst) ((void)0)
98#define PICO9918_DMA_CLAIM() ((void)0)
108#define PICO9918_FILL_MASKS pico9918_fill_masks
109#define PICO9918_FILL_LINE pico9918_fill_line
122#define PICO9918_COPY pico9918_copy
125#define PICO9918_COPY_STATE()
126#define PICO9918_COPY_INIT(inst) \
131#define PICO9918_COPY_SET_WIDTH(inst, wordAligned) \
134 (inst).shift = (wordAligned) ? 2u : 0u; \
136#define PICO9918_COPY_SET_SRC(inst, srcPtr) \
139 (inst).src = (srcPtr); \
141#define PICO9918_COPY_SET_DST(inst, dstPtr) \
144 (inst).dst = (dstPtr); \
146#define PICO9918_COPY_TRIGGER(inst, n) memcpy((inst).dst, (inst).src, (size_t)(n) << (inst).shift)
147#define PICO9918_COPY_WAIT(inst) ((void)0)
150#define PICO9918_DIVMOD_U32(n, d, q, r) \
153 uint32_t _n = (uint32_t)(n), _d = (uint32_t)(d); \
171#ifndef PICO9918_PIXEL_T
172typedef uint16_t PICO9918_PIXEL_T;
173#define PICO9918_PIXEL_T PICO9918_PIXEL_T
182#ifndef PICO9918_PIXEL_FROM_RGB12
183#define PICO9918_PIXEL_FROM_RGB12(rgb) \
184 ((PICO9918_PIXEL_T)(((rgb) & 0xFF0F) | ((((rgb) & 0xFF0F) >> 12) << 4)))
189#ifndef PICO9918_PIXEL_FROM_RGB12_PAIR
190#define PICO9918_PIXEL_FROM_RGB12_PAIR(packed) \
191 ((((uint32_t)PICO9918_PIXEL_FROM_RGB12((packed) >> 16)) << 16) | \
192 (uint16_t)PICO9918_PIXEL_FROM_RGB12((uint16_t)(packed)))
195#ifndef PICO9918_PIXEL_PAIR
196#define PICO9918_PIXEL_PAIR(p) ((uint32_t)(p) * 0x10001u)
199#ifndef PICO9918_LOW16
200#define PICO9918_LOW16(x) ((uint32_t)(uint16_t)(x))
204#ifndef PICO9918_PIXEL_DARKEN
205#define PICO9918_PIXEL_DARKEN(p) ((PICO9918_PIXEL_T)(((p) >> 2) & 0x333))
212#ifndef PICO9918_PIXEL_PAIR_DIM
213#define PICO9918_PIXEL_PAIR_DIM(w) (((w) >> 1) & 0x07770777u)
219#ifndef PICO9918_INK_T
220typedef uint32_t PICO9918_INK_T;
221#define PICO9918_INK_T PICO9918_INK_T
222#define PICO9918_INK_PIXELS 2
223#define PICO9918_INK_FILL(fg) PICO9918_PIXEL_PAIR(fg)
224#define PICO9918_INK_DARKEN(w) (((w) >> 2) & 0x03330333u)
225#define PICO9918_INK_ONE(k) (0xffffu << ((k) * 16))
232#ifndef PICO9918_PALETTE_LUT_T
233typedef uint32_t PICO9918_PALETTE_LUT_T;
234#define PICO9918_PALETTE_LUT_T PICO9918_PALETTE_LUT_T
238#ifndef PICO9918_EXPAND_INIT
239#define PICO9918_EXPAND_INIT(lut) ((void)0)
246#ifndef PICO9918_EXPAND_INDEXED
247#define PICO9918_EXPAND_INDEXED(dst, src, n, lut) \
250 const uint8_t* _s = (const uint8_t*)(src); \
251 const uint8_t* _e = _s + (n); \
252 uint32_t* _d = (uint32_t*)(dst); \
253 const PICO9918_PALETTE_LUT_T* _l = (lut); \
275#ifndef PICO9918_EXPAND_INDEXED_WIDE
276#define PICO9918_EXPAND_INDEXED_WIDE(dst, src, n, lut) \
279 const uint8_t* _s = (const uint8_t*)(src); \
280 uint32_t* _d = (uint32_t*)(dst); \
281 const PICO9918_PALETTE_LUT_T* _l = (lut); \
282 for (unsigned _i = 0; _i < (unsigned)(n); _i += 2) \
283 _d[_i / 2] = (_l[_s[_i]] & 0xffff) | (_l[_s[_i + 1]] << 16); \
294static inline uint32_t time_us_32(
void)
296 LARGE_INTEGER freq, cnt;
297 QueryPerformanceFrequency(&freq);
298 QueryPerformanceCounter(&cnt);
299 return (uint32_t)((cnt.QuadPart * 1000000ULL) / freq.QuadPart);
303static inline uint32_t time_us_32(
void)
306 clock_gettime(CLOCK_MONOTONIC, &ts);
307 return (uint32_t)(ts.tv_sec * 1000000UL + ts.tv_nsec / 1000UL);
316#ifndef __time_critical_func
317#define __time_critical_func(fn) fn
319#ifndef __not_in_flash_func
320#define __not_in_flash_func(fn) fn
322#ifndef __force_inline
323#define __force_inline inline
326#if defined(_MSC_VER) && !defined(__clang__)
327#define __aligned(n) __declspec(align(n))
329#define __aligned(n) __attribute__((aligned(n)))
338#if defined(_MSC_VER) && !defined(__clang__)
340#define __builtin_bswap16(x) _byteswap_ushort(x)