; Чуточку оптимизированный и причёсанный вариант.
; Чтобы было удобнее в коде ориентироваться.
; игра обессмерчена и обнеуязвимлена, если нужна честная игра,
; найдите строки, содержащие ###, и закомментируйте/раскомментируйте нужное.


; Processor:        К1801ВМ1
; Target assembler: BKTurbo8 Cross Assembler

; ═══════════════════════════════════════════════════════════════════════════

FONT = 112276

; Переменные

F$DataBlock = 40            ; Начало блока данных
; для trap 4
F$ScrAddr   = F$DataBlock   ; адрес экрана
F$YScale    = F$DataBlock+2 ; масштаб по высоте
F$ColorMask = F$DataBlock+4 ; маска цвета
; для trap 2
F$DataAddr  = F$DataBlock+2 ; адрес данных
F$Delay     = F$DataBlock+6 ; задержка
F$Tmp       = F$DataBlock+10 ; временно храним количество символов
; для trap 0
F$GmNmColor = F$DataBlock    ; цвет цифры 2
F$GmNmAddr  = F$DataBlock+2  ; адрес с которого выводить цифру 2
F$Screen    = F$DataBlock+4  ; начало экрана
F$DataAddr2 = F$DataBlock+6  ; адрес данных
F$Color     = F$DataBlock+10 ; цвет
F$MaxScale  = F$DataBlock+12 ; макс.масштаб
F$GameNum   = F$DataBlock+14 ; цифра 2
F$Cycles    = F$DataBlock+16 ; количество циклов
F$GameAddr  = F$DataBlock+24 ; адрес с которого начинать выводить слово GAME
; для trap 10
F$Color2    = F$DataBlock+12 ; байт-заполнитель цвета линии 2
; для trap 12,22
F$YScale2   = F$DataBlock+6 ; масштаб по высоте


Sprite8Buf=36000 ; Буфер распаковки спрайта для этапа 8
TopStack = 760

Start0$:        jmp     NextStart$
; ───────────────────────────────────────────────────────────────────────────

DisTrap:        mov     R0, -(SP)
                mov     R1, -(SP)
                mov     R2, -(SP)
                mov     R3, -(SP)
                mov     R4, -(SP)
                mov     R5, -(SP)
                mov     14(SP), R5
                mov     -(R5), R5
                bic     #177400, R5
                call    @TrapTbl(R5)
                mov     (SP)+, R5
                mov     (SP)+, R4
                mov     (SP)+, R3
                mov     (SP)+, R2
                mov     (SP)+, R1
                mov     (SP)+, R0
VecKbdNo$:      rti
; ───────────────────────────────────────────────────────────────────────────
TrapTbl:        .word Trap00            ; Вывод слова GAME и цифры 2
                                        ; Вход: F$DataBlock - блок параметров
                .word Trap02            ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу F$DataBlock:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                .word Trap04            ; Вывод символа на экран
                                        ; Вход: R2 - код символа - 20
                                        ;       R1 - адрес экрана, куда выводить
                                        ;       @#F$Cycles - адрес экрана, куда выводить
                                        ;       @#F$DataAddr - масштаб по высоте
                                        ;       @#F$ColorMask - маска цвета
                .word Trap06            ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#F$DataAddr2 - адрес массива данных
                .word Trap10            ; Рисует рамку заданного цвета
                                        ; Вход:R0 - адрес
                                        ;      @#F$Color, @#F$Color2 - байты заполнители цвета
                .word Trap12            ; Вывод текста
                                        ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                .word Trap14            ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                .word Trap16            ; Анимация заставки
                                        ; Вход: R4 - адрес текста
                .word Trap20            ; Вывод падающей каплей буквы
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота падения
                                        ;       R3 - код буквы - 20
                .word Trap22            ; Вывод текста буквами тырк-тырк влево-вправо
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - адрес текста
                                        ;       @#F$ColorMask - маска цвета для 1 бита символа
                                        ;       @#F$YScale2 - масштаб по высоте
                .word Trap24            ; Вывод три зелёных полосы и на них копирайт спрайтами
                .word Trap26            ; Вывод и обработка меню
                                        ; Вход: R0 - номер начального пункта меню
                                        ;       R1 - номер последнего пункта меню
                                        ;       R4 - адрес параметров меню
                                        ; Выход: R0 - выбранный пункт меню
                .word Trap30            ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                .word Trap32            ; Вывод и обработка меню для задания управления
                                        ; Вход: R1 - количество пунктов меню
                                        ;       R2 - регистр данных
                                        ;       R3 - регистр управления
                                        ;       R4 - адрес блока параметров меню
                .word Trap34            ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                .word Trap36            ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                .word Trap40            ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                .word Trap42            ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                .word Trap44            ; Вспомогательная функция функции Trap46
                .word Trap46            ; Вывод звёзд на экран
                .word Trap50            ; Опрос клавиатуры
                .word Trap52            ; Опрос джойстика
                .word Trap54            ; Проверка на выход за границы экрана и прорисовка летящей пульки
                                        ; Вход: R0 - адрес спрайта пульки
                                        ;       R1 - адрес экрана
                                        ;       R2 - приращение адреса
                                        ;       R4 - указатель в массиве
                .word Trap56            ; Обработка выстрела пулек и анимация их полёта
                .word Trap60            ; Увеличение пройденного расстояния
                .word Trap62            ; Обработка оружейных ящиков
                                        ; Полёт, проверка на выход за экран, встречу с ракетой,
                                        ; и добавление нового вида оружия
                .word Trap64            ; Проверка на коллизии: попадание оружием в объекты
                                        ; или попадание в ракету
                                        ; Вход: R1 - адрес объекта
                                        ;       R4 - адрес в массиве, указывающий на следующий объект
                .word Trap66            ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта
                .word Trap70            ; Вывод на экран счёта
                .word Trap72            ; Ждать нажатия чего-нибудь
                .word 100140            ; Trap 74 == Emt 14
                .word 0
; ───────────────────────────────────────────────────────────────────────────

NextStart$:     tstb    @#321
                beq     1$
                emt     14
                mov     #strError, R1
                br      0Error$
; ───────────────────────────────────────────────────────────────────────────

1$:             jmp     NextStart2$
; ───────────────────────────────────────────────────────────────────────────
strError:       .ascii <14><233>"     ОШИБКА МАГНИТОФОНА!"<12><12><12>
                .asciz "  ПРОГРАММА НЕ РАБОТОСПОСОБНА!"<12><12>

strStart:       .ascii "    ЗАПУСК   "<265><265><265>
                .asciz "   S 'ВВОД'"<12><12>
                .even

; ███████████████ S U B R O U T I N E ███████████████████████████████████████


Exit$:          trap    74              ; аналог EMT 14
                clr     @#320
                mov     #DisTrap, @#34  ; делаем приготовления
                mov     #1000, @#264
                mov     #233, R0
                emt     16              ; вывод символа
                mov     #1000, R2
                call    ClrScr2
                trap    24              ; Вывод три зелёных полосы и на них копирайт спрайтами
                mov     #strStart, R1   ; "    ЗАПУСК   "
0Error$:        clr     R2
                emt     20              ; вывод строки
                halt                    ; выход в монитор
; End of function Exit$

ClrScr:         mov     #20000, R2
ClrScr2:        mov     #40000, R0
1$:             clr     (R0)+
                sob     R2, 1$
                return
; ───────────────────────────────────────────────────────────────────────────


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод слова GAME и цифры 2
; Вход: F$DataBlock - блок параметров, в котором и указываются параметры вывода

Trap00:         mov     @#F$Screen, R5  ; адрес начала экрана

1$:             clr     (R5)+           ; очищаем эран
                tst     R5
                bpl     1$
                mov     #1, 00.ScaleY$  ; масштаб по высоте символа
                mov     @#F$GameAddr, R1 ; адрес начала вывода

2$:             mov     @#F$DataAddr2, R5 ; адрес адресов данных букв

3$:             mov     (R5)+, R3       ; берём очередной адрес
                beq     9$              ; 0 - конец

4$:             mov     (PC)+, R4
00.ScaleY$:     .word 0

5$:             movb    (R3), R2        ; берём очередной байт данных символа
                mov     #8., R0         ; в байте 8 бит

6$:             clr     (R1)
                rorb    R2
                bcc     7$
                mov     @#F$Color, (R1) ; цвет символа

7$:             tst     (R1)+           ; расширяем бит в слово
                sob     R0, 6$
                add     #60, R1
                sob     R4, 5$          ; масштабируем, повторяем вывод байта сколько надо
                movb    (R3)+, R0       ; вывели символ полностью?
                bne     4$              ; нет ещё - продолжаем
                mov     00.ScaleY$, R4  ; перейдём к позиции следующего символа

8$:             sub     #1000, R1
                sob     R4, 8$
                sub     #60, R1
                br      3$
; ───────────────────────────────────────────────────────────────────────────

9$:             inc     00.ScaleY$      ; увеличим масштаб
                mov     #20, R0         ; звук

10$:            mov     #100, R4
                mov     R4, R3
                mov     #320, @#177716
                sob     R3, .
                mov     #220, @#177716
                sob     R4, .
                sob     R0, 10$

                cmp     @#F$MaxScale, 00.ScaleY$ ; до предела дошли?
                bne     2$
                mov     @#F$GmNmAddr, R1 ; адрес вывода
                mov     @#F$GameNum, R0 ; что выводить
                swab    R0              ; старший байт есть?
                beq     11$             ; нету
                call    DrawDigit       ; вывод цифры
11$:            swab    R0              ; теперь младший
; End of function Trap00


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


DrawDigit:      bic     #177700, R0
                asl     R0
                mov     R0, R2
                asl     R0
                asl     R0
                add     R0, R2
                add     #FONT + <'0 - 40>*10. + 1, R2
                mov     @#F$GmNmColor, R0
2$:             mov     @#F$Cycles, R3

3$:             mov     #8., R5
                movb    (R2), R4

4$:             ror     R4
                bcs     7$
                cmp     (R1)+, (R1)+
                br      6$
; ───────────────────────────────────────────────────────────────────────────

7$:             tst     (R1)+
                bne     5$
                mov     R0, -2(R1)

5$:             tst     (R1)+
                bne     6$
                mov     R0, -2(R1)

6$:             sob     R5, 4$
                add     #40, R1
                sob     R3, 3$
                tstb    (R2)+
                bne     2$
                mov     @#F$GmNmAddr, R1
                add     #40, R1
                return
; End of function DrawDigit


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод информации на экран
; Вход: блок параметров по адресу F$DataBlock:
; .word адрес экрана
; .word адрес данных
; .word маска цвета
; .word задержка

Trap02:         mov     @#F$ScrAddr, R4 ; адрес экрана
                mov     R4, R1          ; адрес в регистр, где он используется
                mov     #40, R2         ; очищаем строку экрана

1$:             clr     (R4)+
                sob     R2, 1$
                mov     @#F$DataAddr, R5 ; адрес данных
                clr     R4
                bisb    (R5)+, R4       ; берём очередной байт
                beq     3$              ; если 0, то пропустим
                ; если не 0, то это число прокрутки экрана
2$:             call    MovAddrDnScrlUp ; Очистка следующей строки экрана и скроллинг
                sob     R4, 2$          ; скроллим экран на заданное кол-во строк

3$:             mov     R1, @#F$ScrAddr ; сохраняем новый адрес экрана
                clr     R4
                bisb    (R5)+, R4       ; берём следующий байт - смещение от левого края экрана
                clr     R3
                bisb    (R5)+, R3       ; берём следующий байт - количество символов
                mov     R4, @#F$Tmp     ; сохраняем
                mov     #300, R1        ; адрес буфера

4$:             clr     R2
                bisb    (R5)+, R2       ; берём следующий байт
                bne     5$              ; не 0 - нормально
                return                  ; 0 - конец данных
; ───────────────────────────────────────────────────────────────────────────

5$:             ; это код символа
                bpl     111$
                sub     #40, R2
111$:           asl     R2
                mov     R2, R0
                asl     R2
                asl     R2
                add     R2, R0
                add     #FONT-500, R0

                mov     R0, (R1)+       ; адрес данных символа сохраним в буфере
                sob     R3, 4$          ; и так всю строку
                clr     (R1)+           ; конец строки
                mov     R5, @#F$DataAddr ; указатель на данные сохраним

                mov     @#F$ScrAddr, R1 ; адрес экрана
                mov     #10., R5        ; это высота символа

7$:             mov     R5, -(SP)
                mov     #300, R0        ; адрес буфера
                add     @#F$Tmp, R1     ; сместимся к месту вывода строки

8$:             mov     (R0), R2        ; адрес данных символа
                beq     12$             ; 0 - конец строки
                movb    (R2), R2        ; очередные данные символа
                inc     (R0)+           ; указатель на следующий байт данных символа
                mov     #4, R3          ; байт -> в 2 слова

9$:             mov     #2, R4          ; два бита -> в байт
                clr     R5
10$:            rorb    R5
                rorb    R5
                rorb    R5
                rorb    R5
                bicb    #360, R5
                rorb    R2
                bcc     11$
                bisb    @#F$ColorMask, R5        ; маска цвета букв

11$:            sob     R4, 10$
                movb    R5, (R1)+
                sob     R3, 9$
                br      8$              ; и так, пока строку не выведем
; ───────────────────────────────────────────────────────────────────────────

12$:            bit     #77, R1         ; попали на следующую строку?
                beq     13$             ; да - переход
                bis     #77, R1         ; иначе - переход на следующую строку
                inc     R1

13$:            call    ScrlUp          ; Проверка, на границы экрана, чтоб адрес за них не вышел и скролл на 1 строку
                                        ; Вход: R1 - адрес начала следующей строки
                mov     (SP)+, R5
                sob     R5, 7$          ; и так все 8 строк символа
                mov     R1, @#F$ScrAddr ; новый адрес сохраним
                br      Trap02          ; и всё сначала
; End of function Trap02


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Очистка следующей строки экрана и скроллинг

MovAddrDnScrlUp:add     #100, R1
; End of function MovAddrDnScrlUp


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Проверка, на границы экрана, чтоб адрес за них не вышел и скролл на 1 строку
; Вход: R1 - адрес начала следующей строки

ScrlUp:         cmp     #100000, R1     ; если адрес вышел за низ экрана
                bne     1$
                sub     #40000, R1      ; сделаем начало экрана

1$:             mov     #40, R3         ; очищаем строку экрана

2$:             clr     (R1)+
                sob     R3, 2$
                mov     @#F$Delay, R3   ; задержка
                sob     R3, .
                inc     @#177664        ; скролл вверх на 1 строку
                sub     #100, R1        ; вернёмся к началу очищенной строки
                cmp     #37700, R1      ; проверим, если вышли за верх экрана
                bne     3$
                add     #40000, R1      ; сделаем низ экрана

3$:             return
; End of function ScrlUp


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод символа на экран
; Вход: R2 - код символа - 20
;       R1 - адрес экрана, куда выводить
;       @#F$ScrAddr - адрес экрана, куда выводить
;       @#F$YScale - масштаб по высоте
;       @#F$ColorMask - маска цвета

Trap04:         bic     #177400, R2
                asl     R2
                mov     R2, R0
                asl     R2
                asl     R2
                add     R2, R0
                add     #FONT-240, R0
                mov     #10., R5

2$:             mov     @#F$YScale, R2  ; масштаб по высоте

3$:             mov     #8., R3         ; в байте 8 бит
                movb    (R0), R4        ; берём данные

4$:             asrb    R4              ; берём бит
                bcc     5$              ; если 0, то пропускаем
                movb    @#F$ColorMask, (R1) ; иначе - рисуем точку (расширение бит в байт)

5$:             inc     R1
                sob     R3, 4$          ; и так все биты
                add     #70, R1         ; к следующей строке экрана
                sob     R2, 3$          ; масштабируем
                movb    (R0)+, R4       ; берём ещё данные
                sob     R5, 2$          ; пока не 0
                return                  ; 0 - конец, но так мы не сможем вывести знаки типа . , - (у которых вверху нули)
; End of function Trap04


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод текста сложного формата на экран
; Вход: R1 - адрес экрана
;       F$DataAddr2 - адрес массива данных

; формат:
; сперва идут два байта параметров: byte ScaleY, ColorMask
; затем данные, если 320 - то за ним снова два байта параметров
; если 377, то за ним байт - смещение по высоте в строках
; если 321..376 - то это смещение в строке + 320
; всё остальное - символы - 20

Trap06:         mov     @#F$DataAddr2, R0        ; адрес массива данных

1$:             clr     R2
                bisb    (R0)+, R2       ; берём байт
                mov     R2, @#F$YScale  ; это масштаб по высоте
                clr     R2
                bisb    (R0)+, R2       ; берём второй байт
                mov     R2, @#F$ColorMask ; это маска цвета

2$:             clr     R2
                bisb    (R0)+, R2       ; берём байт данных
                bne     3$              ; если 0,
                return                  ; то конец
; ───────────────────────────────────────────────────────────────────────────

3$:             cmp     #320, R2        ; если 320
                beq     1$              ; то снова надо брать параметры
                cmp     #377, R2        ; если 377
                bne     6$
                clr     R1
                bisb    (R0)+, R1       ; то берём следующий байт
                swab    R1              ; умножаем на 100
                ror     R1
                asr     R1
                add     @#F$ScrAddr, R1 ; прибавляем адрес экрана
                bis     #77, R1
                inc     R1              ; переводим на следующую строку экрана
                mov     R1, @#F$ScrAddr ; и сохраняем новый адрес экрана
5$:             br      2$              ; и идём за новыми данными
; ───────────────────────────────────────────────────────────────────────────

6$:             cmp     R2, #320        ; если данные меньше 320
                ble     8$              ;  переход
                sub     #320, R2        ; иначе, вычитаем 320
                add     R2, R1          ;  и это смещение в строке
7$:             br      2$              ; и идём за новыми данными
; ───────────────────────────────────────────────────────────────────────────

8$:             trap    4               ; Вывод символа на экран
                                        ; Вход: R2 - код символа - 20
                                        ;       R1 - адрес экрана, куда выводить
                                        ;       @#F$ScrAddr - адрес экрана, куда выводить
                                        ;       @#F$YScale - масштаб по высоте
                                        ;       @#F$ColorMask - маска цвета
                add     #10, R1
                br      2$
; End of function Trap06


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Рисует рамку заданного цвета
; Вход:R0 - адрес
;      @#F$Color, @#F$Color2 - байты заполнители цвета

Trap10:         mov     R0, R3
                mov     R0, R5
                bic     #177700, R5
                bis     #77, R3
                bic     R5, R3
                mov     #140000, R4
                sub     R0, R4
                add     R5, R4
                add     R5, R4
                mov     R3, R2
                add     #400, R3

1$:             sub     #400, R4
                mov     #4, R1

2$:             bit     #100, R0
                beq     3$
                mov     @#F$Color, R5
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     @#F$Color2, R5

4$:             movb    R5, (R0)
                movb    R5, (R2)
                movb    R5, (R3)
                movb    R5, (R4)
                add     #100, R0
                add     #100, R2
                add     #100, R3
                add     #100, R4
                sob     R1, 2$
                sub     #401, R2
                inc     R4
                cmp     R3, R4
                bne     1$
                return
; End of function Trap10


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод текста
; Вход: блок параметров по адресу F$DataBlock
; .word адрес экрана
; .word адрес данных (таблица адресов символов в шрифте)
; .word маска цвета для 1 бита символа
; .word масштаб по высоте

Trap12:         mov     @#F$YScale2, 12.ScaleY$
                mov     @#F$DataAddr, R0 ; данные
                mov     @#F$ScrAddr, R1 ; адрес экрана
                mov     R1, R5          ; сохраним тут

1$:             mov     (R0)+, R2       ; берём очередной адрес данных символа
                beq     9$              ; 0 - конец

2$:             movb    (R2)+, R4       ; данные символа

3$:             mov     #4, R3          ; расширяем байт в 2 слова

4$:             ror     (R1)
                ror     (R1)
                ror     (R1)
                ror     (R1)
                bic     #170000, (R1)   ; освобождаем место для очередных битов цвета
                ror     R4              ; смотрим бит
                bcc     5$              ; нету - 0
                bis     @#F$ColorMask, (R1) ; есть  - применяем маску цвета

5$:             sob     R3, 4$          ; и так всё слово
                tst     (R1)+           ; переходим к следующему
                mov     R1, R3
                sub     R5, R3
                bic     #177700, R3     ; посмотрим, какая уже ширина символа
                cmp     #4, R3          ; если ещё не 4 байта
                bne     3$              ; продолжаем
                mov     (PC)+, R3
12.ScaleY$:     .word 1
                beq     7$              ; 0 - не надо масштабировать

6$:             add     #74, R1         ; дублируем по высоте
                mov     -100(R1), (R1)+
                mov     -100(R1), (R1)+
                sob     R3, 6$          ; сколько надо

7$:             add     #74, R1
                mov     12.ScaleY$, R3
                inc     R3
                mov     R5, R4

8$:             add     #1000, R4       ; высота 8 строк
                sob     R3, 8$
                cmp     R1, R4
                blos    2$              ; цикл пока не выведем весь символ
                add     #4, R5          ; переход к следующему символу
                mov     R5, R1
                br      1$
; ───────────────────────────────────────────────────────────────────────────

9$:             return
; End of function Trap12


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Анимация заставки
; Вход: R4 - адрес текста
T16Buffer = 334
T16BufTxt = 340

Trap16:         mov     #44400, @#T16Buffer
                mov     #F$DataBlock, R0
                mov     #40004, (R0)+
                mov     #datText1, (R0)+ ; (C)  BIL corp.
                mov     #175000, (R0)+
                mov     #3, (R0)+
                trap    12              ; Вход: F$DataBlock - заполненный блок параметров
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в ширите)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                mov     R4, R5          ; адрес данных
                add     #datText2End-datText2, R5 ; конец данных
                mov     R5, 16.DatEnd$
