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


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


; ═══════════════════════════════════════════════════════════════════════════
FONT = 112276
TopStack = 760
                jmp     Entry$

; Спрайты монстра в машинке
SprHeadCarLt1:  .word 26, 4
                .byte 0, 0, 125, 0
                .byte 0, 120, 125, 5
                .byte 0, 124, 125, 25
                .byte 0, 120, 125, 125
                .byte 0, 117, 125, 125
                .byte 300, 77, 125, 125
                .byte 300, 77, 125, 125
                .byte 0, 0, 125, 25
                .byte 0, 120, 5, 25
                .byte 0, 105, 25, 5
                .byte 0, 0, 104, 1
                .byte 0, 125, 121, 0
                .byte 74, 0, 240, 2
                .byte 257, 0, 250, 12
                .byte 203, 2, 252, 76
                .byte 0, 252, 12, 77
                .byte 0, 240, 300, 77
                .byte 0, 12, 240, 77
                .byte 214, 50, 210, 16
                .byte 77, 357, 363, 16
                .byte 200, 50, 210, 2
                .byte 0, 12, 240, 0
SprHeadCarLt2:  .word 26, 5
                .byte 0, 124, 1, 0, 0
                .byte 100, 125, 25, 0, 0
                .byte 120, 125, 125, 0, 0
                .byte 100, 125, 125, 1, 0
                .byte 74, 125, 125, 1, 0
                .byte 377, 124, 125, 1, 0
                .byte 377, 124, 125, 1, 0
                .byte 0, 124, 125, 0, 0
                .byte 100, 125, 121, 0, 0
                .byte 25, 125, 105, 1, 0
                .byte 0, 124, 5, 25, 0
                .byte 0, 125, 0, 124, 1
                .byte 100, 0, 0, 200, 12
                .byte 24, 0, 0, 240, 52
                .byte 0, 0, 0, 252, 372
                .byte 0, 0, 200, 52, 374
                .byte 0, 0, 240, 2, 377
                .byte 0, 0, 50, 200, 376
                .byte 0, 60, 242, 40, 72
                .byte 0, 374, 274, 317, 73
                .byte 0, 0, 242, 40, 12
                .byte 0, 0, 50, 200, 2
SprHeadCarRt1:  .word 26, 4
                .byte 0, 125, 0, 0
                .byte 120, 125, 5, 0
                .byte 124, 125, 25, 0
                .byte 125, 125, 5, 0
                .byte 125, 125, 361, 0
                .byte 125, 125, 374, 3
                .byte 125, 125, 374, 3
                .byte 124, 125, 0, 0
                .byte 124, 120, 5, 0
                .byte 120, 124, 121, 0
                .byte 100, 121, 0, 0
                .byte 0, 105, 125, 0
                .byte 200, 12, 0, 74
                .byte 240, 52, 0, 372
                .byte 274, 252, 200, 302
                .byte 374, 240, 252, 0
                .byte 374, 3, 12, 0
                .byte 374, 12, 240, 0
                .byte 260, 42, 50, 62
                .byte 260, 317, 373, 374
                .byte 200, 42, 50, 2
                .byte 0, 12, 240, 0
SprHeadCarRt2:  .word 26, 5
                .byte 0, 0, 100, 25, 0
                .byte 0, 0, 124, 125, 1
                .byte 0, 0, 125, 125, 5
                .byte 0, 100, 125, 125, 1
                .byte 0, 100, 125, 125, 74
                .byte 0, 100, 125, 25, 377
                .byte 0, 100, 125, 25, 377
                .byte 0, 0, 125, 25, 0
                .byte 0, 0, 105, 125, 1
                .byte 0, 100, 121, 125, 124
                .byte 0, 124, 120, 25, 0
                .byte 100, 25, 0, 125, 0
                .byte 240, 2, 0, 0, 1
                .byte 250, 12, 0, 0, 24
                .byte 257, 252, 0, 0, 0
                .byte 77, 250, 2, 0, 0
                .byte 377, 200, 12, 0, 0
                .byte 277, 2, 50, 0, 0
                .byte 254, 10, 212, 14, 0
                .byte 354, 363, 76, 77, 0
                .byte 240, 10, 212, 0, 0
                .byte 200, 2, 50, 0, 0
; Спрайты глаза
SpriteEye1:     .word 16, 4
                .byte 0, 360, 17, 0
                .byte 300, 317, 363, 3
                .byte 60, 317, 363, 14
                .byte 374, 0, 0, 77
                .byte 17, 0, 77, 360
                .byte 60, 0, 374, 17
                .byte 77, 74, 374, 377
                .byte 77, 14, 374, 377
                .byte 74, 0, 374, 77
                .byte 303, 0, 377, 303
                .byte 74, 300, 17, 74
                .byte 360, 17, 360, 17
                .byte 300, 377, 377, 3
                .byte 0, 360, 17, 0
SpriteEye2:     .word 16, 4
                .byte 0, 360, 17, 0
                .byte 300, 317, 363, 3
                .byte 60, 317, 363, 14
                .byte 360, 0, 0, 17
                .byte 17, 17, 360, 360
                .byte 360, 3, 300, 17
                .byte 377, 303, 303, 377
                .byte 377, 303, 303, 377
                .byte 374, 3, 300, 77
                .byte 303, 17, 360, 303
                .byte 74, 0, 0, 74
                .byte 360, 17, 360, 17
                .byte 300, 377, 377, 3
                .byte 0, 360, 17, 0
SpriteEye3:     .word 16, 4
                .byte 0, 360, 17, 0
                .byte 300, 317, 363, 3
                .byte 60, 317, 363, 14
                .byte 360, 0, 0, 17
                .byte 17, 377, 0, 360
                .byte 360, 77, 0, 14
                .byte 377, 77, 74, 374
                .byte 377, 77, 60, 374
                .byte 374, 77, 0, 74
                .byte 303, 377, 0, 303
                .byte 74, 360, 3, 74
                .byte 360, 17, 360, 17
                .byte 300, 377, 377, 3
                .byte 0, 360, 17, 0
SprEyeSize = SpriteEye2 - SpriteEye1


; спрайты взрыва
SprSmallBlow:   .word 10, 2
                .word ^B0000110011000000
                .word ^B0011111111110000
                .word ^B1111110011111111
                .word ^B1111000000111100
                .word ^B0011000000001111
                .word ^B0011110000001111
                .word ^B0011111100111100
                .word ^B0000111111000000
SprMiddleBlow:  .word 15, 3
                .byte 60, 60, 0
                .byte 374, 360, 0
                .byte 374, 377, 3
                .byte 360, 317, 363
                .byte 377, 0, 77
                .byte 77, 0, 374
                .byte 377, 0, 74
                .byte 74, 0, 60
                .byte 377, 0, 74
                .byte 374, 3, 377
                .byte 374, 377, 17
                .byte 360, 377, 360
                .byte 300, 360, 0
                .byte 0
SprBigBlow:     .word 16, 4         ; Спрайт взрыва ещё больше
                .byte 360, 3, 0, 3
                .byte 74, 77, 360, 17
                .byte 360, 74, 60, 77
                .byte 360, 17, 300, 17
                .byte 300, 3, 0, 17
                .byte 0, 0, 300, 17
                .byte 0, 0, 0, 3
                .byte 0, 0, 0, 0
                .byte 60, 0, 0, 3
                .byte 314, 3, 300, 17
                .byte 360, 17, 300, 3
                .byte 74, 17, 360, 17
                .byte 60, 14, 314, 17
                .byte 300, 3, 360, 0
; Спрайт шарика
sprBubble:      .word 16, 3
                .byte 0, 377, 0
                .byte 360, 0, 17
                .byte 14, 60, 60
                .byte 14, 17, 60
                .byte 3, 0, 300
                .byte 303, 3, 300
                .byte 363, 0, 300
                .byte 363, 0, 300
                .byte 3, 0, 300
                .byte 3, 0, 300
                .byte 14, 0, 63
                .byte 14, 0, 60
                .byte 360, 0, 17
                .byte 0, 377, 0
; Спрайты игрока
SprPlrKickRight:.word 20, 3             ; Удар вправо
                .byte 240, 12, 0
                .byte 250, 52, 0
                .byte 250, 77, 0
                .byte 350, 77, 260
                .byte 370, 77, 274
                .byte 360, 17, 277
                .byte 200, 312, 77
                .byte 300, 353, 17
                .byte 360, 373, 3
                .byte 360, 372, 0
                .byte 70, 76, 0
                .byte 50, 77, 0
                .byte 0, 77, 0
                .byte 0, 77, 0
                .byte 0, 77, 0
                .byte 0, 52, 0
SprPlrKickRtp:  .word 20, 3             ; Подготовка к удару вправо
                .byte 0, 252, 0
                .byte 200, 252, 2
                .byte 200, 372, 3
                .byte 200, 376, 3
                .byte 200, 377, 3
                .byte 0, 377, 0
                .byte 0, 352, 0
                .byte 300, 253, 14
                .byte 360, 253, 17
                .byte 370, 352, 17
                .byte 50, 372, 17
                .byte 0, 372, 12
                .byte 0, 77, 0
                .byte 0, 77, 0
                .byte 0, 77, 0
                .byte 0, 52, 0
SprSomersault1Rt:.word 15, 3            ; кувырок вправо
                .byte 0, 240, 0
                .byte 0, 250, 2
                .byte 0, 250, 12
                .byte 0, 276, 52
                .byte 300, 373, 17
                .byte 300, 373, 17
                .byte 260, 373, 3
                .byte 360, 52, 0
                .byte 360, 17, 0
                .byte 300, 377, 0
                .byte 0, 374, 0
                .byte 0, 76, 0
                .byte 0, 10, 0
                .byte 0
SprSomersault2Rt:.word 14, 3            ; кувырок вправо
                .byte 240, 360, 3
                .byte 360, 374, 17
                .byte 360, 277, 12
                .byte 300, 357, 13
                .byte 0, 353, 3
                .byte 0, 252, 0
                .byte 0, 377, 0
                .byte 300, 377, 2
                .byte 300, 277, 2
                .byte 300, 257, 2
                .byte 200, 252, 2
                .byte 0, 252, 0
SprSomersault3Rt: .word 11, 3           ; кувырок вправо
                .byte 0, 0, 57
                .byte 0, 300, 57
                .byte 370, 303, 43
                .byte 372, 357, 17
                .byte 372, 257, 77
                .byte 372, 357, 76
                .byte 352, 357, 77
                .byte 250, 317, 76
                .byte 240, 302, 16
                .byte 0
SprPlrKickLeft: .word 20, 3             ; удар влево
                .byte 0, 240, 12
                .byte 0, 250, 52
                .byte 0, 374, 52
                .byte 16, 374, 53
                .byte 76, 374, 57
                .byte 376, 360, 17
                .byte 374, 243, 2
                .byte 360, 353, 3
                .byte 300, 357, 17
                .byte 0, 257, 17
                .byte 0, 274, 54
                .byte 0, 374, 50
                .byte 0, 374, 0
                .byte 0, 374, 0
                .byte 0, 374, 0
                .byte 0, 250, 0
SprPlrKickLtp:  .word 20, 3             ; подготовка к удару влево
                .byte 0, 252, 0
                .byte 200, 252, 2
                .byte 300, 257, 2
                .byte 300, 277, 2
                .byte 300, 377, 2
                .byte 0, 377, 0
                .byte 0, 253, 0
                .byte 60, 352, 3
                .byte 360, 352, 17
                .byte 360, 253, 57
                .byte 360, 257, 50
                .byte 240, 257, 0
                .byte 0, 374, 0
                .byte 0, 374, 0
                .byte 0, 374, 0
                .byte 0, 250, 0
SprSomersault1Lt:.word 15, 3             ; кувырок влево
                .byte 0, 12, 0
                .byte 200, 52, 0
                .byte 240, 52, 0
                .byte 250, 276, 0
                .byte 360, 357, 3
                .byte 360, 357, 3
                .byte 300, 357, 16
                .byte 0, 250, 17
                .byte 0, 360, 17
                .byte 0, 377, 3
                .byte 0, 77, 0
                .byte 0, 274, 0
                .byte 0, 40, 0
                .byte 0
SprSomersault2Lt:.word 14, 3             ; кувырок влево
                .byte 300, 17, 12
                .byte 360, 77, 17
                .byte 240, 376, 17
                .byte 340, 373, 3
                .byte 300, 353, 0
                .byte 0, 252, 0
                .byte 0, 377, 0
                .byte 200, 377, 3
                .byte 200, 376, 3
                .byte 200, 372, 3
                .byte 200, 252, 2
                .byte 0, 252, 0
SprSomersault3Lt:.word 11, 3             ; кувырок влево
                .byte 370, 0, 0
                .byte 370, 3, 0
                .byte 310, 303, 57
                .byte 360, 373, 257
                .byte 374, 372, 257
                .byte 274, 373, 257
                .byte 374, 373, 253
                .byte 274, 363, 52
                .byte 260, 203, 12
                .byte 0
SprClimbStairs1:.word 20, 3             ; карабкаться по лестнице 1
                .byte 12, 252, 0
                .byte 216, 252, 2
                .byte 214, 377, 2
                .byte 314, 377, 3
                .byte 14, 377, 240
                .byte 74, 377, 274
                .byte 360, 252, 77
                .byte 360, 252, 17
                .byte 200, 252, 2
                .byte 200, 252, 2
                .byte 300, 353, 3
                .byte 300, 303, 3
                .byte 360, 0, 17
                .byte 240, 0, 17
                .byte 0, 0, 74
                .byte 0, 0, 50
SprClimbStairs2:.word 20, 3             ; карабкаться по лестнице 2
                .byte 0, 252, 240
                .byte 200, 252, 262
                .byte 200, 377, 62
                .byte 300, 377, 63
                .byte 12, 377, 60
                .byte 76, 377, 74
                .byte 374, 252, 17
                .byte 360, 252, 17
                .byte 200, 252, 2
                .byte 200, 252, 2
                .byte 300, 353, 3
                .byte 300, 303, 3
                .byte 360, 0, 17
                .byte 360, 0, 12
                .byte 74, 0, 0
                .byte 50, 0, 0
SprCrouch:      .word 13, 3             ; сесть на шпагат
                .byte 0, 252, 0
                .byte 200, 252, 2
                .byte 200, 377, 2
                .byte 300, 377, 3
                .byte 300, 377, 3
                .byte 0, 377, 0
                .byte 70, 252, 54
                .byte 270, 252, 56
                .byte 200, 252, 2
                .byte 376, 252, 277
                .byte 376, 353, 277
                .byte 0
SprStepRight:   .word 20, 3             ; ходьба вправо
                .byte 0, 252, 0
                .byte 200, 252, 2
                .byte 200, 372, 3
                .byte 200, 376, 3
                .byte 200, 377, 3
                .byte 0, 377, 0
                .byte 0, 252, 0
                .byte 300, 252, 17
                .byte 360, 252, 77
                .byte 374, 252, 276
                .byte 212, 252, 202
                .byte 300, 252, 3
                .byte 360, 303, 17
                .byte 370, 0, 57
                .byte 50, 0, 50
                .byte 0, 0, 0
SprStepRight2:  .word 20, 3             ; второй спрайт
                .byte 0, 252, 0
                .byte 200, 252, 2
                .byte 200, 372, 3
                .byte 200, 376, 3
                .byte 200, 377, 3
                .byte 0, 377, 0
                .byte 0, 252, 0
                .byte 300, 352, 3
                .byte 360, 253, 3
                .byte 300, 257, 2
                .byte 200, 252, 0
                .byte 300, 373, 0
                .byte 376, 363, 3
                .byte 376, 300, 3
                .byte 2, 300, 3
                .byte 0, 200, 12
SprStandRight:  .word 20, 3             ; стоять вправо
                .byte 0, 252, 0
                .byte 200, 252, 2
                .byte 200, 372, 3
                .byte 200, 376, 3
                .byte 200, 377, 3
                .byte 0, 377, 0
                .byte 0, 352, 0
                .byte 0, 252, 0
                .byte 200, 257, 2
                .byte 200, 257, 2
                .byte 200, 377, 3
                .byte 0, 252, 0
                .byte 0, 77, 0
                .byte 0, 77, 0
                .byte 0, 77, 0
                .byte 0, 252, 0
SprStepLeft:    .word 20, 3             ; ходьба влево
                .byte 0, 252, 0
                .byte 200, 252, 2
                .byte 300, 257, 2
                .byte 300, 277, 2
                .byte 300, 377, 2
                .byte 0, 377, 0
                .byte 0, 252, 0
                .byte 360, 252, 3
                .byte 374, 252, 17
                .byte 276, 252, 77
                .byte 202, 252, 242
                .byte 300, 252, 3
                .byte 360, 303, 17
                .byte 370, 0, 57
                .byte 50, 0, 50
                .byte 0, 0, 0
SprStepLeft2:   .word 20, 3             ; второй спрайт
                .byte 0, 252, 0
                .byte 200, 252, 2
                .byte 300, 257, 2
                .byte 300, 277, 2
                .byte 300, 377, 2
                .byte 0, 377, 0
                .byte 0, 252, 0
                .byte 300, 253, 3
                .byte 300, 352, 17
                .byte 200, 372, 3
                .byte 0, 252, 2
                .byte 0, 357, 3
                .byte 300, 317, 277
                .byte 300, 3, 277
                .byte 300, 3, 200
                .byte 240, 2, 0
SprStepSize = SprStepLeft2 - SprStepLeft
SprStandLeft:   .word 20, 3             ; стоять влево
                .byte 0, 252, 0
                .byte 200, 252, 2
                .byte 300, 257, 2
                .byte 300, 277, 2
                .byte 300, 377, 2
                .byte 0, 377, 0
                .byte 0, 253, 0
                .byte 0, 252, 0
                .byte 200, 372, 2
                .byte 200, 372, 2
                .byte 300, 377, 2
                .byte 0, 252, 0
                .byte 0, 374, 0
                .byte 0, 374, 0
                .byte 0, 374, 0
                .byte 0, 252, 0
; спрайты лабиринта
Sprite1:        .word 0                 ; приращение к адресу экрана
                .word 15                ; высота в строках
                .word 3                 ; ширина в байтах
                .byte 377, 377, 77      ; затем сам спрайт, кирпич красный
                .byte 327, 377, 65
                .byte 127, 125, 65
                .byte 137, 167, 75
                .byte 337, 335, 75
                .byte 137, 167, 75
                .byte 337, 335, 75
                .byte 137, 167, 75
                .byte 337, 335, 75
                .byte 137, 167, 75
                .byte 127, 125, 65
                .byte 327, 377, 65
                .byte 377, 377, 77
                .byte 0
Sprite2:        .word 0
                .word 15
                .word 3
                .byte 146, 146, 144     ; кирпич сине-зелёный (бирюзовый? хз как этот цвет называется)
                .byte 231, 231, 230
                .byte 146, 146, 144
                .byte 231, 231, 230
                .byte 146, 146, 144
                .byte 231, 231, 230
                .byte 0, 0, 0
                .byte 106, 146, 146
                .byte 211, 231, 231
                .byte 106, 146, 146
                .byte 211, 231, 231
                .byte 106, 146, 146
                .byte 211, 231, 231
                .byte 0
Sprite3:        .word 0
                .word 15
                .word 3
                .byte 21, 21, 20        ; кирпич синий
                .byte 104, 104, 104
                .byte 21, 21, 20
                .byte 104, 104, 104
                .byte 21, 21, 20
                .byte 104, 104, 104
                .byte 0, 0, 0
                .byte 104, 104, 104
                .byte 1, 21, 21
                .byte 104, 104, 104
                .byte 1, 21, 21
                .byte 104, 104, 104
                .byte 1, 21, 21
                .byte 0
Sprite4:        .word 0
                .word 16
                .word 3
                .byte 340, 0, 13        ; лестница
                .byte 340, 0, 13
                .byte 354, 376, 73
                .byte 350, 250, 53
                .byte 340, 0, 13
                .byte 340, 0, 13
                .byte 340, 0, 13
                .byte 340, 0, 13
                .byte 340, 0, 13
                .byte 354, 376, 73
                .byte 350, 250, 53
                .byte 340, 0, 13
                .byte 340, 0, 13
                .byte 340, 0, 13
Sprite5:        .word 0
                .word 1
                .word 3
                .byte 231, 231, 231     ; натянутый канат
                .byte 0
Sprite6:        .word 200
                .word 14
                .word 4
                .byte 0, 252, 252, 252  ; ящик с оружием
                .byte 240, 376, 374, 372
                .byte 252, 252, 252, 376
                .byte 0, 0, 0, 257
                .byte 252, 252, 252, 372
                .byte 252, 252, 252, 376
                .byte 0, 0, 0, 257
                .byte 252, 252, 252, 372
                .byte 252, 252, 252, 376
                .byte 0, 0, 0, 257
                .byte 252, 252, 252, 12
                .byte 252, 252, 252, 0
Sprite7:        .word 0
                .word 15
                .word 3
                .byte 42, 42, 42        ; проходимая стена
                .byte 200, 0, 0
                .byte 0, 0, 0
                .byte 200, 0, 0
                .byte 0, 0, 0
                .byte 200, 0, 0
                .byte 0, 0, 0
                .byte 210, 210, 210
                .byte 0, 0, 2
                .byte 0, 0, 0
                .byte 0, 0, 2
                .byte 0, 0, 0
                .byte 0, 0, 2
                .byte 0

SpriteLift:     .word 0
                .word 4
                .word 4
SprLiftData:    .byte 125, 125, 125, 125 ; лифт
                .byte 125, 125, 125, 125
                .byte 125, 125, 125, 125
                .byte 273, 273, 273, 273


SprExplosive:   .word 17, 2             ; мешок со взрывчаткой
                .word ^B0000001111000000
                .word ^B0000001111000000
                .word ^B0000001111000000
                .word ^B0000111111110000
                .word ^B0000101111100000
                .word ^B0010101110101000
                .word ^B0000101010111000
                .word ^B0011111011111010
                .word ^B1111111111101110
                .word ^B1111111111101110
                .word ^B1100111111111111
                .word ^B1100111111111111
                .word ^B0011001111111100
                .word ^B0011110000111100
                .word ^B0000111111110000
SprWeapon2.2:   .word 10, 2
                .word ^B0000000000001000
                .word ^B1000000010100000
                .word ^B0010100010100000
                .word ^B0010101010000000
                .word ^B0000001010101000
                .word ^B0000101000101000
                .word ^B0000101000000010
                .word ^B0010000000000000
SprWeapon2:     .word 12, 2             ; сюрикен
                .word ^B0000000010000000
                .word ^B0000000010000000
                .word ^B0000001010000000
                .word ^B0000001010000000
                .word ^B1010101010101000
                .word ^B0010101010101010
                .word ^B0000001010000000
                .word ^B0000001010000000
                .word ^B0000001000000000
                .word ^B0000001000000000
SprWeapon3:     .word 7, 3              ; кирпич
                .byte 377, 377, 377
                .byte 63, 63, 363
                .byte 377, 377, 377
                .byte 317, 314, 314
                .byte 377, 377, 377
                .byte 63, 63, 363
                .byte 377, 377, 377
                .byte 0
SprWeapon4Rt:   .word 6, 3              ; стрелка вправо (шпага?)
                .byte 300, 0, 0
                .byte 300, 3, 0
                .byte 377, 377, 377
                .byte 377, 17, 0
                .byte 300, 3, 0
                .byte 300, 0, 0
SprWeapon4Lt:   .word 6, 3              ; стрелка влево (шпага?)
                .byte 0, 0, 3
                .byte 0, 300, 3
                .byte 377, 377, 377
                .byte 0, 360, 377
                .byte 0, 300, 3
                .byte 0, 0, 3
SprWeapon5:     .word 7, 3              ; гаечный ключ
                .byte 74, 0, 74
                .byte 377, 0, 377
                .byte 360, 377, 17
                .byte 360, 377, 17
                .byte 360, 377, 17
                .byte 377, 0, 377
                .byte 74, 0, 74
                .byte 0
SprWeapon6:     .word 6, 3              ; двухцветный прямоугольник (магнит?, ластик?)
                .byte 377, 257, 252
                .byte 377, 257, 252
                .byte 377, 257, 252
                .byte 377, 257, 252
                .byte 377, 257, 252
                .byte 377, 257, 252

SprWeapon7Rt:   .word 11, 3             ; меч вправо
                .byte 300, 3, 0
                .byte 300, 2, 0
                .byte 300, 376, 17
                .byte 376, 2, 60
                .byte 376, 376, 303
                .byte 376, 2, 60
                .byte 300, 376, 17
                .byte 300, 2, 0
                .byte 300, 3, 0
                .byte 0
SprWeapon7Lt:   .word 11, 3             ; меч влево
                .byte 0, 300, 3
                .byte 0, 200, 3
                .byte 360, 277, 3
                .byte 14, 200, 277
                .byte 303, 277, 277
                .byte 14, 200, 277
                .byte 360, 277, 3
                .byte 0, 200, 3
                .byte 0, 300, 3
                .byte 0

                .even


; массив анимации взрывов
; 2 элемента из 2-х слов
; первое слово - адрес экрана, 0 - нету, элемент пусто
; второе слово - счётчик анимаций
BurstAnimTbl:   .word   0, 7
                .word   0, 7
BurstAnimTblSize = 2
BurstAnimItemSize = 4


; буфер данных экрана под спрайтами
; ───────────────────────────────────────────────────────────────────────────
; буферы взрывов, по числу элементов массива
SprBurstBuf:    .word   16, 4           ; первые 2 слова, габариты спрайта,
                                        ; где-то должны быть заданы обязательно,
                                        ; где-то нет. Не стал разбираться, везде
                                        ; оставил проинициализированными
                .blkb   70
SprBurstBuf2:   .word   16, 4
                .blkb   70
SprBurstBufSize = SprBurstBuf2 - SprBurstBuf
; буфер глаза
SprEyeBuf:      .word   16, 4
                .blkb   70
; буфер головы в машинке
SprHdCarBuf:    .word   26, 5
                .blkb   156

; буфер шарика и ещё чего-то
sprBufferSize = 56 ; максимальный размер этого чего-то
sprBuffer.h:    .word   16
sprBuffer.w:    .word   3
sprBuffer.data: .blkb   sprBufferSize
; буфер экрана под спрайтом игрока
SprPlayerBuf:   .word   20, 3
                .blkb   60

; буфер оружия
SprBufWeaponSize = 34
SprBufWeapon:   .word 12, 2
                .blkb SprBufWeaponSize
; ───────────────────────────────────────────────────────────────────────────
Ramka:          .byte 2                 ; число строк
                .byte 377, 377, 377, 377, 377 ; 5 байтов строка
                .byte 1                 ; число строк
                .byte 257, 252, 252, 252, 372; 5 байтов строка
                .byte 21
                .byte 57, 0, 0, 0, 370
                .byte 1
                .byte 257, 252, 252, 252, 372
                .byte 2
                .byte 377, 377, 377, 377, 377 ; 5 байтов строка
                .byte 0                 ; конец
                .even

sprBIL:         .byte 125, 125, 120, 25, 25, 0
                .byte 375, 377, 321, 77, 75, 0
                .byte 364, 320, 103, 17, 75, 0
                .byte 364, 325, 103, 17, 75, 0
                .byte 364, 377, 101, 17, 75, 0
                .byte 364, 320, 103, 17, 75, 125
                .byte 364, 320, 103, 17, 75, 375
                .byte 364, 325, 103, 17, 75, 375
                .byte 375, 377, 320, 77, 375, 377
sprCopyright:   .byte 300, 377, 3
                .byte 160, 125, 15
                .byte 134, 377, 65
                .byte 327, 327, 327
                .byte 327, 127, 325
                .byte 327, 127, 325
                .byte 327, 127, 325
                .byte 327, 327, 327
                .byte 134, 377, 65
                .byte 160, 125, 15
                .byte 300, 377, 3
                .even

; Вот ещё какая-то таблица значений для сравнения, 3х3
Obstacles3x3:   .byte 340, 0, 13
                .byte 354, 376, 73
                .byte 350, 250, 53
                .byte 0
; Таблицы значений препятствий. Они пересекаются
ObstaclesTbl:   .byte 327
                .byte 65
                .byte 127
                .byte 65
                .byte 137
                .byte 75
                .byte 337
                .byte 230
                .byte 106
                .byte 146
                .byte 211
                .byte 1
ObstacleTbl2:   .byte 20
                .byte 77
                .byte 146
                .byte 144
                .byte 21
                .byte 377
                .byte 340
                .byte 13
                .byte 354
                .byte 73
                .byte 350
                .byte 250
                .byte 53
                .byte 125

JoyTbl:         .word 2                 ; влево
                .word 1                 ; вправо
                .word 4                 ; вверх
                .word 10                ; вниз
                .word 40                ; удар
                .word 20                ; оружие

KbdTbl:         .word 10                ; влево
                .word 31                ; вправо
                .word 32                ; вверх
                .word 33                ; вниз
                .word 16                ; удар
                .word 17                ; оружие
                .word 40                ; прыжок
KbdTblOffs = KbdTbl-JoyTbl

SprParamTbl:    .word Sprite1
                .word Sprite2
                .word Sprite3
                .word Sprite4
                .word Sprite5
                .word Sprite6
                .word Sprite7

WeaponTable:    .word SprExplosive
                .word SprWeapon2
                .word SprWeapon3
                .word SprWeapon4Rt
                .word SprWeapon5
                .word SprWeapon6
                .word SprWeapon7Rt
; ───────────────────────────────────────────────────────────────────────────
strBILcorp:     .asciz "BIL corp."
strGMoskva:     .asciz "г.МОСКВА"
strPresent:     .asciz "ПРЕДСТАВЛЯЕТ"
strSuperman:    .asciz "SUPERMAN"
strBortnikBoris:.asciz "БОРТНИК БОРИС"
strGame:        .asciz "GAME"
strSuperMan1:   .asciz "SUPER MAN 1"
; ───────────────────────────────────────────────────────────────────────────
strMenu:        .asciz "ИГРА"
strControl:     .asciz "УПРАВЛЕНИЕ"
strInformation: .asciz "ИНФОРМАЦИЯ"
                .asciz "ВЫХОД"
; ───────────────────────────────────────────────────────────────────────────
strInfoData:    .asciz "ВАША ЗАДАЧА:"
                .asciz "УНИЧТОЖИТЬ ВСЮ"
                .asciz "ЖИВНОСТЬ,ВЗЯТЬ"
                .asciz "СЕМЬ МЕШКОВ."
; ───────────────────────────────────────────────────────────────────────────
strText8$:      .asciz "ВАШ РЕЗУЛЬТАТ"
strText7$:      .asciz "РЕКЛАМА"
; ───────────────────────────────────────────────────────────────────────────
menuCtrls:      .asciz "←"
                .asciz "→"
                .asciz "↑"
                .asciz "↓"
                .asciz "УДАР"
                .asciz "ОРУЖИЕ"
                .asciz "ПРЫЖОК"
                .even
; адреса экрана вывода меню
menuAddr:       .word 67426
                .word 65014
                .word 62414
                .word 60030
; адреса экрана вывода информации
InfoAddr:       .word 71407
                .word 67003
                .word 64403
                .word 56010
; счёт игры
Score:          .word 0, 0, 60
; ───────────────────────────────────────────────────────────────────────────
LetterBuffer:   .word   0               ; буфер буквы которую выводим побуквенно в эффекте заставки
CurrObjStruct:  .word   0               ; адрес структуры, которую обрабатываем
CurrObjOffset:  .word   0               ; адрес ячейки, где хранится смещение
BubbleOffsetV:  .byte   0               ; смещение шарика по вертикали
BubbleOffsetH:  .byte   0               ; смещение шарика по горизонтали
BubbleScrAddr:  .word   0               ; структура шарика, адрес экрана
                .word   0               ; текущий спрайт (не используется, но существовать должно)
PlayerDirection:.word   0               ; направление движения игрока, заодно и смещение
CurrOffsetV:    .word   0               ; текущее смещение движения по вертикали
                                        ; а так же многофункциональная переменная
CurrOffsetH:    .word   0               ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
WpnKickJump:    .word   0               ; флаги/состояния клавиш удар/оружие
                                        ; бит 15 - прыжок
                                        ; бит 7 - оружие
                                        ; бит 0 - удар
CurrPlayerSpr:  .word   0               ; адрес текущего спрайта игрока
CurrPlayerAddr: .word   0               ; текущий адрес экрана игрока
OffsetVMove:    .word   0               ; Смещение движения по вертикали
CurrWeaponAddr: .word   0               ; текущий адрес выстреленного оружия

; структура данных для глаза
EyeStruct:      .word 0                 ; адрес экрана
                .word SpriteEye3        ; адрес спрайта, значение должно быть проинициализировано
; ───────────────────────────────────────────────────────────────────────────
; структура данных для головы на машинке
HeadCarScruct:  .word 0                 ; адрес экрана
HeadCarOffsetH: .word 1                 ; направление движения, значение должно быть проинициализировано
HeadCarCurSpr:  .word 0                 ; спрайт
; ───────────────────────────────────────────────────────────────────────────
WpnShootingStruct:.word 0               ; адрес экрана выстреленного оружия
WpnShootingDir: .word 0                 ; направление движения выстреленного оружия
                .word 0                 ; спрайт выстреленного оружия
                .word 0                 ; буфер экрана под спрайтом оружия

KbdNoVec:       rti
; ───────────────────────────────────────────────────────────────────────────
; точка входа
Entry$:         mov     #TopStack, SP
                mov     #Entry$, @#4
                reset
                mov     #1330, @#177664

                clr     R5              ; смещение по горизонтали
                mov     #4, R4          ; количество циклов 1
5$:             mov     #10, R3         ; количество циклов 2

6$:             mov     R5, R2          ; текущее смещение в цикле
                mov     #40100, R1      ; начальный адрес

7$:             mov     R1, R0          ; адрес
                add     R2, R0          ; со смещением
                mov     #125252, -100(R0)
                mov     #52525, (R0)    ; заполняем
                tst     (R2)+           ; смещение сместим
                bic     #177700, R2     ; только в строке чтобы было
                add     #200, R1        ; адрес вниз
                bpl     7$              ; пока в пределах экрана
                add     #10, R5         ; корректируем смещение в цикле 2
                sob     R3, 6$
                sub     #76, R5         ; корректируем смещение в цикле 1
                sob     R4, 5$
                call    ClrScrDiagon    ; очистка экрана крест-накрест по диагонали

DrawSplash:     call    sub_36264       ; инициализируем некоторые переменные
                                        ; и рисуем стакан и заголовок
                call    SetSkipSplash   ; устанавливаем векторы клавиатуры на пропуск заставки
                clr     BurstAnimTbl    ; очищаем массив взрывов
                clr     BurstAnimTbl+BurstAnimItemSize
; анимация движений шарика
                mov     #500, BubbleOffsetV ; направление движения
                mov     #72, R4         ; количество движений
                mov     #44060, R0      ; начальный адрес экрана
                mov     #62410, R1      ; адрес экрана для вывода текста
                mov     #strPresent, R3 ; адрес текста
                mov     #4, R5          ; финальный масштаб по высоте
                mov     #325, R2        ; цвет текста
                call    AnimSplashTxt   ; Вход: R0 - начальный адрес экрана шарика
                                        ;       R1 - адрес экрана для вывода текста
                                        ;       R2 - цвет текста
                                        ;       R3 - адрес текста
                                        ;       R4 - количество движений шарика
                                        ;       R5 - финальный масштаб по высоте

                mov     #51, R4
                mov     #66070, R0
                mov     #71020, R1
                mov     #strSuperman, R3
                mov     #7, R5
                mov     #220, R2
                call    AnimSplashTxt   ; Вход: R0 - начальный адрес экрана шарика
                                        ;       R1 - адрес экрана для вывода текста
                                        ;       R2 - цвет текста
                                        ;       R3 - адрес текста
                                        ;       R4 - количество движений шарика
                                        ;       R5 - финальный масштаб по высоте
                mov     #50, R4
                mov     #67064, R0
                mov     #350, R2
                mov     #55216, R1
                mov     #strBILcorp, R3
                mov     #4, R5
                call    AnimSplashTxt   ; Вход: R0 - начальный адрес экрана шарика
                                        ;       R1 - адрес экрана для вывода текста
                                        ;       R2 - цвет текста
                                        ;       R3 - адрес текста
                                        ;       R4 - количество движений шарика
                                        ;       R5 - финальный масштаб по высоте
                mov     #34, R4
                mov     #57054, R0
                mov     #2, R5
                mov     #strGMoskva, R3
                mov     #51017, R1
                mov     #220, R2
                call    AnimSplashTxt   ; Вход: R0 - начальный адрес экрана шарика
                                        ;       R1 - адрес экрана для вывода текста
                                        ;       R2 - цвет текста
                                        ;       R3 - адрес текста
                                        ;       R4 - количество движений шарика
                                        ;       R5 - финальный масштаб по высоте
                mov     #45006, R1
                mov     #3, R5
                mov     #372, R2
                mov     #strBortnikBoris, R3
                call    BBBEffect
                call    SplashAnimEff
                call    ClrScr2
; ───────────────────────────────────────────────────────────────────────────
; вывод строки GAME
                mov     #62206, R1
                mov     #1, R2

1$:             mov     #strGame, R3

2$:             movb    (R3)+, R0
                beq     3$
                call    DrawCharW
                add     #14, R1
                br      2$
; ───────────────────────────────────────────────────────────────────────────
; вывод числа 5
3$:             sub     #560, R1
                mov     R3, -(SP)
                mov     #10, R0
                mov     #200, R4

4$:             call    SoundEffect1    ; Двойной звуковой щелчок
                                        ; Вход: R4 - тон второго щелчка
                add     #4, R4
                sob     R0, 4$
                mov     (SP)+, R3
                inc     R2
                cmp     #13, R2
                bne     1$
                mov     #44020, R1
                mov     #FONT + <'5 - 40>*10. + 1, R0

5$:             mov     #34, R5

6$:             mov     R5, -(SP)
                mov     #7, R4
                movb    (R0), R2

7$:             clr     R3
                ror     R2
                bcc     8$
                mov     #231, R3

8$:             mov     #4, R5

9$:             tstb    (R1)
                bne     10$
                movb    R3, (R1)

10$:            inc     R1
                sob     R5, 9$
                sob     R4, 7$
                add     #44, R1
                mov     (SP)+, R5
                sob     R5, 6$
                inc     R0
                cmp     #FONT + <'5 - 40>*10. + 8., R0
                bne     5$
                mov     #1400, R3
                mov     R3, R2
                call    @#102062

SkipSplash:     call    ClrScr2         ; Очистка экрана полосками
                mov     #KbdNoVec, @#60
                mov     #KbdNoVec, @#274
                mov     #325, CH.Color$
                mov     #6, R5
                mov     #50012, R1
                mov     #strSuperMan1, R3
                call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
                jmp     DrawMenu

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


SetSkipSplash:  mov     @#177662, R0
                bic     #100, @#177660
                mov     #SkipSplash, @#60
                mov     #SkipSplash, @#274
                mtps    #0
                return
; End of function SetSkipSplash

; анимационный эффект в заставке
; шарик попадает в бошку на колёсиках
SplashAnimEff:  mov     #63, -(SP)
                mov     #73203, HeadCarScruct ; адрес головы
                mov     #1, HeadCarOffsetH ; направление движения
                mov     #47066, BubbleScrAddr

5$:             call    BubbleAnim      ; Обработка движения шарика и глаза
                call    HeadCarAnim     ; обработка и анимация головы в машинке
                mov     #14000, R4
                sob     R4, .
                call    BubbleAnim      ; Обработка движения шарика и глаза
                mov     #14000, R4
                sob     R4, .
                dec     (SP)
                bne     5$
                tst     (SP)+
                mov     #12, R4

6$:             call    SoundEffect1    ; Двойной звуковой щелчок
                                        ; Вход: R4 - тон второго щелчка
                sob     R4, 6$

                mov     BubbleScrAddr, R1
                mov     #sprBuffer.h, R4
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     HeadCarScruct, R1
                mov     #SprHdCarBuf, R4
                jmp     ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом


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

; Анимация взрыва или лопания шарика

SecretFunc$:    mov     #BurstAnimTbl, R5
                mov     #BurstAnimTblSize, R3

SF.1$:          mov     (R5), R1
                bne     3$

SF.2$:          add     #BurstAnimItemSize, R5
                sob     R3, SF.1$
MorphRet:       return                  ; сюда пишется команда br NextSF
                                        ; и функция продолжается
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     R3, -(SP)
                mov     R1, -(SP)
                mov     R3, -(SP)
                mov     2(R5), R2
                mov     R2, R0
                inc     R0
                mov     #100, R4

20$:            call    SoundEffect1    ; Двойной звуковой щелчок
                                        ; Вход: R4 - тон второго щелчка
                add     #40, R4
                sob     R0, 20$
                mov     (SP)+, R3
                inc     2(R5)
                mov     #SprSmallBlow, R0  ; Спрайт маленького взрыва
                tst     R2
                beq     11$
                dec     R2
                beq     11$
                dec     R2
                bne     5$
                sub     #201, R1
                br      6$
; ───────────────────────────────────────────────────────────────────────────

5$:             dec     R2
                bne     7$

6$:             add     #SprMiddleBlow - SprSmallBlow, R0
                br      11$
; ───────────────────────────────────────────────────────────────────────────

7$:             dec     R2
                bne     8$
                sub     #201, R1
                br      9$
; ───────────────────────────────────────────────────────────────────────────

8$:             dec     R2
                bne     10$

9$:             add     #SprBigBlow - SprSmallBlow, R0
                br      11$
; ───────────────────────────────────────────────────────────────────────────

10$:            clr     R1

11$:            mov     #SprBurstBuf, R4
                dec     R3
                beq     12$
                add     #SprBurstBufSize, R4

12$:            mov     R1, (R5)
                mov     (SP), R1
                mov     R4, (SP)
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (SP)+, R4
                mov     (R5), R1
                beq     13$
                call    DrawSpriteM     ; Вывод на экран спрайта, с заполнением буфера маской, чтобы потом стереть
                                        ; Вход: R0 - адрес спрайта
                                        ;       R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом

13$:            mov     (SP)+, R3
                br      SF.2$
; End of function SecretFunc$
; ───────────────────────────────────────────────────────────────────────────
; а тут проверки на кто кого убил

NextSF:         mov     CurrPlayerAddr, R5 ; текущий адрес экрана игрока
                mov     CurrPlayerSpr, R0
                mov     (R0)+, R1
                swab    R1              ; умножаем на 100
                ror     R1              ; получается смещение в байтах до низа спрайта
                asr     R1              ;
                mov     R1, -(SP)
                mov     R5, -(SP)
                mov     BubbleScrAddr, R4 ; проверка на коллизию игрока с шариком
                mov     #3, R0
                mov     #3, R2
                mov     #1600, R3
                call    sub_2344        ; Вход: R0 - ширина в байтах оружия
                                        ;       R1 - высота в байтах оружия (строк * 100)
                                        ;       R2 - ширина в байтах объекта
                                        ;       R3 - высота в байтах объекта (строк * 100)
                                        ;       R4 - адрес экрана объекта живность
                                        ;       R5 - адрес экрана оружия
                bpl     1$              ; нет коллизии
                mov     #BubbleOffsetH, CurrObjOffset ; смещение шарика по горизонтали
                mov     #BubbleScrAddr, CurrObjStruct
                call    sub_2416

1$:             mov     (SP), R5
                mov     2(SP), R1
                mov     HeadCarScruct, R4 ; проверка на коллизию игрока с головой в машинке
                mov     #3, R0
                mov     #5, R2
                mov     #2600, R3
                call    sub_2344        ; Вход: R0 - ширина в байтах оружия
                                        ;       R1 - высота в байтах оружия (строк * 100)
                                        ;       R2 - ширина в байтах объекта
                                        ;       R3 - высота в байтах объекта (строк * 100)
                                        ;       R4 - адрес экрана объекта живность
                                        ;       R5 - адрес экрана оружия
                bpl     2$              ; нет коллизии
                mov     #HeadCarOffsetH, CurrObjOffset
                mov     #HeadCarScruct, CurrObjStruct
                call    sub_2416

2$:             mov     (SP)+, R5
                mov     (SP)+, R1
                mov     EyeStruct, R4   ; проверка на коллизию игрока с глазом
                mov     #3, R0
                mov     #4, R2
                mov     #1600, R3
                call    sub_2344        ; Вход: R0 - ширина в байтах оружия
                                        ;       R1 - высота в байтах оружия (строк * 100)
                                        ;       R2 - ширина в байтах объекта
                                        ;       R3 - высота в байтах объекта (строк * 100)
                                        ;       R4 - адрес экрана объекта живность
                                        ;       R5 - адрес экрана оружия
                bpl     3$              ; нет коллизии
                mov     #<TmpPlrDir+4>, CurrObjOffset

TmpPlrDir:      mov     PlayerDirection, #0
                neg     <TmpPlrDir+4>
                mov     #EyeStruct, CurrObjStruct
                call    sub_2416
; теперь проверки на попадание оружия в живность
3$:             mov     WpnShootingStruct, R5 ; адрес экрана выстреленного оружия
                beq     7$
                dec     R5
                mov     #1000, R1
                mov     BubbleScrAddr, R4
                mov     #4, R0
                mov     #4, R2
                mov     #1600, R3
                call    sub_2344        ; Вход: R0 - ширина в байтах оружия
                                        ;       R1 - высота в байтах оружия (строк * 100)
                                        ;       R2 - ширина в байтах объекта
                                        ;       R3 - высота в байтах объекта (строк * 100)
                                        ;       R4 - адрес экрана объекта живность
                                        ;       R5 - адрес экрана оружия
                bpl     4$
                mov     BubbleScrAddr, R1
                mov     R1, -(SP)
                mov     #sprBuffer.h, R4
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (SP)+, R1
                call    sub_2452
                clr     BubbleScrAddr
                mov     #2, R5          ; Убили шарик
                call    sub_3020        ; Удаление убитой живности из текущего зала
                                        ; Вход: R5 - маска
4$:             mov     WpnShootingStruct, R5 ; адрес экрана выстреленного оружия
                dec     R5
                mov     #1000, R1
                mov     HeadCarScruct, R4
                mov     #6, R0
                mov     #7, R2
                mov     #2600, R3
                call    sub_2344        ; Вход: R0 - ширина в байтах оружия
                                        ;       R1 - высота в байтах оружия (строк * 100)
                                        ;       R2 - ширина в байтах объекта
                                        ;       R3 - высота в байтах объекта (строк * 100)
                                        ;       R4 - адрес экрана объекта живность
                                        ;       R5 - адрес экрана оружия
                bpl     6$
                mov     HeadCarScruct, R1
                mov     R1, -(SP)
                mov     #SprHdCarBuf, R4
                cmp     #SprHeadCarLt1, HeadCarCurSpr
                bne     5$
                inc     R1

5$:             call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (SP)+, R1
                call    sub_2452
                clr     HeadCarScruct
                mov     #10, R5         ; Убили голову в машинке
                call    sub_3020        ; Удаление убитой живности из текущего зала
                                        ; Вход: R5 - маска
6$:             mov     WpnShootingStruct, R5 ; адрес экрана выстреленного оружия
                dec     R5
                mov     #1000, R1
                mov     EyeStruct, R4
                mov     #7, R0
                mov     #5, R2
                mov     #1600, R3
                call    sub_2344        ; Вход: R0 - ширина в байтах оружия
                                        ;       R1 - высота в байтах оружия (строк * 100)
                                        ;       R2 - ширина в байтах объекта
                                        ;       R3 - высота в байтах объекта (строк * 100)
                                        ;       R4 - адрес экрана объекта живность
                                        ;       R5 - адрес экрана оружия
                bpl     7$
                mov     EyeStruct, R1
                mov     R1, -(SP)
                mov     #SprEyeBuf, R4
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (SP)+, R1
                call    sub_2452
                clr     EyeStruct
                mov     #4, R5          ; Убили глаз
                call    sub_3020        ; Удаление убитой живности из текущего зала
                                        ; Вход: R5 - маска
7$:             mov     CurrWeaponAddr, R5 ; текущий адрес выстреленного оружия
                cmp     WpnShootingStruct, R5 ; совпадает с адресом экрана выстреленного оружия
                beq     9$              ; да
                mov     #12, R4         ; нет - значит это новый выстрел

8$:             call    SoundEffect1    ; Двойной звуковой щелчок
                                        ; Вход: R4 - тон второго щелчка
                sob     R4, 8$
                mov     WpnShootingStruct, R5 ; адрес экрана выстреленного оружия

9$:             tst     R5              ; оружие летит?
                beq     10$             ; нет
                add     WpnShootingDir, R5 ; да - корректируем адрес
                add     WpnShootingDir, R5

10$:            mov     R5, CurrWeaponAddr ; сохраняем
                cmp     GameGoal, #42475
                bne     11$
                jmp     FinalGame
; ───────────────────────────────────────────────────────────────────────────

11$:            return
; ───────────────────────────────────────────────────────────────────────────


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

; Удаление убитой живности из текущего зала
; Вход: R5 - маска

sub_3020:       mov     #DynamicStruct, R1
                mov     #DynamicItemsNum, R2

1$:             mov     (R1), R0
                bic     #177, R0        ; ищем нужный зал
                cmp     CurrentHall, R0
                beq     2$              ; нашли
                add     #DynamicItemSize, R1
                sob     R2, 1$
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             bic     R5, (R1)        ; удаляем объект из параметров
                                        ; чтобы больше его не выводить
                return
; End of function sub_3020

; ███████████████ S U B R O U T I N E ███████████████████████████████████████
; проверка на коллизию живности с игроком
; Вход: R0 - ширина в байтах оружия
;       R1 - высота в байтах оружия (строк * 100)
;       R2 - ширина в байтах объекта
;       R3 - высота в байтах объекта (строк * 100)
;       R4 - адрес экрана объекта живность
;       R5 - адрес экрана оружия
; Выход: N=0 - нет коллизии
;        N=1 - есть коллизия

sub_2344:       add     R1, R5
                cmp     R4, R5
                bpl     4$

1$:             sub     R1, R5
                add     R3, R4
                cmp     R5, R4
                bpl     4$

2$:             bic     #177700, R5
                bic     #177700, R4
                add     R0, R5
                cmp     R4, R5
                bpl     4$

3$:             sub     R0, R5
                add     R2, R4
                cmp     R5, R4

4$:             return
; End of function sub_2344

; ───────────────────────────────────────────────────────────────────────────
sub_2416:       cmpb    @CurrObjOffset, PlayerDirection
                beq     1$
                cmp     (PC)+, @(PC)+   ; если в процессе прыжка
                        jmp @(PC)+  ; 137
                        .word MorphBR2$
                beq     2$              ; то нужно анимацию взрыва рисовать

1$:             add     #20, FatigueCnt ; иначе, отнимаем здоровье
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     @CurrObjStruct, R1

; ███████████████ S U B R O U T I N E ███████████████████████████████████████
; запуск анимации взрывов

sub_2452:       mov     #BurstAnimTbl, R5 ; массив анимации взрывов
                mov     #BurstAnimTblSize, R3

1$:             tst     (R5)            ; нашли пустое место ?
                beq     2$              ; да, идём инициализировать анимацию
                add     #BurstAnimItemSize, R5
                sob     R3, 1$
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     #SprBurstBuf, R4
                dec     R3
                beq     3$
                add     #SprBurstBufSize, R4

3$:             mov     #1, (R4)        ; инициализируем буфер под экран
                mov     (R4)+, (R4)+
                clr     (R4)+
                mov     R1, (R5)+       ; инициализируем элемент анимации
                clr     (R5)+
                return
; End of function sub_2452

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

; Прорисовка экрана лабиринта

DrawScreenLab:  mov     #100000, R1
                mov     #7000, R0

1$:             clr     -(R1)
                clr     -(R1)
                sob     R0, 1$
                mov     (PC)+, R0
CurrentHall:    .word BeginLabyrint     ; адрес начала текущего экрана лабиринта

2$:             mov     #3, R5          ; одна строка - 3 слова
                clr     R3              ; тут формируется последний элемент из старших битов всех трёх слов

3$:             mov     #5, R4          ; в слове 5 трёхбитий
                mov     (R0)+, R2       ; берём очередное слово

4$:             call    DrawSprite      ; Вывод спрайта.
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - номер спрайта (младшие 3 бита)
                asr     R2              ; двигаем данные
                asr     R2
                asr     R2
                sob     R4, 4$          ; и так всё слово
                ror     R2
                rol     R3
                sob     R5, 3$          ; всю строку
                mov     R3, R2          ; и последний элемент
                call    DrawSprite      ; Вывод спрайта.
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - номер спрайта (младшие 3 бита)
                br      2$              ; и крутимся в цикле. Выход из цикла в функции DrawSprite.
                                        ; Там как экран заполнится, будет выход на самый верхний уровень
                                        ; и ещё последнее слово за лабиринтом сохраняется куда-то
; End of function DrawScreenLab

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

; Вывод спрайта.
; Вход: R1 - адрес экрана
;       R2 - номер спрайта (младшие 3 бита)

DrawSprite:     mov     R5, -(SP)
                mov     R1, -(SP)
                mov     R2, R5          ; номер спрайта
                bic     #177770, R5     ; их всего 7: 1..7
                beq     3$              ; нулевого нету
                mov     R2, -(SP)
                mov     R3, -(SP)
                mov     R4, -(SP)
                mov     R0, -(SP)
                asl     R5              ; *2
                mov     <SprParamTbl-2>(R5), R5 ; адрес параметров спрайта
                mov     #100, R4
                add     (R5)+, R1       ; первое слово - смещение относительно адреса экрана
                mov     (R5)+, R2       ; второе слово - высота в строках
                mov     (R5)+, R0       ; третье слово - ширина в байтах
                sub     R0, R4

1$:             mov     R0, R3

2$:             bisb    (R5)+, (R1)+
                sob     R3, 2$
                add     R4, R1

                sob     R2, 1$
                mov     (SP)+, R0
                mov     (SP)+, R4
                mov     (SP)+, R3
                mov     (SP)+, R2

3$:             add     #3, (SP)        ; адрес экрана сдвигаем вправо на 3
                mov     (SP), R1        ; получаем
                bic     #177700, R1     ; до правого края экрана дошли?
                cmp     #77, R1
                bne     4$              ; нет ещё
                add     #1501, (SP)     ; да - переход на новую строку

4$:             mov     (SP)+, R1
                mov     (SP)+, R5       ; нет - выходим
                cmp     #100000, R1     ; весь экран заполнился?
                beq     5$              ; да - переход
                return
; ───────────────────────────────────────────────────────────────────────────

5$:             tst     (SP)+           ; выход из функции DrawScreenLab
                mov     (R0)+, BoxListAddr ; указатель на начало списка лифтов и ящиков с оружием
                return
; End of function DrawSprite


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

; Обработка движения лифтов

AnimLiftMoving: mov     (PC)+, R5
BoxListAddr:    .word   0           ; указатель на начало списка лифтов и ящиков с оружием

1$:             tst     (R5)
                bmi     7$
                bne     2$
                mov     #160, (R5)
                mov     10(R5), 2(R5)

2$:             dec     (R5)+
                mov     (R5)+, R1
                beq     5$
                mov     (PC)+, R2
                        bicb (R0)+, (R1)+ ; это опкод. аргумент функции
                call    DrawLift
                add     (R5)+, R1
                cmp     (R5)+, R1
                bne     3$
                clr     R1
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     (PC)+, R2
                        bisb (R0)+, (R1)+ ; это опкод. аргумент функции
                call    DrawLift

4$:             mov     R1, -6(R5)
                br      6$
; ───────────────────────────────────────────────────────────────────────────

5$:             add     #4, R5

6$:             tst     (R5)+
                br      1$
; ───────────────────────────────────────────────────────────────────────────

7$:             return
; End of function AnimLiftMoving


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


DrawLift:       mov     R2, 0MorphBIT$
                mov     R1, -(SP)
                mov     #SprLiftData, R0
                mov     #4, R2

1$:             mov     #4, R3

0MorphBIT$:     nop
                sob     R3, 0MorphBIT$
                add     #74, R1
                sob     R2, 1$
                mov     (SP)+, R1
                return
; End of function DrawLift


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

; задание направления движения

SetDirection:   ;tst     OffsetVMove    ; какие-то непонятные действия, видимо
                ;br      1$             ; хотел сделать какую-то зависимость от движения
                ;clr     PlayerDirection ; по вертикали, но не получилось или стало не надо

1$:             tst     CurrOffsetH     ; движение по горизонтали есть?
                beq     2$              ; нет
                mov     CurrOffsetH, PlayerDirection ; есть, это будет направление движения

2$:             return
; End of function SetDirection


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

; анимация ходьбы

sub_14454:      mov     CurrPlayerSpr, R0
                clr     CurrOffsetV     ; текущее смещение движения по вертикали
                cmp     #SprCrouch, R0
                bne     1$
                mov     #-500, CurrOffsetV ; текущее смещение движения по вертикали

1$:             tst     CurrOffsetH     ; по горизонтали движемся?
                beq     7$              ; нет
                bpl     4$              ; да, вправо
                ; да влево
                cmp     R0, #SprStepLeft ; до первой анимации дошли
                bhi     3$              ; нет, анимируем
2$:             mov     #SprStandLeft, R0 ; спрайт стоять и смотреть влево
                br      8$
; ───────────────────────────────────────────────────────────────────────────
6$:             ;cmp     #<SprStepLeft-4>, R0   ; вот это непонятно зачем надо.
                ;bmi     5$                     ; и без этого всё работает
3$:             sub     #SprStepSize, R0
                br      8$
; ───────────────────────────────────────────────────────────────────────────

7$:             tst     PlayerDirection ; направление движения было какое?
                bmi     2$              ; влево, будет спрайт стоять и смотреть влево
                br      5$              ; иначе будет спрайт стоять и смотреть вправо
                ; движемся вправо
4$:             cmp     R0, #SprStepRight ; до первой анимации дошли
                bhi     6$              ; нет, анимируем
5$:             mov     #SprStandRight, R0 ; спрайт стоять и смотреть вправо
8$:             mov      R0, CurrPlayerSpr
                return
; End of function sub_14454



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

; анимация карабкания по лестнице

AnimClimbStairs:cmp     #SprClimbStairs2, CurrPlayerSpr
                beq     1$
                mov     #SprClimbStairs2, CurrPlayerSpr
                return
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     #SprClimbStairs1, CurrPlayerSpr
                return
; End of function AnimClimbStairs


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

; Удаление спрайта с экрана по маске
; Вход: R1 - адрес экрана
;       R4 - адрес буфера хранения данных экрана под спрайтом

ClearSpriteM:   mov     R0, -(SP)
                mov     R5, -(SP)
                mov     (R4)+, R2
                mov     (R4)+, R0
                mov     #100, R5
                sub     R0, R5

1$:             mov     R0, R3

2$:             bicb    (R4)+, (R1)+
                sob     R3, 2$
                add     R5, R1

                sob     R2, 1$
                mov     (SP)+, R5
                mov     (SP)+, R0
                return
; End of function ClearSpriteM


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

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

DrawSpriteM:    mov     R5, -(SP)
                mov     (R0)+, R2       ; высота в строках
                mov     R2, (R4)+       ; сохраним в буфере
                mov     #100, R5
                mov     (R0)+, R3       ; ширина в байтах
                sub     R3, R5          ; pitch
                mov     R3, (R4)+       ; сохраним в буфере
                mov     R3, 2Width$

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

2$:             movb    (R0), (R4)
                bicb    (R1), (R4)+
                bisb    (R0)+, (R1)+
                sob     R3, 2$
                add     R5, R1

                sob     R2, 1$
                mov     (SP)+, R5
                return
; End of function DrawSpriteM


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

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

ControlsProc:   clr     CurrOffsetH     ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                clr     OffsetVMove     ; Смещение движения по вертикали
                clr     WpnKickJump     ; очищаем флаги
                mov     @#177714, R2    ; маска битов джойстика
                clr     R3              ; Код нажатой клавиши
                bit     #100, @#177716  ; клавиша нажата?
                bne     1$              ; нет
                mov     @#177662, R3    ; да

1$:             mov     #JoyTbl, R5
                bit     (R5)+, R2       ; влево нажато?
                beq     3$              ; нет

2$:             add     #-1, CurrOffsetH ; да
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             cmp     <KbdTblOffs-2>(R5), R3 ; клавиша влево нажата?
                beq     2$              ; да

4$:             bit     (R5)+, R2       ; джойстик вправо нажат?
                beq     6$              ; нет

5$:             add     #1, CurrOffsetH ; да
                br      7$
; ───────────────────────────────────────────────────────────────────────────

6$:             cmp     <KbdTblOffs-2>(R5), R3 ; клавиша вправо нажата?
                beq     5$              ; да

7$:             bit     (R5)+, R2       ; джойстик вверх нажат?
                beq     9$              ; нет

8$:             add     #-200, OffsetVMove ; да
                br      10$
; ───────────────────────────────────────────────────────────────────────────

9$:             cmp     <KbdTblOffs-2>(R5), R3 ; клавиша вверх нажата?
                beq     8$              ; да

10$:            bit     (R5)+, R2       ; джойстик вниз нажат?
                beq     12$             ; нет

11$:            add     #200, OffsetVMove ; да
                br      13$
; ───────────────────────────────────────────────────────────────────────────

12$:            cmp     <KbdTblOffs-2>(R5), R3 ; клавиша вниз нажата?
                beq     11$             ; да

13$:            bit     (R5)+, R2       ; джойстик удар нажат?
                beq     15$             ; нет

14$:            bis     #1, WpnKickJump ; да
                br      16$
; ───────────────────────────────────────────────────────────────────────────

15$:            cmp     <KbdTblOffs-2>(R5), R3 ; клавиша удар нажата?
                beq     14$             ; да

16$:            bit     (R5)+, R2       ; джойстик оружие нажат?
                beq     18$             ; нет

17$:            bis     #200, WpnKickJump ; да
                br      19$
; ───────────────────────────────────────────────────────────────────────────

18$:            cmp     <KbdTblOffs-2>(R5), R3 ; клавиша оружие нажата?
                beq     17$             ; да

19$:            cmp     KbdTblOffs(R5), R3 ; клавиша прыжок нажата?
                beq     20$             ; да
                ; нет
22$:            tst     CurrOffsetH     ; по горизонтали движемся?
                beq     21$             ; нет - выход
                tst     OffsetVMove     ; да, а по вертикали?
                bpl     21$             ; вниз или нет
                ; вверх, значит автопрыжок при управлении от джойстика
20$:            bis     #100000, WpnKickJump ; да
21$:            return
; End of function ControlsProc


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

; Проверка поверхности под ногами игрока.
; Выход: С=1 - ничего нет, падаем
;        С=0 - можно ходить

sub_11560:      mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                mov     CurrPlayerSpr, R0  ; текущий спрайт
                mov     (R0)+, R0       ; высота спрайта в строках экрана
                swab    R0              ; умножаем на 100
                ror     R0              ; получается смещение в байтах до низа спрайта
                asr     R0              ;
                add     R0, R1          ; адрес под спрайтом игрока
                mov     #3, R2

