Aspect #06
10 февраля 1998

Программирование - Исправленная процедура MAKE OUT.

<b>Программирование</b> - Исправленная процедура MAKE OUT.
Прежде всего сообщаю всем,кто использовал
процедуру  MAKEOUT, что  в  ней   найдена
ошибка, вот текст исправленной процедуры:

;ВХОД :
;  HL - АДРЕС ПРОЦЕДУРЫ ВЫВОДА
;  D  - ВЕРХНЯЯ  ПОЗИЦИЯ ПО Y
;  E  - ЛЕВАЯ ПОЗИЦИЯ ПО X
;  B  - ВЫСОТА ВИРТУАЛЬНОГО ЭКРАНА
; (В ТЕКСТОВЫХ КООРДИНАТАХ)
;  C  - ДЛИНА ВИРТУАЛЬНОГО ЭКРАНА/2
; (ТОЖЕ В ТЕКСТВЫХ КООРДИНАТАХ)
;ВЫХОД : НЕТ

MAKOUT
   LD   (HL),#21
   XOR   A
   DUP   2
   INC   HL
   LD   (HL),A
   EDUP
   INC   HL
   LD   (HL),#39
   INC   HL
   LD   (HL),#EB
   INC   HL
   LD   (HL),#F9
   INC   HL
MAKOUT1
   PUSH   DE
   LD   A,D
   DUP   3
   RRCA
   EDUP
   AND   #E0
   ADD   A,E
   LD   E,A
   LD   A,D
   AND   #18
   OR   #40
   LD   D,A
   LD   A,8
MAKOUT2
   PUSH   BC
   PUSH   DE
MAKOUT3
   LD   (HL),#E1
   INC   HL
   LD   (HL),#22
   INC   HL
   LD   (HL),E
   INC   HL
   LD   (HL),D
   INC   HL
   INC   E      ; <- здесь был только один INC E
   INC   E 
   DEC   C
   JR   NZ,MAKOUT3
   POP   DE
   POP   BC
   INC   D
   DEC   A
   JR   NZ,MAKOUT2
   POP   DE
   INC   D
   DJNZ   MAKOUT1
   LD   (HL),#EB
   INC   HL
   LD   (HL),#F9
   INC   HL
   LD   (HL),#C9
   RET

Ну вот, а  теперича  обещанная  процедура
вывода спрайта 16*12 на весь экран, т. е.
на экране будет  четыре  спрайта  16*12 :

   ORG   #61A8
   CALL   ZAPTAB      ;заполним таблицу адресов
   CALL   ZAPOLN      ;сделаем процедуру вывода
   DI
   LD   DE,SPRADRES   ;адрес вашего спрайта
   CALL   SPEEDOUT   ;выводим его
   EI
   RET

; ЗДЕСЬ ДЕЛАЕТСЯ ПРОЦЕДУРА ВЫВОДА

ZAPOLN
   LD   HL,SPEEDOUT 
   LD   BC,#0C00   ;ВЫСОТА 12
   LD   (HL),#21   ;LD HL,0
   INC   HL
   LD   (HL),C
   INC   HL
   LD   (HL),C
   INC   HL
   LD   (HL),#39   ;ADD HL,SP
   INC   HL
   LD   (HL),#EB   ;EX DE,HL
   INC   HL
   LD   (HL),#F9   ;LD SP,HL
   INC   HL
   CALL   ZAPOUT      ;ЗАПОЛНЯЕМ ПРОЦЕДУРУ ВЫВОДА
   LD   (HL),#EB   ;EX DE,HL
   INC   HL
   LD   (HL),#F9   ;LD SP,HL
   INC   HL
   LD   (HL),201   ;RET
   RET

;B-ВЫСОТА ЭКРАНА В ТЕКСТ.КООРДИНАТАХ
;C-НАЧАЛЬНАЯ ПОЗИЦИЯ ПО ВЕРЫИКАЛИ
;HL-АДРЕС ПРОЦЕДУРЫ ВЫВОДА

ZAPOUT
   LD   IX,TABLE   ;ТАБЛИЦА АДРЕСОВ В IX
   DI
   PUSH   IY
   LD   IY,TABLE   ;ТО ЖЕ НО В IY
   LD   E,C
   LD   D,0
   EX   DE,HL      ;HL=HL*8
   ADD   HL,HL
   ADD   HL,HL
   ADD   HL,HL
   ADD   HL,HL
   EX   DE,HL
   ADD   IX,DE      ;НАЧАЛЬНЫЙ АДРЕС В ТАБЛИЦЕ
   ADD   IY,DE
   LD   DE,192      ;СМЕЩАЕМ НА ПОЛЭКРАНА
   ADD   IY,DE
   LD   E,D ;DE=0
