;
; ╔═════════════════════════════════════════════════════════════════════════╗
; ║     This file is generated by The Interactive Disassembler (IDA)        ║
; ║     Copyright (c) 2006 by DataRescue sa/nv, <ida@datarescue.com>        ║
; ║ Licensed to: Nikto                                                      ║
; ╚═════════════════════════════════════════════════════════════════════════╝
;
; Input MD5   : 3343035ED8BE9E777E9A7CBAE3FF2FA5

; ───────────────────────────────────────────────────────────────────────────
; File Name   : SECOND.GMC.raw.uncr-game
; Format      : Binary file
; Base Address: 0000h Range: 0200h - 38E8h Loaded length: 36E8h

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

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

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

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
                add     PC, R5
                add     #<TrapTbl-.>, R5
                call    @(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
                                        ; Вход: @#40 - блок параметров
                .word Trap02            ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу 40:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                .word Trap04            ; Вывод символа на экран
                                        ; Вход: R2 - код символа - 20
                                        ;       R1 - адрес экрана, куда выводить
                                        ;       @#40 - адрес экрана, куда выводить
                                        ;       @#42 - масштаб по высоте
                                        ;       @#44 - маска цвета
                .word Trap06            ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#46 - адрес массива данных
                .word Trap10            ; Рисует рамку заданного цвета
                                        ; Вход:R0 - адрес
                                        ;      @#50, @#52 - байты заполнители цвета
                .word Trap12            ; Вывод текста
                                        ; Вход: блок параметров по адресу 40
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                .word Trap14            ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                .word Trap16            ; Анимация заставки
                                        ; Вход: R4 - адрес текста
                .word Trap20            ; Вывод падающей каплей буквы
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота падения
                                        ;       R3 - код буквы - 20
                .word Trap22            ; Вывод текста буквами тырк-тырк влево-вправо
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - адрес текста
                                        ;       @#44 - маска цвета для 1 бита символа
                                        ;       @#46 - масштаб по высоте
                .word Trap24            ; Вывод три зелёных полосы и на них копирайт спрайтами
                .word Trap26            ; Вывод и обработка меню
                                        ; Вход: R0 - номер начального пункта меню
                                        ;       R1 - номер последнего пункта меню
                                        ;       R4 - адрес параметров меню
                                        ; Выход: R0 - выбранный пункт меню
                .word Trap30            ; Заполнение прямоугольной области экрана заданным цветом
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - ширина в байтах
                                        ;       R3 - высота в строках / 2
                                        ;       R0,R4 - чересстрочные цвета
                .word Trap32            ; Вывод и обработка меню для задания управления
                                        ; Вход: 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
                bne     1$
                jmp     @#NextStart2$
; ───────────────────────────────────────────────────────────────────────────

1$:             emt     14
                mov     #strError, R1
                clr     R2
                br      0Error$
; ───────────────────────────────────────────────────────────────────────────
strError:       .ascii <14><233>"     ОШИБКА МАГНИТОФОНА!"<12><12><12>
                .asciz "  ПРОГРАММА НЕ РАБОТОСПОСОБНА!"<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     #40000, R0
                mov     #1000, R1

1$:             clr     (R0)+
                sob     R1, 1$
                trap    24              ; Вывод три зелёных полосы и на них копирайт спрайтами
                mov     #strStart, R1   ; "    ЗАПУСК   "
                clr     R2
                emt     20              ; вывод строки
                halt                    ; выход в монитор
; End of function Exit$

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

0Error$:        emt     20
                halt
; ───────────────────────────────────────────────────────────────────────────
                .word   0
                .word   0
                .word   0
                .word   0
                .word   0
; ───────────────────────────────────────────────────────────────────────────

TrapTo4.Fin$:   mov     #760, SP
                mov     #1330, @#177664
                jmp     @#NextFinalGame0

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

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

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

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

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

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

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

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

6$:             clr     (R1)
                rorb    R2
                bcc     7$
                mov     @#50, (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
                clr     @#177716

                sob     R3, .
                mov     #100300, @#177716

                sob     R4, .
                sob     R0, 10$
                cmp     @#52, 00.ScaleY$ ; до предела дошли?
                bne     2$
                mov     @#42, R1        ; адрес вывода
                bit     #177400, @#54   ; что выводить
                beq     11$             ; старшего байта нету - выводим только младший
                mov     @#54, R0        ; иначе сперва выведем мл.
                swab    R0              ; потом старший байт
                call    DrawDigit       ; вывод цифры

11$:            mov     @#54, R0
; End of function Trap00


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


DrawDigit:      mov     #FONT + <'0 - 40>*10. + 1, R2
                bic     #177700, R0
                beq     2$

1$:             add     #10., R2
                sob     R0, 1$

2$:             mov     @#56, R3

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

4$:             ror     R4
                bcc     7$
                tst     (R1)
                bne     5$
                mov     @#40, (R1)

5$:             tst     (R1)+
                tst     (R1)
                bne     6$
                mov     @#40, (R1)

6$:             br      8$
; ───────────────────────────────────────────────────────────────────────────

7$:             tst     (R1)+

8$:             tst     (R1)+
                sob     R5, 4$
                add     #40, R1
                sob     R3, 3$
                movb    (R2)+, R4
                bne     2$
                mov     @#42, R1
                add     #40, R1
                return
; End of function DrawDigit


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

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

Trap02:         mov     @#40, R1        ; адрес экрана
                mov     #40, R2         ; очищаем строку экрана

1$:             clr     (R1)+
                sob     R2, 1$
                mov     @#42, R5        ; адрес данных
                mov     @#40, R1        ; адрес экрана
                movb    (R5)+, R4       ; берём очередной байт
                beq     3$              ; если 0, то пропустим
                bic     #177400, R4     ; если не 0, то это число прокрутки экрана

2$:             call    MovAddrDnScrlUp ; Очистка следующей строки экрана и скроллинг
                sob     R4, 2$          ; скроллим экран на заданное кол-во строк

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

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

5$:             bic     #177400, R2     ; это код символа
                mov     #FONT-240+1, R0

6$:             add     #10., R0        ; * 10.
                sob     R2, 6$
                mov     R0, (R1)+       ; адрес данных символа сохраним в буфере
                sob     R3, 4$          ; и так всю строку
                clr     (R1)+           ; конец строки
                mov     R5, @#42        ; указатель на данные сохраним
                mov     @#40, R1        ; адрес экрана
                mov     #10, R5         ; это высота символа

7$:             mov     #300, R0        ; адрес буфера
                add     @#50, R1        ; сместимся к месту вывода строки

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

9$:             mov     #2, R4          ; два бита -> в байт

10$:            rorb    (R1)
                rorb    (R1)
                rorb    (R1)
                rorb    (R1)
                bicb    #360, (R1)
                rorb    R2
                bcc     11$
                bisb    @#44, (R1)       ; маска цвета букв

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

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

13$:            call    ScrlUp          ; Проверка, на границы экрана, чтоб адрес за них не вышел и скролл на 1 строку
                                        ; Вход: R1 - адрес начала следующей строки
                sob     R5, 7$          ; и так все 8 строк символа
                mov     R1, @#40        ; новый адрес сохраним
                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$
                mov     #40000, R1      ; сделаем начало экрана

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

2$:             clr     (R1)+
                sob     R3, 2$
                mov     @#46, R3        ; задержка

                sob     R3, .
                inc     @#177664        ; скролл вверх на 1 строку
                sub     #100, R1        ; вернёмся к началу очищенной строки
                cmp     #37700, R1      ; проверим, если вышли за верх экрана
                bne     3$
                mov     #77700, R1      ; сделаем низ экрана

3$:             return
; End of function ScrlUp


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

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

Trap04:         bic     #177400, R2
                mov     #FONT-240+1, R0 ; 112037

1$:             add     #12, R0
                sob     R2, 1$          ; получим адрес данных символа
                mov     #10, R5

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

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

4$:             rorb    R4              ; берём бит
                bcc     5$              ; если 0, то пропускаем
                movb    @#44, (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 - адрес экрана
;       @#46 - адрес массива данных

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

1$:             movb    (R0)+, R2       ; берём первый байт
                bic     #177400, R2
                mov     R2, @#42        ; это масштаб по высоте
                movb    (R0)+, R2       ; берём второй байт
                bic     #177400, R2
                mov     R2, @#44        ; это маска цвета

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

3$:             bic     #177400, R2
                cmp     #320, R2        ; если 320
                beq     1$              ; то снова надо брать параметры
                cmp     #377, R2        ; если 377
                bne     6$
                movb    (R0)+, R1       ; то берём ещё байт
                bic     #177400, R1
                mov     #6, R4

4$:             clc
                rol     R1
                sob     R4, 4$          ; умножаем на 100
                add     @#40, R1        ; прибавляем адрес экрана
                bis     #77, R1
                inc     R1              ; переводим на следующую строку экрана
                mov     R1, @#40        ; и сохраняем новый адрес экрана

5$:             br      2$              ; и идём за новыми данными
; ───────────────────────────────────────────────────────────────────────────

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

7$:             br      5$              ; и идём за новыми данными
; ───────────────────────────────────────────────────────────────────────────

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

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

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

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

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     @#50, R5
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     @#52, 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 ███████████████████████████████████████

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

Trap12:         mov     @#46, 12.ScaleY$
                mov     @#42, R0        ; данные
                mov     @#40, 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     @#44, (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     #600, R4        ; высота 6 строк?
                sob     R3, 8$
                cmp     R4, R1
                bge     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 - адрес текста

Trap16:         mov     #44000, @#334
                mov     #40, R0
                mov     #40404, (R0)+
                mov     #datText1, (R0)+ ; (C)  BIL corp.
                mov     #175000, (R0)+
                mov     #3, (R0)+
                trap    12              ; Вход: @#40 - заполненный блок параметров
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в ширите)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                mov     R4, R5          ; адрес данных
                add     #40, R5         ; конец данных
                mov     R5, 16.DatEnd$
; тут заезжают в экран с боков буквы "**  SECOND  **"

1$:             mov     (R4)+, R3       ; адрес данных одного символа
                mov     (R4)+, R2       ; адрес данных другого символа
                mov     #8., R1         ; высота символа
                mov     #340, R0        ; буфер

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

3$:             mov     #64036, R0
                mov     #64041, R1
                mov     #25, R2         ; высота

4$:             mov     #37, R3         ; сдвиг побайтно

5$:             movb    (R0)+, (R0)     ; слева направо
                tst     -(R0)
                movb    (R1), -(R1)     ; справа налево
                tst     (R1)+
                sob     R3, 5$
                add     #41, R1
                add     #137, R0
                sob     R2, 4$
                mov     #64000, R0
                mov     #340, 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     #66400, R0
                bge     6$
                call    sub_3462        ; Опускаем вниз копирайт "(C)  BIL corp."
                nop
                sob     R5, 3$
                cmp     (PC)+, R4
16.DatEnd$:     .word 10272
                bne     1$
                br      NextTrap16$
; End of function Trap16

; ───────────────────────────────────────────────────────────────────────────
datText1:       .word FONT + <'( - 40>*10. + 1  ; (C)  BIL corp.
                .word FONT + <'C - 40>*10. + 1
                .word FONT + <') - 40>*10. + 1
                .word FONT + <'  - 40>*10. + 1
                .word FONT + <'  - 40>*10. + 1
                .word FONT + <'B - 40>*10. + 1
                .word FONT + <'I - 40>*10. + 1
                .word FONT + <'L - 40>*10. + 1
                .word FONT + <'  - 40>*10. + 1
                .word FONT + <'c - 40>*10. + 2
                .word FONT + <'o - 40>*10. + 2
                .word FONT + <'r - 40>*10. + 2
                .word FONT + <'p - 40>*10. + 2
                .word FONT + <'. - 40>*10. + 1
                .word 0

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

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

sub_3442:       movb    (R0), R3
                mov     #2, R1

1$:             add     #100, R0
                movb    R3, (R0)
                sob     R1, 1$
                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     @#334, R1

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

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

3$:             clr     -(R1)
                sob     R2, 3$
                add     #3600, R1
                mov     R1, @#334
                sob     R3, 1$
                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

; ───────────────────────────────────────────────────────────────────────────
Sound1$:        .word 10
                .word 400
                .word 200
                .word 660
                .word 400
                .word 0
; ───────────────────────────────────────────────────────────────────────────
; START OF FUNCTION CHUNK FOR Trap16

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

1$:             mov     #1600, R0

2$:             mov     100(R4), (R4)+
                mov     -400(R5), (R5)
                tst     -(R5)
                sob     R0, 2$
                mov     #200, R0
                add     #300, R4

3$:             clrb    (R4)+
                clr     -(R5)
                sob     R0, 3$
                mov     #24, R2
                sub     R1, R2
                mov     #400, R3
                call    @#102062
                sub     #4200, R4
                add     #4400, R5
                sob     R1, 1$
                mov     #40, 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     #220, @#177716

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

                sob     R2, .
                inc     R0
                sob     R1, 4$
                return
; END OF FUNCTION CHUNK FOR Trap16
; ───────────────────────────────────────────────────────────────────────────
                .word    0
datText3:       .word FONT + <'П - 100>*10. + 1 ; ПРЕДСТАВЛЯЕТ
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Д - 100>*10. + 1
                .word FONT + <'С - 100>*10. + 1
                .word FONT + <'Т - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'Л - 100>*10. + 1
                .word FONT + <'Я - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Т - 100>*10. + 1
                .word 0
                .word 0
                .byte   0
; Спрайт капля, ширина 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

; ███████████████ 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, @#40
                inc     R1
                mov     #12, R5         ; стирается

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

3$:             add     #10., R0
                sob     R3, 3$

4$:             mov     #50, R5         ; по этому адресу формируется массив из одного элемента
                mov     R5, @#42
                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 - адрес текста
;       @#44 - маска цвета для 1 бита символа
;       @#46 - масштаб по высоте

Trap22:         mov     #334, @#42      ; это адрес массива для trap 12
                mov     #336, R0        ; тут формируем буфер
                clr     (R0)+           ; сперва 0

1$:             mov     #FONT-240+1, R5
                movb    (R2)+, R4       ;  потом адреса букв
                beq     3$        ; пока строка не кончится
                bic     #177400, R4

2$:             add     #10., R5
                sob     R4, 2$
                mov     R5, (R0)+
                br      1$
; ───────────────────────────────────────────────────────────────────────────

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

T22.Repeat$:    mov     (R5), @#334
                mov     R1, @#40
                trap    12              ; Вход: @#40 - заполненный блок параметров
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                tst     -(R5)
                beq     4NextT22$
                sub     #4, R1
                mov     #T22.Repeat$, -(SP)
; End of function Trap22


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


sub_4276:       mov     #17000, R3

                sob     R3, .
                mov     @#40, R4
                mov     @#46, 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

; ───────────────────────────────────────────────────────────────────────────
; START OF FUNCTION CHUNK FOR Trap22

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

5$:             mov     (R5)+, @#334
                add     #4, R1
                mov     R1, @#40
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу 40
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                tst     (R5)
                beq     6$
                call    @#sub_4276
                br      5$
; ───────────────────────────────────────────────────────────────────────────

6$:             clr     -(R5)
                tst     -(R5)
                beq     3$
                sub     #4, R1
                mov     R1, R3
                mov     #Sound2$, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                mov     R3, R1
                br      T22.Repeat$
; END OF FUNCTION CHUNK FOR Trap22
; ───────────────────────────────────────────────────────────────────────────
Sound2$:        .word 14
                .word 100
                .word 200
                .word 300
                .word 400
                .word 300
                .word 200
                .word 0
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
                .byte 0

; ███████████████ 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 - выбранный пункт меню

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

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

2$:             tst     (R5)+           ; пропустим текст, переходим к следующему пункту
                bne     2$
                sob     R3, 1$          ; и так выведем все пункты меню
                mov     R1, @#300       ; сохраним номер последнего пункта меню
                mov     R5, R1          ; сразу за меню - звук
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
; выбираем нужный пункт

LoopT26$:       mov     (R4)+, @#40     ; адрес экрана
                mov     (R4)+, @#50     ; ширина в словах
                mov     #KeybProc, -(SP) ; куда потом

SelectMenu:     mov     @#40, R3        ; адрес экрана
                sub     #300, R3        ; на 3 строки вверх
                mov     @#50, R5        ; ширина в словах

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

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


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


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

1$:             tst     (R4)+
                bne     1$

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

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

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

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

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

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

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

Trap30:         mov     R3, 30.Height$

1$:             mov     R1, R5
                mov     (PC)+, R3
30.Height$:     .word 20

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


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

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

Trap32:         mov     #175000, @#44
                mov     #1, @#46
                mov     R4, R5

1$:             mov     (R5)+, @#40
                mov     R5, @#42
                trap    12              ; Вход: блок параметров по адресу 40
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте

2$:             tst     (R5)+
                bne     2$
                sob     R1, 1$
                mov     R5, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)

T32Loop$:       mov     (R4)+, R5
                sub     #300, R5
                mov     #CtrlProc$, -(SP)
; 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 ███████████████████████████████████████


CtrlProc$:      mov     (R2), R1        ; читаем регистр данных

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

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


; ███████████████ 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
                mov     R3, 34.Width$

1$:             mov     (PC)+, R3
34.Width$:     .word 2

2$:             movb    (R0)+, (R1)+
                sob     R3, 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
                mov     R3, 36.Width$

1$:             mov     (PC)+, R3
36.Width$:     .word 5

2$:             bisb    (R0)+, (R1)+
                sob     R3, 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
                mov     R3, 40.Width$

1$:             mov     (PC)+, R3
40.Width$:     .word 5

2$:             bicb    (R0)+, (R1)+
                sob     R3, 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
                mov     R3, 42.Width$

1$:             mov     (PC)+, R3
42.Width$:     .word 1

2$:             clrb    (R1)+
                sob     R3, 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)
                bne     2$

1$:             clr     (R0)
                br      4$
; ───────────────────────────────────────────────────────────────────────────

2$:             cmp     #40000, (R0)
                bgt     1$
                cmp     #76000, (R0)
                ble     1$

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     #10, 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     #10, R1
                mov     #101, R2
                trap    44

                tst     (PC)+
46.Counter2$:   .word 1
                bne     15$
                mov     #10, @#46.Counter2$
                mov     #T46.Arr1, R0
                mov     #10, 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     #10, R1
                mov     #-77, R2
                trap    44

                tst     (PC)+
46.Counter3$:   .word 7
                bne     23$
                mov     #10, @#46.Counter3$
                mov     #T46.Arr2, R0
                mov     #10, 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     #10, R1
                mov     #1, R2
                trap    44

                tst     (PC)+
46.Counter4$:   .word 0
                bne     33$
                mov     #10, @#46.Counter4$
                mov     #T46.Arr3, R0
                mov     #10, 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     #10, R1
                mov     #2, R2
                trap    44
                return
; End of function Trap46


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

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

Trap50:         cmp     #100250, @#177716 ; клавиша нажата?
                bmi     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     #6, R1          ; размер - 6 элементов

1$:             tst     (R0)+           ; пусто?
                beq     3$              ; да - проверим дальше

2$:             add     #4, R0          ; нет - переходим к следующему элементу
                sob     R1, 1$          ; проверим весь массив
                br      8$              ; ничего не нашли - выстрел игнорируем
; ───────────────────────────────────────────────────────────────────────────

3$:             tst     (R0)+           ; второе слово тоже пустое?
                beq     5$              ; да - проверяем дальше

4$:             tst     -(R0)           ; нет - пропустим этот элемент
                br      2$
; ───────────────────────────────────────────────────────────────────────────

5$:             tst     (R0)+           ; третье слово пусто?
                beq     6$              ; да - нашли пустой элемент
                tst     -(R0)           ; нет - пропускаем
                br      4$
; ───────────────────────────────────────────────────────────────────────────

6$:             call    @#ShootSound    ; Звук выстрела
                mov     #6, @#ShootDelay ; Ставим задержку
                mov     @#RocketAddr, R5 ; Адрес ракеты
                add     #475, R5        ; задаём начальные адреса пулек
                mov     R5, (R0)+       ; их три штуки
                add     #302, R5
                mov     R5, (R0)+
                add     #276, R5
                mov     R5, (R0)+

7$:             dec     @#ShootDelay    ; задержка между выстрелами

8$:             mov     #BulletSprite, R0 ; Спрайт пульки
; анимация летящих пулек
                mov     #6, 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

; ───────────────────────────────────────────────────────────────────────────
datText6$:      .word FONT + <'П - 100>*10. + 1 ; ПАУЗА-СБР
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'У - 100>*10. + 1
                .word FONT + <'З - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'- - 40>*10. + 1
                .word FONT + <'С - 100>*10. + 1
                .word FONT + <'Б - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word 0
; ───────────────────────────────────────────────────────────────────────────

NextStart3$:    mov     #4, R1
                mov     #34000, @#177706
                mov     R1, @#177712
                emt     314             ; Выполняет п/п по адресу 10004, там все инициализации

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
                bne     7$
                jmp     @#SetControls$
; ───────────────────────────────────────────────────────────────────────────

7$:             dec     R0
                beq     ShowInfo$
                dec     R0
                bne     8$
                call    @#Exit$

8$:             jmp     @#StartGame$
; ───────────────────────────────────────────────────────────────────────────

ShowInfo$:      mov     #40, R0
                mov     #77700, (R0)+
                mov     #datInfo$, (R0)+
                mov     #175372, (R0)+
                mov     #10000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу 40:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                mov     #1330, @#177664
                jmp     @#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 - чересстрочные цвета
                br      ExitMenu1$
; ───────────────────────────────────────────────────────────────────────────

SetKeyboard$:   mov     #NextSetKeybrd$, -(SP)

; ███████████████ 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

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

NextSetKeybrd$: mov     #KeyTab, R0     ; таблица управляющих клавиш
                mov     #177660, R3     ; регистр управления
                mov     R3, R2
                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              ; Вывод и обработка меню для задания управления
                                        ; Вход: R2 - регистр данных
                                        ;       R3 - регистр управления
                                        ;       R4 - адрес блока параметров меню
                br      SetControls$
; ───────────────────────────────────────────────────────────────────────────

ExitMenu1$:     clr     R0
                clr     R4
                mov     #47412, R1
                mov     #26, R2
                mov     #20, 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     #40, R5
                mov     #50114, (R5)+
                jmp     @#NextExitMenu1$
; ───────────────────────────────────────────────────────────────────────────
                .word 0                 ; перед меню обязательно должен быть 0
datMenu3$:      .word 61406             ; Меню - способ управления
                .word 32
                .word FONT + <'О - 100>*10. + 1 ; ОТ КЛАВИАТУРЫ
                .word FONT + <'Т - 100>*10. + 1
                .word FONT + <'  - 040>*10. + 1
                .word FONT + <'К - 100>*10. + 1
                .word FONT + <'Л - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'Т - 100>*10. + 1
                .word FONT + <'У - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'Ы - 100>*10. + 1
                .word 0
                .word 64010
                .word 30
                .word FONT + <'О - 100>*10. + 1 ; ОТ ДЖОЙСТИКА
                .word FONT + <'Т - 100>*10. + 1
                .word FONT + <'  - 040>*10. + 1
                .word FONT + <'Д - 100>*10. + 1
                .word FONT + <'Ж - 100>*10. + 1
                .word FONT + <'О - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'С - 100>*10. + 1
                .word FONT + <'Т - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'К - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word 0
                .word 66410
                .word 30
                .word FONT + <'П - 100>*10. + 1 ; ПАРАЛЛЕЛЬНОЕ
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'Л - 100>*10. + 1
                .word FONT + <'Л - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Л - 100>*10. + 1
                .word FONT + <'Ь - 100>*10. + 1
                .word FONT + <'Н - 100>*10. + 1
                .word FONT + <'О - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word 0
                .word 20                ; звук сразу за меню
                .word 1000
                .word 300
                .word 1000
                .word 0

CtrlMode:       .word 2                 ; режим управления: 0 - от клавиатуры
                                        ;                   1 - от джойстика
                                        ;                   2 - клавиатура + джойстик
datText5$:      .word FONT + <'У - 100>*10. + 1 ; УПРАВЛЕНИЕ
                .word FONT + <'П - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'Л - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Н - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word 0
; таблица масок битов джойстика
JoyTab:         .word 1
                .word 2
                .word 4
                .word 10
                .word 40
; таблица управляющих клавиш
KeyTab:         .word 31
                .word 10
                .word 32
                .word 33
                .word 40

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

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

                mov     #40000, (SP)
                jmp     @#100140
; ───────────────────────────────────────────────────────────────────────────

SkipSplash$:    nop
                mov     #1330, @#177664
                mov     #VecKbdNo$, @#60
                mov     #VecKbdNo$, @#274
                jmp     @#DrawMenu$
; ───────────────────────────────────────────────────────────────────────────
                .byte  301 ; а 113701 XKI
                .byte  227 ; ў
; ───────────────────────────────────────────────────────────────────────────

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

TrapTo4:        mov     #760, SP
                mov     #1330, @#177664
                mov     #TrapTo4, @#4
                mov     #DisTrap, @#34
                mov     #SkipSplash$, @#60
                mov     #SkipSplash$, @#274
                mtps    #0
                mov     @#177662, R0
                mov     #StartSplash$, -(SP)

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

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

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

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

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

; ───────────────────────────────────────────────────────────────────────────
datText2:       .word FONT + <'C - 40>*10. + 1
                .word FONT + <'O - 40>*10. + 1
                .word FONT + <'E - 40>*10. + 1
                .word FONT + <'N - 40>*10. + 1
                .word FONT + <'S - 40>*10. + 1
                .word FONT + <'D - 40>*10. + 1
                .word FONT + <'  - 40>*10. + 1
                .word FONT + <'  - 40>*10. + 1
                .word FONT + <'  - 40>*10. + 1
                .word FONT + <'  - 40>*10. + 1
                .word FONT + <'* - 40>*10. + 1
                .word FONT + <'* - 40>*10. + 1
                .word FONT + <'* - 40>*10. + 1
                .word FONT + <'* - 40>*10. + 1
                .word FONT + <'  - 40>*10. + 1
                .word FONT + <'  - 40>*10. + 1
datText2End:    .word 0
strText3:       .asciz "БОРТНИК  БОРИС"
strText3End:    .even
datText4:       .byte 2,356
                .asciz "г.МОСКВА"
strText4:       .asciz "26.01.1991"
strText4End:    .even
; ───────────────────────────────────────────────────────────────────────────

StartSplash$:   mov     #datText2, R4
                trap    16              ; Анимация заставки
                                        ; Вход: R4 - адрес текста
                mov     #strText3, R4   ; БОРТНИК  БОРИС
                mov     #40005, R1
                mov     #56, R2
                mov     #173000, @#44
                mov     #2, @#46
                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
                nop
                mov     #datText4, @#46 ; г.МОСКВА
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#46 - адрес массива данных
                mov     #40515, R1
                mov     #strText4, R2   ; 26.01.1991
                mov     #172000, @#44
                mov     #2, @#46

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

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

3$:             mov     #1400, R2

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

5$:             clr     (R1)+
                sob     R5, 5$
                trap    24              ; Вывод три зелёных полосы и на них копирайт спрайтами
                mov     #40, R0
                mov     #167356, (R0)+
                mov     #43022, (R0)+
                mov     #42000, (R0)+
                mov     #datText5, (R0)+
                mov     #146314, (R0)+
                mov     #12, (R0)+
                mov     #2, (R0)+
                mov     #40, (R0)+
                mov     #62000, @#64
                trap    0               ; Вывод слова GAME и цифры 2
                                        ; Вход: @#40 - блок параметров
                mov     #1400, R2
                mov     R2, R3
                mov     #SkipSplash$, -(SP)
                jmp     @#102062
; ───────────────────────────────────────────────────────────────────────────
datText5:       .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
; вроде бы спрайт слова 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. + 1 ; текст ИГРА
                .word FONT + <'Г - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word 0
                .word 64414
                .word 24
                .word FONT + <'У - 100>*10. + 1 ; УПРАВЛЕНИЕ
                .word FONT + <'П - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'Л - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Н - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word 0
                .word 67014
                .word 24
                .word FONT + <'И - 100>*10. + 1 ; ИНФОРМАЦИЯ
                .word FONT + <'Н - 100>*10. + 1
                .word FONT + <'Ф - 100>*10. + 1
                .word FONT + <'О - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'М - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'Ц - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Я - 100>*10. + 1
                .word 0
                .word 71426
                .word 12
                .word FONT + <'В - 100>*10. + 1 ; ВЫХОД
                .word FONT + <'Ы - 100>*10. + 1
                .word FONT + <'Х - 100>*10. + 1
                .word FONT + <'О - 100>*10. + 1
                .word FONT + <'Д - 100>*10. + 1
                .word 0
Sound5$:        .word 5                 ; сразу за меню звук меню
                .word 1400
                .word 1600
                .word 1000
                .word 0
Sound3$:        .word 14                ; звук выделения текущего пункта меню
                .word 300
                .word 600
                .word 400
                .word 0
; формат такой:
; byte nScroll, nIndent, nLen
; ascii "string"
; конец данных - byte x,x,x,0
datInfo$:       .byte 60, 14, 12
                .ascii "ПЕРЕД ВАМИ"
                .byte 10, 20, 10
                .ascii "СТАВИТСЯ"
                .byte 10, 2, 17
                .ascii "ИНТЕРЕСНАЯ , НО"
                .byte 10, 2, 17
                .ascii "ОПАСНАЯ ЗАДАЧА:"
                .byte 20, 10, 14
                .ascii "ПРОНИКНУТЬ В"
                .byte 10, 2, 17
                .ascii "ЦЕНТР ЗАПРЕТНОЙ"
                .byte 10, 26, 5
                .ascii "ЗОНЫ."
                .byte 30, 0, 20
                .ascii "УПРАВЛЯЕМЫИ ВАМИ"
                .byte 10, 6, 15
                .ascii "КОРАБЛЬ МОЖЕТ"
                .byte 10, 2, 17
                .ascii "ПЕРЕМЕЩАТЬСЯ ПО"
                .byte 10, 10, 14
                .ascii "ВСЕМУ ЭКРАНУ"
                .byte 10, 12, 13
                .ascii "И СТРЕЛЯТЬ."
                .byte 10, 0, 20
                .ascii "ВИД ОРУЖИЯ МОЖНО"
                .byte 10, 16, 11
                .ascii "ВЫБИРАТЬ."
                .byte 40, 10, 14
                .ascii "ЖЕЛАЮ УДАЧИ."
                .byte 377, 0, 0, 0
                .even

; Меню - выбор органа управления
                .word 0
                .word 0
datMenu1$:      .word 55014
                .word 24
                .word FONT + <'К - 100>*10. + 1 ; КЛАВИАТУРА
                .word FONT + <'Л - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word FONT + <'Т - 100>*10. + 1
                .word FONT + <'У - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word 0
                .word 57420
                .word 20
                .word FONT + <'Д - 100>*10. + 1 ; ДЖОЙСТИК
                .word FONT + <'Ж - 100>*10. + 1
                .word FONT + <'О - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'С - 100>*10. + 1
                .word FONT + <'Т - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'К - 100>*10. + 1
                .word 0
                .word 62026
                .word 12
                .word FONT + <'В - 100>*10. + 1 ; ВЫХОД
                .word FONT + <'Ы - 100>*10. + 1
                .word FONT + <'Х - 100>*10. + 1
                .word FONT + <'О - 100>*10. + 1
                .word FONT + <'Д - 100>*10. + 1
                .word 0
                .word 20                ; звук
                .word 200
                .word 200
                .word 200
                .word 1000
                .word 0
datMenu2$:      .word 52610
                .word FONT + <'1 - 040>*10. + 1 ; 1 ДВИЖЕНИЕ ->
                .word FONT + <'  - 040>*10. + 1
                .word FONT + <'Д - 100>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Ж - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Н - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'  - 040>*10. + 1
                .word 112171    ; здесь знаки стрелок взяты не из набора псевдографики
                                ; а из спец набора символов которые по ИСУ отображаются
                .word 0
                .word 55210
                .word FONT + <'2 - 040>*10. + 1 ; 2 ДВИЖЕНИЕ <-
                .word FONT + <'  - 040>*10. + 1
                .word FONT + <'Д - 100>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Ж - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Н - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'  - 040>*10. + 1
                .word 112051
                .word 0
                .word 57610
                .word FONT + <'3 - 040>*10. + 1 ; 3 ДВИЖЕНИЕ вверх
                .word FONT + <'  - 040>*10. + 1
                .word FONT + <'Д - 100>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Ж - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Н - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'  - 040>*10. + 1
                .word 112203
                .word 0
                .word 62210
                .word FONT + <'4 - 040>*10. + 1 ; 4 ДВИЖЕНИЕ вниз
                .word FONT + <'  - 040>*10. + 1
                .word FONT + <'Д - 100>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Ж - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Н - 100>*10. + 1
                .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'  - 040>*10. + 1
                .word 112215
                .word 0
                .word 64610
                .word FONT + <'5 - 040>*10. + 1 ; 5 ВЫСТРЕЛ
                .word FONT + <'  - 040>*10. + 1
                .word FONT + <'В - 100>*10. + 1
                .word FONT + <'Ы - 100>*10. + 1
                .word FONT + <'С - 100>*10. + 1
                .word FONT + <'Т - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'Е - 100>*10. + 1
                .word FONT + <'Л - 100>*10. + 1
                .word 0
                .word 20                ; звук
                .word 500
                .word 1000
                .word 300
                .word 0
; ───────────────────────────────────────────────────────────────────────────

NextExitMenu1$: mov     #datText5$, (R5)+ ; УПРАВЛЕНИЕ
                mov     #124000, (R5)+
                mov     #2, (R5)+
                trap    12              ; Вход: блок параметров по адресу 40
                                        ; .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$
; ───────────────────────────────────────────────────────────────────────────
                .word    0
                .word    0
; массивы экранных адресов звёзд
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
SprRocket:      .word 17                ; высота
                .word 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
                .word 2
                .word ^B0000000011110000
                .word ^B0000111101010000
                .word ^B1111100100000000
                .word ^B1111101001000000
                .word ^B0000111110100000
                .word ^B0000000011110000
SprFlame2:      .word 6
                .word 2
                .word ^B1111111100000000
                .word ^B0000111011110000
                .word ^B0000001101000000
                .word ^B0000001101000000
                .word ^B0000111011110000
                .word ^B1111111100000000
GrowRocketAddr: .word 0                 ; Приращение к адресу ракеты
FireFlag$:      .word 0                 ; Стрелять
RocketAddr:     .word 60067             ; Адрес ракеты
AmmoBoxAddr:    .word 0                 ; адрес экрана оружейного ящика
; расстояние 6 слов - 6 разрядов,
; последний - 0, конец массива для вывода на экран
Distance:       .word 112537            ; Пройденный путь
                .word 112551            ; 5-Й разряд пройденного пути
                .word 112575
                .word 112607
                .word 112621
                .word 0                 ; 1-Й разряд пройденного пути
WeaponHaveFlag: .word 0                 ; Флаги и счётчики наличия доп. оружия.
                                        ; не 0 в разрядах 0-2 - есть оружие 0, иначе нету
                                        ; не 0 в разрядах 3-5 - есть оружие 1, иначе нету
                                        ; не 0 в разрядах 6-8 - есть оружие 2, иначе нету
                                        ; не 0 в разрядах 9-11 - есть оружие 3, иначе нету
BulletSprite:   .word 3                 ; Спрайт пульки
                .word 1
                .byte ^B11011000
                .byte ^B00111111
                .byte ^B11011000
                .byte 0
; Формат - по три слова на один выстрел
; всего 6 элементов
BulletBufferLenW = 22
BulletBuffer:   .blkw BulletBufferLenW  ; буфер выстреленных пулек
Weapon0Addr:    .word 0                 ; адрес экрана доп.оружия 0
ShootSndData:   .word 4                 ; Данные звука выстрела
                .word 300
                .word 200
                .word 100
                .word 200
                .word 0

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

; Звук выстрела

ShootSound:     mov     #ShootSndData, R1 ; Данные звука выстрела
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                sub     #6, R0
                return
; End of function ShootSound


; ███████████████ 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-го разряда?
                beq     4$              ; да
3$:             br      1$              ; нет - продолжаем прибавлять
; ───────────────────────────────────────────────────────────────────────────

4$:             inc     @#MillionKMCount ; счётчик пройденных миллионов км
                                        ; через каждый миллион увеличивается сложность
                mov     #SoundMillionData, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                br      3$
; End of function Trap60

; ───────────────────────────────────────────────────────────────────────────
MillionKMCount: .word 0                 ; счётчик пройденных миллионов км
                                        ; через каждый миллион увеличивается сложность
SoundMillionData:.word 14
                .word 500
                .word 1000
                .word 1400
                .word 1000
                .word 0
Sound8$:        .word 1                 ; Звук полёта ракеты
                .word 37
                .word 0
datStrKM:       .word FONT + <'K - 040>*10. + 1 ; КМ
                .word FONT + <'M - 040>*10. + 1
                .word 0
Lives$:         .word 112621            ; Количество жизней
                .word 0
                .word 0
; Спрайт оружейного ящика
SpriteAmmoBox:  .word 14
                .word 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
SpriteWeapon0:  .word 7
                .word 2
                .word ^B0000001100000000
                .word ^B0000001100000000
                .word ^B0000001000000000
                .word ^B1111100010111100
                .word ^B0000001000000000
                .word ^B0000001100000000
                .word ^B0000001100000000
SpriteWeapon1:  .word 7
                .word 2
                .word ^B1010101000000000
                .word ^B0011111111110000
                .word ^B0000101010101111
                .word ^B0011111111110000
                .word ^B1010101000000000
                .word ^B0000000000000000
                .word ^B0000000000000000
SpriteWeapon2:  .word 7
                .word 2
                .word ^B1111000000111100
                .word ^B0000110011000000
                .word ^B0000001000000000
                .word ^B0000110011000000
                .word ^B1111000000111100
                .word ^B0000000000000000
                .word ^B0000000000000000
SpriteWeapon3:  .word 7
                .word 2
                .word ^B0000000011110000
                .word ^B0000001111111100
                .word ^B0000111110101111
                .word ^B0000111010101011
                .word ^B0000111110101111
                .word ^B0000001111111100
                .word ^B0000000011110000
SprWeaponLen = SpriteWeapon1 - SpriteWeapon0

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

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

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

1$:             dec     @#AmmoBoxDelay
                mov     @#AmmoBoxAddr, R1 ; адрес экрана оружейного ящика
                bne     2$              ; если адрес валидный - продолжаем
                return                  ; иначе - всё
; ───────────────────────────────────────────────────────────────────────────

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

3$:             trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, R5
                bic     #177700, R5
                cmp     #76, R5         ; за правую границу экрана уехали?
                bne     4$                  ; нет - продолжим
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                clr     R1              ; всё, нет больше оружейного ящика

4$:             mov     R1, @#AmmoBoxAddr ; сохраним новый адрес экрана
                mov     @#RocketAddr, R0 ; Адрес ракеты
                mov     R1, R3          ; проверим где летит
                add     #1300, R3
                cmp     R0, R3
                blt     5$              ; не выше ракеты
                return                  ; выше
; ───────────────────────────────────────────────────────────────────────────

5$:             mov     R0, R3
                add     #1600, R3
                cmp     R3, R1
                bgt     6$              ; не ниже ракеты
                return                  ; ниже
; ───────────────────────────────────────────────────────────────────────────

6$:             bic     #177700, R0     ; теперь проверим на встречу
                bic     #177700, R1
                mov     R1, R3
                add     #2, R3
                cmp     R0, R3
                blt     7$
                return
; ───────────────────────────────────────────────────────────────────────────

7$:             mov     R0, R3
                add     #7, R3
                cmp     R3, R1
                bgt     8$
                return
; ───────────────────────────────────────────────────────────────────────────
; ракета поймала ящик

8$:             mov     @#AmmoBoxAddr, R1 ; адрес экрана оружейного ящика
                mov     #SpriteAmmoBox, R0
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                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

; ───────────────────────────────────────────────────────────────────────────
Wpn0WorkCycle:  .word 3
Weapon1Addr:    .word 0                 ; адрес экрана доп.оружия 1
Weapon2Addr:    .word 0                 ; адрес экрана доп.оружия 2
Wpn2Parameter:  .word 700
Weapon3Addr:    .word 0                 ; адрес экрана доп.оружия 3
                .word 701
AddnWeapons:    .word Weapon0Addr       ; адрес таблицы адресов экранных адресов доп. оружий
                .word Weapon1Addr
                .word Weapon2Addr
                .word Weapon3Addr
SoundRocketDead:.word 40
                .word 1000
                .word 500
                .word 300
                .word 500
                .word 300
                .word 1000
                .word 0
datTextGAME:    .word FONT + <'И - 100>*10. + 1
                .word FONT + <'Г - 100>*10. + 1
                .word FONT + <'Р - 100>*10. + 1
                .word FONT + <'А - 100>*10. + 1
                .word 0
datText13$:     .byte 5, 167
                .asciz "ОКОНЧЕНА"
datText13End:   .even
                .word 0
SoundHitAmmo:   .word 10
                .word 300
                .word 100
                .word 0
; ───────────────────────────────────────────────────────────────────────────

NextStartGame4$: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     #40, R0
                mov     #60116, (R0)+
                mov     #datText6$, (R0)+ ; ПАУЗА-СБР
                mov     #175000, (R0)+
                mov     #1, (R0)+
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу 40
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте

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

2$:             mov     #40000, R0
                mov     #20000, R1

3$:             clr     (R0)+
                sob     R1, 3$
                mov     #FONT + <'0 - 040>*10. + 1, R5 ; цифра 0
                mov     #Distance, R0   ; Пройденный путь
                mov     #6, R1

4$:             mov     R5, (R0)+
                sob     R1, 4$
                clr     (R0)+
                mov     #40, R0
                mov     #76724, (R0)+
                mov     #Distance, (R0)+ ; Пройденный путь
                mov     #110000, (R0)+
                clr     (R0)+           ; Выводим пройденное расстояние
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу 40
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                mov     #60067, @#RocketAddr ; Адрес ракеты
                clr     @#AmmoBoxAddr   ; адрес экрана оружейного ящика
                mov     #BulletBuffer, R0 ; буфер выстреленных пулек
                mov     #BulletBufferLenW, R1

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

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

1$:             cmp     #1, @#CtrlMode  ; режим управления: 0 - от клавиатуры
                                        ;                   1 - от джойстика
                                        ;                   2 - клавиатура + джойстик
                bne     2$
                trap    52              ; Опрос джойстика
                br      3$
; ───────────────────────────────────────────────────────────────────────────
; параллельное управление

2$:             trap    52              ; Опрос джойстика
                tst     @#GrowRocketAddr ; Приращение к адресу ракеты
                bne     3$              ; если на джойстике что-то было нажато, клавиатуру игнорируем
                                        ; какая же это параллельность?
                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 ; фиксируем новый адрес
; Стираем ракету со старого места
                mov     #SprFlame2, R0
                add     #507, R1
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                sub     #507, R1
                mov     @#2, R0         ; !!! вот секретная часть, там адрес спрайта ракеты
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R5, R1
; Рисуем ракету на новом месте
                trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     #507, R1
                com     #0
                beq     8$
                mov     #SprFlame1, R0
                br      9$
; ───────────────────────────────────────────────────────────────────────────

8$:             mov     #SprFlame2, R0

9$:             trap    34              ; Вывод спрайта на экран movом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                trap    56              ; Обработка выстрела пулек и анимация их полёта
                trap    60              ; Увеличение пройденного расстояния
                cmp     #9., @#MillionKMCount ; Дошли до конца?
                bne     10$             ; нет ещё
                jmp     @#FinalGame
; ───────────────────────────────────────────────────────────────────────────

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

MorphTrp$:      ; Trap 12 заменяется на Nop и обратно
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу 40
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
11$:            cmp     #100250, @#177716 ; клавиша нажата?
                bmi     13$             ; нет

12$:            cmp     #14, @#177662   ; да, а какая, СБР?
                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     @#MillionKMCount, R5 ; счётчик пройденных миллионов км
                                        ; через каждый миллион увеличивается сложность
                beq     0Df$
                dec     R5
                beq     1Df$
                dec     R5
                beq     2Df$
                dec     R5
                beq     3Df$
                dec     R5
                beq     4Df$
                dec     R5
                beq     5Df$
                dec     R5
                beq     6Df$
                dec     R5
                beq     7Df$
                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  ; Обработка метеоритов
                nop
                nop
                nop
                mov     #760, SP
                call    @#LiveBoxProc
                mov     #240, R0
                call    @#RocketFragScattrAnim     ; Обработка разлёта осколков от попадания по ракете
                call    @#ObjectFragScattrAnim     ; Обработка разлёта осколков от комет и прочих помех
                jmp     @#GameLoop$
; ───────────────────────────────────────────────────────────────────────────
SprMeteorToRt1: .word 12
                .word 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
                .word 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
SprMeteorToLt1: .word 12
                .word 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
                .word 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
SprMeteorLen = SprMeteorToRt2 - SprMeteorToRt1

; таблица из 4-х элементов:
; .word адрес спрайта
; .word адрес экрана
MeteorRtTbl:    .word SprMeteorToRt1, 44242
                .word 0, 0
                .word SprMeteorToRt1, 67562
                .word SprMeteorToRt1, 61322
; таблица из 4-х элементов:
; .word адрес спрайта
; .word адрес экрана
; .word приращение адреса
MeteorLtTbl:    .word SprMeteorToLt1, 40513, 177
                .word 0, 0, 177577
                .word SprMeteorToLt1, 65032, 177577
                .word 0, 0, 177577

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

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

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

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

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

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

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

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

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

7$:             trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R0, -4(R4)      ; сохраним новые значения
                mov     R1, -2(R4)
                mov     R1, R2
                bic     #177700, R2     ; проверим на выход за экран
                cmp     #74, R2
                bne     8$              ; ещё не вышли
                trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                clr     -4(R4)          ; пометим в таблице как пустое место
                clr     -2(R4)

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

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

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

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

13$:            add     #75000, (R5)+   ; будет лететь снизу вверх по диагонали
                mov     #-201, (R5)

14$:            mov     #40, @#NewMeteorLtCnt ; инициализируем счётчик

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

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

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

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

19$:            trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R0, -4(R4)      ; сохраняем новый спрайт
                mov     R1, -2(R4)      ; и координаты
                dec     R1              ; до левого края дошли?
                bit     #77, R1
                bne     20$             ; нет ещё
                clr     -2(R4)          ; да - удаляем метеорит из таблицы
                clr     -4(R4)
                inc     R1
                trap    42              ; Стирание спрайта с экрана clrом
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                br      21$
; ───────────────────────────────────────────────────────────────────────────

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

21$:            tst     (R4)+
                sob     R5, 17$
                return
; End of function Difficulity0


; ███████████████ 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     #40, R0
                clr     (R0)+
                mov     #40000, (R0)+
                mov     #77700, (R0)+
                mov     #datTextGAME, (R0)+
                mov     #167356, (R0)+
                mov     #7, (R0)+
                mov     #20, (R0)+
                mov     #1, (R0)+
                mov     #44000, @#64
                trap    0               ; Вывод слова GAME и цифры 2
                                        ; Вход: @#40 - блок параметров
                mov     #40040, R1
                mov     #270, R2
                mov     #20, R3
                clr     @#44
                clr     @#46
                trap    20              ; Вывод падающей каплей буквы
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота падения
                                        ;       R3 - код буквы - 20
                mov     #66000, R1
                mov     #datText13$, @#46
                trap    70              ; Вывод на экран счёта

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

2$:             mov     #40000, R0      ; очищаем экран
                mov     #20000, R2

3$:             clr     (R0)+
                sob     R2, 3$
                jmp     @#DrawMenu1$    ; и начинаем всё заново
; End of function RocketDead

; ───────────────────────────────────────────────────────────────────────────
SpriteObj2:     .word 15
                .word 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
                .byte 0

; ███████████████ 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, (R5)
                bic     #77, (R5)
                add     #40000, (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        ; адрес объекта
                bne     2$              ; если есть на экране - обработаем
                return                  ; иначе просто выход
; ───────────────────────────────────────────────────────────────────────────

2$:             cmp     R5, R1          ; объект где?
                blt     3$              ; ниже ракеты
                mov     #302, R3        ; выше ракеты - будет лететь вперёд-вниз
                br      4$
; ───────────────────────────────────────────────────────────────────────────

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

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

5$:             sub     #4, R1          ; нарисуем на новом месте
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                mov     R1, (R4)        ; сохраним новую координату
                nop
                jmp     @#Trap66        ; Проверка на коллизии с объектами уровней сложности
                                        ; Вход: R4 адрес блока параметров объекта
; End of function Difficulity2
; ───────────────────────────────────────────────────────────────────────────
SpriteObj1:     .word 7
                .word 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
                .byte 0
; параметры 5 слов:
; .word адрес экрана
; .word высота в строках*100, для проверки на коллизии
; .word 2 - размер объекта в ширину, для проверки на коллизии
; .word 2 - количество жизней объекта, сколько раз нужно по нему попасть
; .word адрес спрайта

Object1Param:   .word 0
                .word 600
                .word 2
                .word 2
                .word SpriteObj1
                .word 0
                .word 0
                .word 0
                .word 0

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

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

WeaponHit:      call    @#GrowScore     ; Увеличение счёта
                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

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

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


sub_20240:      mov     #10, R5         ; тут почему-то в 2 раза больше размер таблицы
                                        ; так и код может портиться
cmd_20244:      mov     (PC)+, R0
off_20246:      .word FragObjTbl

1$:             mov     (R0), R1
                bne     3$
                add     #FragObjSize, R0

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

3$:             dec     (R0)+
                dec     R1
                mov     #10, R4
                mov     #ObjFragScattrOffsetTbl, R3

4$:             mov     (R0), R2
                beq     6$
                clrb    (R2)
                clrb    100(R2)
                add     (R3)+, (R0)
                bit     #74, (R0)
                beq     5$
                cmp     #40400, (R0)
                bgt     5$
                cmp     #76000, (R0)
                bgt     6$

5$:             clr     (R0)

6$:             tst     (R0)+
                sob     R4, 4$
                tst     R1
                beq     2$
                sub     #20, R0
                mov     #10, R4

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 sub_20240

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

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

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

2$:             clr     (R1)+
                clr     (R3)+
                sob     R2, 2$
                clr     @#LiveBoxAddr   ; адрес коробки с жизнями
                jmp     @#NextStartGame$

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

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

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

T64.Loop$:      cmp     R1, (R3)
                bgt     1.64$           ; пулька выше объекта - не попали
                mov     R1, R5
                add     #1100, R5
                cmp     R5, (R3)
                blt     1.64$           ; пулька ниже объекта - не попали
                mov     R1, R5
                bic     #177700, R5
                mov     (R3), R0
                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     -4(R4), R0      ; адрес спрайта объекта
                clr     -2(R4)          ; удаляем его из массива
                clr     -4(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
                blt     4$              ; объект перед ракетой - не подбили
                jmp     @#RocketHit     ; Попадание в ракету
; ───────────────────────────────────────────────────────────────────────────

4$:             return
; End of function Trap64

; ───────────────────────────────────────────────────────────────────────────
                .word 0
                .word 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
; массив адресов,
; первое слово - счётчик (время жизни)
RocketFragTbl:  .word 0                 ; Таблица адресов осколков от ракеты
                .word 47006
                .word 53430
                .word 55652
                .word 60074
                .word 62252
                .word 64430
                .word 66606
                .word 0
                .word 0
                .word 0
                .word 0
                .word 0
RocketFragTblEhd:
RocketFragTblSizeW = <RocketFragTblEhd - RocketFragTbl> / 2
RocketFragElemNum = RocketFragTblSizeW - 1

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

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

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

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

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

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

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

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

; ███████████████ 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$:             sub     #10., @#Lives$   ; уменьшаем количество жизней
                cmp     #FONT + <'0 - 040>*10. - 3, @#Lives$ ; '0'-1
                blt     3$              ; ещё не конец
                jmp     @#RocketDead    ; Ракету убили, конец игры
; ───────────────────────────────────────────────────────────────────────────

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

; ───────────────────────────────────────────────────────────────────────────
Object2Param:   .word 0
                .word 1400
                .word 4
                .word 3
                .word SpriteObj2
                .word 0
                .word 0

; ███████████████ 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
                bgt     2$              ; пулька ещё не долетела до объекта - не попали
                br      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
                bgt     4$              ; объект ещё не достиг оружия - не попали
                br      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       ; Обработка разрушения объекта
                nop
                br      sub_21710       ; Обработка попадания в ракету
; ───────────────────────────────────────────────────────────────────────────

5$:             return
; End of function Trap66


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

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

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

1$:             add     #302, R1        ; адрес центра разлёта осколков
                jmp     @#WeaponHit     ; Подбили объект, заполним таблицу разлёта осколков, если в ней есть место
; End of function sub_21630             ; Вход: R1 - адрес экрана объекта

; ───────────────────────────────────────────────────────────────────────────
                .word 0
                .word 0
                .word 0
                .word 0

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

; Обработка попадания в ракету

sub_21710:      mov     #40000, R4      ; это заглушка для стирания спрайта в функции RocketHit
                                        ; когда жизни ещё не кончились, там идём на ClearSprite и вот там это нужно
                mov     #SpriteObj2, -4(R4)
                jmp     @#RocketHit     ; Попадание в ракету
; End of function sub_21710

; ───────────────────────────────────────────────────────────────────────────
                .word 0

; ███████████████ 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, (R5)
                bic     #77, (R5)
                add     #40000, (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        ; адрес объекта
                bne     2$              ; если есть на экране - обработаем
                return                  ; иначе просто выход
; ───────────────────────────────────────────────────────────────────────────

2$:             cmp     R5, R1          ; объект где?
                bpl     3$              ; выше ракеты
                mov     #-76, R3        ; ниже ракеты - будет лететь вперёд-вверх
                br      4$
; ───────────────────────────────────────────────────────────────────────────

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

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

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

; ───────────────────────────────────────────────────────────────────────────
                .word 0
                .word 0
                .word 0
SpriteObj3:     .word 13
                .word 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
; Таблица параметров объектов 3
; их там 4 штуки, по 5 слов на каждого
Obj3ElemNum = 4
ObjElemSizeW = 5
Object3ParamTbl:.blkw Obj3ElemNum * ObjElemSizeW

; ███████████████ 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, (R5)   ; формируем объект
                bic     #177704, (R5)
                bit     #1, (R5)
                beq     3$
                add     #35000, (R5)

3$:             add     #40000, (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
                bne     7$
                br      13$
; ───────────────────────────────────────────────────────────────────────────

7$:             add     #300, R5
                cmp     R5, R1
                bpl     8$
                mov     #177700, R3
                br      9$
; ───────────────────────────────────────────────────────────────────────────

8$:             add     #600, R1
                cmp     R5, R1
                bmi     10$
                mov     #100, R3

9$:             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

; ───────────────────────────────────────────────────────────────────────────
                .word 0
SpriteObj4:     .word 11
                .word 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
Obj4ElemNum = 4
Object4ParamTbl:.blkw Obj4ElemNum * ObjElemSizeW

; ███████████████ 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, (R5)
                bic     #77, (R5)
                bit     #100, (R5)
                beq     3$
                add     #74, (R5)

3$:             add     #40000, (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
                bne     7$
                br      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      11$
; ───────────────────────────────────────────────────────────────────────────

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

; ───────────────────────────────────────────────────────────────────────────
                .word 0
                .word 0
SpriteObj5:     .word 15
                .word 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
                .word 2
                .word ^B0000000010001100
                .word ^B0000001000110100
                .word ^B1101011001110001
                .word ^B0000001000110100
                .word ^B0000000010001100
Object5Param:   .word 0
                .word 0
                .word 0
                .word 0
                .word SpriteObj5
Object5Param.2: .word 0
                .word 400
                .word 2
                .word 1
                .word SpriteObj5.2
                .word 0
                .word 0

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


Difficulity5:   tst     (PC)+
Counter5:       .word 460
                bne     1$
                mov     #Object5Param, R5
                mov     @#177710, (R5)
                bic     #77, (R5)
                add     #40000, (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$:             add     #5, R1
                bit     #76, R1
                bne     6$
                clr     (R4)+
                return
; ───────────────────────────────────────────────────────────────────────────

6$:             sub     #5, R1
                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 ███████████████████████████████████████

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

ObjectFragScattrAnim:
                mov     #12700, @#cmd_20244 ; непонятная фигня.
                mov     #FragObjTbl, R0   ; пока не нашёл, где это заменяется на что-то другое
                mov     R0, @#off_20246
                nop
                nop
                nop
                nop
                nop
                nop
                jmp     @#sub_20240
; End of function ObjectFragScattrAnim

; ───────────────────────────────────────────────────────────────────────────
                .word 0
; ───────────────────────────────────────────────────────────────────────────

NextStartGame$: mov     #20, @#177712
                mov     #34000, @#177706
                clr     @#Object5Param
                clr     @#Object5Param.2
                clr     @#Object1Param
                clr     @#Object2Param
                clr     @#Flag8         ; Флаг, что уже выключили вывод на экран расстояния
                mov     #Obj8ParamTbl, R0
                mov     #<Obj3ElemNum * ObjElemSizeW>, R1

1$:             clr     (R0)+
                sob     R1, 1$
                jmp     @#NextStartGame1$
; ───────────────────────────────────────────────────────────────────────────
SpriteLiveBox:  .word 13
                .word 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
                .byte 0
LiveBoxAddr:    .word 0                 ; адрес коробки с жизнями

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

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

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

1$:             dec     @#LiveBoxDelay  ; уменьшаем счётчик
                mov     #SpriteLiveBox, R0
                mov     @#LiveBoxAddr, R1 ; адрес коробки с жизнями
                bne     2$              ; если коробка на экране - обработаем
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                tst     (R1)+           ; движемся
                bit     #77, R1         ; до правого края дошли?
                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. + 1, @#Lives$ ; '9' количество жизней и так максимум?
                beq     5$              ; да - ничего не делать
                br      6$              ; нет - пойдём увеличим
; ───────────────────────────────────────────────────────────────────────────

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

5$:             return
; ───────────────────────────────────────────────────────────────────────────

6$:             add     #10., @#Lives$  ; увеличим количество жизней
                clr     @#LiveBoxAddr   ; коробка - всё
                mov     #40, R0         ; выведем на экран
                mov     #76774, (R0)+
                mov     #Lives$, (R0)+  ; Количество жизней
                trap    12              ; Вывод текста
                                        ; Вход: блок параметров по адресу 40
                                        ; .word адрес экрана
                                        ; .word адрес данных (таблица адресов символов в шрифте)
                                        ; .word маска цвета для 1 бита символа
                                        ; .word масштаб по высоте
                mov     #SoundLiveBoxCatch, R1
                trap    14              ; Вывод звука
                                        ; Вход R1 - адрес таблицы параметров
                                        ; .word длит
                                        ; .word тон, тон,... (0 - конец таблицы)
                return
; End of function LiveBoxProc

; ───────────────────────────────────────────────────────────────────────────
SoundLiveBoxCatch:.word 100
                .word 130
                .word 110
                .word 150
                .word 0
                .word 0
                .word 0
SpriteObj6:     .word 12
                .word 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
Object6Param:   .word 0
                .word 0
                .word 0
                .word 0
                .word SpriteObj6

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


Difficulity6:   tst     (PC)+
Counter6:       .word 103
                bne     1$
                mov     #Object6Param, R5
                mov     @#RocketAddr, (R5) ; Адрес ракеты
                bic     #77, (R5)
                add     #300, (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
                bne     2$
                return
; ───────────────────────────────────────────────────────────────────────────

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

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

; ───────────────────────────────────────────────────────────────────────────
SpriteObj7:     .word 10
                .word 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
                .word 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
                .word 2
                .word ^B0000001111000000
                .word ^B0011111111111100
                .word ^B0011101010101100
                .word ^B1111101010101111
                .word ^B1110101111101011
                .word ^B1111101010101111
                .word ^B0011101010101100
                .word ^B0011111111111100
                .word ^B0000001111000000
Obj7ElemNum = 4
Obj7ParamTbl:   .word 66642, 1000, 1, 5, SpriteObj7.3
                .word 74662, 1000, 1, 5, SpriteObj7.3
                .word     0, 1000, 1, 5, SpriteObj7.3
                .word 60622, 1000, 1, 4, SpriteObj7.3
Object7Param:   .word 53102
                .word 700
                .word 2
                .word 15
                .word SpriteObj7

; ███████████████ 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, (R5)
                bic     #77, (R5)
                add     #40002, (R5)+
                mov     #700, (R5)+
                mov     #2, (R5)+
                mov     #30, (R5)+
                mov     #SpriteObj7, (R5)+

1$:             mov     #1444, @#Counter7

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

3$:             mov     #-300, R3

4$:             mov     #SpriteObj7, R0
                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

; ───────────────────────────────────────────────────────────────────────────
                .word 37
                .word 10
; Этот спрайт масштабируется в 2 раза по ширине и высоте
; сохраняется по адресу Sprite8Buf и используется на последнем этапе №8
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
; ───────────────────────────────────────────────────────────────────────────

NextStart2$:    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$
                jmp     @#NextStart3$
; ───────────────────────────────────────────────────────────────────────────
Object8Param:   .word 52000
                .word 7500
                .word 12
                .word 1
                .word Sprite8Buf
Obj8SprOffset:  .word 0
Flag8:          .word 0                 ; Флаг, что уже выключили вывод на экран расстояния
                .word 0
                .word 0
                .word 0

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


Difficulity8:   tst     @#Flag8         ; Флаг, что уже выключили вывод на экран расстояния
                bne     1$
                mov     #10, @#Obj8SprOffset
                call    @#DistOutOff     ; Прекращение вывода на экран пройденного расстояния

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     4$
                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)+
                nop
                sob     R4, 7$
                bis     #77, R1
                inc     R1
                add     (R5), R0
                add     (R5), R0
                sob     R2, 6$
                br      NextDifficulity8$
; ───────────────────────────────────────────────────────────────────────────
Obj8ElemNum = 4
Obj8ParamTbl:   .blkw Obj8ElemNum * ObjElemSizeW

SpriteObj8:     .word 7
                .word 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
                .word    0
                .word    0
                .word    0
                .word    0
; ───────────────────────────────────────────────────────────────────────────

NextDifficulity8$:
                mov     #Obj8ElemNum, R5
                mov     #Obj8ParamTbl, 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     #Obj8ParamTbl, 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
                add     #3, R1
                bit     #76, R1
                bne     8$
                clr     (R4)
                br      9$
; ───────────────────────────────────────────────────────────────────────────

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

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

NextStartGame1$:mov     #Score, R0
                mov     #3, R1

1$:             mov     #"00 - [20<<8.+20], (R0)+
                sob     R1, 1$
                jmp     @#NextStartGame2$
; ───────────────────────────────────────────────────────────────────────────
datScore:       .byte 5, 377
Score:          .word 20040
                .word 20040
                .word 40

; ███████████████ 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)
                beq     2$
                mov     (SP)+, R0
                mov     #10, R5
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             movb    #'0 - 20, (R0)
                br      1$
; End of function GrowScore


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

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

Trap70:         clrb    @#Score+5
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#46 - адрес массива данных
                nop
                nop
                nop
                nop
                mov     #54414, R1
                mov     #datScore, @#46
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#46 - адрес массива данных
                return
; End of function Trap70

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

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

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

; Прекращение вывода на экран пройденного расстояния

DistOutOff:     com     @#Flag8         ; Флаг, что уже выключили вывод на экран расстояния
                mov     (PC)+, @(PC)+   ; Trap 12 заменяется на Nop и обратно
                        nop
                        .word MorphTrp$
                return
; End of function DistOutOff

; ───────────────────────────────────────────────────────────────────────────
                .word    0
                .word    0
datText7$:      .byte 40, 10, 14
                .ascii "ВЫ ВЫПОЛНИЛИ"
                .byte 10, 7, 15
                .ascii "СВОЮ МИССИЮ !"
                .byte 40, 10, 14
                .ascii "УНИЧТОЖЕННАЯ"
                .byte 10, 10, 14
                .ascii "ВАМИ ТЕХНИКА"
                .byte 10, 14, 12
                .ascii "ИЗМЕРЯЕТСЯ"
                .byte 10, 14, 12
                .ascii "СЛЕДУЮЩИМИ"
                .byte 10, 14, 12
                .ascii "ЕДЕНИЦАМИ:"
                .byte 140, 0, 0, 0
                .even
                .blkb 24.
; ───────────────────────────────────────────────────────────────────────────

NextFinalGame:  mov     #40, R0
                mov     #77700, (R0)+
                mov     #datText7$, (R0)+
                mov     #220, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу 40:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                mov     #datScore, @#46
                mov     #66014, R1
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#46 - адрес массива данных
                trap    24              ; Вывод три зелёных полосы и на них копирайт спрайтами
                trap    72              ; Ждать нажатия чего-нибудь

NextFinalGame0: br      NextFinalGame2

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

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

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

1$:             return
; End of function Trap72

; ───────────────────────────────────────────────────────────────────────────
datText8$:      .byte 50, 14, 12
                .ascii "ПРЕДЫДУЩАЯ"
                .byte 10, 6, 15
                .ascii "ИГРА ─ GAME 1"
                .byte 300, 0, 0, 0
                .even
datText81$:     .byte 15, 167
                .asciz "BALLY"
datText81End:   .even
; ───────────────────────────────────────────────────────────────────────────

NextFinalGame2: mov     #40, R0
                mov     #77700, (R0)+
                mov     #datText8$, (R0)+
                mov     #220, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу 40:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                mov     #datText81$, @#46
                mov     #60014, R1
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#46 - адрес массива данных
                mov     @#177664, #1330 ; как интересно!!!
                trap    72              ; Ждать нажатия чего-нибудь
                br      NextFinalGame3
; ───────────────────────────────────────────────────────────────────────────
datText9$:      .byte 50, 20, 11
                .ascii "СЛЕДУЩАЯ "
                .byte 10, 6, 15
                .ascii "ИГРА ─ GAME 3"
                .byte 300, 0, 0, 0
                .even
                .word 0
