
                br      0START
                .asciz  "(c) GID prod."
                .even

0START:         emt     14
                call    INSET
                emt     26
                mov     R1,XSBASE
                mov     R2,YSBASE
                mov     R1,XS
                mov     R2,YS
                clr     NOSCR
                cmp     #100466,@#120170
                beq     0BEGIN
                jsr     R1,OUTS
                .asciz  "? А теперь попробуйте запустить эту программу из ANDOS'а..."
                .even
                call    WAITK
                halt

EQ:             .ascii  "*CAROLINE*"
                .even
XSBASE:         .word   0
YSBASE:         .word   0
XS:             .word   0
YS:             .word   0
LENP:           .word   0
NOSCR:          .word   0


LOADDR:         .word   EOF ;адрес адреса загрузки модуля
BATS:           .word   0   ;адрес начала таблицы разделов
EATS:           .word   0
PR:             .word   0

B0:             .byte   0
B1:             .byte   0
B2:             .byte   0
B3:             .byte   0

FDLIT:          .byte   0
FVOLUM:         .byte   0
FSAMPL:         .byte   0
FV:             .byte   0

PRSAM:          .byte   0
PRVOL:          .byte   0
PRDLT:          .byte   0
PRVP:           .byte   0
                .even

0BEGIN:         mov     #100,@#177660
                call    CLS
                jsr     R2,HEAD
                .asciz  "Декомпилятор SONG'ов BY ROCK MONITOR by (c) GID prod."
                .even

NEXT:           mov     #1000,SP
                mov     XS,R1
                mov     YS,R2
                emt     24
                jsr     R1,OUTS
                .asciz  <232>"Имя файла:"
                .even
                call    NAME
                mov     #320,R1
                emt     36
                tstb    1(R1)
                beq     17
                jsr     R1,OUTS
                .asciz  "Файл не прочелся..."<12>
                .even
                call    WAITK
                mov     #14,R0
                emt     16
                br      NEXT

17:             call    RENAME
                emt     26
                mov     R1,XS
                mov     R2,YS
                mov     #76000,@#177716
                mov     #140000,@#177662
                mov     XSBASE,R1
                mov     YSBASE,R2
                emt     24
                call    CLS
                call    INFO
                call    CLS
                mov     #76000,R1
                mov     R1,R3
                call    FORMAT  ;создаём разметку пустых сэмплов
                mov     LOADDR,R1
                add     #3006,R1    ;перемещаемся к началу блока параметров
                mov     R1,R5
                mov     (R1)+,@#74772   ;темп
                mov     (R1)+,R4    ;смещение до цепочки порядка воспроизведения разделов
                add     R5,R4       ;адрес цепочки порядка воспроизведения разделов
                mov     (R1)+,R0    ;смещение до таблицы разделов
                add     R5,R0       ;адрес таблицы разделов
                mov     R0,BATS
                mov     R4,-(SP)
                sub     #20,(SP)    ;тут должна быть строка-идентификатор

                mov     #12,R5
                mov     LOADDR,R4
                add     #1104,R4
                mov     #EQ,R2
24:             cmpb    (R4)+,(R2)+
                beq     25
                call    INSET
                jsr     R1,OUTS
                .byte   12
                .asciz  "? Хочу вас огорчить. Это не ROCK MONITOR'ный файл."
                .even
                jmp     NEXT

25:             sob     R5,24
                mov     (SP)+,R5
                call    MOVE    ;восстанавливаем сэмплы, ордер и длину ордера
                clr     R2
                mov     BATS,R1
                mov     #40000,R4
                mov     #73000,R3
                mov     R1,R0
                add     (R0),R0
                mov     R0,EATS

30:             inc     R2
                mov     (R1),R5
                add     BATS,R5
                mov     R4,(R3)+
                call    MAIN
                mov     R4,(R3)
                sub     -2(R3),(R3)+
                add     #40000,-4(R3)
                call    MAIN
                call    MAIN
                add     #6,R1
                cmp     R1,EATS
                blo     30
                mov     R2,@#74774  ;количество разделов в нотном тексте
32:             bit     #100,@#177716
                bne     32
                mov     #320,R1
                mov     R1,R0
                mov     #2,(R0)+
                mov     #40000,(R0)
                mov     (R0)+,(R0)+
                mov     @#120150,-(SP)
;                mov     @#121322,-(SP)
;                mov     @#121324,-(SP)
;                mov     #12705,@#121322
;                mov     #120,@#121324
                mov     #SND,@#120150
31:             emt     36
                tstb    1(R1)
                bne     31
