ZX Review #3-4
22 июля 1997

Форум - Д.Федоров: Печать картинки с маской с точностью до пиксела. Алгоритм расчета адреса по координатам с точностью до пиксела.

(c) Федоров Денис,
г.Владивосток.

   Предлагаю   вашему   вниманию
дельную, на мой взгляд, програм-
мку.  Идея  написать  что-нибудь
этакое появилась после того, как
в одном из номеров вашего  заме-
чательного журнала был опублико-
ван способ печати  изображений с
точностью до  пиксела без приме-
нения аналогов процедуы PLOT. Та
же идея присутствует  и  в  моем
варианте, но  все же немного из-
менена. Процедуры расчета экран-
ного  адреса  и  HLDOWN  - также
взяты из опубликованных вами ма-
териалов.
   Если в памяти разместить нет-
ронутую копию экрана, то по  мо-
тивам представленной мной  прог-
раммы можно попробовать написать  
процедуру  восстановления  изна-
чального изображения.

      Название:  Печать картинки
с маской с точностью до пиксела.
СПОСОБ ПЕЧАТИ - RR, AND, OR.
ФОРМАТ ШАБЛОНА - 1-маска, 2-байт
  рисунка; 3-маска, 4-pисунок...
Вторая линия   - 1,2; 3,4; ....
Третья, ....   - ..............
Всего LY линий с длиной LX  байт
каждая.
ВЫЧИСЛЕНИЕ  ДЛИНЫ  ШАБЛОНА - LX*
LY*2.
ПЕЧАТЬ  ПРОИЗВОДИТСЯ   НЕПОСРЕД-
СТВЕННО НА ЭКРАН.

WARNING! Если, к примеру, LY=16,
LX=2, то шаблон будет иметь раз-
меры  2*2 знакоместа. Это проис-
ходит потому, что  единица изме-
рениния  LX - один байт, а  LY -
одна линия.
   Чтобы печать производилась  в
буфер, надо  после  ABC добавить
строки:

        LD      DE,STEP
        ADD     HL,DE

   где  STEP - модуль    разницы
между началом реального экрана и
началом  буфера, куда будет про-
изводиться печать.
   Проверка на коллизию с грани-
цами экрана не реализована.
148.
Special for INFORCOM by SatSoft.
(F.D.)

text:   ORG     40000  ; - ЛЮБОЕ ДРУГОЕ
                       ;ДОПУСТИМОЕ
                       ;ЗНАЧЕНИЕ
        LD      A,(LX)     ;ПОДГОТОВКА
        LD      (LENX+1),A ;ПЕРЕМЕННЫХ
        LD      A,(LY)     ;ДЛЯ РАБОТЫ
        LD      (LENY+1),A
        LD      IX,(START)
        LD      DE,(COORDS)

        LD      A,D  ;ОПРЕДЕЛЕНИЕ ВЕЛИЧИНЫ
                     ;СМЕЩЕНИЯ ИЗОБРАЖЕНИЯ
        AND     7    ;ВНУТРИ БАЙТА
        LD      (SHIFT+1),A

        LD      A,#BF ;РАСЧЕТ ЭКРАННОГО
        SUB     E     ;АДРЕСА С ТОЧНОСТЬЮ
        LD      C,A   ;ДО ЛИНИИ
        AND     #38
        RLCA
        RLCA
        SRL     D
        SRL     D
        SRL     D
        ADD     A,D
        LD      L,A
        LD      A,C
        RRCA
        RRCA
        RRCA
        AND     #18
        XOR     C
        AND     #F8
        XOR     C
        ADD     A,#40
ABC     LD      H,A

LEN-Y   LD      B,0 ;ЦИКЛ СТОЛБЦОВ
L3      PUSH    BC
        PUSH    HL

LEN-X   LD      B,0 ;ЦИКЛ СТРОК
L2      PUSH    BC

        LD      C,(IX+0);ПРИНЯТИЕ ТЕКУЩИХ
        INC     IX      ;ДАННЫХ ПО ШАБЛОНУ
        LD      E,(IX+0)
        INC     IX
        LD      B,(IX+0)
        INC     IX
        LD      D,(IX+0)
        INC     IX

SHIFT   LD      A,0  ;ВЕЛИЧИНА СМЕЩЕНИЯ
        OR      A    ;ПО ЛИНИИ
        JR      Z,CONT

L1      AND     A
        RR      C
        RR      B
        RR      E
        RR      D
        DEC     A
        JR      NZ,L1

CONT    LD      A,(HL)
        AND     C
        OR      E
        LD      (HL),A
        INC     HL

        LD      A,(HL)
        AND     B
        OR      D
        LD      (HL),A
        INC     HL

        POP     BC
        DJNZ    L2

        POP     BC
        POP     HL

