;глушим AYшку
SHUTUP:         mov     #177714, R1
                mov     #362, R0        ; начальный номер регистра (с конца)
                mov     #CADR, R2
0$:             mov     R0, (R1)        ; номер регистра
                movb    -(R2), R3       ; берём данные
                com     R3              ; инвертируем
                movb    R3, (R1)        ; посылаем в регистр
                incb    R0              ; и так до начального номера
                bmi     0$
                return
                .word   0, 2160, 0
                .byte   0, 375, 0, 0, 0
                .byte   0, 2, 0
CADR:

;звучалка:
BEEPER:         clr     AMPLA
                movb    #375, R5        ; биты смесителя
                mov     #BPPAR, R0
10$:            mov     (R0), R1        ; номер текущего такта
                bmi     0$              ; нету - идём дальше
                mov     R0, R2          ; запомним адрес в блоке параметров
                add     #6, (R0)+       ; переход к следующему такту
                add     (R0)+, R1       ; адрес в сэмпле
                tst     (R1)            ; есть что-то?
                bne     3$              ; да - идём обработаем
                mov     R2, R0          ; иначе
                mov     #-1, (R2)       ; помечаем, что элемент свободен
                br      0$

3$:             mov     (R1)+, R2       ; тон
                tst     (R1)+           ; маски микшера
                movb    (R1)+, R3       ; амплитуда
                mov     R3, R4
                sub     (R0)+, R3       ; остаточная амплитуда канала A
                bpl     1$              ; если есть
                clr     R3              ; иначе 0
1$:             sub     (R0)+, R4       ; остаточная амплитуда канала C
                bpl     2$
                clr     R4
2$:             cmpb    R3, AMPLA       ; если амплитуда меньше текущей
                blo     4$              ; пропускаем
                movb    R3, AMPLA       ; иначе - применяем
                mov     R2, TONEA       ; и тон тоже
                movb    (R1), NOISE     ; noise
                movb    -3(R1), R3      ; маска смесителя bic
                bic     #44, R3
                bicb    R3, R5
                movb    -2(R1), R3      ; маска смесителя bis
                bic     #44, R3
                bisb    R3, R5

4$:             cmpb    R4, AMPLC       ; ampl C
                blo     12$
                movb    R4, AMPLC
                mov     R2, TONEC
                movb    (R1), NOISE     ; noise
                movb    -3(R1), R3
                bic     #11, R3
                bicb    R3, R5
                movb    -2(R1), R3
                bic     #11, R3
                bisb    R3, R5
                br      12$

0$:             add     #BPElemLen, R0  ; переход к следующему параметру
12$:            cmp     R0, #BPPAR2     ; пока не закончатся
                blo     10$
                movb    R5, SMES

                mov     #177714, R3
                mov     #AYMEME, R1
                mov     #365, R2
                call    SAVBYT
                inc     R2
                call    SAVBYT
                call    SAVBY2
                call    SAVBY2
                add     #2, R2
SAVBY2:         mov     PC, -(SP)
SAVBYT:         mov     R2, (R3)
                movb    -(R1), R0
                com     R0
                movb    R0, (R3)
                incb    R2
                mov     (SP)+, PC

TONEA:          .word   0       ;частота A              377, 376
TONEC:          .word   0       ;частота C              373, 372
NOISE:          .byte   0       ;шум                    371
SMES:           .byte   377     ;смеситель              370
AMPLA:          .byte   0       ;амплитуда A            367
AMPLC:          .byte   0       ;амплитуда C            365
AYMEME:

;обработчик резервных кодов:
;210..214
;в регистре R5 - адрес столкновения
INT10:          mov     R0, -(SP)
                mov     2(SP), R0
                mov     -(R0), R0       ; опкод вызвавший прерывание
                sub     #210, R0        ; отлавливаем нужный нам код
                blo     0$              ; меньше 210 - не считается
                cmp     #4, R0
                blo     0$              ; больше 214 - не считается
                mov     R5, -(SP)
                mov     R1, -(SP)
                mov     #BPPAR, R1      ; ищем свободный элемент
2$:             tst     (R1)            ; нашли?
                bmi     1$              ; да
                add     #BPElemLen, R1  ; нет, переходим к следующему
                cmp     R1, #BPPAR2     ; таблица закончилась?
                blo     2$              ; нет ещё
                mov     #BPPAR, R1      ; да - значит звук поместим в начале
