С помощью гугла: 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% выигрыша от изначальной афигенски быстрой процедуры, которая применяется в Героях.
:v2_dizzy_punk:
Снапшот с тайловым скроллером чуть позже. Хочу карту первого уровня набрать для красоты.
- - - Добавлено - - -
Так сказать, чтобы осталось в аналах ДЛЯ ПОТОМКОВ.
Была тайловыводилка, показанная в "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
Как в Tiled Map Editor сделать отписку карты не с теми номерами тайлов, которые он сам по умолчанию ставит, беря их с атласа по порядку, а чтобы мои номера тайлов были (у меня номера не по порядку следования на атласе)?
Грубо говоря при отписывании сделать конверт одних значений на другие, типа так:
если 1, то 89
...
если 33, то 92
...
...
если 227, то 52
Скрипт какой то надо писать для экспорта или что?
Так и запиши: "при условии, что Джерри предоставит все необходимые процедуры готовыми из своих запасов, игра будет написана за майские праздники. Если не предоставит, не будет написана за праздники. Буду писать всё сам. Долго и нудно" :cool_std:Цитата:
Ок та и запишем
игра будет написана за майские праздники
Но я сам тоже быстро пишу:
- 1 день на подключение кемпстон мауса +кроппинг,
- 1 день на скроллеры карты
- 1 день на тайло-выводилку
это всё при нуле помощи по теме.
Сегодня в планах дособрать карту уровня полностью, зумутить какойнить конвертер, плюс прикрутить систему анимации фоновых тайлов + изготовить эти самые анимации, да не просто абы какие, а сграбить через видеоряд с оригинала и потом переложить через фотошоп.
Образец бы. Экземпл на лапу. Пример в кармашек. А лучше готовое на пару строк, я привёл пример как, а я сам расширю до всего пула тайлов.Цитата:
попробуй скрипт.
я писал вырезалку.
Напоминаю людям, страдающим беспамятством, что я на самом деле говорил: "опытный чел, у которого на руках есть полная библиотека уже готовых процедур и практикующий в кодинге 30 лет без перерыва, сможет собрать за неделю".
Как показала практика, таких индивидов на Спеке нет. Либо ничего не знаю и не умеют, либо всё то же самое один в один, но с пафосом ходят щёки раздувают в стиле "мы не будем, нам некогда, это недостойно нашего внимания". Толку от тех и от других ноль.
История типа Алония. Я говорю, ты же Чёрного Ворона переделывал, красил спрайты, а это значит спрайты в новом формате заменял полностью на свои и выводилки делал полностью свои и остальной код уже весь готов. Что тебе мешает за два дня запихать мои спрайты и тайлы в уже готовую игру?! И получится готовый Варик. - Правильно, ничего. Чих-пых и продакшен на изичах. Так нет же,.. хочу только цвет, только под Evo,... не буду делать...
Ню-ню... И это, замечу, самый адекватный из. Осталные только одну песню хором напевать умеют: "не сделаешь, не сможешь, тактов не хватит, графен в память не влезет, трассер ниасилишь, гиблое это дело, даже не пытайся, это невозможно"... Я так понял эти все индивиды по себе судят. Ну, не можете, так не можете. Смотрите, как батя сам сделает в одно жало на изичах.
Кстати, нет у меня ещё одного навыка, который я бы хотел получить для полноты свободы в кодинге.
Я не понимаю, как конкретно работает $. И судя по коду 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 байт... $здесь?
от какого места отсчитывать?
- - - Добавлено - - -
Можно подумать я полгода ваньку валял, а не Алониевский движок продвигал и дописывал :biggrin:Цитата:
И вот спустя полгода ты наконец взялся.