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

; ───────────────────────────────────────────────────────────────────────────
; File Name   : BALLY.GMC.raw.uncr-game
; Format      : Binary file
; Base Address: 0000h Range: 0200h - 3D38h Loaded length: 3B38h

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

; ═══════════════════════════════════════════════════════════════════════════
FUNC$ = 177400  ; Код функции в игре
FUNCF$ = 7000   ; Код функции в финальных заставках/рекламе/титрах и т.п
FUNCF2$ = 7400  ; Ещё один код функции в финальных заставках/рекламе/титрах и т.п
FONT = 112276   ; Начало шрифта в ПЗУ БК10


NeedMkFrstAct       = 300   ; флаг, нужно сделать какое-либо одноразовое действие:
                            ; отобразить пушку спец.функцией на этапе 2
                            ; задать задержку на этапе 4
CannonHitCount      = 306   ; количество попаданий из пушки, которое выдерживает шар
AnimLetColor        = 312   ; цвет анимированных букв
MenuCursor          = 316   ; адрес курсора меню
FirePower           = 322   ; уровень горения горелки
BallonAddr          = 324   ; экранный адрес воздушного шара
PlatformStartAddr   = 330   ; экранный адрес платформы, с которой стартуем
Stage               = 332   ; текущий этап
FinishAddr          = 336   ; адрес экрана где происходит приземление (проверка на финиш)
PlatformFinishAddr  = 342   ; экранный адрес платформы, на которую садимся (для финиша не используется)
AirFlowDir          = 344   ; направление воздушного потока, исп. только в функции 26
MoonAddr            = 346   ; экранный адрес луны
MoonMovPPtr         = 350   ; указатель в таблице параметров движения луны
MoonAddrIncr        = 352   ; приращение адреса луны
MoonPass            = 354   ; счётчик обходов луны
CannonAddrDraw      = 364   ; адрес экрана пушки для рисования
CannonAddr          = 366   ; адрес экрана пушки
CometHitCount       = 502   ; количество попаданий комет, которое выдерживает шар
HeadAddr            = 504   ; экранный адрес бошки
HeadTimeLife        = 506   ; время жизни бошки

TopStack            = 760   ; вершина стека
TimerValue          = 21000 ; значение ВЕ-таймера

BulletBuffer = 36500    ; буфер пулек, один элемент - 2 слова: адрес и направление движения (вверх или вниз)
BulletsNum = 20         ; максимальное количество пулек на экране
BulletBufferSize = BulletsNum * 4 ; размер буфера
; буфер, где сохраняется содержимое экрана под спрайтом пушки, размер 163 байта
CanScrBuffer = BulletBuffer + BulletBufferSize
SpriteBuffer = 37000    ; тут сохраняется фон под спрайтом
TempBuffer = 37000      ; временный буфер для хранения адресов ячеек с кодами клавиш.
; буфер, где сохраняется содержимое экрана под спрайтом, когда шар опускается до уровня земли
BalScrBuffer = 40000 - BallonSprW * BallonSprH

Start0$:        jmp     @OffStart       ; Запускать игру можно с этого адреса.
                                        ; Но надо иметь кусочек по адресу 100,
                                        ; который перемещатель игры туда помещает

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


TrapTo10:       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     #<TblFunc10-.>, R5
                call    @(R5)+
                mov     (SP)+, R5
                mov     (SP)+, R4
                mov     (SP)+, R3
                mov     (SP)+, R2
                mov     (SP)+, R1
                mov     (SP)+, R0

VecKbd:         rti
; End of function TrapTo10

; ───────────────────────────────────────────────────────────────────────────
TblFunc10:      .word Func00            ; Очистка экрана диагонально зубчатыми линиями
                .word Func02            ; Инициализация некоторых переменных драйвера экрана
                .word Func04            ; Прорисовка мигающих звёздочек
                                        ; Вход: R2 - адрес блока параметров:
                                        ;            .word число элементов (пар адресов)
                                        ;            .word адрес спрайта в памяти
                                        ;            .word адрес экрана
                .word Func06            ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                .word Func10            ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                .word Func12            ; Вывод на экран платформы для воздушного шара
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
                .word Func14            ; Звучание тонального набора
                                        ; Вход: R3 - адрес тонального набора - цепочка пар слов
                                        ;            .word длительность (0 - конец цепочки),
                                        ;            .word тон.
                .word Func16            ; Проверка на нажатие клавиши или кнопки джойстика, если нажата - выход
                .word Func20            ; Вывод звёзд в игре
                .word Func22            ; Стирание спрайта с экрана безусловное
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                .word Func24            ; Анимация огня горелки воздушного шара
                .word Func26            ; Анимация воздушных потоков
                                        ; Вход: R3 - адрес блока параметров
                .word Func30            ; Спецэффект бегущей волны искажения на экране
                .word Func32            ; Вспомогательная функция функции 30
                                        ; Вход: R0 - адрес экрана
                                        ;       R1 - ширина в байтах
                                        ;       R4 - тон звука
                .word Func34            ; Инициализация обходов Луны и функция 42
                .word Func36            ; Очистка со сравнением, экран очищается только там, где спрайт совпадает
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                .word Func40            ; Вывод со сравнением, спрайт выводится только там, где на экране пусто
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                .word Func42            ; Инициализация яч. MoonAddr, MoonMovPPtr
                .word Func44            ; Инициализация яч. FinishAddr и функция 46
                .word Func46            ; Очистка буфера BalScrBuffer
                .word Func50            ; Вкл/выкл фоновой музыки
                .word Func52            ; заглушка
                .word Func54            ; Если нажата клавиша горелки, делать анимацию огня горелки
                .word Func56            ; Получение в R2 <- адрес массива звёзд в игре GameStars
                                        ; и небольшая задержка
                .word Func60            ; Выход: R0 - признак:
                                        ;       -1 - джойстик не нажат, и горелка не нажата
                                        ;       0 - джойстик нажат и ранее была нажата клавиша горелки
                                        ;       100250/100350 - ранее была нажата клавиша горелки, а джойстик не нажат
                .word Func62            ; Кажется, уменьшение счёта
                .word Func64            ; Инициализация счёта
                .word Func66            ; Вывод символа на экран
                                        ; Вход: R0 - адрес данных символа
                                        ;       R1 - адрес экрана
                .word Func70            ; Вывод строки на экран через буфер и скроллинг
                                        ; Вход: R3 - адрес экрана
                                        ;       R4 - адрес строки текста
                .word Func72            ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                .word Func74            ; Прокрутка экрана с попутной очисткой внутри рамки
                .word Func76            ; Отрисовка набора мигающих звёздочек
                .word Func100           ; Вывод текста очень широкими буквами
                                        ; Вход: R0 - коэффициент растяжения по вертикали
                                        ;       R1 - адрес экрана
                                        ;       R5 - адрес текста
                .word Func102           ; Очистка экрана горизонтальными линиями сверху и снизу
                .word Func104           ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                .word Func106           ; Анимация букв
                                        ; Вход: R0 - адрес данных букв
                                        ;       R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
                                        ; Выход: R1 - адрес экрана после действия
                .word Func110           ; мигают звёзды и ждём нажатия клавиши
                .word Func112           ; Проверка на нажатие кнопки паузы
                                        ; и если да, то пауза
                .word Func114           ; Вывод на экран строк об авторе, копирайт,
                                        ; и сделать остальной текст синим.
                .word Func116           ; Звук, ждать нажатия клавиши или джойстика, звук,
                                        ; очистка экрана с прокруткой
                .word Func120           ; Издать некий определённый звук
                .word Func122           ; Передвинуть пушку
                                        ; Вход: R1 - текущий адрес пушки
                                        ; Вход: R4 - приращение адреса
                .word Func124           ; Отобразить пушку
                .word Func126           ; Выстрел из пушки
                .word Func130           ; Полёт пули вверх
                                        ; Вход: R1 - адрес экран
                                        ;       R4 - адрес элемента в буфере + 4
                .word Func132           ; Полёт пули вниз
                                        ; Вход: R1 - адрес экран
                                        ;       R4 - адрес элемента в буфере + 4
                .word Func134           ; Прорисовка комет, летящих слева направо
                                        ; Вход: R4 - адрес текущего элемента массива
                .word Func136           ; Проверка на попадания кометы в шара
                                        ; Вход R4 - адрес текущего элемента массива комет
                .word Func140           ; Прорисовка комет, летящих справа налево
                                        ; Вход: R4 - адрес текущего элемента массива
                .word Func142           ; Просмотр массива на счёт врезавшихся друг в друга встречно летящих комет,
                                        ; если они врезались друг в друга - взаимоуничтожаются
                                        ; Вход: R0 - адрес буфера комет + 2
                .word Func144           ; проверка на коллизию встречно летящих комет,
                                        ; если они врезались друг в друга - взаимоуничтожаются
                                        ; Вход: R0 - адрес эл-та 1
                                        ;       R4 - адрес эл-та 2
                .word Func146           ; Отображаем бошку, проверяем время её жизни и встречу с воздушным шаром
                .word Func150           ; Прорисовка разлетающихся осколков от башки
                                        ; и проверка на попадание в воздушный шар
                .word Func152           ; Проигрыш музыки
                                        ; Вход: R4 - адрес массива мелодии
                .word Func154           ; выводит GAME 2
                .word Func156           ; Вывод скроллом текста, описания к игре 2
                .word Func160           ; Вывод символа на экран
                                        ; Вход: R2 - код символа
                                        ;       @#40 - адрес экрана, куда выводить
                                        ;       @#42 - масштаб по высоте
                                        ;       @#44 - маска цвета
                .word Func162           ; Вывод текста сложного формата на экран
                                        ; Вход: @#46 - адрес массива данных
                                        ;       @#40 - адрес экрана, куда выводить
                .word 0
                .word 0
                .word 0
                .word 0
                .word 0
                .word 0

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

; Очистка экрана диагонально зубчатыми линиями

Func00:         mov     #100, R5
                mov     #77700, R4
                mov     #40077, R3
                br      4$
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     R4, R0
                mov     R3, R1

2$:             mov     #4, R2

3$:             clrb    (R0)
                clrb    (R1)
                add     #100, R1
                sub     #100, R0
                sob     R2, 3$
                tst     R5
                beq     7$
                inc     R0
                dec     R1
                bit     #100100, R1
                beq     2$
                sub     #400, R4
                add     #400, R3

4$:             mov     R4, R0
                mov     R3, R1

5$:             mov     #4, R2

6$:             movb    #125, (R0)
                movb    #125, (R1)
                sub     #100, R0
                add     #100, R1
                sob     R2, 6$
                inc     R0
                dec     R1
                bit     #100100, R1
                beq     5$
                mov     #5000, R0

                sob     R0, .
                sob     R5, 1$
                br      1$
; ───────────────────────────────────────────────────────────────────────────

7$:             return
; End of function Func00


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

; Инициализация некоторых переменных драйвера экрана

Func02:         mov     #40, R0
                mov     #5, R1

1$:             clr     (R0)+
                sob     R1, 1$
                movb    #377, @#56
                mov     #162, R0
                mov     #2, (R0)+       ; 162
                mov     #3000, (R0)+    ; 164
                mov     #1330, @#177664
                mov     #202, R1
                mov     #40000, (R1)+   ; 202
                mov     #2000, (R1)+    ; 204
                mov     #40000, (R1)+   ; 206
                mov     #36000, (R1)+   ; 210
                clr     (R1)+           ; 212
                mov     #-1, (R1)+      ; 214
                clr     (R1)+           ; 216
                clr     (R1)+           ; 220
                comb    @#40

Func52:         return
; End of function Func02

; ───────────────────────────────────────────────────────────────────────────
; спрайты звёздочек, 5 штук
; ширина 2 байта, высота 9 строк
StarSpr0:       .word 0 ; нет звезды
                .word 0
                .word 0
                .word 0
                .word 0
                .word 0
                .word 0
                .word 0
                .word 0
StarSpr1:       .word ^B0000000000000000
                .word ^B0000000000000000
                .word ^B0000000000000000
                .word ^B0000000100000000
                .word ^B0000000100000000
                .word ^B0000000100000000
                .word ^B0000000000000000
                .word ^B0000000000000000
                .word ^B0000000000000000
StarSpr2:       .word ^B0000000000000000
                .word ^B0000000000000000
                .word ^B0000000100000000
                .word ^B0000000100000000
                .word ^B0000010101000000
                .word ^B0000000100000000
                .word ^B0000000100000000
                .word ^B0000000000000000
                .word ^B0000000000000000
StarSpr3:       .word ^B0000000000000000
                .word ^B0000000100000000
                .word ^B0000000100000000
                .word ^B0000010101000000
                .word ^B0001010101010000
                .word ^B0000010101000000
                .word ^B0000000100000000
                .word ^B0000000100000000
                .word ^B0000000000000000
StarSpr4:       .word ^B0000000100000000
                .word ^B0000000100000000
                .word ^B0000010101000000
                .word ^B0000010101000000
                .word ^B0101010101010100
                .word ^B0000010101000000
                .word ^B0000010101000000
                .word ^B0000000100000000
                .word ^B0000000100000000
StarSprLen = StarSpr1 - StarSpr0    ; размер спрайта в байтах
; массив звёзд в игре
GameStars:      .word 17.               ; количество элементов в массиве
                .word StarSpr4, 50050   ; спрайт, адрес
                .word StarSpr3, 43066
                .word StarSpr2, 52010
                .word StarSpr1, 55066
                .word StarSpr0, 51036
                .word StarSpr1, 43005
                .word StarSpr2, 63412
                .word StarSpr3, 66071
                .word StarSpr4, 55030
                .word StarSpr3, 57060
                .word StarSpr2, 44045
                .word StarSpr1, 46016
                .word StarSpr0, 70020
                .word StarSpr1, 63034
                .word StarSpr2, 54054
                .word StarSpr3, 70247
                .word StarSpr4, 60000

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

; Прорисовка мигающих звёздочек
; Вход: R2 - адрес блока параметров:
;            .word число элементов (пар адресов)
;            .word адрес спрайта в памяти
;            .word адрес экрана

Func04:         mov     (R2)+, R4       ; количество элементов

1$:             mov     (R2)+, R0       ; адрес спрайта текущего элемента
                mov     #9., R3         ; высота
                mov     (R2), R1        ; адрес экрана, куда выводить

2$:             mov     #2, R5          ; ширина

3$:             cmpb    (R0)+, (R1)     ; на экране данные совпадают?
                bne     4$
                clrb    (R1)            ; да - стираем спрайт

4$:             inc     R1
                sob     R5, 3$
                add     #76, R1
                sob     R3, 2$          ; и так весь спрайт
                mov     (PC)+, R0       ; адрес нового спрайта
5SprAddr$:      .word StarSpr3

                mov     R0, -(R2)       ; сохраним в таблице
                tst     (R2)+
                tst     (PC)+           ; звезда увеличивается?
6StarDirect$:   .word 0                 ; флаг - увеличивать звезду или уменьшать
                beq     8$              ; да
                cmp     #StarSpr0, R0   ; нет - уменьшается, а уменьшаться есть куда?
                bne     7$              ; есть ещё
                add     #StarSprLen, 5SprAddr$   ; нет - начинаем увеличиваться
                com     6StarDirect$    ; задаём флаг увеличения
                br      10$             ; вот ваще нерационально, этот код же уже есть ниже
; ───────────────────────────────────────────────────────────────────────────

7$:             sub     #StarSprLen, 5SprAddr$   ; уменьшаем - переходим к предыдущему спрайту
                br      10$
; ───────────────────────────────────────────────────────────────────────────

8$:             cmp     #StarSpr4, R0   ; увеличиваться есть куда?
                bne     9$        ; да
                sub     #<StarSprLen*2>, 5SprAddr$   ; нет - пора уменьшаться
                com     6StarDirect$    ; задаём флаг уменьшения

9$:             add     #StarSprLen, 5SprAddr$   ; переходим к следующему спрайту

10$:            mov     (R2)+, R1       ; адрес экрана
                mov     #9., R3         ; теперь выведем его на пустое место

11$:            mov     #2, R5

12$:            tstb    (R1)
                bne     13$
                movb    (R0), (R1)

13$:            inc     R1
                inc     R0
                sob     R5, 12$
                add     #76, R1
                sob     R3, 11$
                sob     R4, 1$    ; и так всю таблицу
                return
; End of function Func04

; ───────────────────────────────────────────────────────────────────────────
; тут графические данные:
; Спрайт земли, ; ширина 40 байтов, высота 33
GroundSprite:   .word 0, 0, 0, 0, 1777, 0, 170000, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100000
                .word 5042, 0, 124000, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120000, 24250, 25000, 125000, 242
                .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124000, 121252, 121200, 125200, 1212, 0, 0, 0, 0
                .word 0, 0, 0, 0, 0, 0, 0, 125000, 25252, 105052, 125242, 5052, 0, 0, 0, 0, 0, 0, 0, 0
                .word 0, 0, 176000, 125217, 105250, 24252, 125212, 24252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125000, 25050
                .word 121242, 121252, 125050, 101042, 12, 0, 0, 0, 0, 1760, 0, 0, 0, 0, 125200, 104242, 124212, 105252, 24242, 125210
                .word 50, 0, 0, 0, 0, 5050, 0, 0, 0, 0, 25240, 121212, 125052, 25252, 101212, 105250, 242, 0, 0, 0
                .word 0, 121202, 12, 0, 0, 0, 125250, 125050, 124242, 125252, 104050, 25252, 1212, 0, 0, 0, 100000, 124252, 242, 0
                .word 2, 0, 125252, 124242, 121212, 125252, 124202, 125252, 5050, 0, 0, 0, 120200, 105212, 5042, 100000, 10, 104000, 124252, 121212
                .word 105052, 105252, 125210, 125252, 24242, 0, 0, 0, 105250, 21042, 121052, 120000, 242, 25000, 125052, 105052, 24252, 20242, 252, 121252
                .word 121212, 2, 0, 0, 25012, 125252, 21252, 20012, 5012, 125200, 105240, 24252, 121252, 125010, 125012, 105240, 5052, 52, 0, 101000
                .word 124252, 1250, 21252, 124242, 120252, 121242, 121212, 121252, 125250, 25250, 124240, 25012, 124252, 52240, 52525, 105205, 121252, 124242, 125250, 125042
                .word 5012, 105010, 124052, 105212, 5242, 100252, 125252, 100250, 121252, 45012, 52525, 24241, 105252, 105012, 125202, 101052, 125242, 124202, 101250, 25242
                .word 120242, 125202, 125252, 25252, 105012, 20252, 52524, 125250, 125250, 25240, 125052, 121252, 25250, 125250, 25242, 125250, 125012, 125252, 1002, 125252
                .word 1240, 125240, 12402, 105252, 25242, 125252, 120240, 125252, 125252, 104252, 120012, 25002, 121240, 452, 52525, 125001, 52532, 405, 102652, 25052
                .word 105212, 125252, 105212, 125212, 1052, 125240, 5252, 100252, 25252, 52500, 52525, 525, 55240, 52525, 122401, 124212, 450, 125250, 1252, 120002
                .word 52500, 1005, 125252, 125240, 41240, 52525, 52525, 52525, 50005, 52525, 2525, 125252, 52502, 125201, 52412, 2525, 52525, 52525, 124001, 101212
                .word 52052, 52525, 52525, 52525, 52525, 52525, 52525, 25240, 52524, 425, 52520, 52525, 52525, 52525, 525, 125250, 50050, 52525, 52525, 52525
                .word 52525, 52525, 52525, 40005, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 125001, 5242, 52520, 52525, 52525, 52525, 52525, 52525, 52525
                .word 52525, 52525, 52525, 52525, 52525, 52525, 52525, 100125, 124252, 40012, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525
                .word 52525, 52525, 52525, 12525, 125200, 65252, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525
                .word 425, 40001, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525, 52525

; Платформа, ширина 10, высота 36
PlatformSprite: .byte 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 360, 0, 0, 74, 0, 0
                .byte 0, 0, 300, 377, 377, 17, 0, 0
                .byte 0, 0, 0, 307, 117, 3, 0, 0
                .byte 0, 0, 0, 34, 321, 0, 0, 0
                .byte 0, 0, 0, 360, 74, 0, 0, 0
                .byte 0, 0, 0, 300, 15, 0, 0, 0
                .byte 0, 0, 0, 300, 14, 0, 0, 0
                .byte 0, 0, 0, 360, 77, 0, 0, 0
                .byte 0, 0, 0, 160, 67, 0, 0, 0
                .byte 0, 0, 0, 60, 61, 0, 0, 0
                .byte 0, 0, 0, 160, 64, 0, 0, 0
                .byte 0, 0, 0, 374, 375, 0, 0, 0
                .byte 0, 0, 0, 354, 357, 0, 0, 0
                .byte 0, 0, 0, 214, 310, 0, 0, 0
                .byte 0, 0, 0, 54, 342, 0, 0, 0
                .byte 0, 0, 0, 213, 210, 3, 0, 0
                .byte 0, 0, 0, 43, 42, 3, 0, 0
                .byte 0, 0, 300, 277, 370, 17, 0, 0
                .byte 0, 0, 77, 376, 377, 362, 3, 0
                .byte 0, 377, 210, 310, 217, 210, 374, 3
                .byte 300, 42, 42, 42, 42, 42, 42, 16
                .byte 0, 377, 213, 310, 217, 210, 377, 3
                .byte 0, 0, 374, 62, 62, 376, 0, 0
                .byte 0, 0, 0, 277, 370, 3, 0, 0
                .byte 0, 0, 0, 300, 16, 0, 0, 0
                .byte 0, 0, 0, 300, 14, 0, 0, 0
                .byte 0, 0, 0, 300, 16, 0, 0, 0
                .byte 0, 0, 0, 0, 3, 0, 0, 0
PlatformSprEnd:
PlatformSprLen = PlatformSprEnd - PlatformSprite
PlatformSprH = 36
PlatformSprW = 10
PlatformSprPitch = 100 - PlatformSprW

; Маска платформы, ширина 10, высота 36
PlatformSprMask:.byte 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 0, 0, 0, 0, 0, 0
                .byte 0, 0, 360, 0, 0, 74, 0, 0
                .byte 0, 0, 300, 377, 377, 17, 0, 0
                .byte 0, 0, 0, 377, 377, 3, 0, 0
                .byte 0, 0, 0, 374, 377, 0, 0, 0
                .byte 0, 0, 0, 360, 77, 0, 0, 0
                .byte 0, 0, 0, 300, 17, 0, 0, 0
                .byte 0, 0, 0, 300, 17, 0, 0, 0
                .byte 0, 0, 0, 360, 77, 0, 0, 0
                .byte 0, 0, 0, 360, 77, 0, 0, 0
                .byte 0, 0, 0, 360, 77, 0, 0, 0
                .byte 0, 0, 0, 360, 77, 0, 0, 0
                .byte 0, 0, 0, 374, 377, 0, 0, 0
                .byte 0, 0, 0, 374, 377, 0, 0, 0
                .byte 0, 0, 0, 374, 377, 0, 0, 0
                .byte 0, 0, 0, 374, 377, 0, 0, 0
                .byte 0, 0, 0, 377, 377, 3, 0, 0
                .byte 0, 0, 0, 377, 377, 3, 0, 0
                .byte 0, 0, 300, 377, 377, 17, 0, 0
                .byte 0, 0, 377, 377, 377, 377, 3, 0
                .byte 0, 377, 377, 377, 377, 377, 377, 3
                .byte 300, 377, 377, 377, 377, 377, 377, 17
                .byte 0, 377, 377, 377, 377, 377, 377, 3
                .byte 0, 0, 374, 377, 377, 377, 0, 0
                .byte 0, 0, 0, 377, 377, 3, 0, 0
                .byte 0, 0, 0, 300, 17, 0, 0, 0
                .byte 0, 0, 0, 300, 17, 0, 0, 0
                .byte 0, 0, 0, 300, 17, 0, 0, 0
                .byte 0, 0, 0, 0, 3, 0, 0, 0

; Воздушный шар, ширина 4, высота 34
BallonSprite:   .byte 0, 274, 27, 0
                .byte 300, 277, 127, 1
                .byte 360, 257, 137, 5
                .byte 374, 253, 177, 25
                .byte 374, 253, 376, 25
                .byte 377, 253, 376, 125
                .byte 377, 252, 376, 127
                .byte 377, 252, 372, 127
                .byte 377, 252, 372, 127
                .byte 377, 252, 376, 127
                .byte 377, 253, 376, 125
                .byte 377, 253, 376, 125
                .byte 374, 253, 177, 25
                .byte 364, 257, 137, 25
                .byte 304, 277, 127, 21
                .byte 4, 275, 127, 20
                .byte 20, 1, 100, 4
                .byte 20, 4, 20, 4
                .byte 20, 4, 20, 4
                .byte 100, 4, 20, 1
                .byte 100, 360, 17, 1
                .byte 100, 257, 372, 1
                .byte 0, 377, 377, 0
                .byte 0, 376, 277, 0
                .byte 0, 256, 252, 0
                .byte 0, 376, 257, 0
                .byte 0, 256, 272, 0
                .byte 0, 374, 57, 0
