▐     ▐▄▄         (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