; тут заезжают в экран с боков буквы "**  SECOND  **"
T16TitleAddr = 64200
1$:             mov     (R4)+, R3       ; адрес данных одного символа
                mov     (R4)+, R2       ; адрес данных другого символа
                mov     #10., R1        ; высота символа
                mov     #T16BufTxt, R0  ; буфер

2$:             movb    (R3)+, (R0)+    ; копируем туда чересстрочно данные обоих символов
                movb    (R2)+, (R0)+
                sob     R1, 2$
                mov     #4, R5

3$:             mov     #T16TitleAddr + 37, R0
                mov     #T16TitleAddr + 41, R1
                mov     R4, -(SP)
                mov     R5, -(SP)

                mov     #30, R2         ; высота

4$:             mov     #17, R3         ; сдвиг побайтно
                mov     R0, R4
                mov     R1, R5
                inc     R4
                dec     R5

5$:             movb    -(R0), -(R4)    ; слева направо
                movb    (R1)+, (R5)+    ; справа налево
                movb    -(R0), -(R4)    ; слева направо
                movb    (R1)+, (R5)+    ; справа налево
                sob     R3, 5$
                movb    -(R0), -(R4)    ; слева направо
                movb    (R1)+, (R5)+    ; справа налево
                add     #41, R1
                add     #137, R0
                sob     R2, 4$
                mov     (SP)+, R5
                mov     (SP)+, R4
                mov     #T16TitleAddr, R0
                mov     #T16BufTxt, R2

6$:             clrb    (R0)
                rolb    (R2)
                bcc     7$
                bisb    #365, (R0)

7$:             rolb    (R2)+
                bcc     8$
                bisb    #17, (R0)

8$:             call    sub_3442        ; Дублируем по высоте
                sub     #101, R0
                clrb    (R0)
                rorb    (R2)
                bcc     9$
                bisb    #17, (R0)

9$:             rorb    (R2)+
                bcc     10$
                bisb    #365, (R0)

10$:            call    sub_3442        ; Дублируем по высоте
                inc     R0
                cmp     #T16TitleAddr + 3100, R0
                bge     6$
                call    sub_3462        ; Опускаем вниз копирайт "(C)  BIL corp."
                sob     R5, 3$
                cmp     (PC)+, R4
16.DatEnd$:     .word 0
                bne     1$

NextTrap16$:    mov     #Sound1$, R1
                call    Trap14          ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
; раздвигаем буквы вверх и вниз со звуком
                mov     #15, R1
                mov     #60300, R4      ; на какой адрес сдвигать верх
                mov     #71000, R5      ; на какой адрес сдвигать вниз

1$:             mov     #2000, R0       ; размер массива
                mov     R4, R2
                add     #100, R2        ; с какого адреса сдвигать вверх
                mov     R5, R3
                sub     #400, R3        ; с какого адреса сдвигать вниз
2$:             mov     (R2)+, (R4)+    ; двигаем вверх
                mov     -(R3), -(R5)    ; двигаем вниз
                sob     R0, 2$
                mov     #40, R0

3$:             clr     (R4)+
                clr     -(R5)
                clr     -(R5)
                clr     -(R5)
                clr     -(R5)
                sob     R0, 3$
                mov     #24, R2
                sub     R1, R2
                mov     #400, R3
                call    @#102062
                sub     #4200, R4
                add     #5000, R5
                sob     R1, 1$
; Вывод текста.
                mov     #F$DataBlock, R0
                mov     #64410, (R0)+
                mov     #datText3, (R0)+ ; ПРЕДСТАВЛЯЕТ
                mov     #150000, (R0)+
                mov     #3, (R0)+
                trap    12
                mov     #1, R0
                mov     #600, R1

4$:             mov     R0, R2
                mov     #320, @#177716

                sob     R2, .
                mov     R0, R2
                mov     #220, @#177716

                sob     R2, .
                inc     R0
                sob     R1, 4$
                return
; End of function Trap16


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Дублируем по высоте

sub_3442:       movb    (R0), R3
                add     #100, R0
                movb    R3, (R0)
                add     #100, R0
                movb    R3, (R0)
                return
; End of function sub_3442


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Опускаем вниз копирайт "(C)  BIL corp."

sub_3462:       mov     #4, R3
                mov     @#T16Buffer, R1

1$:             mov     R1, R0
                add     #100, R0
                mov     #1000, R2

2$:             mov     -(R1), -(R0)
                mov     -(R1), -(R0)
                sob     R2, 2$
                mov     #20, R2

3$:             clr     -(R0)
                clr     -(R0)
                sob     R2, 3$
                add     #4100, R1
                sob     R3, 1$
                mov     R1, @#T16Buffer
                return
; End of function sub_3462


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод звука
; Вход R1 - адрес таблицы параметров
; .word длит
; .word тон, тон,... (0 - конец таблицы)

Trap14:         mov     (R1)+, R5       ; длительность звуков

1$:             mov     R5, R2
                mov     (R1)+, R3       ; очередной тон
                beq     2$
                call    @#102062
                br      1$
; ───────────────────────────────────────────────────────────────────────────

2$:             return
; End of function Trap14


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод падающей каплей буквы
; Вход: R1 - адрес экрана
;       R2 - высота падения
;       R3 - код буквы - 20

Trap20:         mov     #SpriteDrop, R0
                mov     #13, R5

1$:             movb    (R0)+, (R1)
                add     #100, R1
                sob     R5, 1$
                mov     #1000, R5

                sob     R5, .
                sub     #1200, R1
                sob     R2, Trap20      ; капля падает вниз на сколько надо
                dec     R1
                mov     R1, @#F$ScrAddr
                inc     R1
                mov     #12, R5         ; стирается

2$:             clrb    (R1)+
                add     #77, R1
                sob     R5, 2$
                bic     #177400, R3
                asl     R3
                mov     R3, R0
                asl     R3
                asl     R3
                add     R3, R0
                add     #FONT-240+1, R0 ; получаем адрес данных буквы

4$:             mov     #50, R5         ; по этому адресу формируется массив из одного элемента
                mov     R5, @#F$DataAddr
                mov     R0, (R5)+
                clr     (R5)+
                mov     #200, R3
                mov     #30, R2
                call    @#102062        ; звук
                                        ; и выведем букву
                jmp     Trap12          ; Вывод текста
                                        ; Вход: блок параметров по адресу 40
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
; End of function Trap20

; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод текста буквами тырк-тырк влево-вправо
; Вход: R1 - адрес экрана
;       R2 - адрес текста
;       @#F$ColorMask - маска цвета для 1 бита символа
;       @#F$YScale2 - масштаб по высоте

T22Addr = 334
T22Buffer = 340

Trap22:         mov     #T22Addr, @#F$DataAddr  ; это адрес массива для trap 12
                mov     #T22Buffer-2, R0 ; тут формируем буфер
                clr     (R0)+           ; сперва 0

1$:             clr     R4
                bisb    (R2)+, R4       ;  потом адреса букв
                beq     3$              ; пока строка не кончится
                asl     R4
                mov     R4, R5
                asl     R4
                asl     R4
                add     R4, R5
                add     #FONT-240+1, R5
                mov     R5, (R0)+
                br      1$
; ───────────────────────────────────────────────────────────────────────────

3$:             clr     (R0)+           ; в конце тоже 0
                mov     #T22Buffer, R5  ; адрес начала массива адресов данных символов строки

2$:             mov     (R5), @#T22Addr
                mov     R1, @#F$ScrAddr
                trap    12              ; Вход: F$DataBlock - заполненный блок параметров
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                tst     -(R5)
                beq     4$
                sub     #4, R1
                call    sub_4276
                br      2$

4$:             mov     R1, R3
                mov     #Sound2$, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                mov     R3, R1
                tst     (R5)+
                clr     (R5)+
                tst     (R5)
                bne     5$
7$:             return

6$:             call    sub_4276
5$:             mov     (R5)+, @#T22Addr
                add     #4, R1
                mov     R1, @#F$ScrAddr
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                tst     (R5)
                bne     6$
                clr     -(R5)
                tst     -(R5)
                beq     7$
                sub     #4, R1
                mov     R1, R3
                mov     #Sound2$, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                mov     R3, R1
                br      2$
; End of function Trap22


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


sub_4276:       mov     #17000, R3

                sob     R3, .
                mov     @#F$ScrAddr, R4
                mov     @#F$YScale2, R3
                inc     R3

1$:             mov     #10, R2

2$:             clr     (R4)+
                clr     (R4)
                add     #76, R4
                sob     R2, 2$
                sob     R3, 1$

3$:             return
; End of function sub_4276


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод три зелёных полосы и на них копирайт спрайтами

Trap24:         mov     #40400, R0
                mov     #40, R1
; рисуем 3 зелёных полосы
                mov     #125252, R2

1$:             mov     R2, 400(R0)
                mov     R2, 200(R0)
                mov     R2, (R0)+
                sob     R1, 1$
; Выводим спрайт BIL
                mov     #SprBIL, R0
                mov     #40137, R1
                mov     #11, R2

2$:             mov     #6, R3
                clrb    (R1)+

3$:             movb    (R0)+, (R1)+
                sob     R3, 3$
                clrb    (R1)+
                add     #70, R1
                sob     R2, 2$
; выводим спрайт (С)
                mov     #40032, R1
                mov     #13, R2

4$:             mov     #3, R3
                clrb    (R1)+

5$:             movb    (R0)+, (R1)+
                sob     R3, 5$
                clrb    (R1)+
                add     #73, R1
                sob     R2, 4$
                return
; End of function Trap24


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод и обработка меню
; Вход: R0 - номер начального пункта меню
;       R1 - номер последнего пункта меню
;       R4 - адрес параметров меню
; Выход: R0 - выбранный пункт меню

T26LastMenu = 300

Trap26:         mov     #176000, @#F$ColorMask ; маска цвета
                mov     #1, @#F$YScale2 ; масштаб по Y
                mov     R4, R5          ; адрес параметров меню
; выводим меню на экран
                mov     R1, @#T26LastMenu ; сохраним номер последнего пункта меню
                mov     R1, R3          ; номер последнего пункта меню
                inc     R3              ; сделаем количество пунктов меню

11$:            mov     (R5)+, @#F$ScrAddr ; адрес экрана
                mov     (R5)+, @#F$Tmp  ; ширина курсора меню в словах
                mov     R5, @#F$DataAddr ; данные пункта меню
                trap    12              ; Вход: F$DataBlock - заполненный блок параметров
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте

12$:            tst     (R5)+           ; пропустим текст, переходим к следующему пункту
                bne     12$
                sob     R3, 11$         ; и так выведем все пункты меню
                mov     R5, R1          ; сразу за меню - звук
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
; выбираем нужный пункт
13$:            mov     (R4)+, @#F$ScrAddr ; адрес экрана
                mov     (R4)+, @#F$Tmp  ; ширина в словах
                call    SelectMenu

0KeybProc:      tst     @#177714        ; джойстик нажат?
                bne     6$              ; да - это ввода
                bit     #100, @#177716  ; клавиша нажата?
                bne     0KeybProc       ; нет
                mov     @#177662, R5    ; да, берём код
                cmp     #33, R5         ; стрелка вниз?
                bne     3$              ; нет
                cmp     R0, @#T26LastMenu ; мы уже на последнем пункте?
                beq     0KeybProc       ; да - нечего делать
                inc     R0              ; нет - переходим к нижнему пункту меню

1$:             tst     (R4)+
                bne     1$

2$:             mov     #Sound3$, R1    ; звук выделения текущего пункта меню
                trap    14
                call    SelectMenu      ; развыделим текущий
                br      13$             ; перейдём к следующему
; ───────────────────────────────────────────────────────────────────────────

3$:             cmp     #32, R5         ; стрелка вверх?
                bne     5$              ; нет
                tst     R0              ; мы уже на первом пункте?
                beq     0KeybProc       ; да - нечего делать
                dec     R0              ; нет - переходим к верхнему пункту меню
                sub     #12, R4         ; возвращаем указатель на начало предыдущего пункта

4$:             tst     -(R4)
                bne     4$
                tst     (R4)+
                br      2$              ; идём развыделять текущий и далее
; ───────────────────────────────────────────────────────────────────────────

5$:             cmp     #12, R5         ; ввод?
                bne     0KeybProc       ; нет

6$:             mov     R0, 14(SP)      ; возвращаем значение
                mov     #Sound4$, R1    ; звук выбора пункта меню
                jmp     Trap14          ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
; End of function Trap26


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


SelectMenu:     mov     @#F$ScrAddr, R3 ; адрес экрана
                sub     #100, R3        ; на 1 строки вверх
                mov     @#F$Tmp, R5     ; ширина в словах

4$:             mov     #24, R2         ; высота курсора меню

5$:             com     (R3)            ; выделяем
                add     #100, R3
                sob     R2, 5$
                sub     #2376, R3
                sob     R5, 4$          ; и так по всей ширине
                return
; End of function SelectMenu


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Заполнение прямоугольной области экрана заданным цветом
; Вход: R1 - адрес экрана
;       R2 - ширина в байтах
;       R3 - высота в строках / 2
;       R0,R4 - чересстрочные цвета

Trap30:         mov     R3, -(SP)

1$:             mov     R1, R5
                mov     (SP), R3

2$:             mov     R0, (R5)
                add     #100, R5
                mov     R4, (R5)
                add     #100, R5
                sob     R3, 2$
                tst     (R1)+
                sob     R2, 1$
                tst     (SP)+
                return
; End of function Trap30


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод и обработка меню для задания управления
; Вход: R1 - количество пунктов меню
;       R2 - регистр данных
;       R3 - регистр управления
;       R4 - адрес блока параметров меню

Trap32:         mov     #175000, @#F$ColorMask
                mov     #1, @#F$YScale2
                mov     R4, R5

1$:             mov     (R5)+, @#F$ScrAddr
                mov     R5, @#F$DataAddr
                trap    12              ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
2$:             tst     (R5)+
                bne     2$
                sob     R1, 1$
                mov     R5, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
3$:             mov     (R4)+, R5
                sub     #100, R5
                call    SelCtrlMenu
                mov     (R2), R1        ; читаем регистр данных

4$:             tst     (R3)            ; ждём нового кода
                beq     4$
                mov     (R2), (R0)+     ; помещаем новый код в таблицу
                mov     #60000, R1
                sob     R1, .

5$:             tst     (R4)+           ; переходим к следующему пункту меню
                bne     5$
                mov     #Sound6$, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                call    SelCtrlMenu
                cmp     #20, (R4)       ; до звука дошли?
                bne     3$              ; нет, значит ещё не всё
                return
; End of function Trap32


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


SelCtrlMenu:    mov     #24, R1

1$:             com     (R5)+
                com     (R5)
                add     #76, R5
                sob     R1, 1$
                sub     #2400, R5
                return
; End of function SelCtrlMenu


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод спрайта на экран movом
; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
;       R1 - адрес экрана

Trap34:         mov     (R0)+, R2       ; берём высоту
                mov     (R0)+, R3       ; берём ширину
                mov     #100, R5
                sub     R3, R5
1$:             mov     R3, R4

2$:             movb    (R0)+, (R1)+
                sob     R4, 2$
                add     R5, R1
                sob     R2, 1$
                return
; End of function Trap34


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод спрайта на экран методом наложения
; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
;       R1 - адрес экрана

Trap36:         mov     (R0)+, R2
                mov     (R0)+, R3
                mov     #100, R5
                sub     R3, R5
1$:             mov     R3, R4

2$:             bisb    (R0)+, (R1)+
                sob     R4, 2$
                add     R5, R1
                sob     R2, 1$
                return
; End of function Trap36


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Стирание спрайта с экрана методом побитовой очистки
; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
;       R1 - адрес экрана

Trap40:         mov     (R0)+, R2
                mov     (R0)+, R3
                mov     #100, R5
                sub     R3, R5
1$:             mov     R3, R4

2$:             bicb    (R0)+, (R1)+
                sob     R4, 2$
                add     R5, R1
                sob     R2, 1$
                return
; End of function Trap40


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Стирание спрайта с экрана clrом
; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
;       R1 - адрес экрана

Trap42:         mov     (R0)+, R2
                mov     (R0)+, R3
                mov     #100, R5
                sub     R3, R5
1$:             mov     R3, R4

2$:             clrb    (R1)+
                sob     R4, 2$
                add     R5, R1
                sob     R2, 1$
                return
; End of function Trap42


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вспомогательная функция функции Trap46

Trap44:         mov     (R0), R5
                beq     3$
                clrb    (R5)
                add     R2, (R0)
                bit     #77, (R0)
                beq     1$
2$:             cmp     #40000, (R0)
                bgt     1$
                cmp     #76000, (R0)
                bgt     3$
1$:             clr     (R0)
                br      4$

3$:             bisb    #220, @(R0)+

4$:             sob     R1, Trap44
                return
; End of function Trap44


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод звёзд на экран

Trap46:         tst     (PC)+
46.Counter1$:   .word 2
                bne     5$
                mov     #10, 46.Counter1$
                mov     #T46.Arr0, R0
                mov     #T46.ArrSize, R1

1$:             tst     (R0)+
                beq     2$
                sob     R1, 1$
                br      6$
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     @#177710, -(R0)
                com     #0
                beq     3$
                bic     #77, (R0)
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             bic     #177700, (R0)
4$:             add     #40000, (R0)

5$:             dec     46.Counter1$

6$:             mov     #T46.Arr0, R0
                mov     #T46.ArrSize, R1
                mov     #101, R2
                trap    44

                tst     (PC)+
46.Counter2$:   .word 1
                bne     15$
                mov     #10, 46.Counter2$
                mov     #T46.Arr1, R0
                mov     #T46.ArrSize, R1

11$:            tst     (R0)+
                beq     12$
                sob     R1, 11$
                br      16$
; ───────────────────────────────────────────────────────────────────────────

12$:            mov     @#177710, -(R0)
                com     #-1
                beq     13$
                bic     #77, (R0)
                br      14$
; ───────────────────────────────────────────────────────────────────────────

13$:            bic     #177700, (R0)
                add     #35700, (R0)
14$:            add     #40000, (R0)

15$:            dec     46.Counter2$

16$:            mov     #T46.Arr1, R0
                mov     #T46.ArrSize, R1
                mov     #-77, R2
                trap    44

                tst     (PC)+
46.Counter3$:   .word 7
                bne     23$
                mov     #10, 46.Counter3$
                mov     #T46.Arr2, R0
                mov     #T46.ArrSize, R1

21$:            tst     (R0)+
                beq     22$
                sob     R1, 21$
                br      24$
; ───────────────────────────────────────────────────────────────────────────

22$:            mov     @#177710, -(R0)
                bic     #77, (R0)
                add     #40000, (R0)

23$:            dec     46.Counter3$

24$:            mov     #T46.Arr2, R0
                mov     #T46.ArrSize, R1
                mov     #1, R2
                trap    44

                tst     (PC)+
46.Counter4$:   .word 0
                bne     33$
                mov     #10, 46.Counter4$
                mov     #T46.Arr3, R0
                mov     #T46.ArrSize, R1

31$:            tst     (R0)+
                beq     32$
                sob     R1, 31$
                br      34$
; ───────────────────────────────────────────────────────────────────────────

32$:            mov     @#177710, -(R0)
                bic     #77, (R0)
                add     #40000, (R0)

33$:            dec     46.Counter4$

34$:            mov     #T46.Arr3, R0
                mov     #T46.ArrSize, R1
                mov     #2, R2
                trap    44
                return
; End of function Trap46


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Опрос клавиатуры

Trap50:         bit     #100, @#177716  ; клавиша нажата?
                bne     5$              ; нет - выход
                mov     #KeyTab, R1     ; таблица управляющих клавиш
                mov     @#177662, R2    ; берём код нажатой клавиши
                mov     #GrowRocketAddr, R3 ; Приращение к адресу ракеты
                cmp     R2, (R1)+       ; нажали вправо?
                bne     1$              ; нет
                mov     #1, (R3)        ; двигаться вперёд

1$:             cmp     R2, (R1)+       ; нажали влево?
                bne     2$              ; нет
                mov     #-1, (R3)       ; двигаться назад

2$:             cmp     R2, (R1)+       ; нажали вверх?
                bne     3$              ; нет
                mov     #-300, (R3)     ; двигаться вверх

3$:             cmp     R2, (R1)+       ; нажали вниз?
                bne     4$              ; нет
                mov     #300, (R3)      ; двигаться вниз

4$:             cmp     R2, (R1)+       ; нажали стрелять?
                bne     5$              ; нет
                mov     #1, FireFlag    ; Стрелять

5$:             return
; End of function Trap50


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Опрос джойстика

Trap52:         tst     @#177714        ; джойстик нажат?
                beq     5$              ; нет - выход
                mov     #JoyTab, R1     ; таблица масок битов джойстика
                mov     @#177714, R2    ; берём данные с джойстика
                mov     #GrowRocketAddr, R3 ; Приращение к адресу ракеты
                bit     R2, (R1)+       ; нажали вправо?
                bne     1$              ; да
                add     #-1, (R3)       ; нет - компенсируем

1$:             bit     R2, (R1)+       ; нажали влево?
                bne     2$              ; да
                add     #1, (R3)        ; нет - компенсируем

2$:             bit     R2, (R1)+       ; нажали вверх?
                bne     3$              ; да
                add     #300, (R3)      ; нет - компенсируем

3$:             bit     R2, (R1)+       ; нажали вниз?
                bne     4$              ; да
                add     #-300, (R3)     ; нет - компенсируем

4$:             bit     R2, (R1)+       ; нажали стрелять?
                beq     5$              ; нет
                mov     #1, FireFlag    ; Стрелять

5$:             return
; End of function Trap52


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Проверка на выход за границы экрана и прорисовка летящей пульки
; Вход: R0 - адрес спрайта пульки
;       R1 - адрес экрана
;       R2 - приращение адреса
;       R4 - указатель в массиве

Trap54:         mov     R1, R3
                bic     #177700, R3     ; посмотрим положение по горизонтали
                cmp     #2, R3          ; за левый край вышли?
                ble     1$              ; нет
                clr     R5              ; да