BallonSprEnd:
BallonSprLen = BallonSprEnd - BallonSprite  ; размер спрайта воздушного шара
BallonSprH = 34
BallonSprW = 4
BallonSprPitch = 100 - BallonSprW


; Маска воздушного шара, ширина 4, высота 34
BallonSprMask:  .byte 0, 374, 77, 0
                .byte 300, 377, 377, 3
                .byte 360, 377, 377, 17
                .byte 374, 377, 377, 77
                .byte 374, 377, 377, 77
                .byte 377, 377, 377, 377
                .byte 377, 377, 377, 377
                .byte 377, 377, 377, 377
                .byte 377, 377, 377, 377
                .byte 377, 377, 377, 377
                .byte 377, 377, 377, 377
                .byte 377, 377, 377, 377
                .byte 374, 377, 377, 77
                .byte 374, 377, 377, 77
                .byte 314, 377, 377, 63
                .byte 14, 377, 377, 60
                .byte 60, 3, 300, 14
                .byte 60, 14, 60, 14
                .byte 60, 14, 60, 14
                .byte 300, 14, 60, 3
                .byte 300, 360, 17, 3
                .byte 300, 377, 377, 3
                .byte 0, 377, 377, 0
                .byte 0, 377, 377, 0
                .byte 0, 377, 377, 0
                .byte 0, 377, 377, 0
                .byte 0, 377, 377, 0
                .byte 0, 374, 77, 0
; спрайт нижней границы экрана, ширина 4, высота 21 (включая нижний спрайт)
Block2Sprite:   .byte 356, 340, 356, 356
                .byte 73, 270, 273, 273
                .byte 16, 356, 356, 356
                .byte 203, 273, 273, 273
                .byte 340, 356, 356, 356
                .byte 0, 0, 0, 0
                .byte 270, 273, 273, 73
                .byte 356, 356, 356, 16
                .byte 273, 273, 273, 203
                .byte 356, 356, 356, 340
                .byte 273, 273, 73, 270
                .byte 0, 0, 0, 0
; Кирпичик, используется как нижняя и верхняя граница в заставке
; ширина 4, высота 5
BlockSprite:    .byte 273, 273, 73, 273
                .byte 356, 356, 56, 356
                .byte 273, 273, 73, 273
                .byte 356, 356, 56, 356
                .byte 273, 273, 73, 273

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

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

Func06:         mov     #100, R4        ; ширина экрана
                sub     R3, R4          ; pitch
                mov     R3, 06.Width$
                mov     R4, 06.Pitch$

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

2$:             bisb    (R0)+, (R1)+
                sob     R3, 2$
                add     (PC)+, R1
06.Pitch$:      .word 74

                sob     R2, 1$
                return
; End of function Func06


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

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

Func10:         mov     #100, R4
                sub     R3, R4
                mov     R3, 10.Width$
                mov     R4, 10.Pitch$

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

2$:             bicb    (R0)+, (R1)+
                sob     R3, 2$
                add     (PC)+, R1
10.Pitch$:      .word 70

                sob     R2, 1$
                return
; End of function Func10


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

; Вывод на экран платформы для воздушного шара
; Вход: R1 - адрес экрана
;       R2 - масштаб по высоте

Func12:         mov     #3, R5
                mov     R2, 12.ScaleY$
                mov     #PlatformSprite, R0 ; спрайт
                mov     #PlatformSprMask, R4 ; маска
                mov     #7, R2          ; размер немасштабируемого блока линий

1$:             mov     #PlatformSprW, R3 ; ширина

2$:             bicb    (R4)+, (R1)
                bisb    (R0)+, (R1)+
                sob     R3, 2$          ; выводим одну линию
                add     #PlatformSprPitch, R1
                sob     R2, 1$          ; выводим блок линий
                tst     R5
                beq     6$
                mov     (PC)+, R2
12.ScaleY$:     .word 37
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     #2, R3          ; размер блока линий

4$:             mov     R5, @#340       ; сохраним R5
                mov     #PlatformSprW, R5         ; ширина

5$:             bicb    (R4)+, (R1)
                bisb    (R0)+, (R1)+
                sob     R5, 5$          ; выводим одну линию
                mov     @#340, R5       ; восстановим R5
                add     #PlatformSprPitch, R1
                sob     R3, 4$          ; выводим блок из двух линий
                sub     #20, R0         ; возвращаемся в начало блока
                sub     #20, R4
                sob     R2, 3$          ; повторяем сколько надо
                mov     #4, R2          ; размер немасштабируемого блока линий
                sob     R5, 1$          ; и так 3 раза
                mov     #17, R2         ; затем такой размер немасштабируемого блока линий
                br      1$              ; и повторяем
; ───────────────────────────────────────────────────────────────────────────

6$:             return
; End of function Func12


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

; Звучание тонального набора
; Вход: R3 - адрес тонального набора - цепочка пар слов
;            .word длительность (0 - конец цепочки),
;            .word тон.

Func14:         mov     (R3)+, R0       ; берём очередную длительность
                beq     2$              ; 0 - конец
                mov     (R3)+, R1       ; берём очередной тон

1$:             mov     R1, R2          ; в счётчик
                clr     @#177716        ; 0

                sob     R2, .           ; пауза
                mov     #100, @#177716  ; 1
                mov     R1, R2          ; в счётчик

                sob     R2, .           ; пауза
                sob     R0, 1$          ; звучим сколько надо
                br      Func14          ; и продолжим
; ───────────────────────────────────────────────────────────────────────────

2$:             return
; End of function Func14

; ───────────────────────────────────────────────────────────────────────────
Melody3$:       .word 1, 100
                .word 0
                .word 140, 100
                .word 140, 200
                .word 0

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

; Проверка на нажатие клавиши или кнопки джойстика, если нажата - выход

Func16:         nop
                .word   FUNC$ + 56      ; Получение в R2 <- адрес массива звёзд в игре GameStars
                                        ; и небольшая задержка
                .word   FUNC$ + 4       ; Прорисовка мигающих звёздочек
                                        ; Вход: R2 - адрес блока параметров:
                                        ;            .word число элементов (пар адресов)
                                        ;            .word адрес спрайта в памяти
                                        ;            .word адрес экрана
                tst     @#177714        ; джойстик нажат?
                bne     1$              ; да - выход
                cmp     #100250, @#177716 ; Вот по этой причине игра не работает на БК11
                bmi     2$              ; клавиша не нажата - переход
                                        ; нажата - выход
1$:             return
; ───────────────────────────────────────────────────────────────────────────

2$:             br      Func16          ; и начнём сначала
; End of function Func16


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

; Вывод звёзд в игре

Func20:         mov     #GameStars, R2  ; массив звёзд в игре
                .word   FUNC$ + 4       ; Прорисовка мигающих звёздочек
                                        ; Вход: R2 - адрес блока параметров:
                                        ;            .word число элементов (пар адресов)
                                        ;            .word адрес спрайта в памяти
                                        ;            .word адрес экрана
                return
; End of function Func20


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

; Стирание спрайта с экрана безусловное
; Вход: R1 - адрес экрана
;       R2 - высота спрайта
;       R3 - ширина спрайта в байтах

Func22:         mov     #100, R4
                sub     R3, R4
                mov     R3, 22.Width$
                mov     R4, 22.Pitch$

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

2$:             clrb    (R1)+
                sob     R3, 2$
                add     (PC)+, R1
22.Pitch$:      .word 74

                sob     R2, 1$
                return
; End of function Func22


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

; Анимация огня горелки воздушного шара

Func24:         mov     @#BallonAddr, R1
                add     #2101, R1       ; адрес экрана
                mov     #SpriteFlame, R0  ; адрес спрайта
                mov     #3, R2          ; высота
                mov     #2, R3          ; ширина, байт
                com     #0
                beq     1$
                add     #6, R0
1$:             .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                return
; End of function Func24

; ───────────────────────────────────────────────────────────────────────────
; какая-то рогулька, тут 2 спрайта, предположительно это огонь горелки воздушного шара
; ширина 2, высота 3

SpriteFlame:      .word ^B0000110000110000
                .word ^B0000110000110000
                .word ^B0000111111110000
                .word ^B0000001111000000
                .word ^B0000001111000000
                .word ^B0000111111110000

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

; Анимация воздушных потоков
; Вход: R3 - адрес блока параметров

Func26:         mov     #5, R5
                mov     #1, @#AirFlowDir ; направление движения, -1 - влево экрана, 1 - вправо

1$:             mov     #2, R4

2$:             mov     (R3), R1        ; берём адрес экрана
                mov     R1, R2
                bic     #177700, R2     ; получим положение в линии
                bne     4$              ; не в начале - переход
                cmp     #-1, @#AirFlowDir ; чё тама?
                bne     4$              ; не -1 - переход
                bis     #77, (R3)       ; иначе будет в конце линии

3$:             tst     (R3)+           ; перемещаемся к параметрам
                br      6$
; ───────────────────────────────────────────────────────────────────────────

4$:             cmp     #77, R2         ; в конце линии?
                bne     5$              ; нет, где то посередине
                cmp     #1, @#AirFlowDir ; чё тама?
                bne     5$              ; не 1 - переход
                bic     #77, (R3)       ; иначе будет в начале линии
                br      3$              ; и туда
; ───────────────────────────────────────────────────────────────────────────

5$:             add     @#AirFlowDir, (R3)+ ; продолжим движение

6$:             mov     #4, R2          ; за адресом 4 параметра - байта

7$:             clrb    (R1)+           ; очищаем место в экране
                cmpb    #1, (R3)        ; параметр == 1?
                bne     8$              ; нет
                add     #200, R1        ; да - адрес экрана вниз
                br      9$
; ───────────────────────────────────────────────────────────────────────────

8$:             cmpb    #2, (R3)        ; параметр == 2?
                bne     9$              ; нет
                sub     #200, R1        ; да - адрес экрана вверх

9$:             inc     R3              ; к следующему параметру
                sob     R2, 7$          ; и так все 4 осмотрим
                sob     R4, 2$          ; обработать пару
                neg     @#AirFlowDir    ; смена направления движения
                sob     R5, 1$          ; и так все 5 пар
                sub     #74, R3         ; это размер массива параметров,
                                        ; возвращаемся к началу
                mov     #10., R4        ; в массиве 10 элементов

10$:            mov     (R3)+, R1       ; берём адрес
                mov     #4, R2          ; 4 параметра

11$:            movb    #273, (R1)+     ; рисуем на экране
                movb    @#177710, (R3)  ; в параметр псевдо случайное число
                bicb    #375, (R3)
                beq     13$             ; получился 0 - ничего не делать
                cmpb    #1, (R3)        ; 1?
                bne     12$             ; нет
                add     #200, R1        ; адрес вниз
                br      13$
; ───────────────────────────────────────────────────────────────────────────

12$:            sub     #200, R1        ; иначе адрес вверх

13$:            inc     R3              ; следующий параметр
                sob     R2, 11$         ; обработать все 4
                sob     R4, 10$         ; обработать весь массив
                return
; End of function Func26

; ───────────────────────────────────────────────────────────────────────────
; массив параметров, в массиве 10. элементов:
; .word адрес экрана
; .byte n,n,n,n - 4 байта
AirFlowData:    .word 40407             ; адрес воздушного потока
                .byte 2, 0, 2, 0        ; параметры
                .word 43047
                .byte 2, 0, 2, 0
                .word 45002
                .byte 2, 0, 2, 0
                .word 47056
                .byte 2, 0, 0, 2
                .word 51030
                .byte 0, 2, 0, 2
                .word 53076
                .byte 0, 2, 0, 2
                .word 55021
                .byte 0, 2, 0, 0
                .word 57063
                .byte 2, 0, 2, 0
                .word 61035
                .byte 2, 0, 2, 0
                .word 64001
                .byte 2, 0, 2, 0

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

; Спецэффект бегущей волны искажения на экране

Func30:         mov     #14, R4         ; тон звука
                mov     #37, R5
                mov     #40000, R0
                mov     #2, R1

                .word   FUNC$ + 32      ; Вспомогательная функция функции 30
                                        ; Вход: R0 - адрес экрана
                                        ;       R1 - ширина в байтах
                                        ;       R4 - тон звука
                tst     (R1)+

1$:             .word   FUNC$ + 32      ; Вспомогательная функция функции 30
                                        ; Вход: R0 - адрес экрана
                                        ;       R1 - ширина в байтах
                                        ;       R4 - тон звука
                tst     (R0)+
                sob     R5, 1$
                tst     -(R1)

                .word   FUNC$ + 32      ; Вспомогательная функция функции 30
                                        ; Вход: R0 - адрес экрана
                                        ;       R1 - ширина в байтах
                                        ;       R4 - тон звука
                return
; End of function Func30


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

; Вспомогательная функция функции 30
; Вход: R0 - адрес экрана
;       R1 - ширина в байтах
;       R4 - тон звука

Func32:         mov     #100, R2        ; ширина экрана
                sub     R1, R2          ; pitch
                ror     R1
                mov     R2, 32.Pitch$
                mov     R1, 32.WidthW$
                mov     #400, R2        ; высота - весь экран

1$:             mov     (PC)+, R1
32.WidthW$:     .word 1

2$:             swab    (R0)+
                sob     R1, 2$
                add     (PC)+, R0
32.Pitch$:      .word 76

                mov     #177716, R5
                mov     R4, R3
                clr     (R5)

                sob     R3, .
                mov     #100, (R5)
                mov     R4, R3

                sob     R3, .
                sob     R2, 1$
                return
; End of function Func32

; ───────────────────────────────────────────────────────────────────────────
; Луна, ширина 3, высота 23
MoonSprite:     .byte 0, 0, 0
                .byte 300, 77, 0
                .byte 374, 377, 3
                .byte 17, 377, 17
                .byte 0, 360, 17
                .byte 0, 300, 77
                .byte 0, 300, 77
                .byte 0, 300, 77
                .byte 0, 0, 377
                .byte 0, 0, 377
                .byte 0, 0, 377
                .byte 0, 0, 377
                .byte 0, 300, 77
                .byte 0, 300, 77
                .byte 0, 300, 77
                .byte 0, 360, 17
                .byte 17, 377, 17
                .byte 374, 377, 3
                .byte 300, 77, 0
MoonSpriteEnd:  .even
MoonSprLen = MoonSpriteEnd - MoonSprite
MoonSprH = 23
MoonSprW = 3
MoonSprPitch = 100 - MoonSprW

; движения луны
; первый параметр - количество движений, второй - приращение адреса
MoonMovParam:   .word 11, 177377    ; подъём
                .word 26, 177777    ; горизонтально
                .word 25, 377       ; спуск

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

; Инициализация обходов Луны и функция 42

Func34:         nop
                mov     #20., @#MoonPass
; End of function Func34


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

; Инициализация яч. MoonAddr, MoonMovPPtr

Func42:         mov     #MoonMovParam, R0
                mov     #3, R1

1$:             mov     #25, (R0)+
                tst     (R0)+
                sob     R1, 1$
                inc     @#MoonMovParam+4
                mov     #MoonMovParam, @#MoonMovPPtr
                mov     #72276, @#MoonAddr
                return
; End of function Func42


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

; Очистка со сравнением, экран очищается только там, где спрайт совпадает
; Вход: R0 - адрес спрайта в памяти
;       R1 - адрес экрана
;       R2 - высота спрайта
;       R3 - ширина спрайта в байтах

Func36:         mov     #100, R4
                sub     R3, R4
                mov     R4, 36.Pitch$
                mov     R3, 36.Width$

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

2$:             cmpb    (R0)+, (R1)
                bne     3$
                clrb    (R1)

3$:             inc     R1
                sob     R3, 2$
                add     (PC)+, R1
36.Pitch$:      .word 75

                sob     R2, 1$
                return
; End of function Func36


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

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

Func40:         mov     #100, R4
                sub     R3, R4
                mov     R4, 40.Pitch$
                mov     R3, 40.Width$

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

2$:             tstb    (R1)
                bne     3$
                movb    (R0), (R1)

3$:             inc     R0
                inc     R1
                sob     R3, 2$
                add     (PC)+, R1
40.Pitch$:      .word 75

                sob     R2, 1$
                return
; End of function Func40


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

; Инициализация яч. FinishAddr и функция 46

Func44:         mov     #67137, @#FinishAddr
; End of function Func44


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

; Очистка буфера BalScrBuffer

Func46:         mov     #BalScrBuffer, R0
                mov     #<BallonSprW * BallonSprH> / 2, R1

1$:             clr     (R0)+
                sob     R1, 1$
                return
; End of function Func46

; ───────────────────────────────────────────────────────────────────────────
NextStartStage1.2$:
                .word   FUNC$ + 64      ; Инициализация счёта
                nop
                nop
                .word   FUNC$ + 2       ; Инициализация некоторых переменных драйвера экрана
                .word   FUNC$ + 0       ; Очистка экрана диагонально зубчатыми линиями
; рисуем землю
                mov     #GroundSprite, R0 ; адрес спрайта
                mov     #71203, R1      ; адрес экрана
                mov     #33, R2         ; высота спрайта
                mov     #40, R3         ; ширина спрайта в байтах
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #40, R1         ; и ещё раз
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
; рисуем море
                add     #3237, R1
                mov     #477, R0        ; теперь заполняем синим

1$:             mov     #52525, (R1)+
                sob     R0, 1$
                mov     #20, R4         ; потом замостим низ экрана
; рисуем нижнюю границу
2$:             mov     #Block2Sprite, R0
                mov     #21, R2
                mov     #4, R3
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #4, R1
                sob     R4, 2$
                mov     #72500, R0
                mov     #SpriteBuffer, R1 ; сохраняем часть экрана в буфере
                mov     #44, R2

3$:             mov     #PlatformSprW/2, R3

4$:             mov     (R0)+, (R1)+
                sob     R3, 4$
                add     #PlatformSprPitch, R0
                sob     R2, 3$
; подымаем платформу с шаром вверх
                mov     #35, R5
                mov     #71200, R1
                mov     #3, R2

5$:             mov     #Melody3$, R3
                .word   FUNC$ + 14      ; Звучание тонального набора
                                        ; Вход: R3 - адрес тонального набора - цепочка пар слов
                                        ;            .word длительность (0 - конец цепочки),
                                        ;            .word тон.
                mov     R2, R4
                mov     #PlatformSprMask, R0
                mov     #7, R2
                mov     #PlatformSprW, R3
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                sub     #3176, R1
                mov     #BallonSprMask, R0
                mov     #BallonSprH, R2
                mov     #BallonSprW, R3
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     #BallonSprite, R0
                sub     #600, R1
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #3176, R1
                mov     #3736, R0
                mov     R4, R2
                inc     R2
                .word   FUNC$ + 12      ; Вывод на экран платформы для воздушного шара
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
                .word   FUNC$ + 20      ; Вывод звёзд в игре
                sob     R5, 5$
; ───────────────────────────────────────────────────────────────────────────
                .word   FUNC$ + 16      ; Проверка на нажатие клавиши или кнопки джойстика, если нажата - выход
                .word   FUNC$ + 34      ; Инициализация обходов Луны и Инициализация яч. MoonAddr, MoonMovPPtr
                .word   FUNC$ + 44      ; Инициализация яч. FinishAddr и Очистка буфера BalScrBuffer
                .word   FUNC$ + 30      ; Спецэффект бегущей волны искажения на экране
; ───────────────────────────────────────────────────────────────────────────
                mov     #40202, @#BallonAddr ; адрес вывода спрайта воздушного шара
                call    @#100           ; !!! а вот и секретная часть, без которой тут будет кирдык
                                        ; там очищается яч. FirePower и инициализируется фоновая музыка
                mov     #72537, @#PlatformFinishAddr
                mov     #5, PlatfScaleYUp$  ; на сколько подымать платформу
                mov     #37, PlatfMoveRt$   ; на сколько двигать вправо платформу
                mov     #37, PlatfScaleYDn$ ; на сколько опускать платформу
                mov     #43400, @#PlatformStartAddr

LoopGCBig$:     ; большой цикл игры, с охватом начальных анимаций
; тут платформа опускается, после того как шар стартанул
                tst     (PC)+           ; высота платформы
PlatfScaleYDn$: .word 21
                beq     4$
                mov     @#PlatformStartAddr, R1 ; берём текущий адрес платформы
                mov     #PlatformSprMask, R0
                mov     #11, R2
                mov     #3, R4

1$:             mov     #PlatformSprW, R3
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
2$:             add     #100, R1
                add     #PlatformSprW, R0
                sob     R2, 2$
                tst     (R1)+
                mov     (R1), R3

3$:             add     #200, R1
                cmp     (R1), R3
                beq     3$
                tst     -(R1)
                mov     #4, R2
                sob     R4, 1$

                add     #600, @#PlatformStartAddr ; опускаем платформу
                mov     @#PlatformStartAddr, R1
                mov     #PlatformSprite, R0
                mov     PlatfScaleYDn$, R2
                .word   FUNC$ + 12      ; Вывод на экран платформы для воздушного шара
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
                dec     PlatfScaleYDn$  ; уменьшаем высоту платформы
                br      10$             ; тем временем, продолжается игра
; ───────────────────────────────────────────────────────────────────────────
; тут платформа движется вправо, после того как опустится
4$:             tst     (PC)+           ; сколько двигать вправо
PlatfMoveRt$:   .word 37
                beq     9$
                mov     #72537, R1
                sub     PlatfMoveRt$, R1
                mov     #SpriteBuffer, R0 ; восстановим сохранённую ранее часть экрана
                mov     #44, R2

5$:             mov     #PlatformSprW, R3

6$:             movb    (R0)+, (R1)+
                sob     R3, 6$
                add     #PlatformSprPitch, R1
                sob     R2, 5$
                sub     #4377, R1       ; новый адрес
                mov     R1, R4
                mov     #SpriteBuffer, R0 ; сохраним новую часть экрана
                mov     #44, R2

7$:             mov     #PlatformSprW, R3

8$:             movb    (R1)+, (R0)+
                sob     R3, 8$
                add     #PlatformSprPitch, R1
                sob     R2, 7$
                mov     R4, R1          ;рисуем платформу на новом месте
                mov     #1, R2
                .word   FUNC$ + 12      ; Вывод на экран платформы для воздушного шара
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
                dec     PlatfMoveRt$
                br      10$             ; тем временем, продолжается игра
; ───────────────────────────────────────────────────────────────────────────
; тут платформа немного движется вверх
9$:             tst     (PC)+           ; сколько подымать вверх
PlatfScaleYUp$: .word 5

                beq     10$
                mov     @#PlatformFinishAddr, R1
                mov     #7, R2
                sub     PlatfScaleYUp$, R2
                mov     R2, R4
                dec     PlatfScaleYUp$
                mov     #PlatformSprMask, R0
                mov     #7, R2
                mov     #PlatformSprW, R3
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     R4, R2
                sub     #600, R1
                mov     R1, @#PlatformFinishAddr
                .word   FUNC$ + 12      ; Вывод на экран платформы для воздушного шара
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - масштаб по высоте

10$:            mov     #GameStars, R2  ; массив звёзд в игре
                .word   FUNC$ + 4       ; Прорисовка мигающих звёздочек
                                        ; Вход: R2 - адрес блока параметров:
                                        ;            .word число элементов (пар адресов)
                                        ;            .word адрес спрайта в памяти
                                        ;            .word адрес экрана

                mov     #FirePower, R1  ; адрес уровня горения горелки, 0..400 с шагом 20
                tst     @#177714        ; джойстик нажат?
                bne     11$             ; да - переход (любая кнопка джойстика - как горелка)
                mov     @#177716, R0    ; нет, а клавиша нажата?
                bic     #177677, R0     ; бля, самые извратные способы проверки придумывает
                bne     13$             ; нет
                cmp     @#KeyFire$, @#177662 ; да, нажали горелку?
                bne     13$             ; нет

11$:            cmp     #400, (R1)      ; максимум?
                beq     12$             ; да - делать нечего
                add     #20, (R1)       ; нет - ещё есть куда увеличивать

12$:            nop
                br      14$
; ───────────────────────────────────────────────────────────────────────────