2$:             mov     #ObstacleTbl2, R0 ; смотрим, что под игроком
                mov     #16, R3

3$:             cmpb    (R0)+, (R1)
                beq     8$
                sob     R3, 3$
                inc     R1
                sob     R2, 2$
                ; под игроком пусто или преодолимое препятствие
                tst     PlayerDirection ; задаём спрайт в зависимости от направления движения
                bpl     4$
                mov     #SprPlrKickLtp, CurrPlayerSpr
                br      5$
; ───────────────────────────────────────────────────────────────────────────

4$:             mov     #SprPlrKickRtp, CurrPlayerSpr

5$:             mov     #200, CurrOffsetV ; предполагаем падение
                tst     CurrOffsetH     ; по горизонтали двигаемся?
                beq     7$              ; нет
                mov     #3, R2

6$:             cmpb    #231, -(R1)     ; под ногами канат?
                beq     8$              ; да
                sob     R2, 6$

7$:             sec                     ; значит падаем
                return
; ───────────────────────────────────────────────────────────────────────────

8$:             mov     CurrOffsetH, CurrOffsetV ; текущее смещение движения по вертикали
9$:             clc                     ; не падаем, можно идти
                return
; End of function sub_11560


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

; Проверка наличия препятствий при движении игрока по горизонтали

sub_11732:      mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                add     #200, R1        ; адрес, откуда начинается проверка
                tst     CurrOffsetH     ; по горизонтали движемся?
                beq     0ret$           ; нет, и нечего делать тогда
                bpl     0goRight$       ; да, и вправо
                ; да, и влево
0goLeft$:       dec     R1              ; адрес слева от игрока
                br      DoCheck$

0goRight$:      add     #3, R1          ; адрес справа от игрока

DoCheck$:       mov     CurrPlayerSpr, R0 ; текущий спрайт
                mov     (R0)+, R0      ; высота в строках
                tst     -(R0)          ; уменьшим на 2, т.к. выше прибавили 200
; End of function sub_11732


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

; Проверка на наличие препятствия при движении по горизонтали
; Вход: R1 - адрес экрана, где ожидается препятствие
;       R0 - высота объекта в строках экрана
; Выход: если есть препятствие, сброс смещения по горизонтали

ChkObstacleHor: mov     #ObstaclesTbl, R2 ; таблица препятствий
                mov     #21, R3         ; число элементов
                tstb    (R1)            ; что перед игроком?
                beq     2$              ; пусто
                ; не пусто
1$:             cmpb    (R2)+, (R1)
                beq     3$
                sob     R3, 1$

2$:             add     #100, R1
                sob     R0, ChkObstacleHor

0ret$:          return
; ───────────────────────────────────────────────────────────────────────────

3$:             clr     CurrOffsetH     ; всё, никуда не движемся
                return
; End of function ChkObstacleHor


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

; проверка на столкновение с тремя объектами
; Выход: C=1 - нет столкновения ни с чем
;        C=0 - есть столкновение одним из объектов

sub_12032:      mov     R1, -(SP)
                mov     #3, R3
                mov     #Obstacles3x3, R2

1$:             mov     #3, R4
                mov     R4, R0          ; проверяем ряд

2$:             cmpb    (R2)+, (R1)+
                bne     3$
                dec     R0              ; если совпали все три, тут будет 0

3$:             sob     R4, 2$
                tst     R0              ; все три совпали?
                beq     4$              ; да
                mov     (SP), R1        ; нет
                sob     R3, 1$          ; проверим следующий ряд
                mov     (SP)+, R1
                sec                     ; ничего не совпало
                return
; ───────────────────────────────────────────────────────────────────────────

4$:             mov     (SP)+, R1
                clc                     ; есть совпадение
                return
; End of function sub_12032


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

; Проверка на препятствия при движении игрока вверх

sub_12136:      mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                sub     #200, R1        ; что сверху?
                mov     #3, R2
; End of function sub_12136


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

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

ChkObstacleVert:mov     #ObstaclesTbl, R0 ; массив препятствий
                mov     #21, R3         ; количество возможных препятствий

1$:             cmpb    (R0)+, (R1)     ; проверяем
                beq     2$              ; да, есть совпадение
                sob     R3, 1$          ; проверим всё
                inc     R1              ; следующий адрес
                sob     R2, ChkObstacleVert ; и так по всей ширине
                return
; ───────────────────────────────────────────────────────────────────────────

2$:             clr     CurrOffsetV     ; текущее смещение движения по вертикали
                return
; End of function ChkObstacleVert


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

; Двойной звуковой щелчок
; Вход: R4 - тон второго щелчка

SoundEffect1:   call    SndClick        ; Звуковой щелчок
                mov     #100, R3
                sob     R3, .
                bis     #100, @#177716
                mov     R4, R3
                br      NextSndEffect
; End of function SoundEffect1


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

; Звуковой щелчок

SndClick:       bis     #100, @#177716
                mov     #100, R3

NextSndEffect:  sob     R3, .
                bic     #100, @#177716
                return
; End of function SndClick


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

; инициализируем некоторые переменные
; и рисуем стакан и заголовок

sub_36264:      mov     (PC)+, @(PC)+
                       return  ; 207
                        .word MorphRet
                clr     EyeStruct
; End of function sub_36264

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

; рисуем стакан и заголовок

sub_4020:       mov     #42000, R1
                mov     #3, R2
                mov     #20, R5

1$:             call    DrawSprite      ; Вывод спрайта.
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - номер спрайта (младшие 3 бита)
                add     #71, R1
                call    DrawSprite      ; Вывод спрайта.
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - номер спрайта (младшие 3 бита)
                sob     R5, 1$
                mov     #25, R5

2$:             call    DrawSprite      ; Вывод спрайта.
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - номер спрайта (младшие 3 бита)
                sob     R5, 2$
                br      DrawHeader      ; Вывод 3 зелёных полосы и (С) BIL
; End of function sub_4020


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

; инициализация параметров объектов взаимодействия лабиринта
; и Вывод 3 зелёных полосы и (С) BIL

sub_12204:      mov     #ArrDst, R1
                mov     #ArrSrc, R0
                mov     #<ArrSrc - ArrDst> /2, R2

1$:             mov     (R0)+, (R1)+
                sob     R2, 1$
                ;jmp     DrawHeader      ; Вывод 3 зелёных полосы и (С) BIL
; End of function sub_12204

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

; Вывод 3 зелёных полосы и (С) BIL

DrawHeader:     mov     #40400, R0
                mov     #40, R1
                mov     #125252, R2

1$:             mov     R2, 400(R0)
                mov     R2, 200(R0)
                mov     R2, (R0)+
                sob     R1, 1$
                mov     #sprBIL, R0
                mov     #40137, R1
                mov     #11, R2

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

3$:             movb    (R0)+, (R1)+
                sob     R3, 3$
                clrb    (R1)+
                add     #70, R1
                sob     R2, 2$
                mov     #40032, R1
                mov     #13, R2

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

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


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

; Проверка на ящик с оружиями
; Выход: C=1 - не на ящике
;        C=0 - на ящике

sub_13364:      mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                add     #1500, R1
                mov     #2, R2

1$:             mov     #3, R3

2$:             cmpb    #252, (R1)+
                beq     3$
                sob     R3, 2$
                add     #75, R1
                sob     R2, 1$
                sec
                return
; ───────────────────────────────────────────────────────────────────────────
                ; да, на ящике стоим
3$:             mov     BoxListAddr, R1 ; указатель на начало списка лифтов и ящиков с оружием

4$:             tst     (R1)            ; если есть лифты,
                bmi     5$
                add     #12, R1         ; их пропустим
                br      4$              ; ящик всегда есть, и он всегда последний в списке
; ───────────────────────────────────────────────────────────────────────────

5$:             clc
                return
; End of function sub_13364


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


sub_13450:      call    sub_13364       ; Проверка на ящик с оружиями
                                        ; Выход: C=1 - не на ящике
                                        ;        C=0 - на ящике
                bcc     1StandBox$

; очищаем ячейку доступного оружия

ClrAvailableWpnCell:
                mov     #41202, R1


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


ClrWpnCell:     mov     #21, R2

1$:             mov     #3, R3

2$:             clrb    (R1)+
                sob     R3, 2$
                add     #75, R1
                sob     R2, 1$

1ret$:          return
; End of function ClrWpnCell

; ───────────────────────────────────────────────────────────────────────────
; извлекаем вид доступного оружия

1StandBox$:     mov     (R1), R0
                bic     #177770, R0
                beq     1ret$
                dec     R0
                asl     R0
                mov     WeaponTable(R0), R0
                mov     (R0)+, R2
                mov     R2, R1
                swab    R1
                ror     R1
                asr     R1
                asr     R1              ; * 100 / 2
                bic     #77, R1
                neg     R1
                add     #42202, R1      ; нарисуем оружие в ячейке доступа
; End of function sub_13450

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

; Рисуем оружие в ячейке
; Вход: R0 - адрес спрайта оружия + 2
;       R2 - высота спрайта оружия в строках

DrawWpnInCell:  mov     #100, R3
                sub     (R0), R3
                mov     R3, 2Pitch$
                mov     (R0)+, 2Width$

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

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

                sob     R2, 1$
                return
; End of function DrawWpnInCell

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


StartGame:      mov     #DynamicStruct, R1
                mov     #DynamicItemsNum, R2

0$:             bis     #177, (R1)      ; восстанавливаем всю динамическую живность
                add     #DynamicItemSize, R1 ; в лабиринте
                sob     R2, 0$
                mov     #40000, R0
1$:             clr     (R0)+
                tst     R0
                bpl     1$
                call    sub_12204       ; инициализация параметров объектов взаимодействия лабиринта
                                        ; и Вывод 3 зелёных полосы и (С) BIL
                ; Рисуем полоску здоровья
                mov     #41715, R1
                mov     #6, R0

2$:             mov     #35, R2

3$:             movb    #356, 100(R1)
                movb    #335, (R1)+
                sob     R2, 3$
                add     #143, R1
                sob     R0, 2$
                ; Рисуем две рамки для оружия
                mov     #40701, R1
                mov     #5, R3
                mov     #Ramka, R5

4$:             movb    (R5)+, R2
                beq     7$

5$:             mov     R3, R4

6$:             movb    (R5), 6(R1)
                movb    (R5)+, (R1)+
                sob     R4, 6$
                add     #73, R1
                sub     #5, R5
                sob     R2, 5$
                add     #5, R5
                br      4$
; ───────────────────────────────────────────────────────────────────────────

7$:             mov     #42450, GameGoal ; начальная позиция шкалы найденной взрывчатки
                call    sub_16364       ; Очистка буфера
                                        ; Очистка ячейки выбранного оружия
                mov     #300, StaminaMask
                mov     #41751, Stamina$ ; текущий адрес на полоске здоровья
                clr     FatigueCnt
                clr     RelaxFlg
                mov     #64237, CurrPlayerAddr ; текущий адрес экрана игрока
                mov     #SprStandRight, CurrPlayerSpr
                mov     #SprPlayerBuf, R0
                mov     #1, (R0)+
                mov     #1, (R0)+
                clr     (R0)+
                mov     (PC)+, @(PC)+
                        br . + <GoTo1$ - MorphBR1$>
                        .word MorphBR1$
                mov     (PC)+, @(PC)+
                        br . + <GoTo2$ - MorphBR2$>
                        .word MorphBR2$
                mov     #BeginLabyrint, CurrentHall ; задаём начало лабиринта
; ───────────────────────────────────────────────────────────────────────────
; начало игрового цикла

StartGameCycle: mov     #TopStack, SP
                mov     CurrentHall, R5
                mov     176(R5), R5     ; адрес списка объектов взаимодействия

1$:             tst     (R5)            ; параметры ящика?
                bmi     2$              ; да
                clr     (R5)+           ; нет - инициализируем лифт
                clr     (R5)+
                add     #6, R5
                br      1$
; ───────────────────────────────────────────────────────────────────────────

2$:             call    AnimWeaponFlight ; анимация летящего оружия
NextGC2$:       clr     EyeStruct
                clr     HeadCarScruct
                ;clr     @#0             ; похоже, он задумывал ещё какую-то живность, но не влезло в память
                mov     #sprBuffer.data, R1
                mov     #sprBufferSize/2, R2

1$:             clr     (R1)+
                sob     R2, 1$
                clr     BubbleScrAddr
                clr     BurstAnimTbl
                clr     BurstAnimTbl+4
                mov     (PC)+, @(PC)+
                        br . + <NextSF - MorphRet>
                        .word MorphRet
                call    DrawScreenLab   ; Прорисовка экрана лабиринта
; расстановка динамических объектов
                mov     #DynamicStruct, R1
                mov     #DynamicItemsNum, R2 ; количество элементов

2$:             mov     (R1), R0        ; адрес зала
                mov     R0, R4
                bic     #177, R0        ; область флагов
                cmp     CurrentHall, R0 ; это текущий зал?
                bne     6$              ; нет - ищем дальше
                bit     #2, R4         ; да - бит 1 есть?
                beq     3$
                mov     2(R1), BubbleScrAddr

3$:             bit     #4, R4
                beq     4$
                mov     4(R1), EyeStruct

4$:             bit     #10, R4
                beq     5$
                mov     6(R1), HeadCarScruct

5$:             ;nop                     ; вот тут вот кого-то ещё добавить хотел
                ;nop
                ;nop
                ;nop
                ;nop
                ;nop
                br      7$
; ───────────────────────────────────────────────────────────────────────────

6$:             add     #DynamicItemSize, R1
                sob     R2, 2$

7$:             mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                mov     CurrPlayerSpr, R0
                mov     #SprPlayerBuf, R4
                call    DrawSpriteM   ; Вывод на экран спрайта, с заполнением буфера маской, чтобы потом стереть
                                        ; Вход: R0 - адрес спрайта
                                        ;       R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом

LoopGC$:        call    sub_13450       ; отображение доступного оружия, если стоим на ящике
                call    ControlsProc    ; Обработка управления
                bit     WpnKickJump, #200 ; оружие?
                beq     MorphBR1$       ; нет
                call    sub_15724       ; да - обработка оружия

MorphBR1$:      br      GoTo1$          ; сюда пишется код 137
                .word ContinueJump      ; при выполнении прыжка
GoTo1$:
MorphBR2$:      br      GoTo2$          ; сюда пишется код 137
                .word ContinueKick      ; при выполнении удара

GoTo2$:         call    SetDirection    ; фиксируем направление движения
                mov     #2, R5          ; цикл

GC1$:           call    sub_11560       ; Проверка поверхности под ногами игрока.
                                        ; Выход: С=1 - ничего нет, падаем
                                        ;        С=0 - можно ходить
                bcs     jmp_14242
                bit     WpnKickJump, #100000 ; прыжок?
                beq     2$              ; нет
                jmp     JumpFunc
; ───────────────────────────────────────────────────────────────────────────

2$:             bit     WpnKickJump, #1 ; удар?
                beq     3$              ; нет
                jmp     KickFunc
; ───────────────────────────────────────────────────────────────────────────

3$:             tst     CurrOffsetH     ; по горизонтали движемся?
                bne     HorizMoveFunc   ; да
; ───────────────────────────────────────────────────────────────────────────

4$:             tst     OffsetVMove     ; по вертикали движемся?
                bne     VertMoveFunc    ; да
; ───────────────────────────────────────────────────────────────────────────

jmp_14236:      call    sub_14454       ; анимация ходьбы

jmp_14242:      call    sub_15466       ; обработка движения на лифте и анимация лифтов
                mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                add     CurrOffsetV, CurrPlayerAddr ; текущее смещение движения по вертикали
                mov     R5, -(SP)
                mov     CurrPlayerAddr, R5 ; текущий адрес экрана игрока
                call    CheckHallBounds ; проверка на выход за границы текущего зала
                                        ; и формирование нового адреса зала
                mov     #SprPlayerBuf, R4
                mov     CurrPlayerSpr, R0
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     R5, R1
                mov     #SprPlayerBuf, R4
                call    DrawSpriteM     ; Вывод на экран спрайта, с заполнением буфера маской, чтобы потом стереть
                                        ; Вход: R0 - адрес спрайта
                                        ;       R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (SP)+, R5
                sob     R5, GC1$
                mov     #20000, R5
                sob     R5, .

NextGC4$:       call    SecretFunc$     ; анимация взрывов и проверка, кто-кого убил
                call    sub_16676
                call    sub_34164       ; проверка на паузу и
                                        ; Обработка движения шарика и глаза
                call    AnimWeaponShoot ; анимация выстрела и летящего оружия
                mov     #20000, R5
                sob     R5, .
                call    BubbleAnim      ; Обработка движения шарика и глаза
                call    HeadCarAnim     ; обработка и анимация головы в машинке
                call    AnimWeaponShoot ; анимация выстрела и летящего оружия
                br      LoopGC$
; ───────────────────────────────────────────────────────────────────────────

HorizMoveFunc:  call    sub_11732       ; Проверка наличия препятствий при движении игрока по горизонтали
                call    sub_14454       ; анимация ходьбы
GotoJmp2$:      add     CurrOffsetH, CurrOffsetV ; текущее смещение движения по вертикали

NextMoveFunc$:  mov     #1, R5
GotoJmp$:       br      jmp_14242
; ───────────────────────────────────────────────────────────────────────────

VertMoveFunc:   tst     OffsetVMove     ; куда движемся?
                bmi     4$              ; вверх
                ; вниз или никуда
                mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                cmp     #SprCrouch, CurrPlayerSpr ; если сидим
                beq     NextMoveFunc$   ; то сидим
                add     #2001, R1       ; если препятствия, то сидим
                mov     #ObstaclesTbl, R2
                mov     #22, R3

1$:             cmpb    (R2)+, (R1)
                bne     3$
                mov     #500, CurrOffsetV ; текущее смещение движения по вертикали
                clr     OffsetVMove   ; Смещение движения по вертикали

                mov     #SprCrouch, @#CurrPlayerSpr
                br      NextMoveFunc$
; ───────────────────────────────────────────────────────────────────────────

3$:             sob     R3, 1$
                ; если препятствий нет,
                ; дальнейшие проверки
4$:             mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                sub     #100, R1
                call    sub_12032       ; проверка на столкновение с тремя объектами
                                        ; Выход: C=1 - нет столкновения ни с чем
                                        ;        C=0 - есть столкновение одним из объектов

                bcc     7$
                add     #2200, R1
                call    sub_12032       ; проверка на столкновение с тремя объектами
                                        ; Выход: C=1 - нет столкновения ни с чем
                                        ;        C=0 - есть столкновение одним из объектов
                bcc     7$

6$:             mov     PlayerDirection, CurrOffsetH ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                clr     OffsetVMove     ; Смещение движения по вертикали
                br      jmp_14236
; ───────────────────────────────────────────────────────────────────────────

7$:             tst     OffsetVMove     ; куда движемся?
                bpl     10$             ; вниз или никуда
                ; вверх
                mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                mov     #3, R0

8$:             mov     #ObstaclesTbl, R2
                mov     #21, R3

9$:             cmpb    (R2)+, (R1)
                beq     6$
                sob     R3, 9$
                inc     R1
                sob     R0, 8$

10$:            com     #-1
                beq     11$
                call    AnimClimbStairs ; анимация карабкания по лестнице

11$:            mov     OffsetVMove, CurrOffsetV ; текущее смещение движения по вертикали
                br      GotoJmp$
; ───────────────────────────────────────────────────────────────────────────
; обработка прыжка

JumpFunc:       mov     (PC)+, @(PC)+
                        jmp @(PC)+
                        .word MorphBR1$
                mov     #17, JumpAnimCnt
                tst     PlayerDirection
                bpl     1$
                mov     #SprPlrKickLtp, R0
                br      NextJumpAnim$
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     #SprPlrKickRtp, R0

NextJumpAnim$:  mov     R0, CurrPlayerSpr
                mov     #-200, CurrOffsetV ; текущее смещение движения по вертикали

NextKickAnim$:  mov     PlayerDirection, CurrOffsetH ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                call    sub_11732       ; Проверка наличия препятствий при движении игрока по горизонтали
                call    sub_12136       ; Проверка на препятствия при движении игрока вверх
                br      GotoJmp2$
; ───────────────────────────────────────────────────────────────────────────

ContinueJump:   dec     (PC)+           ; прыжок закончился?
JumpAnimCnt:     .word 0                ; длительность анимации прыжка
                bne     5$              ; нет ещё
                mov     (PC)+, @(PC)+   ; закончился, возвращаем всё как было
                        br . + <GoTo1$ - MorphBR1$>
                        .word MorphBR1$
                jmp     NextGC4$
; ───────────────────────────────────────────────────────────────────────────

5$:             mov     CurrPlayerSpr, R0
                tst     PlayerDirection
                bpl     9$
                cmp     #SprPlrKickLtp, R0
                bne     6$
                mov     #SprSomersault1Lt, R0
                br      NextJumpAnim$
; ───────────────────────────────────────────────────────────────────────────

6$:             cmp     #SprSomersault1Lt, R0
                bne     7$
                mov     #SprSomersault2Lt, R0
                br      NextJumpAnim$
