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

; ───────────────────────────────────────────────────────────────────────────
; File Name   : BALLY.GMC.raw.uncr
; Format      : Binary file
; Base Address: 0000h Range: 0AC0h - 4672h Loaded length: 3BB2h

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

.include "Bally_const.asm"

.la GMCLoad
; ═══════════════════════════════════════════════════════════════════════════
; головная часть подготовщика игры
; На входе:
; R0 = 17764
; R1 = 40000 = GMCLoad + 15240 * 2
; R2 = 0
; R3 = 177716
; R4 = 0
; R5 = 43160 = GMCLoad + GMCLen
; SP = 5266

GMCLen = GMCEnd$ - GMC$ ; размер всего этого файла.
GMCCode1 = GMCLoad + GMCCryptLen * 2 ; это значение в R1 на входе
GMCCode2 = GMCLoad + GMCLen     ; это значение в R5 на входе
; а дальше красиво не получается из-за получения значения работающего таймера и подсчёта КС
; динамически сформированного массива, который получить скриптом крайне муторно.
; жаль.

GMC$:           mov     #20, @#177712
                mov     #4500, R4
                sub     #42560, R5      ; R5 = 400
                call    @#116622        ; Подсчёт контрольной суммы
                                        ; Вход:  R4 - длина массива
                                        ;        R5 - адрес начала массива
                                        ; Выход: R0 - контрольная сумма        R0 = 71073
                                        ;        R4 == 0
                                        ;        R5 - адрес за концом массива  R5 = 5100
                mov     @#177710, R1    ; R1 = 1464 - это важно! таймер работает
                sub     #63473, R0      ; R0 = 5400 = Crypt$
                bic     #7, R1          ; R1 = 1460
                add     #15210, R1      ; R1 = 16670

1$:             mov     (R0), R4        ; декодируем
                clc
                rol     R4
                adc     R4
                com     R4
                swab    R4
                mov     R4, (R0)+
                sob     R1, 1$
                sub     #5000, R5       ; R5 = 100
                add     #123, R3        ; R3 = 41
                sub     #4316, SP       ; SP = 750
                sub     (PC)+, R0       ; R0 = 404
Crypt$:         .word   42554
                mov     R0, -(SP)       ; это адрес перехода
                ; переносим хвостовую часть на адрес 100
2$:             mov     <MV1$-Start0$+GameBlock-100>(R5), (R5)+
                sob     R3, 2$
                add     #576, R5        ; R5 = 1000
                add     #16574, R1      ; R1 = 16574
                mov     #16525, 0(R0)               ; формируем код переносчика игры
                mov     #<GameBlock - 1000>, 2(R0)  ; 1$: mov 4472(R5), (R5)+
                mov     #77103, 4(R0)               ;     sob R1, 1$
                mov     #137, 6(R0)                 ;     jmp @#1000
                mov     #1000, 10(R0)
                add     #400, R0        ; R0 = 1004
                mov     R0, @#10        ; адрес обработчика вектора 10
                call    @(SP)+          ; переходим на переносчик
GameBlock:

.SCRIPT "Game Encrypt"
; внутреннее кодирование
        mov #Crypt$, R0
        mov #16670, R1
1$:     mov (R0), R4
        swab R4
        com R4
        rcr R4
        mov R4, (R0)+
        sob R1, 1$
; внешнее кодирование
        mov #GMC$, R0
        mov #15240, R1
2$:     mov (R0), R4
        swab R4
        inc R4
        mov R4, (R0)+
        sob R1, 2$
.ENDS

                .END