13$:            nop                     ; ничо не нажато
                bic     #20, (R1)       ; уровень горелки падает
                tst     (R1)            ; упал до нуля?
                beq     14$             ; да - всё, некуда уменьшать
                sub     #40, (R1)       ; уменьшаем уровень горения горелки

14$:            mov     @#BallonAddr, R0 ; адрес вывода спрайта воздушного шара
                clr     R4
                bic     #170777, R0
                bne     17$

15$:            mov     #1, R5          ; тут вычисляется смещение к новому адресу воздушного шара
16$:            br      24$
; ───────────────────────────────────────────────────────────────────────────

17$:            cmp     #1000, R0       ; здесь определяем высоту,
                                        ; и по ней - смещение в воздушных потоках
                bne     19$
                com     #-1
                beq     18$
                br      15$
; ───────────────────────────────────────────────────────────────────────────

18$:            br      20$
; ───────────────────────────────────────────────────────────────────────────

19$:            cmp     #2000, R0
                bne     21$

20$:            clr     R5
                br      24$
; ───────────────────────────────────────────────────────────────────────────

21$:            cmp     #3000, R0
                bne     23$
                com     #-1
                beq     22$
                br      20$
; ───────────────────────────────────────────────────────────────────────────

22$:            mov     #-1, R5

23$:            sub     #4000, R0
                bne     24$
                mov     #-1, R5
                br      25$
; ───────────────────────────────────────────────────────────────────────────

24$:            neg     R5
                com     R4
                bne     16$

25$:            mov     @#FirePower, R4 ; адрес уровня горения горелки, 0..400 с шагом 20
                bic     #77, R4
                neg     R4              ; чем больше уровень
                add     R4, R5          ; тем выше поднимется шар
                add     #100, R5
                mov     @#BallonAddr, R0
                cmp     #40300, R0      ; достиг верхней границы?
                blt     26$             ; да
                bic     #177600, R5

26$:            cmp     #63000, R0      ; достигли нижней границы?
                bgt     27$             ; нет
                br      NextGameCycle7$ ; да - идём проверять сели или промахнулись
; ───────────────────────────────────────────────────────────────────────────
27$:            .word   FUNC$ + 46      ; Очистка буфера BalScrBuffer
                bic     #177700, R0     ; проверка на боковые границы экрана
                bne     28$             ; не дошли до левого
                bic     #76, R5         ; дошли - смещаться влево не будем

28$:            cmp     #74, R0         ; дошли до правого?
                bne     LoopGCMid$      ; нет
                bic     #1, R5          ; да - смещаться вправо не будем

LoopGCMid$:     mov     @#BallonAddr, R1 ; адрес вывода спрайта воздушного шара
                mov     #BallonSprite, R0
                mov     #BallonSprH, R2
                mov     #BallonSprW, R3
                .word   FUNC$ + 22      ; Стирание спрайта с экрана безусловное
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     R5, R1          ; новый адрес
                mov     R1, @#BallonAddr ; сохраняем
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
LoopGC$:        .word   FUNC$ + 52      ; функция ничего не делает
                .word   FUNC$ + 50      ; Вкл/выкл фоновой музыки
                .word   FUNC$ + 62      ; уменьшение счёта
                .word   FUNC$ + 112     ; Проверка на нажатие кнопки паузы
                                        ; и если да, то пауза
                jmp     @#NextGC1$
; ───────────────────────────────────────────────────────────────────────────

NextGC2$:       call    @#StoreRegs     ; сохраняем все регистры
                jmp     @#NextGC3$      ; пойдём обрабатывать доп условия верхних этапов
                                        ; но потом неизменно возвращаемся сюда
; ───────────────────────────────────────────────────────────────────────────
; обработка основных механик игры: луна, ветер, проверка на посадку.
ProcCommonDiffs$:call    @#RestoreRegs  ; восстанавливаем регистры
                .word   FUNC$ + 54      ; Если нажата клавиша горелки, делать анимацию огня горелки
                mov     #AirFlowData, R3
                .word   FUNC$ + 26      ; Анимация воздушных потоков
                ; обрабатываем луну
                tst     (PC)+
MoonMoves$:     .word 0                 ; общее количество движений луны по экрану
                bne     3$
                mov     #1, MoonMoves$
                mov     @#MoonMovPPtr, R0
                dec     (R0)+
                bne     2$
                cmp     #377, (R0)
                bne     1$
                nop
                br      5$
; ───────────────────────────────────────────────────────────────────────────

1$:             add     #4, R0

2$:             mov     (R0), @#MoonAddrIncr
                tst     -(R0)
                mov     R0, @#MoonMovPPtr
                ; передвигаем луну
3$:             mov     @#MoonAddr, R1
                mov     #MoonSprite, R0
                mov     #MoonSprH, R2
                mov     #MoonSprW, R3
                .word   FUNC$ + 36      ; Очистка со сравнением, экран очищается только там, где спрайт совпадает
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     @#MoonAddrIncr, R1
                clr     @#MoonAddrIncr
                mov     R1, @#MoonAddr
                .word   FUNC$ + 40      ; Вывод со сравнением, спрайт выводится только там, где на экране пусто
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                dec     MoonMoves$

4$:             mov     #word_11026, R3
                nop
                jmp     LoopGCBig$ ; продолжаем игру
; ───────────────────────────────────────────────────────────────────────────

5$:             .word   FUNC$ + 42      ; Инициализация яч. MoonAddr, MoonMovPPtr
                mov     #100, MoonMoves$
                dec     @#MoonPass      ; Луна прошла, уменьшаем счётчик ### заменить на tst для бессмертия
                beq     6$              ; всё, время вышло
                br      4$              ; нет - продолжаем
; ───────────────────────────────────────────────────────────────────────────

6$:             jmp     @#StageTimeOut
; ───────────────────────────────────────────────────────────────────────────

NextGameCycle7$:inc     R5              ; проверяем условие "Шар достиг уровня финишной платформы"
                bic     #277, R5
                bis     #100, R5
                cmp     #63300, R0
                blt     2$

1$:             br      LoopGCMid$
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     R0, R2
                add     #3375, R2
                call    @#FinishCheck   ; Проверка на удачное финиширование
                                        ; Вход: R2 - адрес спрайта воздушного шара
                br      3$
; ───────────────────────────────────────────────────────────────────────────
; !!! мёртвый код
                jmp     @#FinishStage$
; !!! мёртвый код --- end
; ───────────────────────────────────────────────────────────────────────────

3$:             add     #3, R2
                mov     #5, R1
                cmp     R2, @#FinishAddr
                bne     5$
                mov     #-1, R5

4$:             br      1$
; ───────────────────────────────────────────────────────────────────────────

5$:             dec     R2

6$:             cmp     R2, @#FinishAddr
                bne     8$
                bic     #100, R5

7$:             br      4$
; ───────────────────────────────────────────────────────────────────────────

8$:             dec     R2
                sob     R1, 6$
                cmp     R2, @#FinishAddr
                bne     10$
                mov     #1, R5

9$:             br      7$
; ───────────────────────────────────────────────────────────────────────────
                ; проверим, не опустился ли на уровень земли
10$:            cmp     #65600, R0
                blt     11$
                br      9$
; ───────────────────────────────────────────────────────────────────────────

11$:            cmp     #73000, R0
                bgt     12$
                bic     #100, R5
                nop
; ───────────────────────────────────────────────────────────────────────────
                .word   FUNC$ + 60      ; Выход: R0 - признак:
                                        ;       -1 - джойстик не нажат, и горелка не нажата
                                        ;       0 - джойстик нажат и ранее была нажата клавиша горелки
                                        ;       100250/100350 - ранее была нажата клавиша горелки, а джойстик не нажат
; ───────────────────────────────────────────────────────────────────────────
                bic     #177677, R0
                bne     20$
                ; тут прорисовка воздушного шара на фоне поверхности
12$:            mov     #BalScrBuffer, R0
                mov     @#BallonAddr, R1
                mov     #BallonSprH, R2

13$:            mov     #BallonSprW, R3

14$:            movb    (R0)+, (R1)+
                sob     R3, 14$
                add     #BallonSprPitch, R1
                sob     R2, 13$
                add     R5, @#BallonAddr
                mov     @#BallonAddr, R0
                mov     #BalScrBuffer, R1
                mov     #BallonSprH, R2

15$:            mov     #BallonSprW, R3

16$:            movb    (R0)+, (R1)+
                sob     R3, 16$
                add     #BallonSprPitch, R0
                sob     R2, 15$
                mov     @#BallonAddr, R1
                mov     #BallonSprMask, R0
                mov     #BallonSprH, R2
                mov     #BallonSprW, R3
; ───────────────────────────────────────────────────────────────────────────
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
; ───────────────────────────────────────────────────────────────────────────
                mov     #BallonSprite, R0

17$:            mov     #BallonSprW, R3

18$:            tstb    (R1)
                bne     19$
                bisb    (R0), (R1)

19$:            inc     R0
                inc     R1
                sob     R3, 18$
                add     #BallonSprPitch, R1
                sob     R2, 17$

20$:            jmp     LoopGC$         ; продолжаем игру
; ───────────────────────────────────────────────────────────────────────────
                .word 34
word_11026:     .word 125
                .word 0

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

; Вкл/выкл фоновой музыки

Func50:         tst     (PC)+
CheckBgMusic$:  .word 0
                bne     1$              ; не надо фоновую музыку
                mov     @#114, R0       ; !!! там число BackgrndMusic$ - адрес п/п фоновой музыки
                call    (R0)            ; звучим музыку
                                        ; вот и часть кода подготовщика вылезла
                br      2$
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     #30000, R0
                sob     R0, .

2$:             bit     #100, @#177716  ; клавиша нажата?
                bne     4$    ; нет
                mov     @#177662, R0    ; да, а какая?
                cmp     (PC)+, R0       ; РУС?
KeyMusicOn$:    .word 16
                bne     3$              ; нет
                clr     @#CheckBgMusic$ ; да - включаем музыку

3$:             cmp     (PC)+, R0       ; ЛАТ?
KeyMusicOff$:   .word 17
                bne     4$    ; нет

                mov     #17, @#CheckBgMusic$ ; да - выключаем музыку

4$:             return
; End of function Func50

; ───────────────────────────────────────────────────────────────────────────
; !!! --- мёртвый код (мусор)
                mov     (R2)+, (R2)
                sob     R0, .
                bne     KeyMusicOff$+6
                .word 16
                sub     #11111, R0
                bpl     10$
                add     #20775, R0

10$:            mov     R0, @#KeyMusicOff$+2
                return
; ───────────────────────────────────────────────────────────────────────────
                .word 0
; !!! --- мёртвый код --- end

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

;  Если нажата клавиша горелки, делать анимацию огня горелки

Func54:         mov     @#177716, R0
                bic     #177677, R0     ; клавиша нажата?
                bne     1$              ; нет
                cmp     @#KeyFire$, @#177662 ; да, нажата горелка?
                beq     2$              ; да

1$:             tst     @#177714        ; нет, а джойстик нажат?
                beq     3$              ; нет
                ; делать анимацию
2$:             .word   FUNC$ + 24      ; Анимация огня горелки воздушного шара
3$:             return
; End of function Func54

; ───────────────────────────────────────────────────────────────────────────
KeyFire$:       .word 40

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

; Получение в R2 <- адрес массива звёзд в игре GameStars
; и небольшая задержка

Func56:         mov     #GameStars, 10(SP) ; R2 <- адрес массива звёзд в игре
                mov     #33000, R1      ; задержка
                sob     R1, .
                return
; End of function Func56


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

; Выход: R0 - признак:
;       -1 - джойстик не нажат, и горелка не нажата
;       0 - джойстик нажат и ранее была нажата клавиша горелки
;       100250/100350 - ранее была нажата клавиша горелки, а джойстик не нажат

Func60:         mov     @#177716, R0    ; тут была проверка на нажатие клавиши?
                cmp     @#177662, @#KeyFire$ ; было когда-то нажато горение горелки?
                beq     1$              ; да
                mov     #-1, R0         ; нет

1$:             tst     @#177714        ; а джойстик нажат сейчас?
                beq     2$              ; нет
                clr     R0              ; да

2$:             mov     R0, 14(SP)      ; в R0 поместим признак
                return
; End of function Func60


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

; Кажется, уменьшение счёта

Func62:         mov     #<Score+3>, R0  ; начинаем отсюда

1$:             decb    (R0)            ; уменьшаем
                cmpb    #<'0 - 1 - 20>, (R0) ; стало меньше нуля?
                beq     2$              ; да, переходим к старшему разряду
                return                  ; нет - выходим
; ───────────────────────────────────────────────────────────────────────────

2$:             movb    #<'9 - 20>, (R0) ; в этом разряде теперь будет 9
                dec     R0              ; и переходим к более старшему разряду
                jmp     @#1$            ; продолжаем цикл
; End of function Func62


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

; Инициализация счёта

Func64:         mov     #1, @#MoonMoves$
                mov     #"00 - [20<<8.+20], @#Score + 2
                mov     #"25 - [20<<8.+20], @#Score ; счёт игры - 4 байта цифр, как обычно число '1'-20
                return
; End of function Func64

; ───────────────────────────────────────────────────────────────────────────
strReklama:     .asciz "РЕКЛАМА "
strReklamaEnd:  .even

Sound29$:       .word 10
                .word 200
                .word 1000
                .word 600
                .word 0

ReklColorTbl:   .word 177777
                .word 31463
                .word 125252
                .word 21042
                .word 52525
                .word 10421
                .word 167356
                .word 63146
                .word 73567
ReklColorTblEnd:.word 77520
; ───────────────────────────────────────────────────────────────────────────

FinishStage$:   .word   FUNC$ + 30      ; Спецэффект бегущей волны искажения на экране
                mov     #40000, R3
                mov     #5, R0
                mov     #77300, R4

1$:             inc     @#177664
                mov     #40, R2

2$:             mov     (R4)+, (R3)+
                sob     R2, 2$
                mov     #10000, R2
                sob     R2, .
                sob     R0, 1$
                mov     #42, R1

3$:             inc     @#177664
                mov     #40, R2

4$:             clr     (R3)+
                sob     R2, 4$
                mov     #10000, R2
                sob     R2, .
                sob     R1, 3$
                jmp     @#NextFinishStage$

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

; Вывод символа на экран
; Вход: R0 - адрес данных символа
;       R1 - адрес экрана

Func66:         mov     #10., R5

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

2$:             mov     #4, R3

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

4$:             sob     R3, 3$
                tst     (R1)+
                sob     R2, 2$
                add     #74, R1
                sob     R5, 1$
                return
; End of function Func66


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

; Вывод строки на экран через буфер и скроллинг
; Вход: R3 - адрес экрана
;       R4 - адрес строки текста

Func70:         mov     #CanScrBuffer, R1

1$:             movb    (R4)+, R5
                bic     #177400, R5
                beq     3$
                mov     #FONT - 240, R0

2$:             add     #10., R0        ; умножение на 10
                sob     R5, 2$
                .word   FUNC$ + 66      ; Вывод символа на экран
                                        ; Вход: R0 - адрес данных символа
                                        ;       R1 - адрес экрана
                add     #4, R1
                br      1$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     #12, R0
                mov     #CanScrBuffer, R1

4$:             mov     #40, R2

5$:             clr     (R3)+
                sob     R2, 5$
                sub     #100, R3
                inc     @#177664
                mov     #10000, R2
                sob     R2, .
                mov     #40, R2

6$:             mov     (R1)+, (R3)+
                sob     R2, 6$
                sob     R0, 4$
                return
; End of function Func70

; ───────────────────────────────────────────────────────────────────────────
strSuccess:     .asciz "    ВЫ УДАЧНО   "
                .asciz "    ЗАКОНЧИЛИ   "
                .asciz "    ЭТОТ ЭТАП   "
                .asciz "  С РЕЗУЛЬТАТОМ "
                .ascii "      "
Score:          .ascii "2486"           ; счёт игры - 4 байта цифр, как обычно число '1'-20
                .asciz "      "
                .asciz "   ПРИМИТЕ МОИ  "
                .asciz "  ПОЗДРАВЛЕНИЯ! "
strSuccessEnd:  .even
; ───────────────────────────────────────────────────────────────────────────

NextFinishStage$:
                mov     #7, R5
                mov     #strSuccess, R4
1$:             .word   FUNC$ + 70      ; Вывод строки на экран через буфер и скроллинг
                                        ; Вход: R3 - адрес экрана
                                        ;       R4 - адрес строки текста
                add     #21, R4
                add     #1200, R3
                mov     #20, R0

2$:             inc     @#177664
                mov     #40, R1

3$:             clr     (R3)+
                sob     R1, 3$
                mov     #10000, R1
                sob     R1, .

                sob     R0, 2$
                sob     R5, 1$
                mov     #36, R1

4$:             inc     @#177664
                mov     #40, R2

5$:             clr     (R3)+
                sob     R2, 5$
                mov     #10000, R2
                sob     R2, .

                sob     R1, 4$
                mov     #5, R1

6$:             inc     @#177664
                mov     #10000, R2
                sob     R2, .

                sob     R1, 6$
                mov     #200, R5
                mov     #40000, R0

7$:             movb    #167356, (R0)+
                add     #76, R0
                movb    #135673, (R0)+
                movb    #135673, (R0)+
                add     #76, R0
                movb    #167356, (R0)+
                sob     R5, 7$
                br      NextFinishStage1$

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

; Вывод звука с повышением тона
; Вход: R4 - адрес блока параметров
;       .word длит.
;       .word тон,тон,..., 0 - конец цепочки

Func72:         mov     (R4)+, 72.Tempo$ ; берём длительность
                mov     #177716, R3

1$:             mov     (PC)+, R5       ; длительность текущей ноты
72.Tempo$:     .word 50

                mov     (R4)+, R2       ; берём тон текущей ноты
                beq     3$              ; 0 - конец

2$:             mov     R2, R1          ; тон
                clr     (R3)            ; 0
                sob     R1, .           ; задержка

                mov     #100, (R3)      ; 1
                mov     R2, R1          ; тон
                sob     R1, .           ; задержка

                dec     R2              ; тон со временем повышается
                sob     R5, 2$          ; длительность
                br      1$
; ───────────────────────────────────────────────────────────────────────────

3$:             return
; End of function Func72

; ───────────────────────────────────────────────────────────────────────────
Sound26$:       .word 50
                .word 200, 240, 100, 60
                .word 240, 122, 60, 200
                .word 144, 100, 144, 0
; ───────────────────────────────────────────────────────────────────────────

NextFinishStage1$:
                mov     #Sound26$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                br      NextFinishStage2$
; ───────────────────────────────────────────────────────────────────────────

StarSetMenu:    .word 17.               ; Набор мигающих звёзд в меню
                .word StarSpr2, 40107
                .word StarSpr3, 41037
                .word StarSpr4, 44075
                .word StarSpr3, 50040
                .word StarSpr2, 54066
                .word StarSpr1, 54122
                .word StarSpr0, 56070
                .word StarSpr1, 60017
                .word StarSpr2, 47005
                .word StarSpr3, 60036
                .word StarSpr4, 66000
                .word StarSpr3, 70042
                .word StarSpr2, 74012
                .word StarSpr1, 74072
                .word StarSpr0, 63027
                .word StarSpr1, 76640
                .word StarSpr2, 66076

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

; Прокрутка экрана с попутной очисткой внутри рамки

Func74:         mov     #5, R5          ; скролл 5 линий

1$:             inc     @#177664
                mov     #2000, R1       ; с такой задержкой
                sob     R1, .
                sob     R5, 1$

                mov     #366, R5        ; скролл столько линий
                mov     #40501, R4      ; с попутной очисткой экрана

2$:             mov     #76, R3

3$:             clrb    (R4)+
                sob     R3, 3$
                tst     (R4)+
                inc     @#177664
                mov     #2000, R3
                sob     R3, .
                sob     R5, 2$

                mov     #5, R5          ; скролл 5 линий

4$:             inc     @#177664
                mov     #2000, R1       ; с такой задержкой
                sob     R1, .
                sob     R5, 4$
                return
; End of function Func74

; ───────────────────────────────────────────────────────────────────────────
Sound27$:       .word 300
                .word 700, 301, 0
; ───────────────────────────────────────────────────────────────────────────

NextFinishStage2$:
                mov     #StarSetMenu, R2  ; Набор мигающих звёзд в меню
1$:             .word   FUNC$ + 4       ; Прорисовка мигающих звёздочек
                                        ; Вход: R2 - адрес блока параметров:
                                        ;            .word число элементов (пар адресов)
                                        ;            .word адрес спрайта в памяти
                                        ;            .word адрес экрана
                cmp     #100250, @#177716
                bpl     2$
                tst     @#177714
                bne     2$
                mov     #30000, R4
                sob     R4, .
                br      1$
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     #Sound27$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                .word   FUNC$ + 74      ; Прокрутка экрана с попутной очисткой внутри рамки
                nop
                inc     @#Stage         ; переходим к следующему этапу
                cmp     #46, @#Stage    ; а они закончились?
                bne     3$              ; ещё нет
                jmp     @#GameFinishEnd$ ; да - Игра полностью пройдена
; ───────────────────────────────────────────────────────────────────────────

3$:             jmp     @#GoNextStage$  ; переходим к следующему этапу
; ───────────────────────────────────────────────────────────────────────────

EntryPoint$:    mov     #41, @#Stage    ; инициализируем номер текущего этапа
                mov     #MoonAddr, R0
                mov     #10, R1

1$:             clr     (R0)+
                sob     R1, 1$
; сюда переходим после нажатия на клавишу СТОП
StartOverTT4$:  mov     #TrapTo10, @#10 ; инициализируем вектор 10
                mov     #21000, @#177706 ; инициализируем таймер
                mov     #20, @#177712   ; запускаем таймер
                mov     #TrapTo4, @#4   ; вектор 4
                mov     #SkipSplash$, @#60 ; любое нажатие на клавишу пропустит заставку
                mov     #SkipSplash$, @#274 ; и сделает переход к меню игры
                mov     #TopStack, SP        ; инициализация стека
                mov     #100, @#177716  ; инициализация спикера, зачем-то так
                .word   FUNC$ + 2       ; Инициализация некоторых переменных драйвера экрана
                mov     @#177662, R0    ; сброс готовности клавиатуры, чтобы на нажатие была реакция
                .word   FUNC$ + 0       ; Очистка экрана диагонально зубчатыми линиями
                sub     #2, @#177664    ; начальная позиция скроллинга
                nop
; рисуем спускающийся воздушный шар
                mov     #BallonSprEnd, R0 ; конечный адрес спрайта воздушного шара
                mov     #77756, R1      ; адрес экрана
                mov     #34, R5

1$:             mov     #2, R2          ; ширина спрайта 2 слова, 4 байта

2$:             mov     #10, R3         ; в слове 10 двухбитий
                mov     -(R0), R4       ; берём очередное слово

3$:             clr     (R1)            ; по текущему адресу пока 0
                rol     R4              ; смотрим очередной бит
                bcc     4$              ; если 0 - то и на экране 0
                bis     #125252, (R1)   ; иначе - зелёное слово

4$:             rol     R4              ; смотрим очередной бит
                bcc     5$              ; если 0 - то переход
                bis     #52525, (R1)    ; иначе - синее слово

5$:             tst     -(R1)           ; вот, таким образом мы 2 бита расширяем в слово
                                        ; переходим к следующему слову
                sob     R3, 3$          ; и так все 16 бит
                sob     R2, 2$          ; и так всю ширину спрайта
                tst     (R1)+           ; возвращаем назад указатель, он сейчас указывает на
                                        ; начало строки, которую надо продублировать
                                        ; её ширина - 20 слов
                mov     #10, R4         ; масштаб одной строки спрайта
                mov     R1, R2

6$:             add     #40, R2         ; это конец строки источника
                sub     #40, R1         ; это конец строки приёмника
                nop
                .word   FUNC$ + 76      ; рисуем мигающие звёздочки
                dec     @#177664        ; скролл
                bis     #1000, @#177664
                mov     #20, R3         ; дублируем строку

7$:             mov     -(R2), -(R1)
                sob     R3, 7$
                sob     R4, 6$          ; и так сколько надо
                nop
                .word   FUNC$ + 76      ; рисуем мигающие звёздочки
                dec     @#177664        ; снова скролл
                bis     #1000, @#177664
                sub     #42, R1         ; корректируем адрес
                sob     R5, 1$          ; и так пока не нарисуем весь
; тут слегка замедляется, для эффекта
                mov     #2, R5

8$:             dec     @#177664        ; скролл
                bis     #1000, @#177664
                mov     #14000, R1      ; пауза
                sob     R1, .
                sob     R5, 8$