; ───────────────────────────────────────────────────────────────────────────

7$:             cmp     #SprSomersault2Lt, R0
                bne     8$
                mov     #SprSomersault3Lt, R0
                br      NextJumpAnim$
; ───────────────────────────────────────────────────────────────────────────

8$:             cmp     #SprSomersault3Lt, R0
                bne     KickFunc
                mov     #SprSomersault1Lt, R0
                br      NextJumpAnim$
; ───────────────────────────────────────────────────────────────────────────

9$:             cmp     #SprPlrKickRtp, R0
                bne     10$
                mov     #SprSomersault1Rt, R0
                br      NextJumpAnim$
; ───────────────────────────────────────────────────────────────────────────

10$:            cmp     #SprSomersault1Rt, R0
                bne     11$
                mov     #SprSomersault2Rt, R0
                br      NextJumpAnim$
; ───────────────────────────────────────────────────────────────────────────

11$:            cmp     #SprSomersault2Rt, R0
                bne     12$
                mov     #SprSomersault3Rt, R0
                br      NextJumpAnim$
; ───────────────────────────────────────────────────────────────────────────

12$:            cmp     #SprSomersault3Rt, R0
                bne     KickFunc
                mov     #SprSomersault1Rt, R0
                br      NextJumpAnim$
; ───────────────────────────────────────────────────────────────────────────
; обработка удара

KickFunc:       mov     (PC)+, @(PC)+
                        jmp @(PC)+
                        .word MorphBR2$
                mov     #7, KickAnimCnt
                mov     #-400, CurrOffsetV ; текущее смещение движения по вертикали
                tst     PlayerDirection
                bmi     1$
                mov     #SprPlrKickRtp, R0
                br      NextKickFunc$
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     #SprPlrKickLtp, R0

NextKickFunc$:  mov     R0, CurrPlayerSpr
                br      NextKickAnim$
; ───────────────────────────────────────────────────────────────────────────

ContinueKick:   tst     CurrOffsetV     ; текущее смещение движения по вертикали
                beq     3EndKick$
                clr     CurrOffsetV     ; текущее смещение движения по вертикали
                dec     (PC)+
KickAnimCnt:    .word 0
                bne     1$
3EndKick$:      mov     (PC)+, @(PC)+
                        br . + <GoTo2$ - MorphBR2$>
                        .word MorphBR2$

1$:             tst     PlayerDirection
                bmi     2$
                mov     #SprPlrKickRight, R0
                br      NextKickFunc$
; ───────────────────────────────────────────────────────────────────────────

2$:             mov     #SprPlrKickLeft, R0
                br      NextKickFunc$
; ───────────────────────────────────────────────────────────────────────────


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

; проверка на выход за границы текущего зала
; и формирование нового адреса зала

CheckHallBounds:mov     R5, -(SP)
                bic     #177700, R5     ; оставляем горизонтальное положение
                cmp     #75, R5         ; до правого края дошли?
                bne     2$              ; нет
                bic     #77, CurrPlayerAddr ; да - окажемся с левого края экрана
                add     #200, CurrentHall ; в следующем зале лабиринта

1$:             jmp     StartGameCycle
; ───────────────────────────────────────────────────────────────────────────

2$:             cmp     #77, R5         ; до левого края дошли?
                bne     3$              ; нет
                add     #75, CurrPlayerAddr ; да - окажемся с правого края экрана
                sub     #200, CurrentHall ; в следующем (предыдущем) зале
                br      1$
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     (SP)+, R5
                cmp     #76000, R5      ; до низа дошли?
                bpl     4$              ; нет
                bic     #177700, CurrPlayerAddr ; да - окажемся сверху в следующем зале
                bis     #44400, CurrPlayerAddr ; текущий адрес экрана игрока
                add     #1400, CurrentHall ; переходим в следующий ряд залов снизу
                br      1$
; ───────────────────────────────────────────────────────────────────────────

4$:             cmp     #44400, R5      ; до верха дошли?
                bmi     5$              ; нет - выход
                bic     #177700, CurrPlayerAddr ; да - окажемся снизу в следующем зале
                bis     #75200, CurrPlayerAddr ; текущий адрес экрана игрока
                sub     #1400, CurrentHall ; переходим в следующий ряд залов сверху
                br      1$
; ───────────────────────────────────────────────────────────────────────────

5$:             return
; End of function CheckHallBounds


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


sub_15466:      mov     BoxListAddr, R4 ; указатель на начало списка лифтов и ящиков с оружием

1$:             tst     (R4)+
                bmi     3$
                mov     (R4)+, R1
                beq     2$
; обработка движения игрока на лифте
                mov     R1, R0
                mov     CurrPlayerAddr, R2 ; текущий адрес экрана игрока
                sub     R2, R0
                bmi     2$
                cmp     #2000, R0
                bmi     2$
                bic     #177700, R2
                bic     #177700, R1
                add     #3, R1
                sub     R2, R1
                bmi     2$
                cmp     #5, R1
                bmi     2$
                bit     #100001, WpnKickJump
                bne     2$
                mov     (PC)+, @(PC)+
                        br . + <GoTo1$ - MorphBR1$>
                        .word MorphBR1$
                mov     (PC)+, @(PC)+
                        br . + <GoTo2$ - MorphBR2$>
                        .word MorphBR2$
                mov     (R4), CurrOffsetV ; текущее смещение движения по вертикали
                add     CurrOffsetH, CurrOffsetV ; текущее смещение движения по вертикали
                mov     CurrPlayerAddr, R1 ; текущий адрес экрана игрока
                bic     #77, R1
                mov     -2(R4), R0
                bic     #77, R0
                sub     R1, R0
                sub     #2000, R0
                add     R0, CurrOffsetV ; текущее смещение движения по вертикали

3$:             mov     R5, -(SP)
                dec     R5
                bne     4$
                call    AnimLiftMoving ; Обработка движения лифтов

4$:             mov     (SP)+, R5
                return

2$:             add     #6, R4
                br      1$
; End of function sub_15466


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

; обработка оружия

sub_15724:      call    sub_13364       ; Проверка на ящик с оружиями
                                        ; Выход: C=1 - не на ящике
                                        ;        C=0 - на ящике
                bcs     MakeShoot       ; не на ящике, значит возможно выстрел
                mov     (R1), R0        ; берём значение
                bic     #177770, R0     ; выделяем 3 мл бита
                beq     6$              ; если 0 - то это оружие потрачено
                cmp     #1, R0          ; если 1 - это цель игры, нашли мешок со взрывчаткой
                bne     1$              ; остальное - разные виды оружия
                add     #3, GameGoal
                mov     (PC)+, R2
GameGoal:       .word   0
                clr     R5
                br      3$
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     R1, -(SP)
                mov     #41210, R1      ; очистка ячейки выбранного оружия
                call    ClrWpnCell
                mov     (SP)+, R1
                mov     #42210, R2
                mov     (PC)+, R5
CurrPlayerWeapon:.word 0                ; текущее оружие в руках игрока

                mov     R0, CurrPlayerWeapon ; новое оружие из ящика - в руки
                swab    R5
                asl     R5
                asl     R5
                asl     R5
                asl     R5              ; R5 << 014
                bic     #107777, R5

3$:             asr     (R1)
                asr     (R1)
                asr     (R1)            ; старое оружие из рук - в ящик
                bic     #70000, (R1)
                bis     R5, (R1)
                bis     #100000, (R1)   ; восстановим признак ящика с оружием
                dec     R0
                asl     R0
                mov     WeaponTable(R0), R0
                mov     R2, R1
                mov     (R0)+, R2
                mov     R2, R3
                swab    R3
                ror     R3
                asr     R3
                asr     R3                  ; * 100 / 2
                bic     #77, R3
                sub     R3, R1              ; нарисуем взятое оружие
                call    DrawWpnInCell       ; Рисуем оружие в ячейке
                jmp     ClrAvailableWpnCell
; ───────────────────────────────────────────────────────────────────────────

6$:             asr     (R1)
                asr     (R1)
                asr     (R1)
                bic     #70000, (R1)
                return
; ───────────────────────────────────────────────────────────────────────────

MakeShoot:      mov     CurrPlayerWeapon, R0
                beq     ret3$
                mov     #WpnShootingStruct, R5
                tst     (R5)
                bne     ret3$
                mov     CurrPlayerAddr, (R5) ; текущий адрес экрана игрока
                add     #500, (R5)+
                tst     PlayerDirection
                bpl     1$
                mov     #-1, (R5)+
                br      2$
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     #1, (R5)+

2$:             dec     R0
                asl     R0
                mov     WeaponTable(R0), (R5)+
                mov     #SprBufWeapon, (R5)+
ret3$:          return
; End of function sub_15724

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


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

; анимация выстрела и летящего оружия

AnimWeaponShoot:mov     #WpnShootingStruct, R5
                mov     (R5), R1
                beq     ret3$
                mov     6(R5), R4       ; буфер данных
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (R5)+, R1       ; адрес экрана
                add     (R5)+, R1       ; направление движения
                mov     R1, -4(R5)      ; сохраним новый адрес
                mov     (R5), R4        ; буфер данных
                mov     (R4)+, R0
                mov     R0, CurrOffsetH ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                tst     PlayerDirection
                bmi     1$
                add     (R4), R1

1$:             call    ChkObstacleHor  ; Проверка на наличие препятствия при движении по горизонтали
                                        ; Вход: R1 - адрес экрана, где ожидается препятствие
                                        ;       R0 - высота объекта в строках экрана
                                        ; Выход: если есть препятствие, сброс смещения по горизонтали
                tst     CurrOffsetH     ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                beq     sub_16364

2$:             mov     -4(R5), R1
                mov     R1, R4
                bic     #177700, R4
                sub     #74, R4
                bpl     sub_16364       ; Очистка буфера
                                        ; Очистка ячейки выбранного оружия
                mov     (R5), R0
                cmp     #SprWeapon2.2, R0 ; анимация летящего сюрикена
                bne     3$
                mov     #SprWeapon2, R0
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             cmp     #SprWeapon2, R0
                bne     4$
                mov     #SprWeapon2.2, R0

4$:             tst     WpnShootingDir  ; направление движения выстреленного оружия
                bpl     6$
                cmp     #SprWeapon4Rt, R0
                bne     5$
                mov     #SprWeapon4Lt, R0

5$:             cmp     #SprWeapon7Rt, R0
                bne     6$
                mov     #SprWeapon7Lt, R0

6$:             mov     R0, (R5)+
                mov     (R5)+, R4
                jmp     DrawSpriteM   ; Вывод на экран спрайта, с заполнением буфера маской, чтобы потом стереть
                                        ; Вход: R0 - адрес спрайта
                                        ;       R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
; End of function AnimWeaponShoot


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

; Очистка буфера
; Очистка ячейки выбранного оружия

sub_16364:      mov     #SprBufWeapon+4, R1 ; оружие потрачено, его больше нет
                mov     #SprBufWeaponSize/2, R2

1$:             clr     (R1)+
                sob     R2, 1$
                clr     WpnShootingStruct
                clr     CurrPlayerWeapon
                mov     #41210, R1      ; очистка ячейки выбранного оружия
                jmp     ClrWpnCell
; End of function sub_16364


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

; анимация летящего оружия

AnimWeaponFlight:
                tst     WpnShootingStruct
                bne     sub_16364       ; Очистка буфера
                                        ; Очистка ячейки выбранного оружия
                return
; End of function AnimWeaponFlight

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


sub_16676:      mov     CurrPlayerSpr, -(SP)
                call    sub_11560       ; Проверка поверхности под ногами игрока.
                                        ; Выход: С=1 - ничего нет, падаем
                                        ;        С=0 - можно ходить
                bcc     2$              ; под ногами не пусто
                tst     JumpAnimCnt     ; под ногами пусто, а прыжок ещё не закончился?
                bne     1$              ; ещё нет
                inc     FatigueCnt      ; закончился, накопление усталости, ну или
                                        ; уменьшение выносливости
1$:             br      4$
; ───────────────────────────────────────────────────────────────────────────
                ; под ногами не пусто
2$:             mov     CurrPlayerAddr, R0 ; текущий адрес экрана игрока
                bic     #177700, R0
                bic     #77, R1
                bis     R0, R1
                call    sub_12032       ; проверка на столкновение с тремя объектами
                                        ; Выход: C=1 - нет столкновения ни с чем
                                        ;        C=0 - есть столкновение одним из объектов
                bcc     3$
                tst     CurrOffsetV     ; по вертикали движемся?
                bne     3$              ; да
                inc     RelaxFlg        ; нет, отметим это

3$:             call    StaminaAnim     ; Функция, связанная со стаминой
                                        ; Отрисовка линейки здоровья

4$:             mov     (SP)+, CurrPlayerSpr
                return
; End of function sub_16676


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

; Функция, связанная со стаминой
; Отрисовка линейки здоровья

StaminaAnim:    mov     (PC)+, R4
StaminaMask:    .word 3                 ; маска битов для прорисовки полоски здоровья на экране

                mov     (PC)+, R1
Stamina$:       .word 41715             ; текущий адрес на полоске здоровья

Stam.1$:        cmp     (PC)+, (PC)+    ; счётчик превысил предел?
FatigueCnt:     .word 14, 11            ; счётчик усталости или потери выносливости
                bpl     2$              ; да - пора уменьшать здоровье
                clr     @#FatigueCnt    ; нет - всё, хватит
                br      6$              ; идём дальше
; ───────────────────────────────────────────────────────────────────────────

2$:             dec     @#FatigueCnt    ; уменьшаем счётчик, т.е. отнимаем заданное количество здоровья
                ; уменьшаем полоску здоровья
                mov     #14, R0
                mov     R1, -(SP)

3$:             bicb    R4, (R1)
                add     #100, R1
                sob     R0, 3$
                mov     (SP)+, R1
                clc                     ; сдвигаем маску
                ror     R4
                clc
                ror     R4
                bcc     5$              ; за пределы байта ещё не вышли
                dec     R1              ; вышли - уменьшаем адрес
                cmp     #41714, R1      ; полоска здоровья уменьшилась до конца?
                bne     4$              ; ещё нет, ещё живём
                nop     inc R1          ; ### это для бессмертия
                ;jmp     @#PlayerDead    ; ### это для честной игры
; ───────────────────────────────────────────────────────────────────────────

4$:             mov     R1, @#Stamina$  ; сохраним текущий адрес на полоске здоровья
                mov     #300, R4        ; и инициализируем маску

5$:             mov     R4, @#StaminaMask
                br      Stam.1$         ; продолжим отбирать здоровье, пока счётчик позволяет
; ───────────────────────────────────────────────────────────────────────────

6$:             tst     (PC)+           ; по вертикали движемся?
RelaxFlg:       .word 0                 ; флаг, что нет движения по вертикали
                bne     7$              ; нет
                return                  ; да
; ───────────────────────────────────────────────────────────────────────────
                ; а это восстановление здоровья, если мы просто стоим на месте
7$:             com     #-1
                beq     8$
                com     #-1
                beq     8$
                dec     @#RelaxFlg
                clc                     ; двигаем маску в обратную сторону
                rolb    R4
                clc
                rolb    R4
                bcc     10$             ; за пределы байта не вышли
                mov     #3, R4          ; вышли, инициализируем маску
                inc     R1              ; увеличиваем адрес
                cmp     #41752, R1      ; до максимума дошли?
                bne     9$              ; нет ещё

8$:             clr     @#RelaxFlg      ; да - всё хватит увеличивать здоровье
                return
; ───────────────────────────────────────────────────────────────────────────

9$:             mov     R1, @#Stamina$  ; сохраняем новый адрес на полоске здоровья

10$:            mov     R4, @#StaminaMask
                mov     #335, R2        ; рисуем на экране
                mov     #356, R3
                com     R4
                bic     R4, R2          ; заданным цветом
                bic     R4, R3
                mov     #6, R0

11$:            bisb    R2, (R1)
                bisb    R3, 100(R1)
                add     #200, R1
                sob     R0, 11$
                return
; End of function StaminaAnim


; ───────────────────────────────────────────────────────────────────────────
; это массив динамических объектов на карте (живности)
; элементов - 42, размер элемента - 12 байтов
; .word адрес зала + флаги
; флаги: бит 1 - есть шарик
;        бит 2 - есть глаз
;        бит 3 - есть Голова в машинке
; .word адрес шарика
; .word адрес глаза
; .word адрес головы в машинке
; .word 0 (не используется)
DynamicItemSize = 12
DynamicItemsNum = 42
DynamicStruct:  .word Hall01,   63030, 73022, 51644, 0
                .word Hall02,   70037, 62040, 70040, 0
                .word Hall03,   73436, 65660, 73410, 0
                .word Hall04,   66060, 65610, 51620, 0
                .word Hall05,   50062, 52014, 52044, 0
                .word Hall10,   55037, 53044, 0, 0
                .word Hall11,   62010, 57054, 52012, 0
                .word Hall12,   56037, 63615, 73420, 0
                .word Hall13,   72066, 57230, 64440, 0
                .word Hall14,   50044, 63613, 73414, 0
                .word Hall15,   57437, 47645, 57226, 0
                .word Hall20,   57437, 64411, 57210, 0
                .word Hall21,   60004, 66037, 73430, 0
                .word Hall22,   67614, 57010, 52020, 0
                .word Hall23,   67333, 57716, 61050, 0
                .word Hall24,   66010, 61060, 53660, 0
                .word Hall25,   67040, 73230, 61010, 0
                .word Hall30,   60040, 66030, 52020, 0
                .word Hall31,   66666, 60000, 52032, 0
                .word Hall32,   67040, 66415, 46414, 0
                .word Hall33,   73637, 66036, 61036, 0
                .word Hall34,   60000, 46660, 53654, 0
                .word Hall35,   72650, 66403, 53630, 0
                .word Hall40,   60004, 66032, 61040, 0
                .word Hall41,   74060, 46232, 66240, 0
                .word Hall42,   47010, 54062, 66240, 0
                .word Hall43,   74060, 54020, 46436, 0
                .word Hall44,   50060, 46406, 73420, 0
                .word Hall45,   56066, 71032, 62636, 0
                .word Hall50,   54050, 64423, 64444, 0
                .word Hall51,   65006, 54065, 46472, 0
                .word Hall52,   60000, 51430, 73450, 0
                .word Hall53,   56050, 66040, 73436, 0
                .word Hall54,   47020, 56013, 57246, 0
; Начало лабиринта, начало должно быть выровнено строго по границе 200
; байтов потому, что размер одного зала - 200 байтов, а младшие биты адреса
; хранят параметры.
; залы располагаются по горизонтали, в ряду - 6 залов, всего 6 рядов.
.org 20000
BeginLabyrint:
Hall00:         .word 11111, 11111, 111111
                .word 11111, 771, 0
                .word 0, 0, 77771
                .word 0, 0, 100000
                .word 77777, 100007, 22200
                .word 10000, 77777, 777
                .word 120022, 120002, 172724
                .word 127777, 2, 20022
                .word 22272, 122222, 2
                .word 42222, 100222, 20000
                .word 20000, 42002, 6400
                .word 20000, 22772, 42000
                .word 2240, 0, 2222
                .word 22200, 222, 0
                .word 0, 100, 0
                .word 0, 0, 100
                .word 0, 1111, 0
                .word 10, 11100, 111001
                .word 1, 10010, 111
                .word 0, 1111, 11110
                .word 0, 0, 111000
                .word Hall00pr
Hall01:         .word 11111, 11111, 111
                .word 100, 0, 0
                .word 11110, 100, 0
                .word 0, 10000, 111
                .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 52000, 155555, 20255
                .word 22222, 2000, 600
                .word 20, 200, 2000
                .word 3333, 20, 200
                .word 30000, 33003, 0
                .word 20, 0, 0
                .word 20000, 2222, 0
                .word 0, 20000, 2000
                .word 55554, 155555, 20055
                .word 222, 4, 0
                .word 0, 0, 4
                .word 100000, 60000, 0
                .word 0, 0, 111110
                .word 41111, 101111, 22220
                .word Hall01pr
Hall02:         .word 0, 0, 0
                .word 22220, 0, 0
                .word 0, 20, 0
                .word 0, 0, 42420
                .word 0, 0, 0
                .word 4242, 120000, 22222
                .word 142222, 104242, 120000
                .word 77777, 47777, 2242
                .word 72000, 177777, 47777
                .word 24, 142000, 22222
                .word 22222, 24, 42000
                .word 0, 0, 24
                .word 104200, 0, 0
                .word 42, 122220, 22222
                .word 22222, 55542, 25
                .word 0, 100000, 22042
                .word 2, 100000, 0
                .word 77204, 142247, 22222
                .word 20042, 77204, 42247
                .word 0, 120642, 22224
                .word 2222, 100000, 22222
                .word Hall02pr
Hall03:         .word 2222, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 100000, 20000, 155222
                .word 55555, 55555, 5555
                .word 20, 0, 0
                .word 0, 20, 0
                .word 0, 100000, 22220
                .word 22222, 122222, 222
                .word 77772, 77777, 77
                .word 122000, 177777, 174777
                .word 100007, 172200, 167777
                .word 77477, 100007, 22000
                .word 22222, 122422, 22222
                .word 2, 0, 400
                .word 0, 0, 0
                .word 40, 100000, 22220
                .word 22222, 122242, 22222
                .word Hall03pr