datText91$:     .byte 15, 356
                .asciz "PLANET"
datText91End:   .even
; ───────────────────────────────────────────────────────────────────────────

NextFinalGame3: mov     #40, R0
                mov     #77700, (R0)+
                mov     #datText9$, (R0)+
                mov     #220, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу 40:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                mov     #datText91$, @#46
                mov     #60010, R1
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#46 - адрес массива данных
                trap    72              ; Ждать нажатия чего-нибудь
                br      NextFinalGame4
; ───────────────────────────────────────────────────────────────────────────
datText10$:     .byte 30, 24, 6
                .ascii "PLANET"
                .byte 20, 6, 15
                .ascii "ВАША ЗАДАЧА ─"
                .byte 10, 0, 20
                .ascii "    СЕСТЬ НА    "
                .byte 10, 6, 15
                .ascii "  ПЛАНЕТУ ,  "
                .byte 10, 12, 14
                .ascii " УНИЧТОЖИВ  "
                .byte 10, 10, 14
                .ascii "ПРОТИВНИКА ,"
                .byte 10, 14, 12
                .ascii "АТАКУЮЩЕГО"
                .byte 10, 16, 11
                .ascii "С ВОЗДУХА"
                .byte 10, 14, 12
                .ascii "И С ЗЕМЛИ."
                .byte 40, 0, 20
                .ascii "ТОЛЬКО ПРИОБРЕТЯ"
                .byte 10, 6, 15
                .ascii "ЭТУ ИГРУ , ВЫ"
                .byte 10, 0, 20
                .ascii "МОЖЕТЕ ВЗДОХНУТЬ"
                .byte 10, 14, 12
                .ascii "СПОКОИНО !"
                .byte 0, 0, 0, 0
                .even
; ───────────────────────────────────────────────────────────────────────────

NextFinalGame4: mov     #40, R0
                mov     #77700, (R0)+
                mov     #datText10$, (R0)+
                mov     #220, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу 40:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                trap    24              ; Вывод три зелёных полосы и на них копирайт спрайтами
                trap    72              ; Ждать нажатия чего-нибудь
                nop
                br      NextFinalGame5
; ───────────────────────────────────────────────────────────────────────────

NextStartGame3$:clrb    @#Score+5
                jmp     @#NextStartGame4$
; ───────────────────────────────────────────────────────────────────────────

NextFinalGame5: mov     #40000, R0
                mov     #17000, R1

1$:             clr     (R0)+
                sob     R1, 1$
                mov     #40070, @#37776
                clr     @#RocketAddr    ; Адрес ракеты

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

3$:             trap    40              ; Стирание спрайта с экрана методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                add     R3, R1
                mov     R1, @#37776
                trap    36              ; Вывод спрайта на экран методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти, первые 2 слова высота в строках и ширина в байтах
                                        ;       R1 - адрес экрана
                cmp     #74000, @#37776
                bgt     2$
                jmp     @#NextFinalGame6
; ───────────────────────────────────────────────────────────────────────────
SpriteFin1:     .word 61
                .word 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
                .word 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
; ───────────────────────────────────────────────────────────────────────────

NextFinalGame6: mov     #FragObjTbl, R0
                mov     #<FragObjSize * FragObjNum * 2>, R1

1$:             clrb    (R0)+
                sob     R1, 1$
                clr     @#RocketFragTbl ; Таблица адресов осколков от ракеты
                nop
                mov     #40000, R0
                mov     #20000, R1

2$:             clr     (R0)+
                sob     R1, 2$
                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$
                br      NextFinalGame7
; ───────────────────────────────────────────────────────────────────────────
Sound10$:       .word 1
                .word 1000
                .word 0
Sound11$:       .word 14
                .word 300
                .word 1000
                .word 500
                .word 1400
                .word 300
                .word 0
; ───────────────────────────────────────────────────────────────────────────

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     #56000, R1
                nop
                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
                nop
                nop
                nop
                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$
                mov     #40000, R0
                mov     #20000, R1

13$:            clr     (R0)+
                sob     R1, 13$
                br      NextFinalGame8
; ───────────────────────────────────────────────────────────────────────────
datText11$:     .byte 1, 12, 13
                .ascii "СЛАБОВАТО !"
                .byte 10, 2, 17
                .ascii "БАЗОВАЯ ПЛАНЕТА"
                .byte 10, 14, 12
                .ascii "УНИЧТОЖЕНА"
                .byte 10, 4, 16
                .ascii "НЕ ПОЛНОСТЬЮ ."
                .byte 10, 4, 16
                .ascii "ЗАПАСЫ ТОПЛИВА"
                .byte 10, 14, 12
                .ascii "ИСТОЩЕНЫ ."
                .byte 10, 10, 14
                .ascii "ПРИДЕТСЯ ВАМ"
                .byte 10, 14, 12
                .ascii "ПРОИЗВЕСТИ"
                .byte 10, 12, 13
                .ascii "ВЫНУЖДЕННУЮ"
                .byte 10, 2, 17
                .ascii "ПОСАДКУ НА ЭТОИ"
                .byte 10, 16, 11
                .ascii "ПЛАНЕТЕ И"
                .byte 10, 6, 15
                .ascii "УНИЧТОЖИТЬ ЕЕ"
                .byte 10, 12, 13
                .ascii "ПОЛНОСТЬЮ ."
                .byte 36, 20, 10
                .ascii "НО ЭТО В"
                .byte 10, 2, 17
                .ascii "СЛЕДУЮЩИИ РАЗ ."
                .byte 1, 0, 0, 0
                .even
                .word 0,0
; ───────────────────────────────────────────────────────────────────────────

NextFinalGame8: mov     #40, R0
                mov     #77700, (R0)+
                mov     #datText11$, (R0)+
                mov     #372, (R0)+
                mov     #2000, (R0)+
                trap    2               ; Вывод информации на экран
                                        ; Вход: блок параметров по адресу 40:
                                        ; .word адрес экрана
                                        ; .word адрес данных
                                        ; .word маска цвета
                                        ; .word задержка
                trap    72              ; Ждать нажатия чего-нибудь
                br      NextFinalGame9
; ───────────────────────────────────────────────────────────────────────────
datText12$:     .byte 10, 231
                .ascii "У МЕНЯ"
                .byte 277, 144
                .byte 220, 14, 146
                .byte 244
                .ascii "ВСЕ"
                .even
                .word 0
; коды 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
; ───────────────────────────────────────────────────────────────────────────

NextFinalGame9: nop
                mov     #datText12$, @#46
                mov     #44010, R1
                mov     R1, @#40
                mov     #40000, R5
                mov     #20000, R4

1$:             clr     (R5)+
                sob     R4, 1$
                trap    6               ; Вывод текста сложного формата на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       @#46 - адрес массива данных
                trap    72              ; Ждать нажатия чего-нибудь
                mov     #40000, R0
                mov     #20000, R1

2$:             clr     (R0)+
                sob     R1, 2$
                mov     #1330, @#177664
                mov     #760, SP
                mov     #TrapTo4, @#4
                jmp     @#DrawMenu1$
; ───────────────────────────────────────────────────────────────────────────
                .word 0
; ───────────────────────────────────────────────────────────────────────────

FinalGame:      mov     #TrapTo4.Fin$, @#4
                jmp     @#NextFinalGame
; ───────────────────────────────────────────────────────────────────────────
; Перемещатель игры на своё место с адреса 5432 на 1000
MV1$:           add     #3155, R0

1$:             mov     (R3)+, -4434(R3)
                sob     R0, 1$
                call    @(SP)+
GameBlockEnd:

GameBlockSize = GameBlockEnd - Start0$



.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


.SCRIPT "Info Encode"
        mov #datInfo$, R5
1$:     tst (R5)+
        movb (R5)+, R3
        beq 4$
2$:     movb (R5), R0
        beq 4$
        bpl 3$
        sub #40, R0
3$:     sub #20, R0
        movb R0, (R5)+
        sob R3, 2$
        br 1$
4$:

        mov #datText7$, R5
11$:    tst (R5)+
        movb (R5)+, R3
        beq 14$
12$:    movb (R5), R0
        beq 14$
        bpl 13$
        sub #40, R0
13$:    sub #20, R0
        movb R0, (R5)+
        sob R3, 12$
        br 11$
14$:

        mov #datText8$, R5
21$:    tst (R5)+
        movb (R5)+, R3
        beq 24$
22$:    movb (R5), R0
        beq 24$
        bpl 23$
        sub #40, R0
23$:    sub #20, R0
        movb R0, (R5)+
        sob R3, 22$
        br 21$
24$:

        mov #datText9$, R5
31$:    tst (R5)+
        movb (R5)+, R3
        beq 34$
32$:    movb (R5), R0
        beq 34$
        bpl 33$
        sub #40, R0
33$:    sub #20, R0
        movb R0, (R5)+
        sob R3, 32$
        br 31$
34$:

        mov #datText10$, R5
41$:    tst (R5)+
        movb (R5)+, R3
        beq 44$
42$:    movb (R5), R0
        beq 44$
        bpl 43$
        sub #40, R0
43$:    sub #20, R0
        movb R0, (R5)+
        sob R3, 42$
        br 41$
44$:

        mov #datText11$, R5
51$:    tst (R5)+
        movb (R5)+, R3
        beq 54$
52$:    movb (R5), R0
        beq 54$
        bpl 53$
        sub #40, R0
53$:    sub #20, R0
        movb R0, (R5)+
        sob R3, 52$
        br 51$
54$:

.ENDS

                .END