; теперь он спускается вниз за экран
                mov     #400, R5
                mov     #100000, R1     ; делается обычная очистка экрана со скроллингом

9$:             mov     #40, R2

10$:            clr     -(R1)
                sob     R2, 10$
                dec     @#177664        ; скролл
                bis     #1000, @#177664
                mov     #1000, R2
                .word   FUNC$ + 76      ; рисуем мигающие звёздочки
                sob     R2, .
                sob     R5, 9$          ; пока весь не исчезнет
                br      SplashNext1$

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

; Отрисовка набора мигающих звёздочек

Func76:         mov     #off_13370, R0  ; адрес таблицы данных
                mov     #9., R1         ; там 9 элементов

1$:             mov     (R0)+, R4       ; берём адрес спрайта
                mov     (R0), R3        ; берём адрес экрана
                mov     R3, R5
                sub     #100, R3        ; на строку вверх, потому что снаружи функции делается скроллинг экрана
                bit     #140000, R3     ; мы в пределах экрана ещё?
                bne     2$       ; да
                add     #36700, R3      ; нет - корректируем адрес

2$:             mov     #9., R2         ; сперва стираем текущий спрайт со своего места,
                                        ; со сравнением, стираем только те данные - которые принадлежат спрайту

3$:             cmpb    (R5), (R4)+
                bne     4$
                clrb    (R5)

4$:             inc     R5
                cmpb    (R5), (R4)+
                bne     5$
                clrb    (R5)

5$:             add     #77, R5
                sob     R2, 3$
                mov     R3, (R0)+       ; новый адрес экрана
                sob     R1, 1$          ; и так для всех спрайтов
                mov     #StarsSet1, R2  ; Набор звёзд в заставке, с воздушным шаром
                ; а теперь вывод всех
                .word   FUNC$ + 4       ; Прорисовка мигающих звёздочек
                                        ; Вход: R2 - адрес блока параметров:
                                        ;            .word число элементов (пар адресов)
                                        ;            .word адрес спрайта в памяти
                                        ;            .word адрес экрана
                return
; End of function Func76

; ───────────────────────────────────────────────────────────────────────────
StarsSet1:      .word 9.                ; Набор звёзд в заставке, с воздушным шаром
off_13370:      .word StarSpr1, 55005
                .word StarSpr1, 53670
                .word StarSpr0, 65040
                .word StarSpr1, 64662
                .word StarSpr2, 42307
                .word StarSpr3, 40775
                .word StarSpr4, 51240
                .word StarSpr3, 73335
                .word StarSpr2, 53114
Sound1$:        .word 60
                .word 61, 101, 121, 141
                .word 71, 111, 131, 151
                .word 101, 121, 141, 161
                .word 401, 301, 201, 101
                .word 301, 201, 101, 201
                .word 101, 0
; ───────────────────────────────────────────────────────────────────────────

SplashNext1$:   mov     #Sound1$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                .word   FUNC$ + 102     ; Очистка экрана горизонтальными линиями сверху и снизу
; теперь снизу выезжает посадочная платформа
                mov     #77630, 0PlatformScrAddr$ ; начальный адрес экрана

1$:             mov     (PC)+, R1
0PlatformScrAddr$:.word 70230

                mov     #PlatformSprH, R5
                mov     #PlatformSprite, R0 ; адрес спрайта

2$:             mov     #PlatformSprW, R2 ; ширина спрайта

3$:             mov     #4, R3          ; в байте 4 двухбития
                movb    (R0)+, R4       ; берём очередной байт
                clr     (R1)

4$:             ror     (R1)
                ror     (R1)
                ror     (R1)
                ror     (R1)
                bic     #170000, (R1)   ; тут мы два бита расширяем в 4, дублируя их
                ror     R4
                bcc     5$
                bis     #50000, (R1)

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

6$:             sob     R3, 4$          ; расширяем байт в слово
                tst     (R1)+
                sob     R2, 3$          ; по всей ширине спрайта
                mov     R1, R2
                sub     #20, R2
                add     #60, R1
                mov     #10, R3         ; продублируем строку

7$:             mov     (R2)+, (R1)+
                sob     R3, 7$
                add     #60, R1
                nop
                bit     #100000, R1     ; здесь без скроллинга, как только доходим до конца экрана
                beq     8$
                sub     #200, @#0PlatformScrAddr$ ; уменьшаем начальный адрес начинаем рисовать заново
                br      1$
; ───────────────────────────────────────────────────────────────────────────

8$:             sob     R5, 2$
                br      SplashNext2$
; ───────────────────────────────────────────────────────────────────────────
Sound2$:        .word 140
                .word 700, 400, 200, 500
                .word 141, 0
; ───────────────────────────────────────────────────────────────────────────

SplashNext2$:   mov     #Sound2$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
; сверху в экран заезжает мелкий воздушный шар
                mov     #40134, 0BallonScrAddr$

1$:             mov     (PC)+, R1
0BallonScrAddr$:  .word 47134

                mov     #BallonSprEnd-4, R0
                mov     #34, R5

2$:             mov     #4, R2          ; ширина спрайта 4 байта

3$:             mov     #4, R3
                movb    (R0)+, R4
                clr     (R1)

4$:             ror     (R1)
                ror     (R1)
                ror     (R1)
                ror     (R1)
                bic     #170000, (R1)    ; та же фигня - байт в слово
                ror     R4
                bcc     5$
                bis     #50000, (R1)

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

6$:             sob     R3, 4$
                tst     (R1)+
                sob     R2, 3$
                mov     R1, R2
                sub     #100, R1        ; дублируем строку
                mov     -(R2), -(R1)
                mov     -(R2), -(R1)
                mov     -(R2), -(R1)
                mov     -(R2), -(R1)
                sub     #10, R0
                sub     #100, R1
                bit     #140000, R1     ; и снизу вверх до границы экрана
                bne     7$
                add     #200, @#0BallonScrAddr$
                br      1$
; ───────────────────────────────────────────────────────────────────────────

7$:             sob     R5, 2$
; и опускается на платформу
                mov     #40000, R0
                mov     #100, R1

8$:             clr     (R0)+
                sob     R1, 8$
                mov     #40234, R0
                mov     #SpriteBuffer, R1
                mov     #70, R2
                mov     #4, R3

9$:             mov     (R0)+, (R1)+
                sob     R3, 9$
                add     #70, R0
                mov     #213, R5
                mov     #36, R4
                mov     #47244, R0

10$:            mov     R0, R1
                add     #100, R1
                mov     #72, R2

11$:            mov     -(R0), -(R1)
                mov     -(R0), -(R1)
                mov     -(R0), -(R1)
                mov     -(R0), -(R1)
                sub     #70, R0
                sub     #70, R1
                sob     R2, 11$
                add     #7300, R0
                mov     #16, R3

12$:            mov     R4, R1
                clr     @#177716
                sob     R1, .

                mov     R4, R1
                mov     #100, @#177716
                sob     R1, .

                sob     R3, 12$
                inc     R4
                sob     R5, 10$
                br      SplashNext3$
; ───────────────────────────────────────────────────────────────────────────
Sound3$:        .word 200
                .word 301, 1111, 0
; ───────────────────────────────────────────────────────────────────────────

SplashNext3$:   nop
                mov     #Sound3$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                br      SplashNext4$
; ───────────────────────────────────────────────────────────────────────────
strCopyright:   .ascii "(C)   BIL corp"
strCopyrightEnd:.even
StrCopyrightLen = strCopyrightEnd-strCopyright
Sound4$:        .word 100
                .word 101, 201, 301, 401
                .word 501, 601, 701, 0
; ───────────────────────────────────────────────────────────────────────────

SplashNext4$:   mov     #StrCopyrightLen, R5 ; выводим текст
                mov     #40004, R1
                mov     #strCopyright, R4 ; "(C)   BIL corp"

1$:             movb    (R4)+, R3
                bic     #177400, R3
                mov     #10., R2
                mov     #FONT - 240, R0

2$:             add     R3, R0
                sob     R2, 2$
                .word   FUNC$ + 66      ; Вывод символа на экран
                                        ; Вход: R0 - адрес данных символа
                                        ;       R1 - адрес экрана
                add     #4, R1
                sob     R5, 1$
                mov     #Sound4$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                br      SplashNext5$
; ───────────────────────────────────────────────────────────────────────────
Sound5$:        .word 60
                .word 201, 141, 0
; адреса вывода каждой буквы по отдельности
ScrAboutChr:    .word 64004, 62410, 61014, 57420
                .word 56024, 54430, 53034, 56050
                .word 57454, 61060, 62464, 64070
                .word 50010, 47414, 47020, 46424
                .word 46030, 45440, 46044, 46450
                .word 47054, 47460, 50064, 73004
                .word 73010, 73014, 73020, 73024
                .word 73030, 73050, 73054, 73060
                .word 73064, 73070
; вот этих вот букв
strAbout:       .ascii "БОРТНИК"
strAbout2:      .ascii "БОРИС"
strAbout3:      .ascii "город"
strAbout4:      .ascii "МОСКВА"
strAbout5:      .ascii "26.02.1990."
strAboutEnd:    .even
StrAbout1Len = strAbout2 - strAbout
StrAbout2Len = strAbout3 - strAbout2
StrAbout3Len = strAbout4 - strAbout3
StrAbout4Len = strAbout5 - strAbout4
StrAbout5Len = strAboutEnd - strAbout5
; ───────────────────────────────────────────────────────────────────────────
; вывод информации об авторе
SplashNext5$:   mov     #42, R5
                mov     #ScrAboutChr, R2 ; адреса экрана, куда выводить
                mov     #strAbout, R3   ; буквы

1$:             movb    (R3)+, R4
                bic     #177400, R4
                mov     #FONT - 240, R0
                mov     #10., R1

2$:             add     R4, R0
                sob     R1, 2$
                mov     (R2)+, R1
                .word   FUNC$ + 66      ; Вывод символа на экран
                                        ; Вход: R0 - адрес данных символа
                                        ;       R1 - адрес экрана
                mov     #Sound5$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                sob     R5, 1$
                .word   FUNC$ + 110     ; мигают звёзды и ждём нажатия клавиши
                br      SplashNext6$
; ───────────────────────────────────────────────────────────────────────────
strGame:        .asciz "GAME"
strGameEnd:     .even

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

; Вывод текста очень широкими буквами
; Вход: R0 - коэффициент растяжения по вертикали
;       R1 - адрес экрана
;       R5 - адрес текста

Func100:        mov     R0, 100.ScaleY$
                mov     #1160, R2
1$:             add     #1200, R2
                sob     R0, 1$
                mov     R2, 100.Offs$
                mov     2(SP), R5       ; берём адрес текста

2$:             movb    (R5)+, R3
                beq     9$
                bic     #177400, R3
                mov     #FONT - 240, R0
                mov     #10., R2

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

4$:             mov     #10, R3
                movb    (R0)+, R4

5$:             clr     (R1)
                ror     R4
                bcc     6$
                bis     #52525, (R1)

6$:             tst     (R1)+
                sob     R3, 5$
                mov     R1, R4
                mov     R2, @#310
                mov     (PC)+, R2
100.ScaleY$:    .word 11
; ───────────────────────────────────────────────────────────────────────────

7$:             sub     #20, R4
                add     #60, R1
                mov     #10, R3

8$:             mov     (R4)+, (R1)+
                sob     R3, 8$
                sob     R2, 7$
                add     #60, R1
                mov     @#310, R2
                sob     R2, 4$
                sub     (PC)+, R1
100.Offs$:     .word 14360
                br      2$
; ───────────────────────────────────────────────────────────────────────────

9$:             return
; End of function Func100

; ───────────────────────────────────────────────────────────────────────────
Sound6$:        .word 30
                .word 201, 0
; ───────────────────────────────────────────────────────────────────────────
; выводим текст "GAME"
SplashNext6$:   mov     #42000, R0
                mov     #17000, R1

1$:             clr     (R0)+
                sob     R1, 1$
                mov     #9., R3
                mov     #strGame, R5    ; "GAME"
                mov     #62000, R1
                mov     #1, R0
2$:             .word   FUNC$ + 100     ; Вывод текста очень широкими буквами
                                        ; Вход: R0 - коэффициент растяжения по вертикали
                                        ;       R1 - адрес экрана
                                        ;       R5 - адрес текста
                mov     #Sound6$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                inc     R0
                sub     #500, R1
                sob     R3, 2$
; выводим цифру 1 очень большим шрифтом
                mov     #43014, R1
                mov     #FONT + <'1 - 40>*10. + 1, R0     ; цифра 1
                mov     #10, R2

3$:             mov     #10, R3
                movb    (R0)+, R4

4$:             ror     R4
                bcc     5$
                mov     #-1, @#310
                br      6$
; ───────────────────────────────────────────────────────────────────────────

5$:             clr     @#310

6$:             mov     #3, R5          ; один бит - три слова

7$:             tst     (R1)
                bne     8$
                mov     @#310, (R1)

8$:             tst     (R1)+
                sob     R5, 7$
                sob     R3, 4$
                mov     R1, R3
                mov     #37, R4

9$:             sub     #60, R3
                add     #20, R1
                mov     #30, R5

10$:            tst     (R1)
                bne     11$
                cmp     #-1, (R3)
                bne     11$
                mov     (R3), (R1)

11$:            tst     (R1)+
                tst     (R3)+
                sob     R5, 10$
                sob     R4, 9$
                add     #20, R1
                sob     R2, 3$
                br      GoTryAgain
; ───────────────────────────────────────────────────────────────────────────
Sound7$:        .word 1110
                .word 1111, 0

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

; Очистка экрана горизонтальными линиями сверху и снизу

Func102:        mov     #125252, R4
                mov     #77, R5
                mov     #40000, R0
                mov     #100000, R1

1$:             mov     #200, R2

2$:             clr     (R0)+
                clr     -(R1)
                sob     R2, 2$
                tst     R5
                beq     4$
                mov     #200, R2

3$:             mov     R4, (R0)+
                mov     R4, -(R1)
                sob     R2, 3$
                add     #400, R1
                sub     #400, R0
                mov     #6000, R3
                sob     R3, .

                sob     R5, 1$
                br      1$
; ───────────────────────────────────────────────────────────────────────────

4$:             return
; End of function Func102

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

GoTryAgain:     mov     #Sound7$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
; ───────────────────────────────────────────────────────────────────────────
; конец заставок и начало игрового меню
SkipSplash$:    nop
                cmp     #41, @#Stage    ; Здесь задумывалось уменьшение этапа
                br      GameMenu1$      ; но автор передумал
; ───────────────────────────────────────────────────────────────────────────
; мёртвый код
                dec     @#Stage         ; откат на предыдущий этап
; мёртвый код --- end ---
; ───────────────────────────────────────────────────────────────────────────
; вход в игровое меню после этапа
GameMenu1$:     .word   FUNC$ + 2       ; Инициализация некоторых переменных драйвера экрана
                .word   FUNC$ + 102     ; Очистка экрана горизонтальными линиями сверху и снизу
; рисуем игровое меню
; рамка вокруг экрана
GameMenu$:      mov     #2, R4
                mov     #4, R3
                mov     #BlockSprite, R0
                mov     #77300, R1
                mov     #5, R2

1$:             mov     #20, R5
2$:             .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #4, R1
                sob     R5, 2$
                mov     #40000, R1
                sob     R4, 1$
                mov     #40000, R0
                mov     #200, R1

3$:             movb    #273, (R0)+
                add     #76, R0
                movb    #273, (R0)+
                movb    #356, (R0)+
                add     #76, R0
                movb    #356, (R0)+
                sob     R1, 3$
; Рисуем поверхность земли
                mov     #<GroundSprite+2>, R0
                mov     #75520, R1
                mov     #15, R2
                mov     #40, R3
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
; рисуем причальную мачту для воздушного шара
                mov     #45001, R1
                mov     #37, R2
                .word   FUNC$ + 12      ; Вывод на экран платформы для воздушного шара
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
; ещё одну
                add     #66, R1
                .word   FUNC$ + 12      ; Вывод на экран платформы для воздушного шара
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
; рисуем воздушный шар
                mov     #41603, R1
                mov     #BallonSprW, R3
                mov     #BallonSprite, R0
                mov     #BallonSprH, R2
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
; и ещё один
                add     #66, R1
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                br      GameMenuNext1$
; ───────────────────────────────────────────────────────────────────────────
strMenu:        .ascii "1 ИГРА"
strMenu2:       .ascii "2 УПРАВЛЕНИЕ"
strMenu3:       .ascii "3 ИНФОРМАЦИЯ"
strMenu4:       .ascii "4 ВЫХОД"
strStage:       .ascii "ЭТАП "
strMenuEnd:     .even
StrMenu1Len = strMenu2 - strMenu
StrMenu2Len = strMenu3 - strMenu2
StrMenu3Len = strMenu4 - strMenu3
StrMenu4Len = strStage - strMenu4
StrStageLen = strMenuEnd - strStage

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

; вывод строки на экран
; Вход: R1 - адрес экрана
;       R3 - длина строки
;       R4 - адрес строки

Func104:        movb    (R4)+, R5
                bic     #177400, R5
                mov     #FONT - 240, R0
                mov     #10., R2

1$:             add     R5, R0
                sob     R2, 1$
                .word   FUNC$ + 66      ; Вывод символа на экран
                                        ; Вход: R0 - адрес данных символа
                                        ;       R1 - адрес экрана
                add     #4, R1
                sob     R3, Func104     ; и так всю строку
                return
; End of function Func104

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

GameMenuNext1$: mov     #StrMenu1Len, R3
                mov     #strMenu, R4
                mov     #66010, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #StrMenu1Len, R4
                mov     #StrMenu2Len, R3
                add     #1400, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #StrMenu2Len, R4
                mov     #StrMenu3Len, R3
                add     #1400, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #StrMenu3Len, R4
                mov     #StrMenu4Len, R3
                add     #1400, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #StrMenu4Len, R4
                mov     #StrStageLen, R3
                mov     #60024, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #24, R1
                mov     #1, R3
                mov     #Stage, R4      ; тут хранится число, номер этапа (минус 20)
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                mov     #60024, R0
                mov     #12, R1

1$:             mov     #14, R2

2$:             bic     #52525, (R0)+
                sob     R2, 2$
                add     #50, R0
                sob     R1, 1$
                br      GameMenuNext2$
; ───────────────────────────────────────────────────────────────────────────
AnimGameName:   .byte 0, 12             ; параметры - рост/уменьшение, размер
                .word 113023            ; адрес символа буквы
                .word 42014             ; адрес экрана
                .byte 377, 2
                .word 113010
                .word 45024
                .byte 0, 11
                .word 113167
                .word 42434
                .byte 377, 2
                .word 113167
                .word 46044
                .byte 0, 5
                .word 113371
                .word 44454

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

; Анимация букв
; Вход: R0 - адрес данных букв
;       R1 - адрес экрана
;       R2 - масштаб по высоте
; Выход: R1 - адрес экрана после действия

Func106:        mov     #10, R5
                mov     R2, 106.ScaleY$

1$:             mov     #10, R3
                movb    (R0)+, R4

2$:             clrb    (R1)
                ror     R4
                bcc     3$
                bisb    @#AnimLetColor, (R1) ; цвет анимированных букв

3$:             inc     R1
                sob     R3, 2$
                mov     R1, R2
                mov     (PC)+, R3
106.ScaleY$:     .word 5

4$:             sub     #10, R2
                add     #70, R1
                mov     (R2)+, (R1)+
                mov     (R2)+, (R1)+
                mov     (R2)+, (R1)+
                mov     (R2)+, (R1)+
                sob     R3, 4$
                add     #70, R1
                sob     R5, 1$
                inc     @#AnimLetColor  ; меняем цвет анимированных букв
                beq     5$
                dec     @#AnimLetColor

5$:             add     #52525, @#AnimLetColor ; меняем цвет анимированных букв
                mov     R1, 12(SP)
                return
; End of function Func106

; ───────────────────────────────────────────────────────────────────────────
; здесь выводим название игры буквами, меняющими высоту

GameMenuNext2$: mov     #125250, @#AnimLetColor ; цвет анимированных букв
                mov     #66007, @#MenuCursor ; адрес курсора меню
                mov     #VecKbd, @#60
                call    @#sub_21622
                nop

MenuLoop$:      mov     #5, R3
                mov     #AnimGameName, R5

2$:             movb    (R5)+, R4       ; направление
                beq     4$              ; 0 - уменьшение, !0 - рост
                incb    (R5)            ; увеличиваем размер
                cmpb    #12, (R5)       ; дошли до максимума?
                bne     3$              ; нет ещё
                comb    -(R5)           ; да - сменим рост на уменьшение
                inc     R5

3$:             movb    (R5)+, R2       ; размер буквы
                mov     (R5)+, R0       ; адрес символа
                sub     #400, (R5)      ; буква растёт
                mov     (R5)+, R1       ; адрес экрана
                .word   FUNC$ + 106     ; выводим символ
                                        ; Вход: R0 - адрес данных букв
                                        ;       R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
                                        ; Выход: R1 - адрес экрана после действия
                br      8$
; ───────────────────────────────────────────────────────────────────────────

4$:             decb    (R5)            ; уменьшаем размер
                cmpb    #1, (R5)        ; до минимума дошли?
                bne     5$              ; нет ещё
                comb    -(R5)           ; да - сменим уменьшение на рост
                inc     R5

5$:             movb    (R5)+, R2       ; размер буквы
                mov     (R5)+, R0       ; адрес символа
                mov     (R5), R1        ; адрес экрана
                mov     #4, R4

6$:             clr     (R1)+
                clr     (R1)+
                clr     (R1)+
                clr     (R1)+
                add     #70, R1
                sob     R4, 6$          ; стираем не нужную часть буквы
                mov     R1, (R5)+       ; буква уменьшается
                .word   FUNC$ + 106     ; выводим символ
                                        ; Вход: R0 - адрес данных букв
                                        ;       R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
                                        ; Выход: R1 - адрес экрана после действия
                mov     #4, R4

7$:             clr     (R1)+
                clr     (R1)+
                clr     (R1)+
                clr     (R1)+
                add     #70, R1
                sob     R4, 7$          ; низ тоже стираем

8$:             sob     R3, 2$
                com     #0
                beq     10$
; выводим курсор меню
                mov     @#MenuCursor, R1 ; адрес курсора меню
                mov     #10., R2

9$:             comb    (R1)+
                com     (R1)+
                com     (R1)+
                add     #73, R1
                sob     R2, 9$

10$:            mov     #StarSetMenu, R2  ; Набор мигающих звёзд в меню
                .word   FUNC$ + 4       ; Прорисовка мигающих звёздочек
                                        ; Вход: R2 - адрес блока параметров:
                                        ;            .word число элементов (пар адресов)
                                        ;            .word адрес спрайта в памяти
                                        ;            .word адрес экрана
                mov     #1000, R0       ; ждём нажатия чего-нибудь

KeyWait$:       tst     @#177714
                bne     pressJoy$       ; нажали джойстик - переход
                cmp     #100250, @#177716
                bpl     0pressKey$      ; нажали клавишу - переход

MnuDoNone$:     sob     R0, KeyWait$

13$:            jmp     @#MenuLoop$     ; и крутимся в цикле
; ───────────────────────────────────────────────────────────────────────────

0pressKey$:     mov     @#MenuCursor, R1 ; что нажали?
                cmp     #33, @#177662   ; стрелку вниз?
                bne     14$             ; нет
                cmp     #72407, @#MenuCursor ; да, а до низа дошли?
                beq     MnuDoNone$      ; да - ничего не делать
                add     #1400, @#MenuCursor ; движемся вниз
                br      15$
; ───────────────────────────────────────────────────────────────────────────

14$:            cmp     #32, @#177662   ; стрелку вверх?
                bne     checkEnter$     ; нет
                cmp     #66007, @#MenuCursor ; да, а до верха дошли?
                beq     MnuDoNone$      ; да - ничего не делать
                sub     #1400, @#MenuCursor ; движемся вверх

15$:            tst     (R1)            ; вот такого вроде быть не может
                beq     17$
                mov     #10., R2        ; стираем курсор меню

16$:            comb    (R1)+
                com     (R1)+
                com     (R1)+
                add     #73, R1
                sob     R2, 16$

17$:            mov     #Sound10$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                br      13$             ; и возвращаемся в цикл
; ───────────────────────────────────────────────────────────────────────────
Sound10$:       .word 50
                .word 111, 161, 51, 0
; ───────────────────────────────────────────────────────────────────────────

checkEnter$:    cmp     #12, @#177662   ; нажали ввод?
                bne     MnuDoNone$      ; нет - продолжаем цикл