Hall04:         .word 0, 120000, 22222
                .word 22222, 0, 0
                .word 0, 0, 0
                .word 0, 0, 55550
                .word 0, 0, 0
                .word 5555, 0, 0
                .word 100400, 50000, 155555
                .word 55555, 55455, 5555
                .word 100000, 170000, 100007
                .word 100000, 100000, 100000
                .word 170007, 122000, 177222
                .word 227, 70077, 0
                .word 77220, 2277, 77770
                .word 0, 72270, 22777
                .word 100000, 100000, 122767
                .word 22777, 100000, 22200
                .word 22222, 127777, 22222
                .word 100002, 120000, 177772
                .word 77777, 100007, 0
                .word 77772, 177777, 22227
                .word 122222, 122222, 122222
                .word Hall04pr
Hall05:         .word 22222, 122222, 22222
                .word 22222, 0, 0
                .word 100000, 20000, 155555
                .word 154555, 55555, 120004
                .word 155555, 2555, 0
                .word 2000, 0, 2000
                .word 140600, 52000, 55555
                .word 200, 22224, 2000
                .word 40000, 200, 4
                .word 100220, 40000, 200
                .word 0, 222, 40000
                .word 40020, 20000, 22
                .word 4000, 140020, 22000
                .word 0, 4000, 40020
                .word 2220, 120000, 24222
                .word 104022, 100222, 122200
                .word 77477, 22227, 22
                .word 77770, 177477, 77777
                .word 155522, 177775, 172427
                .word 77777, 100222, 27770
                .word 22242, 77777, 2227
                .word Hall05pr
Hall10:         .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 170000, 177777, 177700
                .word 107770, 170000, 177777
                .word 177770, 107770, 102222
                .word 77007, 7700, 7700
                .word 70112, 77007, 7700
                .word 770, 70120, 77007
                .word 100770, 100770, 170100
                .word 777, 770, 770
                .word 77010, 7700, 770
                .word 77, 77010, 7700
                .word 77, 77, 77017
                .word 100770, 100077, 170077
                .word 177771, 170777, 100777
                .word 177777, 177771, 170077
                .word 70077, 77777, 1
                .word 0, 0, 100000
                .word Hall10pr
Hall11:         .word 11111, 41111, 1111
                .word 22222, 0, 40000
                .word 0, 22220, 0
                .word 4000, 0, 22200
                .word 0, 4000, 0
                .word 2200, 0, 4000
                .word 0, 122200, 22222
                .word 22422, 22222, 12222
                .word 0, 1410, 0
                .word 1100, 0, 1410
                .word 0, 1100, 60000
                .word 14141, 11111, 1141
                .word 11100, 14141, 100000
                .word 114, 77000, 14141
                .word 10000, 114, 177000
                .word 41414, 14111, 114
                .word 111110, 41414, 14101
                .word 11, 17700, 141414
                .word 141410, 11, 17700
                .word 14141, 41410, 11
                .word 41111, 14141, 141410
                .word Hall11pr
Hall12:         .word 22222, 2222, 0
                .word 22222, 22222, 222
                .word 0, 122220, 22222
                .word 2, 100000, 22200
                .word 77777, 0, 0
                .word 20000, 77777, 0
                .word 0, 120000, 22222
                .word 0, 20000, 112222
                .word 20002, 0, 20000
                .word 11000, 20642, 4
                .word 142000, 11000, 22242
                .word 1, 142000, 11222
                .word 40004, 1, 42000
                .word 11100, 11111, 1
                .word 4200, 1100, 0
                .word 0, 22200, 1122
                .word 0, 0, 22000
                .word 110, 0, 0
                .word 22000, 110, 0
                .word 0, 20000, 111112
                .word 11111, 122221, 22222
                .word Hall12pr
Hall13:         .word 22222, 122222, 22242
                .word 122222, 122222, 122222
                .word 4, 100000, 22222
                .word 77222, 4, 0
                .word 0, 77722, 4
                .word 100000, 6000, 22222
                .word 0, 120000, 22422
                .word 22000, 22222, 2222
                .word 240, 0, 0
                .word 0, 240, 0
                .word 0, 122000, 24222
                .word 22222, 22222, 222
                .word 2400, 0, 0
                .word 0, 2400, 0
                .word 0, 122200, 42255
                .word 22222, 22, 0
                .word 4000, 0, 0
                .word 0, 4000, 0
                .word 0, 100020, 11000
                .word 11, 100000, 22220
                .word 22112, 122112, 22222
                .word Hall13pr
Hall14:         .word 22222, 122222, 22222
                .word 72222, 0, 0
                .word 0, 72000, 0
                .word 0, 0, 72000
                .word 0, 0, 0
                .word 7200, 0, 0
                .word 100000, 22222, 22222
                .word 0, 100000, 7200
                .word 42004, 22222, 0
                .word 20720, 42064, 77772
                .word 0, 124720, 42224
                .word 107777, 20000, 24222
                .word 24000, 7777, 0
                .word 22472, 22222, 2222
                .word 0, 122272, 22222
                .word 202, 100000, 22072
                .word 22222, 100200, 22000
                .word 2, 0, 4240
                .word 20000, 7, 0
                .word 424, 120000, 22227
                .word 22222, 122424, 22222
                .word Hall14pr
Hall15:         .word 122777, 122242, 177777
                .word 100222, 177777, 177242
                .word 177777, 102227, 177777
                .word 100004, 100000, 122200
                .word 77777, 4, 0
                .word 22240, 72242, 4
                .word 100000, 72740, 77242
                .word 122222, 122222, 172742
                .word 47774, 0, 0
                .word 77274, 47774, 60000
                .word 0, 122274, 22422
                .word 22222, 22222, 222
                .word 240, 2200, 2000
                .word 22, 240, 22002
                .word 220, 22, 240
                .word 2220, 100220, 22222
                .word 20024, 102200, 220
                .word 0, 20024, 2200
                .word 22, 0, 24
                .word 100022, 20, 22220
                .word 22222, 122222, 22222
                .word Hall15pr
Hall20:         .word 0, 0, 0
                .word 10000, 2222, 0
                .word 0, 10000, 22002
                .word 0, 100000, 10000
                .word 22000, 77770, 77000
                .word 127700, 120060, 170077
                .word 107700, 127700, 122224
                .word 100007, 7700, 27700
                .word 70000, 7, 77000
                .word 42177, 70000, 777
                .word 7700, 142177, 22222
                .word 777, 7700, 41177
                .word 110000, 107700, 107000
                .word 4110, 10600, 7700
                .word 77700, 11110, 11111
                .word 770, 77700, 110
                .word 7700, 770, 7000
                .word 11, 77000, 77
                .word 700, 11, 0
                .word 0, 0, 111111
                .word 11111, 11111, 111111
                .word Hall20pr
Hall21:         .word 70001, 41111, 14141
                .word 14141, 70001, 141111
                .word 1414, 14041, 170001
                .word 14011, 11414, 111111
                .word 17000, 14001, 414
                .word 110000, 17000, 14000
                .word 41, 10000, 17000
                .word 1400, 11111, 11111
                .word 1700, 400, 0
                .word 1000, 1700, 400
                .word 0, 1000, 1700
                .word 55540, 55555, 1555
                .word 14170, 11111, 111111
                .word 101, 14170, 100000
                .word 0, 101, 14170
                .word 14006, 4, 101
                .word 11417, 14111, 111114
                .word 100010, 417, 14000
                .word 0, 10, 417
                .word 141400, 100000, 100010
                .word 11111, 11111, 111111
                .word Hall21pr
Hall22:         .word 11111, 11111, 111111
                .word 111111, 177111, 171177
                .word 77117, 11177, 111110
                .word 11177, 17711, 11111
                .word 0, 0, 0
                .word 1000, 0, 0
                .word 60, 11000, 111111
                .word 11141, 11111, 1111
                .word 0, 11140, 100001
                .word 111, 0, 11140
                .word 100000, 55111, 155555
                .word 114, 110, 110
                .word 0, 114, 111111
                .word 11, 0, 100114
                .word 111111, 11, 0
                .word 10011, 11111, 11
                .word 40000, 11, 100011
                .word 1, 40000, 111
                .word 11000, 1, 140000
                .word 111, 11100, 111111
                .word 14111, 11111, 111111
                .word Hall22pr
Hall23:         .word 11111, 11111, 111111
                .word 11111, 111311, 111131
                .word 13111, 111311, 103331
                .word 33033, 33303, 143330
                .word 30, 30003, 3004
                .word 114030, 0, 0
                .word 0, 14000, 111111
                .word 41111, 0, 114040
                .word 70000, 41017, 0
                .word 101114, 60000, 141117
                .word 55555, 71004, 110177
                .word 104001, 100000, 171004
                .word 100117, 34000, 3333
                .word 11111, 100177, 134110
                .word 40000, 71111, 1177
                .word 133410, 140003, 177111
                .word 77171, 30017, 140033
                .word 17711, 171177, 100017
                .word 104033, 177711, 177777
                .word 1, 14333, 111111
                .word 11111, 33301, 114333
                .word Hall23pr
Hall24:         .word 22222, 122222, 22424
                .word 122222, 11111, 11111
                .word 41, 0, 0
                .word 141000, 41, 100000
                .word 55555, 41225, 111141
                .word 1111, 0, 141000
                .word 4, 0, 0
                .word 14100, 4, 110000
                .word 11111, 14111, 111111
                .word 111, 10000, 4000
                .word 0, 0, 10000
                .word 400, 0, 111000
                .word 11111, 11411, 114111
                .word 100111, 100000, 171410
                .word 477, 100, 40000
                .word 77141, 477, 6100
                .word 4000, 11141, 411
                .word 101110, 104000, 177141
                .word 47, 10, 114100
                .word 77714, 47, 10
                .word 11411, 11114, 111111
                .word Hall24pr
Hall25:         .word 42222, 122222, 22222
                .word 122222, 141000, 177777
                .word 177777, 117777, 141000
                .word 77777, 77777, 117777
                .word 11111, 11114, 111111
                .word 1111, 0, 4
                .word 100000, 1000, 0
                .word 0, 0, 111000
                .word 11111, 11141, 111111
                .word 111, 0, 40
                .word 0, 100, 0
                .word 4, 0, 111100
                .word 11111, 11111, 111111
                .word 14, 0, 0
                .word 10000, 14, 0
                .word 0, 10000, 111014
                .word 111111, 11111, 14111
                .word 1, 0, 0
                .word 41410, 1, 0
                .word 6000, 41410, 111111
                .word 11111, 11111, 141411
                .word Hall25pr
Hall30:         .word 11111, 11111, 111111
                .word 11111, 1, 0
                .word 0, 0, 1
                .word 0, 0, 100000
                .word 0, 0, 0
                .word 10000, 0, 6000
                .word 0, 10000, 111400
                .word 11111, 11111, 11111
                .word 140, 0, 0
                .word 1000, 140, 0
                .word 0, 1000, 140
                .word 0, 0, 1000
                .word 11414, 11111, 111111
                .word 111, 414, 10000
                .word 0, 77100, 414
                .word 101000, 0, 77100
                .word 41, 41410, 111111
                .word 47711, 41, 141410
                .word 0, 47710, 41
                .word 14141, 0, 147710
                .word 11111, 14141, 111114
                .word Hall30pr
Hall31:         .word 70001, 11111, 111111
                .word 11111, 70000, 1
                .word 0, 0, 170000
                .word 0, 40, 0
                .word 117000, 55500, 155545
                .word 1000, 17000, 0
                .word 4, 11000, 11111
                .word 11140, 4111, 1000
                .word 0, 77140, 4177
                .word 100100, 100000, 77140
                .word 417, 100, 0
                .word 17414, 11411, 111
                .word 11100, 77414, 417
                .word 100010, 100000, 177414
                .word 100041, 10, 0
                .word 77141, 41, 111110
                .word 11111, 77141, 111141
                .word 1, 0, 177140
                .word 77714, 7, 0
                .word 14714, 77714, 111117
                .word 11111, 14111, 111114
                .word Hall31pr
Hall32:         .word 11111, 14111, 111111
                .word 11111, 0, 14100
                .word 0, 0, 0
                .word 1410, 0, 100000
                .word 11114, 1411, 141000
                .word 10000, 14, 1410
                .word 4000, 10000, 60014
                .word 100141, 4000, 10000
                .word 11141, 141, 111100
                .word 41111, 41, 141
                .word 10, 41000, 100041
                .word 14, 60010, 141000
                .word 10004, 14, 111110
                .word 14111, 10004, 14
                .word 100001, 14100, 10004
                .word 1, 1, 114100
                .word 41411, 1, 111141
                .word 77471, 41477, 100001
                .word 4, 77470, 141477
                .word 10000, 4, 111110
                .word 14111, 10000, 111111
                .word Hall32pr
Hall33:         .word 11111, 11111, 111101
                .word 111411, 177700, 177777
                .word 177777, 101417, 177700
                .word 77777, 76777, 417
                .word 11111, 11111, 111111
                .word 41, 0, 0
                .word 0, 40, 0
                .word 0, 0, 110040
                .word 11111, 11111, 111111
                .word 111, 0, 0
                .word 0, 0, 0
                .word 0, 0, 111000
                .word 11111, 11111, 111111
                .word 11, 0, 0
                .word 0, 0, 0
                .word 0, 0, 111100
                .word 11111, 11111, 111111
                .word 1, 0, 0
                .word 0, 0, 0
                .word 0, 0, 111110
                .word 11111, 11111, 111111
                .word Hall33pr
Hall34:         .word 1, 11411, 111114
                .word 111111, 0, 11410
                .word 0, 0, 0
                .word 41040, 0, 0
                .word 0, 11040, 111111
                .word 1111, 0, 40
                .word 10, 0, 0
                .word 4, 10, 110000
                .word 11111, 11111, 114014
                .word 100111, 0, 10000
                .word 401, 0, 0
                .word 41000, 401, 111000
                .word 111, 41000, 111401
                .word 11, 100, 141000
                .word 140, 0, 100
                .word 14100, 6140, 111100
                .word 14, 14100, 11140
                .word 10000, 14, 14100
                .word 14, 10600, 14
                .word 101410, 14, 11110
                .word 1, 11410, 111111
                .word Hall34pr
Hall35:         .word 11111, 11111, 111111
                .word 14141, 0, 0
                .word 71000, 14147, 0
                .word 0, 71000, 114147
                .word 111111, 111111, 171004
                .word 101414, 0, 10000
                .word 111100, 101411, 0
                .word 41000, 0, 111410
                .word 11111, 41111, 0
                .word 141, 0, 41001
                .word 0, 141, 100000
                .word 11100, 41111, 111141
                .word 14111, 0, 140000
                .word 14, 14140, 0
                .word 114000, 14, 14140
                .word 11111, 11111, 14
                .word 141414, 1, 10000
                .word 1, 41414, 1
                .word 41000, 1, 141414
                .word 100000, 41000, 11111
                .word 14141, 11114, 141141
                .word Hall35pr
Hall40:         .word 134773, 33333, 34343
                .word 33333, 134773, 100004
                .word 143434, 3, 34773
                .word 30600, 143434, 100003
                .word 43477, 133343, 143434
                .word 130000, 43477, 43
                .word 34343, 130000, 143477
                .word 140004, 134333, 130000
                .word 134347, 33333, 34003
                .word 73000, 4347, 0
                .word 40400, 73000, 4347
                .word 100000, 140400, 173000
                .word 33334, 133333, 133334
                .word 177333, 34, 0
                .word 3300, 77300, 34
                .word 140000, 4330, 77300
                .word 55543, 45555, 4033
                .word 47730, 100043, 130000
                .word 404, 47730, 343
                .word 3300, 100404, 147730
                .word 334, 133330, 133334
                .word Hall40pr
Hall41:         .word 133333, 33333, 34333
                .word 33333, 30000, 0
                .word 43430, 0, 30000
                .word 6, 33430, 55553
                .word 33000, 133333, 177434
                .word 100000, 433, 0
                .word 37743, 0, 430
                .word 40000, 37743, 3333
                .word 33333, 33333, 34333
                .word 0, 0, 0
                .word 400, 0, 0
                .word 0, 100400, 133000
                .word 33333, 133333, 133333
                .word 33, 30000, 0
                .word 0, 0, 30060
                .word 0, 100000, 130000
                .word 3333, 143330, 133333
                .word 77003, 3777, 40000
                .word 0, 77000, 3777
                .word 4000, 100000, 133330
                .word 33333, 134333, 133333
                .word Hall41pr
Hall42:         .word 33333, 134333, 130000
                .word 33333, 0, 34000
                .word 100000, 0, 155555
                .word 3455, 0, 0
                .word 0, 103400, 133000
                .word 3333, 0, 3400
                .word 300, 130000, 133333
                .word 333, 6300, 0
                .word 0, 0, 33300
                .word 300, 0, 0
                .word 30, 330, 0
                .word 0, 100030, 133033
                .word 33333, 133333, 134033
                .word 0, 0, 0
                .word 400, 0, 0
                .word 0, 100400, 133300
                .word 33333, 133333, 133433
                .word 100003, 177770, 177777
                .word 100043, 100000, 177770
                .word 77777, 100043, 133330
                .word 33333, 133333, 133343
                .word Hall42pr
Hall43:         .word 33333, 133333, 133333
                .word 33333, 0, 0
                .word 0, 0, 0
                .word 0, 100000, 100000
                .word 33333, 143333, 133333
                .word 3333, 0, 43000
                .word 0, 0, 0
                .word 4306, 100000, 130000
                .word 0, 4333, 0
                .word 30000, 177773, 133377
                .word 133333, 100333, 177733
                .word 37, 0, 0
                .word 133333, 55433, 155555
                .word 55, 0, 400
                .word 0, 0, 0
                .word 40, 100000, 133300
                .word 33333, 133333, 133333
                .word 3, 0, 0
                .word 0, 0, 0
                .word 0, 100000, 133330
                .word 33333, 133333, 133333
                .word Hall43pr
Hall44:         .word 43333, 100003, 133430
                .word 33333, 40000, 3
                .word 33343, 133333, 140000
                .word 0, 100043, 100000
                .word 33333, 0, 43
                .word 0, 100000, 100000
                .word 33333, 3333, 0
                .word 0, 0, 0
                .word 0, 0, 600
                .word 33000, 133333, 133333
                .word 33333, 333, 0
                .word 100000, 3, 155000
                .word 55555, 43555, 3
                .word 0, 100000, 143000
                .word 33340, 33, 0
                .word 34300, 100340, 133300
                .word 33333, 34333, 340
                .word 0, 0, 34300
                .word 34, 0, 0
                .word 3430, 100034, 133330
                .word 33333, 133434, 133434
                .word Hall44pr
Hall45:         .word 43333, 134343, 133334
                .word 134334, 43333, 34343
                .word 77773, 134374, 140000
                .word 43404, 33343, 34333
                .word 34000, 43404, 343
                .word 33400, 133333, 143333
                .word 34, 3400, 0
                .word 34000, 55404, 3455
                .word 0, 34000, 404
                .word 33340, 133333, 133333
                .word 33333, 343, 0
                .word 0, 30000, 343
                .word 0, 0, 33006
                .word 33334, 133333, 133333
                .word 333, 34, 0
                .word 0, 33, 34
                .word 100000, 30000, 3
                .word 55503, 3555, 33000
                .word 140000, 177003, 3777
                .word 330, 143000, 133333
                .word 33333, 100033, 143300
                .word Hall45pr
Hall50:         .word 134773, 334, 33330
                .word 33333, 134773, 100034
                .word 140403, 0, 34773
                .word 33000, 140400, 130000
                .word 43477, 3300, 400
                .word 33300, 43477, 33330
                .word 40, 130330, 143477
                .word 133743, 100040, 130033
                .word 34347, 137740, 134043
                .word 73000, 134347, 176740
                .word 3403, 73000, 34347
                .word 133334, 133433, 173333
                .word 434, 4, 400
                .word 77300, 434, 4
                .word 40, 177300, 133334
                .word 133333, 33333, 77333
                .word 0, 0, 0
                .word 47730, 0, 0
                .word 0, 47730, 0
                .word 0, 100000, 133330
                .word 33333, 133333, 133333
                .word Hall50pr
Hall51:         .word 33333, 133333, 134333
                .word 33333, 77330, 7
                .word 100400, 100000, 177733
                .word 7, 100400, 100000
                .word 77777, 133077, 133433
                .word 3333, 133777, 133333
                .word 343, 130000, 133333
                .word 33333, 60343, 0
                .word 0, 100000, 133340
                .word 333, 0, 0
                .word 34, 133000, 133333
                .word 33333, 55034, 555
                .word 0, 0, 34
                .word 100000, 0, 0
                .word 3, 133300, 133333
                .word 33333, 33333, 33
                .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 0, 0
                .word 0, 100000, 133330
                .word 33333, 133333, 133333
                .word Hall51pr