1$:             cmp     #40400, R1      ; за верхний край вышли?
                ble     2$              ; нет
                clr     R5              ; да

2$:             cmp     #75400, R1      ; за нижний край вышли?
                bgt     3$              ; нет
                clr     R5              ; да

3$:             trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                tst     R5              ; рисовать надо?
                bne     4$              ; надо
                clr     -(R4)           ; нет - стираем адрес пульки в массиве
                return
; ───────────────────────────────────────────────────────────────────────────

4$:             add     R2, R1          ; прибавляем приращение, получаем новый адрес
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, -(R4)       ; сохраняем новый адрес в массиве
                return
; End of function Trap54


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Обработка выстрела пулек и анимация их полёта

Trap56:         tst     (PC)+           ; стрелять можно?
ShootDelay:     .word 0                 ; задержка между выстрелами
                bne     7$              ; нет ещё
                tst     FireFlag        ; можно, а кнопка стрельбы нажата?
                beq     8$              ; нет
; поищем в буфере пустое место
                mov     #BulletBuffer, R0 ; буфер выстреленных пулек
                mov     #BulletBufferSize, R1 ; размер - 6 элементов

1$:             tst     (R0)+           ; пусто?
                bne     2$              ; нет - переходим к следующему элементу
                ; да - проверим дальше
                tst     (R0)+           ; второе слово тоже пустое?
                bne     3$              ; нет - переходим к следующему элементу
                ; да - проверяем дальше
                tst     (R0)+           ; третье слово пусто?
                bne     11$             ; нет - переходим к следующему элементу
                ; да - нашли пустой элемент
6$:             mov     #ShootSndData, R1 ; Данные звука выстрела
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                mov     #6, ShootDelay  ; Ставим задержку
                sub     #6, R0
                mov     RocketAddr, R5  ; Адрес ракеты
                add     #475, R5        ; задаём начальные адреса пулек
                mov     R5, (R0)+       ; их три штуки
                add     #302, R5
                mov     R5, (R0)+
                add     #276, R5
                mov     R5, (R0)+

7$:             dec     ShootDelay      ; задержка между выстрелами
                br      8$              ; ничего не нашли - выстрел игнорируем

2$:             tst     (R0)+           ; нет - переходим к следующему элементу
3$:             tst     (R0)+
11$:            sob     R1, 1$          ; проверим весь массив

8$:             mov     #BulletSprite, R0 ; Спрайт пульки
; анимация летящих пулек
                mov     #BulletBufferSize, R5 ; пройдёмся по всему массиву
                mov     #BulletBuffer, R4 ; буфер выстреленных пулек

9$:             mov     (R4)+, R1
                mov     #-102, R2
                trap    54              ; Проверка на выход за границы экрана и прорисовка летящей пульки
                                        ; Вход: R0 - адрес спрайта пульки
                                        ;       R1 - адрес экрана
                                        ;       R2 - приращение адреса
                                        ;       R4 - указатель в массиве
                mov     (R4)+, R1
                mov     #-2, R2
                trap    54              ; Проверка на выход за границы экрана и прорисовка летящей пульки
                                        ; Вход: R0 - адрес спрайта пульки
                                        ;       R1 - адрес экрана
                                        ;       R2 - приращение адреса
                                        ;       R4 - указатель в массиве
                mov     (R4)+, R1
                mov     #76, R2
                trap    54              ; Проверка на выход за границы экрана и прорисовка летящей пульки
                                        ; Вход: R0 - адрес спрайта пульки
                                        ;       R1 - адрес экрана
                                        ;       R2 - приращение адреса
                                        ;       R4 - указатель в массиве
                sob     R5, 9$
; если задержка вдруг станет отрицательной
; просто сделаем её примерно равной начальной
                bic     #177770, ShootDelay ; задержка между выстрелами
                return
; End of function Trap56


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Увеличение пройденного расстояния

Trap60:         mov     #Distance+12, R0 ; 1-Й разряд пройденного пути

1$:             add     #10., -(R0)
                cmp     #FONT + <'9 + 1 - 40>*10. - 2 , (R0) ; ':' - перенос в следующий разряд есть?
                blt     2$              ; есть
                return                  ; нет - выходим
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     #FONT + <'0 - 40>*10. + 1, (R0)    ; записываем '0' в разряд
                cmp     #Distance+2, R0 ; дошли до 5-го разряда?
                bne     1$              ; нет - продолжаем прибавлять
                                        ; да
4$:             inc     MillionKMCount ; счётчик пройденных миллионов км
                                        ; через каждый миллион увеличивается сложность
                mov     #SoundMillionData, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                br      1$
; End of function Trap60



; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Обработка оружейных ящиков
; Полёт, проверка на выход за экран, встречу с ракетой,
; и добавление нового вида оружия

Trap62:         tst     (PC)+           ; пора рисовать оружейный ящик?
AmmoBoxDelay:   .word 240
                bne     1$              ; нет ещё
                mov     #500, AmmoBoxDelay ; пора - инициализируем задержку
                mov     @#177710, R5
                bic     #77, R5
                add     #40000, R5      ; псевдослучайный адрес
                mov     R5, AmmoBoxAddr ; адрес экрана оружейного ящика

1$:             dec     AmmoBoxDelay
                mov     AmmoBoxAddr, R1 ; адрес экрана оружейного ящика
                beq     0ret$           ; нету - нечего делать
                ; если адрес валидный - продолжаем

2$:             mov     #SpriteAmmoBox, R0
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                com     #0              ; замедленное
                beq     3$
                com     #0              ; в 4 раза
                beq     3$
                inc     R1              ; движение

3$:             mov     R1, R5
                tst     (R5)+
                bit     #77, R5         ; за правую границу экрана уехали?
                bne     4$              ; нет - продолжим
                clr     AmmoBoxAddr     ; всё, нет больше оружейного ящика
0ret$:          return

5$:             mov     R1, AmmoBoxAddr ; сохраним новый адрес экрана
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                return

4$:             mov     RocketAddr, R4  ; Адрес ракеты
                mov     R1, R3          ; проверим где летит
                add     #1300, R3
                cmp     R4, R3
                bge     5$              ; выше
                                        ; не выше ракеты
                mov     R4, R3
                add     #1600, R3
                cmp     R3, R1
                ble     5$              ; ниже
                                        ; не ниже ракеты
                bic     #177700, R4     ; теперь проверим на встречу
                mov     R1, R5
                bic     #177700, R5
                mov     R5, R3
                add     #2, R3
                cmp     R4, R3
                bge     5$

                mov     R4, R3
                add     #7, R3
                cmp     R3, R5
                ble     5$
; ───────────────────────────────────────────────────────────────────────────
; ракета поймала ящик
                clr     AmmoBoxAddr     ; адрес экрана оружейного ящика
                mov     #SoundHitAmmo, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                mov     #SpriteWeapon0, R4
                mov     @#177710, R5    ; псевдослучайное число
                bic     #177774, R5     ; будет 4 вида оружия
                mov     R5, R3          ; номер
                beq     10$

9$:             add     #SprWeaponLen, R4
                sob     R5, 9$          ; получим по номеру адрес спрайта

10$:            mov     #4, R1          ; можно наловить 4 вида оружия
                mov     #77000, R0      ; адрес экрана

11$:            tst     (R0)+           ; ищем там пустое место
                beq     13$             ; нашли
                tst     (R0)+
                sob     R1, 11$
                mov     #4, R1          ; не нашли, тогда ищем с конца такой же вид оружия

12$:            tst     -(R0)
                cmp     4(R4), -(R0)
                beq     16$             ; нашли
                sob     R1, 12$
                return                  ; не нашли - не можем применить
; ───────────────────────────────────────────────────────────────────────────

13$:            mov     #1, R1          ; R1 =  1 для оружия 0
                                        ;      10 для оружия 1
                                        ;     100 для оружия 2
                                        ;    1000 для оружия 3
                tst     R3
                beq     15$

14$:            rol     R1
                rol     R1
                rol     R1
                bic     #7, R1
                sob     R3, 14$

15$:            add     R1, WeaponHaveFlag ; Флаги и счётчики наличия доп. оружия.
                                        ; не 0 в разрядах 0-2 - есть оружие 0, иначе нету
                                        ; не 0 в разрядах 3-5 - есть оружие 1, иначе нету
                                        ; не 0 в разрядах 6-8 - есть оружие 2, иначе нету
                                        ; не 0 в разрядах 9-11 - есть оружие 3, иначе нету
                tst     -(R0)

16$:            mov     R0, R1          ; выводим спрайт оружия на место
                mov     R4, R0
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                sub     #176, R1        ; рисуем шкалу, сколько запасов осталось
                mov     #10, R2

17$:            movb    #125, (R1)
                add     #100, R1
                sob     R2, 17$
                return
; End of function Trap62


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Проверка на коллизии: попадание оружием в метеориты
; или попадание в ракету
; Вход: R1 - адрес метеорита
;       R4 - адрес в массиве, указывающий на текущий объект

Trap64:         mov     #BulletBuffer, R3 ; буфер выстреленных пулек
                mov     #BulletBufferLenW, R2 ; в массиве 18. пульки максимум

T64.Loop$:      mov     (R3), R0
                cmp     R1, R0
                bgt     1.64$           ; пулька выше метеорита - не попали
                mov     R1, R5
                add     #1100, R5
                cmp     R5, R0
                blt     1.64$           ; пулька ниже метеорита - не попали
                mov     R1, R5
                bic     #177700, R5
                bic     #177700, R0
                cmp     R5, R0
                bgt     1.64$           ; пулька уже за объектом - не попали
                tst     (R5)+
                cmp     R5, R0
                blt     1.64$           ; пулька ещё не долетела до метеорита - не попали
                mov     (R3), R5        ; есть попадание, берём адрес
                clr     (R3)            ; удаляем пульку из массива
                clr     (R5)            ; удаляем её с экрана
                clr     100(R5)
                clr     200(R5)

ClearSprite:    mov     (R4), R0        ; адрес спрайта метеорита
                clr     (R4)+
                clr     (R4)+           ; удаляем его из массива
                tst     -(R1)           ; корректируем адрес экрана
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     #302, R1
                jmp     WeaponHit       ; Подбили объект, заполним таблицу разлёта осколков, если в ней есть место
                                        ; Вход: R1 - адрес экрана центра объекта
; ───────────────────────────────────────────────────────────────────────────

1.64$:          tst     (R3)+           ; переходим к следующему элементу
                sob     R2, T64.Loop$   ; и так весь массив
; Ни одна пулька ни во что не попала
; Теперь проверим доп.оружие
                mov     #AddnWeapons, R3 ; адрес таблицы адресов экранных адресов доп. оружий
                mov     #4, R2          ; у нас 4 вида оружия

2$:             mov     @(R3)+, R0      ; адрес экрана доп. оружия
                cmp     R1, R0
                bgt     3$              ; объект ниже оружия - не попали
                mov     R1, R5
                add     #1100, R5
                cmp     R5, R0
                blt     3$              ; объект выше оружия - не попали
                bic     #177700, R5
                bic     #177700, R0
                cmp     R5, R0
                bgt     3$              ; объект за оружием - не попали
                tst     (R5)+
                cmp     R5, R0
                blt     3$              ; объект ещё не достиг оружия - не попали
                br      ClearSprite     ; есть попадание
; ───────────────────────────────────────────────────────────────────────────

3$:             sob     R2, 2$           ; проверим все 4 вида
; Ни одно оружие ничего не сбило
; Теперь проверим, подбили ли ракету
                mov     RocketAddr, R2  ; Адрес ракеты
                mov     R1, R5
                add     #1100, R5
                cmp     R5, R2
                blt     4$              ; объект выше ракеты - не подбили
                mov     R2, R5
                add     #1600, R5
                cmp     R1, R5
                bgt     4$              ; объект ниже ракеты - не подбили
                mov     R1, R5
                bic     #177700, R5
                bic     #177700, R2
                mov     R2, R3
                add     #7, R3
                cmp     R5, R3
                bgt     4$              ; объект за ракетой - не подбили
                tst     (R5)+
                cmp     R5, R2
                bge     RocketHit       ; Попадание в ракету
                ; объект перед ракетой - не подбили
4$:             return
; End of function Trap64


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Попадание в ракету

RocketHit:      tst     RocketFragTbl   ; Таблица адресов осколков от ракеты
                bne     2$
                mov     #RocketFragTbl, R5 ; Таблица адресов осколков от ракеты
                mov     #RocketFragElemNum, R0 ; в таблице 14 элементов
                mov     RocketAddr, R2  ; Адрес ракеты
                add     #4, R2          ; начальный адрес
                mov     #20, (R5)+      ; инициализируем счётчик (первое слово)

1$:             mov     R2, (R5)+       ; заполняем таблицу
                sob     R0, 1$

2$:             mov     #Lives, R2
                ;sub     #10., (R2)    ; уменьшаем количество жизней  ### это для нормальной игры
                cmp     #10., (R2)      ; уменьшаем количество жизней ### это для бессмертия
                cmp     (R2), #FONT + <'0 - 040>*10. ; '0'-1
                ble     3$              ; жизни кончились
; ───────────────────────────────────────────────────────────────────────────

                mov     #F$DataBlock, R0 ; выводим новое количество жизней
                mov     #76774, (R0)+
                mov     R2, (R0)+       ; Количество жизней
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                jmp     ClearSprite     ; и удалим объект с экрана, он подбился об ракету

3$:             ;jmp     RocketDead    ; Ракету убили, конец игры
; End of function RocketHit


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Ракету убили, конец игры

RocketDead:     mov     #140, R3
                mov     R3, R2
                call    @#102062
                mov     #122, R0        ; на входе в следующую функцию R0 не должен быть 0
                call    RocketFragScattrAnim ; Обработка разлёта осколков от попадания по ракете
                tst     RocketFragTbl   ; Таблица адресов осколков от ракеты
                bne     RocketDead      ; пока осколки есть, пусть разлетаются
                mov     #SoundRocketDead, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                mov     #F$DataBlock, R0
                clr     (R0)+               ; 40 цвет цифры 2
                mov     #40000, (R0)+       ; 42 адрес с которого выводить цифру 2
                mov     #77700, (R0)+       ; 44 начало экрана
                mov     #datTextGAMER, (R0)+ ; 46 адрес массива
                mov     #167356, (R0)+      ; 50 цвет
                mov     #7, (R0)+           ; 52 макс.масштаб
                mov     #20, (R0)+          ; 54 сама цифра 2
                mov     #1, (R0)+           ; 56
                mov     #44000, @#F$GameAddr ; адрес с которого начинать выводить слово GAME
                trap    0               ; Вывод слова GAME и цифры 2
                                        ; Вход: F$DataBlock - блок параметров
                mov     #40040, R1
                mov     #270, R2
                mov     #20, R3
                clr     @#F$ColorMask
                clr     @#F$YScale2
                trap    20              ; Вывод падающей каплей буквы
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота падения
                                        ;       R3 - код буквы - 20
                mov     #66000, R1
                mov     #datText13$, @#F$DataAddr2
                trap    70              ; Вывод на экран счёта

1$:             tst     @#177714        ; ждём нажатия чего-нибудь
                bne     2$
                bit     #100, @#177716
                bne     1$

2$:             call    ClrScr          ; очищаем экран
                jmp     DrawMenu1$      ; и начинаем всё заново
; End of function RocketDead


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Обработка разрушения объекта

sub_21630:      mov     (R4), R1        ; адрес объекта
                dec     6(R4)           ; жизни закончились?
                bne     1$              ; нет ещё - обработка попадания
                                        ; да - удаляем объект
                clr     (R4)+           ; объекта больше нет
                clr     (R4)+
                clr     (R4)+
                clr     (R4)+
                mov     (R4), R0        ; адрес спрайта
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана

1$:             add     #302, R1        ; адрес центра разлёта осколков
; End of function sub_21630


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Подбили объект, заполним таблицу разлёта осколков, если в ней есть место
; Вход: R1 - адрес экрана центра объекта

WeaponHit:      call    GrowScore       ; Увеличение счёта
                mov     #FragObjElemNum, R5
                mov     #FragObjTbl, R4 ; ищем в таблице пустое место

1$:             tst     (R4)
                beq     2$              ; нашли
                add     #FragObjSize, R4
                sob     R5, 1$
                return                  ; не нашли ничего не делаем
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     #22, (R4)+      ; счётчик жизни осколков
                mov     R1, (R4)+       ; заполняем таблицу начальными адресами
                add     #100, R1
                mov     R1, (R4)+
                mov     R1, 12(R4)
                add     #101, R1
                mov     R1, (R4)+
                add     #77, R1
                mov     R1, (R4)+
                mov     R1, 2(R4)
                add     #100, R1
                mov     R1, (R4)+
                sub     #101, R1
                mov     R1, 2(R4)
                return
; End of function WeaponHit


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Проверка на коллизии с объектами уровней сложности
; Вход: R4 адрес блока параметров объекта

Trap66:         mov     #BulletBufferLenW, R5 ; в массиве 18. пульки максимум
                mov     #BulletBuffer, R3 ; буфер выстреленных пулек

1$:             mov     (R4), R1        ; адрес объекта
                cmp     (R3), R1
                blt     2$              ; пулька выше объекта - не попали
                add     2(R4), R1       ; прибавим высоту
                cmp     (R3), R1
                bgt     2$              ; пулька ниже объекта - не попали
                bic     #177700, R1
                mov     (R3), R0
                bic     #177700, R0
                cmp     R0, R1
                blt     2$              ; пулька уже за объектом - не попали
                add     4(R4), R1
                cmp     R0, R1
                ble     sub_21630       ; есть попадание
                                        ; пулька ещё не долетела до объекта - не попали
2$:             tst     (R3)+           ; переходим к следующему элементу
                sob     R5, 1$          ; и так весь массив
; Ни одна пулька в объект не попала
; Теперь проверим доп.оружие
                mov     #4, R5          ; у нас 4 вида оружия
                mov     #AddnWeapons, R3 ; адрес таблицы адресов экранных адресов доп. оружий

3$:             mov     @(R3)+, R0      ; адрес экрана доп. оружия
                mov     (R4), R1        ; адрес объекта
                cmp     R0, R1
                blt     4$              ; объект ниже оружия - не попали
                add     2(R4), R1
                cmp     R0, R1
                bgt     4$              ; объект выше оружия - не попали
                bic     #177700, R1
                bic     #177700, R0
                cmp     R0, R1
                blt     4$              ; объект за оружием - не попали
                add     4(R4), R1
                cmp     R0, R1
                ble     sub_21630       ; есть попадание
                                        ; объект ещё не достиг оружия - не попали
4$:             sob     R5, 3$
; Ни одно оружие объект не сбило
; Теперь проверим, подбили ли ракету
                mov     RocketAddr, R0  ; Адрес ракеты
                mov     (R4), R1        ; адрес объекта
                add     2(R4), R1
                cmp     R1, R0
                bmi     5$              ; объект выше ракеты - не подбили
                sub     2(R4), R1
                add     #1600, R0
                cmp     R1, R0
                bpl     5$              ; объект ниже ракеты - не подбили
                bic     #177700, R0
                bic     #177700, R1
                add     4(R4), R1
                cmp     R1, R0
                bmi     5$              ; объект за ракетой - не подбили
                add     #7, R0
                sub     4(R4), R1
                cmp     R1, R0
                bpl     5$              ; объект перед ракетой - не подбили
                mov     #1, 6(R4)       ; есть попадание в ракету, уменьшаем жизни до 1, чтоб объект уничтожить
                call    sub_21630       ; Обработка разрушения объекта
                ; Обработка попадания в ракету
                mov     #37774, R4      ; это заглушка для стирания спрайта в функции RocketHit
                                        ; когда жизни ещё не кончились, там идём на ClearSprite и вот там это нужно
                mov     #SpriteObj2, (R4)
                jmp     RocketHit       ; Попадание в ракету
; ───────────────────────────────────────────────────────────────────────────

5$:             return
; End of function Trap66


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Увеличение счёта

GrowScore:      mov     R0, -(SP)
                mov     #Score+4, R0

1$:             incb    -(R0)
                cmpb    #'9 + 1 - 20, (R0)
                bne     2$
                movb    #'0 - 20, (R0)
                br      1$

2$:             mov     (SP)+, R0
                return
; ───────────────────────────────────────────────────────────────────────────

; End of function GrowScore


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Вывод на экран счёта

Trap70:         clrb    Score+5
                call    Trap06          ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#F$DataAddr2 - адрес массива данных
                mov     #54414, R1
                mov     #datScore, @#F$DataAddr2
                jmp     Trap06          ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#F$DataAddr2 - адрес массива данных
; End of function Trap70


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Ждать нажатия чего-нибудь

Trap72:         tst     @#177714
                bne     1$
                bit     @#177716, #100
                bne     Trap72          ; Ждать нажатия чего-нибудь

1$:             return
; End of function Trap72


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; очистка экрана бегущей квадратной рамкой

CLS.Sqr:        mov     #40000, R0
; сперва сужающуюся к центру экрана

1$:             mov     #167, @#F$Color
                mov     #335, @#F$Color2
                trap    10
                add     #401, R0
                trap    10
                mov     R0, R1
                clr     @#F$Color
                clr     @#F$Color2
                sub     #401, R0
                trap    10
                mov     R1, R0
                cmp     #57400, R0
                bge     1$
                mov     #57036, R0
; потом расширяющуюся от центра к краям экрана

2$:             mov     #356, @#F$Color
                mov     #273, @#F$Color2
                trap    10
                add     #401, R0
                clr     @#F$Color
                clr     @#F$Color2
                trap    10
                sub     #1002, R0
                cmp     #37400, R0
                blt     2$
                add     #401, R0
                trap    10
                return
; End of function CLS.Sqr


ExpandSprite8:  mov     #SpriteObj8.2, R0
                mov     #Sprite8Buf, R1
                mov     #76, (R1)+      ; новая высота
                mov     #20, (R1)+      ; новая ширина
                mov     #37, R5         ; реальная высота

