User Tag List

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя
Показано с 31 по 40 из 69

Тема: BattleCity демо-недоделка

  1. #31

    Регистрация
    31.01.2007
    Адрес
    Москва
    Сообщений
    810
    Спасибо Благодарностей отдано 
    11
    Спасибо Благодарностей получено 
    77
    Поблагодарили
    59 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    JetPac на пару с Cookie ненавистного местными 83 года ржет над вами со своими 16к.

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32

    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,829
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    663
    Поблагодарили
    513 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Biland Посмотреть сообщение
    Если буфер экрана (или его части), хранить последовательно, то работа с ним упирается в код,
    примерно, такой (шириной для двух знакомест)
    Если хранить буфер экрана линейно
    то оптимальный вариант строения буфера таков

    FEDC BA98 7654 3210
    ***X XXXX YYYY YYYY

    преимущества
    переход влево dec h 4t
    переход вправо inc h 4t
    переход вверх dec l 4t
    переход вниз inc l 4t

    буфер хоть и занимает собой 8К
    но в 64 байтной щелке вполне можно хранить спрайты и таблицы
    так же таблицы можно хранить и "вертикально"
    то есть в L закидываем номер таблицы
    а в H число пропускаемое через таблицу

    из недостатков
    если читать буфер стеком
    то выводить нужно столбцами
    что сечется с лучом заметней

    если рисовать стеком а читать просто линейно
    то проблем уже нет

    - - - Добавлено - - -

    Цитата Сообщение от Reobne Посмотреть сообщение
    но бросать такой буфер в экранную область будет неудобно.
    кто сказал?
    Последний раз редактировалось NEO SPECTRUMAN; 25.05.2019 в 20:46.

  4. #33

    Регистрация
    06.05.2019
    Адрес
    г. Подольск
    Сообщений
    108
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    18
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    преимущества
    переход влево dec h 4t
    переход вправо inc h 4t
    переход вверх dec l 4t
    переход вниз inc l 4t
    Да, хороший вариант. Надо только после смещения вправо, возврат по Х организовать и сместиться по Y, для разный ширины спрайта. Пока оптимально по тикам, что-то не соображу как.


    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    но бросать такой буфер в экранную область будет неудобно.
    Бросать можно и через

    Код:
    POP HL
    LD (#4000),HL
    POP HL
    LD (#4002),HL
    , где адреса заранее рассчитаны. Получается чуть более 80тыс. тактов на весь экран. Теоретически, если нужен весь экран, то эту процедуру можно кинуть в нулевую страницу и подключить по cpu0. Хотя этой возможности подключать в cpu0 (ram0) лет 20 уже, предполагаю, что всё равно это специфично.

    Ещё бы в такой буфер быстро кидать

    Код:
    D SP,экран
    LD HL,NN ;два байта графики, здесь будет подставляться спрайт
    PUSH HL
    LD HL,NN
    PUSH HL
    , то весь экран в 67тыс. тактов укладывается и не используется дополнительный буфер. Можно и без cpu0 обходиться.
    unreal

  5. #34

    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,829
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    663
    Поблагодарили
    513 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Biland Посмотреть сообщение
    Надо только после смещения вправо, возврат по Х организовать
    можно и нужно по возможности двигаться змейкой

    inc h inc h inc h inc h inc l
    dec h dec h dec h dec h inc l
    inc h inc h inc h inc h inc l
    dec h dec h dec h dec h inc l

    или
    inc l inc l inc l inc h
    dec l dec l dec l inc h
    inc l inc l inc l inc h
    dec l dec l dec l inc h

    - - - Добавлено - - -

    Цитата Сообщение от Biland Посмотреть сообщение
    D SP,экран LD HL,NN ;два байта графики, здесь будет подставляться спрайт PUSH HL LD HL,NN PUSH HL
    в условиях демосцены или жесткого извращения и если мы пишем под 128
    и если мы не боимся медленной памяти и пишим под пентагон и ложим на фирменные машины
    а может мы просто захотели рисовать мультиколор
    опять же
    мы можем организовать чуть более удобно и такой буфер для 128 строк

    ld hl,nn push hl занимает 4 байта на 2 байта экранной области

    тоесть делаем так
    включаем теневой экран навсегда
    в итоге у нас появляется место по $4000-7FFF под маневры

    далее раскидываем развернутую процедуру в виде
    Код:
    org $4000
    l1 ld sp,C0xx	;3
    dup 16
    ld hl,nnnn	;3
    push hl		;1
    edup
    jp l2		;3
    
    org $4100
    l2 ld sp,C1xx
    dup 16
    ld hl,nnnn
    push hl
    edup
    jp l3
    
    ...
    
    org $BF00
    l128 ld sp,xxxx
    dup 16
    ld hl,nnnn
    push hl
    edup
    jp end
    можно 127 строк
    и выровнять более удобно
    чтоб nnnn приходилось на кратный адрес $хх00

    и в принципе если хотим ЕЩЕ БЫСТРЕЕ
    то можем убрать ld sp,xxxx
    а поставить Jp по образу и подобию строения спековского экрана
    ТОГДА мы выиграем 1К тактов
    но не сможем рисовать линейно сверху в низ
    чтоб не сектись с лучом
    тогда 128 строк улетят в экран за 44298 тактов

    при этом у нас остается свободное переключаемое окно С000-FFFF
    графику можно хранить между каждой строкой
    по 186 байт на строку свободно
    таблицу вектора прерываний нужно будет ложить в каждой банке (кроме тех что всегда по адресам 4000-BFFF)
    так же как и обработчик
    (как вариант можно пожертвовать пару строк и положить вектор и обработчик в более надежном месте)

    на время рисования в буфере
    видео память отключаем из адресного пространства проца вообще

    так же в странице с видеопамятью у нас еще свободно 9К памяти

    так же чтоб жестко не извращатся переключением страниц кодом находящимся в переключаемой странице (гемор же)
    можно переместить некоторые процедуры
    переключалки страниц рамы
    переменные
    в те 186 байтные щелки что есть в 32К процедуре перекидывания буфера в видеопамять

    в итоге перемещение по вертикали
    у нас остается достаточно быстрое inc h dec h

    но по горизонтали
    уже нужно извращаться
    так у нас чередуются 2 байта данных и 2 байта кода


    - - - Добавлено - - -

    Цитата Сообщение от Biland Посмотреть сообщение
    Бросать можно и через

    Код:
    POP HL
    LD (#4000),HL
    POP HL
    LD (#4002),HL
    , где адреса заранее рассчитаны. Получается чуть более 80тыс. тактов на весь экран. Теоретически, если нужен весь экран, то эту процедуру можно кинуть в нулевую страницу и подключить по cpu0. Хотя этой возможности подключать в cpu0 (ram0) лет 20 уже, предполагаю, что всё равно это специфично.
    по адресам 4B00-BFFF вполне найдется 29К памяти
    чтоб поместить 24К процедуру
    и без cpu0 которого ниукогонет...

    но опять же это или в условиях 128К
    или при большом извращении
    Последний раз редактировалось NEO SPECTRUMAN; 26.05.2019 в 17:58.

  6. #35

    Регистрация
    06.05.2019
    Адрес
    г. Подольск
    Сообщений
    108
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    18
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Кстати, да. Про змейку подумал, а увидев наглядно пример, понял, что можно спрайты тоже змейкой хранить.

    Для буфера и вывода сразу

    LD HL,NN
    PUSH HL

    можно тоже схему применять
    ld (hl),N - inc l - inc l - inc l - ld (hl),N - inc l - ld (hl),N
    , что тоже быстро.

    Только scroll такого буфера будет медленнее, но в общем случае на дистанции будет неплохо на первый взгляд. Хотя такты надо будет посчитать.

    Спасибо всем за советы.

    И, ещё, один вопрос. Где-то проскакивала тема с библиотеками, по типу процедур. Понимаю, что задачи у всех разные и решения тоже специфичны. Но готовые процедуры облегчают процесс, хотя бы "заточенные" под какой-либо конкретный случай, тем более SJAsm позволяет подключать модули (или как их там правильно). Нет ли каких наработок по этому поводу, структурированных сайтов, где оптимизировать и сохранять могут сами участники? Или в этом смысла нет?

    П.С.: После dec l dec l dec l inc h, только что прочитал. Нужно время, чтобы переосмыслить полностью.
    Последний раз редактировалось Biland; 26.05.2019 в 18:31.
    unreal

  7. #36

    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,829
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    663
    Поблагодарили
    513 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Biland Посмотреть сообщение
    структурированных сайтов,
    близко нет
    все в перемешку

    есть некоторые сайтеке
    которые содержат большой набор процедур для матана
    просто для z80

    не факт что оптимизированные и оптимальные...


    может чего то я не знаю
    и за пару лет все изменилось?

    вангую что воз и ныне там

    - - - Добавлено - - -

    Цитата Сообщение от Biland Посмотреть сообщение
    Кстати, да. Про змейку подумал, а увидев наглядно пример, понял, что можно спрайты тоже змейкой хранить.
    про хранение "змейкой" и для общего развития
    прочитай эту статью
    https://zxpress.ru/article.php?id=8659

    тоже иногда можно применять

    - - - Добавлено - - -

    Цитата Сообщение от Biland Посмотреть сообщение
    Нужно время, чтобы переосмыслить полностью.
    смысл таков
    забываем про десятичные цифры при размышлении
    и переходим на шестнадцатеричные и двоичные

    осмысляем выравнивание по кратным адресам и как этим пользоватсо
    ну и таблицы с любым количеством переменных в любой форме и в любом направлении

    представляем память спека как квадрат 256х256 с координатами H и L...
    а не как "с 32768 на резинке у нас быстра память"...

    итд...

    и будет вам счастие

    - - - Добавлено - - -

    В качестве авторитетного примера приведу вот эту поделку alone coder-а

    (вертикальные столбцы это младшие 256 байт)

    где видно что видео буфер лежит "вертикально" а в образовавшихся щелях понапихано еще

    в моем представлении
    $0000 верхний левый угол
    $FFFF нижний правый

    а тут все повернуто на 90 градусов

    да и термины типа нижняя\верхняя память не люблю
    пушо как по мне вверху должен быть и так естественней адрес 0
    а называют совершенно на оборот...
    Последний раз редактировалось NEO SPECTRUMAN; 26.05.2019 в 19:00.

  8. #37

    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    14,295
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    203
    Спасибо Благодарностей получено 
    1,459
    Поблагодарили
    949 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а не проще бегло просмотреть готовые BattleCity (на вирте их штук 10) ?

  9. #38

    Регистрация
    06.05.2019
    Адрес
    г. Подольск
    Сообщений
    108
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    18
    Поблагодарили
    13 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от goodboy Посмотреть сообщение
    а не проще бегло просмотреть готовые BattleCity (на вирте их штук 10) ?
    Может и проще, только от чужой мнемоники голова идёт кругом, т.к. нет опыта ни в ассемблере, ни в оптимизации кода на нём. Да и про вопросы о таких способах вывода графики, как я уже выше писал, в этой игре мало имеет значения, т.к. там не нужен будет буфер и т.п. Это всё для полной картины понимания, чтобы нюансы потом не всплывали, камнями. Да и работу с экраном нужно осмыслить с разных сторон.

    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    про хранение "змейкой" и для общего развития
    прочитай эту статью
    https://zxpress.ru/article.php?id=8659

    тоже иногда можно применять
    Да, интересный метод. В голове проскакивала мысль об управление битами при смещении, а здесь более подробно метод описан, 26 тактов на байт, без стека. А со стеком

    Код:
    pop bc ;10
    ld (hl),b ;7
    inc l ;4
    ld (hl),c ;7
    set/res N,l;8
    
    pop bc ;10
    ld (hl),c ;7
    dec l ;4
    ld (hl),b ;7
    set/res N,l ;8
    и змейкой - 36 тактов на два байта, т.е. 18 тактов на один. Итого 576 тактов на квадратный спрайт-фон из 4-х выровненных знакомест, без подготовки.
    unreal

  10. #39

    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,829
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    663
    Поблагодарили
    513 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от goodboy Посмотреть сообщение
    а не проще бегло просмотреть готовые BattleCity (на вирте их штук 10) ?
    свой велосипед ортопедически правильней повторяет форму...

  11. #40

    Регистрация
    31.12.2017
    Адрес
    г. Реж
    Сообщений
    156
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    34
    Поблагодарили
    17 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я не так давно загорелся подобной идеей, помог сайт http://zxpress.ru/article.php?id=5437, там много полезных статей, в которых описано то, что я только недавно узнал про спек.
    Имхо делай 128 версию, мороки меньше, когда разберёшься со страницами памяти, особенно со сменными видеостраницами, всё пойдёт и тормозов станет меньше.
    Цитата Сообщение от NEO SPECTRUMAN Посмотреть сообщение
    при выборе из TASM vs ALASM надо сразу выбирать SjASM
    Я себе придумал челендж, написать программу в которой можно написать программу)) То-есть потратил неделю на написание своего "компилятора", старая версия которого тут выложена.

    Листинг последней версии Tank 1990(немного оптимизированный по занимаемой памяти)

    Скрытый текст

    Код:
    	ORG	32768
    		LD	A,7
    		LD	(23693),A	;ATTR_P
    		
    		LD	HL,(23670)
    		LD	(RND_VAL),HL
    		CALL	MAIN_CYCLE
    		RET
    
    
    ;-------------------
    LEVELS		EQU	#C000
    LEVEL_ADDR	DEFW	0
    
    ;-------------------
    T_COORD		DEFW	0
    T_OLD_COORD	DEFW	0
    T_SPR_ADR	DEFW	0
    T_SPR_W		DEFB	0
    T_SPR_H		DEFB	0
    T_DIRECT	DEFB	0	;Направление игрока
    T_ACTIVE	DEFB	0
    T_LIVES		DEFB	0
    T_POWER		DEFB	0
    T_VISIBLE	DEFB	0
    T_BLINK_TIMER	DEFB	0
    T_PROTECT_TIMER	DEFB	0
    T_SLIP_TIMER	DEFB	0
    T_COL_SHOT	DEFB	0
    T_SH_TIMER	DEFB	0
    T_FASE		DEFB	0
    ;-------------------
    
    T_SH_COORD	EQU	0
    T_SH_OLD_COORD	EQU	2
    T_SH_DIRECT	EQU	4
    T_SH_ACTIVE	EQU	5
    T_SH_SPEED	EQU	6
    
    T_SH_LEN	EQU	7
    T_SHOT		DEFS	14	;Массив патронов игрока
    
    ;-------------------
    E_COORD		EQU	0	;Координаты врага
    E_OLD_COORD	EQU	2	;Координаты врага
    E_SPR_H		EQU	4	;Высота текущего спрайта врага
    E_SPR_W		EQU	5	;Ширина текущего спрайта врага
    E_SPR_ADR	EQU	6	;Адрес текущего спрайта врага
    E_DIRECT	EQU	8	;Направление врага
    E_HP		EQU	9	;Существует ли враг
    E_SH_COORD	EQU	10
    E_SH_OLD_COORD	EQU	12
    E_SH_DIRECT	EQU	14
    E_SH_ACTIVE	EQU	15
    E_BONUSED	EQU	16
    E_VISIBLE	EQU	17
    E_BLINK_TIMER	EQU	18
    E_TYPE		EQU	19
    E_SPRITE_ADDR	EQU	20
    E_FASE		EQU	22
    
    E_COUNT		EQU	3
    
    ENEMY_LEN	EQU	23	;Размер в байтах одного врага
    ENEMY		DEFS	69	;Массив врагов
    
    L_ECOUNT	DEFB	0,0,0,0
    STAGE_NUM	DEFB	0
    SCORE		DEFW	0	
    HI_SCORE	DEFW	200
    ;-------------------
    B_COORD		DEFW	0
    B_OLD_COORD	DEFW	0
    B_ACTIVE	DEFB	0
    B_INDEX		DEFB	0
    B_VISIBLE	DEFB	0
    B_BLINK_TIMER	DEFB	0
    
    
    STOP_TIMER	DEFB	0
    SPAWN_POS	DEFB	0
    ENEMY_COUNT	DEFB	0
    BASE_DAMAGED	DEFB	0
    BONUS_COUNTER	DEFB	0	
    IS_ICE		DEFB	0
    IS_KEMPSTON	DEFB	0
    DEFICULT	DEFB	0
    
    BLINK_TIME	EQU	3
    
    L_END_TIMER	DEFB	0	;Таймер задержки по окончании	
    
    ;--------------------------
    W_COORD		DEFW	0
    W_SPRADR	DEFW	0
    W_SPRW		DEFB	0
    W_SPRH		DEFB	0
    
    U_PRESSED	DEFB	0
    D_PRESSED	DEFB	0
    L_PRESSED	DEFB	0
    R_PRESSED	DEFB	0
    F_PRESSED	DEFB	0
    
    
    U_PORT		DEFB	#FB	;Порты полурядов с клавишами управления
    D_PORT		DEFB	#FD	;меняются при редефайне
    L_PORT		DEFB	#FD
    R_PORT		DEFB	#FD
    F_PORT		DEFB	#BF
    
    ;--------------------------
    SELECT_T_SPRITE
    	LD	A,(T_POWER)
    	LD	HL,T1
    	CP	0
    	JR	Z,STS_END
    	LD	HL,T2
    	CP	1
    	JR	Z,STS_END
    	LD	HL,T3
    	CP	2
    	JR	Z,STS_END
    	LD	HL,T4
    
    STS_END	LD	DE,T_SPRITE_1
    	CALL	FILL_SPRITE
    	RET
    
    ;--------------------------
    SELECT_E_SPRITE
    	LD	A,(IX+E_TYPE)
    	LD	HL,E1
    	CP	0
    	JR	Z,SES_END
    	LD	HL,E2
    	CP	1
    	JR	Z,SES_END
    	LD	HL,E3
    	CP	2
    	JR	Z,SES_END
    	LD	HL,E4
    
    SES_END	LD	E,(IX+E_SPRITE_ADDR)
    	LD	D,(IX+E_SPRITE_ADDR+1)
    	CALL	FILL_SPRITE
    	RET
    ;--------------------------
    REDEFINE_KEYS
    		LD	DE,TXT_LEFT
    		LD	HL,#0A10
    		CALL	PRINT
    		CALL	WAIT_UNPRESSED_KEY	;Ждём отпускания клавиш
    
    		;Клавиша влево
    		CALL	WAIT_PRESS_KEY
    		LD	A,(HL)
    		LD	(L_PORT),A
    		LD	A,(DE)
    		LD	(L_BIT+1),A
    		CALL	WAIT_UNPRESSED_KEY	;Ждём отпускания клавиш
    
    		LD	DE,TXT_RIGHT
    		LD	HL,#0A10
    		CALL	PRINT
    
    		;Клавиша вправо
    		CALL	WAIT_PRESS_KEY
    		LD	A,(HL)
    		LD	(R_PORT),A
    		LD	A,(DE)
    		LD	(R_BIT+1),A
    		CALL	WAIT_UNPRESSED_KEY
    
    		LD	DE,TXT_UP
    		LD	HL,#0A10
    		CALL	PRINT
    
    		;Клавиша вверх
    		CALL	WAIT_PRESS_KEY
    		LD	A,(HL)
    		LD	(U_PORT),A
    		LD	A,(DE)
    		LD	(U_BIT+1),A
    		CALL	WAIT_UNPRESSED_KEY
    
    		LD	DE,TXT_DOWN
    		LD	HL,#0A10
    		CALL	PRINT
    
    		;Клавиша вниз
    		CALL	WAIT_PRESS_KEY
    		LD	A,(HL)
    		LD	(D_PORT),A
    		LD	A,(DE)
    		LD	(D_BIT+1),A
    		CALL	WAIT_UNPRESSED_KEY
    
    		LD	DE,TXT_FIRE
    		LD	HL,#0A10
    		CALL	PRINT
    
    		;Клавиша огонь
    		CALL	WAIT_PRESS_KEY
    		LD	A,(HL)
    		LD	(F_PORT),A
    		LD	A,(DE)
    		LD	(F_BIT+1),A
    		CALL	WAIT_UNPRESSED_KEY
    
    		LD	DE,MENU_2
    		LD	HL,#0610
    		CALL	PRINT
    
    		RET
    
    
    TXT_LEFT	DEFM	"PRESS LEFT KEY "
    		DEFB	0
    TXT_RIGHT	DEFM	"PRESS RIGHT KEY"
    		DEFB	0
    TXT_UP		DEFM	"PRESS UP KEY   "
    		DEFB	0
    TXT_DOWN	DEFM	"PRESS DOWN KEY "
    		DEFB	0
    TXT_FIRE	DEFM	"PRESS FIRE KEY "
    		DEFB	0
    
    ;--------------------------
    IS_KEY
    		LD	HL,KEY_PORTS
    
    		LD	B,8	;8 полурядов
    IK_NP		LD	A,(HL)
    		IN	A,(254)
    		AND	31
    		XOR	31
    		RET	NZ	;Какая-то клавиша нажата
    
    		INC	HL
    		DJNZ	IK_NP
    		RET	;Не нажата ни одна клавиша
    
    ;--------------------------
    WAIT_UNPRESSED_KEY
    		LD	HL,KEY_PORTS
    
    		LD	B,8	;8 полурядов
    WKP_NP		LD	A,(HL)
    		IN	A,(254)
    		AND	31
    		CP	31
    		JR	NZ,WAIT_UNPRESSED_KEY	;Клавиша нажата.
    		INC	HL
    		DJNZ	WKP_NP
    		RET	;Не нажата ни одна клавиша
    
    
    ;--------------------------
    WAIT_PRESS_KEY
    		LD	HL,KEY_PORTS
    		LD	B,8	;8 полурядов
    		
    DK_NP		LD	A,(HL)
    		IN	A,(254)
    
    		PUSH	AF
    		LD	A,#FE
    		CP	(HL)
    		JR	NZ,WAKP_0
    		POP	AF
    		OR	1		;CAPS SHIFT - НЕ ИСПОЛЬЗУЕМ
    		JR	WAKP_1
    WAKP_0		POP	AF
    WAKP_1
    		LD	C,5	;5 бит
    		LD	DE,BIT_HALFCODE
    
    NEXT_BIT	RRA
    		RET	NC	;Клавиша нажата. В (HL) порт, в (DE) полукод
    		INC	DE
    		DEC	C
    		JR	NZ,NEXT_BIT
    
    		INC	HL
    		DJNZ	DK_NP
    		JR	WAIT_PRESS_KEY	;Пока клавиша не будет нажата
    
    BIT_0		EQU	#47	;Полукоды команды от BIT 0,A до BIT 4,A
    BIT_1		EQU	#4F
    BIT_2		EQU	#57
    BIT_3		EQU	#5F
    BIT_4		EQU	#67
    
    KEY_PORTS	DEFB	#7F,#BF,#DF,#EF,#F7,#FB,#FD,#FE		;Все 8 полурядов клавиатуры
    BIT_HALFCODE	DEFB	#47,#4F,#57,#5F,#67
    
    
    ;--------------------------
    PRINT
    		CALL	ADR
    
    PRNT_1		PUSH	DE
    		PUSH	HL
    
    		LD	A,H         ;рассчитываем адрес атрибутов соответствующего знакоместа
    		AND	#18
    		RRCA
    		RRCA
    		RRCA
    		ADD	A,#58
    		LD	H,A
    		LD	A,(COLOR)
    		LD	(HL),A
    
    		LD	A,(DE)		;Считали очередной символ
    		LD	L,A
    		LD	H,0
    		ADD	HL,HL
    		ADD	HL,HL
    		ADD	HL,HL
    		LD	DE,(23606)
    		ADD	HL,DE		;Получим адрес символа
    
    		POP	DE
    		PUSH	DE
    
    		LD	B,8
    PRNT_0		LD	A,(HL)
    		SRL	A
    		OR	(HL)		;Утолщим символ
    		LD	(DE),A		;Поместим на экран
    		INC	HL
    		INC	D
    		DJNZ	PRNT_0
    
    		POP	HL
    		POP	DE
    		INC	HL
    		INC	DE
    
    		LD	A,(DE)
    		AND	A
    		RET	Z		;Выходим, если символ с кодом 0
    
    		JR	PRNT_1
    COLOR	DEFB	0
    ;--------------------------
    START_MELODY
    	DI
    	LD	HL,MELODY
    NOTE	LD	D,(HL)
    	INC	HL
    	LD	E,(HL)
    	INC	HL
    	LD	A,E
    	OR	D
    	JR	Z,END_MELODY
    	PUSH	HL
    	CALL	TWOTON
    	POP	HL
    	JR	NOTE
    END_MELODY
    	EI
    	RET
    MELODY
    	DEFB	226,225
    	DEFB	201,0
    	DEFB	190,0
    
    	DEFB	226,225
    	DEFB	201,227
    	DEFB	190,225
    
    	DEFB	190,191
    	DEFB	169,0
    	DEFB	150,0
    
    	DEFB	190,189
    	DEFB	169,191
    	DEFB	150,189
    
    	DEFB	169,170
    	DEFB	150,0
    	DEFB	142,0
    
    	DEFB	169,170
    	DEFB	150,170
    	DEFB	142,170
    
    	DEFB	142,143
    	DEFB	126,144
    	DEFB	113,143
    
    	DEFB	142,125
    	DEFB	126,124
    	DEFB	113,125
    
    	DEFB	113,114
    	DEFB	113,0
    	DEFB	113,0
    	DEFB	113,114
    	DEFB	113,115
    	DEFB	113,115
    	DEFB	113,114
    
    	DEFB	0,0
    
    ;------------------------------
    TWOTON
    
    	LD	BC,5000		;длительность звучания
    	LD	A,(23624)
    	AND	#38
    	RRA
    	RRA
    	RRA
    	LD	H,D
    	LD	L,E
    
    TWOTN1	INC	H           
    	DEC	H
    	JR	Z,TWOTN2
    	DEC	H		;задержка для получения первого тона
    	JR	NZ,TWOTN2
    	XOR	16
    	OUT	(254),A		;извлечение первого звука
    	LD	H,D		;восстановление значения задержки для первого тона
    TWOTN2	INC	H           
    	DEC	H
    	JR	Z,TWOTN22
    	DEC	L		;задержка для получения второго тона
    	JR	NZ,TWOTN22
    	XOR	16
    	OUT	(254),A		;извлечение второго звука
    	LD	L,E		;восстановление значения задержки для второго голоса
    TWOTN22	PUSH	AF
    	LD	A,B		;проверка окончания звучания
    	OR	C
    	JR	Z,TWOTN3
    	POP	AF
    	DEC	BC
    	JR	TWOTN1
    TWOTN3	POP	AF
    	
    	RET
    
    ;-------------------
    INTERR	PUSH	AF          ;сохраняем используемые
    	PUSH	BC          ; в прерывании регистры
    	PUSH	HL
    INTER1	LD	A,(REPEAT)
    	AND	A
    	; Если эффект прозвучал нужное количество раз, завершаем обработку прерывания
    	JR	NZ,NO_EXITI
    	LD	(BLOCKED),A
    	JR	EXITI
    NO_EXITI
    	LD	HL,(CURADR) ;определяем текущий адрес в блоке данных
    	LD	B,(HL)      ;высота звука
    	INC	B
    	DEC	B
    	; Если встретился маркер конца блока данных, переходим к следующему повторению
    	JR	Z,EXITI0
    	INC	HL
    	LD	C,(HL)      ;длительность звука
    	INC	HL
    	LD	(CURADR),HL ;запоминаем текущий адрес
    	CALL	BEEP        ;извлекаем звук
    EXITI
    	POP	HL          ;восстанавливаем регистры
    	POP	BC
    	POP	AF
    	JP	56          ;переходим к стандартному обработчику прерываний
    	; Переход к началу эффекта - повторение
    EXITI0	LD	HL,(ADREFF) ;восстанавливаем начальный
    	LD	(CURADR),HL ; адрес блока данных
    	LD	HL,REPEAT
    	DEC	(HL)        ;уменьшаем счетчик повторений
    	JR	INTER1
    REPEAT	DEFB	0           ;количество повторений эффекта
    ADREFF	DEFW	0           ;начальный адрес блока данных эффекта
    CURADR	DEFW	0           ;текущий адрес в блоке данных
    BLOCKED	DEFB	0
    	; Извлечение звука
    BEEP	LD	A,(23624)
    	SRL	A
    	SRL	A
    	SRL	A
    	AND	7
    BEEP1	XOR	16
    	OUT	(254),A
    	PUSH	BC
    DELAY	DJNZ	DELAY
    	POP	BC
    	DEC	C
    	JR	NZ,BEEP1
    	RET
    ;-------------------------
    ON_SILENCE
    	XOR	A
    	JR	ON_EFF
    
    ON_SHOT_SOUND
    	LD	A,(BLOCKED)
    	CP	0
    	RET	NZ	;Пока играет другой звук
    	LD	HL,EFF1
    	LD	A,1
    	JR	ON_EFF
    ON_CRASH_SOUND
    	LD	A,(BLOCKED)
    	CP	0
    	RET	NZ	;Пока играет другой звук
    	LD	A,1
    	LD	(BLOCKED),A
    	LD	HL,EFF2
    	LD	A,2
    	JR	ON_EFF
    ON_ADD_LIVE_SOUND
    	LD	A,(BLOCKED)
    	CP	0
    	RET	NZ	;Пока играет другой звук
    	LD	A,1
    	LD	(BLOCKED),A
    	LD	HL,EFF3
    	LD	A,1
    	JR	ON_EFF
    
    ON_BONUS_SOUND
    	LD	A,(BLOCKED)
    	CP	0
    	RET	NZ	;Пока играет другой звук
    	LD	A,1
    	LD	(BLOCKED),A
    	LD	HL,EFF4
    	LD	A,2
    	JR	ON_EFF
    
    ON_CLANG_SOUND
    	LD	A,(BLOCKED)
    	CP	0
    	RET	NZ	;Пока играет другой звук
    	LD	A,1
    	LD	(BLOCKED),A
    	LD	HL,EFF5
    	LD	A,1
    	JR	ON_EFF
    
    ON_EFF  LD	(ADREFF),HL
    	LD	(CURADR),HL
    	LD	(REPEAT),A
    	RET
    EFF1	DEFB	50,12,100,6,150,4,200,2,250,2
    	DEFB	0
    EFF2	DEFB	50,2,100,2,25,2,46,2,215,2
    	DEFB	0
    EFF3	DEFB	60,6,60,6,60,6,60,6,60,6
    	DEFB	80,6,80,6,80,6,80,6,80,6
    	DEFB	100,6,100,6,100,6,100,6,100,6
    	DEFB	120,6,120,6,120,6,120,6,120,6
    	DEFB	100,6,100,6,100,6,100,6,100,6
    	DEFB	60,6,60,6,60,6,60,6,60,6
    	DEFB	70,6,70,6,70,6,70,6,70,6
    	DEFB	0
    EFF4	DEFB	250,4,200,4,150,4,100,4,50,4
    	DEFB	0
    EFF5	DEFB	80,4,70,4,60,5,50,5
    	DEFB	0
    
    ;-------------------
    IMON
    	CALL	SET_VIDEO5
    
    	LD	A,195		;код команды JP
    	LD	(49087),A
    	LD	HL,INTERR	;адрес процедуры обработки прерываний
    	LD	(49088),HL
    
    	LD	HL,48640	;формируем таблицу векторов прерываний
    	LD	DE,48641
    	LD	BC,256
    	LD	(HL),191		;на адрес 16705
    	LD	A,H
    	LDIR
    	
    	DI
    	LD	I,A		;загружаем регистр вектора прерываний
    	IM	2		;включаем 2-й режим
    	EI
    	RET
    
    ;---------------------------
    FIRST_INIT
    	;Обнулим очки
    	LD	HL,0
    	LD	(SCORE),HL
    
    
    	;Начальные 4 жизни
    	LD	A,4
    	LD	(T_LIVES),A
    
    	;Начало уровней
    	LD	HL,LEVELS
    	LD	(LEVEL_ADDR),HL
    
    	XOR	A
    	LD	(BASE_DAMAGED),A	;База цела
    	LD	(T_PROTECT_TIMER),A	;Каску уберём
    	LD	(T_POWER),A		;Звёзды сбросим
    	LD	(STAGE_NUM),A		;Сбросим номер уровеня
    	
    	LD	A,1
    	LD	(T_COL_SHOT),A		;1 патрон
    
    	;Оба патрона неактивны
    	LD	IX,T_SHOT
    	LD	(IX+T_SH_ACTIVE),0	
    	LD	IX,T_SHOT+T_SH_LEN
    	LD	(IX+T_SH_ACTIVE),0
    
    	LD	DE,ENEMY_LEN
    	LD	IX,ENEMY
    
    	;Раздадим врагам адреса рабочих спрайтов
    	LD	HL,E_SPRITE_1
    	LD	(IX+E_SPRITE_ADDR),L
    	LD	(IX+E_SPRITE_ADDR+1),H
    	ADD	IX,DE
    
    	LD	HL,E_SPRITE_2
    	LD	(IX+E_SPRITE_ADDR),L
    	LD	(IX+E_SPRITE_ADDR+1),H
    	ADD	IX,DE
    
    	LD	HL,E_SPRITE_3
    	LD	(IX+E_SPRITE_ADDR),L
    	LD	(IX+E_SPRITE_ADDR+1),H
    
    	RET
    
    ;----------------------------
    MAIN_CYCLE
    	CALL	ON_SILENCE
    	CALL	IMON
    
    	CALL	FIRST_SCREEN
    	CALL	FIRST_INIT
    
    M_C0
    	;Кончились ли уровни
    	LD	HL,(LEVEL_ADDR)
    	LD	A,H
    	OR	L
    	CP	0
    	JR	NZ,M_C1
    
    	CALL	VIN_SCREEN
    	JR	MAIN_CYCLE
    M_C1
    
    	CALL	INIT_LEVEL
    M_CGC	CALL	GAME_CYCLE
    
    	;Проигрыш ли
    	LD	A,(T_LIVES)
    	CP	0
    	JR	NZ,M_C2
    	LD	A,(T_ACTIVE)
    	CP	0
    	JR	NZ,M_C2
    
    	CALL	DEC_L_TIMER
    	JR	NZ,M_CGC
    
    
    	CALL	GAME_OVER_SCREEN
    	JR	MAIN_CYCLE
    M_C2
    
    	;Взорвана ли база
    	LD	A,(BASE_DAMAGED)
    	CP	0
    	JR	Z,M_C21
    
    	CALL	DEC_L_TIMER
    	JR	NZ,M_CGC
    
    	CALL	GAME_OVER_SCREEN
    	JR	MAIN_CYCLE
    M_C21
    	
    	;Очищен ли уровень
    	LD	A,(ENEMY_COUNT)
    	CP	0
    	JR	NZ,M_C3
    	LD	IX,ENEMY
    	LD	DE,ENEMY_LEN
    	LD	A,(IX+E_HP)
    	CP	0
    	JR	NZ,M_C3
    	ADD	IX,DE
    	LD	A,(IX+E_HP)
    	CP	0
    	JR	NZ,M_C3
    	ADD	IX,DE
    	LD	A,(IX+E_HP)
    	CP	0
    	JR	NZ,M_C3
    
    	CALL	DEC_L_TIMER
    	JR	NZ,M_CGC
    
    	CALL	ENDLEVEL_SCREEN
    	JR	M_C0
    M_C3
    	JR	M_CGC
    DEC_L_TIMER
    	LD	A,(L_END_TIMER)
    	OR	A
    	RET	Z
    	DEC	A
    	LD	(L_END_TIMER),A
    	OR	A
    	RET
    ;----------------------------
    GAME_CYCLE
    	CALL	PRINT_FON
    	CALL	INIT_PLAYER
    	CALL	INIT_EMPTY_ENEMY
    
    	CALL	KEY_TEST
    
    	CALL	T_ACTION
    	CALL	E_ACTION
    	CALL	T_SHOT_MOVE
    	CALL	E_SHOT_MOVE
    
    	CALL	PRINT_ENEMYS
    	CALL	PRINT_PLAYER
    	CALL	PRINT_T_SHOT
    	CALL	PRINT_E_SHOT
    	CALL	PRINT_BONUS
    	CALL	PRINT_LIVES
    	CALL	SWAP_SCREEN
    
    	RET
    ;--------------------------
    SCROLL_SCREEN
    	LD	A,(IX)
    	LD	HL,SCROL_COLOR
    	CP	1
    	JR	Z,SS0
    	LD	HL,SCROL_DEF
    SS0	LD	(S8B_CF+1),HL
    	INC	IX
    
    	LD	A,(IX)
    	LD	(SSCOL+1),A
    	INC	IX
    
    	LD	A,(IX)
    	LD	(SSBCNT+1),A
    	INC	IX
    
    	LD	A,(IX)
    	LD	(SSSCNT+1),A
    	INC	IX
    
    	LD	B,(IX)
    	INC	IX
    SS1	PUSH	BC
    
    	LD	L,23
    SSCOL	LD	H,0
    	CALL	ADR
    
    SSBCNT	LD	B,0
    SS2	PUSH	BC
    
    	LD	C,8	
    SS3	RLC	(IX)
    	JR	NC,SS5
    
    	PUSH	HL
    	LD	DE,SPR_C1
    	LD	B,8
    SS4	LD	A,(DE)
    	LD	(HL),A
    	INC	H
    	INC	DE
    	DJNZ	SS4
    	POP	HL
    
    SS5	INC	HL
    	DEC	C
    	JR	NZ,SS3
    
    	INC	IX
    	POP	BC
    	DJNZ	SS2
    
    	LD	B,8
    	CALL	SCRU_8B
    
    	POP	BC
    	DJNZ	SS1
    
    SSSCNT	LD	B,0
    	CALL	SCRU_8B
    
    	RET
    ;---------------------------
    SCRU_8B	PUSH	BC
    S8B_CF	CALL	0
    	CALL	SCROLL_UP
    	POP	BC
    	DJNZ	SCRU_8B
    	RET
    ;---------------------------
    SCROL_COLOR
    	LD	A,(#D800)
    	LD	HL,#D801
    	LD	DE,#D800
    	LD	BC,735
    	LDIR
    	LD	(#DADF),A
    	RET
    SCROL_DEF
    	RET
    ;---------------------------
    GAME_OVER_SCREEN
    	CALL	SET_VIDEO5
    
    	LD	A,%00000010
    	LD	B,0
    	CALL	CLS
    
    	LD	A,6
    	LD	(COL),A
    	LD	A,6
    	LD	(ROW),A
    	LD	A,20
    	LD	(WDT),A
    	LD	A,18
    	LD	(HGT),A
    
    	LD	DE,#DAE1
    	LD	HL,#DAE0
    	LD	(HL),0
    	LD	BC,31
    	LDIR
    	
    	LD	IX,GAME_OVER_TEXT
    	CALL	SCROLL_SCREEN
    
    	CALL	WAIT_PRESS_KEY
    
    	RET
    
    ;---------------------------
    VIN_SCREEN
    	CALL	SET_VIDEO5
    
    	LD	A,%00000000
    	LD	B,0
    	CALL	CLS
    
    	LD	HL,#D800
    	LD	BC,736
    V_S0	PUSH	HL
    	PUSH	BC
    	CALL	RND_255
    	AND	71
    	POP	BC
    	POP	HL
    	LD	(HL),A
    	INC	HL
    	DEC	BC
    	LD	A,B
    	OR	C
    	JR	NZ,V_S0
    
    	LD	A,8
    	LD	(COL),A
    	LD	A,6
    	LD	(ROW),A
    	LD	A,15
    	LD	(WDT),A
    	LD	A,18
    	LD	(HGT),A
    
    	LD	IX,VIN_TEXT
    	CALL	SCROLL_SCREEN
    
    V_S7	CALL	SCROL_COLOR
    	CALL	IS_KEY
    	CP	0
    	JR	Z,V_S7
    
    	RET
    ;---------------------------
    FIRST_SCREEN
    	CALL	SET_VIDEO5
    
    	LD	A,%00000010
    	LD	B,0
    	CALL	CLS
    
    	LD	A,7
    	LD	(COL),A
    	LD	A,3
    	LD	(ROW),A
    	LD	A,18
    	LD	(WDT),A
    	LD	A,21
    	LD	(HGT),A
    
    	LD	DE,#DAE1
    	LD	HL,#DAE0
    	LD	(HL),0
    	LD	BC,31
    	LDIR
    	
    	LD	IX,FIRST_TEXT
    	CALL	SCROLL_SCREEN
    
    	LD	A,7
    	LD	(COLOR),A
    
    	LD	DE,MENU_1
    	LD	HL,#060E
    	CALL	PRINT
    	LD	DE,MENU_2
    	LD	HL,#0610
    	CALL	PRINT
    	LD	DE,MENU_3
    	LD	HL,#0612
    	CALL	PRINT
    	LD	DE,MENU_4
    	LD	HL,#0614
    	CALL	PRINT
    
    
    F_WKP	LD	DE,T_OFF
    	LD	HL,#1312
    	LD	A,(IS_KEMPSTON)
    	CP	0
    	JR	Z,KEMP
    	LD	DE,T_ON
    KEMP	CALL	PRINT
    
    F_DEF	LD	DE,TDEF_1
    	LD	HL,#1514
    	LD	A,(DEFICULT)
    	CP	0
    	JR	Z,DEFI
    	LD	DE,TDEF_2
    	CP	1
    	JR	Z,DEFI
    	LD	DE,TDEF_3
    
    DEFI	CALL	PRINT
    
    	CALL	WAIT_PRESS_KEY
    
    	LD	A,(HL)
    	CP	#F7		;Сравниваем с полурядом 1...5
    	JR	NZ,F_WKP
    
    	LD	A,(DE)
    	CP	BIT_0		;Клавиша 1
    	RET	Z
    
    	PUSH	AF
    	CP	BIT_1		;Клавиша 2
    	CALL	Z,REDEFINE_KEYS
    	POP	AF
    
    	PUSH	AF
    	CP	BIT_2		;Клавиша 3
    	CALL	Z,CHANGE_KAMPSTON
    	POP	AF
    
    	CP	BIT_3		;Клавиша 4
    	CALL	Z,INC_DEFIC
    	
    	JR	F_WKP
    
    MENU_1	DEFM	"1 - START DESTRUCTION"
    	DEFB	0
    MENU_2	DEFM	"2 - REDEFINE KEYS  "
    	DEFB	0
    MENU_3	DEFM	"3 - KEMPSTON"
    	DEFB	0
    MENU_4	DEFM	"4 - DIFFICULTY"
    	DEFB	0
    T_OFF	DEFM	"OFF"
    	DEFB	0
    T_ON	DEFM	"ON "
    	DEFB	0
    TDEF_1	DEFM	"EASY  "
    	DEFB	0
    TDEF_2	DEFM	"NORMAL"
    	DEFB	0
    TDEF_3	DEFM	"HARD  "
    	DEFB	0
    
    ;---------------------------
    ENDLEVEL_SCREEN
    	CALL	SET_VIDEO5
    
    	LD	A,%00000111
    	LD	B,0
    	CALL	CLS
    
    	LD	A,2
    	LD	(COLOR),A
    
    	LD	HL,(HI_SCORE)
    	LD	DE,(SCORE)
    	AND	A
    	SBC	HL,DE
    	JR	NC,NO_HISCORE
    	LD	(HI_SCORE),DE
    
    NO_HISCORE
    
    	LD	DE,ELS_1
    	LD	HL,#0800
    	CALL	PRINT
    
    	LD	DE,ELS_3
    	LD	HL,#0304
    	CALL	PRINT
    
    	LD	A,7
    	LD	(COLOR),A
    
    	LD	DE,ELS_2
    	LD	HL,#0C02
    	CALL	PRINT
    
    	
    
    	LD	DE,ELS_4
    	LD	HL,#0808
    	CALL	PRINT
    	LD	DE,ELS_4
    	LD	HL,#080B
    	CALL	PRINT
    	LD	DE,ELS_4
    	LD	HL,#080E
    	CALL	PRINT
    	LD	DE,ELS_4
    	LD	HL,#0811
    	CALL	PRINT
    	LD	DE,ELS_5
    	LD	HL,#0C13
    	CALL	PRINT
    	LD	DE,ELS_6
    	LD	HL,#0614
    	CALL	PRINT
    
    	
    
    	LD	HL,ENEMY1_UP1
    	LD	(W_SPRADR),HL
    	LD	A,2
    	LD	(W_SPRW),A
    	LD	A,16
    	LD	(W_SPRH),A
    	LD	A,MOD_OR
    	LD	(MODE),A
    
    	LD	HL,#7840
    	LD	(W_COORD),HL
    	LD	HL,E1
    	LD	DE,E_SPRITE_1
    	CALL	FILL_SPRITE
    	CALL	PRINT_SPRITE
    
    	LD	HL,#7858
    	LD	(W_COORD),HL
    	LD	HL,E2
    	LD	DE,E_SPRITE_1
    	CALL	FILL_SPRITE
    	CALL	PRINT_SPRITE
    
    	LD	HL,#7870
    	LD	(W_COORD),HL
    	LD	HL,E3
    	LD	DE,E_SPRITE_1
    	CALL	FILL_SPRITE
    	CALL	PRINT_SPRITE
    
    	LD	HL,#7888
    	LD	(W_COORD),HL
    	LD	HL,E4
    	LD	DE,E_SPRITE_1
    	CALL	FILL_SPRITE
    	CALL	PRINT_SPRITE
    
    	LD	A,2
    	CALL	5633		;вывод на основной экран
    
    
    	LD	A,17
    	RST	16
    	XOR	A
    	RST	16
    
    	LD	A,16
    	RST	16
    	LD	A,6
    	RST	16
    
    	LD	DE,PTS_HISCORE
    	LD	BC,3
    	CALL	8252        ;управляющие коды
    	LD	BC,(HI_SCORE)
    	CALL	6683	
    	LD	BC,0
    	CALL	6683
    	LD	BC,0
    	CALL	6683
    	
    	LD	DE,PTS_SCORE
    	LD	BC,3
    	CALL	8252        ;управляющие коды
    	LD	BC,(SCORE)
    	PUSH	BC
    	CALL	6683
    	POP	BC
    	LD	A,B
    	OR	C
    	JR	Z,SCORE_NODBL
    	LD	BC,0
    	CALL	6683
    	LD	BC,0
    	CALL	6683
    SCORE_NODBL
    	LD	A,16
    	RST	16
    	LD	A,7
    	RST	16
    
    	LD	DE,PTS_LVLNUM
    	LD	BC,3
    	CALL	8252        ;управляющие коды
    	LD	BC,(STAGE_NUM)
    	LD	B,0
    	CALL	6683
    	
    
    	LD	HL,L_ECOUNT
    	LD	(CNT_ADR),HL
    	LD	HL,PTS_11
    	LD	(PTS_1ADR),HL
    	LD	HL,PTS_12
    	LD	(PTS_2ADR),HL
    	LD	DE,1
    	CALL	PRINT_PTS
    
    	LD	HL,L_ECOUNT+1
    	LD	(CNT_ADR),HL
    	LD	HL,PTS_21
    	LD	(PTS_1ADR),HL
    	LD	HL,PTS_22
    	LD	(PTS_2ADR),HL
    	LD	DE,2
    	CALL	PRINT_PTS
    
    	LD	HL,L_ECOUNT+2
    	LD	(CNT_ADR),HL
    	LD	HL,PTS_31
    	LD	(PTS_1ADR),HL
    	LD	HL,PTS_32
    	LD	(PTS_2ADR),HL
    	LD	DE,3
    	CALL	PRINT_PTS
    
    	LD	HL,L_ECOUNT+3
    	LD	(CNT_ADR),HL
    	LD	HL,PTS_41
    	LD	(PTS_1ADR),HL
    	LD	HL,PTS_42
    	LD	(PTS_2ADR),HL
    	LD	DE,4
    	CALL	PRINT_PTS
    
    
    	LD	A,22
    	RST	16
    	LD	A,20
    	RST	16
    	LD	A,12
    	RST	16
    
    	LD	A,0
    	LD	HL,L_ECOUNT
    	ADD	A,(HL)
    	INC	HL
    	ADD	A,(HL)
    	INC	HL
    	ADD	A,(HL)
    	INC	HL
    	ADD	A,(HL)
    	LD	C,A
    	LD	B,0
    	CALL	6683
    	CALL	ON_BONUS_SOUND
    
    	LD	BC,100
    	CALL	7997
    
    	RET
    ELS_1	DEFM	"HI-SCORE"
    	DEFB	0
    ELS_2	DEFM	"STAGE"
    	DEFB	0
    ELS_3	DEFM	"1-PLAYER"
    	DEFB	0
    ELS_4	DEFM	"PTS"
    	DEFB	0
    ELS_5	DEFM	"________"
    	DEFB	0
    ELS_6	DEFM	"TOTAL"
    	DEFB	0
    
    ;--------------------------
    PRINT_PTS
    	LD	HL,(CNT_ADR)
    	LD	A,(HL)
    	INC	A
    	LD	(BCNT1+1),A
    	LD	(BCNT2+1),A
    
    	LD	HL,0
    BCNT1	LD	B,0
    ES_C1	PUSH	BC
    	PUSH	DE
    	PUSH	HL
    	PUSH	HL
    
    	PUSH	BC
    	LD	DE,(PTS_2ADR)
    	LD	BC,3
    	CALL	8252        ;выводим управляющие коды
    	POP	BC
    BCNT2	LD	A,0
    	SUB	B
    	LD	C,A
    	LD	B,0
    	CALL	6683
    	
    	LD	DE,(PTS_1ADR)
    	LD	BC,3
    	CALL	8252        ;выводим управляющие коды
    	POP	BC
    	PUSH	BC
    	CALL	6683
    	POP	BC
    	LD	A,B
    	OR	C
    	JR	Z,NODBL
    	LD	BC,0
    	CALL	6683
    	LD	BC,0
    	CALL	6683
    NODBL
    	CALL	ON_CLANG_SOUND
    
    	LD	BC,10
    	CALL	7997
    
    	POP	HL
    	POP	DE
    	POP	BC
    
    	ADD	HL,DE
    	DJNZ	ES_C1
    	RET
    
    CNT_ADR		DEFW	0
    PTS_1ADR	DEFW	0
    PTS_2ADR	DEFW	0
    PTS_11		DEFB	22,8,3
    PTS_12		DEFB	22,8,12
    PTS_21		DEFB	22,11,3
    PTS_22		DEFB	22,11,12
    PTS_31		DEFB	22,14,3
    PTS_32		DEFB	22,14,12
    PTS_41		DEFB	22,17,3
    PTS_42		DEFB	22,17,12
    PTS_HISCORE	DEFB	22,0,19
    PTS_SCORE	DEFB	22,6,5
    PTS_LVLNUM	DEFB	22,2,18
    ;--------------------------
    
    GAME_OVER_TEXT
    	DEFB	0,4,3,48,11
    	DEFB	%00011100,%11001000,%10111100
    	DEFB	%00100001,%00101000,%10100000
    	DEFB	%00101101,%11101101,%10111100
    	DEFB	%00100101,%00101010,%10100000
    	DEFB	%00011001,%00101000,%10111100
    	DEFB	%00000000,%00000000,%00000000
    	DEFB	%00011001,%00010111,%10111000
    	DEFB	%00100101,%00010100,%00100100
    	DEFB	%00100101,%00010111,%10111000
    	DEFB	%00100100,%10100100,%00100100
    	DEFB	%00011000,%01000111,%10100100
    
    VIN_TEXT
    	DEFB	1,8,2,48,11
    	DEFB	%10001001,%10010010
    	DEFB	%01010010,%01010010
    	DEFB	%00100010,%01010010
    	DEFB	%00100010,%01010010
    	DEFB	%00100001,%10001100
    	DEFB	%00000000,%00000000
    	DEFB	%10001011,%10100010
    	DEFB	%10001001,%00110010
    	DEFB	%10101001,%00101010
    	DEFB	%11011001,%00100110
    	DEFB	%10001011,%10100010
    
    FIRST_TEXT
    	DEFB	0,4,3,80,10
    	DEFB	%00011100,%11001001,%01001000
    	DEFB	%00001001,%00101101,%01110000
    	DEFB	%00001001,%11101011,%01001000
    	DEFB	%00001001,%00101001,%01001000
    	DEFB	%00000000,%00000000,%00000000
    	DEFB	%00000101,%11101111,%01111000
    	DEFB	%00001101,%00101001,%01001000
    	DEFB	%00010101,%11101111,%01001000
    	DEFB	%00000100,%00100001,%01001000
    	DEFB	%00000101,%11101111,%01111000
    
    ;---------------------------
    CHANGE_KAMPSTON
    	LD	A,(IS_KEMPSTON)
    	XOR	1
    	LD	(IS_KEMPSTON),A
    	CALL	WAIT_UNPRESSED_KEY
    	RET
    
    ;---------------------------
    INC_DEFIC
    	LD	A,(DEFICULT)
    	INC	A
    	CP	3
    	JR	NZ,CH_D1
    	LD	A,0
    CH_D1	LD	(DEFICULT),A
    
    	CALL	WAIT_UNPRESSED_KEY
    	RET
    ;---------------------------
    SCROLL_UP 
           LD    HL,(ROW)
           CALL  ADR
           
           
           LD    A,(HGT)
           LD    B,A
           SLA   B
           SLA   B
           SLA   B     
           DEC   B
    
    SCR_U1 PUSH  HL
           PUSH  BC
    
           PUSH  HL
           POP   DE
           CALL  DOWN
           LD    A,(WDT)
           LD    C,A
           LD    B,0
           LDIR
    
           POP   BC
           POP   HL
           CALL  DOWN
           DJNZ  SCR_U1
           
           PUSH  HL
           POP   DE
           INC   DE
           LD    (HL),0
           LD    A,(WDT)
           DEC   A
           RET   Z
           LD    C,A
           LD    B,0
           LDIR 
    
    
           RET
    ROW    DEFB  0
    COL    DEFB  0
    HGT    DEFB  0
    WDT    DEFB  0
    
    ;---------------
    PRINT_LIVES
    
    	LD	L,15
    	LD	H,27
    	CALL	ADR
    	LD	DE,MINI
    
    	LD	B,8
    P_LI1	LD	A,(DE)
    	LD	(HL),A
    	INC	DE
    	INC	H
    	DJNZ	P_LI1
    
    	LD	HL,(T_LIVES)
    	LD	H,0
    	DEC	L
    	SLA	L
    	SLA	L
    	SLA	L
    	LD	DE,15744
    	ADD	HL,DE
    
    	EX	DE,HL
    
    	LD	L,15
    	LD	H,28
    	CALL	ADR
    
    	LD	B,8
    P_LI2	LD	A,(DE)
    	LD	(HL),A
    	INC	DE
    	INC	H
    	DJNZ	P_LI2	
    
    	RET
    
    ;---------------
    PRINT_MINI
    	PUSH	IX
    	PUSH	HL
           
    	LD	IX,MINI_COORDS
    	LD	C,1
    NXTM	LD	L,(IX)
    	LD	H,(IX+1)
    	CALL	ADR
    
    	LD	DE,MINI
    	LD	B,8
    NXTL	LD	A,(ENEMY_COUNT)
    	CP	C
    	JR	C,ZERO
    	LD	A,(DE)
    	JR	NOZERO
    ZERO	XOR	A
    NOZERO	LD	(HL),A
    	INC	DE
    	CALL	DOWN
    	DJNZ	NXTL
    
    	INC	IX
    	INC	IX
    	INC	C
    	LD	A,21
    	CP	C
    	JR	NZ,NXTM
    
    	POP	HL
    	POP	IX
    
    	RET
    
    MINI_COORDS
    	DEFB	1,27,1,28
    	DEFB	2,27,2,28
    	DEFB	3,27,3,28
    	DEFB	4,27,4,28
    	DEFB	5,27,5,28
    	DEFB	6,27,6,28
    	DEFB	7,27,7,28
    	DEFB	8,27,8,28
    	DEFB	9,27,9,28
    	DEFB	10,27,10,28
    MINI  
    	DEFB	0,73,93,119,119,93,73,28
    
    ;---------------------------
    BOX_COLLISION
           LD    A,(BOX_HL_W)
           ADD   A,H
           CP    D
           JR    NC,CLS16_1           
           XOR   A
           RET           ;По X не пересекаются
    CLS16_1
           LD    A,(BOX_DE_W)
           ADD   A,D
           CP    H
           JR    NC,CLS16_2           
           XOR   A
           RET           ;По X не пересекаются
    
    CLS16_2
           LD    A,(BOX_HL_H)
           ADD   A,L
           CP    E
           JR    NC,CLS16_3           
           XOR   A
           RET           ;По Y не пересекаются
    CLS16_3
           LD    A,(BOX_DE_H)
           ADD   A,E
           CP    L
           JR    NC,CLS16_4           
           XOR   A
           RET           ;По Y не пересекаются
          
    CLS16_4   
           LD    A,1
           RET
    BOX_HL_H	DEFB	0
    BOX_HL_W	DEFB	0
    BOX_DE_H	DEFB	0
    BOX_DE_W	DEFB	0 
    
    ;---------------------------
    ;Сравнение двух пар на равенство
    EQUAL_IX_HL
    
    	PUSH	IX
    	POP	DE
     
    	LD	A,D
    	CP	H
    	JR	Z,EIH_1           
    	XOR	A
    	RET
    EIH_1
    	LD	A,E
    	CP	L
    	JR	Z,EIH_2          
    	XOR	A
    	RET           
    EIH_2	LD	A,1
    	RET
    
    ;---------------------------
    ;Столкновение бокса HL и вражеского танка
    ENEMY_COLLISION
    	;Размеры врага
    	LD	A,15
    	LD	(BOX_DE_W),A
    	LD	(BOX_DE_H),A
    
    	LD	(CURRENT_COOR),HL
    	PUSH	HL
    
    	LD	HL,ENEMY
    	LD	B,E_COUNT
    CO_E1  
    	LD	(ECOL_ADDR),HL
    	CALL	EQUAL_IX_HL
    	CP	1
    	JR	Z,C_NEXT	;Сами с собой не сталкиваемся
    
    	PUSH	HL
    	LD	DE,E_HP
    	ADD	HL,DE
    	LD	A,(HL)
    	POP	HL
    	CP	0
    	JR	Z,C_NEXT	;С трупами не сталкиваемся
           
    
    	PUSH	HL
    	LD	E,(HL)
    	INC	HL
    	LD	D,(HL)
    	
    	LD	HL,(CURRENT_COOR)
    
    	CALL	BOX_COLLISION
    	POP	HL
           
    	CP	1    
    	JR	Z,IS_COLLIZ	;Столкнулись с другим танком  
           
    C_NEXT 
    	LD	DE,ENEMY_LEN
    	ADD	HL,DE
    	DJNZ	CO_E1
    
    	XOR	A		;Столкновений не обнаружено
    	POP	HL
    	RET
    
    IS_COLLIZ 
    	LD	A,1		;Столкновение обнаружено
    	POP	HL
    	RET
    
    ECOL_ADDR
    	DEFW	0
    ;---------------------------
    CURRENT_COOR
    	DEFW	0
    
    ;---------------------------
    ;Столкновение бокса HL и танка игрока
    PLAYER_COLLISION
    	LD	A,(T_ACTIVE)
    	CP	0
    	RET	Z	;С трупом не сталкиваемся
    
    	;Размеры танка
    	LD	A,15
    	LD	(BOX_DE_W),A
    	LD	(BOX_DE_H),A
    	LD	DE,(T_COORD)
    	
    	CALL	BOX_COLLISION
    	RET
    
    ;---------------------------
    ;Столкновение бокса HL с пулей игрока
    T_SHOT_COLLISION
    	PUSH	IX
    
    	LD	IX,T_SHOT
    	LD	A,(T_COL_SHOT)
    	LD	B,A
    TSC_ALL	PUSH	BC
    
    
    	LD	A,(IX+T_SH_ACTIVE)
    	CP	0
    	JR	Z,TSC_NEXT
    
    	LD	A,6
    	LD	(BOX_DE_W),A
    	LD	(BOX_DE_H),A
    	LD	E,(IX+T_SH_COORD)
    	LD	D,(IX+T_SH_COORD+1)
    
    	CALL	BOX_COLLISION
    	CP	0
    	JR	Z,TSC_NEXT
    	;...................
    	LD	(IX+T_SH_ACTIVE),0
    	POP	BC
    	POP	IX
    	RET
    	;...................
    TSC_NEXT
    	POP	BC
    	LD	DE,T_SH_LEN
    	ADD	IX,DE
    	DJNZ	TSC_ALL
    
    	POP	IX
    	RET
    
    
    ;----------------------------
    INIT_LEVEL
    	;Увеличим номер уровня
    	LD	HL,STAGE_NUM
    	INC	(HL)
    
    	;Обнулим счётчик убитых врагов
    	LD	HL,0
    	LD	(L_ECOUNT),HL
    	LD	(L_ECOUNT+2),HL
    
    	;Установим новый таймер ожидания
    	LD	A,150
    	LD	(L_END_TIMER),A
    
    	
    	LD	IX,ENEMY
    	LD	DE,ENEMY_LEN
    	LD	B,E_COUNT
    IL_EN	XOR	A
    	LD	(IX+E_HP),A		;Враги не активированы
    	LD	(IX+E_SH_ACTIVE),0	;Патроны врагов не активированы
    	ADD	IX,DE
    	DJNZ	IL_EN
    
    	;Снаряды игрока не активированы
    	LD	IX,T_SHOT
    	LD	(IX+T_SH_ACTIVE),A
    	LD	IX,T_SHOT+T_SH_LEN
    	LD	(IX+T_SH_ACTIVE),A
    
    	;Персонаж не активирован
    	LD	(T_ACTIVE),A
    	LD	(T_SH_ACTIVE),A
    	;Бонус не активирован
    	LD	(BONUS_COUNTER),A
    	LD	(B_ACTIVE),A
    
    	;Количество врагов
    	LD	A,20
    	LD	(ENEMY_COUNT),A
    
    	;Подключим банку с уровнями
    	CALL	BIND_BUF_0
    
    	LD	DE,(LEVEL_ADDR)	;В DE адрес уровня
    	LD	A,(DE)
    	LD	(LEVEL_ADDR),A	;Следующий уровень
    	INC	DE
    	LD	A,(DE)
    	LD	(LEVEL_ADDR+1),A
    	INC	DE
    
    	;Распакуем уровень
    	LD	HL,LEVEL
    L_I_NXT	LD	A,(DE)
    	CP	0
    	JR	Z,L_I_ENDLVL
    	AND	248
    	SRL	A
    	SRL	A
    	SRL	A
    	LD	B,A
    	LD	A,(DE)
    	AND	7
    L_I_IND	LD	(HL),A
    	INC	HL
    	DJNZ	L_I_IND
    	INC	DE
    	JR	L_I_NXT
    L_I_ENDLVL
    
    	;Добавим штаб и забор
    	
    	LD	HL,#0101
    	LD	(LEVEL+557),HL
    	LD	(LEVEL+559),HL
    	LD	A,1
    	LD	(LEVEL+583),A
    	LD	(LEVEL+586),A
    	LD	(LEVEL+609),A
    	LD	(LEVEL+612),A
    	LD	HL,#0606
    	LD	(LEVEL+584),HL
    	LD	(LEVEL+610),HL
    	
    
    	;Нарисуем уровень в первую банку при видимой первой
    	CALL	SET_VIDEO5
    	LD	B,5
    	LD	A,0
    	CALL	CLS
    	CALL	CLOSE_WEIL
    	CALL	COLORIZE_BUF
    	CALL	PRINT_LEVEL
    
    	CALL	START_MELODY
    
    	CALL	OPEN_WEIL
    	CALL	PRINT_MINI
    	CALL	COLORIZE_RIGHT
    
    	;Нарисуем уровень во вторую банку при видимой уже рисованной первой
    	CALL	SWAP_SCREEN
    	LD	B,5
    	LD	A,40
    	CALL	CLS
    	CALL	COLORIZE_BUF
    	CALL	COLORIZE_SCREEN
    	CALL	PRINT_LEVEL
    	CALL	PRINT_MINI
    
    
    
    	RET
    
    ;---------------------------
    ;Инициализация врагов в ходе игры
    INIT_EMPTY_ENEMY
    	LD	A,(ENEMY_COUNT)
    	CP	0
    	RET	Z	;Выходим, если кончились
    
    	LD	IX,ENEMY
    	LD	B,E_COUNT
    IEE1	LD	A,(IX+E_HP)            
    	CP	0
    	JR	Z,IEE2	;Если этот враг жив, место занято
    	LD	DE,ENEMY_LEN
    	ADD	IX,DE
    	DJNZ	IEE1
    	RET
    
    IEE2	;Нашли неактивированного врага
    	CALL	RND_255
    	AND	3
    	LD	(IX+E_TYPE),A
    	INC	A
    
    	LD	B,A
    	LD	A,(DEFICULT)
    	ADD	A,B
    	LD	(IX+E_HP),A	;Сделаем живым
    
    	LD	A,(SPAWN_POS)
    	LD	HL,#0000	;Первая точка спавна
    	CP	0
    	JR	Z,IEE4 
    	LD	HL,#6000	;Вторая точка спавна
    	CP	1
    	JR	Z,IEE4 
    	LD	HL,#C000	;Третья точка спавна
    IEE4	INC	A
    	CP	3
    	JR	NZ,IEE5
    	XOR	A
    IEE5	LD	(SPAWN_POS),A
    
    	LD	(IX+E_BONUSED),0
    	LD	(IX+E_VISIBLE),1
    	LD	A,(BONUS_COUNTER)
    	INC	A
    	CP	5		;Каждый 5ый танк с бонусом
    	JR	NZ,IEE_NB
    	LD	(IX+E_BONUSED),1
    	LD	(IX+E_BLINK_TIMER),0
    	XOR	A
    	
    IEE_NB	LD	(BONUS_COUNTER),A
          
    	;Координаты
    	LD	(IX+E_COORD),L
    	LD	(IX+E_COORD+1),H
    
    	;Выбор спрайта
    	PUSH	IX
    	CALL	SELECT_E_SPRITE
    	POP	IX
    
    	;Спрайт
    	LD	L,(IX+E_SPRITE_ADDR)
    	LD	H,(IX+E_SPRITE_ADDR+1)
    	LD	DE,64
    	ADD	HL,DE		;Направление вниз
    	LD	(IX+E_SPR_ADR),L
    	LD	(IX+E_SPR_ADR+1),H
    
    	LD	(IX+E_SPR_H),16
    	LD	(IX+E_SPR_W),2
    	LD	(IX+E_DIRECT),4	;Направление вниз
    	LD	(IX+E_FASE),0
    	
    
    	LD	A,(ENEMY_COUNT)
    	DEC	A		;Уменьшим количество врагов
    	LD	(ENEMY_COUNT),A
    
    	CALL	PRINT_MINI
    	CALL	SWAP_SCREEN
    	CALL	PRINT_MINI
    	CALL	SWAP_SCREEN
    	RET     
    ;--------------------------
    INIT_PLAYER
    
    	LD	A,(T_LIVES)	
    	CP	0
    	RET	Z		;Жизней больше нет
    
    	LD	A,(T_ACTIVE)
    	CP	1
    	RET	Z		;Если мы живы, не инициализируем
    
    	;Координаты
    	LD	HL,#40B0
    	LD	(T_COORD),HL
    	;Размеры спрайта
    	LD	A,2
    	LD	(T_SPR_W),A
    	LD	A,16
    	LD	(T_SPR_H),A
    	;Сам спрайт
    	LD	HL,TANK_UP1
    	LD	(T_SPR_ADR),HL
    	;Направление вверх
    	LD	A,3
    	LD	(T_DIRECT),A
    	;Делаем активным
    	LD	A,1
    	LD	(T_ACTIVE),A
    	;Защиту на первое время
    	LD	A,50
    	LD	(T_PROTECT_TIMER),A
    
    	;Выбор спрайта
    	CALL	SELECT_T_SPRITE
    	RET
    
    ;--------------------------
    INIT_BONUS
    
    
    	;Координаты
    	CALL	RND_255
    	AND	10
    	SLA	A
    	INC	A
    	SLA	A
    	SLA	A
    	SLA	A
    	LD	(B_COORD),A	;Y
    	CALL	RND_255
    	AND	11
    	SLA	A
    	INC	A
    	SLA	A
    	SLA	A
    	SLA	A
    	LD	(B_COORD+1),A	;X
    	
    	;Индекс
    	CALL	RND_255
    	LD	B,0
    	CP	42
    	JR	C,IB_1
    
    	LD	B,1
    	CP	84
    	JR	C,IB_1
    
    	LD	B,2
    	CP	126
    	JR	C,IB_1
    
    	LD	B,3
    	CP	168
    	JR	C,IB_1
    
    	LD	B,4
    	CP	210
    	JR	C,IB_1
    
    	LD	B,5
    	;CP	210
    	;JR	C,IB_1
    
    IB_1	LD	A,B
    	LD	(B_INDEX),A
    
    	LD	A,1
    	LD	(B_ACTIVE),A
    	LD	(B_VISIBLE),A
    	LD	(B_BLINK_TIMER),A
    
    
    ;Подключим банку со спрайтами
    	
    
    
    	;Сам спрайт
    	LD	HL,B_1-32
    	LD	DE,32
    	LD	A,(B_INDEX)
    	LD	B,A
    	INC	B
    IB_ADD	ADD	HL,DE
    	DJNZ	IB_ADD
    
    	LD	A,(#5B5C)
    	PUSH	AF
    
    	CALL	BIND_BUF_0
    	LD	DE,B_SPRITE
    	LD	BC,32
    	LDIR
    
    	POP	AF
    	CALL	SET_VIDEO_A
    	CALL	ON_BONUS_SOUND
    	RET
    
    ;--------------------------
    SET_VIDEO_A
    	DI
    	LD	(#5B5C),A
    	LD	BC,#7FFD
    	OUT	(C),A
    	EI
    	RET
    
    ;--------------------------
    ;Переключение буфферов
    SWAP_SCREEN
    	DI
    BUF_MODE
    	LD      A,%00011101		;16+8+5
    	XOR	  %00001010		;->%00010111=16+0+7
    
            LD      (BUF_MODE+1),A
    	LD	(#5B5C),A
    	LD	BC,#7FFD
            OUT	(C),A
    	EI
            RET
    
    ;--------------------------
    ;Включение и бинд буффера 5
    SET_VIDEO5
    	DI
    	LD      A,%00011101	;Востановим значение в свапскрине
            LD      (BUF_MODE+1),A
    
    	LD      A,%00010101
    	LD	(#5B5C),A
    	LD	BC,#7FFD
    	OUT	(C),A
    	EI
    	RET
    
    ;--------------------------
    ;Бинд буффера 0
    BIND_BUF_0
    	DI
    	LD      A,(#5B5C)
    	AND	24
    	LD	(#5B5C),A
    	LD	BC,#7FFD
            OUT	(C),A
    	EI
            RET
    
    ;---------------------------
    PRINT_ENEMYS
    	LD	IX,ENEMY
    	LD	B,E_COUNT
    P_E1	PUSH	BC
    
    	LD	A,(IX+E_HP)
    	CP	0
    	JR	Z,P_E2
    
    	LD	L,(IX+E_COORD) ;В рабочие координаты
    	LD	H,(IX+E_COORD+1) 
    	LD	(W_COORD),HL
    
    	LD	A,(IX+E_SPR_W)
    	LD	(W_SPRW),A
    	LD	A,(IX+E_SPR_H)
    	LD	(W_SPRH),A
    
    	LD	A,(IX+E_VISIBLE)
    	CP	0
    	JR	Z,P_E11
    
    	;Режим спрайта
    	LD	A,MOD_OR
    	LD	(MODE),A
    
    	;Рисуем спрайт
    	LD	L,(IX+E_SPR_ADR)
    	LD	H,(IX+E_SPR_ADR+1)
    	LD	(W_SPRADR),HL
    	CALL	PRINT_SPRITE
    
    P_E11	LD	A,(IX+E_BONUSED)
    	CP	0
    	JR	Z,P_E2
    
    	LD	A,(IX+E_BLINK_TIMER)
    	INC	A
    	CP	BLINK_TIME
    	JR	NZ,P_E_NB
    	LD	A,(IX+E_VISIBLE)
    	XOR	1
    	LD	(IX+E_VISIBLE),A
    	XOR	A
    
    P_E_NB	LD	(IX+E_BLINK_TIMER),A
           
    P_E2	POP	BC
    	LD	DE,ENEMY_LEN
    	ADD	IX,DE
    	DJNZ	P_E1
    
    	RET
    
    ;--------------------------
    PRINT_PLAYER
    
    	LD	A,(T_ACTIVE)
    	CP	0
    	RET	Z
    
    	;Инициализируем переменные
    	LD	HL,(T_COORD)
    	LD      (W_COORD),HL
    	LD	A,(T_SPR_W)
    	LD	(W_SPRW),A
    	LD	A,(T_SPR_H)
    	LD	(W_SPRH),A
    
    	LD	A,(T_VISIBLE)
    	CP	0
    	JR	Z,P_P1
    
    	;Установим режим спрайта
    	LD	A,MOD_OR
    	LD	(MODE),A
    	LD	HL,(T_SPR_ADR)
    	LD      (W_SPRADR),HL
    
    	;Рисуем спрайт
    	CALL	PRINT_SPRITE
    
    P_P1	LD	A,(T_PROTECT_TIMER)
    	CP	0
    	JR	NZ,P_P2
    	LD	A,1
    	LD	(T_VISIBLE),A
    	RET
    
    P_P2	DEC	A
    	LD	(T_PROTECT_TIMER),A
    
    	LD	A,(T_BLINK_TIMER)
    	INC	A
    	CP	BLINK_TIME
    	JR	NZ,P_P_NB
    	LD	A,(T_VISIBLE)
    	XOR	1
    	LD	(T_VISIBLE),A
    	XOR	A
    
    P_P_NB	LD	(T_BLINK_TIMER),A
           
    	RET
    
    ;--------------------------
    PRINT_BONUS
    
    ;Нарисуем курицу
    	LD	HL,#60B0
    	LD      (W_COORD),HL
    	LD	A,2
    	LD	(W_SPRW),A
    	LD	A,16
    	LD	(W_SPRH),A
    	LD	A,MOD_OR
    	LD	(MODE),A
    	LD	HL,SPR_BASE
    	LD	A,(BASE_DAMAGED)
    	CP	1
    	JR	NZ,P_BE
    	LD	HL,SPR_BASE_DEAD
    P_BE
    	LD      (W_SPRADR),HL
    	CALL	PRINT_SPRITE
    
    
    
    
    	LD	A,(B_ACTIVE)
    	CP	0
    	RET	Z
    
    	LD	A,(B_BLINK_TIMER)
    	INC	A
    	CP	BLINK_TIME
    	JR	NZ,PB_NB
    	LD	A,(B_VISIBLE)
    	XOR	1
    	LD	(B_VISIBLE),A
    	XOR	A
    
    PB_NB	LD	(B_BLINK_TIMER),A
    
    	
    	LD	A,(B_VISIBLE)
    	CP	0
    	RET	Z
    
    	;Инициализируем переменные
    	LD	HL,(B_COORD)
    	LD      (W_COORD),HL
    	LD	A,2
    	LD	(W_SPRW),A
    	LD	A,16
    	LD	(W_SPRH),A
    
    	;Установим режим маски
    	LD	A,MOD_AND
    	LD	(MODE),A
    	LD	HL,B_MASK
    	LD      (W_SPRADR),HL
    
    	;Рисуем маску
    	CALL	PRINT_SPRITE
    
    	;Установим режим спрайта
    	LD	A,MOD_OR
    	LD	(MODE),A
    	LD	HL,B_SPRITE
    	LD      (W_SPRADR),HL
    
    	;Рисуем спрайт
    	CALL	PRINT_SPRITE
    	RET
    
    
    ;--------------------------
    PRINT_T_SHOT
    	LD	IX,T_SHOT
    	LD	A,(T_COL_SHOT)
    	LD	B,A
    PTS_ALL	PUSH	BC
    
    	LD	A,(IX+T_SH_ACTIVE)
    	CP	0
    	JR	Z,PTS_NEXT
    
    	;Инициализируем переменные
    	LD	L,(IX+T_SH_COORD)
    	LD	H,(IX+T_SH_COORD+1)
    	LD      (W_COORD),HL
    	LD	A,2
    	LD	(W_SPRW),A
    	LD	A,8
    	LD	(W_SPRH),A
    
    	LD	A,H
    	LD	HL,SPR_SHOT
    	AND	7
    	CP	0
    	JR	Z,NO_ADDSH
    	LD      DE,16
    	LD	B,A
    ADDSH	ADD	HL,DE
    	DJNZ	ADDSH
    NO_ADDSH
    	
    	;PUSH	HL
    
    	;LD      DE,128		;Смещение до маски
    	;ADD	HL,DE
    
    	;Установим режим маски
    	;LD	A,MOD_AND
    	;LD	(MODE),A
    	;LD      (W_SPRADR),HL
    
    	;Рисуем маску
    	;CALL	PRINT_SPRITE
    
    	;POP	HL
    
    	;Установим режим спрайта
    	LD	A,MOD_OR
    	LD	(MODE),A
    	LD      (W_SPRADR),HL
    
    	;Рисуем спрайт
    	CALL	PRINT_SPRITE
    
    PTS_NEXT
    	POP	BC
    	LD	DE,T_SH_LEN
    	ADD	IX,DE
    	DJNZ	PTS_ALL
    	RET
    
    ;--------------------------
    PRINT_E_SHOT
    
    	LD	IX,ENEMY
    	LD	B,E_COUNT
    PES1	PUSH	BC
    
    
    	LD	A,(IX+E_SH_ACTIVE)
    	CP	0
    	JR	Z,PENEXT
    
    	;Инициализируем переменные
    	LD	L,(IX+E_SH_COORD)
    	LD	H,(IX+E_SH_COORD+1)
    	LD      (W_COORD),HL
    	LD	A,2
    	LD	(W_SPRW),A
    	LD	A,8
    	LD	(W_SPRH),A
    
    	LD	A,H
    	LD	HL,SPR_SHOT
    	AND	7
    	CP	0
    	JR	Z,PES_NO_ADDSH
    	LD      DE,16
    	LD	B,A
    PES_ADDSH
    	ADD	HL,DE
    	DJNZ	PES_ADDSH
    PES_NO_ADDSH
    	
    	;Установим режим спрайта
    	LD	A,MOD_OR
    	LD	(MODE),A
    	LD      (W_SPRADR),HL
    
    	;Рисуем спрайт
    	CALL	PRINT_SPRITE
    
    PENEXT	LD	DE,ENEMY_LEN
    	ADD	IX,DE
    	POP	BC
    	DJNZ	PES1
    
    	RET
    
    ;--------------------------
    PRINT_FON
    
    	;Инициализируем переменные
    	LD	HL,(T_OLD_COORD)
    	LD      (W_COORD),HL
    	LD	HL,(T_COORD)
    	LD	(T_OLD_COORD),HL
    	LD	A,(T_SPR_W)
    	LD	(W_SPRW),A
    	LD	A,(T_SPR_H)
    	LD	(W_SPRH),A
    
    	;Восстановим фон под игроком
    	CALL	RESTORE_FON
    
    	;.............................
    
    	LD	IX,ENEMY
    	LD	B,E_COUNT
    P_F1	PUSH	BC
    
    	LD	L,(IX+E_OLD_COORD) ;В рабочие координаты
    	LD	H,(IX+E_OLD_COORD+1) 
    	LD	(W_COORD),HL
    	LD	L,(IX+E_COORD)
    	LD	H,(IX+E_COORD+1)
    	LD	(IX+E_OLD_COORD),L
    	LD	(IX+E_OLD_COORD+1),H
    
    
    	LD	A,(IX+E_SPR_W)
    	LD	(W_SPRW),A
    	LD	A,(IX+E_SPR_H)
    	LD	(W_SPRH),A
    
    	;Восстановим фон под врагом
    	CALL	RESTORE_FON
    
    	POP	BC
    	LD	DE,ENEMY_LEN
    	ADD	IX,DE
     	DJNZ	P_F1
    
    	;.............................
    
    	LD	IX,T_SHOT
    	LD	A,(T_COL_SHOT)
    	LD	B,A
    P_F3	PUSH	BC
    
    	;Инициализируем переменные
    	LD	L,(IX+T_SH_OLD_COORD)
    	LD	H,(IX+T_SH_OLD_COORD+1)
    	LD      (W_COORD),HL
    	LD	L,(IX+T_SH_COORD)
    	LD	H,(IX+T_SH_COORD+1)
    	LD	(IX+T_SH_OLD_COORD),L
    	LD	(IX+T_SH_OLD_COORD+1),H
    
    
    	LD	A,2
    	LD	(W_SPRW),A
    	LD	A,16
    	LD	(W_SPRH),A
    
    	;Восстановим фон под снарядом
    	CALL	RESTORE_FON
    
    	POP	BC
    	LD	DE,T_SH_LEN
    	ADD	IX,DE
     	DJNZ	P_F3
    
    	;.............................
    
    	LD	IX,ENEMY
    	LD	B,E_COUNT
    P_F2	PUSH	BC
    
    	;Инициализируем переменные
    	LD	L,(IX+E_SH_OLD_COORD)
    	LD	H,(IX+E_SH_OLD_COORD+1)
    	LD      (W_COORD),HL
    	LD	L,(IX+E_SH_COORD)
    	LD	H,(IX+E_SH_COORD+1)
    	LD	(IX+E_SH_OLD_COORD),L
    	LD	(IX+E_SH_OLD_COORD+1),H
    
    
    	LD	A,2
    	LD	(W_SPRW),A
    	LD	A,16
    	LD	(W_SPRH),A
    
    	;Восстановим фон под снарядом
    	CALL	RESTORE_FON
    
    	POP	BC
    	LD	DE,ENEMY_LEN
    	ADD	IX,DE
     	DJNZ	P_F2
    
    	;.............................
    
    	;Инициализируем переменные
    	LD	HL,(B_OLD_COORD)
    	LD      (W_COORD),HL
    	LD	HL,(B_COORD)
    	LD	(B_OLD_COORD),HL
    	LD	A,2
    	LD	(W_SPRW),A
    	LD	A,16
    	LD	(W_SPRH),A
    
    	;Восстановим фон под бонусом
    	CALL	RESTORE_FON
    
    	RET
    
    
    
    ;--------------------------
    RESTORE_FON
    
    	;Ограничим выход буфера за пределы уровня
    	LD	HL,(W_COORD)
    	SRL	H
    	SRL	H
    	SRL	H
    	SRL	L
    	SRL	L
    	SRL	L
    
    	LD	A,(W_SPRW)	;2
    	INC	A		;3
    	ADD	A,H		;23+3=26
    	LD	B,A		;26
    
    	LD	A,(W_SPRH)	;16
    	SRL	A
    	SRL	A
    	SRL	A		;2
    	INC	A		;3
    	ADD	A,L		;+0
    	LD	C,A		;3
    
    	XOR	A
    	CP	H		;0
    	JR	Z,N_DECH
    	DEC	H		;23
    N_DECH
    	CP	L		;0
    	JR	Z,N_DECL
    	DEC	L
    N_DECL				;0
    	LD	A,25
    	CP	B		;26
    	JR	NC,N_DECB
    	LD	B,26		;25
    N_DECB				
    	LD	A,23
    	CP	C		;3
    	JR	NC,N_DECC
    	LD	C,24
    N_DECC
    
    	LD	A,C		;3
    	SUB	L		;3-0=3
    	ADD	A,A		;6
    	ADD	A,A		;12
    	ADD	A,A		;24
    	LD	C,A		;24
    
    	LD	A,B		;25
    	SUB	H		;23
    	LD	B,A		;2
    
    	CALL	ADR		;C000
    
    RES_DH	PUSH	HL
    	PUSH	BC
    
    	LD	E,L		;0
    	LD	A,H		;C0
    	OR	#20
    	LD	D,A		;E0
    	
    RES_DW	LD	A,(DE)
    	LD	(HL),A
    	INC	HL		;C001
    	INC	DE		;E001
    	DJNZ	RES_DW
    
    	POP	BC
    	POP	HL
    	CALL	DOWN		;C100
    
    	DEC	C
    	JR	NZ,RES_DH
    
    	RET
    
    ;--------------------------
    FILL_COORD_POS
    	SRL	H
    	SRL	H
    	SRL	H
    	SRL	L
    	SRL	L
    	SRL	L
    
    	PUSH	HL
    	CALL	ADR
    
    	LD	A,#20
    	OR	H
    	LD	D,A
    	LD	E,L
    
    	PUSH	IX
    	LD	B,8
    FCP_D	LD	IX,0
    CCP	LD	A,(IX)
    	LD	(DE),A
    	LD	(HL),A
    	INC	H
    	INC	D
    	INC	IX
    	DJNZ	CCP
    	POP	IX
    
    
    	POP	HL
    	LD	E,H
    	LD	D,0
    
    	LD	H,0
    	ADD	HL,HL
    	ADD	HL,HL
    	ADD	HL,HL
    	ADD	HL,HL
    	ADD	HL,HL
    	ADD	HL,DE
    
    	LD	DE,#D800
    	ADD	HL,DE
    
    	LD	A,#20
    	OR	H
    	LD	D,A
    	LD	E,L
    
    FCP_CLR	LD	A,0
    	LD	(HL),A
    	LD	(DE),A
    	RET
    FCP_DATA	EQU	FCP_D+2
    FCP_COLOR	EQU	FCP_CLR+1
    
    ;---------------------
    PRINT_SPRITE  
    	LD	HL,(W_COORD)
              
    	SRL	L
    	SRL	L
    	SRL	L
    	SRL	H
    	SRL	H
    	SRL	H
    
    	CALL	ADR
    	
    	LD	A,(W_COORD)
    	AND	7
    	ADD	A,H
    	LD	H,A
    	
    	LD	DE,(W_SPRADR) 
    
    	LD	A,(W_SPRH)
    	LD	B,A		;Высота спрайта в пикселях
    FOR_Y	PUSH	BC
    	PUSH	HL		;Сохраним адрес буффера
    
    	LD	A,(W_SPRW)
    	LD	C,A		;Ширина спрайта в знакоместах
    FOR_X	LD	A,(DE)		;Байт спрайта
    MODE	NOP
    	LD	(HL),A		;В экран
    	INC	DE		;Следующий байт спрайта
    	INC	HL		;Соседнее знакоместо в экране
    	DEC	C		;Уменьшим ширину спрайта
    	JR	NZ,FOR_X
    
    	POP	HL		;Вспомним адрес экрана
    	POP	BC
            CALL	DOWN
    
    	DJNZ	FOR_Y
    	RET
    
    MOD_PUT		EQU	#00		;NOP
    MOD_OR		EQU	#B6		;OR (HL)
    MOD_AND		EQU	#A6		;AND (HL)
    MOD_XOR		EQU	#AE		;XOR (HL)
    
    ;------------------------------
    COLORIZE_BUF
    	LD   HL,#F800
    	LD   DE,LEVEL
    
    	LD   C,24
    
    CLR_1	PUSH BC
    	PUSH HL
    	PUSH DE
    	LD   B,26
    CLR_2     
    	LD   A,(DE)
              
    
    	LD   C,%00100010
    	CP   1
    	JR   Z,CLR_3
    
    	LD   C,%00000111
    	CP   2
    	JR   Z,CLR_3
    
    	LD   C,%01001111
    	CP   3
    	JR   Z,CLR_3
    
    	LD   C,%00100110
    	CP   4
    	JR   Z,CLR_3
    
    	LD   C,%00101111
    	CP   5
    	JR   Z,CLR_3
    
    	LD   C,%00000010
    	CP   6
    	JR   Z,CLR_3
              
    	LD   C,7
    
    CLR_3     
    	LD   (HL),C
              
    	INC  HL
    	INC  DE
    	DJNZ CLR_2
              
    	POP  HL
    	LD   BC,26
    	ADD  HL,BC
    	EX   DE,HL
    
    	POP  HL
    	LD   BC,32
    	ADD  HL,BC
    
    	POP  BC
    	DEC  C
    	JR   NZ,CLR_1
    
    	RET
    
    ;------------------------------
    COLORIZE_SCREEN
    
    	LD	HL,#F800
    	LD	DE,#D800
    	LD	BC,768
    	LDIR
    	RET
    
    ;----------------------
    COLORIZE_RIGHT
    	LD	HL,#D81A
    	LD	B,24
    	LD	DE,32
    C_R1    PUSH	HL
    	LD	(HL),%00101000
    	INC	HL
    	LD	(HL),%00101000
    	INC	HL
    	LD	(HL),%00101000
    	INC	HL
    	LD	(HL),%00101000
    	INC	HL
    	LD	(HL),%00101000
    	INC	HL
    	LD	(HL),%00101000
    	POP	HL
           
    	ADD	HL,DE  
    	DJNZ	C_R1
    	RET
    
    ;------------------------------
    OPEN_WEIL
    	LD	HL,#D960
    	LD	(TOP_A),HL
    	LD	HL,#D980
    	LD	(BOT_A),HL
    
    	LD	B,12
    O_W1	PUSH	BC
    
    	LD	HL,(TOP_A)
    	LD	DE,#2000
    	ADD	HL,DE
    	LD	DE,(TOP_A)
    	LD	BC,26
    	LDIR
    
    	LD	HL,(BOT_A)
    	LD	DE,#2000
    	ADD	HL,DE
    	LD	DE,(BOT_A)
    	LD	BC,26
    	LDIR
    
    	LD	DE,32
    	LD	HL,(TOP_A)
    	AND	A
    	SBC	HL,DE
    	LD	(TOP_A),HL
    
    	LD	HL,(BOT_A)
    	ADD	HL,DE
    	LD	(BOT_A),HL
    
    
    	LD	BC,1000
    O_W2	DEC	BC
    	LD	A,B
    	OR	C
    	JR	NZ,O_W2
    
    	POP	BC
    	DJNZ	O_W1
    
    
    	RET
    
    
    TOP_A	DEFW	0
    BOT_A	DEFW	0
    
    ;----------------------
    CLOSE_WEIL
    	LD	HL,#D800
    	LD	(TOP_A),HL
    	LD	HL,#DAE0
    	LD	(BOT_A),HL
    
    	LD	B,12
    C_W1	PUSH	BC
    
    	LD	HL,(TOP_A)
    	PUSH	HL
    	POP	DE
    	INC	DE
    	LD	(HL),%00101101
    	LD	BC,31
    	LDIR
    
    	LD	HL,(BOT_A)
    	PUSH	HL
    	POP	DE
    	INC	DE
    	LD	(HL),%00101101
    	LD	BC,31
    	LDIR
    
    	LD	BC,1000
    C_W2	DEC	BC
    	LD	A,B
    	OR	C
    	JR	NZ,C_W2
    
    
    	POP	BC
    	LD	DE,32
    	LD	HL,(TOP_A)
    	ADD	HL,DE
    	LD	(TOP_A),HL
    
    	LD	HL,(BOT_A)
    	AND	A
    	SBC	HL,DE
    	LD	(BOT_A),HL
    
    	DJNZ	C_W1
    	RET
    
    
    ;---------------------------
    CLS
    	PUSH	BC
    
    	LD	DE,#C001
    	LD	HL,#C000
    	LD	(HL),0
    	LD	BC,#1800
    	LDIR
    	LD	(HL),A
    	LD	BC,#0300
    	LDIR
    
    	LD	DE,#E001
    	LD	HL,#E000
    	LD	(HL),0
    	LD	BC,#1800
    	LDIR
    	LD	(HL),A
    	LD	BC,#0300
    	LDIR
    
    	POP	AF
    
    	CALL	8859      ;BORDER
    
    	RET
    
    
    ;--------------------------
    PRINT_LEVEL
    	
    	LD	HL,#0000	;X,Y - В знакоместах
    	LD	DE,LEVEL	;Данные уровня
    
    P_L3	PUSH	HL		;Сохраним X,Y        
            CALL	ADR
    
    	LD	C,26		;Цикл по ширине уровня
    P_L2	PUSH	DE
    	PUSH	HL
    
    	LD	A,(DE)		;Значение из уровня
    	ADD	A,A		;Умножим на 8
    	ADD	A,A
    	ADD	A,A
    	LD	H,0
    	LD	L,A
    	LD	DE,SPR_C0
    	ADD	HL,DE
    	EX	DE,HL		;Адрес тайла
    	POP	HL
            PUSH	HL
    
    	LD	B,8
    P_L1	LD	A,(DE)
    	LD	(HL),A
    	INC	H
    	INC	DE
    	DJNZ	P_L1
    
    P_L4	POP	HL
    	POP	DE
            
    	INC	DE
    	INC	HL
    
    	DEC	C
    	JR	NZ,P_L2
            
    	POP	HL
    	INC	L
    	LD	A,L
    	CP	24
    	JR	NZ,P_L3
    
    	;Сделаем копию уровня во второй половине банки
    	LD	HL,#0000
    	CALL	ADR
    	LD	E,L
    	LD	A,H
    	OR	#20
    	LD	D,A
    	LD	BC,#1800
    	LDIR
    
    	RET
    
    
    
    ;--------------------------
    DOWN	INC	H
    	LD	A,H
    	AND	#07
    	RET	NZ
    	LD	A,L
    	ADD	A,#20
    	LD	L,A
    	RET	C
    	LD	A,H
    	SUB	#08
    	LD	H,A
    	RET
    
    ;--------------------------
    ADR	LD	A,L
    	AND	7
    	RRCA
    	RRCA
    	RRCA
    	ADD	A,H
    	LD	H,L
    	LD	L,A
    	LD	A,H
    	AND	#18
    	OR	#C0
    	LD	H,A
    	RET
    
    ;---------------------------
    E_SHOT_MOVE
    	;Данные для очистки/заполнения
    	LD	HL,SPR_C0
    	LD	(FCP_DATA),HL
    	LD	A,7
    	LD	(FCP_COLOR),A
    
    	LD	A,3
    	LD	(L_DOP),A
    
    	LD	IX,ENEMY
    	LD	B,E_COUNT
    ESMALL	PUSH	BC
    
    	LD	A,(IX+E_SH_ACTIVE)
    	CP	0
    	JP	Z,ESM_NEXT
           
    	LD	A,(IX+E_SH_DIRECT)
    	LD	L,(IX+E_SH_COORD)
    	LD	H,(IX+E_SH_COORD+1)
           
    	CALL	UPDATE_COORD
    	CALL	UPDATE_COORD
    	CALL	UPDATE_COORD
    
    	LD	A,H
    	CP	203
    	JR	C,ESM1
    	XOR	A
    	LD	(IX+E_SH_ACTIVE),A
    	JP	ESM_NEXT
    ESM1	LD	A,L
    	CP	187
    	JR	C,ESM2
    	XOR	A
    	LD	(IX+E_SH_ACTIVE),A
    	JP	ESM_NEXT
    
    ESM2
    	LD	A,6
    	LD	(BOX_HL_W),A
    	LD	(BOX_HL_H),A
    	CALL	T_SHOT_COLLISION
    	CP	1
    	JR	NZ,ESM3
    	LD	(IX+E_SH_ACTIVE),0
    	JP	ESM_NEXT
    
    ESM3
    	CALL	PLAYER_COLLISION
    	CP	1
    	JR	NZ,ESM4
    	XOR	A
    	LD	(IX+E_SH_ACTIVE),A
    	LD	A,(T_PROTECT_TIMER)
    	CP	0
    	JP	NZ,ESM_NEXT
    
    	LD	A,(T_POWER)
    	CP	3
    	JR	NC,ESM_NODED
    	XOR	A
    	LD	(T_ACTIVE),A
    	LD	A,(T_LIVES)
    	DEC	A
    	LD	(T_LIVES),A
    	;Уберём пистолет
    	XOR	A
    	LD	(T_POWER),A
    	INC	A
    	LD	(T_COL_SHOT),A
    	CALL	ON_CRASH_SOUND
    	CALL	SELECT_T_SPRITE
    	JP	ESM_NEXT
    ESM_NODED
    	;Уберём пистолет
    	LD	A,2
    	LD	(T_POWER),A
    	CALL	ON_CLANG_SOUND
    	CALL	SELECT_T_SPRITE
    	JP	ESM_NEXT
    
    	;....................
    
    ESM4	PUSH	HL
    
    	CALL	COORD_IS_FILL
    	CP	1
    	JR	NZ,ESM5
    	XOR	A
    	LD	(IX+E_SH_ACTIVE),A
    	CALL	TM_CLR	
    ESM5	POP	HL
    	PUSH	HL
    
    	LD	A,5
    	ADD	A,L
    	LD	L,A
    
    	CALL	COORD_IS_FILL
    	CP	1
    	JR	NZ,ESM6
    	XOR	A
    	LD	(IX+E_SH_ACTIVE),A
    	CALL	TM_CLR
    
    ESM6	POP	HL
    	PUSH	HL
    
    	LD	A,5
    	ADD	A,H
    	LD	H,A
    
    	CALL	COORD_IS_FILL
    	CP	1
    	JR	NZ,ESM7
    	XOR	A
    	LD	(IX+E_SH_ACTIVE),A
    	CALL	TM_CLR
    	
    ESM7	POP	HL
    	PUSH	HL
    
    	LD	A,5
    	ADD	A,H
    	LD	H,A
    	LD	A,5
    	ADD	A,L
    	LD	L,A
    
    	CALL	COORD_IS_FILL
    	CP	1
    	JR	NZ,ESM_UC
    	XOR	A
    	LD	(IX+E_SH_ACTIVE),A
    	CALL	TM_CLR
    
    ESM_UC	POP	HL
    	LD	(IX+E_SH_COORD),L
    	LD	(IX+E_SH_COORD+1),H
    
    ESM_NEXT
    	POP	BC
    	LD	DE,ENEMY_LEN
    	ADD	IX,DE
    	DEC	B
    	JP	NZ,ESMALL
    	RET
    ;---------------------------
    TM_CLR
    	LD	B,A
    	LD	DE,(CALCULATED_LPOS)
    	LD	A,(DE)
    	CP	6
    	JR	NZ,TM_C1
    	LD	A,1
    	LD	(BASE_DAMAGED),A
    	CALL	ON_CRASH_SOUND
    	RET
    TM_C1	LD	A,B
    
    	CP	3
    	JR	C,HER
    
    	;Данные для очистки/заполнения
    TM_ZR	LD	DE,SPR_C0
    	LD	(FCP_DATA),DE
    	LD	A,7
    	LD	(FCP_COLOR),A
    
    	XOR	A
    	LD	DE,(CALCULATED_LPOS)
    	LD	(DE),A
    
    TM_ZR1	PUSH	HL
    	CALL	FILL_COORD_POS
    	POP	HL
    	CALL	SWAP_SCREEN
    	CALL	FILL_COORD_POS
    	CALL	SWAP_SCREEN
    	RET
    
    HER	LD	DE,(CALCULATED_LPOS)
    	LD	A,(DE)
    	CP	2	;Бетонка
    	RET	Z
    	CP	7	;Полуразрушеный кирпич
    	JR	Z,TM_ZR	;Доламываем
    
    	LD	A,7	;Рушим кирпич
    	LD	(DE),A
    	LD	DE,SPR_C1
    	LD	(FCP_DATA),DE
    	LD	A,2
    	LD	(FCP_COLOR),A
    	JR	TM_ZR1
    
    ;---------------------------
    T_SHOT_MOVE
    	LD	A,3
    	LD	(L_DOP),A
    
    	LD	IX,T_SHOT
    	LD	A,(T_COL_SHOT)
    	LD	B,A
    TSMALL	PUSH	BC
    
    	LD	A,(IX+T_SH_ACTIVE)
    	CP	0
    	JP	Z,T_SH_NEXT
    
    	LD	A,(IX+T_SH_DIRECT)
    	LD	L,(IX+T_SH_COORD)
    	LD	H,(IX+T_SH_COORD+1)
           
    	CALL	UPDATE_COORD
    	CALL	UPDATE_COORD
    	CALL	UPDATE_COORD
    	LD	A,(IX+T_SH_SPEED)
    	CP	0
    	LD	A,(IX+T_SH_DIRECT)
    	JR	Z,NO_SPEED
    	CALL	UPDATE_COORD
    	CALL	UPDATE_COORD
    NO_SPEED
    
    
    	LD	A,H
    	CP	203
    	JR	C,TSM1
    	LD	(IX+T_SH_ACTIVE),0
    	JP	T_SH_NEXT
    
    TSM1	LD	A,L
    	CP	187
    	JR	C,TSM2
    	LD	(IX+T_SH_ACTIVE),0
    	JP	T_SH_NEXT
    
    TSM2	LD	A,6
    	LD	(BOX_HL_W),A
    	LD	(BOX_HL_H),A
    	PUSH	HL
    	CALL	ENEMY_COLLISION
    	POP	HL
    	CP	0
    	JR	Z,TSM3
    	LD	(IX+T_SH_ACTIVE),0
    
    	PUSH	IX
    	LD	IX,(ECOL_ADDR)
    	DEC	(IX+E_HP)
    	LD	A,(IX+E_BONUSED)
    	CP	1
    	CALL	Z,INIT_BONUS
    	LD	(IX+E_BONUSED),0
    	LD	(IX+E_VISIBLE),1
    	LD	A,(IX+E_HP)
    	LD	B,(IX+E_TYPE)
    	POP	IX
    
    	CP	0
    	JR	Z,CRASH
    	CALL	ON_CLANG_SOUND
    	JP	T_SH_NEXT
    CRASH
    	LD	HL,L_ECOUNT
    	LD	E,B
    	LD	D,0
    	ADD	HL,DE
    	INC	(HL)
    	LD	HL,(SCORE)
    	INC	E
    	ADD	HL,DE
    	LD	(SCORE),HL
    	
    	CALL	ON_CRASH_SOUND
    	JP	T_SH_NEXT
    
    	
    TSM3	PUSH	HL
    
    	CALL	COORD_IS_FILL
    	CALL	CUT_BUSH
    	CP	1
    	JR	NZ,TSM4
    	LD	(IX+T_SH_ACTIVE),0
    	LD	A,(T_POWER)
    	CALL	TM_CLR
    
    TSM4	POP	HL
    	PUSH	HL
    
    	LD	A,5
    	ADD	A,L
    	LD	L,A
    
    	CALL	COORD_IS_FILL
    	CALL	CUT_BUSH
    	CP	1
    	JR	NZ,TSM5
    	
    	LD	(IX+T_SH_ACTIVE),0
    	LD	A,(T_POWER)
    	CALL	TM_CLR
    
    TSM5	POP	HL	
    	PUSH	HL
    	
    	LD	A,5
    	ADD	A,H
    	LD	H,A
    
    	CALL	COORD_IS_FILL
    	CALL	CUT_BUSH
    	CP	1
    	JR	NZ,TSM6
    
    	LD	(IX+T_SH_ACTIVE),0
    	LD	A,(T_POWER)
    	CALL	TM_CLR
    
    TSM6	POP	HL
    	PUSH	HL
    	
    	LD	A,5
    	ADD	A,H
    	LD	H,A
    	LD	A,5
    	ADD	A,L
    	LD	L,A
    
    	CALL	COORD_IS_FILL
    	CALL	CUT_BUSH
    	CP	1
    	JR	NZ,TSMEND
    
    	LD	(IX+T_SH_ACTIVE),0
    	LD	A,(T_POWER)
    	CALL	TM_CLR
    
    TSMEND	POP	HL
    	LD	(IX+T_SH_COORD),L
    	LD	(IX+T_SH_COORD+1),H
    T_SH_NEXT
    	POP	BC
    	LD	DE,T_SH_LEN
    	ADD	IX,DE
    	DEC	B
    	JP	NZ,TSMALL
    	RET
    ;----------------------------
    CUT_BUSH
    	LD	(CUT_COORD),HL
    	PUSH	HL
    	PUSH	AF
    
    	LD	HL,(CALCULATED_LPOS)
    	LD	A,(HL)
    	
    	CP	4
    	JR	NZ,NO_CUT	;Не куст
    	LD	A,(T_POWER)
    	CP	5
    	JR	C,NO_CUT	;Не хватает силы
    
    	;Данные для очистки/заполнения
    	LD	HL,SPR_C0
    	LD	(FCP_DATA),HL
    	LD	A,7
    	LD	(FCP_COLOR),A
    
    
    	LD	HL,(CUT_COORD)
    	CALL	FILL_COORD_POS
    	CALL	SWAP_SCREEN
    	LD	HL,(CUT_COORD)
    	CALL	FILL_COORD_POS
    	CALL	SWAP_SCREEN
    
    
    NO_CUT	POP	AF
    	POP	HL
    	RET
    CUT_COORD
    	DEFW	0
    ;----------------------------
    UPDATE_COORD
           CP    1
           JR    Z,UPD_L  
           CP    2
           JR    Z,UPD_R
           CP    3
           JR    Z,UPD_U
           CP    4
           JR    Z,UPD_D
           RET   
    UPD_L  DEC   H
           RET
    UPD_R  INC   H
           RET
    UPD_U  DEC   L
           RET
    UPD_D  INC   L
           RET
    
    ;-----------------------------
    PRESS_F
    
    	LD	A,(T_SH_TIMER)
    	CP	0
    	JR	Z,PF_S
    	DEC	A
    	LD	(T_SH_TIMER),A
    	RET
    
    PF_S	LD	IX,T_SHOT
    	LD	A,(T_COL_SHOT)
    	LD	B,A
    PF_ALL	PUSH	BC
    
    	LD	A,(T_SH_TIMER)
    	CP	0
    	JR	NZ,PF_NEXT
    
    
    	LD	A,(IX+T_SH_ACTIVE)
    	CP	1
    	JR	Z,PF_NEXT
    
    	LD	A,(T_DIRECT)
    	LD	HL,(T_COORD)
           
    	LD	D,5
    	LD	E,5 
    
    	ADD	HL,DE
    	LD	(IX+T_SH_COORD),L
    	LD	(IX+T_SH_COORD+1),H
    
    	LD	(IX+T_SH_DIRECT),A
    	LD	(IX+T_SH_ACTIVE),1
    	LD	(IX+T_SH_SPEED),0
    	LD	A,(T_POWER)
    	CP	0
    	JR	Z,NOSPEED
    	LD	(IX+T_SH_SPEED),1
    NOSPEED
    	CALL	ON_SHOT_SOUND
    	LD	A,1
    	LD	(T_SH_TIMER),A
    
    PF_NEXT	POP	BC
    	LD	DE,T_SH_LEN
    	ADD	IX,DE
    	DJNZ	PF_ALL
    	RET
    
    
    ;-----------------------------
    PRESS_R
    	LD	A,(T_ACTIVE)
    	CP	0
    	RET	Z
    
    	LD	A,2
    	LD	(T_DIRECT),A
    
    	LD	A,(T_COORD)    ;Сделаем "поперечную" координату кратной 8
    	BIT	2,A
    	JR	Z,PR_R1
    	ADD	A,8
    PR_R1	AND	248          
    	LD	(T_COORD),A
    
    	LD	A,3
    	LD	(T_SPR_W),A
    
    	LD	A,(T_COORD+1)
    	INC	A
    	CP	193
    	JR	Z,CLC_SN
    
    	LD	HL,(T_COORD)
    	LD	A,16
    	ADD	A,H
    	LD	H,A
    	PUSH	HL
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	Z,CLC_SN
           
    	PUSH	HL
    	LD	A,15
    	ADD	A,L
    	LD	L,A
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	Z,CLC_SN
    
    	LD	A,0
    	LD	(BOX_HL_W),A
    	LD	A,15
    	LD	(BOX_HL_H),A
    	CALL	ENEMY_COLLISION
    	CP	1
    	JR	Z,CLC_SN
    
    	LD	HL,(T_COORD)
    	INC	H
    	LD	(T_COORD),HL
    
    CLC_SN	LD	HL,TANK_RIGHT1
    	LD	A,(T_FASE)
    	XOR	1
    	LD	(T_FASE),A	
    	CP	0
    	JR	Z,NO_RF2
    	LD	HL,TANK_RIGHT2
    NO_RF2
    	LD	A,(T_COORD+1)
    	AND	7
    	CP	0
    	JR	Z,NO_ADDSR
    	LD      DE,48
    	LD	B,A
    ADDSR	ADD	HL,DE
    	DJNZ	ADDSR
    NO_ADDSR
    	LD	(T_SPR_ADR),HL
    	RET
    	
    ;-----------------------------
    PRESS_L
    	LD	A,(T_ACTIVE)
    	CP	0
    	RET	Z
    
    	LD	A,1
    	LD	(T_DIRECT),A
    
    	LD	A,(T_COORD)
    	BIT	2,A
    	JR	Z,PR_L1
    	ADD	A,8
    PR_L1	AND	248
    	LD	(T_COORD),A
    
    	LD	A,3
    	LD	(T_SPR_W),A
    
    	LD	A,(T_COORD+1)
    	DEC	A
    	CP	255
    	JR	Z,CLC_SL
    
    	LD	HL,(T_COORD)
    	DEC	H
    	PUSH	HL
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	Z,CLC_SL
           
    	PUSH	HL
    	LD	A,15
    	ADD	A,L
    	LD	L,A
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	Z,CLC_SL
    
    	LD	A,0
    	LD	(BOX_HL_W),A
    	LD	A,15
    	LD	(BOX_HL_H),A
    	CALL	ENEMY_COLLISION
    	CP	1
    	JR	Z,CLC_SL
    
    	LD	HL,(T_COORD)
    	DEC	H
    	LD	(T_COORD),HL
    
    CLC_SL	LD	HL,TANK_LEFT1
    	LD	A,(T_FASE)
    	XOR	1
    	LD	(T_FASE),A	
    	CP	0
    	JR	Z,NO_F2
    	LD	HL,TANK_LEFT2
    NO_F2
    	LD	A,(T_COORD+1)
    	AND	7
    	CP	0
    	JR	Z,NO_ADDSL
    	LD      DE,48
    	LD	B,A
    ADDSL	ADD	HL,DE
    	DJNZ	ADDSL
    NO_ADDSL
    	LD	(T_SPR_ADR),HL
    	RET
    ;-----------------------------
    PRESS_U
    	LD	A,(T_ACTIVE)
    	CP	0
    	RET	Z
    
    	LD	A,3
    	LD	(T_DIRECT),A
    
    	LD	A,(T_COORD+1)
    	BIT	2,A
    	JR	Z,PR_U1
    	ADD	A,8
    PR_U1	AND	248
    	LD	(T_COORD+1),A
    
    	LD	A,2
    	LD	(T_SPR_W),A
    
    	LD	A,(T_COORD)
    	DEC	A
    	CP	255
    	JR	Z,CLC_SU
    
    	LD	HL,(T_COORD)
    	DEC	L
    	PUSH	HL
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	Z,CLC_SU
           
    	PUSH	HL
    	LD	A,15
    	ADD	A,H
    	LD	H,A
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	Z,CLC_SU
    
    	LD	A,15
    	LD	(BOX_HL_W),A
    	LD	A,0
    	LD	(BOX_HL_H),A
    	CALL	ENEMY_COLLISION
    	CP	1
    	JR	Z,CLC_SU
    
    
    	LD	HL,(T_COORD)
    	DEC	L
    	LD	(T_COORD),HL
    
    CLC_SU	LD	HL,TANK_UP1
    	LD	A,(T_FASE)
    	XOR	1
    	LD	(T_FASE),A	
    	CP	0
    	JR	Z,NO_UF2
    	LD	HL,TANK_UP2
    NO_UF2
    	LD	(T_SPR_ADR),HL
    	RET
    ;-----------------------------
    PRESS_D 
    	LD	A,(T_ACTIVE)
    	CP	0
    	RET	Z
    
    	LD	A,4
    	LD	(T_DIRECT),A
    
    	LD	A,(T_COORD+1)
    	BIT	2,A
    	JR	Z,PR_D1
    	ADD	A,8
    PR_D1	AND	248
    	LD	(T_COORD+1),A
    
    	LD	A,2
    	LD	(T_SPR_W),A
           
    	LD	A,(T_COORD)
    	INC	A
    	CP	177
    	JR	Z,CLC_SD
    
    	LD	HL,(T_COORD)
    	LD	A,16
    	ADD	A,L
    	LD	L,A
    	PUSH	HL
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	Z,CLC_SD
           
    	PUSH	HL
    	LD	A,15
    	ADD	A,H
    	LD	H,A
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	Z,CLC_SD
    
    	LD	A,15
    	LD	(BOX_HL_W),A
    	LD	A,0
    	LD	(BOX_HL_H),A
    	CALL	ENEMY_COLLISION
    	CP	1
    	JR	Z,CLC_SD
    
    	LD	HL,(T_COORD)
    	INC	L
    	LD	(T_COORD),HL
    
    CLC_SD
    	LD	HL,TANK_DOWN1
    	LD	A,(T_FASE)
    	XOR	1
    	LD	(T_FASE),A	
    	CP	0
    	JR	Z,NO_DF2
    	LD	HL,TANK_DOWN2
    NO_DF2
    
    	LD	(T_SPR_ADR),HL
    	;LD	HL,PRESS_D
    	;LD	(LAST_DIRECT+1),HL
    
    	RET
    
    
    ;------------------------------
    KEY_TEST
    SLT	EQU	8
    	XOR	A
    	LD	(U_PRESSED),A
    	LD	(D_PRESSED),A
    	LD	(L_PRESSED),A
    	LD	(R_PRESSED),A
    	LD	(F_PRESSED),A
    
    	LD	A,(F_PORT)
    	IN	A,(254)
    F_BIT	BIT	0,A		;будет заменяться при редефайне
    	JR	Z,K_T1		;уже нажата, кемпстон не проверяем
    	LD	A,(IS_KEMPSTON)
    	CP	0
    	JR	Z,K_T11		;кемпстон отключен, не проверяем
    	IN	A,(31)
    	BIT	4,A
    	JR	Z,K_T11
    K_T1	LD	A,1
    	LD	(F_PRESSED),A
    
    
    K_T11	LD	A,(L_PORT)	;#FD
    	IN	A,(254)
    L_BIT	BIT	0,A
    	JR	Z,K_T2
    	LD	A,(IS_KEMPSTON)
    	CP	0
    	JR	Z,K_T22
    	IN	A,(31)
    	BIT	1,A
    	JR	Z,K_T22
    K_T2	LD	A,1
    	LD	(L_PRESSED),A
    	LD	A,SLT
    	LD	(T_SLIP_TIMER),A
    	LD	HL,PRESS_L
    	LD	(LAST_DIRECT+1),HL
    
    K_T22	LD	A,(D_PORT)	;#FD
    	IN	A,(254)
    D_BIT	BIT	1,A
    	JR	Z,K_T3
    	LD	A,(IS_KEMPSTON)
    	CP	0
    	JR	Z,K_T33
    	IN	A,(31)
    	BIT	3,A
    	JR	Z,K_T33
    K_T3	LD	A,1
    	LD	(D_PRESSED),A
    	LD	A,SLT
    	LD	(T_SLIP_TIMER),A
    	LD	HL,PRESS_D
    	LD	(LAST_DIRECT+1),HL
    
    K_T33	LD	A,(R_PORT)	;#FD
    	IN	A,(254)
    R_BIT	BIT	2,A
    	JR	Z,K_T4
    	LD	A,(IS_KEMPSTON)
    	CP	0
    	JR	Z,K_T44
    	IN	A,(31)
    	BIT	0,A
    	JR	Z,K_T44
    K_T4	LD	A,1
    	LD	(R_PRESSED),A
    	LD	A,SLT
    	LD	(T_SLIP_TIMER),A
    	LD	HL,PRESS_R
    	LD	(LAST_DIRECT+1),HL
    
    K_T44	LD	A,(U_PORT)	;#FB
    	IN	A,(254)
    U_BIT	BIT	1,A
    	JR	Z,K_T5
    	LD	A,(IS_KEMPSTON)
    	CP	0
    	RET	Z	;JR	Z,K_T55
    	IN	A,(31)
    	BIT	2,A
    	RET	Z	;JR	NZ,K_T55
    K_T5	LD	A,1
    	LD	(U_PRESSED),A
    	LD	A,SLT
    	LD	(T_SLIP_TIMER),A
    	LD	HL,PRESS_U
    	LD	(LAST_DIRECT+1),HL
    
    ;K_T55
    	
    
    	RET
    ;------------------------------
    USE_BONUS
    	LD	HL,(SCORE)
    	LD	DE,5
    	ADD	HL,DE
    	LD	(SCORE),HL
    
    
    	XOR	A
    	LD	(B_ACTIVE),A
    	LD	A,(B_INDEX)
    
    
    	CP	0		;Каска
    	JR	NZ,UB_1
    	LD	A,255
    	LD	(T_PROTECT_TIMER),A
    	CALL	ON_BONUS_SOUND
    	RET
    
    UB_1	CP	1		;Будильник
    	JR	NZ,UB_2
    	LD	A,255
    	LD	(STOP_TIMER),A
    	CALL	ON_BONUS_SOUND
    	RET
    
    UB_2	CP	2		;Жизнь
    	JR	NZ,UB_3
    	LD	A,(T_LIVES)
    	INC	A
    	LD	(T_LIVES),A
    	CALL	ON_ADD_LIVE_SOUND
    	RET
    
    UB_3	CP	3		;Пистолет
    	JR	NZ,UB_4
    	LD	A,(T_POWER)
    	CP	250
    	RET	NC
    	ADD	A,3
    	LD	(T_POWER),A
    	LD	A,2
    	LD	(T_COL_SHOT),A
    	CALL	SELECT_T_SPRITE
    	CALL	ON_BONUS_SOUND
    	RET
    
    UB_4	CP	4		;Граната
    	JR	NZ,UB_5
    	
    	LD	IX,ENEMY
    	LD	DE,ENEMY_LEN
    	LD	B,3
    UB_EN	LD	(IX+E_HP),0
    	ADD	IX,DE
    	DJNZ	UB_EN
    	CALL	ON_CRASH_SOUND
    	RET
    
    UB_5	CP	5		;Звезда
    	JR	NZ,UB_6
    	LD	A,(T_POWER)
    	CP	255
    	RET	Z
    	INC	A
    	LD	(T_POWER),A
    	CP	2
    	JR	C,NO_DBL
    	LD	A,2
    	LD	(T_COL_SHOT),A
    NO_DBL	CALL	SELECT_T_SPRITE
    	CALL	ON_BONUS_SOUND
    	
    	
    	RET
    
    UB_6
    
    	RET
    
    ;------------------------------
    T_ACTION
    	LD	A,(BASE_DAMAGED)
    	CP	1
    	RET	Z
    
    	CALL	T_COORD_IS_ICE
    
    	XOR	A
    	LD	(L_DOP),A
    
    	LD	A,(U_PRESSED)
    	CP	1
    	CALL	Z,PRESS_U
    	
    	LD	A,(D_PRESSED)
    	CP	1
    	CALL	Z,PRESS_D
    
    	LD	A,(L_PRESSED)
    	CP	1
    	CALL	Z,PRESS_L
    
    	LD	A,(R_PRESSED)
    	CP	1
    	CALL	Z,PRESS_R
    
    	LD	A,(F_PRESSED)
    	CP	1
    	CALL	Z,PRESS_F
    	;------------------------------
    	
    	LD	A,(T_SLIP_TIMER)
    	CP	0
    	JR	Z,NOSLIP
    	DEC	A
    	LD	(T_SLIP_TIMER),A
    
    
    	LD	A,(IS_ICE)
    	CP	0
    	JR	Z,NOSLIP
    LAST_DIRECT
    	CALL	NZ,0
    	
    NOSLIP
    	;------------------------------
    	LD	A,(B_ACTIVE)
    	CP	0
    	RET	Z
    
    	LD	HL,(B_COORD)
    	LD	A,15
    	LD	(BOX_HL_H),A
    	LD	(BOX_HL_W),A
    	CALL	PLAYER_COLLISION
    	CP	1
    	CALL	Z,USE_BONUS
    
    	RET
    
    ;-----------------------------
    E_FAST_DIRECT
    	;Пытаемся случайно изменить направление
    	CALL	RND_255
    	AND	3
    	INC	A
    	LD	(IX+E_DIRECT),A
    	RET
    
    ;-----------------------------
    E_ACTION
    	LD	A,(STOP_TIMER)
    	CP	0
    	JR	Z,E_A
    	DEC	A
    	LD	(STOP_TIMER),A
    	RET
    
    E_A
    	XOR	A
    	LD	(L_DOP),A
    
    
    	LD	IX,ENEMY      
    	LD	B,E_COUNT
    E_A1	PUSH	BC
    	LD	A,(IX+E_HP)
    	CP	0
    	JR	Z,E_ANEXT     ;Пропускаем танк, если не активен
    
    	;Пытаемся случайно стрелять
    	CALL	RND_255    
    	AND	15
    	CP	7
    	CALL	Z,E_FIRE
    
    	;Пытаемся случайно изменить направление
    	CALL	RND_255
    	CP	32
    	JR	NZ,E_ASD1
    	LD	(IX+E_DIRECT),1
    	JR	E_ASD4
    E_ASD1	CP	96
    	JR	NZ,E_ASD2
    	LD	(IX+E_DIRECT),2
    	JR	E_ASD4
    E_ASD2	CP	160
    	JR	NZ,E_ASD3
    	LD	(IX+E_DIRECT),3
    	JR	E_ASD4
    E_ASD3	CP	224
    	JR	NZ,E_ASD4
    	LD	(IX+E_DIRECT),4
    
    E_ASD4
    	LD	A,(IX+E_DIRECT)
    	CP	1
    	JR	NZ,E_AMR
    	CALL	E_MOVE_L
    	JR	E_ANEXT
    E_AMR	CP	2
    	JR	NZ,E_AMU
    	CALL	E_MOVE_R
    	JR	E_ANEXT
    E_AMU	CP	3
    	JR	NZ,E_AMD
    	CALL	E_MOVE_U
    	JR	E_ANEXT
    E_AMD	CP	4
    	JR	NZ,E_ANEXT
    	CALL	E_MOVE_D
    
    E_ANEXT	POP	BC
    	LD	DE,ENEMY_LEN
    	ADD	IX,DE
    	DJNZ	E_A1
    	RET
    
    ;-----------------------------
    E_FIRE
    	LD	A,(IX+E_SH_ACTIVE)
    	CP	1
    	RET	Z
    
    	LD	A,(IX+E_DIRECT)
    	LD	L,(IX+E_COORD)
    	LD	H,(IX+E_COORD+1)
           
    	LD	D,5
    	LD	E,5 
    
    	ADD	HL,DE
    	LD	(IX+E_SH_COORD),L
    	LD	(IX+E_SH_COORD+1),H
    	LD	(IX+E_SH_DIRECT),A
    	LD	A,1
    	LD	(IX+E_SH_ACTIVE),A
    	RET
    
    ;-----------------------------
    E_MOVE_R 
    	XOR	A
    	LD	(R_OP2),A
    	LD	(R_OP3),A
    	LD	A,(IX+E_TYPE)
    	CP	1
    	JR	NZ,R_NOINC
    	LD	A,#3C		;INC	A
    	LD	(R_OP2),A
    	LD	A,#04		;INC	B
    	LD	(R_OP3),A
    R_NOINC
    
    	LD	A,(IX+E_COORD)    ;Сделаем "поперечную" координату кратной 8
    	BIT	2,A
    	JR	Z,EM_R1
    	ADD	A,8
    EM_R1	AND	248          
    	LD	(IX+E_COORD),A
    
    	LD	A,3
    	LD	(IX+E_SPR_W),A
    
    	LD	A,(IX+E_COORD+1)
    	INC	A
    	CP	193
    	JR	NZ,EMR0
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SR
    
    EMR0	LD	L,(IX+E_COORD)
    	LD	H,(IX+E_COORD+1)
    	LD	A,16
    R_OP2	NOP
    	ADD	A,H
    	LD	H,A
    	PUSH	HL
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	NZ,EMR1
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SR
           
    EMR1	PUSH	HL
    	LD	A,15
    	ADD	A,L
    	LD	L,A
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	NZ,EMR2
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SR
    
    EMR2	LD	A,0
    	LD	(BOX_HL_W),A
    	LD	A,15
    	LD	(BOX_HL_H),A
    	PUSH	IX
    	CALL	ENEMY_COLLISION
    	POP	IX
    	CP	1
    	JR	NZ,EMR3
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SR
    
    EMR3	CALL	PLAYER_COLLISION
    	CP	1
    	JR	NZ,EMR4
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SR
    
    EMR4	LD	B,1
    R_OP3	NOP
    EMR5	INC	(IX+E_COORD+1)
    	DJNZ	EMR5
    E_CLC_SR
    	LD	L,(IX+E_SPRITE_ADDR)
    	LD	H,(IX+E_SPRITE_ADDR+1)
    	LD	DE,896
    	LD	A,(IX+E_FASE)
    	XOR	1
    	LD	(IX+E_FASE),A	
    	CP	0
    	JR	Z,NO_ERF2
    	LD	DE,1280
    NO_ERF2
    	ADD	HL,DE
    
    	LD	A,(IX+E_COORD+1)
    	AND	7
    	CP	0
    	JR	Z,NO_ADDESR
    	LD      DE,48
    	LD	B,A
    ADDESR	ADD	HL,DE
    	DJNZ	ADDESR
    NO_ADDESR
    	LD	(IX+E_SPR_ADR),L
    	LD	(IX+E_SPR_ADR+1),H
    	RET
    ;-----------------------------
    E_MOVE_L
    	XOR	A		;NOP
    	LD	(L_OP2),A
    	LD	(L_OP3),A
    	LD	A,(IX+E_TYPE)
    	CP	1
    	JR	NZ,L_NOINC
    	LD	A,#25		;DEC	H
    	LD	(L_OP2),A
    	LD	A,#04		;INC	B
    	LD	(L_OP3),A
    L_NOINC
    
    
    	LD	A,(IX+E_COORD)
    	BIT	2,A
    	JR	Z,EM_L1
    	ADD	A,8
    EM_L1	AND	248
    	LD	(IX+E_COORD),A
    
    	LD	A,3
    	LD	(IX+E_SPR_W),A
    
    	LD	A,(IX+E_COORD+1)
    	DEC	A
    	CP	255
    	JR	NZ,EML0
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SL
    
    EML0	LD	L,(IX+E_COORD)
    	LD	H,(IX+E_COORD+1)
    	DEC	H
    L_OP2	NOP
    	PUSH	HL
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	NZ,EML1
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SL
           
    EML1	PUSH	HL
    	LD	A,15
    	ADD	A,L
    	LD	L,A
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	NZ,EML2
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SL
    
    EML2	LD	A,0
    	LD	(BOX_HL_W),A
    	LD	A,15
    	LD	(BOX_HL_H),A
    	PUSH	IX
    	CALL	ENEMY_COLLISION
    	POP	IX
    	CP	1
    	JR	NZ,EML3
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SL
    
    EML3	CALL	PLAYER_COLLISION
    	CP	1
    	JR	NZ,EML4
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SL
    
    EML4	LD	B,1
    L_OP3	NOP
    EML5	DEC	(IX+E_COORD+1)
    	DJNZ	EML5
    
    
    E_CLC_SL
    	LD	L,(IX+E_SPRITE_ADDR)
    	LD	H,(IX+E_SPRITE_ADDR+1)
    	LD	DE,128
    	LD	A,(IX+E_FASE)
    	XOR	1
    	LD	(IX+E_FASE),A	
    	CP	0
    	JR	Z,NO_ERL2
    	LD	DE,512
    NO_ERL2
    	ADD	HL,DE
    
    	LD	A,(IX+E_COORD+1)
    	AND	7
    	CP	0
    	JR	Z,NO_ADDESL
    	LD      DE,48
    	LD	B,A
    ADDESL	ADD	HL,DE
    	DJNZ	ADDESL
    NO_ADDESL
    	LD	(IX+E_SPR_ADR),L
    	LD	(IX+E_SPR_ADR+1),H
    	RET
    
    ;-----------------------------
    E_MOVE_U
    	XOR	A		;NOP
    	LD	(U_OP2),A
    	LD	(U_OP3),A
    	LD	A,(IX+E_TYPE)
    	CP	1
    	JR	NZ,U_NOINC
    	LD	A,#2D		;DEC	L
    	LD	(U_OP2),A
    	LD	A,#04		;INC	B
    	LD	(U_OP3),A
    U_NOINC
    
    
    	LD	A,(IX+E_COORD+1)
    	BIT	2,A
    	JR	Z,EM_U1
    	ADD	A,8
    EM_U1	AND	248
    	LD	(IX+E_COORD+1),A
    
    	LD	A,2
    	LD	(IX+E_SPR_W),A
    
    	LD	A,(IX+E_COORD)
    	DEC	A
    	CP	255
    	JR	NZ,EMU0
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SU
    
    EMU0	LD	L,(IX+E_COORD)
    	LD	H,(IX+E_COORD+1)
    	DEC	L
    U_OP2	NOP
    	PUSH	HL
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	NZ,EMU1
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SU
           
    EMU1	PUSH	HL
    	LD	A,15
    	ADD	A,H
    	LD	H,A
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	NZ,EMU2
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SU
    
    EMU2	LD	A,15
    	LD	(BOX_HL_W),A
    	LD	A,0
    	LD	(BOX_HL_H),A
    	PUSH	IX
    	CALL	ENEMY_COLLISION
    	POP	IX
    	CP	1
    	JR	NZ,EMU3
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SU
    
    EMU3	CALL	PLAYER_COLLISION
    	CP	1
    	JR	NZ,EMU4
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SU
    
    EMU4	LD	B,1
    U_OP3	NOP
    EMU5	DEC	(IX+E_COORD)
    	DJNZ	EMU5
    
    E_CLC_SU
    
    	LD	L,(IX+E_SPRITE_ADDR)
    	LD	H,(IX+E_SPRITE_ADDR+1)
    	LD	A,(IX+E_FASE)
    	XOR	1
    	LD	(IX+E_FASE),A	
    	CP	0
    	JR	Z,NO_ERU2
    	LD	DE,32
    	ADD	HL,DE
    NO_ERU2
    	LD	(IX+E_SPR_ADR),L
    	LD	(IX+E_SPR_ADR+1),H
    	RET
    ;-----------------------------
    E_MOVE_D
    	XOR	A		;NOP
    	LD	(D_OP2),A
    	LD	(D_OP3),A
    	LD	A,(IX+E_TYPE)
    	CP	1
    	JR	NZ,D_NOINC
    	LD	A,#3C		;INC	A
    	LD	(D_OP2),A
    	LD	A,#04		;INC	B
    	LD	(D_OP3),A
    D_NOINC
    
    	LD	A,(IX+E_COORD+1)
    	BIT	2,A
    	JR	Z,EM_D1
    	ADD	A,8
    EM_D1	AND	248
    	LD	(IX+E_COORD+1),A
    
    	LD	A,2
    	LD	(IX+E_SPR_W),A
           
    	LD	A,(IX+E_COORD)
    	INC	A
    	CP	177
    	JR	NZ,EMD0
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SD
    
    EMD0	LD	L,(IX+E_COORD)
    	LD	H,(IX+E_COORD+1)
    	LD	A,16
    D_OP2	NOP
    	ADD	A,L
    	LD	L,A
    	PUSH	HL
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	NZ,EMD1
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SD
           
    EMD1	PUSH	HL
    	LD	A,15
    	ADD	A,H
    	LD	H,A
    	CALL	COORD_IS_FILL
    	POP	HL
    	CP	1
    	JR	NZ,EMD2
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SD
    
    EMD2	LD	A,15
    	LD	(BOX_HL_W),A
    	LD	A,0
    	LD	(BOX_HL_H),A
    	PUSH	IX
    	CALL	ENEMY_COLLISION
    	POP	IX
    	CP	1
    	JR	NZ,EMD3
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SD
    
    EMD3	CALL	PLAYER_COLLISION
    	CP	1
    	JR	NZ,EMD4
    	CALL	E_FAST_DIRECT
    	JR	E_CLC_SD
    
    EMD4	LD	B,1
    D_OP3	NOP
    EMD5	INC	(IX+E_COORD)
    	DJNZ	EMD5
    
    E_CLC_SD
    
    	LD	L,(IX+E_SPRITE_ADDR)
    	LD	H,(IX+E_SPRITE_ADDR+1)
    	LD	DE,64
    	LD	A,(IX+E_FASE)
    	XOR	1
    	LD	(IX+E_FASE),A	
    	CP	0
    	JR	Z,NO_ERD2
    	LD	DE,96
    NO_ERD2	ADD	HL,DE
    	LD	(IX+E_SPR_ADR),L
    	LD	(IX+E_SPR_ADR+1),H
    	RET
    
    ;------------------------------
    COORD_IS_FILL
    	PUSH	HL
            CALL	CALC_LEVEL_POS
    
            LD	A,(L_DOP)
            LD	D,A
            LD	A,(HL)
            CP	0
            JR	Z,C_NO_FILL
            CP	4
            JR	Z,C_NO_FILL
            CP	5
            JR	Z,C_NO_FILL
            CP	D
            JR	Z,C_NO_FILL
    
    	POP	HL
    	LD	A,1
    	RET
    C_NO_FILL
    	POP	HL
    	XOR	A
    	RET
    L_DOP	DEFB	0
    
    ;----------------------------
    T_COORD_IS_ICE
    	XOR	A
    	LD	(IS_ICE),A
    
    
    	LD	HL,(T_COORD)
    	LD	DE,#0202
    
    	LD	A,L
    	AND	7
    	CP	0
    	JR	Z,TCII_NOADDY
    	INC	E
    TCII_NOADDY
    	LD	A,H
    	AND	7
    	CP	0
    	JR	Z,TCII_NOADDX
    	INC	D
    TCII_NOADDX
    	PUSH	DE
    	CALL	CALC_LEVEL_POS
    	POP	DE
    
    	LD	A,E
    	LD	(TCII_FOR_Y-1),A
    	LD	A,D
    	LD	(TCII_FOR_X-1),A
    
    
    	LD	B,0
    TCII_FOR_Y
    	PUSH	BC
    	PUSH	HL
    	
    
    	LD	B,0
    TCII_FOR_X
    	PUSH	BC
    
    	LD	A,(HL)
    	CP	5
    	JR	NZ,TCII_NOICE
    	LD	A,1
    	LD	(IS_ICE),A
    TCII_NOICE	
    
    	INC	HL
    
    	POP	BC
    	DJNZ	TCII_FOR_X
    
    
    	POP	HL
    	LD	DE,26
    	ADD	HL,DE
    
    	POP	BC
    	DJNZ	TCII_FOR_Y
    
    	RET
    
    ;----------------------------
    CALC_LEVEL_POS
            SRL   L
            SRL   L
            SRL   L
            SRL   H
            SRL   H
            SRL   H
    
            LD    B,L
            LD    C,H
            LD    HL,LEVEL
    
            LD    A,B
            CP    0
            JR    Z,NO_ADD_Y  ;Не нужно прибавлять строки
    
            LD    DE,26
    ADD_Y
            ADD   HL,DE       ;Прибавляем строки
            DJNZ  ADD_Y
    
    NO_ADD_Y
            LD	D,0
            LD	E,C
            ADD	HL,DE       ;Прибавляем позицию по X
    	LD	(CALCULATED_LPOS),HL
            RET
    CALCULATED_LPOS
    	DEFW	0
    
    ;---------------------------
    RND_255 
    	LD	HL,(RND_VAL)
    	LD	DE,7
    	ADD	HL,DE
    	LD	E,L
    	LD	D,H
    	ADD	HL,HL
    	ADD	HL,HL
    	LD	C,L
    	LD	B,H
    	ADD	HL,HL
    	ADD	HL,BC
    	ADD	HL,DE
    	LD	(RND_VAL),HL
    	LD	A,H
    	RET
    RND_VAL	DEFW	0
    
    
    
    ;--------------------------------------
    FILL_SPRITE
    
    	CALL	FILL_SPRITE_ADDR
    
    	LD	A,(#5B5C)
    	PUSH	AF
    	
    	;Подключим банку со спрайтами
    	CALL	BIND_BUF_0
    
    	;Скопируем спрайты UP1,UP2 в рабочие
    	PUSH	HL
    	LD	DE,(ADDR_UP1)
    	LD	BC,64
    	LDIR
    	POP	HL
    
    	;Скопируем спрайты LEFT1 в рабочие LEFT1 и RIGHT1
    	PUSH	HL
    	LD	DE,64
    	ADD	HL,DE
    
    	PUSH	HL
    	LD	DE,(ADDR_LEFT1)
    	LD	BC,48
    	LDIR
    	POP	HL
    	LD	DE,(ADDR_RIGHT1)
    	LD	BC,48
    	LDIR
    	POP	HL
    
    	;Скопируем спрайты LEFT2 в рабочие LEFT2 и RIGHT2
    	LD	DE,112
    	ADD	HL,DE
    	PUSH	HL
    	LD	DE,(ADDR_LEFT2)
    	LD	BC,48
    	LDIR
    	POP	HL
    	LD	DE,(ADDR_RIGHT2)
    	LD	BC,48
    	LDIR
    
    	;Отобразим сверху вниз танк1
    	LD	HL,(ADDR_UP1)
    	CALL	FLIP_V
    	;Отобразим сверху вниз танк2
    	LD	HL,(ADDR_UP2)
    	CALL	FLIP_V
    
    	;Развернём > танк1
    	LD	IX,(ADDR_RIGHT1)
    	CALL	FLIP_H
    	;Развернём > танк2
    	LD	IX,(ADDR_RIGHT2)
    	CALL	FLIP_H
    
    	;Проскроллим правый танк1
    	LD	HL,(ADDR_RIGHT1)
    	CALL	SCROLL_COPY
    
    	;Проскроллим правый танк2
    	LD	HL,(ADDR_RIGHT2)
    	CALL	SCROLL_COPY
    
    	;Проскроллим левый танк1
    	LD	HL,(ADDR_LEFT1)
    	CALL	SCROLL_COPY
    
    	;Проскроллим левый танк2
    	LD	HL,(ADDR_LEFT2)
    	CALL	SCROLL_COPY
    
    	POP	AF
    	CALL	SET_VIDEO_A
    	RET
    ;-------------------------
    FILL_SPRITE_ADDR
    	PUSH	HL
    	EX	DE,HL
    
    	LD	DE,32
    
    	LD	(ADDR_UP1),HL
    	ADD	HL,DE
    
    	LD	(ADDR_UP2),HL
    	ADD	HL,DE
    
    	LD	(ADDR_DOWN1),HL
    	ADD	HL,DE
    
    	LD	(ADDR_DOWN2),HL
    	ADD	HL,DE
    
    	LD	DE,384
    	LD	(ADDR_LEFT1),HL
    	ADD	HL,DE
    	
    	LD	(ADDR_LEFT2),HL
    	ADD	HL,DE
    
    	LD	(ADDR_RIGHT1),HL
    	ADD	HL,DE
    
    	LD	(ADDR_RIGHT2),HL
    
    	POP	HL
    	RET
    
    ADDR_UP1	DEFW	0
    ADDR_UP2	DEFW	0
    ADDR_DOWN1	DEFW	0
    ADDR_DOWN2	DEFW	0
    ADDR_LEFT1	DEFW	0
    ADDR_LEFT2	DEFW	0
    ADDR_RIGHT1	DEFW	0
    ADDR_RIGHT2	DEFW	0
    
    ;-----------------------------
    FLIP_H	LD	C,16
    FL_H1	LD	L,(IX+0)
    	LD	H,(IX+1)
    	LD	B,16
    FL_H2	SLA	L
    	RL	H
    	RR	D
    	RR	E
    	DJNZ	FL_H2
    	LD	(IX+0),E
    	LD	(IX+1),D
    	INC	IX
    	INC	IX
    	INC	IX
    	DEC	C
    	JR	NZ,FL_H1
    	RET
    
    ;---------------------------
    FLIP_V
    	LD	(SAVE_SP+1),SP
    
    	PUSH	HL
    	LD	DE,94
    	ADD	HL,DE
    	POP	DE
    	DI
    	LD	SP,HL
    
    
    	LD	B,16
    FL_V	LD	(CPY_AD+1),DE
    CPY_AD	LD	HL,(00)
    	PUSH	HL
    	INC	DE
    	INC	DE
    	DJNZ	FL_V
    SAVE_SP	LD	SP,0
    	EI
    	RET	
    	NOP
    
    ;-----------------------------	
    
    SCROLL_COPY
    
    	PUSH	HL
    	LD	DE,48
    	ADD	HL,DE
    	POP	DE
    	EX	DE,HL
    
    	LD	B,7
    R_COPY	PUSH	BC
    	PUSH	DE
    	PUSH	HL
    	
    	;------------
    	PUSH	DE
    	LD	BC,48
    	LDIR
    	POP	HL
    	AND	A
    	LD	B,48
    S_RR	RR	(HL)
    	INC	HL
    	DJNZ	S_RR
    	;------------
    	POP	HL
    	POP	DE
    
    	EX	DE,HL
    	LD	IX,48
    	ADD	IX,DE
    	PUSH	IX
    	POP	DE
    	EX	DE,HL
    
    	LD	IX,48
    	ADD	IX,DE
    	PUSH	IX
    	POP	DE
    
    	POP	BC
    	DJNZ	R_COPY
    	
    	RET
    
    ;---------------------------------
    ; SPRITES
    ;---------------------------------
    T1	EQU	#C000+6607
    T2	EQU	T1+160
    T3	EQU	T2+160
    T4	EQU	T3+160
    E1	EQU	T4+160
    E2	EQU	E1+160
    E3	EQU	E2+160
    E4	EQU	E3+160
    
    B_1	EQU	E4+160
    
    ;Спрайты уровня
    SPR_C0	DEFB	0,0,0,0,0,0,0,0
    SPR_C1	DEFB	247,247,247,0,127,127,127,0
    SPR_C2	DEFB	170,84,188,124,188,124,130,1
    SPR_C3	DEFB	4,0,128,72,20,0,64,34
    SPR_C4	DEFB	2,21,7,25,46,31,251,110
    SPR_C5	DEFB	17,2,4,136,17,34,68,136
    SPR_C6	DEFB	0,0,0,0,0,0,0,0
    
    SPR_BASE	DEFB	0,0,192,3,99,134,241,79,113,142,253,191,47,244,119,238,61,188,63,252,29,184,1,128,3,192,15,240,13,176,0,0
    SPR_BASE_DEAD	DEFB	0,0,0,0,4,0,13,0,11,128,23,192,55,248,47,252,111,252,79,246,95,150,71,4,65,4,64,0,64,0,64,0
    
    ;Спрайты бонусов
    B_SPRITE	DEFS	32
    B_MASK		DEFB	255,255,128,3,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,128,3,255,255
    
    ;Спрайт патрона
    SPR_SHOT
    	DEFB 0,0,48,0,120,0,120,0,48,0,0,0,0,0,0,0
    	DEFB 0,0,24,0,60,0,60,0,24,0,0,0,0,0,0,0
    	DEFB 0,0,12,0,30,0,30,0,12,0,0,0,0,0,0,0
    	DEFB 0,0,6,0,15,0,15,0,6,0,0,0,0,0,0,0
    	DEFB 0,0,3,0,7,128,7,128,3,0,0,0,0,0,0,0
    	DEFB 0,0,1,128,3,192,3,192,1,128,0,0,0,0,0,0
    	DEFB 0,0,0,192,1,224,1,224,0,192,0,0,0,0,0,0
    	DEFB 0,0,0,96,0,240,0,240,0,96,0,0,0,0,0,0
    
    
    T_SPRITE_1
    TANK_UP1
    TANK_UP2	EQU	TANK_UP1+32
    TANK_DOWN1	EQU	TANK_UP2+32
    TANK_DOWN2	EQU	TANK_DOWN1+32
    TANK_LEFT1	EQU	TANK_DOWN2+32
    TANK_LEFT2	EQU	TANK_LEFT1+384
    TANK_RIGHT1	EQU	TANK_LEFT2+384
    TANK_RIGHT2	EQU	TANK_RIGHT1+384
    
    E_SPRITE_1	EQU	TANK_RIGHT2+384
    ENEMY1_UP1	EQU	E_SPRITE_1
    ENEMY1_UP2	EQU	ENEMY1_UP1+32
    ENEMY1_DOWN1	EQU	ENEMY1_UP2+32
    ENEMY1_DOWN2	EQU	ENEMY1_DOWN1+32
    ENEMY1_LEFT1	EQU	ENEMY1_DOWN2+32
    ENEMY1_LEFT2	EQU	ENEMY1_LEFT1+384
    ENEMY1_RIGHT1	EQU	ENEMY1_LEFT2+384
    ENEMY1_RIGHT2	EQU	ENEMY1_RIGHT1+384
    
    E_SPRITE_2	EQU	ENEMY1_RIGHT2+384
    ENEMY2_UP1	EQU	E_SPRITE_2
    ENEMY2_UP2	EQU	ENEMY2_UP1+32
    ENEMY2_DOWN1	EQU	ENEMY2_UP2+32
    ENEMY2_DOWN2	EQU	ENEMY2_DOWN1+32
    ENEMY2_LEFT1	EQU	ENEMY2_DOWN2+32
    ENEMY2_LEFT2	EQU	ENEMY2_LEFT1+384
    ENEMY2_RIGHT1	EQU	ENEMY2_LEFT2+384
    ENEMY2_RIGHT2	EQU	ENEMY2_RIGHT1+384
    
    E_SPRITE_3	EQU	ENEMY2_RIGHT2+384
    ENEMY3_UP1	EQU	E_SPRITE_3
    ENEMY3_UP2	EQU	ENEMY3_UP1+32
    ENEMY3_DOWN1	EQU	ENEMY3_UP2+32
    ENEMY3_DOWN2	EQU	ENEMY3_DOWN1+32
    ENEMY3_LEFT1	EQU	ENEMY3_DOWN2+32
    ENEMY3_LEFT2	EQU	ENEMY3_LEFT1+384
    ENEMY3_RIGHT1	EQU	ENEMY3_LEFT2+384
    ENEMY3_RIGHT2	EQU	ENEMY3_RIGHT1+384
    
    LEVEL		EQU	ENEMY3_RIGHT2+384
    [свернуть]


    А вообще у Epsilon версия многими местами круче и он охотно контактирует по этому поводу(по крайней мере раньше), можешь ему вопросы задать(я этого не говорил)).


    https://zx-pk.ru/threads/29225-igra-...990-(128).html
    тему Epsilon'а тоже не сложно найти

Страница 4 из 7 ПерваяПервая 1234567 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Демо Запилятор
    от nyuk в разделе Демо
    Ответов: 954
    Последнее: 21.09.2019, 09:41
  2. Идеи демо
    от GM BIT в разделе Демо
    Ответов: 711
    Последнее: 24.03.2019, 19:24
  3. Демо на бейсике
    от Viktor2312 в разделе Программирование
    Ответов: 134
    Последнее: 09.07.2014, 01:34
  4. Интерактивность демо
    от goblinish в разделе Демо
    Ответов: 74
    Последнее: 28.08.2012, 07:13
  5. Вспомнить демо.
    от Enigmatic в разделе Демо
    Ответов: 1
    Последнее: 11.03.2012, 23:34

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •