(c) Командин И.Г., г.Калуга

   Предлагаю  свою   программку.
Это спрайтовый скроллер  с  воз-
можностью использования спрайтов
высотой от 1 до  8  знакомест  и
шириной от 1 до 31 знакоместа.
140.
;(C) ZX-MANIACS
;SPECIAL FOR INFORCOM
3;KALUGA'1996

          ORG     40000

DX        EQU     4
DY        EQU     4
          CALL    INIT
          CALL    SCROLL
          RET
INIT      LD      HL,BUFF
          LD      DE,BUFF+1
          LD      BC,DX*DY*8-1
          LD      (HL),0
          LDIR
          LD      HL,TEXT
          LD      (TEXTP),HL
          LD      HL,41000
          LD      (FONT),HL
          XOR     A
          LD      (COL),A
          RET
SCROLL    LD      A,(COL)
          OR      A
          JR      Z,LDCOL
          DEC     A
          LD      (COL),A
          JR      NEXT
LDCOL     CALL    LDIRB
          LD      A,DX*8
          LD      (COL),A
NEXT      LD      HL,#481F    ;!
          LD      DE,BUFF+DX-1
          LD      B,DY
LOOP      PUSH    BC
          PUSH    HL
          LD      B,8
LOOP1     PUSH    BC
          PUSH    HL
          EX      DE,HL
          AND     A
          LD      B,DX
LOOP3     RL      (HL)
          DEC     HL
          DJNZ    LOOP3
          EX      DE,HL
          LD      B,32       ;!!
LOOP2     RL      (HL)
          DEC     HL
          DJNZ    LOOP2
          POP     HL
          LD      B,DX*2
LOOP4     INC     DE
          DJNZ    LOOP4
          POP     BC
          INC     H
          DJNZ    LOOP1
          POP     HL
          LD      BC,32
          ADD     HL,BC
          POP     BC
          DJNZ    LOOP
          RET
LDIRB     LD      HL,(TEXTP)
          LD      A,(HL)
          OR      A
          JR      NZ,NEXTA
          LD      HL,TEXT
          LD      (TEXTP),HL
          LD      A,32      ;!!!
          JR      NEXTB
NEXTA     INC     HL
          LD      (TEXTP),HL
NEXTB     SUB     32
          LD      H,A
          LD      C,DX*DY
          LD      L,0
          LD      B,L
          LD      A,8
L1        ADD     HL,HL
          JR      NC,L2
          ADD     HL,BC
L2        DEC     A
          JR      NZ,L1
          ADD     HL,HL
          ADD     HL,HL
          ADD     HL,HL
          LD      DE,(FONT)
          ADD     HL,DE
          LD      DE,BUFF
          LD      BC,DX*DY*8
          LDIR
          RET

COL       DEFB  DX*8
TEXTP     DEFW  TEXT
FONT      DEFW  41000
BUFF      DEFS  DX*DY*8
TEXT      DEFM  " MEGA SPRITE"
          DEFM  " SCROLL IS"
          DEFM  " WRITTEN BY"
          DEFM  " KOMANDIN ILYA"
          DEFM  " (ZX-MANIACS)"
       3   DEFM  ",KALUGA'1996"
          DEFB  0
2
   Ну а теперь некоторые аннота-
ции к этой программе.

   1. Как основа  для  программы
использовалась  бегущая   строка
Сергея Каминского  (ZX РЕВЮ  N3'
1995, стр.43-45).
   2. Также в программе  исполь-
зуется процедура  MUL_3  Алексея
Жильцова  (ZX РЕВЮ N3'1995, стр.
35-36).
   3. Хотя  размеры  спрайтов  в
процедуре  и  могут  быть  очень
большими, я бы не советовал  ис-
пользовать  спрайты  больше, чем
6x6  знакомест.  Во-первых, сим-
вольный набор для  таких  спрай-
тов занимает больше 27 килобайт,
а во-вторых, быстродействие-то у
программы  не  мгновенное.  Если
Вы работаете из Бейсика, то  Вам
придется отказаться от привычно-
го  PAUSE  1  уже  при  спрайтах
больше чем 3x3 знакоместа. Впро-
чем, в машинном коде, к счастью,
Вы сможете использовать HALT да-
же при довольно  больших  спрай-
тах.
   4. При набивании программы Вы