;                mov     (SP)+,@#121324
;                mov     (SP)+,@#121322
                mov     (SP)+,@#120150
                call    INSET
                jmp     NEXT

INSET:          mov     #16000,@#177716
                mov     #40000,@#177662
                return

SND:            mov     R2,-(SP)
                mov     R3,-(SP)
                mov     #10,R2
                mov     #100,R3
                call    @#102062
                mov     (SP)+,R3
                mov     (SP)+,R2
                dec     (PC)+
CNTS:           .word   10
                bne     NULL
                mov     #10,CNTS
                mov     #NULL,@#120150
NULL:           return

KEYT:           mov     R0,-(SP)
                mov     R1,-(SP)
                mov     R2,-(SP)
                mov     @#160,-(SP)
                mov     @#156,-(SP)
                clr     @#156
                mov     #52030,@#160
                jsr     R1,OUTS
                .byte   232
                .ascii  "┌═══════════════┐"<25>
                .ascii  "║ ВЫХОД ? (Д/Н) ║"<25>
                .asciz  "└═══════════════┘"
                .even
                call    WAITK
                mov     R3,-(SP)
                call    @#102052
                mov     (SP)+,R3
                bic     #240,R0
                cmpb    #'D,R0
                beq     000
                cmpb    #'Y,R0
                beq     000
                mov     #52030,R0
                mov     #36,R1
001:            mov     #11,R2
004:            clr     (R0)+
                sob     R2,004
                add     #56,R0
                sob     R1,001
                clr     @#56
                mov     (SP)+,@#156
                mov     (SP)+,@#160
                mov     (SP)+,R2
                mov     (SP)+,R1
                mov     (SP)+,R0
                return
000:            jmp     @#100000

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

HEAD:           clr     R0
                emt     22
                clr     R1
3$:             movb    (R2)+,R0
                beq     2$
                emt     22
                inc     R1
                br      3$

2$:             inc     R2
                bic     #1,R2
                rts     R2

NAME:           tst     @#177662
                mov     #320,R0
                mov     #3,(R0)+
                mov     LOADDR,(R0)+
                clr     (R0)+
                mov     #10,R1
                mov     R0,R4
                mov     R0,R3
6:              mov     #20040,(R0)+
                sob     R1,6
                mov     R0,R5
14:             call    WAITK
                mov     R3,-(SP)
                call    @#102052
                mov     (SP)+,R3
                cmp     R0,#3
                bne     20
                call    KEYT
                br      14
20:             cmp     R0,#12
                beq     10
                cmp     R0,#30
                beq     11
                cmp     R0,#10
                beq     12
                cmp     R0,#31
                beq     13
                cmp     R0,#40
                blo     14
                cmp     R0,#200
                blo     15
                cmp     R0,#240
                blo     14
15:             movb    R0,(R3)+
                emt     16
                cmp     R3,R5
                beq     10
                br      14
11:             cmp     R3,R4
                beq     14
                movb    #40,-(R3)
16:             emt     16
                br      14
12:             cmp     R3,R4
                beq     14
                dec     R3
                br      16
13:             inc     R3
                cmp     R3,R5
                blo     16
                dec     R3
                br      14
10:             mov     R4,R3
                add     #10,R3
102:            cmpb    #'.,(R4)+
                beq     101
                cmp     R4,R5
                blo     102
103:            movb    (PC)+,(R3)+
                .byte   '.,'N
                movb    (PC)+,(R3)+
                .byte   'S,'D
                inc     PC
                br      103
104:            movb    #40,(R3)+
                cmp     R3,R5
                blo     104
101:            mov     (PC)+,R0
                .byte   232,12
                emt     16
                swab    R0
                emt     16
                return

RENAME:         clr     R1
                mov     #326,R2
                cmp     #20040,(R2)
                bne     19
                mov     R2,R5
                mov     #120114,R4
                mov     #10,R0
17:             movb    (R4)+,(R5)+
                sob     R0,17
                movb    #'.,(R5)+
                movb    (R4)+,(R5)+
                movb    (R4)+,(R5)+
                movb    (R4)+,(R5)+
19:             cmpb    (R2),#'.
                beq     18
                cmpb    (R2),#40
                beq     18
                bitb    (R2),#100
                beq     0NOCH
                bicb    #40,(R2)
0NOCH:          bitb    (R2)+,(R1)+
                cmp     #10,R1
                bne     19
18:             movb    (PC)+,(R2)+
                .byte   '.,'S
                movb    (PC)+,(R2)+
                .byte   'T,'N
                inc     PC
                br      18
                bit     (R1)+,(R1)+
