Вот моя процедура зеркалирования окна. Если вы видите как её оптимизнуть (не для демостроя, без таблиц), то милости прошу. У нас техническая тема, так что по возможности без эмоций, ладно?
Код:
void Laser2_MIRV (unsigned char col, unsigned char row, unsigned char len, unsigned char hgt) __z88dk_callee
{
__asm
POP DE
POP BC ; C = col; B = row
CALL __Laser2_XYtoScr
POP BC ; C = len; B = hgt
PUSH DE
LD A, C
LD (MIRV_WIDTH$+1), A
INC A
SRL A
LD (MIRV_WIDTH_DIV2$+1), A
MIRV_HLINE$: PUSH BC ; Begin of loop on charlines
LD A, #8
MIRV_LINE8$: EX AF, AF
LD (MIRV_SCR_ADR$+1), HL
LD A, L
MIRV_WIDTH$: ADD #0
LD E, A
LD D, H
MIRV_WIDTH_DIV2$: LD B, #0
MIRV_COL_MIRROR$: DEC E
LD A, (DE)
LD C, (HL)
; ------------------
; 2 bytes mirroring
; ------------------
RLA
RR C
RLA
RR C
RLA
RR C
RLA
RR C
RLA
RR C
RLA
RR C
RLA
RR C
RLA
RR C
; ------------------
RLA
LD (DE), A
LD (HL), C
INC L
DJNZ MIRV_COL_MIRROR$
MIRV_SCR_ADR$: LD HL, #0
INC H
EX AF, AF
DEC A
JR NZ, MIRV_LINE8$
LD A, L
ADD #0x20 ; Next charline
LD L, A ; If carry then jump to next third of screen
JR C, MIRV_CONT_1_3$
LD A, H
SUB #8 ; HL := HL - 0x0800
LD H, A
MIRV_CONT_1_3$: POP BC
DJNZ MIRV_HLINE$ ; End of loop on charlines (the same third)
__endasm;
} //Laser2_MIRV