; кнопка джойстика работает как ввод
pressJoy$:      mov     @#MenuCursor, R1 ; адрес курсора меню
                bic     #170777, R1     ; выделяем уникальный разряд
                cmp     #6000, R1       ; первый пункт?
                bne     2$              ; нет
                jmp     @#StartGame     ; да - начинаем игру
; ───────────────────────────────────────────────────────────────────────────

2$:             cmp     #7000, R1       ; второй пункт?
                bne     3$              ; нет
                jmp     @#SetControls   ; да - зададим управление
; ───────────────────────────────────────────────────────────────────────────

3$:             cmp     #1000, R1       ; третий пункт?
                bne     4$              ; нет
                jmp     @#ShowInfo      ; да - показать информацию
; ───────────────────────────────────────────────────────────────────────────

4$:             emt     14              ; Выход из игры
                mov     #1000, @#264    ; адрес загрузки поменяем, чтоб никто не догадался
                mov     #TrapTo10, @#10
                mov     #FONT + <'S - 40>*10., R0 ; 113274 выведем букву S
                mov     #40000, R1
                .word   FUNC$ + 66      ; Вывод символа на экран
                                        ; Вход: R0 - адрес данных символа
                                        ;       R1 - адрес экрана
                halt                    ; и выходим в монитор

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


Func110:        mov     #VecKbd, @#60   ; заглушки на векторы прерывания
                mov     #VecKbd, @#274
                jmp     @#Func16        ; Проверка на нажатие клавиши или кнопки джойстика, если нажата - выход
; End of function Func110


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

; Проверка на нажатие кнопки паузы
; и если да, то пауза

Func112:        cmp     #100250, @#177716 ; проверим нажатие клавиши
                bpl     F112.1$         ; да - нажата

F112.2$:        return                  ; нет - выход
; ───────────────────────────────────────────────────────────────────────────
F112.1$:        cmp     (PC)+, @(PC)+   ; нажали кнопку паузы?
KeyPause$:      .word '1
                .word 177662
                bne     F112.2$         ; нет - выходим
                                        ; да - пауза
                .word   FUNC$ + 16      ; Проверка на нажатие клавиши или кнопки джойстика, если нажата - выход
                tst     @#177714        ; если нажали кнопку джойстика,
                bne     F112.2$         ; то просто выходим
                br      F112.1$         ; а если клавиатуру - то проверим, не кнопку ли паузы
; End of function Func112

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

NextGC1$:       cmp     #100250, @#177716 ; клавиша нажата?
                bmi     112$            ; нет
; ───────────────────────────────────────────────────────────────────────────
                cmp     (PC)+, @(PC)+   ; да, а какая?
KeyMenu$:       .word '2                ; клавиша выхода в меню игры
                .word 177662
; ───────────────────────────────────────────────────────────────────────────
                bne     112$            ; нет
                jmp     @#SkipSplash$   ; да - выходим в меню
; ───────────────────────────────────────────────────────────────────────────

112$:           jmp     @#NextGC2$
; ───────────────────────────────────────────────────────────────────────────
strControls:    .ascii "УПРАВЛЕНИЕ"
strCtrl1:       .ascii "ГОРЕЛКА"
strCtrl2:       .ascii "ВКЛ.  МУЗЫКИ"
strCtrl3:       .ascii "ВЫКЛ. МУЗЫКИ"
strCtrl4:       .ascii "ПАУЗА"
strCtrl5:       .ascii "ВЫХОД К МЕНЮ"
strControlsEnd: .even
StrControlsLen = strCtrl1-strControls
StrCtrl1Len = strCtrl2-strCtrl1
StrCtrl2Len = strCtrl3-strCtrl2
StrCtrl3Len = strCtrl4-strCtrl3
StrCtrl4Len = strCtrl5-strCtrl4
StrCtrl5Len = strControlsEnd-strCtrl5
; Задать управление
SetControls:    .word   FUNC$ + 120     ; Издать некий определённый звук
                nop
                .word   FUNC$ + 74      ; Прокрутка экрана с попутной очисткой внутри рамки
; ───────────────────────────────────────────────────────────────────────────
; вывод информации о действиях
                mov     #50014, R1
                mov     #StrControlsLen, R3
                mov     #strControls, R4
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #10004, R1
                add     R3, R4
                mov     #StrCtrl1Len, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrCtrl2Len, R3
                add     #1370, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #1400, R1
                add     R3, R4
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1414, R1
                mov     #StrCtrl4Len, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #1364, R1
                add     R3, R4
                mov     #StrCtrl5Len, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
; вывод  информации об авторе
                mov     #76006, R1
                mov     #strAbout, R4
                mov     #StrAbout1Len, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrAbout2Len, R3
                add     #40, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                mov     #41004, R1
                mov     #strCopyright, R4 ; "(C)   BIL corp"
                mov     #StrCopyrightLen, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
; делаем текст зелёным
                mov     #50002, R0
                mov     #100, R3
                mov     #100, R4

1$:             mov     #36, R5

2$:             bic     #52525, (R0)+
                sob     R5, 2$
                add     #4, R0
                sob     R3, 1$
; а этот - синим
3$:             mov     #36, R5

4$:             bic     #125252, (R0)+
                sob     R5, 4$
                add     #4, R0
                sob     R4, 3$

                mov     #5, R3          ; у нас 5 пунктов меню управления
                mov     #60010, R0      ; адрес экрана пункта меню
                mov     #TempBuffer, R4 ; буфер кодов управления
                mov     R4, R5
                mov     #KeyFire$, (R4)+ ; адреса, где находятся коды управляющих клавиш
                mov     #KeyMusicOn$, (R4)+
                mov     #KeyMusicOff$, (R4)+
                mov     #KeyPause$, (R4)+
                mov     #KeyMenu$, (R4)+ ; клавиша выхода в меню игры

5$:             mov     R0, R4
                mov     #10., R1        ; выделяем первый пункт меню управления

6$:             mov     #30, R2

7$:             com     (R4)+
                sob     R2, 7$
                add     #20, R4
                sob     R1, 6$

8$:             cmp     #100250, @#177716 ; ждём нажатия клавиши
                bmi     8$              ; джойстик не предусмотрен
                mov     @#177662, @(R5)+ ; сохраняем код нажатой клавиши
                mov     #Sound11$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                mov     R0, R4          ; развыделяем текущий пункт меню
                mov     #10., R1

9$:             mov     #30, R2

10$:            com     (R4)+
                sob     R2, 10$
                add     #20, R4
                sob     R1, 9$
                add     #1400, R0       ; переходим к следующему
                sob     R3, 5$
                jmp     @#GameMenu1$    ; возвращаемся в игровое меню
; ───────────────────────────────────────────────────────────────────────────
Sound11$:       .word 100
                .word 141, 341, 241, 141
                .word 241, 101, 0
strInformation1:.ascii "ВАША ЗАДАЧА:"
strInfo1L2:     .ascii "ИСПОЛЬЗУЯ"
strInfo1L3:     .ascii "ПОТОКИ ВЕТРА,"
strInfo1L4:     .ascii "КОРРЕКТИРУЯ"
strInfo1L5:     .ascii "ВЫСОТУ ПОЛЕТА"
strInfo1L6:     .ascii "ГОРЕЛКОЙ, СЕСТЬ"
strInfo1L7:     .ascii "НА ВЫШКУ,"
strInfo1L8:     .ascii "СТОЯЩУЮ ВНИЗУ"
strInfo1L9:     .ascii "В ЦЕНТРЕ ЭКРАНА"
strInfo1L10:    .ascii "О НАПРАВЛЕНИИ"
strInfo1L11:    .ascii "ВЕТРА В ЛЮБОМ"
strInfo1L12:    .ascii "УЧАСТКЕ НЕБА"
strInfo1L13:    .ascii "МОЖНО СУДИТЬ ПО"
strInfo1L14:    .ascii "ПОЛЕТУ ОБЛАКОВ."
strInfo1L15:    .ascii "ВРЕМЯ ИГРЫ:"
strInfo1L16:    .ascii "20 ОБХОДОВ ЛУНЫ"
strInfo1L17:    .ascii "С УВЕЛИЧЕНИЕМ"
strInfo1L18:    .ascii "ЭТАПА"
strInfo1L19:    .ascii "УВЕЛИЧИВАЕТСЯ"
strInfo1L20:    .ascii "СЛОЖНОСТЬ ИГРЫ"
strInfo1L21:    .ascii "МУЖАЙТЕСЬ!"
strInfo1L22:    .ascii "ДОЙТИ ДО КОНЦА"
strInfo1L23:    .ascii "ДАНО НЕ КАЖДОМУ"
strInfo1L24:    .ascii "МАХ РЕЗУЛЬТАТ"
strInfo1L25:    .ascii "ЭТАПА ─ 2368."
strInformation1End:.even

StrInfo1Len1  = strInfo1L2  - strInformation1
StrInfo1Len2  = strInfo1L3  - strInfo1L2
StrInfo1Len3  = strInfo1L4  - strInfo1L3
StrInfo1Len4  = strInfo1L5  - strInfo1L4
StrInfo1Len5  = strInfo1L6  - strInfo1L5
StrInfo1Len6  = strInfo1L7  - strInfo1L6
StrInfo1Len7  = strInfo1L8  - strInfo1L7
StrInfo1Len8  = strInfo1L9  - strInfo1L8
StrInfo1Len9  = strInfo1L10 - strInfo1L9
StrInfo1Len10 = strInfo1L11 - strInfo1L10
StrInfo1Len11 = strInfo1L12 - strInfo1L11
StrInfo1Len12 = strInfo1L13 - strInfo1L12
StrInfo1Len13 = strInfo1L14 - strInfo1L13
StrInfo1Len14 = strInfo1L15 - strInfo1L14
StrInfo1Len15 = strInfo1L16 - strInfo1L15
StrInfo1Len16 = strInfo1L17 - strInfo1L16
StrInfo1Len17 = strInfo1L18 - strInfo1L17
StrInfo1Len18 = strInfo1L19 - strInfo1L18
StrInfo1Len19 = strInfo1L20 - strInfo1L19
StrInfo1Len20 = strInfo1L21 - strInfo1L20
StrInfo1Len21 = strInfo1L22 - strInfo1L21
StrInfo1Len22 = strInfo1L23 - strInfo1L22
StrInfo1Len23 = strInfo1L24 - strInfo1L23
StrInfo1Len24 = strInfo1L25 - strInfo1L24
StrInfo1Len25 = strInformation1End - strInfo1L25

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

; Вывод на экран строк об авторе, копирайт,
; и сделать остальной текст синим.

Func114:        mov     #76006, R1
                mov     #strAbout, R4
                mov     #StrAbout1Len, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrAbout2Len, R3
                add     #40, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                mov     #41004, R1
                mov     #strCopyright, R4 ; "(C)   BIL corp"
                mov     #StrCopyrightLen, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                mov     #42302, R0
                mov     #333, R3

1$:             mov     #36, R5

2$:             bic     #125252, (R0)+
                sob     R5, 2$
                add     #4, R0
                sob     R3, 1$
                return
; End of function Func114

; ───────────────────────────────────────────────────────────────────────────
ShowInfo:       .word   FUNC$ + 120     ; Издать некий определённый звук
                .word   FUNC$ + 74      ; Прокрутка экрана с попутной очисткой внутри рамки
; выводим первый экран с информацией
                mov     #50010, R1
                mov     #strInformation1, R4
                mov     #StrInfo1Len1, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len2, R3
                add     #3406, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len3, R3
                add     #1370, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len4, R3
                add     #1404, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len5, R3
                add     #1374, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len6, R3
                add     #1374, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len7, R3
                add     #1416, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len8, R3
                add     #1370, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len9, R3
                add     #1372, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                .word   FUNC$ + 114     ; Вывод на экран строк об авторе, копирайт, и сделать остальной текст синим.
; ───────────────────────────────────────────────────────────────────────────
                mov     #51210, R1
                mov     #3, R2

1$:             mov     #57, R3

2$:             movb    #-1, (R1)+      ; рисуем красную линию
                sob     R3, 2$
                add     #21, R1
                sob     R2, 1$
                .word   FUNC$ + 116     ; Звук, ждать нажатия клавиши или джойстика, звук,
                                        ; очистка экрана с прокруткой
; ───────────────────────────────────────────────────────────────────────────
; выводим второй экран с информацией
                add     #StrInfo1Len9, R4
                mov     #50006, R1
                mov     #StrInfo1Len10, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1400, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                dec     R3
                add     #1402, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len13, R3
                add     #1372, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1400, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #5010, R1
                add     R3, R4
                mov     #StrInfo1Len15, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1370, R1
                mov     #StrInfo1Len16, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                .word   FUNC$ + 114     ; Вывод на экран строк об авторе, копирайт, и сделать остальной текст синим.
                .word   FUNC$ + 116     ; Звук, ждать нажатия клавиши или джойстика, звук,
                                        ; очистка экрана с прокруткой
; ───────────────────────────────────────────────────────────────────────────
; выводим третий экран с информацией
                add     R3, R4
                tst     -(R3)
                mov     #46006, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len18, R3
                add     #1420, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo1Len19, R3
                add     #1360, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                inc     R3
                add     #1376, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #4010, R1
                add     R3, R4
                mov     #StrInfo1Len21, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #1370, R1
                add     R3, R4
                mov     #StrInfo1Len22, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #1376, R1
                add     R3, R4
                inc     R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #4004, R1
                add     R3, R4
                tst     -(R3)
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1400, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                .word   FUNC$ + 114     ; Вывод на экран строк об авторе, копирайт, и сделать остальной текст синим.
                .word   FUNC$ + 116     ; Звук, ждать нажатия клавиши или джойстика, звук,
                                        ; очистка экрана с прокруткой
                jmp     @#NextShowInfo1
; ───────────────────────────────────────────────────────────────────────────

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

; Звук, ждать нажатия клавиши или джойстика, звук,
; очистка экрана с прокруткой

Func116:        mov     #Sound12$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
1$:             cmp     #100250, @#177716
                bpl     2$
                tst     @#177714
                bne     2$
                br      1$
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     #Sound13$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                .word   FUNC$ + 74      ; Прокрутка экрана с попутной очисткой внутри рамки
                return
; End of function Func116

; ───────────────────────────────────────────────────────────────────────────
Sound12$:       .word 24
                .word 1000, 1400, 0
Sound13$:       .word 60
                .word 300, 400, 300, 0

strInformation2:.ascii "УПРАВЛЕНИЕ"
StrInfo2L2:     .ascii "ШАРОМ МОЖЕТ"
StrInfo2L3:     .ascii "ПРОИЗВОДИТЬСЯ И"
StrInfo2L4:     .ascii "ОТ ДЖОЙСТИКА."
StrInfo2L5:     .ascii "ВО ВСЕХ"
StrInfo2L6:     .ascii "ОСТАЛЬНЫХ"
StrInfo2L7:     .ascii "(НЕ ИГРОВЫХ)"
StrInfo2L8:     .ascii "СЛУЧАЯХ"
StrInfo2L9:     .ascii "ДЖОЙСТИК"
StrInfo2L10:    .ascii "ДУБЛИРУЕТ"
StrInfo2L11:    .ascii "КЛАВИШУ 'ВВОД'"
strInformation2End:.even

StrInfo2Len1  = strInfo2L2  - strInformation2
StrInfo2Len2  = strInfo2L3  - strInfo2L2
StrInfo2Len3  = strInfo2L4  - strInfo2L3
StrInfo2Len4  = strInfo2L5  - strInfo2L4
StrInfo2Len5  = strInfo2L6  - strInfo2L5
StrInfo2Len6  = strInfo2L7  - strInfo2L6
StrInfo2Len7  = strInfo2L8  - strInfo2L7
StrInfo2Len8  = strInfo2L9  - strInfo2L8
StrInfo2Len9  = strInfo2L10 - strInfo2L9
StrInfo2Len10 = strInfo2L11 - strInfo2L10
StrInfo2Len11 = strInformation2End - strInfo2L11

; ───────────────────────────────────────────────────────────────────────────
; выводим четвёртый экран с информацией

NextShowInfo1:  mov     #strInformation2, R4
                mov     #47014, R1
                mov     #StrInfo2Len1, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                inc     R3
                add     #1376, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1370, R1
                mov     #StrInfo2Len3, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                tst     -(R3)
                add     #1404, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrInfo2Len5, R3
                add     #1414, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1374, R1
                tst     (R3)+
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1372, R1
                mov     #StrInfo2Len7, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1412, R1
                mov     #StrInfo2Len8, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1376, R1
                inc     R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1376, R1
                inc     R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1366, R1
                mov     #StrInfo2Len11, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                .word   FUNC$ + 114     ; Вывод на экран строк об авторе, копирайт, и сделать остальной текст синим.
                .word   FUNC$ + 116     ; Звук, ждать нажатия клавиши или джойстика, звук,
                                        ; очистка экрана с прокруткой
                jmp     @#GameMenu$     ; возврат в меню
; ───────────────────────────────────────────────────────────────────────────
Sound9$:        .word 10
                .word 1400, 1600, 2000, 400
                .word 0
; ───────────────────────────────────────────────────────────────────────────

StartGame:      mov     #Sound9$, R4    ; Начать игру
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                jmp     @#NextStartGame1$

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


sub_21622:      mov     #VecKbd, @#274
                mov     #Sound8$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                return
; End of function sub_21622

; ───────────────────────────────────────────────────────────────────────────
Sound8$:        .word 14
                .word 1000, 400, 0
Sound14$:       .word 60
                .word 400, 200, 0

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

; Издать некий определённый звук

Func120:        mov     #Sound14$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                return
; End of function Func120

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

GoNextStage$:   mov     @#Stage, R0     ; номер этапа
                bic     #40, R0         ; делаем номер 1..5
                rol     R0              ; *4
                rol     R0
                mov     #Score, R1      ; счёт игры - 4 байта цифр, как обычно число '1'-20
                mov     (R1)+, <ScoreStore-10>(R0) ; эта фигня работает только для этапов 2..5
                mov     (R1)+, <ScoreStore-6>(R0)
                jmp     @#GameMenu$
; ───────────────────────────────────────────────────────────────────────────
ScoreStore:     .ascii "2344"           ; для этапа 2
                .ascii "2347"           ; для этапа 3
                .ascii "2337"           ; для этапа 4
                .ascii "2367"           ; для этапа 5
ScoreStoreEnd:
; ───────────────────────────────────────────────────────────────────────────

NextStartGame1$:mov     #5, @#CannonHitCount  ; шар выдерживает 5 попаданий пули
                cmp     #42, @#Stage    ; а какой у нас этап?
                bne     3$              ; не второй
                jmp     @#StartStage2   ; начинаем второй этап
; ───────────────────────────────────────────────────────────────────────────

3$:             cmp     #43, @#Stage    ; может третий?
                bne     4$              ; нет
                jmp     @#StartStage3   ; начинаем третий этап
; ───────────────────────────────────────────────────────────────────────────

4$:             cmp     #44, @#Stage    ; может четвёртый?
                bne     5$              ; нет
                jmp     @#StartStage4   ; начинаем четвёртый этап
; ───────────────────────────────────────────────────────────────────────────

5$:             cmp     #45, @#Stage    ; может пятый?
                bne     1$              ; нет
                jmp     @#StartStage5   ; начинаем пятый этап
; ───────────────────────────────────────────────────────────────────────────

1$:             jmp     @#StartStage1   ; начинаем первый этап
; ───────────────────────────────────────────────────────────────────────────
strInfoStg2:    .ascii "В ЭТОМ ЭТАПЕ"
strInfoStg2L2:  .ascii "ВАМ СЛЕДУЕТ"
strInfoStg2L3:  .ascii "УВЕРТЫВАТЬСЯ"
strInfoStg2L4:  .ascii "ОТ СНАРЯДОВ!"
strInfoStg2L5:  .ascii "УСПЕХА ВАМ!"
strInfoStg2End: .even

StrInfoStg2Len1 = strInfoStg2L2 - strInfoStg2
StrInfoStg2Len2 = strInfoStg2L3 - strInfoStg2L2
StrInfoStg2Len3 = strInfoStg2L4 - strInfoStg2L3
StrInfoStg2Len4 = strInfoStg2L5 - strInfoStg2L4
StrInfoStg2Len5 = strInfoStg2End - strInfoStg2L5

; начинаем второй этап
StartStage2:    .word   FUNC$ + 74      ; Прокрутка экрана с попутной очисткой внутри рамки
                mov     #52010, R1
                mov     #StrInfoStg2Len1, R3
                mov     #strInfoStg2, R4    ; выводим информацию по второму этапу
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                dec     R3
                add     #1402, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #1376, R1
                add     R3, R4
                inc     R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1400, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                dec     R3
                add     #4002, R1
NextStartStage3.1$:
                .word FUNC$ + 104       ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                mov     #1, @#NeedMkFrstAct
                .word   FUNC$ + 114     ; Вывод на экран строк об авторе, копирайт,
                                        ; и сделать остальной текст синим.
                mov     #Sound12$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
; ───────────────────────────────────────────────────────────────────────────

1$:             cmp     #100250, @#177716
                bpl     NextStartStage4.1$
                tst     @#177714
                beq     1$

NextStartStage4.1$:
                mov     #Sound8$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                jmp     @#StartStage1   ; начинаем первый этап

; ───────────────────────────────────────────────────────────────────────────
; ширина 5, высота 17
; Пушка
CannonSprite:   .byte 0, 0, 252, 0, 0
                .byte 0, 300, 377, 3, 0
                .byte 0, 300, 377, 3, 0
                .byte 0, 0, 252, 0, 0
                .byte 0, 0, 353, 0, 0
                .byte 0, 0, 276, 0, 0
                .byte 0, 0, 252, 0, 0
                .byte 0, 300, 377, 3, 0
                .byte 0, 374, 377, 77, 0
                .byte 360, 252, 252, 252, 17
                .byte 324, 377, 327, 377, 27
                .byte 125, 377, 125, 377, 125
                .byte 125, 377, 125, 377, 125
                .byte 125, 0, 125, 0, 125
                .byte 24, 0, 24, 0, 24
CannonSprEnd:   .even
CannonSprLen = CannonSprEnd - CannonSprite
CannonSprW = 5
CannonSprH = 17
CannonSprPitch = 100 - CannonSprW
; ширина 5, высота 17
CannonSprMask:  .byte 0, 0, 377, 0, 0
                .byte 0, 300, 377, 3, 0
                .byte 0, 300, 377, 3, 0
                .byte 0, 0, 377, 0, 0
                .byte 0, 0, 377, 0, 0
                .byte 0, 0, 377, 0, 0
                .byte 0, 0, 377, 0, 0
                .byte 0, 300, 377, 3, 0
                .byte 0, 374, 377, 77, 0
                .byte 360, 377, 377, 377, 17
                .byte 374, 377, 377, 377, 77
                .byte 377, 377, 377, 377, 377
                .byte 377, 377, 377, 377, 377
                .byte 377, 0, 377, 0, 377
                .byte 74, 0, 74, 0, 74
                .even
; Спрайт пулька вверх
; ширина 1 высота 7
BulletUpSprite: .byte ^B00111100
                .byte ^B00101000
                .byte ^B00111100
                .byte ^B00101000
                .byte ^B11101011
                .byte ^B10000010
                .byte ^B11000011
                .byte 0
; ширина 1 высота 7
BulletUpSprMask:
                .byte ^B00111100
                .byte ^B00111100
                .byte ^B00111100
                .byte ^B00111100
                .byte ^B11111111
                .byte ^B11000011
                .byte ^B11000011
                .byte 0
; Спрайт пулька вниз
; ширина 1 высота 7
BulletDnSprite: .byte ^B11000011
                .byte ^B10000010
                .byte ^B11101011
                .byte ^B00101000
                .byte ^B00111100
                .byte ^B00101000
                .byte ^B00111100
                .byte 0
; ширина 1 высота 7
BulletDnSprMask:
                .byte ^B11000011
                .byte ^B11000011
                .byte ^B11111111
                .byte ^B00111100
                .byte ^B00111100
                .byte ^B00111100
                .byte ^B00111100
                .byte 0
; ширина 1 высота 7
; выстрел из пушки
ShootSprite:    .byte ^B11000011
                .byte ^B00111100
                .byte ^B00111100
                .byte ^B11111111
                .byte ^B00111100
                .byte ^B00111100
                .byte ^B11000011
                .byte 0
; ───────────────────────────────────────────────────────────────────────────

StartStage1:    mov     #73572, @#CannonAddr   ; начинаем первый этап
                mov     #1, @#NeedMkFrstAct
                jmp     @#NextStartStage1.1$
; ───────────────────────────────────────────────────────────────────────────

NextGC4$:       jmp     @#NextGC5$
; ───────────────────────────────────────────────────────────────────────────