1$:             mov     #10, R3         ; реальная ширина

2$:             mov     #4, R2
                movb    (R0)+, R4

3$:             ror     (R1)
                ror     (R1)
                ror     (R1)
                ror     (R1)
                bic     #170000, (R1)
                ror     R4
                bcc     4$
                bis     #50000, (R1)

4$:             ror     R4
                bcc     5$
                bis     #120000, (R1)

5$:             sob     R2, 3$
                mov     (R1)+, 16(R1)
                sob     R3, 2$
                add     #20, R1
                sob     R5, 1$
                return

ResetScroll:    mov     #1330, @#177664
                return
; ───────────────────────────────────────────────────────────────────────────

NextStart2$:    call    ExpandSprite8
                mov     #4, R1
                mov     #34000, @#177706
                mov     R1, @#177712
                br      Init$           ; там все инициализации

Loop1Init$:     clr     (R1)+           ; очищаем всё от адреса 4 до 1000
; Начальная инициализация
Init$:          bit     #77000, R1
                beq     Loop1Init$

TrapTo4:        mov     #TopStack, SP
                call    ResetScroll
                mov     #TrapTo4, @#4
                mov     #DisTrap, @#34
                mov     #SkipSplash$, @#60
                mov     #SkipSplash$, @#274
                mtps    #0
                mov     @#177662, R0
                call    CLS.Sqr

StartSplash$:   mov     #datText2, R4
                trap    16              ; Анимация заставки
                                        ; Вход: R4 - адрес текста
                mov     #strText3, R4   ; БОРТНИК  БОРИС
                mov     #40005, R1
                mov     #56, R2
                mov     #173000, @#F$ColorMask
                mov     #2, @#F$YScale2
                mov     #16, R5

1$:             movb    (R4)+, R3
                trap    20              ; Вывод падающей каплей буквы
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота падения
                                        ;       R3 - код буквы - 20
                add     #4, R1
                sob     R5, 1$
                mov     #20, R3
                mov     #120, R2
                mov     #40041, R1
                trap    20              ; Вывод падающей каплей буквы
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота падения
                                        ;       R3 - код буквы - 20
                mov     #52500, R1
                mov     #datText4, @#F$DataAddr2 ; г.МОСКВА
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#F$DataAddr2 - адрес массива данных
                mov     #40515, R1
                mov     #strText4, R2   ; 26.01.1991
                mov     #172000, @#F$ColorMask
                mov     #2, @#F$YScale2

                clr     R5
                sob     R5, .
                sob     R5, .
                trap    22              ; Вывод текста буквами тырк-тырк влево-вправо
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - адрес текста
                                        ;       @#F$ColorMask - маска цвета для 1 бита символа
                                        ;       @#F$YScale2 - масштаб по высоте
                mov     #1, R0
2$:             clr     R1
                sob     R1, .
                sob     R0, 2$

; строка "**  SECOND  **" едет вверх. затирая всё до самого верха экрана
                mov     #327, R5
                mov     #72700, R1

3$:             mov     #1600, R2

4$:             mov     100(R1), (R1)+
                sob     R2, 4$
                sub     #3500, R1
                sob     R5, 3$
                mov     #1400, R5

5$:             clr     (R1)+
                sob     R5, 5$
                trap    24              ; Вывод три зелёных полосы и на них копирайт спрайтами
                mov     #F$DataBlock, R0
                mov     #167356, (R0)+   ; цвет цифры 2
                mov     #43022, (R0)+    ; адрес с которого выводить цифру 2
                mov     #42000, (R0)+    ; начало экрана
                mov     #datTextGAMEE, (R0)+ ; адрес данных
                mov     #146314, (R0)+   ; цвет
                mov     #12, (R0)+       ; макс.масштаб
                mov     #2, (R0)+        ; цифра 2
                mov     #40, (R0)+       ; количество циклов
                mov     #62000, @#F$GameAddr ; адрес с которого начинать выводить слово GAME
                trap    0               ; Вывод слова GAME и цифры 2
                                        ; Вход: @#F$DataBlock - блок параметров
                mov     #1400, R2
                mov     R2, R3
                call    @#102062

SkipSplash$:    call    ResetScroll
                mov     #VecKbdNo$, @#60
                mov     #VecKbdNo$, @#274

DrawMenu$:      call    CLS.Sqr         ; очистка экрана бегущей квадратной рамкой
DrawMenu1$:     trap    24              ; Вывод три зелёных полосы и на них копирайт спрайтами
; вывод названия игры
                mov     #sprSecond, R0
                mov     #44002, R1
                mov     #14, R2

1$:             mov     #17, R3

2$:             mov     #4, R4
                movb    (R0)+, R5

3$:             clrb    (R1)
                ror     R5
                bcc     4$
                bisb    #52525, (R1)

4$:             ror     R5
                bcc     5$
                bisb    #125252, (R1)

5$:             inc     R1
                sob     R4, 3$
                sob     R3, 2$
                mov     #500, R3
                add     #4, R1

6$:             movb    -100(R1), (R1)+
                sob     R3, 6$
                sob     R2, 1$
                mov     #datMenu$, R4
                mov     #3, R1
                clr     R0
                trap    26              ; Вывод и обработка меню
                                        ; Вход: R0 - номер начального пункта меню
                                        ;       R1 - номер последнего пункта меню
                                        ;       R4 - адрес параметров меню
                                        ; Выход: R0 - выбранный пункт меню
                dec     R0
                beq     SetControls$
7$:             dec     R0
                beq     ShowInfo$
                dec     R0
                bne     8$
                call    Exit$

8$:             jmp     StartGame$
; ───────────────────────────────────────────────────────────────────────────

ShowInfo$:      mov     #F$DataBlock, R0
                mov     #77700, (R0)+
                mov     #datInfo$, (R0)+
                mov     #175372, (R0)+
                mov     #10000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу 40:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                call    ResetScroll
                br      DrawMenu1$
; ───────────────────────────────────────────────────────────────────────────

SetControls$:   mov     #42000, R1
                mov     #73567, R0
                clr     R4
                mov     #40, R2
                mov     #170, R3
                trap    30              ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                mov     #52412, R1
                clr     R0
                mov     #26, R2
                mov     #60, R3
                trap    30              ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                mov     #datMenu1$, R4  ; Меню - выбор органа управления
                mov     #2, R1
                trap    26              ; Вывод и обработка меню
                                        ; Вход: R0 - номер начального пункта меню
                                        ;       R1 - номер последнего пункта меню
                                        ;       R4 - адрес параметров меню
                                        ; Выход: R0 - выбранный пункт меню
                mov     #52312, R1
                mov     #73567, R4
                dec     R0
                beq     SetJoystick$
                dec     R0
                bne     SetKeyboard$
                trap    30              ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета

ExitMenu1$:     clr     R0
                clr     R4
                mov     #47412, R1
                mov     #26, R2
                mov     #22, R3
                trap    30              ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                mov     #60004, R1
                mov     #34, R2
                mov     #50, R3
                trap    30              ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                mov     #F$DataBlock, R5
                mov     #50114, (R5)+
                mov     #datText5$, (R5)+ ; УПРАВЛЕНИЕ
                mov     #124000, (R5)+
                mov     #2, (R5)+
                trap    12              ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                mov     #2, R1
                mov     #datMenu3$, R4  ; Меню - способ управления
                trap    26              ; Вывод и обработка меню
                                        ; Вход: R0 - номер начального пункта меню
                                        ;       R1 - номер последнего пункта меню
                                        ;       R4 - адрес параметров меню
                                        ; Выход: R0 - выбранный пункт меню
                mov     R0, CtrlMode  ; режим управления: 0 - от клавиатуры
                                        ;                   1 - от джойстика
                                        ;                   2 - клавиатура + джойстик
                jmp     DrawMenu$
; ───────────────────────────────────────────────────────────────────────────

SetKeyboard$:   call    sub_7316
                mov     #KeyTab, R0     ; таблица управляющих клавиш
                mov     #177660, R2     ; регистр управления
                mov     R2, R3
                tst     (R2)+           ; регистр данных клавиатуры
                br      0NextSet$
; ───────────────────────────────────────────────────────────────────────────

SetJoystick$:   call    sub_7316
                mov     #JoyTab, R0     ; таблица масок битов джойстика
                mov     #177714, R2     ; регистр данных джойстика
                mov     R2, R3          ; он же - регистр управления

0NextSet$:      mov     #5, R1
                mov     #datMenu2$, R4
                trap    32              ; Вывод и обработка меню для задания управления
                                        ; Вход: R1 - количество пунктов меню
                                        ;       R2 - регистр данных
                                        ;       R3 - регистр управления
                                        ;       R4 - адрес блока параметров меню
                br      SetControls$
; ───────────────────────────────────────────────────────────────────────────


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


sub_7316:       clr     R0
                trap    30              ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                clr     R4
                mov     #51406, R1
                mov     #32, R2
                mov     #74, R3
                trap    30              ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                return
; End of function sub_7316


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Обработка разлёта осколков от попадания по ракете

RocketFragScattrAnim:
                mov     #RocketFragTbl, R5 ; Таблица адресов осколков от ракеты
                tst     (R5)
                beq     5$
                mov     #240, R0
                mov     #RocketFragElemNum, R4
                mov     #RocFragScattrOffsetTbl, R3 ; массив приращений к адресу, размер 14 слов
                dec     (R5)+           ; уменьшаем счётчик
                bne     1$              ; не 0 - можно работать
                clr     R0              ; 0 - отметим, что прорисовывать не надо

1$:             mov     (R5), R2        ; берём адрес из массива. это старый адрес
                clrb    (R2)            ; стираем по старому адресу
                clrb    100(R2)
                clrb    200(R2)
                add     (R3)+, R2       ; прибавляем приращение к адресу,это новый адрес
                bit     #74, R2         ; проверка на выход за границы экрана
                beq     2$
                cmp     #40400, R2
                bgt     2$
                cmp     #75000, R2
                bgt     3$

2$:             clr     R2              ; вылетело - удаляем из массива

3$:             mov     R2, (R5)+       ; к следующему элементу
                sob     R4, 1$
                tst     R0              ; прорисовывать?
                beq     5$              ; не надо
                ; надо - прорисуем на новых местах
                mov     #RocketFragElemNum, R4
                sub     R4, R5
                sub     R4, R5

4$:             mov     (R5)+, R0
                movb    #74, (R0)
                movb    #377, 100(R0)
                movb    #303, 200(R0)
                sob     R4, 4$
                mov     #SoundRocketFrags, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
5$:             return
; End of function RocketFragScattrAnim


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Обработка разлёта осколков от комет и прочих помех

ObjectFragScattrAnim:
                mov     #FragObjNum, R5
                mov     #FragObjTbl, R0

1$:             mov     (R0), R1        ; счётчик элемента
                bne     3$              ; не 0 - значит надо рисовать
                add     #FragObjSize, R0 ; переходим к следующему элементу

2$:             sob     R5, 1$
                return
; ───────────────────────────────────────────────────────────────────────────

3$:             dec     (R0)+           ; уменьшаем счётчик
                dec     R1              ; и полученное значение
                mov     #FragObjElemNum, R4
                mov     #ObjFragScattrOffsetTbl, R3 ; массив приращений к адресу, размер 8 слов

4$:             mov     (R0), R2        ; берём адрес из массива. это текущий адрес
                beq     6$              ; 0 - ничего не надо делать
                clrb    (R2)            ; стираем с экрана
                clrb    100(R2)
                add     (R3)+, R2       ; формируем новый адрес
                bit     #74, R2         ; проверка на выход за границы экрана
                beq     5$
                cmp     #40400, R2
                bgt     5$
                cmp     #76000, R2
                bgt     6$

5$:             clr     R2              ; вылетел за границу экрана

6$:             mov     R2, (R0)+
                sob     R4, 4$          ; и так весь массив

                tst     R1              ; счётчик обнулился?
                beq     2$              ; ну и всё, рисовать не надо
                mov     #FragObjElemNum, R4
                sub     R4, R0
                sub     R4, R0

7$:             mov     (R0)+, R2
                beq     8$
                movb    #252, (R2)
                movb    #125, 100(R2)

8$:             sob     R4, 7$
                mov     #Sound7$, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                br      2$

; End of function ObjectFragScattrAnim

; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Обработка коробок с жизнями
; анимация, проверка на коллизии и т.п.

LiveBoxProc:    tst     (PC)+           ; новую коробку надо выводить?
LiveBoxDelay:   .word   621
                bne     1$              ; нет ещё
                mov     #1000, LiveBoxDelay ; инициализируем задержку
                mov     @#177710, R5
                bic     #77, R5
                add     #40000, R5      ; получим новый адрес
                mov     R5, LiveBoxAddr ; адрес коробки с жизнями

1$:             dec     LiveBoxDelay    ; уменьшаем счётчик
                mov     #SpriteLiveBox, R0
                mov     LiveBoxAddr, R1 ; адрес коробки с жизнями
                beq     5$              ; нету - ничего не делать

                ; если коробка на экране - обработаем
2$:             trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                tst     (R1)+           ; движемся
                mov     R1, R2
                inc     R2
                bit     #77, R2         ; до правого края дошли?
                bne     3$              ; нет ещё
                clr     LiveBoxAddr     ; да - всё, улетела за экран
                return
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     RocketAddr, R5  ; теперь проверим, поймали ли ракетой коробку
                mov     R5, R3
                mov     R1, R2
                add     #1200, R2
                cmp     R2, R3
                bmi     4$
                add     #1600, R3
                cmp     R1, R3
                bpl     4$
                bic     #177700, R5
                bic     #177700, R2
                mov     R5, R3
                add     #12, R3
                cmp     R2, R3
                bpl     4$
                add     #2, R2
                cmp     R2, R5
                bmi     4$
                cmp     #FONT + <'9 - 40>*10., Lives ; '9' количество жизней и так максимум?
                beq     5$              ; да - ничего не делать
6$:             add     #10., Lives     ; увеличим количество жизней
                clr     LiveBoxAddr     ; коробка - всё
                mov     #F$DataBlock, R0         ; выведем на экран
                mov     #76774, (R0)+
                mov     #Lives, (R0)+   ; Количество жизней
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                mov     #SoundLiveBoxCatch, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                return

4$:             dec     R1              ; не поймали - просто выводим
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, LiveBoxAddr ; адрес коробки с жизнями
5$:             return
; End of function LiveBoxProc

; ───────────────────────────────────────────────────────────────────────────
Sound1$:        .word 10
                .word 400
                .word 200
                .word 660
                .word 400
                .word 0

Sound2$:        .word 14
                .word 100
                .word 200
                .word 300
                .word 400
                .word 300
                .word 200
                .word 0

Sound6$:        .word 22
                .word 30
                .word 500
                .word 300
                .word 500
                .word 0

Sound4$:        .word 20                ; звук выбора пункта меню
                .word 1000
                .word 200
                .word 0

Sound3$:        .word 14                ; звук выделения текущего пункта меню
                .word 300
                .word 600
                .word 400
                .word 0

SoundMillionData:.word 14
                .word 500
                .word 1000
                .word 1400
                .word 1000
                .word 0

Sound8$:        .word 1                 ; Звук полёта ракеты
                .word 37
                .word 0

SoundHitAmmo:   .word 10
                .word 300
                .word 100
                .word 0

ShootSndData:   .word 4                 ; Данные звука выстрела
                .word 300
                .word 200
                .word 100
                .word 200
                .word 0

SoundRocketDead:.word 40
                .word 1000
                .word 500
                .word 300
                .word 500
                .word 300
                .word 1000
                .word 0

SoundRocketFrags:.word 10
                .word 60
                .word 20
                .word 0

Sound7$:        .word 6
                .word 37
                .word 0

SoundLiveBoxCatch:.word 100
                .word 130
                .word 110
                .word 150
                .word 0

Sound10$:       .word 1
                .word 1000
                .word 0

Sound11$:       .word 14
                .word 300
                .word 1000
                .word 500
                .word 1400
                .word 300
                .word 0

; ───────────────────────────────────────────────────────────────────────────
datText1:       .word FONT + <'( - 40>*10. ; (C)  BIL corp.
                .word FONT + <'C - 40>*10.
                .word FONT + <') - 40>*10.
                .word FONT + <'  - 40>*10.
                .word FONT + <'  - 40>*10.
                .word FONT + <'B - 40>*10.
                .word FONT + <'I - 40>*10.
                .word FONT + <'L - 40>*10.
                .word FONT + <'  - 40>*10.
                .word FONT + <'c - 40>*10. + 1
                .word FONT + <'o - 40>*10. + 1
                .word FONT + <'r - 40>*10. + 1
                .word FONT + <'p - 40>*10. + 1
                .word FONT + <'. - 40>*10.
                .word 0
; ───────────────────────────────────────────────────────────────────────────
datText3:       .word FONT + <'П - 100>*10. ; ПРЕДСТАВЛЯЕТ
                .word FONT + <'Р - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'Д - 100>*10.
                .word FONT + <'С - 100>*10.
                .word FONT + <'Т - 100>*10.
                .word FONT + <'А - 100>*10.
                .word FONT + <'В - 100>*10.
                .word FONT + <'Л - 100>*10.
                .word FONT + <'Я - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'Т - 100>*10.
                .word 0
; ───────────────────────────────────────────────────────────────────────────
datTextGAMEE:   .word FONT + <'G - 40>*10.+1
                .word FONT + <'A - 40>*10.+1
                .word FONT + <'M - 40>*10.+1
                .word FONT + <'E - 40>*10.+1
                .word 0
datTextGAMER:   .word FONT + <'И - 100>*10.+1
                .word FONT + <'Г - 100>*10.+1
                .word FONT + <'Р - 100>*10.+1
                .word FONT + <'А - 100>*10.+1
                .word 0
; ───────────────────────────────────────────────────────────────────────────
datText2:       .word FONT + <'C - 40>*10.
                .word FONT + <'O - 40>*10.
                .word FONT + <'E - 40>*10.
                .word FONT + <'N - 40>*10.
                .word FONT + <'S - 40>*10.
                .word FONT + <'D - 40>*10.
                .word FONT + <'  - 40>*10.
                .word FONT + <'  - 40>*10.
                .word FONT + <'  - 40>*10.
                .word FONT + <'  - 40>*10.
                .word FONT + <'* - 40>*10.
                .word FONT + <'* - 40>*10.
                .word FONT + <'* - 40>*10.
                .word FONT + <'* - 40>*10.
                .word FONT + <'  - 40>*10.
                .word FONT + <'  - 40>*10.
datText2End:    .word 0
; ───────────────────────────────────────────────────────────────────────────
datText6$:      .word FONT + <'П - 100>*10. ; ПАУЗА-СБР
                .word FONT + <'А - 100>*10.
                .word FONT + <'У - 100>*10.
                .word FONT + <'З - 100>*10.
                .word FONT + <'А - 100>*10.
                .word FONT + <'- -  40>*10.
                .word FONT + <'С - 100>*10.
                .word FONT + <'Б - 100>*10.
                .word FONT + <'Р - 100>*10.
                .word 0
; ───────────────────────────────────────────────────────────────────────────
datStrKM:       .word FONT + <'K - 040>*10.
                .word FONT + <'M - 040>*10.
                .word 0
; ───────────────────────────────────────────────────────────────────────────
strText3:       .asciz "БОРТНИК  БОРИС"
strText3End:    .even
datText4:       .byte 2,356
                .asciz "г.МОСКВА"
strText4:       .asciz "26.01.1991"
strText4End:    .even
datText13$:     .byte 5, 167
                .asciz "ОКОНЧЕНА"
datText13End:   .even

; ───────────────────────────────────────────────────────────────────────────
; Спрайт капля, ширина 1 байт, высота 13 строк
SpriteDrop:     .byte ^B00000000
                .byte ^B00010000
                .byte ^B00000100
                .byte ^B00010000
                .byte ^B00000100
                .byte ^B00010000
                .byte ^B00010100
                .byte ^B01010101
                .byte ^B01010101
                .byte ^B01010101
                .byte ^B00010100
                .even

SprBIL:         .byte 125, 125, 120, 25, 25, 0
                .byte 375, 377, 321, 77, 75, 0
                .byte 364, 320, 103, 17, 75, 0
                .byte 364, 325, 103, 17, 75, 0
                .byte 364, 377, 101, 17, 75, 0
                .byte 364, 320, 103, 17, 75, 125
                .byte 364, 320, 103, 17, 75, 375
                .byte 364, 325, 103, 17, 75, 375
                .byte 375, 377, 320, 77, 375, 377
sprCopyright:   .byte 300, 377, 3
                .byte 160, 125, 15
                .byte 134, 377, 65
                .byte 327, 327, 327
                .byte 327, 127, 325
                .byte 327, 127, 325
                .byte 327, 127, 325
                .byte 327, 327, 327
                .byte 134, 377, 65
                .byte 160, 125, 15
                .byte 300, 377, 3
                .even
; спрайт слова SECOND
sprSecond:      .byte 250, 252, 240, 252, 12, 240, 12, 0
                .byte 252, 0, 52, 240, 202, 252, 12, 372
                .byte 377, 340, 377, 17, 350, 57, 200, 376
                .byte 2, 276, 340, 203, 377, 57, 76, 370
                .byte 340, 203, 17, 372, 260, 240, 217, 13
                .byte 376, 340, 203, 77, 270, 76, 0, 340
                .byte 3, 0, 376, 360, 340, 217, 17, 376
                .byte 342, 3, 76, 370, 76, 0, 340, 203
                .byte 2, 376, 0, 340, 217, 17, 276, 343
                .byte 3, 76, 370, 276, 52, 340, 253, 3
                .byte 376, 0, 340, 217, 17, 276, 353, 3
                .byte 76, 370, 370, 277, 340, 377, 3, 376
                .byte 0, 340, 217, 17, 276, 357, 3, 76
                .byte 370, 0, 370, 340, 203, 3, 376, 0
                .byte 340, 217, 17, 76, 356, 3, 76, 370
                .byte 0, 370, 340, 3, 0, 376, 250, 340
                .byte 217, 17, 76, 356, 3, 76, 370, 52
                .byte 370, 340, 203, 12, 376, 370, 340, 217
                .byte 17, 76, 370, 203, 76, 370, 276, 372
                .byte 340, 253, 17, 370, 70, 200, 217, 3
                .byte 76, 370, 203, 277, 72, 376, 77, 340
                .byte 377, 17, 340, 17, 0, 376, 0, 76
                .byte 340, 203, 377, 17