21:             cmp     R1,#20
                bhi     20
                movb    #40,(R2)+
                inc     R1
                br      21
20:             return

;создаём пустые сэмплы
FORMAT:         mov     #20,R0
                mov     #7417,R2
22:             mov     R2,(R1)
                mov     R2,2(R1)
                mov     R2,10(R1)
                add     #100,R1
                sob     R0,22
                return

MOVE:25:        mov     (R1)+,(R3)+ ;переносим сэмплы на своё место
                cmp     R1,R5
                blo     25
                clr     R3
                add     #20,R5
                mov     #75000,R4   ;переносим цепочку списка воспроизведения на место
27:             cmp     (R5),#-1
                beq     26
                mov     (R5)+,(R4)+
                inc     R3
                br      27
26:             dec     R3          ;и размер цепочки на место
                mov     R3,@#74776
                return

MAIN:           mov     #-1,R0
                movb    R0,PRSAM
                movb    R0,PRVOL
                movb    R0,PRDLT
                movb    R0,PRVP
                mov     #400,PR
                clr     NIL
                clr     FDLIT
                clr     FSAMPL
                mov     #60200,B0
                clr     B2

                clr     LENP

M2:             clr     R0
                bisb    (R5)+,R0
                cmp     #377,R0
                bne     0
                tst     NOSCR
                bne     0I1
                mov     #-1,(R4)
                mov     (R4)+,(R4)+
0I1:            return
0:              tstb    R0
                bne     1
M4:             bicb    #177,B0
                bisb    R0,B0
                tstb    FDLIT
                beq     30
                bicb    #200,B0
                br      31
30:             bisb    #200,B0
31:             tstb    FVOLUM
                beq     32
                bicb    #100,B1
                br      33
32:             bisb    #100,B1
                bicb    #17,B2
33:             tstb    FSAMPL
                beq     34
                bicb    #40,B1
                br      35
34:             bisb    #40,B1
                bicb    #360,B2
35:             tstb    FV
                beq     36
                bicb    #200,B1
                br      37
36:             bisb    #200,B1
37:             tst     NOSCR
                bne     0I2
                mov     B0,(R4)+
                mov     B2,(R4)+
                br      0I3
0I2:            inc     LENP
                mov     LENP,R3
                call    DECOUT
0I3:            mov     (PC)+,R0
NIL:            .word   0
                beq     22
23:             tst     NOSCR
                bne     0I4
                mov     #160376,(R4)+
                clr     (R4)+
                br      0I5
0I4:            inc     LENP
                mov     LENP,R3
                call    DECOUT
0I5:            sob     R0,23
22:             clr     FDLIT
                clr     FSAMPL
0GOTO:          br      M2

1:              cmp     #376,R0
                bne     3
                mov     #176,R0
                br      M4

3:              dec     R0
                cmp     R0,#140
                bhis    5
                inc     R0
                br      M4

5:              cmp     R0,#160
                bhis    6
                bic     #177760,R0
                cmpb    R0,PRSAM
                beq     0GOTO
                movb    R0,PRSAM
                incb    FSAMPL
                asl     R0
                asl     R0
                asl     R0
                asl     R0
                bicb    #360,B2
                bisb    R0,B2
                br      0GOTO

6:              cmp     R0,#200
                bhis    7
                bic     #177760,R0
                cmpb    R0,PRVOL
                beq     0GOTO
                movb    R0,PRVOL
                incb    FVOLUM
                bicb    #17,B2
                bisb    R0,B2
                br      0GOTO

7:              cmp     R0,#220
                bhis    8
                bic     #177760,R0
                cmpb    R0,PRDLT
                beq     0GOTO
                movb    R0,PRDLT
                incb    FDLIT
                movb    R0,B3
                br      0GOTO

8:              cmp     R0,#240
                bhis    9
                bic     #177760,R0
                cmpb    R0,PRVP
                beq     0G
                movb    R0,PRVP
                incb    FVOLUM
                bicb    #17,B2
                bisb    R0,B2
0G:             incb    FV
                clr     R0
                bisb    (R5)+,R0
                cmp     R0,PR
                beq     21
                mov     R0,PR
                incb    FDLIT
                br      24

21:             clrb    FDLIT
24:             movb    PR,B3
                br      0GOTO

9:              sub     #240,R0
                mov     R0,NIL
                br      0GOTO

;вывод стоки на экран.
;вход:  R1 - адрес строки
;упр.коды:  0 - конец строки
;           25 - перевод строки, с учётом начальной позиции.
OUTS:           mov     R0,-(SP)
                mov     R2,-(SP)
                mov     @#160,R2
