
LOADAD = 1000

                mov     #77000, r2      ; назначение
                jsr     r1, mover       ; перемещаем
                ; эта часть запускается с другого адреса, так что
                ; прога должна быть перемещаемой
                .addr   r1, iblk        ; читаем 
                emt     36              ; исходный файл
                tstb    1(r1)           ; если без ошибок, то
                beq     1$              ; продолжаем
                jsr     R1, Outstr
                .asciz  "Ошибка чтения исходного массива."
                .even
                halt
1$:             ; патчим
                mov     #LOADAD, r1
                .addr   r4, PATCH       ; начало хвоста
                mov     r1, r3
                add     @#266, r3       ; конечный адрес
                inc     r3
                bic     #1, r3
                mov     (r1), -(r4)
                mov     #4537, (r1)+
                mov     (r1), -(r4)
                mov     r3, (r1)
                add     #4, (r1)
                ; цепляем хвост
                mov     #PATCHE-DATAP, r0
                asr     r0
2$:             mov     (r4)+, (r3)+
                sob     r0, 2$
                sub     #LOADAD, r3     ; новая длина
                mov     iblk+26, @#120152
                .addr   r1, oblk
                mov     r3, 4(r1)       ; сохраним новую длину
                emt     36
                tstb    1(r1)           ; если без ошибок, то
                beq     3$              ; продолжаем
                jsr     R1, Outstr
                .asciz  "Ошибка записи результата."
                .even
                halt
3$:             jsr     R1, Outstr
                .asciz  "Пропатчено успешно."
                .even
                halt

iblk:           .word   3
                .word   LOADAD
                .word   0
                .ascii  "rm3.bkp             "
                .blkb   30

oblk:           .word   202
                .word   LOADAD
                .word   0
                .ascii  "rm3.exe             "
                .blkb   30

; вывод текста
Outstr:         clr     R2
                emt     20
                inc     R1
                bic     #1, R1
                rts     R1

; вход сюда делается по jsr r5, @#PATCH
DATAP:          .word   0,0 ; второе слово, первое слово
PATCH:          .addr   R4, DATAP
                mov     (R4)+, -(R5)    ; восстановим данные под jsr r5,@#PATCH
                mov     (R4)+, -(R5)
                mtps    #340
                mov     #177777, @#177660 ; Запретим прерывания от клавиатуры
                mov     #42000, @#177662 ; Выкл таймер, экран 0, палитра 10
                ; опознаём ксидос, как умеем.
                ; а мы никак не умеем, т.к. в документации этого не сказано
                cmp     @#114,#54400
                bne     4$
                cmp     @#112,@#114
                beq     2$
                ; если в окне1 не стр.4, то тут может быть всё, что угодно.
4$:             cmp     @#120004,#100000+315. ; это мкдос?
                bhis    3$              ; обнаружен мкдос
                cmp     @#120170,#100000+310. ; это андос?
                blo     2$              ; нет. или версия не та
                ; обнаружен андос
3$:             .addr   R1, PCOPYR
                clr     R2
                emt     20
                br      1$
                ; будем считать, что если не андос/мкдос, то ксидос,
                ; остальные идут лесом - зажопили подробную документацию, сами виноваты.
2$:             emt     62              ; очистка экрана
                .addr   R0, PCOPYR
                emt     65              ; вывод строки
1$:             mov     #4000, @#177716 ; стр.1->окно0, стр.1->окно1
                jmp     (R5)            ; запускаем распаковку и затем сам рокмонитор.


PCOPYR:         .ascii  "Rock Monitor 3 by (c) Caroline Sofrware."<15><12>
                .ascii  "Adapted to ANDOS/MKDOS by RDC"<15><12>
                .asciz  "Fully remake by (c) gid productions."
                .even
PATCHE:

; перемещальшик программы в нужное место
; Вход: R2 - адрес, куда перемещать
;       R1 - что перемещать
mover:          mov     r2, r5          ; сохраним адрес, чтобы запуститься отсюда
1$:             mov     (r1)+, (r2)+    ; перемещаем
                cmp     r1, pc          ; вот досюда
                blo     1$
                rts     r5              ; и идём выполнять


                .end


