Слышали анек про работника кроватного завода, который тащил детальки и собирал дома - то автомат получается, то пистолет. ;-) Так и я, не пойдёт мне эта теория впрок. Максимум, что я могу, это написать с её помощью что-то, положить такую процедуру бережно в либу и сдувать с неё пыль. Но к дизайну либы хорошо бы если бы приложил руку более опытный гейммейкер.
drbars, Bedazzle, благодарю. С миррорингом более или менее всё ясно.
Я реализовал AWRV, SL1V, SR1V, WL1V, WR1V. Байтовый (на 8 точек) и битовый (на 1 точку) скроллинг - обычный и циклический - проблем не вызвал. Больше вопросов вызывает горизонтальный скроллинг на 4 бита. Есть идея, как сделать его оптимально? Навскидку приходит на ум только побитовый сдвиг 4 раза и потом логическое наложение AND #F : OR x ( AND #F0 : OR x ).
Да, действительно. Лучше этих команд ничего и не придумаешь. Годится.
Код: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. Такты не считал, но думаю, получилось хорошо.
DemoMirr.zip
Мне остался только вертикальный скроллинг окна (вверх и вниз) на произвольное кол-во пикселей, обычный и циклический. И писать его не хочется, с удовольствием слямзил бы готовый.
- - - Добавлено - - -
Всё-таки посчитал такты. Неа, 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
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)