С помощью гугла: https://en.wikipedia.org/wiki/RTFM
С помощью гугла: https://en.wikipedia.org/wiki/RTFM
___________
Нет, нет, это вы сопли жуёте 5 месяцев, - помощи ноль. Я же начал писать день назад, о чём и сообщил в топике.21.01.2021, 21:36 - 02.05.2021, 21:01 - ровно неделя.
Только что закончил новую версию тайловыводилки писать. Со стэком. Наврядли можно быстрее.
Уложил таки на самых медленных Скорпионовских тактах самый длинный вариант сроллинга (из восьми).
Всё скроллится ровно за 2 кадра на любом компьютере.
36 тактов на 2 байта
1109 - выводилка 1 цветного тайла по входным параметрам
1373 - с расчётом этих входных параметров
31,35% выигрыша от изначальной афигенски быстрой процедуры, которая применяется в Героях.
Снапшот с тайловым скроллером чуть позже. Хочу карту первого уровня набрать для красоты.
- - - Добавлено - - -
Так сказать, чтобы осталось в аналах ДЛЯ ПОТОМКОВ.
Была тайловыводилка, показанная в "HeroesII", написанная в 98 году. Достаточно быстрая, вся инлайновая. Определение адреса в экране сделано через ПЗУ.
В 2021 году я заметил, что судя по структуре проекта, применение индексного регистра IX не обосновано, а значит следует отказаться от него, ибо все операции с IX жрут больше тактов, чем аналогичные с другими регистровыми парами. Заодно убрал повторный расчёт адреса в экране второй линии знакомест. И заменил процедуру расчёта адреса в экране с обращения в ПЗУ на самописную, увиденную у Санчеза. Выигрыш 18% относительно исходника.Код:;323774t - 12x12=144 тайла (2248t) ;2000t - 1 тайл GAMEPOLE ld b,12 GAMEMET2 push bc ld a,(POZXY) ld (POZX),a ld a,4 ld (PSP+1),a ;X начала вывода карты на экране ld a,(POZXY+1) dec b add a,b ld (POZY),a ld a,b add a,b ;b*2 ld (PSP),a ;Y начала вывода карты на экране ld b,12 GAMEMET1 push bc call SPPECH ld a,(POZX) inc a ld (POZX),a ld a,(PSP+1) inc a inc a ld (PSP+1),a pop bc djnz GAMEMET1 pop bc djnz GAMEMET2 ret ;1736t SPPECH ld de,64 ld a,(POZY) call MUL_8 ld a,(POZX) ld e,a ld d,0 add hl,de ld de,karta add hl,de OGOGO2 ld a,(hl) ld e,36 ld d,0 call MUL_8 ld de,tiles add hl,de OGOGO push hl pop ix ld hl,PSP ld a,(hl) inc hl ld c,(hl) push bc push af call 3742 ld a,l add a,c ld l,a ld (PTBL4),hl ld a,(ix+0) ld (hl),a inc l ld a,(ix+1) ld (hl),a dec l inc h ld a,(ix+2) ld (hl),a inc l ld a,(ix+3) ld (hl),a dec l inc h ld a,(ix+4) ld (hl),a inc l ld a,(ix+5) ld (hl),a dec l inc h ld a,(ix+6) ld (hl),a inc l ld a,(ix+7) ld (hl),a dec l inc h ld a,(ix+8) ld (hl),a inc l ld a,(ix+9) ld (hl),a dec l inc h ld a,(ix+10) ld (hl),a inc l ld a,(ix+11) ld (hl),a dec l inc h ld a,(ix+12) ld (hl),a inc l ld a,(ix+13) ld (hl),a dec l inc h ld a,(ix+14) ld (hl),a inc l ld a,(ix+15) ld (hl),a pop af inc a call 3742 pop bc ld a,l add a,c ld l,a ld a,(ix+16) ld (hl),a inc l ld a,(ix+17) ld (hl),a dec l inc h ld a,(ix+18) ld (hl),a inc l ld a,(ix+19) ld (hl),a dec l inc h ld a,(ix+20) ld (hl),a inc l ld a,(ix+21) ld (hl),a dec l inc h ld a,(ix+22) ld (hl),a inc l ld a,(ix+23) ld (hl),a dec l inc h ld a,(ix+24) ld (hl),a inc l ld a,(ix+25) ld (hl),a dec l inc h ld a,(ix+26) ld (hl),a inc l ld a,(ix+27) ld (hl),a dec l inc h ld a,(ix+28) ld (hl),a inc l ld a,(ix+29) ld (hl),a dec l inc h ld a,(ix+30) ld (hl),a inc l ld a,(ix+31) ld (hl),a ld bc,(PTBL4) ld a,b and #18 sra a sra a sra a add a,#58 ld b,a ld a,(ix+32) ld (bc),a inc bc ld a,(ix+33) ld (bc),a ld hl,31 add hl,bc ld a,(ix+34) ld (hl),a inc hl ld a,(ix+35) ld (hl),a ret PTBL4 defb 0,0 ;временно храним адрес POZX defb 0 POZY defb 0 PSP defb 0,0 ;Y,X
Гулять так гулять, подумал я. Свербит в мозгу желание брать и класть регистровыми парами, а не отдельными регистрами. Посмотрев таблицу существующих мнемоник Z80 пришёл к выводу, что и взять парой и положить парой не получится, нет таких команд, ибо адреса откуда и куда у нас всегда расчитываются в преамбуле и всё время разные. Ну, хотя бы ВЗЯТЬ я регистровой парой могу, и то хлеб. Выигрыш относительно исходника увеличился до 35%.Код:;269486(1871);276398(1919);308942(2145);323774 - 12x12=144 тайла (2248) ;1633;1671;1897;2000 - 1 тайл GAMEPOLE ld b,12 GAMEMET2 push bc ld a,(POZXY) ld (POZX),a ld a,4 ld (PSP+1),a ;X начала вывода карты на экране ld a,(POZXY+1) dec b add a,b ld (POZY),a ld a,b add a,b ;b*2 ld (PSP),a ;Y начала вывода карты на экране ld b,12 GAMEMET1 push bc call SPPECH ld a,(POZX) inc a ld (POZX),a ld a,(PSP+1) inc a inc a ld (PSP+1),a pop bc djnz GAMEMET1 pop bc djnz GAMEMET2 ret ;1369 - заменил 3742 на Санчеза ;1407 - убрал вывод через IX ;1633 - убрал второй обсчёт через 3742 ;1736 - было изначально SPPECH ld de,64 ld a,(POZY) call MUL_8 ld a,(POZX) ld e,a ld d,0 add hl,de ld de,karta add hl,de OGOGO2 ld a,(hl) ld e,36 ld d,0 call MUL_8 ld de,tiles add hl,de OGOGO ex de,hl ld hl,PSP ld a,(hl) inc hl ld c,(hl) ld l,a rrca rrca rrca and #e0 or c ld h,a ld a,l and #18 add a,high 16384 ;shadow_screen ld l,h ld h,a ld (PTBL4),hl dup 7 ld a,(de) ;Выводим 2 байта ld (hl),a inc de inc l ld a,(de) ld (hl),a inc de inc h dec l edup ld a,(de) ;Выводим 2 байта ld (hl),a inc de inc l ld a,(de) ld (hl),a inc de ;------------- ld hl,(PTBL4) ld a,l add a,#20 ld l,a dup 7 ld a,(de) ;Выводим 2 байта ld (hl),a inc de inc l ld a,(de) ld (hl),a inc de inc h dec l edup ld a,(de) ;Выводим 2 байта ld (hl),a inc de inc l ld a,(de) ld (hl),a inc de ;------------- ld bc,(PTBL4) ld a,b and #18 sra a sra a sra a add a,#58 ld b,a ld a,(de) ld (bc),a inc de inc bc ld a,(de) ld (bc),a inc de ld hl,31 add hl,bc ld a,(de) ld (hl),a inc de inc hl ld a,(de) ld (hl),a ret PTBL4 defb 0,0 ;храним адрес начала (адрес в экране),тайл POZX defb 0 POZY defb 0 PSP defb 0,0 ;Y,X
Буду рад, если вам пригодится мой код. Надеюсь у гуру нет вопросов относительно оптимизации печати тайлов? Если нет, - считаю этот вопрос закрытым.Код:;233486(1621);269486(1871);276398(1919);308942(2145);323774 - 12x12=144 тайла (2248) ;1373;1633;1671;1897;2000 - 1 тайл GAMEPOLE ld b,12 GAMEMET2 push bc ld a,(POZXY) ld (POZX),a ld a,4 ld (PSP+1),a ;X начала вывода карты на экране ld a,(POZXY+1) dec b add a,b ld (POZY),a ld a,b add a,b ;b*2 ld (PSP),a ;Y начала вывода карты на экране ld b,12 GAMEMET1 push bc call SPPECH ld a,(POZX) inc a ld (POZX),a ld a,(PSP+1) inc a inc a ld (PSP+1),a pop bc djnz GAMEMET1 pop bc djnz GAMEMET2 ret ;1109 - sp через стэк ;1369 - заменил 3742 на Санчеза ;1407 - убрал вывод через IX ;1633 - убрал второй обсчёт через 3742 ;1736 - было изначально SPPECH ld de,64 ld a,(POZY) call MUL_8 ld a,(POZX) ld e,a ld d,0 add hl,de ld de,karta add hl,de OGOGO2 ld a,(hl) ld e,36 ld d,0 call MUL_8 ld de,tiles add hl,de OGOGO di ld (SPgo+1),sp ld sp,hl ;6 - откуда брать ;------------- ld hl,PSP ld a,(hl) inc hl ld c,(hl) ld l,a rrca rrca rrca and #e0 or c ld h,a ld a,l and #18 add a,high 16384 ;shadow_screen ld l,h ld h,a ld (PTBL4),hl ;------------- dup 7 pop de ;10 - берём оттуда ld (hl),e ;7 inc l ;4 ld (hl),d ;7 inc h ;4 dec l ;4 итого: 36 edup pop de ;10 - берём оттуда ld (hl),e ;7 inc l ;4 ld (hl),d ;7 ;------------- ld hl,(PTBL4) ld a,l add a,#20 ld l,a ;------------- dup 7 pop de ;10 - берём оттуда ld (hl),e ;7 inc l ;4 ld (hl),d ;7 inc h ;4 dec l ;4 итого: 36 edup pop de ;10 - берём оттуда ld (hl),e ;7 inc l ;4 ld (hl),d ;7 ;------------- ld hl,(PTBL4) ld a,h and #18 sra a sra a sra a add a,#58 ld h,a ;------------- pop de ;10 - берём оттуда ld (hl),e ;7 inc hl ;6 ld (hl),d ;7 ld bc,31 add hl,bc pop de ;10 - берём оттуда ld (hl),e ;7 inc hl ;6 ld (hl),d ;7 SPgo ld sp,#0000 ret PTBL4 defb 0,0 ;храним адрес начала (адрес в экране),тайл POZX defb 0 POZY defb 0 PSP defb 0,0 ;Y,X
Последний раз редактировалось DragonsLord; 03.05.2021 в 04:11.
nimdasys_inbox_ru(02.05.2021)
Как в Tiled Map Editor сделать отписку карты не с теми номерами тайлов, которые он сам по умолчанию ставит, беря их с атласа по порядку, а чтобы мои номера тайлов были (у меня номера не по порядку следования на атласе)?
Грубо говоря при отписывании сделать конверт одних значений на другие, типа так:
если 1, то 89
...
если 33, то 92
...
...
если 227, то 52
Скрипт какой то надо писать для экспорта или что?
Так и запиши: "при условии, что Джерри предоставит все необходимые процедуры готовыми из своих запасов, игра будет написана за майские праздники. Если не предоставит, не будет написана за праздники. Буду писать всё сам. Долго и нудно"Ок та и запишем
игра будет написана за майские праздники
Но я сам тоже быстро пишу:
- 1 день на подключение кемпстон мауса +кроппинг,
- 1 день на скроллеры карты
- 1 день на тайло-выводилку
это всё при нуле помощи по теме.
Сегодня в планах дособрать карту уровня полностью, зумутить какойнить конвертер, плюс прикрутить систему анимации фоновых тайлов + изготовить эти самые анимации, да не просто абы какие, а сграбить через видеоряд с оригинала и потом переложить через фотошоп.
Образец бы. Экземпл на лапу. Пример в кармашек. А лучше готовое на пару строк, я привёл пример как, а я сам расширю до всего пула тайлов.попробуй скрипт.
я писал вырезалку.
Последний раз редактировалось DragonsLord; 03.05.2021 в 17:00.
Напоминаю людям, страдающим беспамятством, что я на самом деле говорил: "опытный чел, у которого на руках есть полная библиотека уже готовых процедур и практикующий в кодинге 30 лет без перерыва, сможет собрать за неделю".
Как показала практика, таких индивидов на Спеке нет. Либо ничего не знаю и не умеют, либо всё то же самое один в один, но с пафосом ходят щёки раздувают в стиле "мы не будем, нам некогда, это недостойно нашего внимания". Толку от тех и от других ноль.
История типа Алония. Я говорю, ты же Чёрного Ворона переделывал, красил спрайты, а это значит спрайты в новом формате заменял полностью на свои и выводилки делал полностью свои и остальной код уже весь готов. Что тебе мешает за два дня запихать мои спрайты и тайлы в уже готовую игру?! И получится готовый Варик. - Правильно, ничего. Чих-пых и продакшен на изичах. Так нет же,.. хочу только цвет, только под Evo,... не буду делать...
Ню-ню... И это, замечу, самый адекватный из. Осталные только одну песню хором напевать умеют: "не сделаешь, не сможешь, тактов не хватит, графен в память не влезет, трассер ниасилишь, гиблое это дело, даже не пытайся, это невозможно"... Я так понял эти все индивиды по себе судят. Ну, не можете, так не можете. Смотрите, как батя сам сделает в одно жало на изичах.
Последний раз редактировалось DragonsLord; 03.05.2021 в 18:17.
Кстати, нет у меня ещё одного навыка, который я бы хотел получить для полноты свободы в кодинге.
Я не понимаю, как конкретно работает $. И судя по коду 3d движка, даже Алоний постоянно путается.
Понятно. что все инструкции имеют длину в байтах. Это можно посмотреть в таблицах.
Не понятно, где конкретно сейчас на момент исполнения находится точка $ в инструкциях длинее 1 байта.
Например, скажите точно, что будет записано в этом примере:
Или какое точно смещение должно быть записано в конструкции типа:Код:org 32768 ld hl,$ ;21XXXX ld (met+1),hl ;22XXXX met ld sp,#0000 ;31XXXX
чтобы получился аналог этогоКод:cp 1 jp nz,$+? ;C2XXXX ld a,100 ;3EXX ret ;C9 ld a,200 ret
Код:cp 1 jp nz,quit ;C2XXXX ld a,100 ;3EXX ret ;C9 quit ld a,200 ret
Где конкретно в нескольких байтах стоит $? Допустим 3 байта инструкция в исполняемой строчке, где?
$здесь? ... 1 байт... $здесь? ... 2 байт... $здесь? ... 3 байт... $здесь?
от какого места отсчитывать?
- - - Добавлено - - -
Можно подумать я полгода ваньку валял, а не Алониевский движок продвигал и дописывалИ вот спустя полгода ты наконец взялся.![]()
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)