NextGC8$:       bit     #177736, @#Stage ; какой этап?
                beq     1$              ; если первый - то тут будет 0
                jmp     @#ProcDiffsStg2$ ; обрабатываем 2 и следующие этапы
; ───────────────────────────────────────────────────────────────────────────

1$:             jmp     @#ProcCommonDiffs$ ; обрабатываем первый этап

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

; Передвинуть пушку
; Вход: R1 - текущий адрес пушки
;       R4 - приращение адреса


Func122:        mov     R1, @#CannonAddrDraw ; адрес экрана пушки
                mov     #CanScrBuffer, R0 ; буфер сохранения экрана под пушкой
                mov     #27, R2         ; восстанавливаем экран

1$:             mov     #CannonSprW, R3

2$:             movb    (R0)+, (R1)+
                sob     R3, 2$
                add     #CannonSprPitch, R1
                sob     R2, 1$
                add     R4, @#CannonAddrDraw       ; следующий адрес пушки
; End of function Func122


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

; Отобразить пушку

Func124:        mov     #CanScrBuffer, R0 ; буфер сохранения экрана под пушкой
                mov     @#CannonAddrDraw, R1 ; адрес экрана пушки
                mov     #27, R2         ; сохраняем экран в буфере

1$:             mov     #CannonSprW, R3

2$:             movb    (R1)+, (R0)+
                sob     R3, 2$
                add     #CannonSprPitch, R1
                sob     R2, 1$
                mov     #CannonSprMask, R0
                mov     @#CannonAddrDraw, R1 ; адрес экрана пушки
                ; рисуем пушку
                mov     #CannonSprW, R3
                mov     #6, R2
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #600, R1
                add     #24, R0
                mov     #2, R2
                mov     #4, R5
3$:             .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #200, R1
                sob     R5, 3$
                add     #12, R0
                mov     #11, R2
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     #CannonSprite, R0
                mov     @#CannonAddrDraw, R1
                mov     #CannonSprW, R3
                mov     #6, R2          ; рисуем сперва 6 строк
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #600, R1
                add     #24, R0
                mov     #2, R2          ; затем 2 строки повторяем
                mov     #4, R5
4$:             .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #200, R1
                sob     R5, 4$
                add     #12, R0
                mov     #11, R2         ; затем остальные 9 строк
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                return
; End of function Func124

; ───────────────────────────────────────────────────────────────────────────
; Обрабатываем усложнения второго этапа
ProcDiffsStg2$: tst     @#NeedMkFrstAct ; начальное отображение пушки?
                beq     1$              ; не, уже было, теперь движение только
                clr     @#NeedMkFrstAct ; сбросим флаг
                mov     @#CannonAddr, @#CannonAddrDraw ; и покажем пушку на экране
                .word   FUNC$ + 124     ; Отобразить пушку

1$:             tst     @#PlatfScaleYUp$ ; платформа ещё не достигла финишного положения
                bne     4$              ; да - пропускаем действия
                mov     @#BallonAddr, R0 ; адрес воздушного шара
                mov     @#CannonAddr, R1 ; адрес пушки
                bic     #177700, R0
                bic     #177700, R1
                cmp     R0, R1          ; где они относительно друг-друга?
                ble     2$              ; пушка правее шара
                ; пушка левее шара
                cmp     #100 - CannonSprW, R1 ; до правого края доехали?
                beq     4$              ; да - ничего не делать
                mov     #1, R4          ; нет - двигаться вправо
                mov     @#CannonAddr, R1 ; адрес пушки
                .word   FUNC$ + 122     ; Передвинуть пушку
                                        ; Вход: R1 - текущий адрес пушки
                                        ; Вход: R4 - приращение адреса
                br      3$
; ───────────────────────────────────────────────────────────────────────────

2$:             cmp     #0, R1          ; до левого края доехали?
                beq     4$              ; да - ничего не делать
                mov     #-1, R4         ; нет - двигаться влево
                mov     @#CannonAddr, R1
                .word   FUNC$ + 122     ; Передвинуть пушку
                                        ; Вход: R1 - текущий адрес пушки
                                        ; Вход: R4 - приращение адреса
; ───────────────────────────────────────────────────────────────────────────

3$:             add     R4, @#CannonAddr ; и корректируем адрес

4$:             nop
                nop
                nop
                nop
                jmp     @#ProcDiffsStg2.1$
; ───────────────────────────────────────────────────────────────────────────

NextStartStage1.1$:
                mov     #BulletBuffer, R0 ; очищаем буфер пулек
                mov     #BulletsNum * 2, R1

1$:             clr     (R0)+
                sob     R1, 1$
                jmp     @#NextStartStage1.2$
; ───────────────────────────────────────────────────────────────────────────
                ; тут стрельба пушки
ProcDiffsStg2.1$:
                bic     #177730, ShootCounter
                tst     (PC)+           ; стрелять пора?
ShootCounter:   .word 4
                bne     4$              ; нет ещё
                mov     @#CannonAddr, R0
                bic     #177700, R0     ; положение пушки по горизонтали
                mov     #36, R1         ; если где-то посередине
                mov     #6, R2

1$:             cmp     R0, R1
                beq     4$              ; то пушка не стреляет, там посадочная платформа
                inc     R1
                sob     R2, 1$
                mov     #50, @#ShootCounter ; иначе инициализируем счётчик до следующего выстрела
                mov     #BulletBuffer, R1   ; в буфере пуль
                mov     #BulletsNum, R2

2$:             tst     (R1)+           ; ищем пустое место
                beq     3$              ; нашли - можно стрелять
                tst     (R1)+
                sob     R2, 2$
                br      4$              ; не нашли - все пули в воздухе
; ───────────────────────────────────────────────────────────────────────────

3$:             .word   FUNC$ + 126     ; Выстрел из пушки
                tst     -(R1)
                mov     @#CannonAddr, R0
                sub     #3176, R0       ; это начальный адрес пули
                mov     R0, (R1)+
                clr     (R1)+           ; направление - вверх
                ; теперь осмотрим буфер, и обработаем полёты пуль
4$:             mov     #BulletBuffer, R4

5$:             mov     (R4)+, R1       ; адрес
                beq     7$              ; 0 - тут пусто
                tst     (R4)+           ; куда летит?
                bne     6$              ; вниз
                .word   FUNC$ + 130     ; Полёт снаряда верх
                br      7$
; ───────────────────────────────────────────────────────────────────────────

6$:             .word   FUNC$ + 132     ; Полёт снаряда вниз

7$:             tst     @#CannonHitCount ; Шар подбили?
                bne     8$              ; нет ещё
                jmp     @#GoFail$
; ───────────────────────────────────────────────────────────────────────────

8$:             cmp     #BulletBuffer + BulletBufferSize - 2, R4 ; до конца буфер дошли?
                bne     5$              ; нет - продолжаем

                dec     @#ShootCounter  ; уменьшаем счётчик до следующего выстрела
                jmp     @#ProcCommonDiffs$

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

; Полёт пули вверх
; Вход: R1 - адрес экран
;       R4 - адрес элемента в буфере + 4

Func130:        mov     #BulletUpSprMask, R0
                mov     #7, R2          ; стираем пульку

1$:             clrb    (R1)+
                add     #77, R1
                sob     R2, 1$
                mov     #7, R2
                mov     #1, R3
                sub     #4, R4          ; адрес текущего элемента в массиве
                sub     #300, (R4)      ; изменяем адрес пули
                bit     #137000, R1     ; пуля до верха долетела?
                bne     2$              ; нет ещё
                dec     (R4)+           ; да - смещаем адрес, чтобы не прямо на том же месте было
                com     (R4)+           ; меняем направление движения
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     (R4)+, R1       ; новый адрес пули
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                sub     #BulletUpSprMask - BulletUpSprite, R0
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                call    @#HitCheck
                return
; End of function Func130

; ───────────────────────────────────────────────────────────────────────────
Sound15$:       .word 10
                .word 500, 100, 0

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

; Выстрел из пушки

Func126:        mov     #Sound15$, R4
                mov     #500, R0
                mov     @#CannonAddr, R1
                sub     #1076, R1
                mov     #7, R2

1$:             movb    (R1)+, (R0)+    ; сохраним содержимое экрана в буфере
                add     #77, R1
                sob     R2, 1$
                mov     #7, R2
                sub     #700, R1
                mov     #ShootSprite, R0 ; нарисуем выстрел

2$:             movb    (R0)+, (R1)+
                add     #77, R1
                sob     R2, 2$
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                sub     #700, R1        ; и восстановим экран
                mov     #7, R2
                mov     #500, R0

3$:             movb    (R0)+, (R1)+
                add     #77, R1
                sob     R2, 3$
                return
; End of function Func126


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

; Полёт пули вниз
; Вход: R1 - адрес экран
;       R4 - адрес элемента в буфере + 4

Func132:        mov     #BulletDnSprMask+3, R0 ; тут у нас не вся пулька а только её часть
                mov     #4, R2

1$:             clrb    (R1)+
                add     #77, R1
                sob     R2, 1$
                mov     #4, R2          ; высота спрайта
                mov     #1, R3          ; ширина спрайта
                sub     #4, R4          ; адрес текущего элемента в массиве
                cmp     #71000, R1      ; до низа долетели?
                bgt     2$              ; нет
                                        ; да
                call    @#FallDnBullet  ; Обработка падения пули, она просто падает без последствий
                                        ; Вход: R4 - адрес текущего элемента в массиве
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             add     #200, (R4)      ; новый адрес пули
                mov     (R4)+, R1       ; рисуем
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                sub     #BulletDnSprMask - BulletDnSprite, R0
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                return
; End of function Func132


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


StoreRegs:      mov     R0, @#510
                mov     #512, R0
                mov     R1, (R0)+
                mov     R2, (R0)+
                mov     R3, (R0)+
                mov     R4, (R0)+
                mov     R5, (R0)+
                return
; End of function StoreRegs


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


RestoreRegs:    mov     #512, R0
                mov     (R0)+, R1
                mov     (R0)+, R2
                mov     (R0)+, R3
                mov     (R0)+, R4
                mov     (R0)+, R5
                mov     @#500, R0
                return
; End of function RestoreRegs


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

; Обработка падения пули, она просто падает без последствий
; Вход: R4 - адрес текущего элемента в массиве

FallDnBullet:      mov     #ShootSprite, R0
                mov     (R4), R1        ; адрес пули
                sub     #200, R1        ; чуть вверх
                clr     (R4)+           ; очищаем элемент массива
                clr     (R4)+
                mov     #7, R2          ; высота спрайта
                mov     #1, R3          ; ширина
                ; тут рисуем полностью пульку
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     #Sound16$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                .word   FUNC$ + 22      ; Стирание спрайта с экрана безусловное
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                return
; End of function FallDnBullet

; ───────────────────────────────────────────────────────────────────────────
Sound16$:       .word 10
                .word 140, 1000, 0

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

; Проверка на попадание
; Вход: R1 - адрес экрана пули
;       R4 - адрес текущего элемента в массиве + 2

HitCheck:       mov     R4, @#466
                call    @#GetBallonAddr ; Получим адрес воздушного шара
                                        ; Выход: R2 - адрес - 600
                mov     R1, R3
                mov     #77, R5
                mov     #177700, R4
                mov     R2, R0
                mov     R3, R1
                bic     R4, R0
                bic     R4, R1
                cmp     R0, R1
                ble     1$
                return
; ───────────────────────────────────────────────────────────────────────────

1$:             add     #3, R0
                cmp     R0, R1
                bge     2$
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     R2, R0
                mov     R3, R1
                bic     R5, R0
                bic     R5, R1
                cmp     R0, R1
                ble     3$
                return
; ───────────────────────────────────────────────────────────────────────────

3$:             add     #3000, R0
                cmp     R0, R1
                bge     6$
                mov     R3, R1
                mov     R2, R0
                inc     R0
                bic     R4, R0
                bic     R4, R1
                cmp     R0, R1
                ble     4$
                return
; ───────────────────────────────────────────────────────────────────────────

4$:             inc     R0
                cmp     R0, R1
                bge     5$
                return
; ───────────────────────────────────────────────────────────────────────────

5$:             mov     R3, R1
                mov     R2, R0
                add     #4200, R0
                bic     R5, R0
                bic     R5, R1
                cmp     R0, R1
                bge     6$
                return
; ───────────────────────────────────────────────────────────────────────────

6$:             mov     R3, R0
                mov     #7, R1

7$:             clrb    (R0)
                add     #100, R0
                sob     R1, 7$
                mov     R3, R1
                mov     #ShootSprite, R0 ; рисуем попадание
                mov     #7, R2
                mov     #1, R3
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     #Sound17$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                .word   FUNC$ + 22      ; Стирание спрайта с экрана безусловное
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                dec     @#CannonHitCount ; попали!   ### заменить на tst для бессмертия
                mov     #1, @#ShootCounter ; нужно немедленно снова стрелять
                mov     @#466, R4
                tst     -(R4)           ; очищаем элемент массива
                clr     (R4)+
                clr     (R4)+
                return
; End of function HitCheck

; ───────────────────────────────────────────────────────────────────────────
Sound17$:       .word 22
                .word 100, 1000, 100, 0

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

; Получим адрес воздушного шара
; Выход: R2 - адрес - 600

GetBallonAddr:  mov     @#BallonAddr, R2
                sub     #600, R2
                nop
                return
; End of function GetBallonAddr


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

; Анимация взрыва воздушного шара

BallonBlowAnim: mov     #SpriteBlow1, R0
                mov     @#BallonAddr, R1
                add     #1100, R1
                mov     #BlowSprH, R2
                mov     #BlowSprW, R3
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     #Sound18$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #BlowSprLen, R0
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     #Sound19$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #BlowSprLen, R0
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     #Sound20$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                return
; End of function BallonBlowAnim

; ───────────────────────────────────────────────────────────────────────────
Sound18$:       .word 30
                .word 1000, 100, 0
Sound19$:       .word 30
                .word 700, 200, 0
Sound20$:       .word 30
                .word 600, 300, 0
; ширина 4, высота 21
SpriteBlow1:    .byte 0, 0, 0, 0
                .byte 0, 0, 300, 3
                .byte 300, 0, 60, 14
                .byte 60, 17, 60, 63
                .byte 260, 60, 214, 14
                .byte 14, 63, 63, 3
                .byte 60, 310, 10, 14
                .byte 300, 156, 314, 62
                .byte 60, 300, 41, 314
                .byte 74, 56, 362, 343
                .byte 303, 300, 14, 314
                .byte 43, 54, 62, 60
                .byte 74, 63, 63, 0
                .byte 300, 60, 310, 0
                .byte 0, 300, 63, 0
                .byte 0, 0, 14, 0
                .byte 0, 0, 0, 0
; ширина 4, высота 21
SpriteBlow2:    .byte 0, 0, 0, 0
                .byte 0, 34, 43, 0
                .byte 200, 0, 0, 14
                .byte 303, 0, 62, 0
                .byte 0, 7, 0, 0
                .byte 0, 300, 14, 63
                .byte 40, 60, 60, 0
                .byte 3, 314, 317, 10
                .byte 301, 300, 14, 114
                .byte 0, 314, 317, 300
                .byte 63, 60, 60, 4
                .byte 0, 2, 2, 314
                .byte 60, 0, 300, 0
                .byte 0, 60, 14, 0
                .byte 0, 40, 0, 2
                .byte 60, 3, 304, 60
                .byte 4, 0, 3, 0
; ширина 4, высота 21
SpriteBlow3:    .byte 0, 0, 0, 0
                .byte 0, 0, 0, 0
                .byte 0, 0, 0, 0
                .byte 0, 0, 60, 0
                .byte 0, 2, 2, 10
                .byte 0, 14, 0, 0
                .byte 0, 0, 3, 0
                .byte 0, 0, 0, 14
                .byte 1, 60, 63, 100
                .byte 0, 0, 0, 0
                .byte 300, 0, 3, 0
                .byte 0, 0, 300, 0
                .byte 0, 0, 0, 0
                .byte 200, 60, 20, 2
                .byte 0, 0, 0, 0
                .byte 0, 0, 0, 0
                .byte 0, 0, 0, 0
BlowSprLen = SpriteBlow2 - SpriteBlow1
BlowSprW = 4
BlowSprH = 21
; ───────────────────────────────────────────────────────────────────────────

GoFail$:        mov     #BallonSprMask, R0
                mov     @#BallonAddr, R1
                mov     #BallonSprH, R2
                mov     #BallonSprW, R3
                .word   FUNC$ + 10      ; Стирание методом побитовой очистки
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                call    @#BallonBlowAnim ; Анимация взрыва воздушного шара
                mov     #strYouDied, R4
                mov     #50002, R1
                mov     #StrYouDiedLen1, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1376, R1
                inc     R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1422, R1
                mov     #StrYouDiedLen3, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1372, R1
                mov     #StrYouDiedLen4, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1370, R1
                mov     #StrYouDiedLen5, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
GoFail1$:       mov     #Sound21$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
1$:             tst     @#177714
                bne     2$
                cmp     #100250, @#177716
                bmi     1$

2$:             jmp     @#GoTryAgain
; ───────────────────────────────────────────────────────────────────────────
Sound21$:       .word 30
                .word 1600, 1000, 1200, 0
strYouDied:     .ascii "ПОДВОДНАЯ ЛОДКА"
strYuDied2:     .ascii "В СТЕПЯХ УКРАИНЫ"
strYuDied3:     .ascii "ПОГИБЛА"
strYuDied4:     .ascii "В НЕРАВНОМ"
strYuDied5:     .ascii "ВОЗДУШНОМ БОЮ!"
strYouDiedEnd:
Text11$:        .ascii "ХВАТИТ ЛОМАТЬСЯ!"
Text11L2:       .ascii "ИДИ ОСТЫНЬ!"
Text11L3:       .ascii "ТВОЕ ВРЕМЯ"
Text11L4:       .ascii "ИСТЕКЛО!"
Text11End$:    .even
StrYouDiedLen1 = strYuDied2 - strYouDied
StrYouDiedLen2 = strYuDied3 - strYuDied2
StrYouDiedLen3 = strYuDied4 - strYuDied3
StrYouDiedLen4 = strYuDied5 - strYuDied4
StrYouDiedLen5 = strYouDiedEnd - strYuDied5
StrText11Len1 = Text11L2 - Text11$
StrText11Len2 = Text11L3 - Text11L2
StrText11Len3 = Text11L4 - Text11L3
StrText11Len4 = Text11End$ - Text11L4

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

StageTimeOut:   mov     #50002, R1
                mov     #Text11$, R4
                mov     #StrText11Len1, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #2412, R1
                add     R3, R4
                mov     #StrText11Len2, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                br      NextTimeOut$
; ───────────────────────────────────────────────────────────────────────────

Start1$:        clr     @#36
                mov     #Start0$, R0    ; начиная отсюда

1$:             cmp     R0, (R0)+       ; ищем ячейку, совпадающую со своим значением
                bne     1$              ; находим по адресу 21716, в R0 = 21720
                mov     -20302(R0), PC  ; и стартуем оттуда
                                        ; 21720-20302 = 1416. По этому адресу число 12700
                                        ; это и есть адрес запуска
                emt     14              ; это никогда не выполнится
                jmp     @#Func04+122
; ───────────────────────────────────────────────────────────────────────────
OffStart:       .word Start1$           ; адрес функции запуска
; ───────────────────────────────────────────────────────────────────────────

NextTimeOut$:   add     #2402, R1
                dec     R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #1404, R1
                add     R3, R4
                tst     -(R3)
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                jmp     @#GoFail1$
; ───────────────────────────────────────────────────────────────────────────
                .word 171717
                .word 171717
; ширина 6 высота 12
SpriteCometL1:  .byte 300, 3, 3, 0, 0, 0
                .byte 374, 75, 40, 0, 0, 0
                .byte 234, 47, 0, 0, 0, 0
                .byte 377, 357, 4, 0, 200, 0
                .byte 377, 227, 300, 300, 0, 4
                .byte 376, 227, 0, 10, 40, 304
                .byte 377, 357, 20, 0, 1, 0
                .byte 234, 47, 0, 0, 300, 0
                .byte 374, 75, 0, 0, 40, 0
                .byte 300, 3, 3, 0, 0, 0
SpriteCometL2:  .byte 300, 3, 0, 0, 0, 0
                .byte 174, 77, 3, 0, 0, 0
                .byte 330, 66, 20, 100, 0, 0
                .byte 373, 377, 0, 14, 14, 0
                .byte 326, 377, 300, 200, 200, 300
                .byte 326, 277, 10, 200, 0, 0
                .byte 373, 377, 0, 4, 10, 14
                .byte 330, 66, 60, 300, 0, 0
                .byte 174, 77, 3, 0, 0, 0
                .byte 300, 3, 0, 0, 0, 0
SpriteCometLEnd:
SpriteCometR1:  .byte 0, 0, 0, 300, 300, 3
                .byte 0, 0, 0, 10, 174, 77
                .byte 0, 0, 0, 0, 330, 66
                .byte 0, 2, 0, 20, 373, 377
                .byte 20, 0, 3, 3, 326, 377
                .byte 23, 10, 40, 0, 326, 277
                .byte 0, 100, 0, 4, 373, 377
                .byte 0, 3, 0, 0, 330, 66
                .byte 0, 10, 0, 0, 174, 77
                .byte 0, 0, 0, 300, 300, 3
SpriteCometR2:  .byte 0, 0, 0, 0, 300, 3
                .byte 0, 0, 0, 300, 374, 75
                .byte 0, 0, 3, 14, 234, 47
                .byte 60, 40, 20, 0, 377, 357
                .byte 0, 0, 2, 40, 376, 227
                .byte 3, 2, 2, 3, 377, 227
                .byte 0, 60, 60, 0, 377, 357
                .byte 0, 0, 1, 4, 234, 47
                .byte 0, 0, 0, 300, 374, 75
                .byte 0, 0, 0, 0, 300, 3
SpriteCometREnd:
CometSprW = 6
CometSprH = 12
CometSprPitch = 100 - CometSprW

; универсальный буфер для разных этапов
; для этапа 3
CometBuffer:
CometsNum = 20      ; количество комет на этапе 3
CometsNum4 = 10     ; для этапа 4 - в 2 раза меньше
CometBufferLen = 20*4 ; размер буфера в байтах
; для этапа 5
HeadBlowCenter:
HeadScratchBuffer = HeadBlowCenter + 2
HeadBulletNum = 10
                .word 0
                .word 50615, 41311, 51005, 60311, 46241, 43735, 53361, 55665
                .blkw 27
; ───────────────────────────────────────────────────────────────────────────
; начинаем третий этап
StartStage3:    .word   FUNC$ + 74      ; Прокрутка экрана с попутной очисткой внутри рамки
                nop
                nop
                mov     #CometBuffer, R0 ; очистка буфера комет
; элемент массива - 2 слова: адрес спрайта кометы, адрес экрана
                mov     #CometsNum*2, R1

1$:             clr     (R0)+
                sob     R1, 1$
                mov     #2, @#CometHitCount ; шар выдержит 3 попадания
                mov     #55414, R1
                mov     #strInfoStg3, R4
                mov     #StrInfoStg3Len1, R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     #1776, R1
                add     R3, R4
                inc     R3
                jmp     @#NextStartStage3.1$
; ───────────────────────────────────────────────────────────────────────────
strInfoStg3:    .ascii "ОПАСАЙТЕСЬ"
strInfoStg3L2:  .ascii "МЕТЕОРИТОВ!"
strInfoStg3End: .even
StrInfoStg3Len1 = strInfoStg3L2 - strInfoStg3
StrInfoStg3Len2 = strInfoStg3End - strInfoStg3L2

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

NextGC5$:       cmp     #43, @#Stage    ; сейчас этап 3?
                beq     1$              ; да
                jmp     @#NextGC6$      ; нет
; ───────────────────────────────────────────────────────────────────────────
; обработка доп. усложнений для этапа 3
1$:             tst     (PC)+           ; комету запускать?
CometLaunchCnt: .word 7                 ; счётчик запуска комет
                bne     5$              ; рано ещё
                mov     #15, @#CometLaunchCnt ;инициализируем счётчик
                mov     #CometBuffer, R0
                mov     #CometsNum, R2

2$:             tst     (R0)+           ; ищем свободное место в буфере
                bne     4$
                mov     @#177710, (R0)  ; нашли
                add     #40000, (R0)    ; генерируем случайный адрес
                bic     #76, (R0)
                nop                     ; тут видимо не получилось
                mov     #SpriteCometL1, -(R0) ; комета у нас всегда левая
                tst     (R0)+
                bis     #73, (R0)
                br      3$
