ZXNet эхоконференция «code.zx»


тема: Быстрейший кидальщик экрана



от: Alexey Voskresensk
кому: All
дата: 01 Jul 1997
Hi, кодирующий All!!! Предлагаю вашему вниманию процедурку, которая может быть вам полезна, а многих натолкнет на различные идейки. Это, по сути, инсталлятор другой проце- дуры - "Быстрое кидалово экрана", в кото- рый пакуется картинка. В среднем переброс- ка 6912 байтов занимает 30000...60000 так- тов. Почему такой разброс значений? А по- тому что процедурой проводится "частотный анализ данных", и, естесственно, переброс- ка наполовину пустого экрана или заполнен- ного частоповторяющимися значениями будет занимать гораздо меньше времени, чем пе- реброска полностью заполненного экрана. Hо довольно лирики... Как же использо- вать эту программу? Во-первых, в рег. паре IX указать адрес в памяти, где будет располагаться выбрасы- ва9щая процедура вместе с запакованной внутрь нее картинкой. Во-вторых, в рег. паре HL указать адрес конца картинки +1. Картинка должна быть загружена в (#4000-$5B00). В-третьих, рег. пара BC должна указывать длину картинки, деленную пополам (напри- мер, 6144/2). Затем можно вызвать процеду- ру INSTALL. В результате ее работы: 1) с адреса IX будет раскрунчена картин- ка в виде: ...LD DE,nn: PUSH DE: PUSH DE: LD DE,nn...; 2) после работы процедуры IX будет ука- зывать на следующую ячейку памяти после "кидалова экрана"; 3) рег. пара BC будет содержать значе- ние, равное количеству тактов, за которое получившийся "кидальщик" будет выполнять свою задачу. Остальные комментарии по ходу процедуры. ====================== линия разгрыза ========================= ; (c) 1997 Sudden Prodigy Incorporated INSTALL LD IX,адрес расположения процедуры (напр., #8000) LD HL,адрес конца экрана +1 (напр., #5B00) LD BC,длина экрана/2 (напр., 6912/2=3456) DI EXX LD BC,#0A ;количество тактов для подсчета (LD DE,nn - ; 10 тактов процессора Z80 :) LD DE,#37 ;количество тактов на всякие подготовитель- ; ные операции PUSH HL LD H,D LD L,H ;обнуляем HL ADD HL,SP ;сохраняем SP EX DE,HL LD (IX+0),#F3 ;подготовительные операции: LD (IX+1),#21 ; DI LD (IX+2),H ; LD HL,#0000 LD (IX+3),H ; ADD HL,SP LD (IX+4),#39 ; LD SP,nn LD (IX+5),#31 ; EXX LD (IX+6),L ;адрес конца LD (IX+7),H ; экрана LD DE,#08 ADD IX,DE LD SP,HL ;снимаем со стека DEC SP ; первые 2 байта DEC SP ; данных POP HL ; экрана PUSH HL JR NEXT AGAIN DEC SP ;снимаем DEC SP ; со стека POP HL ; текущие 2 байта PUSH HL ; экрана LD A,H ;частотный анализ :) CP D ; если текущие два JR NZ,NEXT ; байта данных LD A,L ; не равны предыдущим CP E ; двум байтам, то ОК, иначе JR Z,YES! ; переход на YES! NEXT EXX ADD HL,BC ;прибавляем число тактов (LD DE,nn) EXX LD (IX+0),#11 ;LD DE,nn LD (IX+1),L ; nn - текущие два LD (IX+2),H ; байта экрана INC IX INC IX INC IX YES! EXX ADD HL,BC ;прибавляем 11 тактов (PUSH DE) INC HL EXX LD (IX+0),#D5 ;PUSH DE INC IX EX DE,HL ;сохраняем текущие 2 байта для сравнения DEC BC ;если LD A,B ; не все - OR C ; тогда JR NZ,AGAIN ; снова LD (IX+0),#F9 ;LD SP,HL LD (IX+1),#FB ; EI LD (IX+3),#C9 ; RET INC IX INC IX INC IX ;IX указывает на следующую ; ячейку после процедуры EXX EX DE,HL LD SP,HL ;восстанавливаем SP POP HL ;восстанавливаем HL (для BASIC'а) PUSH DE EXX POP BC ;BC - количество тактов, которое EI ; потребуется процедуре, RET ; чтобы "кинуть" экран ; (PRINT USR INSTALL :) ================== линия разгрыза ============================ С приветом, LAS of "Sudden Prodigy Inc." P.S. Компьютера у меня сейчас нету, так что пинайте Юрия Буравцова за допущенные ошибки при перепечатке :) - 812/01.14 P.P.S. Thanks to OneSOFT for help.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Новости - Изменения в пакете NedoLang, Hippiman сменил квартиру, после чего начал писать игровой движок на NedoLang, John Silver купил студийные колонки-мониторы, венгерские хакеры портировали Wolfenstein 2004 на компьютер Enterprise 128.
Sofтинка - экранный компрессор Laser Compact 4.0.
Новости - Graphic station.
Приветы - нeскoлькo привeтoв друзьям.
Фэнтези - Стадо звездных драконов.

В этот день...   8 мая