ZAPOUT3
   ADD   IX,DE      ;ПЕРЕХОД К СЛЕДУЮЩЕЙ
   ADD   IY,DE      ;СТРОКЕ
   LD   E,(IX)
   LD   D,(IX+1)
   PUSH   DE
   LD   (__DE),DE
   LD   E,(IY)
   LD   D,(IY+1)

   LD   C,8      ;8 БАЙТ В СИМВОЛЕ
ZAPOUT1
   PUSH   DE
   LD   A,8
ZAPOUT2
   LD   (HL),#E1   ;POP HL
   INC   HL
   LD   (HL),#22   ;LD (ADDR1),HL
   INC   HL
   LD   (HL),E
   INC   HL
   LD   (HL),D
   INC   HL
   EX   AF,AF'      ;ВЫВОД В СЛЕДУЮЩУЮ ЧЕТВЕРТЬ
   LD   A,E      ;ЭКРАНА
   ADD   A,#10      ;+16
   LD   E,A
   LD   (HL),#22   ;LD (ADDR1+16),HL
   INC   HL
   LD   (HL),E
   INC   HL
   LD   (HL),D
   INC   HL
   SUB   #E      ;-14=-16+2
   LD   E,A
   LD   (_DE),DE
   LD   DE,(__DE)   ;АНАЛОГИЧНО...
   LD   (HL),#22   ;LD (ADDR2),HL
   INC   HL
   LD   (HL),E
   INC   HL
   LD   (HL),D
   INC   HL
   LD   A,E
   ADD   A,#10 ;+16
   LD   E,A
   LD   (HL),#22   ;LD (ADDR2+16),HL
   INC   HL
   LD   (HL),E
   INC   HL
   LD   (HL),D
   INC   HL
   SUB   #E      ;-14=-16+2
   LD   E,A
   LD   (__DE),DE
   LD   DE,(_DE)
   EX   AF,AF'
   DEC   A
   JR   NZ,ZAPOUT2   ;И ТАК 8 РАЗ...
   POP   DE
   INC   D
   LD   (__DE),DE
   EX   DE,HL
   EX   (SP),HL
   EX   DE,HL
   INC   D
   DEC   C
   JR   NZ,ZAPOUT1   ;ТАК ТОЖЕ 8 РАЗ...
   POP   DE
   LD   DE,16
   DJNZ   ZAPOUT3      ;ПЕРЕХОД К СЛЕДУЮЩЕЙ СТРОКЕ
   POP   IY
   EI
   RET
_DE   DEFW   0
__DE   DEFW   0

;ЗАПОЛНЕНИЕ ТАБЛИЦЫ АДРЕСОВ

ZAPTAB
   LD   IX,TABLE
   LD   HL,#4000
   CALL   ZAPADR
   LD   HL,#4800
   CALL   ZAPADR
   LD   HL,#5000
   CALL   ZAPADR
   LD   (IX),#FF
   LD   (IX+1),#FF
   LD   (IX+2),#FF
   RET
ZAPADR
   LD   DE,#20
   LD   C,8
ZAPAD2
   PUSH   HL
   LD   B,8
ZAPAD1
   LD   (IX),L
   LD   (IX+1),H
   INC   IX
   INC   IX
   INC   H
   DJNZ   ZAPAD1
   POP   HL
   ADD   HL,DE
   DEC   C
   JR   NZ,ZAPAD2
   RET
TABLE   DEFS   5000
SPEEDOUT

Собственно, аналогично строятся процедуры
для вывода спрайтов 2*2,4*4, 8*8, и т. д.
Кстати   спрайты   можно   выводить    не
изготовля процедуры вывода.Вот ,например,
код процедуры  выводящей  два  спрайта  в
шахматном порядке в треть экрана ,спрайты
размером 4*4 :

; BC - АДРЕС 1-ГО СПРАЙТА
; DE - АДРЕС 2-ГО СПРАЙТА
; HL - АДРЕС ТРЕТИ ЭКРАНА

