Из журнала ZX-Guide#4, Рязань, 25.11.2001 (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 случая - для чересстроч- ного вывода),чего я не мог себе позволить.