должны  использовать  ассемблер,
воспринимающий    математическую
операцию "умножить", или же  Вам
придется  пересчитывать  некото-
рые числа вручную, что, согласи-
тесь, не очень удобно.
   5. Как  создавать  спрайтовый
набор для скроллера  -  это  уже
Ваша забота, но я  бы  советовал
использовать программу Юрия Але-
хина (ZX РЕВЮ  1'95, стр.45).  В
принципе, ее можно  с  легкостью
переделать для  спрайтов  любого
размера.
   6. В конец  текстого  сообще-
ния, записанного начиная с  мет-
ки TEXT, программа  автоматичес-
ки записывает еще  один  пробел.
Это не чудачество автора, а  не-
обходимость, но, если Вы хотите,
чтобы выдавался не пробел, а ка-
кой-либо  иной  символ, занесите
его код в аккумулятор в  строке,
помеченной тремя восклицательны-
ми значками.
   7. Теперь настало время  рас-
сказать,  как  изменять   данные
скроллера.  Размеры  спрайта  по
горизонтали и по  вертикали  за-
даются в  переменных  DX  и  DY,
соответственно, в  самом  начале
программы.  Адрес  байта  в  эк-
ранной области, соответствующего
правому верхнему углу окна выво-
да скроллера, задается в  строке
с одним восклицательным  знаком,
а длина окна - с  двумя.  Внима-
ние!!! Следите за тем, чтобы ок-
но вывода бегущей строки не  вы-
ходило за  пределы  одной  трети
экрана, иначе будут глюки!
   8. Запускается скроллер  ана-
логично программе Сергея  Камин-
ского - см. 1-й пункт.

        С уважением, ZX-MANIACS.

          *   *   *

(c) Командин И.Г., г.Калуга

   Предлагаю процедуру  проявле-
ния экрана  горизонтальными  ли-
ниями. Предлагаю  полный  и  уп-
рощенный вариант процедуры, хотя
качество последнего  мне, честно
говоря, не нравится.
140.
;(C) ZX-MANIACS
;SPECIAL FOR INFORCOM
;
          ORG     40000
          ENT

BUFF      EQU     41000
          LD      HL,TABL
          LD      DE,TABL+1
          LD      BC,191
          LD      (HL),0
          LDIR
          LD      B,192
          LD      HL,14000    ;*
LOOP      PUSH    BC
LOOP1     PUSH    HL
          LD      A,(HL)
          CP      192
          JR      NC,CONT
          LD      HL,TABL
          LD      D,0
          LD      E,A
          ADD     HL,DE
          LD      B,A
          LD      A,(HL)
          OR      A
          JR      NZ,CONT
          INC     A
          LD      (HL),A
          LD      A,B
          LD      C,0
          CALL    8880
          LD      D,H
          LD      E,L
          LD      BC,BUFF-16384
          ADD     HL,BC
          LD      BC,32
          LDIR
          HALT
          POP     HL
          POP     BC
          DEC     HL
          DJNZ    LOOP
          LD      HL,BUFF+6144
          LD      DE,22528
          LD      BC,768
          LDIR
          RET

CONT      POP     HL
          DEC     HL
          JR      LOOP1

TABL      DEFS    192

────────────────────────────────

          ORG     40000

          LD      BC,400
          LD      HL,14000    ;*
LOOP      PUSH    BC
LOOP1     PUSH    HL
          LD      A,(HL)
          CP      192
          JR      NC,CONT
          LD      C,0
          CALL    8880
          LD      D,H
          LD      E,L
          LD      BC,BUFF-16384
          ADD     HL,BC
          LD      BC,32
          LDIR
          HALT
          POP     HL
          POP     BC
          DEC     HL
          DEC     BC
          LD      A,B
          OR      C
          JR      NZ,LOOP
          LD      HL,BUFF
          LD      DE,16384
          LD      BC,6912
          LDIR
          RET

CONT      POP     HL
          DEC     HL
          JR      LOOP1

BUFF      EQU     41000
2
   В строках, помеченных звездо-
чкой, задается адрес в  ПЗУ, ис-
пользуемом как генератор случай-
ных чисел. Изменяя  этот  адрес,
Вы сможете получить разные  пос-
ледовательности вывода картинки.

   Следующая  процедура  как  бы
складывает картинку из отдельных
линий, падающих сверху.
140.
;(C) ZX-MANIACS
;SPECIAL FOR INFORCOM
;
          ORG     40000

BUFF      EQU     41000

          LD      A,191
          LD      BC,49152
LOOP      PUSH    BC
          PUSH    AF
          CALL    8880
          LD      DE,BUFF-16384
          ADD     HL,DE
          POP     AF
          PUSH    AF
          INC     A
          LD      B,A
          XOR     A
LOOP1     PUSH    BC
          PUSH    AF
          PUSH    HL
          CALL    8880
          EX      DE,HL
          POP     HL
          PUSH    HL
          LD      BC,32
          LDIR
          POP     HL          ;*
          POP     AF
          PUSH    AF
140.          PUSH    HL
          DEC     A
          CALL    8880
          LD      D,H
          LD      E,L
          INC     DE
          LD      (HL),0
          LD      BC,31
          LDIR
          LD      B,250
PAUSE     NOP
          NOP
          DJNZ    PAUSE      ;**
          POP     HL
          POP     AF
          INC     A
          POP     BC
          DJNZ    LOOP1
          POP     AF
          DEC     A
          POP     BC
          DJNZ    LOOP
          LD      HL,BUFF+6144
          LD      DE,22528
          LD      BC,768
          LDIR
          RET
2
   Скорость падения линий  можно
менять, изменяя число  в  строке
перед  меткой  PAUSE.  При   ма-
ленькой задержке  изображение  у
меня начинало заметно дрожать. В
принципе, я склонен отнести  все
это  к  чудачествам  моего  ком-
пьютера (у меня, например, очень
сильно  дрожит  экран  в   LASER
SQUAD), но  кто  знает...   Если
стереть все  строки, начиная  со
строки, помеченной звездочкой, и
вплоть до строки с  двумя  звез-
дочками (включительно), то полу-
чится  самая  короткая  из  ког-
да-либо предлагавшихся  программ
"наливания" экрана.

   Следующая программа проявляет
экран довольно замороченным  об-
разом, поэтому я  даже  не  буду
пытаться описывать  ее  действие
словами. Могу лишь  посоветовать
поизменять  число  в  строке  со
звездочкой  и   посмотреть,  что
выйдет (попробуйте поставить ту-
да, например, число 190).
140.
;(C) ZX-MANIACS
;
          ORG     40000

BUFF      EQU     41000

          LD      B,192
          LD      HL,#4000
          LD      DE,22497
LOOP      PUSH    BC
          PUSH    HL
          PUSH    DE
          LD      A,255       ;*
          LD      B,16
LOOP1     LD      (HL),A
          INC     HL
          INC     HL
          LD      (DE),A
          INC     DE
          INC     DE
          DJNZ    LOOP1
          POP     DE
          CALL    UP
          POP     HL
          CALL    DOWN
          POP     BC
          HALT
          DJNZ    LOOP
          LD      HL,#4001
          LD      DE,22496
          LD      B,192
LOOP2     PUSH    BC
          PUSH    HL
          PUSH    DE
          LD      B,16
LOOP3     PUSH    BC
          LD      BC,BUFF-16384
          ADD     HL,BC
          LD      A,(HL)
          SBC     HL,BC
          LD      (HL),A
          INC     HL
          INC     HL
          EX      DE,HL
          ADD     HL,BC
          LD      A,(HL)
          SBC     HL,BC
          LD      (HL),A
          EX      DE,HL
          INC     DE
          INC     DE
          POP     BC
          DJNZ    LOOP3
          POP     DE
          CALL    UP
          POP     HL
          CALL    DOWN
          POP     BC
          HALT
          DJNZ    LOOP2
          LD      HL,BUFF+6144
          LD      DE,22528
          LD      BC,768
          LDIR
          RET
DOWN      INC     H
          LD      A,H
          AND     7
          RET     NZ
          LD      A,L
          ADD     A,32
          LD      L,A
          RET     C
          LD      A,H
          SUB     8
          LD      H,A
          RET
UP        DEC     D
          LD      A,D
          AND     7
          CP      7
          RET     NZ
          LD      A,E
          SUB     32
          LD      E,A
          RET     C
          LD      A,D
          ADD     A,8
          LD      D,A
          RET
2
          *   *   *