; ───────────────────────────────────────────────────────────────────────────
                .word 0                 ; тут должен быть 0, чтобы меню работало
datMenu$:       .word 62030             ; адрес экрана
                .word 10                ; ширина в словах
                .word FONT + <'И - 100>*10. ; текст ИГРА
                .word FONT + <'Г - 100>*10.
                .word FONT + <'Р - 100>*10.
                .word FONT + <'А - 100>*10.
                .word 0
                .word 64414
                .word 24
datText5$:      .word FONT + <'У - 100>*10. ; УПРАВЛЕНИЕ
                .word FONT + <'П - 100>*10.
                .word FONT + <'Р - 100>*10.
                .word FONT + <'А - 100>*10.
                .word FONT + <'В - 100>*10.
                .word FONT + <'Л - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'Н - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word 0
                .word 67014
                .word 24
                .word FONT + <'И - 100>*10. ; ИНФОРМАЦИЯ
                .word FONT + <'Н - 100>*10.
                .word FONT + <'Ф - 100>*10.
                .word FONT + <'О - 100>*10.
                .word FONT + <'Р - 100>*10.
                .word FONT + <'М - 100>*10.
                .word FONT + <'А - 100>*10.
                .word FONT + <'Ц - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Я - 100>*10.
                .word 0
                .word 71426
                .word 12
                .word FONT + <'В - 100>*10. ; ВЫХОД
                .word FONT + <'Ы - 100>*10.
                .word FONT + <'Х - 100>*10.
                .word FONT + <'О - 100>*10.
                .word FONT + <'Д - 100>*10.
                .word 0
                .word 5                 ; сразу за меню звук меню
                .word 1400
                .word 1600
                .word 1000
; Меню - выбор органа управления
                .word 0 ; конец звука и одновременно ограничитель меню сверху
datMenu1$:      .word 55014
                .word 24
                .word FONT + <'К - 100>*10. ; КЛАВИАТУРА
                .word FONT + <'Л - 100>*10.
                .word FONT + <'А - 100>*10.
                .word FONT + <'В - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'А - 100>*10.
                .word FONT + <'Т - 100>*10.
                .word FONT + <'У - 100>*10.
                .word FONT + <'Р - 100>*10.
                .word FONT + <'А - 100>*10.
                .word 0
                .word 57420
                .word 20
                .word FONT + <'Д - 100>*10. ; ДЖОЙСТИК
                .word FONT + <'Ж - 100>*10.
                .word FONT + <'О - 100>*10.
                .word FONT + <'Й - 100>*10.
                .word FONT + <'С - 100>*10.
                .word FONT + <'Т - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'К - 100>*10.
                .word 0
                .word 62026
                .word 12
                .word FONT + <'В - 100>*10. ; ВЫХОД
                .word FONT + <'Ы - 100>*10.
                .word FONT + <'Х - 100>*10.
                .word FONT + <'О - 100>*10.
                .word FONT + <'Д - 100>*10.
                .word 0
                .word 20                ; звук
                .word 200
                .word 200
                .word 200
                .word 1000
; Меню - задание управления
                .word 0 ; конец звука и одновременно ограничитель меню сверху
datMenu2$:      .word 52610
                .word FONT + <'1 - 040>*10. ; 1 ДВИЖЕНИЕ ->
                .word FONT + <'  - 040>*10.
                .word FONT + <'Д - 100>*10.
                .word FONT + <'В - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Ж - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'Н - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'  - 040>*10.
                .word 112170    ; здесь знаки стрелок взяты не из набора псевдографики
                                ; а из спец набора символов которые по ИСУ отображаются
                .word 0
                .word 55210
                .word FONT + <'2 - 040>*10. ; 2 ДВИЖЕНИЕ <-
                .word FONT + <'  - 040>*10.
                .word FONT + <'Д - 100>*10.
                .word FONT + <'В - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Ж - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'Н - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'  - 040>*10.
                .word 112050
                .word 0
                .word 57610
                .word FONT + <'3 - 040>*10. ; 3 ДВИЖЕНИЕ вверх
                .word FONT + <'  - 040>*10.
                .word FONT + <'Д - 100>*10.
                .word FONT + <'В - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Ж - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'Н - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'  - 040>*10.
                .word 112202
                .word 0
                .word 62210
                .word FONT + <'4 - 040>*10. ; 4 ДВИЖЕНИЕ вниз
                .word FONT + <'  - 040>*10.
                .word FONT + <'Д - 100>*10.
                .word FONT + <'В - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Ж - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'Н - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'  - 040>*10.
                .word 112214
                .word 0
                .word 64610
                .word FONT + <'5 - 040>*10. ; 5 ВЫСТРЕЛ
                .word FONT + <'  - 040>*10.
                .word FONT + <'В - 100>*10.
                .word FONT + <'Ы - 100>*10.
                .word FONT + <'С - 100>*10.
                .word FONT + <'Т - 100>*10.
                .word FONT + <'Р - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'Л - 100>*10.
                .word 0
                .word 20                ; звук
                .word 500
                .word 1000
                .word 300
; Меню - выбор способа управления
                .word 0 ; конец звука и одновременно ограничитель меню сверху
datMenu3$:      .word 61406             ; Меню - способ управления
                .word 32
                .word FONT + <'О - 100>*10. ; ОТ КЛАВИАТУРЫ
                .word FONT + <'Т - 100>*10.
                .word FONT + <'  - 040>*10.
                .word FONT + <'К - 100>*10.
                .word FONT + <'Л - 100>*10.
                .word FONT + <'А - 100>*10.
                .word FONT + <'В - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'А - 100>*10.
                .word FONT + <'Т - 100>*10.
                .word FONT + <'У - 100>*10.
                .word FONT + <'Р - 100>*10.
                .word FONT + <'Ы - 100>*10.
                .word 0
                .word 64010
                .word 30
                .word FONT + <'О - 100>*10. ; ОТ ДЖОЙСТИКА
                .word FONT + <'Т - 100>*10.
                .word FONT + <'  - 040>*10.
                .word FONT + <'Д - 100>*10.
                .word FONT + <'Ж - 100>*10.
                .word FONT + <'О - 100>*10.
                .word FONT + <'Й - 100>*10.
                .word FONT + <'С - 100>*10.
                .word FONT + <'Т - 100>*10.
                .word FONT + <'И - 100>*10.
                .word FONT + <'К - 100>*10.
                .word FONT + <'А - 100>*10.
                .word 0
                .word 66410
                .word 30
                .word FONT + <'П - 100>*10. ; ПАРАЛЛЕЛЬНОЕ
                .word FONT + <'А - 100>*10.
                .word FONT + <'Р - 100>*10.
                .word FONT + <'А - 100>*10.
                .word FONT + <'Л - 100>*10.
                .word FONT + <'Л - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word FONT + <'Л - 100>*10.
                .word FONT + <'Ь - 100>*10.
                .word FONT + <'Н - 100>*10.
                .word FONT + <'О - 100>*10.
                .word FONT + <'Е - 100>*10.
                .word 0
                .word 20                ; звук сразу за меню
                .word 1000
                .word 300
                .word 1000
                .word 0
; ───────────────────────────────────────────────────────────────────────────
; формат такой:
; byte nScroll, nIndent, nLen
; ascii "string"
; конец данных - byte x,x,x,0
datInfo$:       .byte 56, 14, 12
                .ascii "ПЕРЕД ВАМИ"
                .byte 6, 20, 8.
                .ascii "СТАВИТСЯ"
                .byte 6, 2, 14.
                .ascii "ИНТЕРЕСНАЯ, НО"
                .byte 6, 2, 15.
                .ascii "ОПАСНАЯ ЗАДАЧА:"
                .byte 16, 10, 12.
                .ascii "ПРОНИКНУТЬ В"
                .byte 6, 2, 17
                .ascii "ЦЕНТР ЗАПРЕТНОЙ"
                .byte 6, 26, 5
                .ascii "ЗОНЫ."
                .byte 26, 0, 20
                .ascii "УПРАВЛЯЕМЫЙ ВАМИ"
                .byte 6, 6, 15
                .ascii "КОРАБЛЬ МОЖЕТ"
                .byte 6, 2, 17
                .ascii "ПЕРЕМЕЩАТЬСЯ ПО"
                .byte 6, 10, 14
                .ascii "ВСЕМУ ЭКРАНУ"
                .byte 6, 12, 13
                .ascii "И СТРЕЛЯТЬ."
                .byte 6, 0, 20
                .ascii "ВИД ОРУЖИЯ МОЖНО"
                .byte 6, 16, 11
                .ascii "ВЫБИРАТЬ."
                .byte 36, 10, 14
                .ascii "ЖЕЛАЮ УДАЧИ."
                .byte 377, 0, 0, 0
                .even
; ───────────────────────────────────────────────────────────────────────────
datText7$:      .byte 40, 10, 14
                .ascii "ВЫ ВЫПОЛНИЛИ"
                .byte 6, 7, 12.
                .ascii "СВОЮ МИССИЮ!"
                .byte 36, 10, 14
                .ascii "УНИЧТОЖЕННАЯ"
                .byte 6, 10, 14
                .ascii "ВАМИ ТЕХНИКА"
                .byte 6, 14, 12
                .ascii "ИЗМЕРЯЕТСЯ"
                .byte 6, 14, 12
                .ascii "СЛЕДУЮЩИМИ"
                .byte 6, 14, 12
                .ascii "ЕДИНИЦАМИ:"
                .byte 136, 0, 0, 0
                .even
; ───────────────────────────────────────────────────────────────────────────
datText8$:      .byte 50, 14, 12
                .ascii "ПРЕДЫДУЩАЯ"
                .byte 6, 6, 15
                .ascii "ИГРА ─ GAME 1"
                .byte 276, 0, 0, 0
                .even
datText81$:     .byte 15, 167
                .asciz "BALLY"
datText81End:   .even
; ───────────────────────────────────────────────────────────────────────────
datText9$:      .byte 50, 16, 11
                .ascii "СЛЕДУЮЩАЯ"
                .byte 6, 6, 15
                .ascii "ИГРА ─ GAME 3"
                .byte 276, 0, 0, 0
                .even
datText91$:     .byte 15, 356
                .asciz "PLANET"
datText91End:   .even
; ───────────────────────────────────────────────────────────────────────────
datText10$:     .byte 26, 24, 6
                .ascii "PLANET"
                .byte 16, 6, 15
                .ascii "ВАША ЗАДАЧА ─"
                .byte 6, 14, 8.
                .ascii "СЕСТЬ НА"
                .byte 6, 14, 8.
                .ascii "ПЛАНЕТУ,"
                .byte 6, 14, 9.
                .ascii "УНИЧТОЖИВ"
                .byte 6, 10, 11.
                .ascii "ПРОТИВНИКА,"
                .byte 6, 14, 12
                .ascii "АТАКУЮЩЕГО"
                .byte 6, 16, 11
                .ascii "С ВОЗДУХА"
                .byte 6, 14, 12
                .ascii "И С ЗЕМЛИ."
                .byte 36, 0, 20
                .ascii "ТОЛЬКО ПРИОБРЕТЯ"
                .byte 6, 6, 12.
                .ascii "ЭТУ ИГРУ, ВЫ"
                .byte 6, 0, 20
                .ascii "МОЖЕТЕ ВЗДОХНУТЬ"
                .byte 6, 16, 9.
                .ascii "СПОКОЙНО!"
                .byte 0, 0, 0, 0
                .even
; ───────────────────────────────────────────────────────────────────────────
datText11$:     .byte 1, 12, 10.
                .ascii "СЛАБОВАТО!"
                .byte 6, 2, 17
                .ascii "БАЗОВАЯ ПЛАНЕТА"
                .byte 6, 14, 12
                .ascii "УНИЧТОЖЕНА"
                .byte 6, 4, 15
                .ascii "НЕ ПОЛНОСТЬЮ."
                .byte 6, 4, 16
                .ascii "ЗАПАСЫ ТОПЛИВА"
                .byte 6, 14, 11
                .ascii "ИСТОЩЕНЫ."
                .byte 6, 10, 14
                .ascii "ПРИДЕТСЯ ВАМ"
                .byte 6, 14, 12
                .ascii "ПРОИЗВЕСТИ"
                .byte 6, 12, 13
                .ascii "ВЫНУЖДЕННУЮ"
                .byte 6, 2, 17
                .ascii "ПОСАДКУ НА ЭТОЙ"
                .byte 6, 16, 11
                .ascii "ПЛАНЕТЕ И"
                .byte 6, 6, 15
                .ascii "УНИЧТОЖИТЬ ЕЕ"
                .byte 6, 12, 12
                .ascii "ПОЛНОСТЬЮ."
                .byte 32, 20, 10
                .ascii "НО ЭТО В"
                .byte 6, 4, 16
                .ascii "СЛЕДУЮЩИЙ РАЗ."
                .byte 1, 0, 0, 0
                .even
; ───────────────────────────────────────────────────────────────────────────
datText12$:     .byte 10, 231
                .ascii "У МЕНЯ"
                .byte 277, 144
                .byte 220, 14, 146
                .byte 244
                .ascii "ВСЕ"
                .even
; ───────────────────────────────────────────────────────────────────────────
; таблица масок битов джойстика
JoyTab:         .word 1
                .word 2
                .word 4
                .word 10
                .word 40
; таблица управляющих клавиш
KeyTab:         .word 31
                .word 10
                .word 32
                .word 33
                .word 40
; ───────────────────────────────────────────────────────────────────────────
; массивы экранных адресов звёзд
T46.Arr0:       .word 55376
                .word 66436
                .word 72216
                .word 56756
                .word 46676
                .word 44674
                .word 42676
                .word 40671
T46.Arr1:       .word 54247
                .word 44267
                .word 44607
                .word 66127
                .word 0
                .word 0
                .word 0
                .word 0
T46.Arr2:       .word 46121
                .word 53111
                .word 60401
                .word 64272
                .word 65762
                .word 71152
                .word 42442
                .word 0
T46.Arr3:       .word 47520
                .word 0
                .word 73460
                .word 42340
                .word 0
                .word 0
                .word 0
                .word 0
T46.ArrSize = <T46.Arr1 - T46.Arr0> / 2

SprRocket:      .word 17,10             ; высота, ширина
                .byte 0, 0, 0, 0, 0, 0, 360, 77
                .byte 0, 0, 0, 0, 300, 17, 334, 15
                .byte 0, 0, 0, 0, 277, 303, 167, 3
                .byte 0, 0, 0, 252, 252, 363, 335, 0
                .byte 0, 360, 377, 377, 377, 177, 67, 0
                .byte 0, 57, 36, 307, 161, 334, 35, 0
                .byte 360, 12, 170, 34, 307, 361, 77, 0
                .byte 274, 52, 70, 115, 323, 254, 352, 0
                .byte 257, 252, 372, 377, 377, 257, 352, 0
                .byte 274, 252, 72, 63, 63, 363, 77, 0
                .byte 300, 277, 256, 372, 377, 257, 3, 0
                .byte 0, 300, 377, 257, 252, 277, 77, 0
                .byte 0, 0, 0, 360, 377, 352, 372, 0
                .byte 0, 0, 0, 0, 0, 377, 257, 17
                .byte 0, 0, 0, 0, 0, 0, 374, 77
; спрайты ракетного выхлопа, 2 шт.
SprFlame1:      .word 6, 2
                .word ^B0000000011110000
                .word ^B0000111101010000
                .word ^B1111100100000000
                .word ^B1111101001000000
                .word ^B0000111110100000
                .word ^B0000000011110000
SprFlame2:      .word 6, 2
                .word ^B1111111100000000
                .word ^B0000111011110000
                .word ^B0000001101000000
                .word ^B0000001101000000
                .word ^B0000111011110000
                .word ^B1111111100000000
; Спрайт пульки
BulletSprite:   .word 3, 1
                .byte ^B11011000
                .byte ^B00111111
                .byte ^B11011000
                .even
; Спрайт оружейного ящика
SpriteAmmoBox:  .word 14, 3
                .byte 124, 125, 25
                .byte 125, 125, 125
                .byte 125, 177, 125
                .byte 325, 367, 125
                .byte 325, 367, 125
                .byte 325, 167, 125
                .byte 365, 177, 137
                .byte 365, 375, 127
                .byte 365, 365, 127
                .byte 325, 177, 137
                .byte 125, 125, 125
                .byte 124, 125, 25
; Спрайт ящика с жизнью
SpriteLiveBox:  .word 13, 3
                .byte 125, 125, 125
                .byte 365, 127, 125
                .byte 365, 127, 125
                .byte 365, 127, 125
                .byte 365, 127, 125
                .byte 365, 127, 135
                .byte 365, 127, 137
                .byte 365, 327, 137
                .byte 365, 377, 137
                .byte 125, 125, 125
                .byte 125, 125, 125
                .even
; Доп.оружие - Плюс
SpriteWeapon0:  .word 7, 2
                .word ^B0000001100000000
                .word ^B0000001100000000
                .word ^B0000001000000000
                .word ^B1111100010111100
                .word ^B0000001000000000
                .word ^B0000001100000000
                .word ^B0000001100000000
; Доп.оружие - Ракета
SpriteWeapon1:  .word 7, 2
                .word ^B1010101000000000
                .word ^B0011111111110000
                .word ^B0000101010101111
                .word ^B0011111111110000
                .word ^B1010101000000000
                .word ^B0000000000000000
                .word ^B0000000000000000
; Доп.оружие - Икс
SpriteWeapon2:  .word 7, 2
                .word ^B1111000000111100
                .word ^B0000110011000000
                .word ^B0000001000000000
                .word ^B0000110011000000
                .word ^B1111000000111100
                .word ^B0000000000000000
                .word ^B0000000000000000
; Доп.оружие - Шар
SpriteWeapon3:  .word 7, 2
                .word ^B0000000011110000
                .word ^B0000001111111100
                .word ^B0000111110101111
                .word ^B0000111010101011
                .word ^B0000111110101111
                .word ^B0000001111111100
                .word ^B0000000011110000
SprWeaponLen = SpriteWeapon1 - SpriteWeapon0

SprMeteorToRt1: .word 12, 5
                .byte 0, 0, 0, 300, 3
                .byte 0, 200, 0, 374, 75
                .byte 0, 0, 0, 234, 47
                .byte 0, 0, 60, 377, 357
                .byte 2, 301, 0, 377, 227
                .byte 0, 0, 1, 377, 227
                .byte 60, 10, 40, 377, 357
                .byte 0, 0, 0, 234, 47
                .byte 0, 300, 0, 374, 75
                .byte 0, 0, 0, 300, 3
SprMeteorToRt2: .word 12, 5
                .byte 0, 0, 0, 74, 0
                .byte 3, 0, 300, 327, 3
                .byte 40, 0, 100, 376, 3
                .byte 0, 3, 160, 377, 17
                .byte 0, 0, 363, 376, 17
                .byte 200, 204, 260, 375, 17
                .byte 14, 0, 360, 365, 15
                .byte 0, 0, 200, 371, 2
                .byte 300, 0, 300, 156, 1
                .byte 2, 0, 0, 74, 0
SprMeteorToRtEnd:
SprMeteorToLt1: .word 12, 5
                .byte 300, 3, 0, 0, 0
                .byte 174, 77, 0, 2, 0
                .byte 330, 66, 0, 0, 0
                .byte 373, 377, 14, 0, 0
                .byte 326, 377, 0, 103, 200
                .byte 326, 377, 100, 0, 0
                .byte 373, 377, 10, 40, 14
                .byte 330, 66, 0, 0, 0
                .byte 174, 77, 0, 3, 0
                .byte 300, 3, 0, 0, 0
SprMeteorToLt2: .word 12, 5
                .byte 0, 74, 0, 0, 0
                .byte 300, 327, 3, 0, 300
                .byte 300, 277, 1, 0, 10
                .byte 360, 377, 15, 300, 0
                .byte 360, 277, 317, 0, 0
                .byte 360, 177, 16, 22, 2
                .byte 160, 137, 7, 0, 60
                .byte 200, 157, 2, 0, 0
                .byte 100, 271, 3, 0, 3
                .byte 0, 74, 0, 0, 200
SprMeteorToLtEnd:
SprMeteorLen = SprMeteorToRt2 - SprMeteorToRt1

SpriteObj1:     .word 7, 3
                .byte 377, 17, 0
                .byte 124, 125, 1
                .byte 374, 377, 77
                .byte 125, 125, 375
                .byte 374, 377, 77
                .byte 124, 125, 1
                .byte 377, 17, 0
                .even

SpriteObj2:     .word 15, 5
                .byte 273, 13, 0, 0, 0
                .byte 354, 356, 2, 0, 0
                .byte 260, 273, 13, 0, 0
                .byte 124, 125, 125, 5, 0
                .byte 127, 125, 125, 125, 1
                .byte 260, 273, 173, 125, 65
                .byte 357, 356, 356, 126, 375
                .byte 260, 273, 173, 125, 65
                .byte 127, 125, 125, 125, 1
                .byte 124, 125, 125, 5, 0
                .byte 260, 273, 13, 0, 0
                .byte 354, 356, 2, 0, 0
                .byte 273, 13, 0, 0, 0
                .even

SpriteObj3:     .word 13, 4
                .byte 0, 374, 77, 0
                .byte 0, 303, 303, 0
                .byte 300, 300, 3, 3
                .byte 360, 300, 3, 17
                .byte 324, 300, 3, 27
                .byte 125, 377, 377, 125
                .byte 125, 125, 125, 125
                .byte 124, 125, 125, 25
                .byte 100, 125, 125, 1
                .byte 0, 137, 365, 0
                .byte 0, 360, 17, 0