Hall52:         .word 33333, 133333, 133333
                .word 33334, 100000, 130430
                .word 37777, 34, 0
                .word 30043, 177773, 100034
                .word 143333, 43, 77733
                .word 63, 40000, 6043
                .word 47733, 100333, 140000
                .word 33334, 147333, 130003
                .word 33333, 100004, 143300
                .word 3, 0, 4
                .word 104000, 55033, 55555
                .word 55555, 4335, 330
                .word 40000, 0, 4033
                .word 30, 140000, 130000
                .word 400, 33330, 43333
                .word 3300, 400, 30
                .word 4000, 100330, 133400
                .word 3, 4000, 33
                .word 40, 100000, 134000
                .word 0, 100040, 133330
                .word 33333, 133333, 133333
                .word Hall52pr
Hall53:         .word 33333, 133333, 133333
                .word 33333, 0, 0
                .word 0, 30000, 0
                .word 0, 0, 30000
                .word 0, 0, 0
                .word 3000, 133400, 133333
                .word 33333, 3433, 3400
                .word 0, 0, 3430
                .word 340, 0, 0
                .word 43, 60340, 0
                .word 0, 103043, 133340
                .word 133333, 143333, 173333
                .word 100004, 100000, 143000
                .word 77377, 4, 0
                .word 74300, 77377, 4
                .word 0, 134306, 133333
                .word 33333, 33333, 34333
                .word 0, 0, 0
                .word 3400, 0, 0
                .word 0, 103400, 133330
                .word 33333, 133333, 133333
                .word Hall53pr
Hall54:         .word 133333, 33333, 33434
                .word 133343, 3, 0
                .word 40343, 43, 3
                .word 40000, 140343, 100043
                .word 33334, 143333, 140043
                .word 33333, 100034, 140000
                .word 34004, 30000, 34
                .word 134000, 33333, 0
                .word 130003, 4003, 100000
                .word 40555, 63, 4033
                .word 0, 33000, 333
                .word 133433, 133333, 177333
                .word 37, 3430, 0
                .word 77700, 37, 3433
                .word 0, 133300, 130033
                .word 340, 0, 0
                .word 3300, 340, 0
                .word 0, 0, 40
                .word 0, 0, 0
                .word 4, 100000, 133330
                .word 33333, 133333, 133333
                .word Hall54pr
Hall55:         .word 33333, 33333, 33
                .word 34330, 0, 0
                .word 0, 34000, 0
                .word 0, 100000, 134000
                .word 33333, 133333, 133333
                .word 3333, 300, 0
                .word 100000, 103000, 170306
                .word 100777, 77, 53770
                .word 77733, 7700, 77
                .word 140377, 177703, 107000
                .word 7707, 33377, 77703
                .word 70000, 7707, 30377
                .word 177700, 170077, 107707
                .word 103037, 100000, 170777
                .word 170770, 103037, 100070
                .word 77077, 70770, 3037
                .word 170077, 177077, 177777
                .word 100303, 177770, 170007
                .word 7700, 3, 0
                .word 0, 100000, 133333
                .word 33333, 133333, 133333
                .word Hall55pr
; Рабочий массив объектов взаимодействия
; это описатели лифтов и содержимого ящиков с оружием
; признак ящика с оружием - бит 15 первого слова
ArrDst:         .blkw   240
ArrOffs = ArrSrc - ArrDst
Hall00pr = Hall00prSrc - ArrOffs
Hall01pr = Hall01prSrc - ArrOffs
Hall02pr = Hall02prSrc - ArrOffs
Hall03pr = Hall03prSrc - ArrOffs
Hall04pr = Hall04prSrc - ArrOffs
Hall05pr = Hall05prSrc - ArrOffs
Hall10pr = Hall10prSrc - ArrOffs
Hall11pr = Hall11prSrc - ArrOffs
Hall12pr = Hall12prSrc - ArrOffs
Hall13pr = Hall13prSrc - ArrOffs
Hall14pr = Hall14prSrc - ArrOffs
Hall15pr = Hall15prSrc - ArrOffs
Hall20pr = Hall20prSrc - ArrOffs
Hall21pr = Hall21prSrc - ArrOffs
Hall22pr = Hall22prSrc - ArrOffs
Hall23pr = Hall23prSrc - ArrOffs
Hall24pr = Hall24prSrc - ArrOffs
Hall25pr = Hall25prSrc - ArrOffs
Hall30pr = Hall30prSrc - ArrOffs
Hall31pr = Hall31prSrc - ArrOffs
Hall32pr = Hall32prSrc - ArrOffs
Hall33pr = Hall33prSrc - ArrOffs
Hall34pr = Hall34prSrc - ArrOffs
Hall35pr = Hall35prSrc - ArrOffs
Hall40pr = Hall40prSrc - ArrOffs
Hall41pr = Hall41prSrc - ArrOffs
Hall42pr = Hall42prSrc - ArrOffs
Hall43pr = Hall43prSrc - ArrOffs
Hall44pr = Hall44prSrc - ArrOffs
Hall45pr = Hall45prSrc - ArrOffs
Hall50pr = Hall50prSrc - ArrOffs
Hall51pr = Hall51prSrc - ArrOffs
Hall52pr = Hall52prSrc - ArrOffs
Hall53pr = Hall53prSrc - ArrOffs
Hall54pr = Hall54prSrc - ArrOffs
Hall55pr = Hall55prSrc - ArrOffs
        
; массив-источник, размером 240 слов
; это описатели лифтов и содержимого ящиков с оружием
; признак ящика с оружием - бит 15 первого слова
; сперва всегда идут описатели лифтов, потом - ящик с оружием.
; для лифта - 5 слов
; для ящика с оружием только одно слово.
; парамеры лифта:
; .word счётчик?
; .word текущий адрес, 0 - не отображать
; .word смещение направления движения
; .word конечный адрес
; .word начальный адрес

ArrSrc:
Hall00prSrc:    .word 155123
Hall01prSrc:    .word 127654
Hall02prSrc:    .word 152, 0, -200, 76043, 77243
                .word 112345
Hall03prSrc:    .word 123472
Hall04prSrc:    .word 123416
Hall05prSrc:    .word 134522
Hall10prSrc:    .word 22, 0, -200, 55044, 77244
                .word 123456
Hall11prSrc:    .word 65, 0, -200, 61003, 77203
                .word 65, 0, 200, 77207, 61007
                .word 117654
Hall12prSrc:    .word 0, 0, -200, 44043, 75443
                .word 134552
Hall13prSrc:    .word 126447
Hall14prSrc:    .word 145237
Hall15prSrc:    .word 177777
Hall20prSrc:    .word 23, 46444, -200, 44444, 75644
                .word 176543
Hall21prSrc:    .word 66, 60603, -200, 44403, 77203
                .word 66, 65007, 200, 77207, 46407
                .word 123574
Hall22prSrc:    .word 124533
Hall23prSrc:    .word 136472
Hall24prSrc:    .word 123475
Hall25prSrc:    .word 123465
Hall30prSrc:    .word 167432
Hall31prSrc:    .word 5, 0, -200, 44403, 54003
                .word 5, 0, 200, 54007, 46407
                .word 167234
Hall32prSrc:    .word 0, 0, -200, 54040, 77240
                .word 0, 0, 200, 77244, 54044
                .word 134567
Hall33prSrc:    .word 167744
Hall34prSrc:    .word 0, 0, -200, 62426, 77226
                .word 0, 0, 200, 77232, 62432
                .word 165237
Hall35prSrc:    .word 121765
Hall40prSrc:    .word 134256
Hall41prSrc:    .word 137645
Hall42prSrc:    .word 0, 0, -200, 44440, 63240
                .word 0, 0, 200, 63244, 46444
                .word 112777
Hall43prSrc:    .word 133455
Hall44prSrc:    .word 0, 0, -200, 44426, 57626
                .word 0, 0, 200, 57632, 46432
                .word 176543
Hall45prSrc:    .word 136627
Hall50prSrc:    .word 126753
Hall51prSrc:    .word 123645
Hall52prSrc:    .word 155557
Hall53prSrc:    .word 176543
Hall54prSrc:    .word 166327
Hall55prSrc:    .word 121764
                .blkw 42

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


ClrDHelper:     mov     4(SP), R5
                inc     R5
                asr     R5

1$:             mov     #4, R4

2$:             movb    R0, (R1)
                movb    R0, (R3)
                add     #100, R1
                add     #100, R3
                sob     R4, 2$
                add     R2, R1
                add     R2, R3
                sob     R5, 1$
                return
; End of function ClrDHelper


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

; очистка экрана крест-накрест по диагонали

ClrScrDiagon:   mov     #40000, -(SP)
                mov     #40077, -(SP)
                mov     #60040, -(SP)
                mov     #60037, -(SP)
                mov     #77, -(SP)

1$:             mov     #2, R3
                mov     #252, R0

2$:             mov     #-1, R2
                mov     R3, -(SP)
                mov     4(SP), R3
                mov     10(SP), R1
                call    ClrDHelper
                mov     6(SP), R3
                mov     12(SP), R1
                neg     R2
                call    ClrDHelper
                tst     R0
                beq     3$
                mov     #6000, R3
                sob     R3, .

3$:             mov     (SP)+, R3
                clr     R0
                sob     R3, 2$
                inc     10(SP)
                add     #400, 6(SP)
                dec     4(SP)
                sub     #400, 2(SP)
                bit     #1, (SP)
                beq     4$
                add     #401, 4(SP)
                add     #377, 2(SP)

4$:             dec     (SP)
                bne     1$
                add     #12, SP
                return
; End of function ClrScrDiagon


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

; Очистка экрана полосками

ClrScr2:        mov     #42073, R1
                mov     #71, R5
                mov     #310, <ClrScrIndex+2>

1$:             mov     #225, R0
                call    ClrLHelper

                sub     #34000, R1
                mov     #6000, R4
                sob     R4, .
                clr     R0
                call    ClrLHelper
                add     #2, <ClrScrIndex+2>
                sub     #34001, R1
                sob     R5, 1$
                return
; End of function ClrScr2


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


ClrLHelper:     mov     #34, R4

CL.1$:          mov     #4, R3

CL.2$:          movb    R0, (R1)
ClrScrIndex:    movb    R0, 472(R1)
                add     #100, R1
                sob     R3, CL.2$
                add     #400, R1
                sob     R4, CL.1$
                return
; End of function ClrLHelper


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

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

Putch:          mov     R0, -(SP)
                mov     R1, -(SP)
                mov     R2, -(SP)
                mov     R3, -(SP)
                mov     R4, -(SP)
                mov     R5, -(SP)
                mov     R2, CH.Scale$
                bic     #177400, R0
                tstb    R0
                bpl     111$
                sub     #40, R0
111$:           asl     R0
                mov     R0, R3
                asl     R0
                asl     R0
                add     R3, R0
                add     #FONT-500, R0
                mov     #12, R5

Pu.1$:          movb    (R0)+, R4
                mov     #4, R2

Pu.2$:          mov     #2, R3

Pu.3$:          clc
                rorb    (R1)
                asrb    (R1)
                asrb    (R1)
                asrb    (R1)
                ror     R4
                bcc     4$
                bisb    (PC)+, (R1)
CH.Color$:      .word 363

4$:             sob     R3, Pu.3$
                inc     R1
                sob     R2, Pu.2$
                mov     (PC)+, R2
CH.Scale$:      .word 0

5$:             dec     R2
                beq     7$
                mov     #4, R4
                mov     R1, R3
                add     #100, R3

6$:             movb    -(R1), -(R3)
                sob     R4, 6$
                add     #104, R1
                br      5$
; ───────────────────────────────────────────────────────────────────────────

7$:             add     #74, R1
                sob     R5, Pu.1$
                mov     (SP)+, R5
                mov     (SP)+, R4
                mov     (SP)+, R3
                mov     (SP)+, R2
                mov     (SP)+, R1
                mov     (SP)+, R0
                return
; End of function Putch


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

; Вход: R1 - адрес экрана
;       R3 - адрес текста
;       R5 - финальный масштаб по высоте

DrawText:       clr     R2
                mov     R1, -(SP)
                movb    (R3)+, R0
                beq     3$

1$:             inc     R2
                call    Putch           ; Вывод символа на экран
                                        ; Вход: R0 - код символа
                                        ;       R1 - адрес экрана
                                        ;       R2 - масштаб по высоте
                mov     R3, -(SP)
                mov     R0, -(SP)
                mov     R2, R0
                inc     R0
                mov     #100, R4

2$:             call    SoundEffect1    ; Двойной звуковой щелчок
                                        ; Вход: R4 - тон второго щелчка
                add     #40, R4
                sob     R0, 2$
                mov     (SP)+, R0
                mov     #1001, R3
                sob     R3, .
                mov     (SP)+, R3
                sub     #500, R1
                cmp     R2, R5
                bne     1$
                mov     (SP)+, R1
                add     #4, R1
                br      DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
; ───────────────────────────────────────────────────────────────────────────

3$:             mov     (SP)+, R1
                return
; End of function DrawText


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

; Анимация лопанья шарика со звуком

BubbleBlow:     mov     BubbleScrAddr, R1 ; адрес экрана шарика

BubbleBlow2:    mov     R1, -(SP)       ; сохраним
                mov     #sprBuffer.h, R4 ; пузырёк с экрана удалим
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (SP)+, R1       ; адрес восстановим
                inc     R1
                mov     R1, BurstAnimTbl
                clr     BurstAnimTbl+2

1$:             mov     #30000, R0
                sob     R0, .
                call    SecretFunc$
                tst     BurstAnimTbl ; анимация ещё не закончилась?
                bne     1$              ; да - продолжаем
                mov     #12, R4

2$:             call    SoundEffect1    ; Двойной звуковой щелчок
                                        ; Вход: R4 - тон второго щелчка
                sob     R4, 2$
                return
; End of function BubbleBlow





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

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

AnimSplashTxt:  mov     R2, CH.Color$
                mov     R5, -(SP)
                mov     R3, -(SP)
                mov     R1, -(SP)
                mov     R0, BubbleScrAddr

1$:             mov     R4, -(SP)
                call    BubbleAnim      ; Обработка движения шарика и глаза
                mov     #10000, R4
                sob     R4, .
                mov     (SP)+, R4
                sob     R4, 1$
                call    BubbleBlow      ; Анимация лопанья шарика со звуком
                mov     (SP)+, R1
                mov     (SP)+, R3
                mov     (SP)+, R5
                jmp     DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
; End of function AnimSplashTxt
; ───────────────────────────────────────────────────────────────────────────


; тут вывод "БОРТНИК БОРИС" побуквенно
BBBEffect:      mov     R2, CH.Color$
                mov     R3, -(SP)
                mov     R5, -(SP)
                mov     R1, -(SP)

3$:             mov     4(SP), R0
                mov     #LetterBuffer, R3
                movb    (R0), R2
                beq     5$
                cmpb    #20, R2
                beq     4$
                movb    R2, (R3)
                call    BubbleBlow2
                mov     #LetterBuffer, R3
                mov     (SP), R1
                mov     2(SP), R5
                call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте

4$:             add     #4, (SP)
                inc     4(SP)
                mov     (SP), R1
                br      3$
; ───────────────────────────────────────────────────────────────────────────

5$:             mov     (SP)+, R1
                mov     (SP)+, R5
                mov     (SP)+, R3
                return


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


DrawCharW:      mov     R1, -(SP)
                mov     R3, -(SP)
                bic     #177400, R0
                tstb    R0
                bpl     111$
                sub     #40, R0
111$:           asl     R0
                mov     R0, R3
                asl     R0
                asl     R0
                add     R3, R0
                add     #FONT-500, R0
                mov     R2, 0ScaleY$
                mov     #12, R5

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

2$:             clr     (R1)
                ror     R4
                bcc     3$
                bis     #175372, (R1)

3$:             add     #2, R1
                sob     R3, 2$
                mov     (PC)+, R4
0ScaleY$:       .word 0

4$:             mov     #6, R3

5$:             mov     -(R1), 100(R1)
                sob     R3, 5$
                add     #114, R1
                sob     R4, 4$
                add     #64, R1
                sob     R5, 1$
                mov     (SP)+, R3
                mov     (SP)+, R1
                return
; End of function DrawCharW


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

; проверка на паузу

sub_34164:      bit     @#177716, #100
                bne     2$

1$:             cmp     @#177662, #3     ; КТ - пауза
                bne     2$
                tst     @#177714
                beq     1$

2$:             ;jmp     BubbleAnim      ; Обработка движения шарика и глаза
; End of function sub_34164


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

; Обработка движения шарика и глаза

BubbleAnim:     mov     #BubbleOffsetV, R5 ; адрес структуры данных
                mov     2(R5), R1       ; адрес экрана есть?
                beq     11$             ; нету
                tstb    (R5)            ; куда направление движения?
                bmi     4$              ; вверх
                                        ; вниз
                cmp     #75600, R1      ; нижний предел достигнут?
                bpl     2$              ; нет
                                        ; да

1$:             call    SndClick        ; Звуковой щелчок
                negb    (R5)            ; зеркалим направление движения по вертикали
                br      5$
; ───────────────────────────────────────────────────────────────────────────

2$:             add     #1600, R1       ; будущий адрес экрана

3$:             mov     #3, R2          ; ширина проверки
                mov     R2, CurrOffsetV ; текущее смещение движения по вертикали
                call    ChkObstacleVert ; Проверка на наличие препятствия при движении по вертикали
                                        ; Вход: R1 - адрес экрана, где ожидается препятствие
                                        ;       R2 - ширина проверки
                                        ; Выход: если есть препятствие, сброс смещения по горизонтали
                tst     CurrOffsetV     ; текущее смещение движения по вертикали
                beq     1$              ; есть по адресу препятствие
                br      5$
; ───────────────────────────────────────────────────────────────────────────

4$:             cmp     #44000, R1      ; верхний предел достигнут?
                bpl     1$              ; да
                sub     #200, R1        ; нет, будущий адрес экрана
                br      3$              ; проверим на препятствия
; ───────────────────────────────────────────────────────────────────────────

5$:             mov     2(R5), R1       ; адрес экрана
                add     #100, R1
                tstb    1(R5)           ; куда движемся по горизонтали?
                bmi     9$              ; влево
                                        ; вправо
                add     #4, R1          ; правого края экрана достигли?
                bit     #77, R1
                bne     7$              ; нет

6$:             negb    1(R5)           ; да - зеркалим направление движения по горизонтали
                call    SndClick        ; Звуковой щелчок
                br      10$
; ───────────────────────────────────────────────────────────────────────────

7$:             sub     #1, R1

8$:             mov     #14, R0
                mov     R0, CurrOffsetH ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                call    ChkObstacleHor  ; Проверка на наличие препятствия при движении по горизонтали
                                        ; Вход: R1 - адрес экрана, где ожидается препятствие
                                        ;       R0 - высота объекта в строках экрана
                                        ; Выход: если есть препятствие, сброс смещения по горизонтали
                tst     CurrOffsetH     ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                beq     6$              ; есть по адресу препятствие
                br      10$
; ───────────────────────────────────────────────────────────────────────────

9$:             bit     #77, R1         ; левого края экрана достигли?
                beq     6$              ; да - идём зеркалить
                dec     R1              ; нет, пойдём проверять на препятствия
                br      8$
; ───────────────────────────────────────────────────────────────────────────

10$:            mov     2(R5), R1       ; адрес экрана
                movb    1(R5), R0       ; горизонтальное смещение
                add     R0, 2(R5)       ; прибавим
                movb    (R5), R0        ; вертикальное смещение
                add     R0, 2(R5)       ; прибавим
                add     R0, 2(R5)
                mov     #sprBuffer.h, R4 ; удаляем спрайт по старому адресу
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     2(R5), R1       ; новый адрес экрана
                mov     #sprBuffer.h, R4
                mov     #sprBubble, R0
                call    DrawSpriteM     ; Вывод на экран спрайта, с заполнением буфера маской, чтобы потом стереть
                                        ; Вход: R0 - адрес спрайта
                                        ;       R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом

11$:            ;br      12$
; ───────────────────────────────────────────────────────────────────────────

12$:            com     #-1             ; выполняем через раз
                beq     13$
                return
; ───────────────────────────────────────────────────────────────────────────

13$:            ;jmp     AnimEye        ; Анимация глаза
; End of function BubbleAnim


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

; Анимация глаза

AnimEye:        mov     #EyeStruct, R5  ; адрес структуры
                mov     (R5)+, R1       ; берём адрес экрана
                beq     3$              ; 0 - нечего делать
                mov     #SprEyeBuf, R4  ; буфер экрана под спрайтом
                mov     (R5), R0        ; адрес спрайта

MorphAdd$:      sub     #SprEyeSize, R0
                cmp     #SpriteEye3, R0 ; досюда дошли?
                bne     1$              ; нет
                mov     (PC)+, @(PC)+   ; да - пойдём в обратную сторону
                        sub (PC)+, R0   ; 162700
                        .word MorphAdd$

1$:             cmp     #SpriteEye1, R0 ; а досюда дошли?
                bne     2$              ; нет
                mov     (PC)+, @(PC)+   ; да - пойдём в обратную сторону
                        add (PC)+, R0   ; 62700
                        .word MorphAdd$