HLDOWN  INC     H    ;ОПУСКАЕМ HL
        LD      A,H  ;НА ЛИНИЮ ВНИЗ.
        AND     7
        JR      NZ,EDOWN
        LD      A,L
        ADD     A,32
        LD      L,A
        JR      C,EDOWN
        LD      A,H
        SUB     8
        LD      H,A

EDOWN   DJNZ    L3
        RET

LY      DEFB    0
LX      DEFB    0
START   DEFW    0000
COORDS  DEFB    0     ;Y-COORD
        DEFB    0     ;X-COORD
        END
2
   Мой вариант не предусматрива-
ет таких вещей,  как  нахождение
нужного шаблона по  его номеру в
таблице  или  привязка  исходных
данных  к Бейсику по трем причи-
нам:
  1.Все это вполне  легко  можно
осуществить,  просмотрев  статью
г-на В.Бодрова - "ГРАФИКА ВАШЕГО
КОМПЬЮТЕРА"  (ZX РЕВЮ 95/4, стр.
15).
  2.Самостоятельно  поработав  с
процедурой, изменяя ее  на  раз-
ные лады, читатель лучше  поймет
структуру алгоритма и сможет,  к
примеру, реализовать проверку на
коллизию шаблона с границами эк-
рана.
  3. Я стараюсь делать как можно
более простые программы и  дора-
батывать их по мере надобности.

   Здесь  же  стоит  рассмотреть
способ  кодирования   начального
изображения в формат, используе-
мый моей процедурой. Допустим, у
нас имеется готовое изображение,
кратное по  размерам  8,  причем
маска и сам  растр  находятся  в
разных  частях  экрана.  В  этом
случае имеет  место  использова-
ние следующего приема:
148.
        ORG 41000     ;ЛЮБОЕ ДРУГОЕ
                      ;ЗНАЧЕНИЕ
MCOORD  DEFW    0000
PCOORD  DEFW    0000
YLEN    DEFB    00
XLEN    DEFB    00

MAIN    LD      A,(YLEN)  ;УСТАНОВКА ДЛИНЫ
        LD      (YL+1),A  ;РИСУНКА
        LD      A,(XLEN)
        LD      (XL+1),A

        LD      HL,(MCOORD)  ;УСТАНОВКА
        LD      (CRD+1),HL   ;ПАРАМЕТРОВ
        LD      HL,START     ;ДЛЯ ВВОДА
        LD      (ADR+1),HL   ;МАСКИ
        CALL    INPUT

        LD      HL,(PCOORD)  ;УСТАНОВКА
        LD      (CRD+1),HL   ;ПАРАМЕТРОВ
        LD      HL,START+1   ;ДЛЯ ВВОДА
        LD      (ADR+1),HL   ;РАСТРА
        CALL    INPUT
        RET

CRD     LD      DE,0000  ;РАСЧЕТ ДИСПЛЕЙ-
        LD      A,E      ;НОГО АДРЕСА
        AND     #18      ;ПО КООРДИНАТАМ
        ADD     A,#40
        LD      H,A
        LD      A,E
        AND     7
        RRCA
        RRCA
        RRCA
        ADD     A,D
        LD      L,A

ADR     LD      DE,0000  ;УСТАНОВКА АДРЕСА
                         ;РЕЗУЛЬТИРУЮЩЕГО
                         ;БЛОКА
YL      LD      B,00   ;СЧЕТЧИК Y-ДЛИНЫ
YLOOP   PUSH    BC
        PUSH    HL

XL      LD      B,0    ;СЧЕТЧИК X-ДЛИНЫ
XLOOP   LD      A,(HL)
        LD      (DE),A
        INC     DE
        INC     DE
        INC     HL
        DJNZ    XLOOP

        POP     BC
        POP     HL

DOWN    INC     H      ;ПОНИЖЕНИЕ HL
        LD      A,H    ;НА ПИКСЕЛ ВНИЗ
        AND     7
        JR      NZ,EDOWN
        LD      A,L
        ADD     A,32
        LD      L,A
        JR      C,EDOWN
        LD      A,H
        SUB     8
        LD      H,A

EDOWN   DJNZ    YLOOP
        RET
        END
2
   В этом случае  START - начало
результирующего блока,  PCOORD -
координаты растра, MCOORD  -  то
же, только для  маски.  Величины
M- и P- COORD, XLEN - задаются в
знакоместах , а YLEN - в  пиксе-
лах.
   В  процессе  творчества,  как
говорится, рождаются новые идеи.
Вот  и  у  меня  возникла  такая
идея.  Я  попытался  разработать
собственный алгоритм расчета ад-
реса по координатам с  точностью
до пиксела. Вот что у меня полу-
чилось:
148.
        LD      C,%11100000
        LD      A,D
        AND     7
        LD      B,A  ;СМЕЩЕНИЕ ВНУТРИ
        SRL     D    ;ЛИНИИ
        SRL     D
        SRL     D
        RR      E
        RR      L
        RR      E
        RR      L
        RR      E
        RR      L
        LD      A,L
        AND     C
        OR      D
        LD      L,A       ;L - СФОРМИРОВАН
        LD      A,E
        AND     C