003$:           movb    (R1)+,R0
                beq     002$
                cmpb    #25,R0
                bne     001$
                add     #1200,R2
                mov     R2,@#160
                br      003$

001$:           emt     16
                br      003$

002$:           mov     (SP)+,R2
                mov     (SP)+,R0
                inc     R1
                bic     #1,R1
                rts     R1

WAITK:          bit     #100,@#177716   ;если кнопка нажата
                beq     WAITK           ;подождём пока отпустят
01$:            bit     #100,@#177716
                bne     01$             ;а теперь подождём пока снова не нажмут
                return

;вывод атрибутов:
INFO:           mov     PC,NOSCR
                mov     LOADDR,R4
                add     #3006,R4
                mov     R4,R5
                jsr     R1,OUTS
                .asciz  "Темп: "
                .even
                mov     (R4)+,R3    ;смещение 0
                call    DECOUT
                jsr     R1,OUTS
                .asciz  <12>"Количество сэмплов: "
                .even
                mov     (R4)+,R0    ;смещение 2
                add     R5,R0       ;адрес списка разделов
                add     (R4)+,R5    ;адрес таблицы смещений
                mov     R0,R3
                sub     #20,R3
                sub     R4,R3
                asl     R3
                asl     R3
                clrb    R3
                swab    R3
                call    DECOUT
                jsr     R1,OUTS
                .asciz  <12>"Количество разделов: "
                .even
                mov     R0,R1
                mov     #-1,R3
0:              inc     R3
                call    DECOUT
                cmp     (R1)+,#-1
                bne     0
                jsr     R1,OUTS
                .asciz  <12>"Количество паттернов: "
                .even
                mov     R5,R4
                mov     R5,BATS
                add     (R4),R4
                mov     R4,EATS
                clr     R3
1:              inc     R3
                call    DECOUT
                add     #6,R5
                cmp     R5,EATS
                blo     1
                jsr     R1,OUTS
                .asciz  <12>"Длины паттернов:"
                .even
                clr     -(SP)
                mov     BATS,R1
2:              mov     (R1),R5
                add     BATS,R5
                jsr     R1,OUTS
                .asciz  <12>"Паттерн #"
                .even
                inc     (SP)
                mov     (SP),R3
                call    DECOUT
                call    LOC
                jsr     R1,OUTS
                .asciz  ": "
                .even
                call    MAIN
                call    LOC
                call    MAIN
                call    LOC
                call    MAIN
                add     #6,R1
                cmp     R1,EATS
                blo     2
                clr     (SP)+
                call    WAITK
                clr     NOSCR
                return

LOC:            mov     R1,-(SP)
                emt     26
                cmp     (R1)+,(R1)+
                emt     24
                mov     (SP)+,R1
                return

;вывод десятичного числа с подавлением ведущих нулей
;вход:  R3 - число
DECOUT:         jsr     R5,@#154512
                emt     26
                mov     R1,-(SP)
                mov     R2,-(SP)
                mov     PC,R1
                mov     #10,R2
6$:             mov     #60,R0
1$:             cmp     R3,L10530(R2)
                blt     0$
                inc     R0
                sub     L10530(R2),R3
                br      1$

0$:             cmp     #60,R0
                bne     2$
                tst     R1
                beq     3$
                tst     R2
                bne     4$
2$:             clr     R1
3$:             emt     16
4$:             tst     R2
                beq     5$
                tst     -(R2)
                br      6$

5$:             mov     #40,R0
                emt     16
                mov     (SP)+,R2
                mov     (SP)+,R1
                emt     24
                return
L10530:         .word   1,10.,100.,1000.,10000.

EOF:            .END

;данные в канале:
;377 - конец канала
;0 - пауза
;376 - отсутствует нота
;0..137 - ноты
;140..157 - номер сэмпла
;160..177 - громкость
;200..217 - длительность ноты
;220..237 - форма волнового пакета (огибающей)
;240..374 - количество пустых нот в канале (n-240)
;
;формат SND Файла:
;данные за модулем воспроизведения
;смещение   размер  назначение
;0          2       Темп
;2          2       смещение до цепочки порядка воспроизведения разделов
;4          2       смещение до таблицы разделов
;6          100*s   массив сэмплов, размер сэмпла 100 байт, количество сэмплов от 1 до 16
;6+100*s    20      текст - идентификатор
;6+100*s+20 ?       цепочка порядка воспроизведения разделов, 200..377 - конец цепочки
;
;формат цепочка разделов:
;смещение   размер  назначение
;0          1       номер раздела ( < 0 - конец цепочки)
;1          1       высота раздела.
