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
46#ifndef PICO9918_HOST_SET_INT
47#define PICO9918_HOST_SET_INT(active) ((void)(active))
68#define PICO9918_FILL_BORDER pico9918_fill_border
70#define PICO9918_FILL32_INIT(inst, srcPtr) \
73 (inst).src = (srcPtr); \
76#define PICO9918_FILL32_SET_COUNT(inst, n) \
79 (inst).count = (unsigned)(n); \
82#define PICO9918_FILL32_TRIGGER(inst, dstPtr) \
85 uint32_t _v = *(const uint32_t*)(inst).src; \
86 uint32_t* _d = (uint32_t*)(dstPtr); \
87 for (unsigned _i = 0; _i < (inst).count; ++_i) _d[_i] = _v; \
90#define PICO9918_FILL32_WAIT(inst) ((void)0)
93#define PICO9918_DMA_CLAIM() ((void)0)
103#define PICO9918_FILL_MASKS pico9918_fill_masks
104#define PICO9918_FILL_LINE pico9918_fill_line
117#define PICO9918_COPY pico9918_copy
120#define PICO9918_COPY_STATE()
121#define PICO9918_COPY_INIT(inst) \
126#define PICO9918_COPY_SET_WIDTH(inst, wordAligned) \
129 (inst).shift = (wordAligned) ? 2u : 0u; \
131#define PICO9918_COPY_SET_SRC(inst, srcPtr) \
134 (inst).src = (srcPtr); \
136#define PICO9918_COPY_SET_DST(inst, dstPtr) \
139 (inst).dst = (dstPtr); \
141#define PICO9918_COPY_TRIGGER(inst, n) memcpy((inst).dst, (inst).src, (size_t)(n) << (inst).shift)
142#define PICO9918_COPY_WAIT(inst) ((void)0)
145#define PICO9918_DIVMOD_U32(n, d, q, r) \
148 uint32_t _n = (uint32_t)(n), _d = (uint32_t)(d); \
166#ifndef PICO9918_PIXEL_T
167typedef uint16_t PICO9918_PIXEL_T;
168#define PICO9918_PIXEL_T PICO9918_PIXEL_T
177#ifndef PICO9918_PIXEL_FROM_RGB12
178#define PICO9918_PIXEL_FROM_RGB12(rgb) \
179 ((PICO9918_PIXEL_T)(((rgb) & 0xFF0F) | ((((rgb) & 0xFF0F) >> 12) << 4)))
184#ifndef PICO9918_PIXEL_FROM_RGB12_PAIR
185#define PICO9918_PIXEL_FROM_RGB12_PAIR(packed) \
186 ((((uint32_t)PICO9918_PIXEL_FROM_RGB12((packed) >> 16)) << 16) | \
187 (uint16_t)PICO9918_PIXEL_FROM_RGB12((uint16_t)(packed)))
190#ifndef PICO9918_PIXEL_PAIR
191#define PICO9918_PIXEL_PAIR(p) ((uint32_t)(p) * 0x10001u)
194#ifndef PICO9918_LOW16
195#define PICO9918_LOW16(x) ((uint32_t)(uint16_t)(x))
199#ifndef PICO9918_PIXEL_DARKEN
200#define PICO9918_PIXEL_DARKEN(p) ((PICO9918_PIXEL_T)(((p) >> 2) & 0x333))
207#ifndef PICO9918_PIXEL_PAIR_DIM
208#define PICO9918_PIXEL_PAIR_DIM(w) (((w) >> 1) & 0x07770777u)
214#ifndef PICO9918_INK_T
215typedef uint32_t PICO9918_INK_T;
216#define PICO9918_INK_T PICO9918_INK_T
217#define PICO9918_INK_PIXELS 2
218#define PICO9918_INK_FILL(fg) PICO9918_PIXEL_PAIR(fg)
219#define PICO9918_INK_DARKEN(w) (((w) >> 2) & 0x03330333u)
220#define PICO9918_INK_ONE(k) (0xffffu << ((k) * 16))
227#ifndef PICO9918_PALETTE_LUT_T
228typedef uint32_t PICO9918_PALETTE_LUT_T;
229#define PICO9918_PALETTE_LUT_T PICO9918_PALETTE_LUT_T
233#ifndef PICO9918_EXPAND_INIT
234#define PICO9918_EXPAND_INIT(lut) ((void)0)
241#ifndef PICO9918_EXPAND_INDEXED
242#define PICO9918_EXPAND_INDEXED(dst, src, n, lut) \
245 const uint8_t* _s = (const uint8_t*)(src); \
246 const uint8_t* _e = _s + (n); \
247 uint32_t* _d = (uint32_t*)(dst); \
248 const PICO9918_PALETTE_LUT_T* _l = (lut); \
270#ifndef PICO9918_EXPAND_INDEXED_WIDE
271#define PICO9918_EXPAND_INDEXED_WIDE(dst, src, n, lut) \
274 const uint8_t* _s = (const uint8_t*)(src); \
275 uint32_t* _d = (uint32_t*)(dst); \
276 const PICO9918_PALETTE_LUT_T* _l = (lut); \
277 for (unsigned _i = 0; _i < (unsigned)(n); _i += 2) \
278 _d[_i / 2] = (_l[_s[_i]] & 0xffff) | (_l[_s[_i + 1]] << 16); \
289static inline uint32_t time_us_32(
void)
291 LARGE_INTEGER freq, cnt;
292 QueryPerformanceFrequency(&freq);
293 QueryPerformanceCounter(&cnt);
294 return (uint32_t)((cnt.QuadPart * 1000000ULL) / freq.QuadPart);
298static inline uint32_t time_us_32(
void)
301 clock_gettime(CLOCK_MONOTONIC, &ts);
302 return (uint32_t)(ts.tv_sec * 1000000UL + ts.tv_nsec / 1000UL);
311#ifndef __time_critical_func
312#define __time_critical_func(fn) fn
314#ifndef __not_in_flash_func
315#define __not_in_flash_func(fn) fn
317#ifndef __force_inline
318#define __force_inline inline
321#if defined(_MSC_VER) && !defined(__clang__)
322#define __aligned(n) __declspec(align(n))
324#define __aligned(n) __attribute__((aligned(n)))
333#if defined(_MSC_VER) && !defined(__clang__)
335#define __builtin_bswap16(x) _byteswap_ushort(x)