1$:             clr     (R1)+           ; начальный номер такта
                asl     R0
                mov     FXTAB(R0), (R1)+
                bic     #177700, R5     ; получим номер байта в строке
                asr     R5
                asr     R5              ; делим на 4, чтобы соответствовало 16 уровням амплитуд
                movb    SNDRWA(R5), (R1)+
                inc     R1
                movb    SNDRWC(R5), (R1)+
                mov     (SP)+, R1
                mov     (SP)+, R5
0$:             mov     (SP)+, R0
                rti


; одновременно может звучать до 12-и сэмплов
BPPAR:          .word   -1      ; номер текущего такта, -1 - свободный элемент
                .word   0       ; адрес начала сэмпла
                .word   0       ; остаточная амплитуда канала A
                .word   0       ; остаточная амплитуда канала C
BPPARE:         .word   -1,0,0,0
                .word   -1,0,0,0
                .word   -1,0,0,0
                .word   -1,0,0,0
                .word   -1,0,0,0
                .word   -1,0,0,0
                .word   -1,0,0,0
                .word   -1,0,0,0
                .word   -1,0,0,0
                .word   -1,0,0,0
                .word   -1,0,0,0
BPPAR2:         ; конец блока параметров
BPElemLen = BPPARE - BPPAR  ; длина одного элемента блока параметров

FXTAB:          .word   S1      ;210
                .word   S2      ;211
                .word   S3      ;212
                .word   S4      ;213
                .word   S5      ;214
;остаточные амплитуды: 15-ампл:
SNDRWC:         .byte   7, 6, 6, 5, 5, 4, 4, 3, 3, 3, 2, 2, 1, 1, 0, 0
SNDRWA:         .byte   0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7
                .even

;есть 5 звуков:
;1 - белый:стена        210
;2 - чёрный:стена       211
;3 - белый:белый        212
;4 - чёрный:чёрный      213
;5 - мой:белый/чёрный   214
;каждый определяется переменной длины сэмплом, в формате:
;.word частота
;.byte смеситель: bic, bis
;.byte громкость
;.byte шум
S1:             .word   216
                .byte   5, 50, 12., 0
                .word   215
                .byte   5, 50, 7, 0
                .word   214
                .byte   5, 50, 5, 0
                .word   215
                .byte   5, 50, 5, 0
                .word   216
                .byte   5, 50, 4, 0
                .word   217
                .byte   5, 50, 4, 0
                .word   220
                .byte   5, 50, 4, 0
                .word   217
                .byte   5, 50, 3, 0
                .word   216
                .byte   5, 50, 3, 0
                .word   107
                .byte   5, 50, 4, 0
                .word   43
                .byte   5, 50, 5, 0
                .word   0

S2:             .word   1070
                .byte   50, 5, 8., 13.
                .word   2160
                .byte   50, 5, 5., 1
                .word   0

S3:             .word   43
                .byte   5, 50, 13., 0
                .word   43
                .byte   5, 50, 12., 0
                .word   43
                .byte   5, 50, 12., 0
                .word   43
                .byte   5, 50, 11., 0
                .word   43
                .byte   5, 50, 11., 0
                .word   43
                .byte   5, 50, 10., 0
                .word   43
                .byte   5, 50, 10., 0
                .word   43
                .byte   5, 50, 9., 0
                .word   42
                .byte   5, 50, 9., 0
                .word   43
                .byte   5, 50, 9., 0
                .word   44
                .byte   5, 50, 9., 0
                .word   43
                .byte   5, 50, 9., 0
                .word   42
                .byte   5, 50, 9., 0
                .word   43
                .byte   5, 50, 8., 0
                .word   44
                .byte   5, 50, 8., 0
                .word   43
                .byte   5, 50, 8., 0
                .word   41
                .byte   5, 50, 8., 0
                .word   43
                .byte   5, 50, 8., 0
                .word   45
                .byte   5, 50, 8., 0
                .word   43
                .byte   5, 50, 7., 0
                .word   41
                .byte   5, 50, 7., 0
                .word   43
                .byte   5, 50, 7., 0
                .word   45
                .byte   5, 50, 7., 0
                .word   43
                .byte   5, 50, 7., 0
                .word   42
                .byte   5, 50, 7., 0
                .word   41
                .byte   5, 50, 6., 0
                .word   42
                .byte   5, 50, 6., 0
                .word   43
                .byte   5, 50, 6., 0
                .word   44
                .byte   5, 50, 6., 0
                .word   45
                .byte   5, 50, 6., 0
                .word   44
                .byte   5, 50, 6., 0
                .word   43
                .byte   5, 50, 5., 0
                .word   42
                .byte   5, 50, 5., 0
                .word   41
                .byte   5, 50, 5., 0
                .word   42
                .byte   5, 50, 5., 0
                .word   43
                .byte   5, 50, 5., 0
                .word   44
                .byte   5, 50, 5., 0
                .word   45
                .byte   5, 50, 5., 0
                .word   44
                .byte   5, 50, 5., 0
                .word   43
                .byte   5, 50, 5., 0
                .word   42
                .byte   5, 50, 5., 0
                .word   40
                .byte   5, 50, 4., 0
                .word   42
                .byte   5, 50, 4., 0
                .word   43
                .byte   5, 50, 4., 0
                .word   44
                .byte   5, 50, 4., 0
                .word   46
                .byte   5, 50, 4., 0
                .word   44
                .byte   5, 50, 4., 0
                .word   43
                .byte   5, 50, 4., 0
                .word   41
                .byte   5, 50, 4., 0
                .word   36
                .byte   5, 50, 4., 0
                .word   41
                .byte   5, 50, 4., 0
                .word   43
                .byte   5, 50, 3., 0
                .word   45
                .byte   5, 50, 3., 0
                .word   50
                .byte   5, 50, 3., 0
                .word   45
                .byte   5, 50, 3., 0
                .word   43
                .byte   5, 50, 3., 0
                .word   42
                .byte   5, 50, 3., 0
                .word   41
                .byte   5, 50, 3., 0
                .word   42
                .byte   5, 50, 3., 0
                .word   43
                .byte   5, 50, 3., 0
                .word   44
                .byte   5, 50, 0, 0
                .word   0