SPROUT
   LD   (SPROUT1+1),BC
   DI
   LD   (SPROUT2+1),DE
   LD   (SPSAVE+1),SP   ;СОХРАНЯЕМ УКАЗАТЕЛЬ СТЕКА
   LD   DE,#0800   ;ВЫВОД С КОНЦА ТРЕТИ ЭКРАНА
   ADD   HL,DE
   LD   (SPROUT3+1),HL
   LD   DE,-#80      ;ПОЛОВИНА ТРЕТИ ЭКРАНА
   ADD   HL,DE
   LD   (SPROUT4+1),HL
   LD   D,H
   LD   E,#20      ;СМЕщЕНИЕ НА СТРОКУ
   LD   C,4
SPROUT5
   LD   B,8      ;8 БАЙТОВ В СИМВОЛЕ
NEXTSPP
   EXX         ;ЧТО НУЖНА СОХРАНЯМЕ,ОДНАКА 
   EX   AF,AF'
SPROUT1
   LD   SP,00      ;ЗДЕСЬ БУДЕТ АДРЕС СПРАЙТА
   POP   AF      ;БЕРЕМ ДАННЫЕ
   POP   BC
   LD   (SPROUT1+1),SP   ;СОХРАНЕМ ПОЗИЦИЮ
SPROUT2
   LD   SP,00      ;АНАЛОГИЧНО ДЛЯ 2-ГО СПРАЙТА
   POP   DE
   POP   HL
   LD   (SPROUT2+1),SP
SPROUT3
   LD   SP,0      ;АДРЕС ВЫВОДА
   DUP   4
   PUSH   DE      ;КЛАДЕМ ДАННЫЕ В ШАХМАТНОМ 
   PUSH   HL      ;ПОРЯДКЕ
   PUSH   AF
   PUSH   BC
   EDUP
SPROUT4
   LD   SP,0      ;ТО ЖЕ НО В ДРУГУЮ
   DUP   4      ;ПОЛОВИНУ ТРЕТИ ЭКРАНА
   PUSH   AF
   PUSH   BC
   PUSH   DE
   PUSH   HL
   EDUP
   EX   AF,AF'
   EXX         ;ВОССТАНАВЛИВАЕМСЯ
   LD   A,(SPROUT3+2)   ;ВСЕ ВЫШЕ
   DEC   A      ;ВЫШЕ И ВЫШЕ
   LD   (SPROUT3+2),A
   LD   A,(SPROUT4+2)
   DEC   A
   LD   (SPROUT4+2),A
   DJNZ   NEXTSPP
   LD   HL,(SPROUT4+1)
   LD   H,D
   LD   A,L
   SUB   E
   LD   L,A
   LD   (SPROUT4+1),HL
   LD   A,(SPROUT3+1)
   SUB   E
   LD   L,A
   LD   (SPROUT3+1),HL
   DEC   C
   JP   NZ,SPROUT5
SPSAVE
   LD   SP,0      ;ВОССТАНАВЛИВАЕМ СТЕК
   EI
   RET

А вот и пример обращения к ней:

   LD   HL,#4800   ;СЕРЕДИНКА ЭКРАНА
   LD   DE,SPR1
   LD   BC,SPR2
   CALL   SPROUT

Мда, ну а теперича я покажу другой прикол
с процедурой быстрой графики :

   ORG   #61A8
   LD   HL,#4000   ;ЧИСТИМ ЭКРАН
   LD   DE,#4001
   LD   BC,6144
   LD   (HL),L
   LDIR
   LD   BC,767      ;INK 7:PAPER 0:BRIGHT 1
   LD   (HL),71
   LDIR
   LD   HL,15616   ;ПОИЗДЕВАЕМСЯ НАД ФОНТОМ
   LD   DE,FONT
   LD   BC,768
   PUSH   DE
   LDIR
   POP   HL
   PUSH   HL
   LD   BC,#6060
PREOBR1
   PUSH   BC
   SUB   A
   LD   B,A
   SET   2,B
   DUP   4
   INC   HL
   EDUP