; ───────────────────────────────────────────────────────────────────────────
                mov     #SpriteCometR1, -(R0)
3$:             br      5$
; ───────────────────────────────────────────────────────────────────────────

4$:             tst     (R0)+
                sob     R2, 2$

5$:             dec     @#CometLaunchCnt ; уменьшаем счётчик
                ; осмотрим буфер, обработаем полёт всех комет
                mov     #CometBuffer, R4
                mov     #CometsNum, R0

6$:             tst     (R4)            ; пусто?
                beq     8$              ; да - идём дальше
                cmp     #SpriteCometR1, (R4)
                bge     7$              ; комета левая
                nop
                br      8$              ; комета правая
; ───────────────────────────────────────────────────────────────────────────

7$:             .word   FUNC$ + 134     ; Прорисовка комет, летящих слева направо
                                        ; Вход: R4 - адрес текущего элемента массива


8$:             add     #4, R4
                sob     R0, 6$
                jmp     @#ProcCommonDiffs$

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

; Прорисовка комет, летящих слева направо
; Вход: R4 - адрес текущего элемента массива

Func134:        mov     (R4)+, R0       ; это адрес спрайта
                nop
                nop
                mov     (R4), R1        ; это адрес экрана
                ; стираем комету с текущего места
                mov     #CometSprH, R2

1$:             nop
                mov     #CometSprW, R3

2$:             clrb    (R1)+
                nop
                nop
                nop
                nop
                nop
                sob     R3, 2$
                nop
                add     #CometSprPitch, R1
                sob     R2, 1$
                nop
                nop
                .word   FUNC$ + 136     ; Проверка на попадания кометы в шара
                                        ; Вход R4 - адрес текущего элемента массива комет
                nop
                nop
                add     #77, (R4)       ; двигаем комету
                mov     (R4), R1
                mov     R1, R2
                bic     #177700, R2     ; до левого края дошла?
                cmp     #77, R2
                bne     3$              ; нет

F134Exit:       clr     (R4)            ; да - всё нету её, улетела
                clr     -(R4)
                return
; ───────────────────────────────────────────────────────────────────────────
                ; рисуем комету
3$:             mov     #CometSprH, R2

4$:             nop
                mov     #CometSprW, R3

5$:             movb    (R0)+, (R1)+
                sob     R3, 5$
                add     #CometSprPitch, R1
                sob     R2, 4$
                cmp     #SpriteCometLEnd, R0 ; массив кончился?
                bne     6$              ; нет
                mov     #SpriteCometL1, -(R4) ; снова делаем начальную
                br      7$
; ───────────────────────────────────────────────────────────────────────────

6$:             add     #CometSprW*CometSprH, -(R4) ; переходим к следующему спрайту

7$:             return
; End of function Func134

; ───────────────────────────────────────────────────────────────────────────
; !!! --- мусор
                nop
                nop
                nop
                nop
                nop

10$:            return
; ───────────────────────────────────────────────────────────────────────────
                nop
                br      10$
; !!! --- мусор --- end

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

; Проверка на попадания кометы в шара
; Вход R4 - адрес текущего элемента массива комет

Func136:        mov     (R4), R1
                mov     @#BallonAddr, R2       ; адрес вывода спрайта воздушного шара
                mov     R1, R3
                add     #1106, R3
                cmp     R3, R2
                bgt     1$
                return
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     R2, R3
                add     #3304, R3
                cmp     R1, R3
                blt     2$
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             bic     #177700, R1
                bic     #177700, R2
                mov     R1, R3
                add     #5, R3
                cmp     R3, R2
                bgt     3$
                return
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     R2, R3
                add     #4, R3
                cmp     R1, R3
                blt     4$
                return
; ───────────────────────────────────────────────────────────────────────────

4$:             mov     #Sound22$, R4
                call    @#Func72        ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                mov     #F134Exit, 16(SP) ; выходом из функции будет переход туда, а там ещё один return на уровень выше
                tst     @#CometHitCount ; предел прочности достигнут?
                beq     5$              ; да, всё, подбили
                dec     @#CometHitCount ; нет ещё, уменьшаем счётчик попаданий  ### заменить на tst для бессмертия
                return
; ───────────────────────────────────────────────────────────────────────────

5$:             mov     #TopStack-2, SP
                mov     #GoFail$, (SP)
                return
; End of function Func136

; ───────────────────────────────────────────────────────────────────────────
Sound22$:       .word 2
                .word 1000, 1400, 400, 1400
                .word 1000, 400, 0
Text13$:        .ascii "НЕ ДАВИ НА РАЗУМ"
Text13$End:     .even
Text13Len = Text13$End - Text13$

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

TrapTo4:        mov     #TopStack, SP
                .word   FUNC$ + 2       ; Инициализация некоторых переменных драйвера экрана
                mov     #Text13Len, R3
                .word   FUNC$ + 114     ; Вывод на экран строк об авторе, копирайт,
                                        ; и сделать остальной текст синим.
                mov     #Text13$, R4
                mov     #57000, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                br      1$
                .word 1$
                .word 100
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     #TopStack, SP
                .word   FUNC$ + 16      ; Проверка на нажатие клавиши или кнопки джойстика, если нажата - выход
                cmp     #'1-20, @#Stage ; текущий этап 1?
                beq     2$              ; да - переход,
                dec     @#Stage         ; иначе - уменьшаем этап в наказание

2$:             mov     #TrapTo4, @#4
                mov     @#177662, R0
                jmp     @#StartOverTT4$
; ───────────────────────────────────────────────────────────────────────────
; начинаем четвёртый этап
StartStage4:    mov     #2, @#CometHitCount ; шар выдержит 3 попадания
; элемент массива - 2 слова: адрес спрайта кометы, адрес экрана
                mov     #CometBuffer, R1    ; очищаем буфер комет
                mov     #CometsNum4 * 2 + 2, R2    ; зачем-то +2

1$:             clr     (R1)+
                sob     R2, 1$
                jmp     @#NextStartStage4.1$
; ───────────────────────────────────────────────────────────────────────────

NextGC6$:       cmp     #44, @#Stage    ; у нас 4-й этап?
                beq     1$              ; да
                jmp     @#NextGC7$      ; нет
; ───────────────────────────────────────────────────────────────────────────
; обработка усложнений для 4-го этапа
; тут кометы летают и слева и справа
1$:             tst     @#NeedMkFrstAct ; действие сделать надо?
                beq     2$              ; нет
                mov     #30, @#CometStg4Delay ; да - зададим задержку появления комет
                clr     @#NeedMkFrstAct ; флаг сбрасываем

2$:             tst     (PC)+           ; кометы пора отображать?
CometStg4Delay: .word 0
                beq     3$              ; да
                dec     @#CometStg4Delay ; нет - уменьшаем задержку
                jmp     @#NextProcDiffsStg5$-2 ; здесь ошибка, переход должен быть на метку ProcCommonDiffs$
                                        ; непонятно, что задумывалось, может какое-нибудь хитрое запутывание действий
                                        ; но сейчас переход в середину команды, а там число 25020 - cmp @-(R0),(R0)+
                                        ; команда выполняется без последствий, если в R0 валидный адрес и происходит
                                        ; продолжение работы и делается не нужное действие которое имеет смысл только на 5 этапе
                                        ; но в общем случае - работает как и должно, просто с лишними действиями
; ───────────────────────────────────────────────────────────────────────────
                ; отображаем кометы
3$:             tst     (PC)+           ; новую комету пора отображать?
CometStg4Cnt:   .word 1                 ; счётчик до появления кометы
                bne     8$              ; нет
                mov     #7, @#CometStg4Cnt ; да, инициализируем счётчик
                mov     #CometBuffer, R0 ; ищем в буфере свободное место
                mov     #CometsNum4, R2

4$:             tst     (R0)+
                bne     7$
                mov     @#177710, (R0)  ; нашли, добавляем
                add     #40000, (R0)    ; новую комету
                bic     #10076, (R0)
                bit     #1, (R0)        ; адрес нечётный?
                beq     5$              ; нет - правая комета
                mov     #SpriteCometL1, -(R0) ; да - левая
                tst     (R0)+
                bis     #73, (R0)
                br      6$
; ───────────────────────────────────────────────────────────────────────────

5$:             mov     #SpriteCometR1, -(R0)

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

7$:             tst     (R0)+
                sob     R2, 4$

8$:             dec     @#CometStg4Cnt  ; уменьшаем счётчик
                ; обрабатываем кометы
                mov     #CometBuffer, R4
                mov     #CometsNum4, R0

9$:             tst     (R4)            ; элемент пуст?
                beq     11$             ; да
                cmp     #<SpriteCometL2+4>, (R4) ; нет, какая комета?
                bge     10$             ; левая
                                        ; правая
                .word   FUNC$ + 140     ; Прорисовка комет, летящих справа налево
                                        ; Вход: R4 - адрес текущего элемента массива

                br      11$
; ───────────────────────────────────────────────────────────────────────────

10$:            .word   FUNC$ + 134     ; Прорисовка комет, летящих слева направо
                                        ; Вход: R4 - адрес текущего элемента массива
11$:            add     #4, R4
                sob     R0, 9$
                mov     #CometBuffer + 2, R0
                .word   FUNC$ + 142     ; Просмотр массива на счёт врезавшихся друг в друга встречно летящих комет,
                                        ; если они врезались друг в друга - взаимоуничтожаются
                                        ; Вход: R0 - адрес буфера комет + 2
                jmp     @#ProcCommonDiffs$

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

; Прорисовка комет, летящих справа налево
; Вход: R4 - адрес текущего элемента массива

Func140:        mov     (R4)+, R0
                mov     (R4), R1
                mov     #CometSprH, R2

1$:             mov     #CometSprW, R3

2$:             clrb    (R1)+
                sob     R3, 2$
                add     #CometSprPitch, R1
                sob     R2, 1$
                mov     (R4), R1
                .word   FUNC$ + 136     ; Проверка на попадания кометы в шара
                                        ; Вход R4 - адрес текущего элемента массива комет
                mov     R1, R2
                bic     #177700, R2
                cmp     #72, R2
                bne     3$
                clr     (R4)
                clr     -(R4)
                return
; ───────────────────────────────────────────────────────────────────────────

3$:             add     #101, (R4)
                mov     (R4), R1
                mov     #CometSprH, R2

4$:             mov     #CometSprW, R3

5$:             movb    (R0)+, (R1)+
                sob     R3, 5$
                add     #CometSprPitch, R1
                sob     R2, 4$
                cmp     #SpriteCometREnd, R0
                bne     6$
                mov     #SpriteCometR1, -(R4)
                br      7$
; ───────────────────────────────────────────────────────────────────────────

6$:             add     #CometSprW*CometSprH, -(R4)

7$:             return
; End of function Func140

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

NextGC3$:       mov     #TopStack, SP
                jmp     @#NextGC4$
; ───────────────────────────────────────────────────────────────────────────
                .word 0

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

; Просмотр массива на счёт врезавшихся друг в друга встречно летящих комет,
; если они врезались друг в друга - взаимоуничтожаются
; Вход: R0 - адрес буфера комет + 2

Func142:        mov     #CometsNum4, R5

1$:             mov     R5, R1
                mov     R0, R4          ; адрес текущего элемента

2$:             add     #4, R4
                .word   FUNC$ + 144     ; проверка на коллизию встречно летящих комет
                                        ; если они врезались друг в друга - взаимоуничтожаются
                                        ; Вход: R0 - адрес эл-та 1
                                        ;       R4 - адрес эл-та 2
                sob     R1, 2$
                add     #4, R0
                sob     R5, 1$
                return
; End of function Func142


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

; проверка на коллизию встречно летящих комет
; если они врезались друг в друга - взаимоуничтожаются
; Вход: R0 - адрес эл-та 1
;       R4 - адрес эл-та 2
Func144:        mov     (R0), R2        ; адрес экрана эл-та 1
                beq     1$              ; 0 - там пусто, нечего делать
                mov     (R4), R1        ; адрес экрана эл-та 2
                beq     1$              ; 0 - там пусто, нечего делать
                mov     R1, R3          ; сперва сравним, на одной ли высоте, пересекаются?
                add     #1106, R3
                cmp     R3, R2
                bgt     2$

1$:             return
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     R2, R3
                add     #1106, R3
                cmp     R1, R3
                blt     3$
                return
; ───────────────────────────────────────────────────────────────────────────

3$:             bic     #177700, R1     ; теперь сравним  по координате X
                bic     #177700, R2
                mov     R1, R3
                add     #6, R3
                cmp     R3, R2
                bgt     4$
                return
; ───────────────────────────────────────────────────────────────────────────

4$:             mov     R2, R3
                add     #6, R3
                cmp     R1, R3
                blt     5$
                return
; ───────────────────────────────────────────────────────────────────────────

5$:             mov     (R0), R1        ; если пересеклись
                mov     (R4), R2
                clr     (R0)            ; то взаимоуничтожаются
                clr     (R4)
                clr     -(R4)
                clr     -(R0)
                mov     #CometSprH, R3  ; убираем с экрана

6$:             mov     #CometSprW, R4

7$:             clrb    (R1)+
                clrb    (R2)+
                sob     R4, 7$
                add     #CometSprPitch, R1
                add     #CometSprPitch, R2
                sob     R3, 6$
                mov     #Sound22$, R4
                jmp     @#Func72        ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
; End of function Func144

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

; Проверка на удачное финиширование
; Вход: R2 - адрес спрайта воздушного шара

FinishCheck:    cmp     R2, @#FinishAddr
                beq     1$
                inc     R2
                cmp     R2, @#FinishAddr
                beq     1$
                inc     R2
                cmp     R2, @#FinishAddr
                beq     1$
                dec     R2
                return
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     #TopStack-2, SP
                mov     #FinishStage$, (SP)
                return
; End of function FinishCheck

; ───────────────────────────────────────────────────────────────────────────
; спрайт, используется в функции 146,
; но со сдвигом на 1 байт
; бля, он реально сдвинут, начало 30027, ширина 3, высота 16
SpriteBoshka:   .byte 252, 0, 300
                .byte 125, 17, 250
                .byte 125, 52, 324
                .byte 377, 27, 327
                .byte 377, 327, 353
                .byte 377, 353, 353
                .byte 175, 353, 365
                .byte 377, 137, 265
                .byte 175, 136, 327
                .byte 226, 327, 327
                .byte 226, 327, 324
                .byte 353, 27, 250
                .byte 125, 52, 360
                .byte 125, 17, 0
                .byte 0
                .byte 0
BoshkaSprW = 3
BoshkaSprH = 16
BoshkaSprPitch = 100 - BoshkaSprW

SpiteHeadBullet:.byte ^B11101011
                .byte ^B10111110
                .byte ^B11010111
                .even
HeadBulletSprH = 3
HeadBulletSprW = 1
; ───────────────────────────────────────────────────────────────────────────
; начинаем пятый этап
StartStage5:    mov     #Sound23$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                jmp     @#NextStartStage5.1$
; ───────────────────────────────────────────────────────────────────────────

Sound23$:       .word 20
                .word 100, 200, 300, 400
                .word 300, 200, 100, 0
; ───────────────────────────────────────────────────────────────────────────

NextGC7$:       cmp     #45, @#Stage    ; у нас 5-й этап?
                beq     1$              ; да
                jmp     @#NextGC8$      ; нет
; ───────────────────────────────────────────────────────────────────────────
; обработка усложнений для 5-го этапа
; тут летает какая-то бошка и взрывается
1$:             tst     (PC)+           ; бошку выводить?
HeadCnt:        .word 14                ; счётчик до появления бошки
                bne     2$              ; нет ещё
                ; генерируем параметры бошки
                mov     #60, @#HeadCnt  ; инициализируем счётчик
                mov     @#177710, @#HeadAddr ; адрес
                mov     @#177710, @#HeadTimeLife ; время жизни
                call    @#sub_31054     ; корректируем
                nop
                bic     #177703, @#HeadAddr  ; корректируем адрес
                add     #40000, @#HeadAddr
2$:             .word   FUNC$ + 146     ; Отображаем бошку, проверяем время её жизни и встречу с воздушным шаром
                .word   FUNC$ + 150     ; Прорисовка разлетающихся осколков от башки
                                        ; и проверка на попадание в воздушный шар
                jmp     @#NextProcDiffsStg5$

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

; Отображаем бошку, проверяем время её жизни и встречу с воздушным шаром

Func146:        cmp     #37777, @#HeadAddr ; адрес в пределах экрана?
                bgt     1$
                cmp     #77777, @#HeadAddr
                blt     1$
                mov     @#HeadAddr, R1 ; да, берём его
                mov     #BoshkaSprH, R2
                mov     #BoshkaSprW, R3
                .word   FUNC$ + 22      ; Стирание спрайта с экрана безусловное
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                dec     @#HeadTimeLife  ; ещё живёт?
                bne     2$              ; да
                ; нет
                mov     @#HeadAddr, R0  ; берём адрес бошки
                add     #701, R0        ; её центр
                mov     R0, @#HeadBlowCenter ; сохраним туда
                clr     @#HeadAddr      ; всё бошки нет, она взорвалась

1$:             return
; ───────────────────────────────────────────────────────────────────────────
                ; нарисуем в новом месте
2$:             mov     #<SpriteBoshka-1>, R0 ; чё-то адрес спрайта на 1 байт сдвинут
                add     #400, @#HeadAddr ; бошка просто спускается вниз вертикально
                mov     @#HeadAddr, R1
                .word   FUNC$ + 6       ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                ; проверка на встречу воздушного шара с башкой
                mov     @#BallonAddr, R2
                mov     R1, R3
                add     #1503, R3
                cmp     R3, R2
                bgt     3$
                return
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     R2, R3
                add     #3304, R3
                cmp     R1, R3
                blt     4$
                return
; ───────────────────────────────────────────────────────────────────────────

4$:             bic     #177700, R1
                bic     #177700, R2
                mov     R1, R3
                add     #3, R3
                cmp     R3, R2
                bgt     5$
                return
; ───────────────────────────────────────────────────────────────────────────

5$:             mov     R2, R3
                add     #4, R3
                cmp     R1, R3
                blt     6$
                return
; ───────────────────────────────────────────────────────────────────────────
                ; фатально - встречаться нельзя
6$:             mov     #TopStack, SP
                jmp     @#GoFail$
; End of function Func146
; ───────────────────────────────────────────────────────────────────────────

NextProcDiffsStg5$:
                dec     @#HeadCnt
                jmp     @#ProcCommonDiffs$
; ───────────────────────────────────────────────────────────────────────────

Sound24$:       .word 10
                .word 100, 600, 100, 300
                .word 100, 0
; это приращения адреса для каждой из пулек взорвавшейся башки
word_30502:     .word -3
                .word -300
                .word 3
                .word 300
                .word -102
                .word -177
                .word 102
                .word 177

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

; Прорисовка разлетающихся осколков от башки
; и проверка на попадание в воздушный шар

Func150:        mov     #HeadScratchBuffer, R0
                mov     #HeadBulletNum, R1

1$:             mov     (R0)+, R3       ; адрес пульки
                beq     3$              ; нету
                mov     #3, R4          ; есть - стираем с экрана

2$:             clrb    (R3)
                add     #100, R3
                sob     R4, 2$

3$:             sob     R1, 1$          ; весь массив
                mov     #HeadBlowCenter, R0 ; эпицентр
                tst     (R0)            ; есть?
                beq     5$              ; нету
                mov     #HeadBulletNum, R1
                mov     (R0), R2        ; есть - берём адрес
                clr     (R0)+           ; его стираем, чтоб выше на метку 5$ переходить

4$:             mov     R2, (R0)+       ;заполняем массив пулек начальным адресом
                sob     R1, 4$
                mov     #Sound24$, R4   ; звук взрыва башки
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
5$:             mov     #HeadBulletNum, R2
                mov     #HeadScratchBuffer, R0
                mov     #word_30502, R1 ; массив приращений адресов

6$:             tst     (R0)+           ; пулька есть?
                beq     10$             ; нету
                tst     -(R0)           ; проверим не вышла ли за пределы экрана
                cmp     #40400, (R0)
                blt     7$
                add     #23000, (R0)

7$:             cmp     #65000, (R0)
                bgt     8$
                sub     #23000, (R0)

8$:             add     (R1)+, (R0)     ; добавим приращение
                mov     (R0)+, R3       ; вот новый адрес
                mov     #SpiteHeadBullet, R4 ; рисуем пульку
                mov     #HeadBulletSprH, R5

9$:             movb    (R4)+, (R3)
                add     #100, R3
                sob     R5, 9$
                sub     #200, R3        ; проверяем, попали в шар?
                mov     @#BallonAddr, R4
                cmp     R3, R4
                blt     10$
                sub     #100, R3
                add     #3304, R4
                cmp     R3, R4
                bgt     10$
                bic     #177700, R4
                bic     #177700, R3
                cmp     R3, R4
                bgt     10$
                sub     #4, R4
                cmp     R3, R4
                blt     10$
                jmp     @#11$
; ───────────────────────────────────────────────────────────────────────────
                .word 171717
                .word 171717
; ───────────────────────────────────────────────────────────────────────────

10$:            sob     R2, 6$
                return
; ───────────────────────────────────────────────────────────────────────────

11$:            dec     @#CannonHitCount ; Попали!  ### заменить на tst для бессмертия
                beq     13$             ; жизни кончились? - переход
                mov     -(R0), R3       ; нет ещё
                mov     #3, R4

12$:            clrb    (R3)
                add     #100, R3
                sob     R4, 12$
                clr     (R0)+
                nop
                mov     #Sound25$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                br      10$
; ───────────────────────────────────────────────────────────────────────────
                ; всё, начинаем сначала
13$:            mov     #TopStack, SP
                jmp     @#GoFail$
; End of function Func150

; ───────────────────────────────────────────────────────────────────────────
Sound25$:       .word 10
                .word 300, 400, 1000, 70
                .word 0

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


sub_31054:      bic     #177740, @#HeadTimeLife
                add     #6, @#HeadTimeLife
                return
; End of function sub_31054

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

NextStartStage5.1$:
                clr     @#HeadAddr
                clr     @#HeadTimeLife
                mov     #2, @#HeadCnt
                jmp     @#StartStage4   ; начинаем четвёртый этап
; ───────────────────────────────────────────────────────────────────────────
strCongratulations:
                .ascii "БОРТНИК БОРИС"
strCongrL2:     .ascii "ПОЗДРАВЛЯЕТ ВАС"
strCongrL3:     .ascii "С ЗАВЕРШЕНИЕМ"
strCongrL4:     .ascii "ПЕРВОЙ ИГРЫ."
strCongrL5:     .ascii "ЕСЛИ ВЫ УСПЕЛИ"
strCongrL6:     .ascii "ПРИОБРЕСТИ"
strCongrL7:     .ascii "ВТОРУЮ ИГРУ,"
strCongrL8:     .ascii "ТО МОЖЕТЕ"
strCongrL9:     .ascii "СПАТЬ СПОКОЙНО!"
strCongratulationsEnd: .even
StrCongrLen1 = strCongrL2 - strCongratulations
StrCongrLen2 = strCongrL3 - strCongrL2
StrCongrLen3 = strCongrL4 - strCongrL3
StrCongrLen4 = strCongrL5 - strCongrL4
StrCongrLen5 = strCongrL6 - strCongrL5
StrCongrLen6 = strCongrL7 - strCongrL6
StrCongrLen7 = strCongrL8 - strCongrL7
StrCongrLen8 = strCongrL9 - strCongrL8
StrCongrLen9 = strCongratulationsEnd - strCongrL9


LoopGameFinishEnd$:
                .word   FUNC$ + 74      ; Прокрутка экрана с попутной очисткой внутри рамки
; Игра полностью пройдена
GameFinishEnd$: mov     #47006, R1
                mov     #StrCongrLen1, R3
                mov     #strCongratulations, R4
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1374, R1
                tst     (R3)+
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                tst     -(R3)
                add     #1404, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                dec     R3
                add     #1402, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                tst     (R3)+
                add     #2774, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrCongrLen6, R3
                add     #1410, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                tst     (R3)+
                add     #1374, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                add     #1404, R1
                tst     -(R3)
                dec     R3
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                add     R3, R4
                mov     #StrCongrLen9, R3
                add     #1366, R1
                .word   FUNC$ + 104     ; Вывод строки на экран
                                        ; Вход: R1 - адрес экрана
                                        ;       R3 - длина строки
                                        ;       R4 - адрес строки
                .word   FUNC$ + 114     ; Вывод на экран строк об авторе, копирайт,
                                        ; и сделать остальной текст синим.