SpriteObj4:     .word 11, 4
                .byte 0, 374, 77, 0
                .byte 0, 303, 303, 0
                .byte 320, 303, 303, 7
                .byte 134, 375, 177, 65
                .byte 375, 125, 125, 177
                .byte 324, 377, 377, 27
                .byte 100, 125, 125, 1
                .byte 0, 125, 125, 0
                .byte 0, 360, 17, 0

SpriteObj5:     .word 15, 6
                .byte 374, 77, 0, 0, 0, 0
                .byte 160, 335, 0, 0, 0, 0
                .byte 300, 167, 3, 0, 0, 0
                .byte 0, 337, 15, 0, 0, 0
                .byte 0, 374, 377, 377, 377, 0
                .byte 0, 334, 165, 135, 3, 3
                .byte 0, 167, 327, 165, 15, 74
                .byte 0, 334, 327, 377, 265, 331
                .byte 0, 367, 377, 377, 157, 66
                .byte 0, 14, 273, 273, 377, 17
                .byte 0, 300, 356, 356, 3, 0
                .byte 0, 260, 273, 77, 0, 0
                .byte 0, 377, 377, 0, 0, 0
SpriteObj5.2:   .word 5, 2
                .word ^B0000000010001100
                .word ^B0000001000110100
                .word ^B1101011001110001
                .word ^B0000001000110100
                .word ^B0000000010001100

SpriteObj6:     .word 12, 5
                .byte 0, 300, 377, 3, 0
                .byte 0, 60, 74, 14, 0
                .byte 0, 14, 74, 60, 0
                .byte 100, 75, 377, 174, 1
                .byte 124, 325, 377, 127, 25
                .byte 127, 125, 125, 125, 325
                .byte 127, 125, 125, 125, 325
                .byte 174, 125, 125, 125, 75
                .byte 300, 177, 125, 375, 3
                .byte 0, 300, 377, 3, 0

SpriteObj7:     .word 10, 3
                .byte 0, 252, 0
                .byte 240, 252, 12
                .byte 250, 303, 52
                .byte 372, 0, 257
                .byte 376, 0, 277
                .byte 370, 303, 57
                .byte 240, 377, 12
                .byte 0, 252, 0
SpriteObj7.2:   .word 10, 3
                .byte 0, 252, 0
                .byte 240, 252, 12
                .byte 250, 252, 52
                .byte 252, 252, 252
                .byte 276, 252, 276
                .byte 370, 353, 57
                .byte 240, 377, 12
                .byte 0, 252, 0
SpriteObj7.3:   .word 11, 2
                .word ^B0000001111000000
                .word ^B0011111111111100
                .word ^B0011101010101100
                .word ^B1111101010101111
                .word ^B1110101111101011
                .word ^B1111101010101111
                .word ^B0011101010101100
                .word ^B0011111111111100
                .word ^B0000001111000000

SpriteObj8:     .word 7, 4
                .byte 374, 377, 0, 0
                .byte 127, 125, 77, 0
                .byte 127, 125, 325, 3
                .byte 377, 377, 177, 375
                .byte 127, 125, 325, 3
                .byte 127, 125, 77, 0
                .byte 374, 377, 0, 0
; Этот спрайт масштабируется в 2 раза по ширине и высоте
; сохраняется по адресу Sprite8Buf и используется на последнем этапе №8
                .word 37, 10    ; размеры спрайта, не используются
SpriteObj8.2:   .byte 377, 377, 77, 0, 0, 0, 0, 0
                .byte 213, 374, 317, 17, 0, 0, 0, 0
                .byte 42, 362, 23, 61, 0, 0, 0, 0
                .byte 210, 310, 104, 304, 0, 0, 0, 0
                .byte 42, 342, 21, 21, 3, 0, 0, 0
                .byte 210, 310, 104, 104, 14, 0, 0, 0
                .byte 42, 342, 21, 21, 61, 0, 0, 0
                .byte 210, 310, 104, 104, 304, 0, 0, 0
                .byte 42, 342, 21, 21, 21, 3, 0, 0
                .byte 210, 310, 104, 104, 104, 3, 0, 0
                .byte 42, 342, 21, 21, 21, 15, 0, 0
                .byte 210, 310, 104, 104, 104, 14, 0, 0
                .byte 57, 362, 23, 21, 21, 55, 0, 0
                .byte 277, 374, 117, 104, 364, 253, 2, 0
                .byte 252, 252, 372, 377, 257, 252, 76, 0
                .byte 257, 372, 377, 277, 252, 372, 377, 3
                .byte 377, 377, 252, 252, 252, 377, 314, 17
                .byte 252, 252, 252, 252, 376, 63, 63, 53
                .byte 377, 377, 377, 377, 317, 314, 314, 250
                .byte 63, 63, 63, 63, 63, 63, 263, 252
                .byte 314, 314, 314, 314, 314, 374, 257, 252
                .byte 63, 63, 63, 63, 363, 277, 252, 52
                .byte 377, 377, 377, 377, 377, 252, 252, 12
                .byte 252, 252, 252, 252, 252, 252, 52, 0
                .byte 252, 252, 252, 252, 252, 77, 0, 0
                .byte 253, 352, 377, 377, 377, 3, 0, 0
                .byte 377, 377, 377, 377, 3, 0, 0, 0
                .byte 167, 167, 167, 67, 0, 0, 0, 0
                .byte 335, 335, 335, 17, 0, 0, 0, 0
                .byte 167, 167, 77, 0, 0, 0, 0, 0
                .byte 377, 377, 17, 0, 0, 0, 0, 0
; ───────────────────────────────────────────────────────────────────────────
SpriteFin1:     .word 61, 32
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 252, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 377, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 256, 252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 373, 377, 3
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 252, 0, 0, 0, 0, 0, 350, 276, 273, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 372, 373, 2, 0, 0, 0, 0, 276, 353, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 200, 377, 257, 12, 0, 0, 0, 240, 357, 272, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 340, 377, 277, 57
                .byte 0, 0, 0, 370, 273, 273, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 340, 377, 377, 252, 0, 300, 277, 356, 356, 256
                .byte 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 377, 377, 373, 302, 277, 357, 273, 273, 373, 3, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 376, 377, 377, 257, 272, 373, 372, 356, 356, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 200, 252, 252, 252, 252, 272, 276, 257, 273, 373, 276, 0, 0, 0, 0, 0, 0, 0, 0, 300, 377, 377, 377, 377, 377, 377, 377, 377, 377
                .byte 377, 377, 377, 276, 373, 356, 276, 53, 0, 0, 0, 0, 0, 0, 0, 0, 274, 273, 137, 125, 325, 125, 125, 165, 125, 125, 125, 125, 125, 357, 276, 357
                .byte 356, 376, 0, 0, 0, 0, 0, 0, 0, 360, 253, 273, 372, 125, 125, 127, 377, 377, 377, 377, 377, 377, 377, 277, 257, 252, 252, 256, 3, 0, 0, 0
                .byte 0, 0, 0, 254, 250, 273, 252, 377, 377, 377, 125, 125, 127, 125, 325, 125, 125, 325, 372, 377, 377, 377, 17, 0, 0, 0, 0, 0, 300, 253, 350, 356
                .byte 253, 136, 125, 165, 125, 125, 135, 125, 125, 127, 125, 325, 256, 353, 352, 272, 16, 0, 0, 0, 0, 0, 274, 252, 260, 372, 276, 172, 125, 325, 127, 125
                .byte 165, 125, 125, 127, 125, 325, 273, 256, 253, 353, 72, 0, 0, 0, 0, 300, 253, 252, 257, 252, 357, 352, 125, 125, 135, 125, 165, 125, 125, 135, 125, 125
                .byte 357, 256, 256, 256, 353, 0, 0, 0, 0, 274, 52, 352, 12, 252, 272, 257, 127, 125, 135, 125, 325, 125, 125, 135, 125, 125, 273, 273, 256, 256, 353, 0
                .byte 0, 0, 300, 253, 12, 250, 52, 250, 352, 273, 127, 125, 165, 125, 325, 125, 125, 165, 125, 125, 273, 273, 256, 253, 353, 0, 0, 0, 300, 13, 12, 240
                .byte 252, 12, 252, 356, 136, 125, 165, 377, 377, 125, 125, 165, 125, 125, 357, 256, 256, 353, 372, 0, 0, 0, 274, 16, 50, 250, 252, 12, 242, 272, 136, 375
                .byte 377, 125, 125, 127, 125, 165, 125, 365, 377, 253, 353, 272, 277, 3, 0, 0, 374, 56, 240, 252, 252, 252, 202, 352, 376, 127, 325, 365, 377, 377, 377, 377
                .byte 377, 257, 253, 377, 377, 377, 273, 3, 0, 0, 273, 373, 253, 252, 252, 252, 252, 352, 136, 365, 377, 257, 252, 252, 252, 252, 252, 252, 253, 252, 252, 352
                .byte 273, 3, 0, 0, 377, 256, 376, 377, 377, 377, 252, 352, 376, 257, 252, 252, 252, 252, 252, 252, 252, 252, 377, 377, 377, 377, 377, 0, 0, 0, 273, 273
                .byte 252, 252, 252, 252, 377, 353, 252, 252, 252, 252, 252, 252, 252, 252, 252, 352, 252, 252, 252, 352, 3, 0, 0, 0, 353, 356, 252, 252, 252, 252, 252, 253
                .byte 252, 252, 252, 252, 252, 252, 252, 252, 252, 377, 252, 252, 252, 352, 16, 0, 0, 0, 254, 373, 377, 252, 252, 252, 252, 253, 252, 252, 252, 252, 252, 376
                .byte 377, 377, 377, 377, 377, 257, 252, 352, 372, 0, 0, 0, 260, 373, 252, 377, 257, 252, 372, 252, 252, 252, 252, 376, 377, 377, 377, 377, 377, 377, 377, 377
                .byte 377, 377, 76, 0, 0, 0, 300, 377, 252, 252, 372, 257, 256, 252, 252, 352, 377, 353, 372, 377, 377, 377, 377, 377, 377, 377, 377, 252, 3, 0, 0, 0
                .byte 0, 300, 377, 277, 252, 252, 372, 377, 377, 252, 252, 372, 253, 252, 252, 377, 377, 377, 377, 377, 377, 253, 3, 0, 0, 0, 0, 0, 0, 360, 377, 377
                .byte 252, 252, 252, 376, 377, 257, 376, 377, 377, 377, 377, 377, 377, 377, 377, 357, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377, 377, 377, 253, 252, 252
                .byte 256, 252, 252, 252, 377, 377, 377, 377, 377, 277, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, 377, 377, 377, 253, 252, 252, 252, 377
                .byte 377, 377, 377, 377, 376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, 277, 252, 252, 252, 377, 377, 377, 377, 253, 2
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 377, 377, 252, 352, 377, 377, 377, 357, 17, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377, 253, 376, 377, 377, 277, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 374, 252, 377, 377, 377, 376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 277, 372, 377, 377, 257, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 253, 377
                .byte 377, 277, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 352, 377, 377, 52, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 253, 376, 377, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 352, 377, 377, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 300, 253, 376, 377, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 374, 352, 377, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 357, 352, 72
                .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 377, 77
SpriteFin2:     .word 37, 6
                .byte 0, 100, 125, 125, 1, 0
                .byte 0, 124, 125, 125, 25, 0
                .byte 0, 125, 365, 127, 125, 0
                .byte 100, 325, 377, 137, 125, 1
                .byte 120, 365, 377, 177, 125, 5
                .byte 120, 377, 377, 377, 125, 5
                .byte 124, 377, 377, 377, 125, 25
                .byte 124, 377, 377, 377, 125, 25
                .byte 124, 325, 377, 377, 125, 25
                .byte 125, 125, 365, 377, 127, 125
                .byte 125, 125, 325, 377, 127, 125
                .byte 125, 125, 125, 377, 127, 125
                .byte 325, 137, 325, 377, 125, 125
                .byte 365, 177, 325, 377, 125, 125
                .byte 375, 137, 365, 177, 125, 125
                .byte 375, 127, 375, 137, 125, 125
                .byte 377, 137, 375, 137, 125, 375
                .byte 377, 137, 365, 127, 125, 377
                .byte 377, 137, 365, 125, 325, 377
                .byte 375, 377, 125, 125, 325, 377
                .byte 375, 377, 127, 125, 325, 377
                .byte 365, 377, 127, 125, 325, 377
                .byte 324, 377, 125, 125, 365, 77
                .byte 124, 377, 125, 125, 365, 77
                .byte 124, 375, 125, 125, 375, 77
                .byte 120, 125, 125, 125, 375, 17
                .byte 120, 125, 125, 125, 375, 17
                .byte 100, 125, 325, 127, 325, 3
                .byte 0, 125, 375, 177, 125, 0
                .byte 0, 124, 375, 377, 25, 0
                .byte 0, 100, 377, 377, 3, 0
; ───────────────────────────────────────────────────────────────────────────

CtrlMode:       .word 0                 ; режим управления: 0 - от клавиатуры
                                        ;                   1 - от джойстика
                                        ;                   2 - клавиатура + джойстик
GrowRocketAddr: .word 0                 ; Приращение к адресу ракеты
FireFlag:       .word 0                 ; Стрелять
RocketAddr:     .word 0                 ; Адрес ракеты
AmmoBoxAddr:    .word 0                 ; адрес экрана оружейного ящика
LiveBoxAddr:    .word 0                 ; адрес коробки с жизнями
; расстояние 6 слов - 6 разрядов,
; последний - 0, конец массива для вывода на экран
Distance:       .blkw 6                 ; Пройденный путь
; это слово должно быть сразу за Distance
WeaponHaveFlag: .word 0                 ; Флаги и счётчики наличия доп. оружия.
                                        ; не 0 в разрядах 0-2 - есть оружие 0, иначе нету
                                        ; не 0 в разрядах 3-5 - есть оружие 1, иначе нету
                                        ; не 0 в разрядах 6-8 - есть оружие 2, иначе нету
                                        ; не 0 в разрядах 9-11 - есть оружие 3, иначе нету
; Формат - по три слова на один выстрел
; всего 6 элементов
BulletBufferSize = 6
BulletBufferLenW = BulletBufferSize * 3 ; за раз стреляется 3 пульки
BulletBuffer:   .blkw BulletBufferSize * 3 ; буфер выстреленных пулек, В blkw нельзя выражения которые не вычисляются немедленно, поэтому дублируем
Weapon0Addr:    .word 0                 ; адрес экрана доп.оружия 0
Weapon1Addr:    .word 0                 ; адрес экрана доп.оружия 1
Weapon2Addr:    .word 0                 ; адрес экрана доп.оружия 2
Weapon3Addr:    .word 0                 ; адрес экрана доп.оружия 3
Wpn0WorkCycle:  .word 3
Wpn2Parameter:  .word 700
Wpn3Parameter:  .word 701

AddnWeapons:    .word Weapon0Addr       ; адрес таблицы адресов экранных адресов доп. оружий
                .word Weapon1Addr
                .word Weapon2Addr
                .word Weapon3Addr

; ───────────────────────────────────────────────────────────────────────────
MillionKMCount: .word 0                 ; счётчик пройденных миллионов км
                                        ; через каждый миллион увеличивается сложность
Lives:          .word 0,0               ; Количество жизней
Flag8:          .word 0                 ; Флаг, что уже выключили вывод на экран расстояния

datScore:       .byte 5, 377
Score:          .word 0, 0, 0
; ───────────────────────────────────────────────────────────────────────────

MeteorTblSize = 4   ; размер таблицы метеоритов
; таблица из 4-х элементов:
; .word адрес спрайта
; .word адрес экрана
MeteorRtTbl:    .word 0, 0
                .word 0, 0
                .word 0, 0
                .word 0, 0
; таблица из 4-х элементов:
; .word адрес спрайта
; .word адрес экрана
; .word приращение адреса
MeteorLtTbl:    .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
; ───────────────────────────────────────────────────────────────────────────
RocFragScattrOffsetTbl:
                .word -400              ; массив приращений к адресу разлёта осколков от ракеты, размер 12. слов
                .word -177
                .word -76
                .word 3
                .word 102
                .word 201
                .word 300
                .word 177
                .word 76
                .word -3
                .word -102
                .word -201
; массив адресов,
RocketFragElemNum = 12.
RocketFragTblSizeW = RocketFragElemNum + 1
; первое слово - счётчик (время жизни)
RocketFragTbl:  .word 0                 ; Таблица адресов осколков от ракеты
                .blkw RocketFragElemNum

; ───────────────────────────────────────────────────────────────────────────
ObjFragScattrOffsetTbl:
                .word -400              ; массив приращений к адресу разлёта осколков от объектов, размер 8 слов
                .word -177
                .word 2
                .word 201
                .word 400
                .word 177
                .word -2
                .word -201
; таблица разлетающихся осколков от побитых объектов
; размер элемента - 22, в элементе первое слово - счётчик, затем 10 слов адресов экрана
; получается 4 элемента в таблице
FragObjNum = 8.  ; количество элементов в таблице
FragObjElemNum = 8. ; количество фрагментов
FragObjSize = <FragObjElemNum + 1> * 2 ; размер элемента массива, включая счётчик
FragObjTbl:     .blkw  <FragObjElemNum + 1> * 2 * FragObjNum

; ───────────────────────────────────────────────────────────────────────────
; параметры 5 слов:
; .word адрес экрана
; .word высота в строках*100, для проверки на коллизии
; .word 2 - размер объекта в ширину, для проверки на коллизии
; .word 2 - количество жизней объекта, сколько раз нужно по нему попасть
; .word адрес спрайта
ObjElemSizeW = 5
Object1Param:   .blkw ObjElemSizeW
Object2Param:   .blkw ObjElemSizeW
; ───────────────────────────────────────────────────────────────────────────
; Таблица параметров объектов 3
; их там 4 штуки, по 5 слов на каждого
Obj3ElemNum = 4
Object3ParamTbl:.blkw Obj3ElemNum * ObjElemSizeW
; ───────────────────────────────────────────────────────────────────────────
Obj4ElemNum = 4
Object4ParamTbl:.blkw Obj4ElemNum * ObjElemSizeW
; ───────────────────────────────────────────────────────────────────────────
Object5Param:   .blkw ObjElemSizeW
Object5Param.2: .blkw ObjElemSizeW
Object6Param:   .blkw ObjElemSizeW
; ───────────────────────────────────────────────────────────────────────────
Obj7ElemNum = 4
Obj7ParamTbl:   .blkw Obj7ElemNum * ObjElemSizeW
Object7Param:   .blkw ObjElemSizeW
Object8Param:   .blkw ObjElemSizeW
Obj8SprOffset:  .word 0
; ───────────────────────────────────────────────────────────────────────────
Obj8ElemNum = 4
Object8ParamTbl: .blkw Obj3ElemNum * ObjElemSizeW

; ───────────────────────────────────────────────────────────────────────────

StartGame$:     clr     RocketFragTbl ; Таблица адресов осколков от ракеты
                mov     #FragObjTbl, R1
                mov     #<FragObjSize * FragObjNum>, R0

1$:             clr     (R1)+
                sob     R0, 1$
                mov     #Object3ParamTbl, R1
                mov     #Object4ParamTbl, R3
                mov     #Object8ParamTbl, R2
                mov     #<Obj3ElemNum * ObjElemSizeW>, R0

2$:             clr     (R1)+
                clr     (R3)+
                clr     (R2)+
                sob     R0, 2$

                mov     #BulletBuffer, R1 ; буфер выстреленных пулек
                mov     #BulletBufferLenW, R0

9$:             clr     (R1)+
                sob     R0, 9$

                mov     #20, @#177712
                mov     #34000, @#177706

                mov     #Score, R1
                mov     #3, R0

4$:             mov     #"00 - [20<<8.+20], (R1)+
                sob     R0, 4$
                clrb    Score+5

                mov     (PC)+, @(PC)+   ; Trap 12 заменяется на Nop и обратно
                        trap 12
                        .word MorphTrp$

                clr     R0
                mov     #42000, R1
                mov     #40, R2
                mov     #170, R3
                mov     #167356, R4
                trap    30              ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                clr     R4
                mov     #57014, R1
                mov     #24, R2
                mov     #20, R3
                trap    30              ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                mov     #F$DataBlock, R0
                mov     #60116, (R0)+
                mov     #datText6$, (R0)+ ; ПАУЗА-СБР
                mov     #175000, (R0)+
                mov     #1, (R0)+
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте

5$:             bit     @#177716, #100  ; ждём нажатия чего-нибудь
                beq     6$
                tst     @#177714
                beq     5$

6$:             call    ClrScr

                mov     #FONT + <'0 - 040>*10., R5 ; цифра 0
                mov     #Distance, R1   ; Пройденный путь

                mov     #F$DataBlock, R0 ; готовим параметры для вывода расстояния
                mov     #76724, (R0)+
                mov     R1, (R0)+       ; Пройденный путь
                mov     #110000, (R0)+
                clr     (R0)+

                mov     #6, R2
8$:             mov     R5, (R1)+
                sob     R2, 8$
                clr     (R1)            ; очищаем WeaponHaveFlag, и заодно он тут как терминатор текста

                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                clr     -(R1)           ; 1-Й разряд пройденного пути
                mov     #F$DataBlock, R0
                mov     #76756, (R0)+
                mov     #datStrKM, (R0)+ ; КМ
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                mov     #Lives, -(R0)   ; Количество жизней
                mov     #76774, -(R0)
                mov     #FONT + <'5 - 040>*10., Lives ; цифра 5 - начальное количество жизней
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                clr     Object1Param
                clr     Object2Param
                clr     Object5Param
                clr     Object5Param.2
                clr     Flag8           ; Флаг, что уже выключили вывод на экран расстояния
                mov     #60067, RocketAddr ; Адрес ракеты
                clr     LiveBoxAddr     ; адрес коробки с жизнями
                clr     AmmoBoxAddr     ; адрес экрана оружейного ящика
                clr     MillionKMCount  ; счётчик пройденных миллионов км
                                        ; через каждый миллион увеличивается сложность
                clr     Weapon0Addr     ; адрес экрана доп.оружия 0
                clr     Weapon1Addr     ; адрес экрана доп.оружия 1
                clr     Weapon2Addr     ; адрес экрана доп.оружия 2
                clr     Weapon3Addr     ; адрес экрана доп.оружия 3