2$:             mov     R0, (R5)+       ; новый адрес спрайта
                mov     R1, -(SP)       ; стираем старый спрайт
                mov     R4, -(SP)
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (SP)+, R4       ; рисуем новый
                mov     (SP)+, R1
                call    DrawSpriteM     ; Вывод на экран спрайта, с заполнением буфера маской, чтобы потом стереть
                                        ; Вход: R0 - адрес спрайта
                                        ;       R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом

3$:             return
; End of function AnimEye


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

; обработка и анимация головы в машинке

HeadCarAnim:    mov     #HeadCarScruct, R5
                mov     (R5)+, R1
                beq     11$
                mov     R5, CurrOffsetH ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                mov     R1, -(SP)
                mov     (R5), R4
                bpl     3$
                tstb    3000(R1)
                beq     1$
                dec     R1
                mov     #16, R0
                call    ChkObstacleHor  ; Проверка на наличие препятствия при движении по горизонтали
                                        ; Вход: R1 - адрес экрана, где ожидается препятствие
                                        ;       R0 - высота объекта в строках экрана
                                        ; Выход: если есть препятствие, сброс смещения по горизонтали
                tst     CurrOffsetH     ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                beq     1$
                bic     #177700, R1
                bne     2$

1$:             neg     R4

2$:             mov     R4, (R5)+
                br      4$
; ───────────────────────────────────────────────────────────────────────────

3$:             tstb    3004(R1)
                beq     1$
                mov     (SP), R1
                mov     #24, R0
                add     #5, R1
                call    ChkObstacleHor  ; Проверка на наличие препятствия при движении по горизонтали
                                        ; Вход: R1 - адрес экрана, где ожидается препятствие
                                        ;       R0 - высота объекта в строках экрана
                                        ; Выход: если есть препятствие, сброс смещения по горизонтали
                tst     CurrOffsetH     ; текущее смещение движения по горизонтали
                                        ; а так же многофункциональная переменная
                beq     1$
                bic     #177700, R1
                add     #5, R1
                beq     1$
                br      2$
; ───────────────────────────────────────────────────────────────────────────

4$:             mov     (SP), R1
                mov     (R5), R0
                cmp     #SprHeadCarLt1, R0
                bne     5$
                inc     R1

5$:             tst     R4
                bpl     7$
                cmp     #SprHeadCarLt2, R0
                beq     6$
                mov     #SprHeadCarLt2, R0
                br      9$
; ───────────────────────────────────────────────────────────────────────────

6$:             mov     #SprHeadCarLt1, R0
                br      9$
; ───────────────────────────────────────────────────────────────────────────

7$:             cmp     #SprHeadCarRt2, R0
                bne     8$
                mov     #SprHeadCarRt1, R0
                br      9$
; ───────────────────────────────────────────────────────────────────────────

8$:             mov     #SprHeadCarRt2, R0

9$:             add     R4, (SP)
                mov     R0, (R5)+
                mov     #SprHdCarBuf, R4
                mov     R4, -(SP)
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     2(R0), SprHdCarBuf+2
                mov     (SP)+, R4
                mov     (SP), R1
                cmp     #SprHeadCarLt1, R0
                bne     10$
                inc     R1

10$:            call    DrawSpriteM     ; Вывод на экран спрайта, с заполнением буфера маской, чтобы потом стереть
                                        ; Вход: R0 - адрес спрайта
                                        ;       R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (SP)+, -6(R5)

11$:            return
; End of function HeadCarAnim


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

; Вход: R0 - номер текущего пункта меню

SelectMenu:     mov     R0, -(SP)
                mov     BubbleScrAddr, R1
                mov     #sprBuffer.h, R4
                call    ClearSpriteM    ; Удаление спрайта с экрана по маске
                                        ; Вход: R1 - адрес экрана
                                        ;       R4 - адрес буфера хранения данных экрана под спрайтом
                mov     (SP), R0        ; номер пункта меню
                asl     R0
                mov     <menuAddr-2>(R0), R1 ; адрес меню
                bic     #77, R1
                sub     #465, R1        ; выделяем
                mov     #22, R2

1$:             mov     #51, R3

2$:             comb    (R1)+
                sob     R3, 2$
                add     #27, R1
                sob     R2, 1$
                mov     #12, R4

3$:             call    SoundEffect1    ; Двойной звуковой щелчок
                                        ; Вход: R4 - тон второго щелчка
                sob     R4, 3$
                mov     (SP)+, R0
                return
; End of function SelectMenu


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

; Звуковой эффект при нажатии ВВОД и т.п.

TapSoundEff:    mov     #37, R2
                mov     #600, R4

1$:             call    SoundEffect1    ; Двойной звуковой щелчок
                                        ; Вход: R4 - тон второго щелчка
                sub     #10, R4
                sob     R2, 1$
                return
; End of function TapSoundEff


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

; Ждать нажатия новой клавиши или джойстика.
; Выход: R0 - маска битов джойстика
;        R1 - код нажатой клавиши

PressAnyKey:    bit     #100, @#177716  ; ждём, пока отпустят клавишу
                beq     PressAnyKey     ; Ждать нажатия новой клавиши или джойстика.
                                        ; Выход: R0 - маска битов джойстика
                                        ;        R1 - код нажатой клавиши

1$:             tst     @#177714        ; или отожмут джойстик
                bne     1$

2$:             mov     @#177714, R0    ; потом ждём нажатия новой клавиши или джойстика
                bit     #100, @#177716
                beq     3$
                tst     R0
                beq     2$

3$:             mov     R0, -(SP)
                mov     @#177662, -(SP)
                call    TapSoundEff     ; Звуковой эффект при нажатии ВВОД и т.п.
                mov     (SP)+, R1
                mov     (SP)+, R0
                return
; End of function PressAnyKey

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

DrawMenu:       mov     #363, CH.Color$
                mov     #2, R5
                mov     #strMenu, R3
                mov     #10, R2

1$:             mov     <menuAddr-2>(R2), R1
                dec     R2
                mov     R2, -(SP)
                call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
                mov     (SP)+, R2
                sob     R2, 1$
                mov     #4, R0          ; номер текущего пункта меню, 4 - первый, 1 - последний
; ───────────────────────────────────────────────────────────────────────────
                mov     #70070, BubbleScrAddr
                clr     EyeStruct
                call    SelectMenu      ; Вход: R0 - номер текущего пункта меню
                mov     #TopStack, SP
                mov     #1, R5          ; задержка автоповтора

2$:             mov     #2000, R1

3$:             tst     @#177714        ; джойстик нажат?
                bne     KeyEnter$       ; да - аналог клавиши ВВОД
                tst     R5
                beq     4$
                dec     R5
                bne     5$

4$:             inc     R5

5$:             bit     #100, @#177716  ; клавиша нажата?
                beq     0PressKey$      ; да
                clr     R5

6$:             sob     R1, 3$

7$:             mov     R0, -(SP)
                mov     R5, -(SP)
                call    BubbleAnim      ; Обработка движения шарика и глаза
                mov     (SP)+, R5
                mov     (SP)+, R0
                br      2$
; ───────────────────────────────────────────────────────────────────────────

0PressKey$:     dec     R5
                bne     6$
                mov     @#177662, R2    ; какая клавиша нажата?
                cmp     #12, R2         ; ввод?
                beq     KeyEnter$       ; да
                cmp     #33, R2         ; стрелка вниз?
                bne     12$             ; нет
                cmp     #1, R0          ; да, а мы на последнем пункте?
                bne     10$             ; нет ещё, можно вниз

9$:             sub     #1, R1          ; отбираем один цикл у SOB
                bmi     7$              ; с проверкой, чтоб через 0 не перейти
                br      6$
; ───────────────────────────────────────────────────────────────────────────

10$:            mov     R1, -(SP)
                call    SelectMenu      ; Вход: R0 - номер текущего пункта меню
                dec     R0              ;  переходим к следующему пункту

11$:            mov     #1, sprBuffer.h ; шарик может попасть на меню, поэтому корректируем
                mov     #1, sprBuffer.w
                clr     sprBuffer.data
                call    SelectMenu      ; Вход: R0 - номер текущего пункта меню
                mov     (SP)+, R1
                mov     #12000, R5      ; ставим задержку автоповтора
                br      9$
; ───────────────────────────────────────────────────────────────────────────

12$:            cmp     #32, R2         ; стрелка вверх?
                bne     9$              ; нет
                cmp     #4, R0          ; да, а мы уже на верхнем пункте?
                beq     9$              ; да
                mov     R1, -(SP)
                call    SelectMenu      ; Вход: R0 - номер текущего пункта меню
                inc     R0              ; переходим к предыдущему пункту
                br      11$
; ───────────────────────────────────────────────────────────────────────────

KeyEnter$:      call    TapSoundEff
                dec     R0              ;  что выбрали?
                bne     1$              ; не последний пункт
                call    @#100140        ; ВЫХОД
                halt
; ───────────────────────────────────────────────────────────────────────────

1$:             mov     R0, -(SP)
                call    ClrScr2         ; Очистка экрана полосками
                dec     (SP)            ; что выбрали?
                bne     2.5$            ; не информацию
                ; Вывод информации
                mov     #6, R5
                mov     #46016, R1
                mov     #strInformation, R3
                mov     #325, CH.Color$
                call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
                mov     #220, CH.Color$
                mov     #2, R5
                mov     #strInfoData, R3
                mov     #10, R2

2$:             mov     <InfoAddr-2>(R2), R1
                dec     R2
                mov     R2, -(SP)
                call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
                mov     (SP)+, R2
                sob     R2, 2$
                call    PressAnyKey
                jmp     SkipSplash

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

2.5$:           dec     (SP)            ; что выбрали?
                beq     3$              ; управление
                jmp     StartGame       ; игру
; ───────────────────────────────────────────────────────────────────────────
; Задание управления

3$:             mov     #325, CH.Color$
                mov     #46014, R1
                mov     #strControl, R3
                mov     #6, R5
                call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
                mov     (PC)+, @(PC)+   ; предполагаем джойстик
                        bne . + <SetNewControl - MorphBNE$>
                        .word MorphBNE$
                mov     #menuCtrls, R3
                call    DrawControlsItem ; Вывод элемента управления на экран
                                        ; Вход: R3 - адрес текста
                mov     R3, -(SP)       ; адрес текста
                mov     #6, -(SP)       ; количество пунктов
                mov     #JoyTbl, -(SP)  ; таблица значений
                call    PressAnyKey     ; Ждать нажатия новой клавиши или джойстика.
                                        ; Выход: R0 - маска битов джойстика
                                        ;        R1 - код нажатой клавиши
                tst     R0              ; джойстик нажали?
                bne     4$              ; да
                mov     (PC)+, @(PC)+   ; нет - значит будем обрабатывать клавиатуру
                        beq . + <SetNewControl - MorphBNE$>
                        .word MorphBNE$
                mov     #KbdTbl, (SP)   ; меняем таблицу джойстика на таблицу клавиш
                inc     2(SP)           ; увеличиваем на 1 пункт

4$:             call    SetNewControl

5$:             mov     4(SP), R3       ; адрес текста
                call    DrawControlsItem ; Вывод элемента управления на экран
                                        ; Вход: R3 - адрес текста
                mov     R3, 4(SP)
                call    SetUnicNewCtrl
                br      5$

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

; Вывод элемента управления на экран
; Вход: R3 - адрес текста

DrawControlsItem:
                mov     #63024, R1
                mov     #4, R5
                jmp     DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
; End of function DrawControlsItem
; ───────────────────────────────────────────────────────────────────────────


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


SetUnicNewCtrl: call    PressAnyKey     ; Ждать нажатия новой клавиши или джойстика.
                                        ; Выход: R0 - маска битов джойстика
                                        ;        R1 - код нажатой клавиши
                ;br      SUNC.1$         ; проверим, что нажали
; End of function SetUnicNewCtrl
SUNC.1$:        tst     R0              ; джойстик нажали?
MorphBNE$:      bne     SetNewControl   ; для джойстика тут bne - да, нажали и идём сохранять новое значение
                                        ;                         а если не нажали - будем ждать пока не нажмут джойстик
                                        ; для клавиатуры тут beq - нет, не нажали, значит нажали клавиатуру и идём сохранять новое значение
                                        ;                          а если нажали - идём ждать, пока будет нажата клавиша


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


SetNewControl:  tst     R0              ; джойстик нажали?
                bne     1$              ; да
                mov     R1, R0          ; нет - значит клавиатуру

1$:             mov     2(SP), R4       ; адрес таблицы значений
                mov     R0, (R4)+       ; сохраняем новое значение
                mov     R4, 2(SP)       ; сохраняем новый указатель в таблице
                dec     4(SP)           ; уменьшаем количество пунктов
                beq     2$              ; если кончились, то всё
                return                  ; если не кончились - продолжаем
; ───────────────────────────────────────────────────────────────────────────

2$:             jmp     SkipSplash      ; конец задания управления
; End of function SetNewControl

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

PlayerDead:     mov     #"00, Score+2   ; подсчёт очков
                mov     #['0 << 8.], Score
                mov     #3, R2          ; количество видов живности
                mov     #2, R3          ; бит в поле видов живности

1$:             mov     #DynamicItemsNum, R4
                mov     #DynamicStruct, R5

2$:             bit     R3, (R5)        ; эта живность есть?
                bne     4$              ; да - пропускаем
                mov     #Score+4, R1    ; нет, убили

3$:             incb    -(R1)           ; значит посчитаем
                cmpb    #'9 + 1, (R1)
                bne     4$
                movb    #'0, (R1)
                br      3$
; ───────────────────────────────────────────────────────────────────────────

4$:             add     #DynamicItemSize, R5
                sob     R4, 2$          ; пройдёмся по всему массиву
                asl     R3              ; следующая маска
                sob     R2, 1$          ; и так всю живность
                ; теперь посчитаем, сколько мешков со взрывчаткой взято
                mov     GameGoal, R1
                br      6$
; ───────────────────────────────────────────────────────────────────────────

5$:             incb    Score+1
                sub     #3, R1

6$:             cmp     #42450, R1
                bne     5$
                mov     #10000, R1

7$:             add     #20, @#177664
                mov     R1, R2

                sob     R2, .
                sub     #20, @#177664
                mov     R1, R2

                sob     R2, .
                call    TapSoundEff     ; Звуковой эффект при нажатии ВВОД и т.п.
                add     R1, R1
                bne     7$
                call    ClrScrDiagon    ; очистка экрана крест-накрест по диагонали
                call    sub_36264       ; инициализируем некоторые переменные
                                        ; и рисуем стакан и заголовок
                mov     #325, CH.Color$
                mov     #10, R5
                mov     #strText8$, R3
                mov     #50006, R1
                call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
                mov     #<Score+1>, R3
                mov     #54406, R1
                mov     #15, R2

8$:             movb    (R3)+, R0
                beq     9$
                call    DrawCharW
                add     #14, R1
                br      8$
; ───────────────────────────────────────────────────────────────────────────

9$:             call    TapSoundEff     ; Звуковой эффект при нажатии ВВОД и т.п.
                call    PressAnyKey     ; Ждать нажатия новой клавиши или джойстика.
                                        ; Выход: R0 - маска битов джойстика
                                        ;        R1 - код нажатой клавиши
                jmp     StartGame
; ───────────────────────────────────────────────────────────────────────────


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

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

sub_36360:      mov     #2, R5
                mov     #372, CH.Color$
                mov     R2, -(SP)

1$:             call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
                bis     #77, R1
                add     #2301, R1
                movb    (R3)+, R4
                add     R4, R1
                dec     (SP)
                bne     1$
                tst     (SP)+
                call    PressAnyKey     ; Ждать нажатия новой клавиши или джойстика.
                                        ; Выход: R0 - маска битов джойстика
                                        ;        R1 - код нажатой клавиши
                jmp     ClrScr2         ; Очистка экрана полосками
; End of function sub_36360

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

FinalGame:      mov     #TrapTo4$2, @#4
                sob     R0, .
                sob     R0, .

TrapTo4$2:      mov     #TopStack, SP
                call    ClrScrDiagon    ; очистка экрана крест-накрест по диагонали
                call    sub_36264       ; инициализируем некоторые переменные
                                        ; и рисуем стакан и заголовок
                mov     #44017, R1
                mov     #10., R2
                mov     #strText5$, R3
                call    sub_36360       ; Вывод многострокового текста
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - количество строк
                                        ;       R3 - адрес текста
; ───────────────────────────────────────────────────────────────────────────

                mov     #44020, R1
                mov     #10., R2
                mov     #strText6$, R3
                call    sub_36360       ; Вывод многострокового текста
                                        ; Вход: R1 - адрес экрана
                                        ;       R2 - количество строк
                                        ;       R3 - адрес текста
                mov     #325, CH.Color$
                mov     #2, R2
                mov     #42022, R1

1$:             mov     #strText7$, R3
                mov     R1, -(SP)

2$:             movb    (R3)+, R0
                beq     4$
                cmp     #42000, R1
                bpl     3$
                cmp     #57000, R1
                bmi     3$
                call    Putch           ; Вывод символа на экран
                                        ; Вход: R0 - код символа
                                        ;       R1 - адрес экрана
                                        ;       R2 - масштаб по высоте

3$:             sub     #2074, R1
                br      2$
; ───────────────────────────────────────────────────────────────────────────

4$:             cmp     #57000, R1
                bmi     5$
                mov     (SP)+, R1
                add     #200, R1
                br      1$
; ───────────────────────────────────────────────────────────────────────────

5$:             call    TapSoundEff     ; Звуковой эффект при нажатии ВВОД и т.п.
                mov     #strText7$, R3
                mov     #6, R5
                mov     #56022, R1
                call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
                mov     #56022, R1
                mov     #strText7$, R3
                mov     #12, R5
                call    DrawText        ; Вход: R1 - адрес экрана
                                        ;       R3 - адрес текста
                                        ;       R5 - финальный масштаб по высоте
                mov     #7, R5
                mov     #75626, R1

6$:             mov     R1, -(SP)
                mov     #243, R3

7$:             mov     #243, R2

8$:             mov     -(R1), 100(R1)
                mov     -(R1), 100(R1)
                sub     #74, R1
                sob     R2, 8$
                mov     (SP), R1
                sob     R3, 7$
                call    TapSoundEff     ; Звуковой эффект при нажатии ВВОД и т.п.
                add     #4, (SP)
                mov     (SP)+, R1
                sob     R5, 6$

                mov     #7, R2
                mov     #strText10$, R3
                mov     #47006, R1
                call    sub_36360
                mov     #strText11$, R3
                mov     #12, R2
                mov     #44423, R1
                call    sub_36360
                mov     #52004, R1
                mov     #5, R2
                mov     #strText9$, R3
                call    sub_36360
                mov     #Entry$, @#4
                jmp     PlayerDead
; ───────────────────────────────────────────────────────────────────────────
strText5$:      .asciz "BIL corp."
                .asciz <0>""
                .asciz <10>"ПРИВЕТСТВУЕТ"
                .asciz <12>"ВАС В КОНЦЕ"
                .asciz <10>"ЭТОГО ЭТАПА."
                .asciz <04>"СОБРАННОЙ ВАМИ"
                .asciz <14>"ВЗРЫВЧАТКИ"
                .asciz <16>"ХВАТИТ НА"
                .asciz <12>"УНИЧТОЖЕНИЕ"
                .asciz <26>"БАЗЫ."

strText6$:      .asciz "ОСТАЛОСЬ"
                .asciz <24>"ТОЛЬКО"
                .asciz <10>"ПРАВИЛЬНО ЕЙ"
                .asciz <04>"РАСПОРЯДИТЬСЯ."
                .asciz <12>"ПРИОБРЕТАЙТЕ"
                .asciz <04>"СЛЕДУЮЩУЮ ИГРУ"
                .asciz <10>"И ВЫ СМОЖЕТЕ"
                .asciz <06>"ПОЧУВСТВОВАТЬ"
                .asciz <04>"СЕБЯ НАСТОЯЩИМ"
                .asciz <11>"ДИВЕРСАНТОМ."

strText9$:      .asciz "АВТОР ПРОГРАММ"
                .asciz <06>"БОРТНИК БОРИС"
                .asciz <06>"117465 МОСКВА"
                .asciz <04>"ул.ТЕПЛЫЙ СТАН"
                .asciz <24>"9-7-88"
                .asciz ""

strText10$:     .asciz "GAME1  BALLY"
                .asciz <06>"GAME2  SECOND"
                .asciz <06>"GAME3  PLANET"
                .asciz <06>"GAME4  RUNING"
                .asciz ""
                .asciz ""
                .asciz <04>"СЛЕДУЮЩАЯ ИГРА"
                .asciz <04>"GAME6  ПЕРЕВАЛ"

strText11$:     .asciz "ПЕРЕВАЛ."
                .asciz ""
                .asciz ""
                .asciz <12>"ВАША ЗАДАЧА"
                .asciz <14>"ДОСТИГНУТЬ"
                .asciz <12>"СЕРДЦА БАЗЫ"
                .asciz <06>"ПО СКАЛИСТОЙ,"
                .asciz <24>"ПОЛНОЙ"
                .asciz <04>"НЕОЖИДАННОСТЕЙ"
                .asciz <12>"ПОВЕРХНОСТИ"
                .asciz <20>"ПЛАНЕТЫ."
                .even

                .END