CTRL    OR      %01000000
        LD      H,A       ;H - СФОРМИРОВАН
        END
2
   Для своих целей алгоритм  ис-
пользует регистры A, BC, HL, DE.
Условия стандатные:
На входе - в DE коодинаты
На выходе - HL - соответствующий
адрес.
Работая с тремя старшими  битами
в  строке с  меткой  CTRL, можно
получить адрес печати  на другую
страницу памяти ZX-SPECTRUM  для
печати в буфер.

   А вот еще одна идея.
   Если вам когда нибудь придет-
ся написать что-то вроде:
148.

        XOR     A
        LD      (VAR),A
        LD      B,255
        CALL    .......
        ...............
LOOP    LD      A,(VAR)
        INC     A
        LD      (VAR),A
        DJNZ    LOOP

То такой прием можно заменить
на:
        LD      B,255
LOOP    LD      A,B
        XOR     #FF
        LD      (VAR),A
        CALL    .......
        ...............
        DJNZ    LOOP
2
Где VAR - переменная, предназна-
ченная для CALL ...... .




Другие статьи номера:

TR-DOS для начинающих - Часть 1.

Авторская разработка - General Sound - мультимедиа для ZX Spectrum!

Визитная карточка - Представляем новый электронный журнал "Major Wares" (c) Codebusters & V.M.G.

Компьютерная новелла - Knight Lore "Преданья рыцарских времен".

Новые программы - И.Рощин. HELP_Z80. В.Давыдов. Catalog's Base v1.8.

Описание оболочки журнала "ZX-РЕВЮ"

Перекресток драконов - Aavlon, Castle of Dreams, Erik the Viking.

Перекресток драконов - Eureka!, Eye of Bain, Kentilla.

Перекресток - Sherlock, Apollo, Shadows of Mordor, Rigels Revenge, Temple of Terror, ID, That's the Spirit, Return to Ithaka.

Ретро - Дж.Хардман, Э.Хьюзон. 40 лучших процедур.

Советы экспертов - Castle Master.

Советы экспертов - Firelord.

Советы экспертов - Stonkers.

Форум-игры - Insult Megademo, Catch 23, Livingstone, Rock Star ate my Hampster, НЛО-2: Дьяволы Бездны, Terminator 2, Venturama, The Spririts, Nipper, Sweewo'S World, King's Bounti-2, Hacker 2, Black Magic, Satcom, Звёздное Наследие.

Форум - А.Гура. Кодекс программиста.

Форум - А.Стрельников. Перспективы развития ZX Spectrum.

Форум - В.Давыдов. По материалам, опубликованным в ZX-РЕВЮ: Некоторые вопросы, связанные с автостартом Бейсик-программ. Redefine Keys. Процедура печати 42 символов в строке. Процедура умножения HL=B*C. Доработка посекторных загрузчиков. Мини-драйвер дисковых операций.

Форум - Группа 'Light'. Музыкальный процессор для ZX-Speccy.

Форум - Д.Федоров: Печать картинки с маской с точностью до пиксела. Алгоритм расчета адреса по координатам с точностью до пиксела.

Форум - И.Рощин. Совместное использование ZX ASM 3.0 и STS 5.1.

Форум - М.Бекарев. Расчет адреса экранной области по знакоместу и наоборот.

Форум - П.Федин. Доработка Profi для бесконфликтного подключения периферии.

Форум - С.Астров. Генератор псевдослучайных чисел.

Читатель-читателю - В.Сироткин. Защита программ (взгляд на проблему).

Читатель-читателю - И.Рощин. Драйвер экрана для компьютера "Пентагон-128".

Этюды - А.Савинов: Процедура вывода на экран символов двойной высоты. Процедура "растворения" символов.

Этюды - А.Уржа. Процедура рисования окружности.

Этюды - В.Сироткин. Программа подсчета контрольной суммы.

Этюды - Е.Волчков. Улучшение подпрограммы вычисления адреса в дисплейном файле.

Этюды - Е.Мороз. Бегущая строчка.

Этюды - И.Командин. Программа проявления экрана.

Этюды - И.Рощин. Два графических эффекта.

Этюды - М.Лазутов: Программа модернизации шрифта. Программа кодирования/декодирования блока кодов. Эффект с атрибутами.

Этюды - О.Смолянкин: Процедуры очистки экрана. Вывод текстовых сообщений на экран.


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

Похожие статьи:
ABOUT - Что DEMOBIT'96 грядущий нам готовит?
Интервью - интервью с участниками ENLiGHT'97: MMA, ALK.
Анкета - Меня зовут Пётр Марецки, я доцент Ягеллонского университета в Кракове. Мы с двумя демосценерами, Yerzmyey и Hellboj, решили написать книгу про ZX Spectrum.

В этот день...   11 июля