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

; ───────────────────────────────────────────────────────────────────────────
; File Name   : BALLY.PIC.raw.uncr
; Format      : Binary file
; Base Address: 0000h Range: 1000h - 2A50h Loaded length: 1A50h

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

.include "Bally_const.asm"

.la PICLoad
; ═══════════════════════════════════════════════════════════════════════════
; на входе:
; R0 = 5000
; R1 = 15000 = PICLoad + 2400 * 2
; R2 = 0
; R3 = 177716
; R4 = 0
; R5 = 25116 = PICLoad + PICLen
; SP = 716

PICTopStack = 5276
PicLen = PicDataEnd - PicBgn ; размер всего этого файла.
                             ; PicDataEnd задаётся в параметрах командной строки при конвертации картинки в объектник

PicCode1 = PICLoad + PICCryptLen * 2 ; это значение в R1 на входе
PicCode2 = PICLoad + PICLen     ; это значение в R5 на входе
CtrlAddr1 = 32056               ; это адрес, с которого делается подсчёт КС
PicCode3 = CtrlAddr1 - <PicCode1 + PicCode2 + 177716> ; так вычисляется константа, с помощью которой вычисляется значение CtrlAddr1 ;170022
PicCode4 = CtrlAddr1 - Cryptp2  ; так вычисляется константа, с помощью которой вычисляется значение, откуда дешифровать код ; 21736

PicBgn:         mov     #20, @#177712
                add     R3, R5          ; R5 = 25034
                clr     R4
                add     R1, R5          ; R5 = 42034
                add     #PicCode3, R5   ; R5 = 32056
                mov     R5, R1          ; R1 = 32056
                mov     R3, R2
                add     @#177706, R4    ; R4 = 2330
                add     #123, R4        ; R4 = 2453
                call    @#116622        ; Подсчёт контрольной суммы.
                                        ; Вход:  R4 - длина массива
                                        ;        R5 - адрес начала массива
                                        ; Выход: R0 - контрольная сумма
                                        ;        R4 == 0
                                        ;        R5 - адрес за концом массива
                ; результат КС всё равно не используется, так что без разницы
                ; что находится по этим адресам
                add     @#PICStackAddr, R0 ; R0 = 111554 + 1000 = 112554
                bne     0ok$            ; теоретически, если никто стек не попортил, то тут будет переход всегда 
                return
; ───────────────────────────────────────────────────────────────────────────

0ok$:           sub     #20, SP         ; SP = 730
                sub     #PicCode4, R1   ; R1 = 10120
                add     #4000, R4       ; R4 = 4000

1$:             mov     (R1), R0        ; декодируем
                clc
                rol     R0
                adc     R0
                mov     R0, (R1)+
                sob     R4, 1$
                tst     R5              ; R5 = 34531
                bne     1ok$            ; переход
                inc     R5              ; тут будет некоторая фигня, если что-то не так

2$:             mov     (R2), R0
                rol     R0
                mov     R0, (R2)+
                sob     R2, 2$
                return
; ───────────────────────────────────────────────────────────────────────────
.SCRIPT "Pic Crypt"
        ; сперва внутреннее кодирование
        mov #4000, R0
        mov #Cryptp2, R1
1$:     rcr (R1)+
        sob R0, 1$
        ; потом внешнее
        mov #2400, R0
        mov #PicBgn, R1
2$:     mov (R1), R2
        swab R2
        neg R2
        mov R2, (R1)+
        sob R0, 2$
.ENDS
Cryptp2:
1ok$:           mov     @#177710, R1
                bic     #7, R1          ; R1 = 2000
                add     #TLGMCAddr, R4  ; R4 = 400
                mov     #331, R2
TLOffset = TLPICAddr - TLGMCAddr
3$:             mov     TLOffset(R4), (R4)+ ; переносим магнитофонный загрузчик в новое место
                sob     R2, 3$
                mov     #TrapTo14-TLOffset, @#TLGMCAddr+OffsTL01  ; патчим
                mov     #Retry$-TLOffset, @#TLGMCAddr+OffsTL02
                mov     #Name$-326-TLOffset, @#TLGMCAddr+OffsTL12
                mov     #40425, @#PatchML12 ; новый адрес вывода строки "BALLY"
                mov     #GMCLoad, @#TLGMCAddr+OffsTL06
                mov     #40067, @#PatchML07 ; новый адрес вывода окошка счётчика
                mov     #GMCCryptLen, @#TLGMCAddr+OffsTL05
                mov     (PC)+,@(PC)+
                        dec r0
                .word   TLGMCAddr+OffsTL07
                mov     #137, @#TLGMCAddr+OffsTL08-2
                mov     #GMCLoad, @#TLGMCAddr+OffsTL08
                mov     #Retry$-TLOffset, @#TLGMCAddr+OffsTL11
                mov     #"GM, @#TLGMCAddr+OffsTL13
                mov     #46500, @#PatchML11 ; новый адрес вывода логотипа
                mov     #PICTopStack, @#PatchML15  ; новая вершина указателя стека
                mov     #WrongFile$-TLOffset, @#26 ; тут портим переход, потому что 
                mov     #40000, @#PatchML03 ; новое начало экрана
                mov     #1011, @#PatchML05  ; новое значение скроллинга экрана
                mov     #PICTopStack, SP
                ; выводим заставку
                mov     #46200, R5      ; адрес экрана
                mov     #PicData, R4    ; данные
4$:             mov     #1, R2          ; счётчик повторяющихся байтов
                movb    (R4)+, R0       ; берём очередной байт
                cmpb    R0, (R4)        ; он совпадает со следующим?
                bne     5$              ; нет
                inc     R4              ; да - его пропустим
                movb    (R4)+, R2       ; вот таким нерациональным способом 
                bic     #177400, R2     ; берём слово
                swab    R2
                movb    (R4)+, R3
                bic     #177400, R3
                add     R3, R2
                swab    R2              ; это счётчик повторяющихся байтов

5$:             movb    R0, (R5)+       ; выведем байт
                cmp     #100000, R5     ; до границы экрана дошли?
                beq     6$              ; да - конец работы
                sob     R2, 5$          ; столько раз, сколько надо.
                br      4$              ; и повторяем
; ───────────────────────────────────────────────────────────────────────────
                ; продолжаем патчить
6$:             mov     #GMCLoad, @#TLGMCAddr+OffsTL04
                mov     #4043, R5
                bic     #7, R5
                mov     R5, @#177706
                clr     @#177712
                mov     #GMCLoad, @#TLGMCAddr+OffsTL03
                mov     #1616, @#PatchML10  ; новое значение счётчика.
                mov     #Digit0$-20, @#PatchML08 ; новое значение 0-го разряда счётчика
                mov     #Digit2$, @#PatchML09   ; новое значение 2-го разряда счётчика
                clr     @#PatchML01 ; сюда переход по неверной КС в магнитофонном загрузчике
                mov     #45376, @#PatchML06 ; новый адрес экрана вывода счётчика
                mov     #40006, @#PatchML14 ; новый адрес вывода цифры 1
                mov     #3367, @#PatchML04  ; новое значение размера экрана для очистки
                mov     #43402, @#PatchML13 ; новый адрес вывода строки "GAME"
                mov     #3, @#TLGMCAddr+OffsTL10 ; новые координаты вывода найденного файла
                mov     #0, @#TLGMCAddr+OffsTL09 ;
                mov     #-1, @#PatchML02    ; и вот так. это чтобы не декодировать заново,
                                            ; а сразу делать прерывание по вектору 10


                .END