GameLoop$:      trap    46              ; Вывод звёзд на экран
                clr     GrowRocketAddr  ; Приращение к адресу ракеты
                clr     FireFlag        ; Стрелять
                mov     CtrlMode, R0    ; режим управления: 0 - от клавиатуры
                                        ;                   1 - от джойстика
                                        ;                   2 - клавиатура + джойстик
                beq     1$
                dec     R0
                bne     2$              ; клавиатура + джойстик
                trap    52              ; Опрос джойстика
                br      3$
; ───────────────────────────────────────────────────────────────────────────
; параллельное управление

2$:             trap    52              ; Опрос джойстика
                tst     GrowRocketAddr  ; Приращение к адресу ракеты
                bne     3$              ; если на джойстике что-то было нажато, клавиатуру игнорируем
                                        ; какая же это параллельность?
1$:             trap    50              ; Опрос клавиатуры

3$:             mov     RocketAddr, R1  ; Адрес ракеты
                mov     R1, R5
                add     GrowRocketAddr, R5 ; Приращение к адресу ракеты
                mov     R5, R4          ; новый адрес ракеты
                bic     #177700, R4     ; смотрим положение по горизонтали
                cmp     #70, R4         ; до правого края доехал?
                bne     4$              ; нет
                dec     R5              ; да

4$:             cmp     #2, R4          ; до левого края доехал?
                bne     5$              ; нет
                inc     R5              ; да

5$:             cmp     #74200, R5      ; до нижнего края доехали?
                bgt     6$              ; нет
                sub     #300, R5        ; да

6$:             cmp     #40100, R5      ; до верхнего края доехали
                ble     7$              ; нет
                add     #300, R5        ; да

7$:             mov     R5, RocketAddr ; фиксируем новый адрес
; Стираем ракету со старого места
RocketFlameOffset = 507
                mov     #SprFlame2, R0
                add     #RocketFlameOffset, R1
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                sub     #RocketFlameOffset, R1
                mov     #SprRocket, R0
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R5, R1
; Рисуем ракету на новом месте
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     #RocketFlameOffset, R1
                mov     #SprFlame2, R0
                com     #0
                beq     8$
                mov     #SprFlame1, R0
8$:             trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                trap    56              ; Обработка выстрела пулек и анимация их полёта
                trap    60              ; Увеличение пройденного расстояния
                cmp     MillionKMCount, #9. ; Дошли до конца?
                bne     10$             ; нет ещё
                jmp     FinalGame
; ───────────────────────────────────────────────────────────────────────────

10$:            mov     #Sound8$, R1    ; Звук полёта ракеты
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                com     #-1
                beq     11$             ; через раз
                mov     #F$DataBlock, R0 ; Выводим на экран пройденное расстояние
                mov     #76724, (R0)+
                mov     #Distance, (R0)+ ; Пройденный путь

MorphTrp$:      ; Trap 12 заменяется на Nop и обратно, чтобы отключить вывод пройденного
                ; расстояния в конце игры
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу F$DataBlock
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
11$:            bit     @#177716, #100  ; клавиша нажата?
                bne     13$             ; нет

12$:            cmp     @#177662, #14   ; да, а какая, СБР?
                bne     13$             ; нет
                tst     @#177714        ; да, а джойстик нажат?
                beq     12$             ; нет - пауза

13$:            trap    62              ; Обработка оружейных ящиков
                                        ; Полёт, проверка на выход за экран, встречу с ракетой,
                                        ; и добавление нового вида оружия
; теперь обработка каждого из 4-х видов доп.оружия
; обработка оружия 0 (Плюс)
                mov     Weapon0Addr, R1 ; адрес оружия 0
                beq     104$            ; 0 - нет на экране
                mov     RocketAddr, R2  ; Адрес ракеты
                add     #564, R2
                mov     Wpn0WorkCycle, R5 ; берём значение
                sub     #500, R5
                bmi     101$            ; меньше 500 - пропускаем
                add     R5, R2          ; иначе прибавляем к адресу значение x - 500

101$:           add     #500, R5
                cmp     #16, R5         ; если значение > 16
                blt     102$            ; переход
                add     #16, R2         ; иначе к адресу + 16
                sub     R5, R2          ; новый адрес экрана

102$:           mov     #SpriteWeapon0, R0 ; стираем со старого места
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R2, R1
                bic     #177700, R2     ; проверим, не вышли ли за границу экрана
                cmp     #66, R2
                blt     103$            ; если вышли, то не рисовать
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана

103$:           mov     R1, Weapon0Addr ; сохраним новый адрес
                dec     Wpn0WorkCycle   ; оружие ещё действует?
                bne     104$            ; да
                clr     Weapon0Addr     ; кончилось

104$:           tst     FireFlag        ; стрельба нажата?
                beq     109$            ; нет - ничего не делаем
                bit     #7, WeaponHaveFlag ; да, а такое оружие ещё осталось?
                beq     109$            ; нету, ничего не делаем
                tst     Weapon0Addr     ; есть, а текущее оружие ещё на экране?
                bne     109$            ; да - ничего не делаем
                                        ; нет - выстреливаем новый экземпляр
                mov     RocketAddr, Weapon0Addr ; новый адрес оружия
                mov     #514, Wpn0WorkCycle ; Инициализируем параметр оружия
                mov     #77000, R1      ; ищем на экране первую найденную слева позицию, где отображается это оружие
                mov     #SpriteWeapon0, R0

105$:           cmp     4(R0), (R1)+
                beq     106$            ; нашли
                tst     (R1)+
                br      105$            ; не найти в принципе не можем
; ───────────────────────────────────────────────────────────────────────────

106$:           mov     R1, R2          ; уменьшим шкалу боеприпасов
                sub     #200, R2

107$:           tst     (R2)
                bne     108$            ; нашли заполненную строчку
                add     #100, R2
                br      107$
; ───────────────────────────────────────────────────────────────────────────

108$:           clr     (R2)            ; очищаем
                cmp     #77470, R2      ; если запасы исчерпались
                bgt     109$
                tst     -(R1)           ; то стираем спрайт
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                dec     WeaponHaveFlag  ; уменьшаем на 1 наличие данного вида оружия.
                                        ; их там может быть 4 одинаковых, поэтому, если кончится одно, будет тратиться другое такое-же

109$:           mov     #5, R0

110$:           trap    60              ; Увеличение пройденного расстояния
                sob     R0, 110$
; обработка оружия 1 (Ракета)
                mov     Weapon1Addr, R1 ; адрес оружия 1
                beq     202$            ; 0 - нет на экране
                mov     #SpriteWeapon1, R0
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, R2
                bic     #177700, R2     ; проверим, вылетело ли за левый край экрана
                bne     201$            ; нет
                clr     Weapon1Addr     ; да, всё нету его больше
                br      202$
; ───────────────────────────────────────────────────────────────────────────

201$:           dec     R1              ; движется влево
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, Weapon1Addr ; сохраняем новый адрес

202$:           tst     FireFlag        ; стрельба нажата?
                beq     207$            ; нет
                bit     #70, WeaponHaveFlag ; да, а такое оружие ещё осталось?
                beq     207$            ; нету, кончилось, ничего не делаем
                tst     Weapon1Addr     ; есть, а текущее оружие ещё на экране?
                bne     207$            ; да - ничего не делаем
                mov     RocketAddr, R1  ; Адрес ракеты
                add     #677, R1
                mov     R1, Weapon1Addr ; иначе - вот новый адрес оружия
                mov     #77000, R1      ; ищем на экране первую найденную слева позицию, где отображается это оружие
                mov     #SpriteWeapon1, R0

203$:           cmp     4(R0), (R1)+
                beq     204$            ; нашли
                tst     (R1)+
                br      203$            ; не найти в принципе не можем
; ───────────────────────────────────────────────────────────────────────────

204$:           mov     R1, R2          ; уменьшим шкалу боеприпасов
                sub     #200, R2

205$:           tst     (R2)
                bne     206$            ; нашли заполненную строчку
                add     #100, R2
                br      205$
; ───────────────────────────────────────────────────────────────────────────

206$:           clr     (R2)            ; очищаем
                cmp     #77470, R2      ; если запасы исчерпались
                bgt     207$
                tst     -(R1)           ; то стираем спрайт
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                sub     #10, WeaponHaveFlag ; уменьшаем на 1 наличие данного вида оружия.
                                        ; их там может быть 4 одинаковых, поэтому, если кончится одно, будет тратиться другое такое-же
207$:
; обработка оружия 2 (Икс)
                mov     Weapon2Addr, R1 ; адрес оружия 2
                beq     305$            ; 0 - нет на экране
                mov     Wpn2Parameter, R2
                bit     #100000, WeaponHaveFlag ; Флаги и счётчики наличия доп. оружия.
                                        ; не 0 в разрядах 0-2 - есть оружие 0, иначе нету
                                        ; не 0 в разрядах 3-5 - есть оружие 1, иначе нету
                                        ; не 0 в разрядах 6-8 - есть оружие 2, иначе нету
                                        ; не 0 в разрядах 9-11 - есть оружие 3, иначе нету
                beq     301$
                inc     R2
                br      302$
; ───────────────────────────────────────────────────────────────────────────

301$:           dec     R2

302$:           mov     R2, Wpn2Parameter
                mov     #SpriteWeapon2, R0
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                bit     #77, R2         ; где-то посреди экрана?
                bne     303$            ; да - переход
                                        ; если достигли левого края экрана
                bic     #100000, WeaponHaveFlag ; меняем флаг направления
                clr     Weapon2Addr     ; всё, улетело нафиг
                br      305$
; ───────────────────────────────────────────────────────────────────────────

303$:           add     RocketAddr, R2 ; Адрес ракеты
                bit     #76, R2
                bne     304$
                bis     #100000, WeaponHaveFlag ; Флаги и счётчики наличия доп. оружия.
                                        ; не 0 в разрядах 0-2 - есть оружие 0, иначе нету
                                        ; не 0 в разрядах 3-5 - есть оружие 1, иначе нету
                                        ; не 0 в разрядах 6-8 - есть оружие 2, иначе нету
                                        ; не 0 в разрядах 9-11 - есть оружие 3, иначе нету

304$:           mov     R2, R1
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, Weapon2Addr ; сохраним новый адрес

305$:           tst     FireFlag        ; стрельба нажата?
                beq     310$            ; нет - ничего не делать
                bit     #700, WeaponHaveFlag ; да, а такое оружие ещё осталось?
                beq     310$            ; нету, кончилось, ничего не делаем
                tst     Weapon2Addr     ; есть, а текущее оружие ещё на экране?
                bne     310$            ; да - ничего не делаем
                mov     RocketAddr, Weapon2Addr ; новый адрес оружия
                mov     #676, Wpn2Parameter
                mov     #77000, R1      ; тут то же, что для предыдущих оружий
                mov     #SpriteWeapon2, R0

306$:           cmp     4(R0), (R1)+
                beq     307$
                tst     (R1)+
                br      306$
; ───────────────────────────────────────────────────────────────────────────

307$:           mov     R1, R2
                sub     #200, R2

308$:           tst     (R2)
                bne     309$
                add     #100, R2
                br      308$
; ───────────────────────────────────────────────────────────────────────────

309$:           clr     (R2)
                cmp     #77470, R2
                bgt     310$
                tst     -(R1)
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                sub     #100, WeaponHaveFlag ; уменьшаем на 1 наличие данного вида оружия.
                                        ; их там может быть 4 одинаковых, поэтому, если кончится одно, будет тратиться другое такое-же
310$:
; обработка оружия 3 (Шар)
                mov     Weapon3Addr, R1 ; адрес оружия 3
                beq     402$            ; 0 - нет на экране
                mov     RocketAddr, R2  ; Адрес ракеты
                bic     #77, R2
                mov     R1, R3
                bic     #177700, R3
                dec     R3
                add     R3, R2
                mov     #SpriteWeapon3, R0
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                nop
                bit     #76, R2
                bne     401$
                clr     Weapon3Addr     ; адрес экрана доп.оружия 3
                br      402$
; ───────────────────────────────────────────────────────────────────────────

401$:           mov     R2, R1
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, Weapon3Addr ; адрес экрана доп.оружия 3

402$:           tst     FireFlag        ; Стрелять
                beq     407$
                bit     #7000, WeaponHaveFlag ; Флаги и счётчики наличия доп. оружия.
                                        ; не 0 в разрядах 0-2 - есть оружие 0, иначе нету
                                        ; не 0 в разрядах 3-5 - есть оружие 1, иначе нету
                                        ; не 0 в разрядах 6-8 - есть оружие 2, иначе нету
                                        ; не 0 в разрядах 9-11 - есть оружие 3, иначе нету
                beq     407$
                tst     Weapon3Addr     ; адрес экрана доп.оружия 3
                bne     407$
                mov     RocketAddr, R0  ; Адрес ракеты
                add     #676, R0
                mov     R0, Weapon3Addr ; адрес экрана доп.оружия 3
                mov     #77000, R1
                mov     #SpriteWeapon3, R0

403$:           cmp     4(R0), (R1)+
                beq     404$
                tst     (R1)+
                br      403$
; ───────────────────────────────────────────────────────────────────────────

404$:           mov     R1, R2
                sub     #200, R2

405$:           tst     (R2)
                bne     406$
                add     #100, R2
                br      405$
; ───────────────────────────────────────────────────────────────────────────

406$:           clr     (R2)
                cmp     #77470, R2
                bgt     407$
                tst     -(R1)
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                sub     #1000, WeaponHaveFlag ; уменьшаем на 1 наличие данного вида оружия.
                                        ; их там может быть 4 одинаковых, поэтому, если кончится одно, будет тратиться другое такое-же
407$:           mov     #8., R5
                sub     MillionKMCount, R5
                bmi     8Df$
                asl     R5
                asl     R5
                add     R5, PC
8Df$:           call    Difficulity8
7Df$:           call    Difficulity7
6Df$:           call    Difficulity6
5Df$:           call    Difficulity5
4Df$:           call    Difficulity4
3Df$:           call    Difficulity3
2Df$:           call    Difficulity2
1Df$:           call    Difficulity1
0Df$:           call    Difficulity0    ; Обработка метеоритов

                mov     #TopStack, SP
                call    LiveBoxProc
                call    RocketFragScattrAnim ; Обработка разлёта осколков от попадания по ракете
                call    ObjectFragScattrAnim ; Обработка разлёта осколков от комет и прочих помех
                jmp     GameLoop$
; ───────────────────────────────────────────────────────────────────────────


; ███████████████ S U B R O U T I N E ███████████████████████████████████████

; Обработка метеоритов

Difficulity0:   tst     (PC)+           ; новый метеорит запускать пора?
NewMeteorRtCnt: .word 3                 ; счётчик появления нового метеорита с левого края экрана
                bne     3$              ; нет ещё
                mov     #MeteorTblSize, R1 ; пора, поищем в таблице пустое место
                mov     #MeteorRtTbl, R5

1$:             tst     (R5)            ; нашли?
                beq     2$              ; да
                bit     (R5)+, (R5)+    ; нет
                sob     R1, 1$          ; ищем дальше
                br      4$              ; нету пустого места
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     #SprMeteorToRt2, (R5)+ ; добавляем новый метеорит
                mov     @#177710, R0    ; и его псевдослучайный адрес
                bic     #77, R0
                add     #40004, R0
                mov     R0, (R5)
                mov     #40, NewMeteorRtCnt ; инициализируем счётчик

3$:             dec     NewMeteorRtCnt  ; уменьшаем счётчик

4$:             mov     #MeteorRtTbl, R4 ; обработаем летящие метеориты
                mov     #MeteorTblSize, R5

5$:             mov     (R4)+, R0       ; адрес спрайта
                mov     (R4)+, R1       ; адрес экрана
                beq     10$             ; 0 - улетел за экран
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     #SprMeteorLen, R0 ; меняем спрайт
                cmp     #SprMeteorToRtEnd, R0 ; досюда дошли?
                bne     6$              ; нет ещё
                mov     #SprMeteorToRt1, R0 ; да - значит первый спрайт
                br      7$              ;  и с места не двигаться
; ───────────────────────────────────────────────────────────────────────────

6$:             inc     R1              ; сдвигаемся вправо

7$:             mov     R1, R2
                bic     #177700, R2     ; проверим на выход за экран
                cmp     #74, R2
                bne     8$              ; ещё не вышли
                clr     -(R4)           ; пометим в таблице как пустое место
                clr     -(R4)
                br      9$

8$:             trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, -(R4)
                mov     R0, -(R4)       ; сохраним новые значения

                tst     (R1)+
                trap    64              ; Проверка на коллизии: попадание оружием в метеориты
                                        ; или попадание в ракету
                                        ; Вход: R1 - адрес метеорита
                                        ;       R4 - адрес в массиве, указывающий на текущий объект
9$:             bit     (R4)+, (R4)+
10$:            sob     R5, 5$

                tst     (PC)+           ; новый метеорит запускать пора?
NewMeteorLtCnt: .word 37                ; счётчик появления нового метеорита с правого края экрана
                bne     15$             ; нет ещё
                mov     #MeteorTblSize, R1 ; пора, поищем в таблице пустое место
                mov     #MeteorLtTbl, R5

11$:            tst     (R5)            ; нашли?
                beq     12$             ; да
                add     #6, R5          ; нет
                sob     R1, 11$         ; ищем дальше
                br      16$             ; не нашли, нету пустого места в таблице
; ───────────────────────────────────────────────────────────────────────────

12$:            mov     #SprMeteorToLt2, (R5)+ ; добавляем новый метеорит
                mov     @#177710, R0   ; и его псевдослучайный адрес
                bic     #177700, R0
                bit     #1, R0
                beq     13$
                add     #40500, R0   ; будет лететь сверху вниз по диагонали
                mov     #177, R1
                br      14$
; ───────────────────────────────────────────────────────────────────────────

13$:            add     #75000, R0   ; будет лететь снизу вверх по диагонали
                mov     #-201, R1
14$:            mov     R0, (R5)+
                mov     R1, (R5)+
                mov     #40, NewMeteorLtCnt ; инициализируем счётчик

15$:            dec     NewMeteorLtCnt  ; уменьшаем счётчик

16$:            mov     #MeteorLtTbl, R4 ; обработаем летящие метеориты
                mov     #MeteorTblSize, R5

17$:            mov     (R4)+, R0       ; адрес спрайта
                mov     (R4)+, R1       ; адрес экрана
                beq     21$             ; если 0 - то вылетел за границы экрана
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     #SprMeteorLen, R0 ; делаем следующий спрайт
                cmp     #SprMeteorToLtEnd, R0 ; досюда дошли?
                bne     18$             ; нет - идём дальше
                mov     #SprMeteorToLt1, R0 ; да - тогда первый спрайт
                br      19$             ; и стоим на месте
; ───────────────────────────────────────────────────────────────────────────

18$:            add     (R4), R1        ; перемещаемся

19$:            mov     R1, R2
                dec     R2              ; до левого края дошли?
                bit     #77, R2
                bne     20$             ; нет ещё
                clr     -(R4)           ; да - удаляем метеорит из таблицы
                clr     -(R4)
                br      22$

20$:            trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, -(R4)       ; сохраняем новые координаты
                mov     R0, -(R4)       ; и спрайт

                tst     (R1)+
                trap    64              ; Проверка на коллизии: попадание оружием в метеориты
                                        ; или попадание в ракету
                                        ; Вход: R1 - адрес метеорита
                                        ;       R4 - адрес в массиве, указывающий на текущий объект
22$:            bit     (R4)+, (R4)+
21$:            tst     (R4)+
                sob     R5, 17$
                return
; End of function Difficulity0


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


Difficulity1:   tst     (PC)+           ; объект выводить пора?
Counter1:       .word 124
                bne     1$              ; нет ещё
                mov     #222, Counter1  ; выводим
                mov     #Object1Param, R5
                mov     @#177710, R0
                bic     #77, R0
                add     #40000, R0
                mov     R0, (R5)+
                mov     #600, (R5)+
                mov     #2, (R5)+
                mov     #2, (R5)+
                mov     #SpriteObj1, (R5)+

1$:             dec     Counter1
                mov     RocketAddr, R5  ; Адрес ракеты
                mov     #Object1Param, R4 ; адрес параметров объекта
                mov     #SpriteObj1, R0 ; спрайт объекта
                mov     (R4), R1        ; адрес объекта
                beq     6$              ; если нету на экране - выход
                ; обработаем
2$:             cmp     R5, R1          ; объект где?
                bpl     3$              ; выше ракеты
                mov     #-76, R3        ; ниже ракеты - будет лететь вперёд-вверх
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     #102, R3        ; выше ракеты - будет лететь вперёд-вниз

4$:             trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     R3, R1          ; получим новую координату
                mov     R1, R3
                tst     (R3)+           ; за экран вылетели?
                bit     #77, R3
                bne     5$              ; нет ещё
                clr     (R4)+           ; да - отметим, что больше не надо рисовать
6$:             return                  ; всё
; ───────────────────────────────────────────────────────────────────────────

5$:             ; нарисуем на новом месте
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)        ; сохраним новую координату
                jmp     Trap66          ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта

; End of function Difficulity1


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


Difficulity2:   tst     (PC)+
Counter2:       .word 143
                bne     1$
                mov     #160, Counter2
                mov     #Object2Param, R5
                mov     @#177710, R0
                bic     #77, R0
                add     #40000, R0
                mov     R0, (R5)+
                mov     #1400, (R5)+
                mov     #4, (R5)+
                mov     #3, (R5)+
                mov     #SpriteObj2, (R5)+

