Я больше про рассказать что-нить более понятным языком. Возможно по Skype, возможно, с реализацией в прямом эфире. Сам писать не хочу.
Вид для печати
Слышали анек про работника кроватного завода, который тащил детальки и собирал дома - то автомат получается, то пистолет. ;-) Так и я, не пойдёт мне эта теория впрок. Максимум, что я могу, это написать с её помощью что-то, положить такую процедуру бережно в либу и сдувать с неё пыль. Но к дизайну либы хорошо бы если бы приложил руку более опытный гейммейкер.
drbars, Bedazzle, благодарю. С миррорингом более или менее всё ясно.
Я реализовал AWRV, SL1V, SR1V, WL1V, WR1V. Байтовый (на 8 точек) и битовый (на 1 точку) скроллинг - обычный и циклический - проблем не вызвал. Больше вопросов вызывает горизонтальный скроллинг на 4 бита. Есть идея, как сделать его оптимально? Навскидку приходит на ум только побитовый сдвиг 4 раза и потом логическое наложение AND #F : OR x ( AND #F0 : OR x ).
Ещё как вариант использовать
https://i.imgur.com/SIevaIz.png
Да, действительно. Лучше этих команд ничего и не придумаешь. Годится. :)
Код:void Laser2_SL4V (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
DEC A
ADD L
LD L, A
SL4V_HLINE$: PUSH BC
LD D, #8
LD E, L
SL4V_ROLL_LINE8$: LD B, C
XOR A
SL4V_ROLL_LINE$: RLD
DEC L
DJNZ SL4V_ROLL_LINE$
LD L, E
INC H
DEC D
JR NZ, SL4V_ROLL_LINE8$
LD A, L
ADD #0x20 ; Next charline
LD L, A ; If carry then jump to next third of screen
JR C, SL4V_CONT_1_3$
LD A, H
SUB #8 ; HL := HL - 0x0800
LD H, A
SL4V_CONT_1_3$: POP BC
DJNZ SL4V_HLINE$ ; End of loop on charlines (the same third)
__endasm;
} //Laser2_SL4V
Реализовал SL4V, SR4V, WL4V, WR4V, MIRV и MARV. Зеркалирование экрана использует код, предложенный Bedazzle. Для зеркалирования атрибутов удалось использовать команду LDI. Такты не считал, но думаю, получилось хорошо.
Вложение 58292
Мне остался только вертикальный скроллинг окна (вверх и вниз) на произвольное кол-во пикселей, обычный и циклический. И писать его не хочется, с удовольствием слямзил бы готовый.
- - - Добавлено - - -
Всё-таки посчитал такты. Неа, LDI здесь не эффективнее. Такой расклад.
Код:MARV_MIRR_LINE$: LD A, (DE) ; 7
LDI ; 16
DEC L ; 4
LD (HL), A ; 7
INC L ; 4
DEC DE ; 6
DEC E ; 4
DJNZ MARV_MIRR_LINE$ ; 48t, 8 bytes
Код:MARV_MIRR_LINE$: LD A, (DE) ; 7
LD C, (HL) ; 7
LD (HL), A ; 7
LD A, C ; 4
LD (DE), A ; 7
INC L ; 4
DEC E ; 4
DJNZ MARV_MIRR_LINE$ ; 40t, 7 bytes
drbars, код Bedazzle зеркалит сразу 2 байта одним махом. Чего и требуется.
Если я что-то не так понял, прошу объяснить, а не удалять.
- - - Добавлено - - -
drbars, ваш пример оптимальнее для зеркалирования одного байта, и с этим никто даже не собирался спорить. А тут сразу два байта. Если вы внимательно подумаете, то поймёте, что в моём случае (зеркалится окно) код Bedazzle оптимальнее.
Так что зря удалили.
drbars, ну что это за "барышня обиделась"? Восстановите посты, могут кому-то пригодиться. В т.ч. и мне потом, мало ли.
Господа, у кого-то они остались в кэше браузера? Запостите. (У меня нет, долбанный Chrome)
эти?
; mirror byte (example 2)
; 17 bytes, 66 t.
LD C,A
RLCA
RLCA
XOR C
AND %10101010
XOR C
LD C,A
RLCA
RLCA
RLCA
RRC C
XOR C
AND %01100110
XOR C
; Результат = reg A.
Так же, если проблема со свободными регистрами можно использовать только аккумулятор.
18 bytes
LD A,(HL)
RLCA
RLCA
XOR (HL)
AND %10101010
XOR (HL)
LD (HL),A
RLCA
RLCA
RLCA
RRC (HL)
XOR (HL)
AND %01100110
XOR (HL)
LD (HL),A