/* * _gfx_hfill256_chunk — горизонтальный Fill-burst акселератора: * _gfx_acc_len байт цвета _gfx_acc_color с адреса _gfx_acc_addr на * строке _gfx_acc_y. Pre: W3 замаплен на видеобанк, DI активен. * * Опкоды акселератора (docs/converted/accel_r.txt): * LD D,D (0x52) режим «задать размер блока»; СЛЕДУЮЩИЙ байт — длина, * ОБЯЗАН быть immediate-операндом LD A,n (0x3E) * LD C,C (0x49) горизонтальный Fill (LD (HL),A заливает n байт) * LD B,B (0x40) выключить акселератор * * Байт длины патчится SMC — HOME после загрузки DSS это RAM, патчить * собственный .EXE безопасно. Вставлять другой `ld a,#n` между LD C,C * и стреляющим LD (HL),A нельзя — FSM акселератора перечитает immediate * как новый размер блока. */ #include "_gfx.h" void _gfx_hfill256_chunk(void) __naked { __asm ;; Пропатчить immediate LD A,#n байтом длины. ld a, (__gfx_acc_len) ld (_hfill256_len_imm), a ld a, (__gfx_acc_y) out (#0x89), a ; Port_Y = y ;; Цвет в C и адрес в HL готовим ДО взведения акселератора. ld a, (__gfx_acc_color) ld c, a ld hl, (__gfx_acc_addr) ;; --- ПОСЛЕДОВАТЕЛЬНОСТЬ АКСЕЛЕРАТОРА --- ld d, d ; 0x52 — режим размера блока ld a, #0 ; 0x3E nn — размер (nn патчится выше) _hfill256_len_imm = . - 1 ld c, c ; 0x49 — горизонтальный Fill ld a, c ; 0x79 — A = цвет (НЕ ещё один ld a,#n) ld (hl), a ; выстрел; заливает _gfx_acc_len байт ld b, b ; 0x40 — выключить ret __endasm; }