1$:             dec     Counter2
                mov     RocketAddr, R5  ; Адрес ракеты
                mov     #Object2Param, R4 ; адрес параметров объекта
                mov     #SpriteObj2, R0 ; спрайт объекта
                mov     (R4), R1        ; адрес объекта
                beq     6$              ; если нету на экране - выход
                ; обработаем
2$:             cmp     R5, R1          ; объект где?
                blt     3$              ; ниже ракеты
                mov     #302, R3        ; выше ракеты - будет лететь вперёд-вниз
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     #-276, R3       ; ниже ракеты - будет лететь вперёд-вверх

4$:             trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     R3, R1          ; получим новую координату
                mov     R1, R3
                add     #4, R3          ; за экран вылетели?
                bit     #76, R3
                bne     5$              ; нет ещё
                clr     (R4)+           ; да - отметим, что больше не надо рисовать
6$:             return                  ; всё
; ───────────────────────────────────────────────────────────────────────────

5$:             trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)        ; сохраним новую координату
                jmp     Trap66          ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта
; End of function Difficulity2



; ███████████████ S U B R O U T I N E ███████████████████████████████████████


Difficulity3:   tst     (PC)+
Counter3:       .word 1
                bne     4$
                mov     #Obj3ElemNum, R0 ; ищем в таблице свободное место
                mov     #Object3ParamTbl, R5

1$:             tst     (R5)
                beq     2$              ; нашли
                add     #ObjElemSizeW*2, R5
                sob     R0, 1$
                br      5$              ; не нашли
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     @#177710, R0    ; формируем объект
                bic     #177704, R0
                bit     #1, R0
                beq     3$
                add     #35000, R0

3$:             add     #40000, R0
                mov     R0, (R5)+
                mov     #1200, (R5)+
                mov     #3, (R5)+
                mov     #4, (R5)+
                mov     #SpriteObj3, (R5)+
                mov     #174, Counter3

4$:             dec     Counter3

5$:             mov     #Object3ParamTbl, R4 ; обрабатываем
                mov     #Obj3ElemNum, R2 ; все 4 элемента

6$:             mov     RocketAddr, R5  ; Адрес ракеты
                mov     #SpriteObj3, R0
                mov     (R4), R1
                beq     13$

7$:             add     #300, R5
                cmp     R5, R1
                bpl     8$
                mov     #-100, R3
                br      12$
; ───────────────────────────────────────────────────────────────────────────

8$:             add     #600, R1
                cmp     R5, R1
                bmi     10$
                mov     #100, R3
                br      12$
; ───────────────────────────────────────────────────────────────────────────

10$:            bic     #177700, R5
                bic     #177700, R1
                cmp     R5, R1
                bmi     11$
                mov     #1, R3
                br      12$
; ───────────────────────────────────────────────────────────────────────────

11$:            mov     #-1, R3

12$:            mov     (R4), R1
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     R3, R1
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)
                trap    66              ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта
13$:            add     #ObjElemSizeW*2, R4
                sob     R2, 6$
                return
; End of function Difficulity3


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


Difficulity4:   tst     (PC)+
Counter4:       .word 145
                bne     4$
                mov     #Obj4ElemNum, R0
                mov     #Object4ParamTbl, R5

1$:             tst     (R5)
                beq     2$
                add     #ObjElemSizeW*2, R5
                sob     R0, 1$
                br      5$
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     @#177710, R0
                bic     #77, R0
                bit     #100, R0
                beq     3$
                add     #74, R0

3$:             add     #40000, R0
                mov     R0, (R5)+
                mov     #1000, (R5)+
                mov     #3, (R5)+
                mov     #4, (R5)+
                mov     #SpriteObj4, (R5)+
                mov     #210, Counter4

4$:             dec     Counter4

5$:             mov     #Object4ParamTbl, R4
                mov     #Obj4ElemNum, R2

6$:             mov     RocketAddr, R5 ; Адрес ракеты
                mov     #SpriteObj4, R0
                mov     (R4), R1
                beq     14$

7$:             bic     #177700, R5
                bic     #177700, R1
                cmp     R5, R1
                bpl     8$
                mov     #-1, R3
                br      12$
; ───────────────────────────────────────────────────────────────────────────

8$:             cmp     R5, R1
                beq     9$
                mov     #1, R3
                br      12$
; ───────────────────────────────────────────────────────────────────────────

9$:             mov     (R4), R1
                cmp     RocketAddr, R1 ; Адрес ракеты
                bmi     10$
                mov     #100, R3
                br      13$
; ───────────────────────────────────────────────────────────────────────────

10$:            mov     #-100, R3
11$:            br      13$
; ───────────────────────────────────────────────────────────────────────────

12$:            com     #0
                beq     13$
                clr     R3

13$:            mov     (R4), R1
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     R3, R1
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)
                trap    66              ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта
14$:            add     #ObjElemSizeW*2, R4
                sob     R2, 6$
                return
; End of function Difficulity4


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


Difficulity5:   tst     (PC)+
Counter5:       .word 460
                bne     1$
                mov     #Object5Param, R5
                mov     @#177710, R0
                bic     #77, R0
                add     #40000, R0
                mov     R0, (R5)+
                mov     #1400, (R5)+
                mov     #5, (R5)+
                mov     #5, (R5)+
                mov     #SpriteObj5, (R5)+
                mov     #514, Counter5

1$:             dec     Counter5
                mov     #Object5Param.2, R5
                tst     (R5)
                bne     2$
                mov     Object5Param, (R5)+
                mov     #400, (R5)+
                mov     #2, (R5)+
                mov     #1, (R5)+
                mov     #SpriteObj5.2, (R5)+

2$:             mov     #Object5Param, R4
                mov     RocketAddr, R5  ; Адрес ракеты
                mov     (R4), R1
                beq     7$
                mov     #SpriteObj5, R0
                cmp     R5, R1
                bmi     3$
                mov     #201, R3
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     #-177, R3

4$:             com     #0
                beq     5$
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     R3, R1

5$:             mov     R1, R3
                add     #5, R3
                bit     #76, R3
                bne     6$
                clr     (R4)+
                return
; ───────────────────────────────────────────────────────────────────────────

6$:             trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)
                trap    66              ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта

7$:             mov     #Object5Param.2, R4
                mov     #SpriteObj5.2, R0
                mov     (R4), R1
                beq     8$
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                tst     (R1)+
                bit     #76, R1
                bne     9$
                clr     (R4)+

8$:             return
; ───────────────────────────────────────────────────────────────────────────

9$:             dec     R1
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)
                trap    66              ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта
                return
; End of function Difficulity5


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


Difficulity6:   tst     (PC)+
Counter6:       .word 103
                bne     1$
                mov     #Object6Param, R5
                mov     RocketAddr, R0 ; Адрес ракеты
                bic     #77, R0
                add     #300, R0
                mov     R0, (R5)+
                mov     #1100, (R5)+
                mov     #4, (R5)+
                mov     #3, (R5)+
                mov     #SpriteObj6, (R5)+
                mov     #444, Counter6

1$:             dec     Counter6
                mov     #Object6Param, R4
                mov     (R4), R1
                beq     2$

                mov     #SpriteObj6, R0
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     #6, R1
                bit     #76, R1
                bne     3$
                clr     (R4)+
2$:             return
; ───────────────────────────────────────────────────────────────────────────

3$:             sub     #4, R1
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)
                trap    66              ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта
                return
; End of function Difficulity6

; ───────────────────────────────────────────────────────────────────────────

; ███████████████ S U B R O U T I N E ███████████████████████████████████████


Difficulity7:   tst     (PC)+
Counter7:       .word 1237
                bne     2$
                tst     Object7Param
                bne     1$
                mov     #Object7Param, R5
                mov     @#177710, R0
                bic     #77, R0
                add     #40002, R0
                mov     R0, (R5)+
                mov     #700, (R5)+
                mov     #2, (R5)+
                mov     #30, (R5)+
                mov     #SpriteObj7, (R5)+

1$:             mov     #1444, Counter7

2$:             dec     Counter7
                mov     #SpriteObj7, R0
                mov     #Object7Param, R4
                mov     (R4), R1
                beq     8$
                cmp     10(R4), R0
                beq     3$
                mov     #300, R3
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     #-300, R3
4$:             com     #0
                bne     5$
                add     #<SpriteObj7.2 - SpriteObj7>, R0

5$:             cmp     #40300, R1
                bmi     6$
                mov     #SpriteObj7.2, 10(R4)

6$:             cmp     #75000, R1
                bpl     7$
                mov     #SpriteObj7, 10(R4)

7$:             trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     R3, R1
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)
                trap    66              ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта

8$:             tst     Object7Param
                beq     12$
                tst     (PC)+
Counter7.2:     .word 0
                bne     11$
                mov     #Obj7ElemNum, R5
                mov     #Obj7ParamTbl, R4

9$:             tst     (R4)
                beq     10$
                add     #ObjElemSizeW*2, R4
                sob     R5, 9$
                br      12$
; ───────────────────────────────────────────────────────────────────────────

10$:            mov     Object7Param, (R4)+
                mov     #1000, (R4)+
                mov     #1, (R4)+
                mov     #5, (R4)+
                mov     #SpriteObj7.3, (R4)+
                mov     #20, Counter7.2

11$:            dec     Counter7.2

12$:            mov     #Obj7ElemNum, R5
                mov     #Obj7ParamTbl, R4
                mov     #SpriteObj7.3, R0

13$:            mov     (R4), R1
                beq     15$
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     #3, R1
                bit     #76, R1
                bne     14$
                clr     (R4)
                br      15$
; ───────────────────────────────────────────────────────────────────────────

14$:            sub     #2, R1
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)
                trap    66              ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта

15$:            add     #ObjElemSizeW*2, R4
                sob     R5, 13$
                return
; End of function Difficulity7


; ███████████████ S U B R O U T I N E ███████████████████████████████████████


Difficulity8:   tst     Flag8           ; Флаг, что уже выключили вывод на экран расстояния
                bne     1$
                mov     #10, Obj8SprOffset
                ; Прекращение вывода на экран пройденного расстояния
                com     Flag8           ; Флаг, что уже выключили вывод на экран расстояния
                mov     (PC)+, @(PC)+   ; Trap 12 заменяется на Nop и обратно
                        nop
                        .word MorphTrp$

1$:             mov     #Object8Param, R5
                mov     #52000, (R5)+
                mov     #7500, (R5)+
                mov     #12, (R5)+
                mov     #1, (R5)+
                mov     #Sprite8Buf, (R5)+ ; Вот туда распаковывается спрайт в самом начале игры
                cmp     #10, (R5)       ; @#Obj8SprOffset
                beq     4$
                tst     (R5)
                beq     5$
                mov     #52000, R1
                mov     #Sprite8Buf+4, R0
                add     (R5), R0
                add     (R5), R0
                mov     #76, R2

2$:             mov     #10, R4
                sub     (R5), R4

3$:             bic     (R0)+, (R1)+
                sob     R4, 3$
                bis     #77, R1
                inc     R1
                add     (R5), R0
                add     (R5), R0
                sob     R2, 2$

4$:             tst     (R5)
                beq     5$
                dec     (R5)

5$:             mov     #52000, R1
                mov     #Sprite8Buf+4, R0
                add     (R5), R0
                add     (R5), R0
                mov     #76, R2

6$:             mov     #10, R4
                sub     (R5), R4

7$:             bis     (R0)+, (R1)+
                sob     R4, 7$
                bis     #77, R1
                inc     R1
                add     (R5), R0
                add     (R5), R0
                sob     R2, 6$

                mov     #Obj8ElemNum, R5
                mov     #Object8ParamTbl, R4
                tst     (PC)+
Counter8:       .word 1
                bne     3$
                mov     #30, Counter8

1$:             tst     (R4)
                beq     2$
                add     #ObjElemSizeW*2, R4
                sob     R5, 1$
                br      4$
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     #55006, (R4)+
                mov     #600, (R4)+
                mov     #3, (R4)+
                mov     #2, (R4)+
                mov     #SpriteObj8, (R4)+

3$:             dec     Counter8

4$:             mov     #Object8ParamTbl, R4
                mov     #Obj8ElemNum, R5

5$:             mov     (R4), R1
                beq     9$
                cmp     R1, RocketAddr ; Адрес ракеты
                bpl     6$
                mov     #101, R3
                br      7$
; ───────────────────────────────────────────────────────────────────────────

6$:             mov     #-77, R3

7$:             mov     #SpriteObj8, R0
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     R3, R1
                mov     R1, R3
                add     #3, R3
                bit     #76, R3
                bne     8$
                clr     (R4)
                br      9$
; ───────────────────────────────────────────────────────────────────────────

8$:             trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)
                trap    66              ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта
9$:             add     #ObjElemSizeW*2, R4
                sob     R5, 5$
                return
; End of function Difficulity8


TrapTo4.Fin$:   mov     #TopStack, SP
                call    ResetScroll
                br      FinalGame1

FinalGame:      mov     #TrapTo4.Fin$, @#4
                mov     #F$DataBlock, R0
                mov     #77700, (R0)+
                mov     #datText7$, (R0)+
                mov     #220, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу F$DataBlock:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                mov     #datScore, @#F$DataAddr2
                mov     #66014, R1
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#F$DataAddr2 - адрес массива данных
                trap    24              ; Вывод три зелёных полосы и на них копирайт спрайтами
                trap    72              ; Ждать нажатия чего-нибудь
; ───────────────────────────────────────────────────────────────────────────
FinalGame1:     mov     #F$DataBlock, R0
                mov     #77700, (R0)+
                mov     #datText8$, (R0)+
                mov     #220, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу F$DataBlock:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                mov     #datText81$, @#F$DataAddr2
                mov     #60014, R1
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#F$DataAddr2 - адрес массива данных
                call    ResetScroll
                trap    72              ; Ждать нажатия чего-нибудь
; ───────────────────────────────────────────────────────────────────────────
                mov     #F$DataBlock, R0
                mov     #77700, (R0)+
                mov     #datText9$, (R0)+
                mov     #220, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу F$DataBlock:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                mov     #datText91$, @#F$DataAddr2
                mov     #60010, R1
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#F$DataAddr2 - адрес массива данных
                trap    72              ; Ждать нажатия чего-нибудь
; ───────────────────────────────────────────────────────────────────────────
                mov     #F$DataBlock, R0
                mov     #77700, (R0)+
                mov     #datText10$, (R0)+
                mov     #220, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу F$DataBlock:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                trap    24              ; Вывод три зелёных полосы и на них копирайт спрайтами
                trap    72              ; Ждать нажатия чего-нибудь
; ───────────────────────────────────────────────────────────────────────────
TmpAddr = 37776
                mov     #17000, R2
                call    ClrScr2

                mov     #40070, @#TmpAddr
                clr     RocketAddr      ; Адрес ракеты

2$:             mov     @#177710, R1
                add     #40000, R1
                call    WeaponHit       ; Подбили объект, заполним таблицу разлёта осколков, если в ней есть место
                                        ; Вход: R1 - адрес экрана объекта
                call    ObjectFragScattrAnim       ; Обработка разлёта осколков от комет и прочих помех
                call    Difficulity0    ; Обработка метеоритов
                trap    46              ; Вывод звёзд на экран
                clr     RocketAddr      ; Адрес ракеты
                mov     @#TmpAddr, R1
                mov     #20040, Score
                mov     #SprRocket, R0
                mov     #100, R3
                cmp     #65000, @#TmpAddr
                bgt     3$
                dec     R3

3$:             trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     R3, R1
                mov     R1, @#TmpAddr
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                cmp     #74000, @#TmpAddr
                bgt     2$
; ───────────────────────────────────────────────────────────────────────────
NextFinalGame6: mov     #FragObjTbl, R0
                mov     #<FragObjSize * FragObjNum * 2>, R1

1$:             clrb    (R0)+
                sob     R1, 1$
                clr     RocketFragTbl   ; Таблица адресов осколков от ракеты
                call    ClrScr
                mov     #200, R5

3$:             trap    46              ; Вывод звёзд на экран
                mov     #54046, R1
                mov     #SpriteFin1, R0
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     #SpriteFin2, R0
                mov     #56000, R1
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                sob     R5, 3$
                mov     #60046, R2
                mov     #40, R0

4$:             movb    #356, -(R2)
                mov     #Sound10$, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                sob     R0, 4$
; ───────────────────────────────────────────────────────────────────────────
NextFinalGame7: mov     #Sound11$, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                mov     #20, R0
                mov     #60046, R1

1$:             clr     -(R1)
                sob     R0, 1$
                mov     #SpriteFin2, R0
                mov     #60006, R1
                mov     #RocketFragElemNum, R2
                mov     #RocketFragTbl, R3 ; Таблица адресов осколков от ракеты
                mov     #22, (R3)+

2$:             mov     R1, (R3)+
                sob     R2, 2$
                mov     #140, 0Counter$

3$:             dec     (PC)+
0Counter$:     .word 0
                beq     4$
                call    RocketFragScattrAnim ; Обработка разлёта осколков от попадания по ракете
                mov     #60004, R1
                call    WeaponHit       ; Подбили объект, заполним таблицу разлёта осколков, если в ней есть место
                                        ; Вход: R1 - адрес экрана объекта
                call    ObjectFragScattrAnim ; Обработка разлёта осколков от комет и прочих помех
                trap    46              ; Вывод звёзд на экран
                mov     #54046, R1
                mov     #SpriteFin1, R0
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                br      3$
; ───────────────────────────────────────────────────────────────────────────

4$:             mov     #22, 1Counter$

5$:             dec     (PC)+
1Counter$:     .word 0
                beq     6$
                call    ObjectFragScattrAnim ; Обработка разлёта осколков от комет и прочих помех
                trap    46              ; Вывод звёзд на экран
                mov     #54046, R1
                mov     #SpriteFin1, R0
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                br      5$
; ───────────────────────────────────────────────────────────────────────────

6$:             mov     #46, R5
                mov     #54046, R1

7$:             mov     R1, R4
                add     #31, R4
                mov     #57, R3

8$:             clrb    (R4)
                add     #100, R4
                sob     R3, 8$
                mov     #32, R3

9$:             clrb    (R4)
                add     #100, R4
                clrb    (R4)
                sub     #101, R4
                sob     R3, 9$
                sub     #201, R1
                mov     #SpriteFin1, R0
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                trap    46              ; Вывод звёзд на экран
                sob     R5, 7$
                mov     #46, R5

10$:            mov     #61, R4

11$:            mov     #32, R3

12$:            movb    1(R1), (R1)+
                sob     R3, 12$
                add     #46, R1
                sob     R4, 11$
                sub     #6100, R1
                trap    46              ; Вывод звёзд на экран
                sob     R5, 10$
                call    ClrScr
; ───────────────────────────────────────────────────────────────────────────

                mov     #F$DataBlock, R0
                mov     #77700, (R0)+
                mov     #datText11$, (R0)+
                mov     #372, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу F$DataBlock:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                trap    72              ; Ждать нажатия чего-нибудь
; ───────────────────────────────────────────────────────────────────────────

                call    ClrScr
                mov     #datText12$, @#F$DataAddr2
                mov     #44010, R1
                mov     R1, @#F$ScrAddr
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#F$DataAddr2 - адрес массива данных
                trap    72              ; Ждать нажатия чего-нибудь
                call    ClrScr
                mov     #TopStack, SP
                mov     #TrapTo4, @#4
                call    ResetScroll
                jmp     DrawMenu1$

GameBlockEnd:

GameBlockSize = GameBlockEnd - Start0$



; коды 320..377  смещаем в 220..277, чтобы с русскими буквами не смешивались

.SCRIPT "Complex Encode"
        mov #datText12$, R1
1$:     tst (R1)+
2$:     movb (R1)+, R0
        beq  0$
        cmpb R0, #220
        bne  3$
        add  #100, R0
        movb R0, -(R1)
        inc R1
        br   1$
3$:     cmpb R0, #277
        bne  4$
        add  #100, R0
        movb R0, -(R1)
        br   1$

4$:     cmpb R0, #220
        blo  5$
        cmpb R0, #277
        bhi  5$
        add  #100, R0
6$:     movb R0, -(R1)
        inc R1
        br   2$

5$:     tstb R0
        bpl  7$
        sub #40, R0
7$:     sub #20, R0
        br   6$
0$:

.ENDS

.SCRIPT "Text Encode"
    mov #strText3, R1
2$: movb (R1), R0
    beq 1$
    bpl 3$
    sub #40, R0
3$: sub #20, R0
1$: movb R0, (R1)+
    cmp R1, #strText3End
    blo 2$

    mov #strText4, R1
5$: movb (R1), R0
    beq 4$
    bpl 6$
    sub #40, R0
6$: sub #20, R0
4$: movb R0, (R1)+
    cmp R1, #strText4End
    blo 5$

    mov #datText4, R1
    tst (R1)+
8$: movb (R1), R0
    beq 7$
    bpl 9$
    sub #40, R0
9$: sub #20, R0
7$: movb R0, (R1)+
    cmp R1, #strText4
    blo 8$

    mov #datText13$, R1
    tst (R1)+
12$: movb (R1), R0
    beq 11$
    bpl 13$
    sub #40, R0
13$: sub #20, R0
11$: movb R0, (R1)+
    cmp R1, #datText13End
    blo 12$

    mov #datText81$, R1
    tst (R1)+
15$: movb (R1), R0
    beq 14$
    bpl 16$
    sub #40, R0
16$: sub #20, R0
14$: movb R0, (R1)+
    cmp R1, #datText81End
    blo 15$

    mov #datText91$, R1
    tst (R1)+
18$: movb (R1), R0
    beq 17$
    bpl 19$
    sub #40, R0
19$: sub #20, R0
17$: movb R0, (R1)+
    cmp R1, #datText91End
    blo 18$

.ENDS


                .END