PREOBR2
   LD   A,(HL)
   LD   C,A
   SLA   A
   OR   C
   LD   (HL),A
   INC   HL
   DJNZ   PREOBR2
   POP   BC
   DJNZ   PREOBR1
   POP   HL
   LD   (FONT32+1),HL 
   LD   HL,#C000   ;ЧИСТИМ ВИРТУАЛЬНЫЙ ЭКРАН
   LD   DE,#C001
   LD   BC,#4000
   LD   (HL),0
   LDIR
   LD   HL,#C600   ;НАЧАЛЬНАЯ ПОЗИЦИЯ 
   LD   (INT3+1),HL
   LD   HL,SPEED   ;СТРОИМ ПРОЦЕДУРУ ВЫВОДА
   LD   DE,#800      ;Y=8,X=0
   LD   BC,#1010   ;В ВЫСОТУ 16,А В ДЛИНУ 32 !
   CALL   MAKOUT
   LD   HL,INTERR   ;СТАВИМ СВОЙ ОБРАБОТЧИК
   CALL   IMON      ;ПРЕРЫВАНИЙ
   LD   HL,TEXT0   ;ПЕЧАТАЕМ ТЕКСТ ВО 2-Й
   LD   DE,#C820   ;ПОЛОВИНЕ ВИРТ.ЭКРАНА
   LD   C,#20      ;СЛЕЩЕНИЕ
   CALL   VIRTWRITE   ;ПРОЦЕДУРА ВЫВОДА ТЕКСТА
   LD   A,#1C      ;НА ВИРТ. ЭКРАН
   PUSH   AF      ;ВСЯКОГО РОДА УСТАНОВКИ
   PUSH   HL
   LD   (INT4),A
   LD   A,C
   LD   (INT5+1),A
   LD   A,1
   LD   (INT1+1),A