S4:             .word   7777
                .byte   50, 5, 13., 0
                .word   7777
                .byte   50, 5, 12., 4
                .word   7777
                .byte   50, 5, 12., 0
                .word   7777
                .byte   50, 5, 11., 4
                .word   7777
                .byte   50, 5, 11., 0
                .word   7777
                .byte   50, 5, 10., 6
                .word   7777
                .byte   50, 5, 10., 0
                .word   7777
                .byte   50, 5, 9., 6
                .word   7777
                .byte   50, 5, 9., 0
                .word   7777
                .byte   50, 5, 9., 8.
                .word   7777
                .byte   50, 5, 9., 0
                .word   7777
                .byte   50, 5, 9., 8.
                .word   7777
                .byte   50, 5, 9., 0
                .word   7777
                .byte   50, 5, 8., 10.
                .word   7777
                .byte   50, 5, 8., 0
                .word   7777
                .byte   50, 5, 8., 10.
                .word   7777
                .byte   50, 5, 8., 0
                .word   7777
                .byte   50, 5, 8., 10.
                .word   7777
                .byte   50, 5, 8., 0
                .word   7777
                .byte   50, 5, 7., 11.
                .word   7777
                .byte   50, 5, 7., 0
                .word   7777
                .byte   50, 5, 7., 11.
                .word   7777
                .byte   50, 5, 7., 0
                .word   7777
                .byte   50, 5, 7., 11.
                .word   7777
                .byte   50, 5, 7., 0
                .word   7777
                .byte   50, 5, 6., 12.
                .word   7777
                .byte   50, 5, 6., 0
                .word   7777
                .byte   50, 5, 6., 12.
                .word   7777
                .byte   50, 5, 6., 0
                .word   7777
                .byte   50, 5, 6., 12.
                .word   7777
                .byte   50, 5, 6., 0
                .word   7777
                .byte   50, 5, 5., 13.
                .word   7777
                .byte   50, 5, 5., 0
                .word   7777
                .byte   50, 5, 5., 13.
                .word   7777
                .byte   50, 5, 5., 0
                .word   7777
                .byte   50, 5, 5., 13.
                .word   7777
                .byte   50, 5, 5., 0
                .word   7777
                .byte   50, 5, 5., 13.
                .word   7777
                .byte   50, 5, 5., 0
                .word   7777
                .byte   50, 5, 5., 14.
                .word   7777
                .byte   50, 5, 5., 0
                .word   7777
                .byte   50, 5, 4., 14.
                .word   7777
                .byte   50, 5, 4., 0
                .word   7777
                .byte   50, 5, 4., 14.
                .word   7777
                .byte   50, 5, 4., 0
                .word   7777
                .byte   50, 5, 4., 14.
                .word   7777
                .byte   50, 5, 4., 0
                .word   7777
                .byte   50, 5, 4., 15.
                .word   7777
                .byte   50, 5, 4., 0
                .word   7777
                .byte   50, 5, 4., 15.
                .word   7777
                .byte   50, 5, 4., 0
                .word   7777
                .byte   50, 5, 3., 15.
                .word   7777
                .byte   50, 5, 3., 0
                .word   7777
                .byte   50, 5, 3., 15.
                .word   7777
                .byte   50, 5, 3., 0
                .word   7777
                .byte   50, 5, 3., 16.
                .word   7777
                .byte   50, 5, 3., 0
                .word   7777
                .byte   50, 5, 3., 16.
                .word   7777
                .byte   50, 5, 3., 0
                .word   7777
                .byte   50, 5, 3., 16.
                .word   7777
                .byte   50, 5, 0, 0
                .word   0

