▐ ▐▄▄ (c) alco^i8^any
▌ ▌ ▀▀▄▄ (a) nikphe^any
▐▄ ▐ ▐ ▀▀▄▄
▌ ▀▀▄▄▌ ▌ █▀▄▄
▐ ▐▀▀▄▄ ▐ ▌ ▀▀▄▄
▌ ▌ ▀█▄▄ ▐ ▐ ▀▀▄▄
▄ ▄ ▌ ▐ ▐ ▀▀▄█ ▌ ▐▀▀▄▄
▄ ▌▐▄ ▀ ▌ ▌ ▐ ▀▀▄▄▐ ▌ █▀▄▄
▌▐▐ ▄▌▌▐▀▀▄▄ ▐ ▌ █▀▄▄ ▐ ▌
▌ ▀█▄▄ ▐ ▐ ▀▀█▄ ▐
▐▄▓▓▒░░░ ░░▒ ▓▓▓▒ ▓▓▓▒ ░▒ ▓▓▓▓▀▄█▓▓▓
▌▒▓▀▓▓▌▒░ ░░▌▓▓ ▓▒▐▓▓▀▓▒▐░░ ░░ ▒▓ ▓▒▐▓▓▀▓▓
░▒ ▒▓▀▓▒▄░▒ ▓▒ ▒░▌▒▓ ▒░█░░▄░░▐▒▒ ▒░▌▒▓ ▄
░░ ░▒ ▓▓ ▒▓▓▒░ ░░░▒ ░░░▒ ▒░█░░ ░░ ░▒ ▒▓
▄▒░ ▒░ ▒▓ ▓▓ ░░▀░░ ░▒ ▓▒ ▒░▀░░ ░░░▌
▀▀█▄ ▐ ▌▀▀▄▄ ▌ ▌ ▌▀▀▄▄▐
▀▀▄▄▌ ▐ █▀▄▄ ▐ ▐ █
▀▀▄▄ ▌ ▌ ▀▀█▄ ▌ ▌
▀▀█▄ ▐ ▌ ▀▀▄▄▌ ▐
▀▀▄█ ▐ ▐▀▀▄▄ ▌
▀▀▄▄ ▌ ▌ █
▀▀▄▄ ▐ ▌
▀▀█▄ ▐
▀▀▄█
Мэппинг - это процедура отображения ча-
сти большой карты в окошко на экране.Суще-
ствуют также разновидности,такие как бамп-
мэппинг, боллмэппинг и прочие печати с ис-
кажением. Мы искажение использовать не бу-
дем,и разбивать карту на блоки (для эконо-
мии памяти) не будем тоже, то есть решаем
простейшую задачу, сводящуюся в конечном
счёте к выводу большого спрайта в малень-
кое окошко.
Когда я смотрел демку Satisfaction, ме-
ня очень обидело, что в части с фотографи-
ями авторов такое маленькое окно прокрутки
(22x22), хотя спрайт, безусловно, большой
(48k). И вот я стал оптимизировать...
Простейший вариант с LDI(r) мы рассмат-
ривать не будем, начнём сразу с POP-LD.
Возьмём окошко шириной 32 CHR$ (высота
значения не имеет)
ADD IX,BC
LD SP,IX
dup 16
POP HL
LD (...),HL
edup
итого: 25+26*16=441 такт на строку.
в среднем: 441/32=13.78 t/byte
Можете проверить,что другие способы мо-
дификации SP тоже занимают 25 тактов:
EXX
ADD HL,BC
LD SP,HL
EXX
или
EX DE,HL
ADD HL,BC
LD SP,HL
EX DE,HL
или даже
LD H,B
LD L,C
ADD HL,SP
LD SP,HL
Значит, оптимизируем внутреннюю часть:
POP-LD. Что у нас там быстрее?
ADD IX,BC
LD SP,IX
dup 10
POP HL
LD (...),HL
edup
POP AF,DE,HL
EXX
POP BC,DE,HL
LD SP,...
PUSH HL,DE,BC
EXX
PUSH HL,DE,AF
итого: 25+260+144=429 t/line
в среднем: 429/32=13.41 t/byte
Сразу прикидываем: можно ли делать при-
сваивание SP абсолютным адресом дважды за
строку? Считаем: по крайней мере 10 тактов
лишних из-за LD SP, и не больше 156-144=12
тактов выигрыша за это. Но нужно переприс-
воить стек-источник, а на это 2 тактов не
хватит ;(
По тем же причинам не имеет смысла ис-
пользовать AF' и IY: они жрут по 29/2=14.5
тактов на байт,что медленнее уже достигну-
того.Тем не менее,почему-то данные регист-
ры часто встречаются в аналогичных фрагме-
нтах программ многих кодеров :-/
Эта процедурка используется с не скажу
какого года у меня в Worms, и я даже пред-
принимал попытки ускорить её так:
LD SP,IX | IY
INC HX | HY
dup 10
POP HL
LD (...),HL
edup
POP AF,DE,HL
EXX
POP BC,DE,HL
LD SP,...
PUSH HL,DE,BC
EXX
PUSH HL,DE,AF
итого: 18+260+144=422 t/line
в среднем: 422/32=13.19 t/byte
Для этого пришлось бы использовать ка-
рту "круглой" ширины - 128, 256, 64 или 85
байт (последние 2 случая - для чересстроч-
ного вывода),чего я не мог себе позволить.
Сайт управляется системой
uCoz