WAITER
   EI         ;ЖДЕМ КНОПОЧКУ
   HALT
   LD   A,#7F      ;ЭНТО SPACE
   IN   A,(#FE)
   BIT   0,A
   JR   Z,WAITER1
   LD   A,#BF      ;А ЭТО ENTER
   IN   A,(#FE)
   BIT   0,A
   JP   NZ,WAITER
   LD   A,C      ;МЕНЯЕМ ПОЛОВИНКИ ВИРТ.ЭКРАНА
   XOR   #20
   LD   C,A
   LD   E,A
   LD   D,#C8
   CALL   VIRTCLEAR   ;ЧИСТИМ ПОЛОВИНКУ
   POP   HL
   LD   A,(HL)      ;ЕСЛИ 1 ТО КОНЕЦ ТЕКСТА
   DEC   A
   JP   NZ,WAITER2
   LD   HL,TEXT0   ;А ЕСЛИ КОНЕЦ ТЕКСТА,ТО
            ;НАДО ПЕРЕЙТИ НА НАЧАЛО
WAITER2
   CALL   VIRTWRITE   ;ПЕЧАТАЕМ
   POP   AF
   XOR   1
   PUSH   AF
   PUSH   HL
   LD   (INT4),A   ;ПЕРЕУСТАНАВЛИВАЕМСЯ
   LD   A,C
   LD   (INT5+1),A
   LD   A,1
   LD   (INT1+1),A
   LD   B,33      ;ЖДАТЬ ПОКА ЭКРАН НЕ ПОЯВИТСЯ
WAITER0
   EI
   HALT
   DJNZ   WAITER0
   JR   WAITER
WAITER1
   POP   HL      ;КОНЕЦ
   POP   AF      ;ДЕЛУ ВЕНЕЦ
   DI         ;ВОССТАНАВЛИВАЕМ ПРЕРЫВАНИЯ
   LD   A,63
   LD   I,A
   IM   1
   EI
   RET         ;ВЫХОДИМ-С

; ПРОЦЕДУРА  УСТаНОВКИ  СВОИХ  ПРЕРЫВАНИЙ
; НА ВХОДЕ HL - АДРЕС ПРОЦЕДУРЫ ОБРАБОТКИ

IMON   DI
   LD   A,24      ;JR 65524
   LD   (65535),A
   LD   A,195      ;JP ADDR
   LD   (65524),A
   LD   (65525),HL
   LD   HL,#FE00   ;ЭНТО ДЛЯ ПРЫГАЮЩЕГО INTА
   LD   DE,#FE01
   LD   BC,256
   LD   A,H
   LD   (HL),#FF
   LDIR
   DI
   LD   I,A
   IM   2
   EI
   RET

;ПРОЦЕДУРА ОБРАБОТКИ ПРЕРЫВАНИЙ

INTERR
   PUSH   AF      ;СОХРАНЯЕМСЯ
   PUSH   HL
   PUSH   DE
   PUSH   BC
INT1   LD   A,0      ;РАЗРЕШЕНО ЛИ ДВИГАТЬСЯ ?
   AND   A
INT3   LD   DE,0
   JR   Z,INT7
INT4   INC   E      ;ДА ,РАЗРЕШЕНО=> ДВИГАЕМ
INT7   LD   HL,128      ;СМЕЩАЕМ НА 4 ПИКСЕЛЯ 
   ADD   HL,DE
   EX   DE,HL
   LD   (INT3+1),DE
   LD   A,E 
   AND   #3F      ;МЫ ДОСТИГЛИ ЦЕЛИ ?
INT5   CP   #20
   JP   NZ,INT6
   XOR   A      ;ДА,БОЛЬШЕ ДВИГАТЬ НЕ НАДА !
   LD   (INT1+1),A
INT6   LD   A,D 
INT8   CP   #C8
   JP   NZ,INT9
   LD   A,(INT7+2)
   XOR   #FF
   LD   (INT7+2),A
   LD   A,(INT8+1)
   XOR   12
   LD   (INT8+1),A
INT9   CALL   SPEED      ;ВЫВОДИМ-С
   POP   BC
   POP   DE
   POP   HL
   POP   AF
   EI
   RET

;ОЧИСТКА ЧАСТИ ВИРТУАЛЬНОГО ЭКРАНА
;НА ВХОДЕ DE - АДРЕС ПОЛОВИНКИ

VIRTCLEAR
   PUSH   DE
   PUSH   BC
   LD   BC,#8020   ;В ВЫСОТУ 128,В ДЛИНУ 32
   EX   DE,HL
   LD   E,#20      ;СМЕЩЕНИЕ
   LD   D,0
VIRTC1
   PUSH   BC
VIRTC2
   LD   (HL),D
   INC   HL
   DEC   C
   JP   NZ,VIRTC2
   ADD   HL,DE
   POP   BC
   DJNZ   VIRTC1
   POP   BC
   POP   DE
   RET

; ВЫВОД ТАКСТА НА ВИРТ. ЭКРАН
;ВХОД HL - АДРЕС ТЕКСТА
;DE - АДРЕС ПОЛОВИНКИ ВИРТ.ЭКРАНА  
;C - СМЕЩЕНИЕ 0 ИЛИ 32

VIRTWRITE
   LD   A,(HL)      ;БЕРЕМ КОД СИМВОЛА
   INC   HL
   AND   A      ;КОНЕЦ ТЕКСТА ?
   RET   Z      ;ДА !!!
   CP   #0D      ;ПЕРЕВОД СТРОКИ
   JR   Z,VIRTWR1   ;ДА !!!
   CALL   PRSYM      ;ВЫВОДИМ СИМВОЛ
   LD   A,E      ;ДОСТИЖЕНИЕ КОНЦА СТРОКИ
   AND   #1F
   CP   #1F
   JR   Z,VIRTWR1   ;ДОКАТИЛИСЬ...
   INC   E 
   JP   VIRTWRITE   ;ВСЕ ЕЩЕ ВПЕРЕДИ !
VIRTWR1
   INC   D      ;ДЕЛАЕМ INC D ДВА РАЗА
   INC   D      ;Т.К. У НАС ДВА ЭКРАНА
   LD   E,C
   JP   VIRTWRITE   ;ПРОДОЛЖИМ-С

;ВЫВОД СИМВОЛА НА ВИРТ.ЭКРАН

PRSYM   PUSH   HL
   PUSH   BC
   PUSH   DE
   SUB   #20
FONT32
   LD   DE,15616   ;ЗДЕСЬ БУДЕТ АДРЕС ФОНТА
   LD   L,A
   LD   H,0
   ADD   HL,HL
   ADD   HL,HL
   ADD   HL,HL
   ADD   HL,DE
   LD   C,L
   LD   B,H
   POP   HL
   PUSH   HL
   LD   DE,#40
   DUP   8
   LD   A,(BC)
   INC   BC
   LD   (HL),A
   ADD   HL,DE
   EDUP
   POP   DE
   POP   BC
   POP   HL
   RET

;ВХОД :
;  HL - АДРЕС ПРОЦЕДУРЫ ВЫВОДА
;  D  - ВЕРХНЯЯ  ПОЗИЦИЯ ПО Y
;  E  - ЛЕВАЯ ПОЗИЦИЯ ПО X
;  B  - ВЫСОТА ВИРТУАЛЬНОГО ЭКРАНА
; (В ТЕКСТОВЫХ КООРДИНАТАХ)
;  C  - ДЛИНА ВИРТУАЛЬНОГО ЭКРАНА/2
; (ТОЖЕ В ТЕКСТВЫХ КООРДИНАТАХ)
;ВЫХОД : НЕТ

MAKOUT
   LD   (HL),#21   ;LD HL,0
   XOR   A
   DUP   2
   INC   HL
   LD   (HL),A
   EDUP
   INC   HL
   LD   (HL),#39   ;ADD HL,SP
   INC   HL
   LD   (HL),#EB   ;EX DE,HL
   INC   HL
   LD   (HL),#F9   ;LD SP,HL
   INC   HL
MAKOUT1
   PUSH   DE
   LD   A,D
   DUP   3
   RRCA
   EDUP
   AND   #E0
   ADD   A,E
   LD   E,A
   LD   A,D
   AND   #18
   OR   #40
   LD   D,A
   LD   A,8
MAKOUT2
   PUSH   BC
   PUSH   DE
MAKOUT3
   LD   (HL),#E1   ;POP HL
   INC   HL
   LD   (HL),#22   ;LD (ADDR),HL
   INC   HL
   LD   (HL),E
   INC   HL
   LD   (HL),D
   INC   HL
   INC   E
   INC   E
   DEC   C
   JR   NZ,MAKOUT3
   LD   (HL),#21   ;LD HL,#20
   INC   HL
   LD   (HL),#20
   INC   HL
   LD   (HL),C
   INC   HL
   LD   (HL),#39   ;ADD HL,SP
   INC   HL
   LD   (HL),#F9   ;LD SP,HL
   INC   HL
   POP   DE
   POP   BC
   INC   D
   DEC   A
   JR   NZ,MAKOUT2
   POP   DE
   INC   D
   DJNZ   MAKOUT1
   LD   (HL),#EB   ;EX DE,HL
   INC   HL
   LD   (HL),#F9   ;LD SP,HL
   INC   HL
   LD   (HL),#C9   ;RET
   RET

; ТЕКСТ ДЛЯ ВЫВОДА ФОРМАТ:
;  ЛЮБЫЕ СИМВОЛЫ,#0D - ПЕРЕВОД СТРОКИ,
;  0 - КОНЕЦ СТРАНИЦЫ,1 КОНЕЦ ТЕКСТА

TEXT0   DEFS   32,"+"
   DEFB   "+         +"
   DEFB   "+      HELLO  SPBZXNET !!!     +"
   DEFB   "+         +"
   DEFB   "+        TRSOFT PRESENT      +"
   DEFB   "+         +"
   DEFB   "+       THIS MOVING TEXT      +"
   DEFB   "+         +"
   DEFB   "+      TO EXIT PRESS SPACE     +"
   DEFB   "+         +"
   DEFB   "+ AND PRESS ENTER TO NEXT PAGE +"
   DEFB   "+         +"
   DEFB   "+         +"
   DEFS   32,"+"
   DEFB   0
   DEFB   " H  H  EEEE  L   L  OO   "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " HHHH  EEE   L   L O  O  "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " H  H  E     L   L O  O  "
   DEFB   " H  H  EEEE  LLLL  LLLL  OO   "
   DEFB   0,1,1
FONT   DEFS   768
SPEED

Понаяли, почему такая скорость ? Да очень
просто ! Текст никуда не двигается  и  не
скроллируется, а только меняется адрес  в
процедуре вывода,а изменить адрес намного
короче  и  быстрее, чем  скроллировать  и
сдвигать.Вот еще один пример :

   ORG   #61A8
   LD   HL,SPEED    ;ДЕЛАЕМ ПРОЦЕДУРУ ВЫВОДА
   LD   DE,#400
   LD   BC,#0F10
   CALL   MAKOUT
   LD   HL,#C000    ;ЧИСТИМ ВИРТ.ЭКРАН
   LD   DE,#C001
   LD   BC,#3FFF
   LD   (HL),0
   LDIR
   LD   HL,#4000    ;ЧИСТИМ ЭКРАН
   LD   DE,#4001
   LD   BC,6143
   LD   (HL),0
   LDIR
   LD   HL,#5800    ;УСТАНАВЛИВАЕМ АТРИБУТЫ
   LD   DE,#5801
   LD   BC,767
   LD   (HL),71
   LDIR
   LD   HL,INTERR   ;СТАВИМ СВОЙ ОБРАБОТЧИК 
   CALL   IMON      ;ПРЕРЫВАНИЙ
   LD   HL,TEXT      ;ПЕЧАТАЕМ ТЕКСТ
   LD   DE,#D000   ;ТЕЛЕТАЙПОМ
   LD   C,0
   LD   B,C
   CALL   T_TAPE
   XOR   A
   LD   (23560),A
MECH   EI
   HALT
   LD   A,(23560)
   JR   Z,MECH
   RET

;ПРОЦЕДУРА ПЕЧАТИ ТЕЛЕТАЙПОМ

T_TAPE
   LD   A,(HL)      ;КОНЕЦ ТЕКСТА ?
   INC   HL
   AND   A
   JR   Z,T_TAPE0   ;ДА !
   CP   #0D      ;ПЕРЕВОД СТРОКИ ?
   JR   Z,NEXTLINE0   ;ДА !
   CALL   PRINS      ;ВЫВОД СИМВОЛА
   INC   E 
   LD   A,E
   BIT   5,E
   JR   Z,T_TAPE1
   JR   NEXTLINE
T_TAPE0
   LD   A,32      ;ЗАТИРАЕМ КУРСОР
   CALL   PRINS 
   RET         ;И ВЫХОДИМ
NEXTLINE0
   LD   A,32      ;ЗАТИРАЕМ КУРСОР
   CALL   PRINS
NEXTLINE
   INC   D
   INC   D
   INC   D
   LD   E,C
T_TAPE1
   LD   A,"@"      ;ВЫВОДИМ КУРСОР
   CALL   PRINS
   EI
   HALT         ;ЖДЕМ-С
   HALT
   HALT
   JR   T_TAPE

;ПРОЦЕДУРА ОБРАБОТКИ ПРЕРЫВАНИЙ

INTERR
   DI 
   PUSH   HL
   PUSH   DE
   PUSH   AF
INT1   LD   HL,#D000   ;НАЧАЛЬНАЯ ПОЗИЦИЯ
INT0   LD   A,1
   DEC   A
   LD   (INT0+1),A
   JP   NZ,INT3
   LD   A,1
   LD   (INT0+1),A
INT2   INC   H      ;СКРОЛЛИРУЕМСЯ
   LD   (INT1+1),HL
   LD   A,H
INT4   CP   #E0      ;ДО ОПРЕДЕЛЕННЫХ ПРЕДЕЛОВ
   JP   NZ,INT3      ;КОНЕЧНО
   LD   A,(INT2)
   XOR   1
   LD   (INT2),A
   LD   A,(INT4+1)
   XOR   32
   LD   (INT4+1),A
INT3   EX   DE,HL
   CALL   SPEED      ;ВЫВОДИМ
   POP   AF
   POP   DE
   POP   HL
   EI
   RET
PRINS   PUSH   HL
   PUSH   BC
   PUSH   DE
   SUB   #20
   LD   L,A
   LD   H,0
   ADD   HL,HL
   ADD   HL,HL
   ADD   HL,HL
   LD   DE,15616
   ADD   HL,DE
   EX   DE,HL
   POP   HL
   PUSH   HL
   LD   C,E
   LD   B,D
   LD   DE,32
   DUP   8
   LD   A,(BC)
   INC   BC
   DUP   2
   LD   (HL),A
   ADD   HL,DE
   EDUP
   LD   (HL),D
   ADD   HL,DE
   EDUP
   POP   DE
   POP   BC
   POP   HL
   RЕТ

;НУ А ЭТО ПРОЦЕДУРА ПОСТРОЕНИЯ ПРОЦЕДУРЫ
;ВЫВОДА !!!

;ВХОД:
;  HL - АДРЕС ПРОЦЕДУРЫ ВЫВОДА
;  D  - ВЕРХНЯЯ  ПОЗИЦИЯ ПО Y
;  E  - ЛЕВАЯ ПОЗИЦИЯ ПО X
;  B  - ВЫСОТА ВИРТУАЛЬНОГО ЭКРАНА
; (В ТЕКСТОВЫХ КООРДИНАТАХ)
;  C  - ДЛИНА ВИРТУАЛЬНОГО ЭКРАНА/2
; (ТОЖЕ В ТЕКСТВЫХ КООРДИНАТАХ)
;ВЫХОД : НЕТ

MAKOUT
   LD   (HL),#21   ;LD HL,0
   XOR   A
   DUP   2
   INC   HL
   LD   (HL),A
   EDUP
   INC   HL
   LD   (HL),#39   ;ADD HL,SP
   INC   HL
   LD   (HL),#EB   ;EX DE,HL
   INC   HL
   LD   (HL),#F9   ;LD SP,HL
   INC   HL
MAKOUT1
   PUSH   DE
   LD   A,D
   DUP   3
   RRCA
   EDUP
   AND   #E0
   ADD   A,E
   LD   E,A
   LD   A,D
   AND   #18
   OR   #40
   LD   D,A
   LD   A,8
MAKOUT2
   PUSH   BC
   PUSH   DE
MAKOUT3
   LD   (HL),#E1   ;POP HL
   INC   HL
   LD   (HL),#22   ;LD (ADDR),HL
   INC   HL
   LD   (HL),E
   INC   HL
   LD   (HL),D
   INC   HL
   INC   E
   INC   E
   DEC   C
   JR   NZ,MAKOUT3
   POP   DE
   POP   BC
   INC   D
   DEC   A
   JR   NZ,MAKOUT2
   POP   DE
   INC   D
   DJNZ   MAKOUT1
   LD   (HL),#EB   ;EX DE,HL
   INC   HL
   LD   (HL),#F9   ;LD SP,HL
   INC   HL
   LD   (HL),#C9   ;RET
   RET
;БЕЗ КОММЕНТАРИЕВ
IMON   DI
   LD   A,24
   LD   (65535),A
   LD   A,195
   LD   (65524),A
   LD   (65525),HL
   LD   HL,#FE00
   LD   DE,#FE01
   LD   BC,256
   LD   A,H
   LD   (HL),#FF
   LDIR
   DI
   LD   I,A
   IM   2
   EI
   RET

TEXT   DEFS   32,"*"
   DEFB   "*      HELLO SPBZXNET !!!"
   DEFB   "     *"
   DEFB   "*    WRITTEN BY TRUSOV ILYA"
   DEFB   "   *"
   DEFS   32,"*"
   DEFB   0
SPEED

Да, не поймите что  таким  макаром  можно
выводить только  монохромные  картинки, с
цветными можно поступать абсолютно также.
Кстати тем же макаром можно  организовать
скроллер - т. е. текст сначала  полностью
выводится а затем при нажатии  на  кнопки
лишь  меняется   адрес   на   виртуальном
экране. Так  что   скроллинг   происходит
оочень быстро. Кстати можно строить вывод
при помощи команд LD и PUSH :

;ПРОЦЕДУРА ВЫВОДА  СПРАЙТА  2X1  НА  2/3
;ЭКРАНА СНИЗУ
;ВХОДНЫЕ ДАНЫЕ : DE - АДРЕС СПРАЙТА + 16
;ВЫХОДНЫЕ ДАНЫЕ : НЕТ

P2X2   LD   HL,#5800   ;ВЫВОД НИЖНЮЮ ТРЕТЬ 
   LD   (P2X2_0+1),HL
   LD   H,#50      ;ВЫВОД ВО ВТОРУЮ ТРЕТЬ
   LD   (P2X2_1+1),HL
   EX   DE,HL
   LD   (P2X2_4+1),SP   ;СОХРАНЯЕМ УКАЗАТЕЛЬ НА СТЕК
   LD   A,8      ;ВОСЕМЬ БАЙТ В СИМВОЛЕ
   DEC   HL
P2X2_3
   LD   D,(HL)      ;БЕРЕМ ИСХОДНЫЕ ДАННЫЕ
   DEC   HL
   LD   E,(HL)
   DEC   HL
P2X2_0
   LD   SP,0
   DUP   128      ;ВЫВОДИМ 
   PUSH   DE
   EDUP
   LD   (P2X2_0+1),SP
P2X2_1
   LD   SP,0
   DUP   128      ;И ЕщЕ РАЗ,НО В ДРУГУЮ ЧАСТЬ
   PUSH   DE
   EDUP
   LD   (P2X2_1+1),SP
   DEC   A
   JP   NZ,P2X2_3
P2X2_4
   LD   SP,0
   RET

Ну вот,собственно,пора с быстрой графикой
кончать : основные принципы вы знаете , а
дальше можно извращатьса как душе  угодно
и хоть до бесконечности...

                          (C) Trusov Ilya




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

BBS-Лист - Список Vicomm-совместимых BBS.

Новости - О BBS-альянсе.

От авторов - Оживление в RU.ZXNET.GENERAL.

Праздник - День рождения московской сети ZXNet.

Программирование - Исправленная процедура MAKE OUT.

Сделай сам - Выходная мощность каналов музыкального процессора.

Хит-парад - Хит-парад игр за январь-февраль.

Чайнику - Что такое Tosser - UZTosser.

Юмор - Прикладная мерфология.


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

Похожие статьи:
Интервью - Интервью с CC'000. MADCAT/THE MAD MAILMEN LEAGUE.
Fractal - Fractal Expression объединяет векторную графику с растровой.
Лит. страничка - Гриф "Y-II" (Дневник).
C новым годом - "желаем вам в новом году уделять больше времени speccy!"
Свиток - подробное описание игры PI* R2.

В этот день...   20 апреля