S5:             .word   434
                .byte   55, 0, 14., 5
                .word   1070
                .byte   55, 0, 12., 28.
                .word   2160
                .byte   55, 0, 0, 0
                .word   0

ERRDOS:         .asciz  "Необходимы ANDOS v3.10 или MKDOS v3.15"<12>
                .even
;это новый вход
START:          tst     @#177662
                mov     SP, TmpSP
                mov     #SkipScrnPl, @#60
                mov     @#60, @#274
                call    SCRNPL
SkipScrnPl:     tst     @#177662
                mov     (PC)+, SP
TmpSP:          .word 0
                mov     #100, @#177660
                mov     #22, @#177712
                mov     #OWERDT, R0
                cmp     @#120004, #100000+315.
                blo     10$
                clr     (R0)+
                mov     #120124, (R0)+
                mov     #120074, (R0)+
                br      11$

10$:            cmp     @#120170, #100000+310.
                blo     12$
                mov     #"PP, (R0)+
                mov     #120140, (R0)+      ; Режим записи (код буквы "П" на любом регистре (120) -
                                            ; перезапись, "Д" (104) - дубль, другой код - вывод запроса)
                mov     #120150, (R0)+      ; Ячейка перехвата вывода на экран сообщений
                                            ; ANDOS (Значение по умолчанию 0)
                br      11$

12$:            mov     #ERRDOS, R1
                clr     R2
                emt     20
                halt

11$:            call    SHUTUP
                call    LOADTB
                clrb    @#NOBEEP
                mov     #60, R0
                mov     #VEC60, (R0)+
                mov     #300, R1
                mov     R1, (R0)
                mov     (R0), -(R1)
                mov     -(R0), -(R1)
                clr     @#KEYCOD
                mov     #4, R0
                mtps    R0              ; приоритет 0
                mov     (R0), OLDV4
                mov     #HLT4, (R0)+
                clr     (R0)+
                mov     (R0), OLDV10
                mov     #INT10, (R0)+
                clr     (R0)+
                call    CLS

                mov     #52620, R1
                mov     #StrInfinite, R0
                call    HIOUT
                mov     #55216, R1
                mov     #StrNormalGame, R0
                call    HIOUT

4$:             call    EMT6
                sub     #'0, R0
                beq     2$
                dec     R0
                bne     4$
                bic     #400, FRWRCM
                br      0$
2$:             bis     #400, FRWRCM

;это старый вход
0$:             call    CLS
                mov     #40032, R1
                mov     #XONIX, R0
                call    HIOUT
                mov     #75400, R1
                mov     #StrSetSpeed, R0
                call    HIOUT

3$:             call    EMT6
                sub     #'0, R0
                bcs     3$
                cmp     #9., R0
                blo     3$
                mov     R0, @#GameClass
                inc     R0
                swab    R0
                mov     R0, @#GameSpeed

CLS:            mov     #40000, R0
1$:             clr     (R0)+
                tst     R0
                bpl     1$
                mov     #1330, @#177664
                return

SCRNPL:         mov     #40000, @#PALREG
                mov     #16000, @#177716
                call    T100DS
                mov     #350, @#177664
                mov     #2, @#102
                mov     #102, @#100
                call    MARKX
                call    T100EN
                mov     #20, R0
01$:            dec     @#177664
                bic     #1000, @#177664
                wait
                wait
                wait
                wait
                sob     R0, 01$
                sob     R0, .
                sob     R0, .
                call    T100DS
                mov     #330, @#177664
                mov     #777, R1
                mov     #1, R2
0$:             bic     #1000, @#177664
                mov     R1, R0
                sob     R0, .
                bis     #1000, @#177664
                mov     R2, R0
                sob     R0, .
                inc     R2
                sob     R1, 0$

1$:             call    ISKEY
                bne     1$

                mov     #330, @#177664
                mov     #777, R1
                mov     #1, R2
2$:             bis     #1000, @#177664
                mov     R1, R0
                sob     R0, .
                bic     #1000, @#177664
                mov     R2, R0
                sob     R0, .
                inc     R2
                sob     R1, 2$
                return

                .end