; ───────────────────────────────────────────────────────────────────────────
                mov     #FinalMelody, R4 ; это аргумент функции 152
                mov     #TrapTo4Fin$, @#4
                mov     @#177662, R0
                mov     #TrapTo4Fin$, @#60
                mov     #TrapTo4Fin$, @#274
                mov     @#177662, R0
                .word   FUNC$ + 152     ; Проигрыш музыки
                                        ; Вход: R4 - адрес массива мелодии
                jmp     @#NextGameFinishEnd$
; ───────────────────────────────────────────────────────────────────────────
; Массив данных для функции 152
; параметры мелодии
FinalMelody:    .word 170004, 70010, 40552, 70003, 30552, 40440, 40362, 20265
                .word 20300, 20327, 20300, 50265, 30300, 30327, 20362, 20420
                .word 20440, 20420, 44362, 24362, 24362, 134362, 44420, 34440
                .word 44440, 134744, 24744, 134552, 34744, 134552, 34744, 70004
                .word 44552, 70003, 30552, 40440, 40362, 20220, 20241, 20265
                .word 20241, 50220, 30241, 30265, 20300, 20265, 20241, 20265
                .word 32300, 32241, 32300, 32241, 32327, 32265, 20300, 20265
                .word 20241, 20265, 32300, 32241, 32300, 32241, 32327, 32265
                .word 32362, 20362, 20420, 32440, 22440, 20502, 30440, 30362
                .word 54265, 70003, 34241, 44300, 32265, 50265, 70005, 70007

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

; Проигрыш музыки
; Вход: R4 - адрес массива мелодии

Func152:        mov     R4, R5
                mov     R4, word_32312

1$:             mov     (R5), R2
                bit     #1760, (R5)
                beq     9$
                bic     #176000, R2
                mov     word_32314, R1
                mov     R1, R0
                bit     #2000, (R5)
                bne     2$
                bit     #4000, (R5)
                beq     3$
                asr     R0

2$:             asr     R0
                asr     R0
                sub     R0, R1
                asl     R0
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     #1, R0

4$:             clr     R4

5$:             inc     R4
                sub     R2, R1
                bpl     5$
                mov     (R5), R3
                bic     #107777, R3
                swab    R3
                asrb    R3
                asrb    R3
                asrb    R3
                asrb    R3

6$:             asl     R4
                asl     R0
                sob     R3, 6$
                mov     (R5)+, R3
                bic     #77777, R3
                beq     7$
                mov     R4, R3
                asr     R3
                add     R3, R4

7$:             mov     R2, R1
                mov     #100, @#177716
                sob     R1, .

                mov     R2, R1
                mov     #0, @#177716
                sob     R1, .

                sob     R4, 7$

                sob     R0, .

8$:             cmp     #70007, (R5)
                beq     18$
                br      1$
; ───────────────────────────────────────────────────────────────────────────

9$:             bit     #100000, (R5)+
                beq     12$
                bic     #170000, R2
                clr     R3

10$:            add     #1000, R3
                sob     R2, 10$
                mov     R3, word_32314

11$:            br      1$
; ───────────────────────────────────────────────────────────────────────────

12$:            bit     #10, R2
                bne     15$
                bic     #170070, R2
                mov     word_32314, R3
                asr     R3
                asr     R3

13$:            asl     R3
                sob     R2, 13$
                mov     #7, R2

14$:            mov     R3, R1
                sob     R1, .
                sob     R2, 14$
                br      8$
; ───────────────────────────────────────────────────────────────────────────

15$:            cmp     #70011, R2
                bne     17$
                tst     word_32310
                beq     16$
                clr     word_32310
                br      8$
; ───────────────────────────────────────────────────────────────────────────

16$:            inc     word_32310
                mov     word_32312, R5
                br      11$
; ───────────────────────────────────────────────────────────────────────────

17$:            mov     R5, word_32312
                br      11$
; ───────────────────────────────────────────────────────────────────────────

18$:            return
; End of function Func152

; ───────────────────────────────────────────────────────────────────────────
word_32310:     .word 0
word_32312:     .word 31516
word_32314:     .word 4000
; ───────────────────────────────────────────────────────────────────────────

NextGameFinishEnd$:
                mov     #Sound28$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                jmp     @#LoopGameFinishEnd$
; ───────────────────────────────────────────────────────────────────────────
Sound28$:       .word 10
                .word 100, 400, 1000, 0
; ───────────────────────────────────────────────────────────────────────────

TrapTo4Fin$:    mov     #TopStack, SP
                .word   FUNC$ + 2       ; Инициализация некоторых переменных драйвера экрана
                .word   FUNC$ + 102     ; Очистка экрана горизонтальными линиями сверху и снизу
                add     #204, @#177664
                ; вывод текста РЕКЛАМА, который потом прыгает вверх вниз с затуханием
                mov     #strReklama, R4
                mov     #36604, R1

1$:             movb    (R4)+, R2
                beq     7$
                bic     #177400, R2
                mov     #FONT - 240, R0

2$:             add     #12, R0
                sob     R2, 2$
                mov     #12, R2

3$:             movb    (R0)+, R5
                mov     #10, R3

4$:             clrb    (R1)
                ror     R5
                bcc     6$
                bit     #100, R1
                beq     5$
                movb    #167, (R1)
                br      6$
; ───────────────────────────────────────────────────────────────────────────

5$:             movb    #335, (R1)

6$:             inc     R1
                sob     R3, 4$
                add     #70, R1
                sob     R2, 3$
                sub     #1170, R1
                br      1$
; ───────────────────────────────────────────────────────────────────────────

7$:             mov     #36700, R0
                mov     #56400, R1
                mov     #400, R2

8$:             mov     (R0)+, (R1)+
                sob     R2, 8$
                mov     #332, R5
                clr     0FinFlag$

9$:             mov     R5, R4
                com     0FinFlag$

10$:            tst     (PC)+
0FinFlag$:      .word 177777
                beq     11$
                inc     @#177664
                br      12$
; ───────────────────────────────────────────────────────────────────────────

11$:            dec     @#177664

12$:            bis     #1000, @#177664
                mov     #1000, R0
                sob     R0, .
                sob     R4, 10$
                mov     #Sound29$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                clc
                ror     R5
                beq     13$
                mov     R5, R4
                clc
                ror     R4
                add     R4, R5
                br      9$
; ───────────────────────────────────────────────────────────────────────────
RekData = 300
RekColor1=302
RekColor2=304

13$:            mov     #ReklColorTbl, @#RekData
                ; строка увеличивается в высоту и отображается разными цветами
                ; из таблицы ReklColorTbl
NextFinal$:     mov     @#RekData, R0
                mov     (R0), @#RekColor1
                mov     (R0)+, @#RekColor2
                ror     @#RekColor2
                ror     @#RekColor2
                cmp     #ReklColorTblEnd, R0
                bne     1$
                mov     #ReklColorTbl, R0

1$:             mov     R0, @#RekData
                mov     #56700, R0
                mov     #37200, R1
                mov     #37300, R3
                mov     #57000, R2

2$:             mov     #24, R4

3$:             mov     #100, R5

4$:             clrb    (R0)
                clrb    (R2)
                tstb    (R1)+
                beq     6$
                bit     #100, R0
                beq     5$
                movb    @#RekColor1, (R0)
                br      6$
; ───────────────────────────────────────────────────────────────────────────

5$:             movb    @#RekColor2, (R0)

6$:             inc     R0
                tstb    (R3)+
                beq     8$
                bit     #100, R2
                beq     7$
                movb    @#RekColor1, (R2)
                br      8$
; ───────────────────────────────────────────────────────────────────────────

7$:             movb    @#RekColor2, (R2)

8$:             inc     R2
                sob     R5, 4$
                sub     #100, R1
                sub     #100, R3
                sub     #200, R0
                sob     R4, 3$
                sub     #100, R1
                add     #100, R3
                cmp     #40000, R3
                bne     2$
                mtps    #0
                mov     #VecKbdFin$, @#60
                mov     #VecKbdFin$, @#274
                mov     @#177662, R0
                mov     @#177662, R0
                nop
                jmp     @#NextFinal$
; ───────────────────────────────────────────────────────────────────────────
datGame:        .word FONT + <'G - 40>*10. + 1 ;113105    ; адреса букв GAME
                .word FONT + <'A - 40>*10. + 1 ;113011
                .word FONT + <'M - 40>*10. + 1 ;113201
                .word FONT + <'E - 40>*10. + 1 ;113061
                .word 0

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


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

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

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

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

4$:             mov     (PC)+, R4
154.ScaleY$:    .word 14

5$:             movb    (R3), R2        ; берём очередной байт данных символа
                mov     #8., 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     154.ScaleY$, R4 ; перейдём к позиции следующего символа

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

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

10$:            mov     #36, R4
                mov     R4, R3
                mov     #100, @#177716
                sob     R3, .
                clr     @#177716
                sob     R4, .
                sob     R0, 10$

                cmp     @#52, 154.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 Func154


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

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

VecKbdFin$:     mov     #TopStack, SP
                mov     #40, R0
                mov     #-1, (R0)+      ; 40 цвет цифры 2
                mov     #42020, (R0)+   ; 42 адрес с которого выводить цифру 2
                mov     #40000, (R0)+   ; 44 начало экрана
                mov     #datGame, (R0)+ ; 46 адрес массива
                mov     #52525, (R0)+   ; 50 цвет
                mov     #14, (R0)+      ; 52 макс.масштаб
                mov     #2, (R0)+       ; 54 сама цифра 2
                mov     #44, (R0)+      ; 56
                mov     #61000, @#64    ; адрес с которого начинать выводить слово GAME
                .word   FUNC$ + 154     ; выводит GAME 2
                mov     #Sound7$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                jmp     @#NextFinal1$

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

; Вывод скроллом текста, описания к игре 2

Func156:        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    F156.MovAddrDn  ; очистка следующей строки экрана и скроллинг
                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    F156.ScrlUp     ; Проверка, на границы экрана, чтоб адрес за них не вышел и скролл на 1 строку
                sob     R5, 7$          ; и так все 8 строк символа
                mov     R1, @#40        ; новый адрес сохраним
                br      Func156         ; и всё сначала
; End of function Func156


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

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

F156.MovAddrDn: add     #100, R1        ; на строку экрана вниз
; End of function F156.MovAddrDn


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

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

F156.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 F156.ScrlUp

; ───────────────────────────────────────────────────────────────────────────
; данные для функции 156
; формат такой:
; byte nScroll, nIndent, nLen
; ascii "string"
; конец данных - byte x,x,x,0
byte_34064:     .byte 100, 25, 6
                .ascii "GAME 2"
                .byte 55, 12, 13
                .ascii "В этой игре"
                .byte 6, 14, 12
                .ascii "перед вами"
                .byte 6, 2, 17
                .ascii "ставится задача"
                .byte 6, 6, 15
                .ascii "проникнуть на"
                .byte 6, 0, 20
                .ascii "базу противника,"
                .byte 6, 15, 11
                .ascii "преодолев"
                .byte 20, 15, 11
                .ascii "970000 км"
                .byte 20, 3, 17
                .ascii "зарпетной зоны."
                .byte 40, 12, 13
                .ascii "Космическое"
                .byte 6, 10, 14
                .ascii "пространснво"
                .byte 6, 24, 6
                .ascii "усеяно"
                .byte 6, 12, 13
                .ascii "патрульными"
                .byte 6, 16, 11
                .ascii "кораблями"
                .byte 6, 12, 13
                .ascii "противника."
                .byte 40, 14, 12
                .ascii "Трудновато"
                .byte 6, 7, 15
                .ascii "вам придется."
                .byte 52, 0, 20
                .ascii "Управляемый вами"
                .byte 6, 2, 17
                .ascii "корабль, помимо"
                .byte 6, 10, 14
                .ascii "передвижения"
                .byte 6, 6, 15
                .ascii "вперед, может"
                .byte 6, 2, 17
                .ascii "перемещаться по"
                .byte 6, 4, 16
                .ascii "всему экрану и"
                .byte 6, 12, 13
                .ascii "стрелять по"
                .byte 6, 4, 17
                .ascii "3 направлениям."
                .byte 77, 10, 14
                .ascii "Приобретайте"
                .byte 6, 11, 14
                .ascii "вторую игру."
                .byte 377, 1, 1
                .ascii " "
                .byte 1, 0, 0, 0
                .even

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

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

Func160:        mov     @#40, R1
                bic     #177400, R2
                mov     #FONT-240+1, R0

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

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   ; берём ещё данные
                bne     2$          ; пока не 0
                return              ; 0 - конец, но так мы не сможем вывести знаки типа . , - (у которых вверху нули)
; End of function Func160


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

; Вывод текста сложного формата на экран
; Вход: @#46 - адрес массива данных
;       @#40 - адрес экрана, куда выводить

Func162:        mov     @#46, R0        ; адрес массива

1$:             movb    (R0)+, R1       ; берём байт
                bic     #177400, R1     ; расширение знака убираем
                mov     R1, @#42        ; это масштаб по высоте
                movb    (R0)+, R1       ; берём второй байт
                bic     #177400, R1
                mov     R1, @#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, @#40        ;  и это смещение в строке

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

8$:             .word   FUNC$ + 160     ; выводим символ
                add     #10, @#40       ; ширина - фиксированная
                br      7$
; End of function Func162

; ───────────────────────────────────────────────────────────────────────────
; данные для функции 162
; формат:
; сперва идут два байта параметров: byte ScaleY, ColorMask
; затем данные, если 320 - то за ним снова два байта параметров
; если 377, то за ним байт - смещение по высоте в строках
; если 321..376 - то это смещение в строке + 320
; всё остальное - символы - 20
SecondName:     .byte   30,  167, 'C-20, 'O-20
                .byte  377,   34
                .byte  320,   20, 167
                .byte  340, 'E-20
                .byte  340, 'N-20
                .byte  377,   34
                .byte  320,   10,  167
                .byte  331,  'S-20
                .byte  356,  'D-20, 0
                .even

Sound30$:       .word 14
                .word 300, 500, 700, 1100
                .word 1300, 1500, 1300, 1100
                .word 700, 500, 300, 1000
                .word 0

; ───────────────────────────────────────────────────────────────────────────
NextFinal1$:    .word   FUNCF$ + 102    ; Очистка экрана горизонтальными линиями сверху и снизу

1$:             mov     #45430, @#40    ; начальный адрес
                mov     #SecondName, @#46
                .word   FUNCF$ + 162    ; Вывод названия SECOND
                mov     #Sound30$, R4
                .word   FUNC$ + 72      ; Вывод звука с повышением тона
                                        ; Вход: R4 - адрес блока параметров
                                        ;       .word длит.
                                        ;       .word тон,тон,..., 0 - конец цепочки
                mov     #40, R0
                mov     #77700, (R0)+   ; 40    адрес экрана вывода
                mov     #byte_34064, (R0)+ ; 42 адрес данных
                mov     #370, (R0)+     ; 44    маска цвета
                mov     #11000, (R0)+   ; 46    задержка
                .word   FUNCF$ + 156    ; Вывод скроллом текста, описания к игре 2
                mov     #VecKbdFin1$, @#60
                mov     #VecKbdFin1$, @#274
                mtps    #0
                mov     @#177662, R0
                mov     #1330, @#177664
                jmp     @#1$
; ───────────────────────────────────────────────────────────────────────────

VecKbdFin1$:    mov     #TopStack, SP
                mov     #'5-20, @#Stage ; ставим 5-й этап
                mov     #TrapTo4, @#4
                .word   FUNCF$ + 002    ; Инициализация некоторых переменных драйвера экрана
                .word   FUNCF$ + 000    ; Очистка экрана диагонально зубчатыми линиями
                br      NextFinal2$
; ───────────────────────────────────────────────────────────────────────────
; Ракета, ширина 10 высота 17
SpriteRocket:   .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
RocketSprW = 10
RocketSprH = 17
RocketSprPitch = 100 - RocketSprW

; это спрайты выхлопа ракеты
                .word ^B0000000000000110    ; 35570, ширина 2, высота 12
                .word ^B0000000000000010
RocketFlame:    .word ^B0000000011110000
                .word ^B0000111101010000
                .word ^B1111100100000000
                .word ^B1111101001000000
                .word ^B0000111110100000
                .word ^B0000000011110000
                .word ^B0000000000000110
                .word ^B0000000000000010
RocketFlame1:   .word ^B1111111100000000    ; 35614, ширина 2, высота 6
                .word ^B0000111011110000
                .word ^B0000001101000000
                .word ^B0000001101000000
                .word ^B0000111011110000
                .word ^B1111111100000000

; ───────────────────────────────────────────────────────────────────────────
; тут рисуется поверхность
; и анимация взлетающей ракеты, поверхность скроллится по горизонтали,
; ракета постепенно взлетает

NextFinal2$:    mov     #72070, R4
                mov     #67, R5
                mov     #74000, @#320
                mov     @#320, R1
                mov     #40, R3
                mov     R3, R2

1$:             clr     (R1)+
                sob     R2, 1$
                add     #33, R2
                mov     #GroundSprite, R0
                .word   FUNCF2$ + 22    ; Стирание спрайта с экрана безусловное
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                .word   FUNCF2$ + 06    ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                add     #40, R1
                .word   FUNCF2$ + 22    ; Стирание спрайта с экрана безусловное
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                .word   FUNCF2$ + 06    ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                inc     @#320
                nop

2$:             nop
                mov     #SpriteRocket, R0
                mov     #RocketSprH, R2
                mov     #RocketSprW, R3
                mov     R4, R1
                .word   FUNCF2$ + 22    ; Стирание спрайта с экрана безусловное
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                sub     #301, R1
                .word   FUNCF2$ + 06    ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     R1, R4
                mov     #RocketFlame, R0
                com     #-1
                beq     3$
                add     #RocketFlame1-RocketFlame, R0

3$:             mov     #6, R2
                mov     #2, R3
                add     #1110, R1
                .word   FUNCF2$ + 22    ; Стирание спрайта с экрана безусловное
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                sub     #301, R1
                .word   FUNCF2$ + 06    ; Рисование методом наложения
                                        ; Вход: R0 - адрес спрайта в памяти
                                        ;       R1 - адрес экрана
                                        ;       R2 - высота спрайта
                                        ;       R3 - ширина спрайта в байтах
                mov     #GameStars, R2
                .word   FUNCF2$ + 04    ; Прорисовка мигающих звёздочек
                                        ; Вход: R2 - адрес блока параметров:
                                        ;            .word число элементов (пар адресов)
                                        ;            .word адрес спрайта в памяти
                                        ;            .word адрес экрана
                mov     #Sound31$, R3
                .word   FUNCF2$ + 14    ; Звучание тонального набора
                                        ; Вход: R3 - адрес тонального набора - цепочка пар слов
                                        ;            .word длительность (0 - конец цепочки),
                                        ;            .word тон.
                nop
                mov     #77777, R0

4$:             movb    -(R0), 1(R0)
                cmp     #73776, R0
                bne     4$
                sob     R5, 2$
                br      NextFinal3$
; ───────────────────────────────────────────────────────────────────────────
Sound31$:       .word 10, 10
                .word 10, 20
                .word 10, 10
                .word 0
; ───────────────────────────────────────────────────────────────────────────

NextFinal3$:    mov     #FinalMelody, R4
                mov     #TopStack, SP
                mov     #SkipSplash$, -(SP)
                jmp     @#Func152       ; Проигрыш музыки
                                        ; Вход: R4 - адрес массива мелодии

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

; Воспроизведение фоновой музыки в игре

BackgrndMusic$: mov     #100, R5
                mov     CurrMelNote$, R0 ; адрес текущей играемой ноты мелодии
                cmp     #EndMelody$, R0
                bne     1$
                sub     #<EndMelody$-Melody2$>, R0

1$:             movb    (R0)+, R1
                bpl     2$
                mov     #77770, R1

2$:             mov     #77770, R2
                mov     R2, R3
                mov     #5000, R4

3$:             dec     R1
                bgt     4$
                mov     R5, @#177716
                movb    -1(R0), R1
                dec     R3
                dec     R2
                clr     @#177716

4$:             dec     R2
                dec     R3
                nop
                nop
                sob     R4, 3$
                mov     R0, (PC)+
CurrMelNote$:   .word Melody1$          ; адрес текущей играемой ноты мелодии
                return
; End of function BackgrndMusic$

; ───────────────────────────────────────────────────────────────────────────
Melody2$:       .byte 72, 101, 72, 116, 143, 116, 166, 200
                .byte 72, 101, 72, 116, 143, 116
Melody1$:       .byte 166, 200, 72, 63, 61, 63, 61, 72
                .byte 63, 72, 63, 101, 72, 101, 72, 101
                .byte 72, 200, 72, 101, 72, 116, 143, 116
                .byte 166, 200, 72, 101, 72, 116, 143, 116
                .byte 166, 200, 72, 63, 61, 63, 61, 72
                .byte 63, 72, 63, 101, 72, 101, 72, 63
                .byte 61, 200, 46, 53, 46, 61, 101, 61
                .byte 116, 200, 46, 53, 46, 61, 101, 61
                .byte 116, 200, 46, 42, 40, 42, 40, 46
                .byte 42, 46, 42, 53, 46, 53, 46, 53
                .byte 46, 200
EndMelody$:
; ───────────────────────────────────────────────────────────────────────────
; это фактически хвостовая часть подготовщика
; ну и пусть тут будет, тут она более к месту
; эта п/п размещается по адресу 100
MV1$:           clr     @#FirePower
                mov     #Melody2$, @#CurrMelNote$ ; адрес текущей играемой ноты мелодии
                return
; ───────────────────────────────────────────────────────────────────────────
                .word BackgrndMusic$
                .blkw 34


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

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

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

    mov #strAbout, R1
12$: movb (R1), R0
    beq 10$
    bpl 11$
    sub #40, R0
11$: sub #20, R0
10$: movb R0, (R1)+
    cmp R1, #strAboutEnd
    blo 12$

    mov #strGame, R1
15$: movb (R1), R0
    beq 13$
    bpl 14$
    sub #40, R0
14$: sub #20, R0
13$: movb R0, (R1)+
    cmp R1, #strGameEnd
    blo 15$

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

    mov #strControls, R1
22$: movb (R1), R0
    beq 20$
    bpl 21$
    sub #40, R0
21$: sub #20, R0
20$: movb R0, (R1)+
    cmp R1, #strControlsEnd
    blo 22$

     mov #strInformation1, R1
25$: movb (R1), R0
    beq 23$
    bpl 24$
    sub #40, R0
24$: sub #20, R0
23$: movb R0, (R1)+
    cmp R1, #strInformation1End
    blo 25$

    mov #strInformation2, R1
29$: movb (R1), R0
    beq 27$
    bpl 28$
    sub #40, R0
28$: sub #20, R0
27$: movb R0, (R1)+
    cmp R1, #strInformation2End
    blo 29$

    mov #ScoreStore, R1
32$: movb (R1), R0
    beq 30$
    bpl 31$
    sub #40, R0
31$: sub #20, R0
30$: movb R0, (R1)+
    cmp R1, #ScoreStoreEnd
    blo 32$

     mov #strInfoStg2, R1
35$: movb (R1), R0
    beq 33$
    bpl 34$
    sub #40, R0
34$: sub #20, R0
33$: movb R0, (R1)+
    cmp R1, #strInfoStg2End
    blo 35$

    mov #strYouDied, R1
39$: movb (R1), R0
    beq 37$
    bpl 38$
    sub #40, R0
38$: sub #20, R0
37$: movb R0, (R1)+
    cmp R1, #Text11End$
    blo 39$

     mov #strInfoStg3, R1
42$: movb (R1), R0
    beq 40$
    bpl 41$
    sub #40, R0
41$: sub #20, R0
40$: movb R0, (R1)+
    cmp R1, #strInfoStg3End
    blo 42$

     mov #Text13$, R1
45$: movb (R1), R0
    beq 43$
    bpl 44$
    sub #40, R0
44$: sub #20, R0
43$: movb R0, (R1)+
    cmp R1, #Text13$End
    blo 45$

    mov #strCongratulations, R1
49$: movb (R1), R0
    beq 47$
    bpl 48$
    sub #40, R0
48$: sub #20, R0
47$: movb R0, (R1)+
    cmp R1, #strCongratulationsEnd
    blo 49$
.ENDS

.SCRIPT "F156 Encode"
        mov #byte_34064, R5
1$:     tst (R5)+
        movb (R5)+, R3
        beq 10$
2$:     movb (R5), R0
        beq 10$
        bpl 3$
        sub #40, R0
3$:     sub #20, R0
        movb R0, (R5)+
        sob R3, 2$
        br 1$
10$:
.ENDS

GMCEnd$:        .END
