У меня всё загружается. При том, что картинка считалась не до конца. Но как я понимаю, вся ценность релиза в картинке.
https://yadi.sk/d/DZlMiAvG3KbADk
- - - Добавлено - - -
Вот как картинку спасти?
Вид для печати
У меня всё загружается. При том, что картинка считалась не до конца. Но как я понимаю, вся ценность релиза в картинке.
https://yadi.sk/d/DZlMiAvG3KbADk
- - - Добавлено - - -
Вот как картинку спасти?
Bambr, Ну, то что вы выложили на Яндекс это собственно я сам вчера вам и выложил в виде WAV'ки. Пошаманив с данными я попытался восстановить блок с картинкой, взяв выпавшие байты с блока от Дупанова, он её прогрузил но она идет киш-мякишом и выглядит это по уродский. Единственное отличие в том, что внизу написано "Челябинск" с номером телефона. Т.е формально я готов проститься с той картинкой и даже вставить оригинал ,но как я уже говорил, подсунув ей другой блок, он отказывается грузить основной (последний).
Неплохую защиту навернул там Андрей)
Теоретически пофиксить этот релиз можно, но практически ради надписи 'Челябинск' и, возможно, номера телефона - какой смысл?
Для фикса нужно разобраться в работе депакера, а он там навороченный, распаковать оба блока данных, до вмятины и после, дорисовать середину и упаковать обратно.
В данном случае овчинка выделки не стоит.
А главный блок прекрасно грузится и игра запускается.
p.s.: И еще раз выскажусь - долой моно-записи! В данной записи четко видно, как смешаны два канала, причем один с задержкой, из-за чего на единичных фронтах появляются лишние гармоники. То, что читалка это распознала - еще не значит, что так надо делать.
Хорошо, другой тогда вопрос. Можно ли сделать так, чтобы он грузил блок любой длины? И подсунуть ему хотя бы для проверки блок от Дупанова, чтобы он спокойно его распаковал и отобразил.
Любой нельзя. Он грузит блок длиной не более $147b. Старт $9c40.
Titus, Ну сделал, но грузит почему-то только при FastLoad. В чем может быть косяк?
Уже есть подвижки с восстановлением экрана. Вертикальный полосатый фрагмент в середине экрана - это потерянный кусок.
http://s018.radikal.ru/i524/1706/65/6c927038d0a2.png
Декомпрессор оказался на редкость примитивным, и при этом жутко монстроидальным. Наверное тот, кто писал его, только учился программировать. Если кому интересно, выкладываю краткий дизассемблер, по которому я разбирался с ним.
- - - Добавлено - - -Код:+1 номер трети (0..2)
+2 число третей (1..3)
+3 bit 0 0 - ширина строки 1 байт, 1 - ширина строки 32 байта
bit 2 0 - обычный режим, 1 - режим fill (заполнения области)
bit 3 0 - распаковка экрана, 1 - распаковка атрибутов
9C40 JR $9C46
9C42 (begin) DB $01, $FF, $FF, $0C ; Сигнатура текущей команды
9C46 CALL $007C ; RET (Получить на стеке адрес выхода this)
9C49 (this) DEC SP
DEC SP
EX (SP),HL ; HL - адрес this
INC SP
INC SP
AND A
LD DE,$0007
SBC HL,DE
PUSH HL
POP IY ; IY = this - 7 (begin) = $9C42
LD DE,$012A
ADD HL,DE ; HL = this - 7 + $012A = $9D6C
LD A,(IY+$00) ; (IY) -> A (A = $01)
$9C5E DEC A ;
JR Z,$9C67 ; Если A = 1, то --> $9C67
( не используется)
LD E,(HL) ; HL = HL + (HL)
INC HL ;
LD D,(HL) ;
ADD HL,DE ;
JR $9C5E ; --> $9C5E
$9C67 LD DE,$4000 ; DE = $4000 (адрес начала экрана)
INC HL
INC HL ; HL = HL + 2 = $9D6E
LD A,(IY+$01) ; A = (IY+1) ($FF)
INC A ;
JR NZ,$9C76 ; Если A <> $FF, то --> $9C76
LD A,(HL) ; (HL)->(IY+1) (обновить номер трети)
LD (IY+$01),A ;
$9C76
INC HL ; HL = HL + 1
LD A,(IY+$02) ; A = (IY+2)
INC A ;
JR NZ,$9C81 ; Если А <> $FF, то --> $9C81
LD A,(HL) ; (HL) -> (IY+2) (обновить число третей)
LD (IY+$02),A ;
$9C81
INC HL ; HL = HL + 1
LD A,(HL) ; (HL) -> (IY+3) (флаги)
LD (IY+$03),A ;
LD A,(IY+$01) ; Если (IY+1) >= 3, ; Скорректировать номер трети 0..2
CP $03 ; то (IY+1) = 0
JR C,$9C91 ;
LD (IY+$01),$00 ;
$9C91
LD A,(IY+$02) ; A = (IY+2) ; Скорректировать число третей 0..3
CP $04 ; Если (IY+2) >= 4,
JR C,$9C9C ; то (IY+2) = 1
LD (IY+$02),$01 ;
$9C9C
ADD A,(IY+$01) ; A = A + (IY+1) ; Сложить число третй и номер трети,
CP $04 ; Если A >= 4, ; чтобы сумма не привышала 3
JR C,$9CA7 ; то (IY+2) = 1
LD (IY+$02),$01 ;
$9CA7
LD A,(IY+$02) ; Если (IY+2) = 0, ; Скорректировать число третей 1..3
AND A ; то (IY+2) = 1
JR NZ,$9CB1 ;
LD (IY+$02),$01 ;
$9CB1
INC HL ; HL = HL + 1
LD E,$00 ; E = 0
LD A,(IY+$01) ; A = (IY+1) ; (IY+1) - номер трети (0..2)
ADD A,A ;
ADD A,A ;
ADD A,A ;
ADD A,$40 ; А = $40 + (A * 8)
LD D,A ; D = A
LD C,A ; C = A
LD B,$01 ; ; Число столбцов
BIT 0,(IY+$03) ; Если бит 0 (IY+3) = 0,
JR NZ,$9CC8 ; то B = $20,
LD B,$20 ; иначе B = $01
$9CC8
PUSH BC ; Сохранить BC
LD B,(IY+$02) ; B = (IY+2) (цикл на N третей)
$9CCC
PUSH BC ; Сохранить BC
LD B,$08 ; B = 8 (цикл на 8 знакоместв в трети)
$9CCF
PUSH BC ; Сохранить BC
LD B,$08 ; B = 8 (цикл на высоту знакоместа)
$9CD2
PUSH BC ; Сохранить BC
; Выбрать длину цикла - 1 байт или 32 байта (ширина строки)
LD B,$01 ; Если бит 0 (IY+3) = 0,
BIT 0,(IY+$03) ; то B = $01,
JR Z,$9CDD ; иначе B = $20
LD B,$20 ;
$9CDD
PUSH DE ; Сохранить DE
$9CDE
PUSH BC ; Сохранить BC
JR $9D24 ; --> $9D24 (распаковка одного байта)
$9CE1 ; Цикл на ширину строки (1 или 32)
POP BC ; Восстановить BC
INC DE ; DE = DE + 1
DJNZ $9CDE ; Цикл --> $9CDE
; Цикл на высоту знакоместа
POP DE ; Восстановить DE
POP BC ; Восстановить BC
INC D ; D = D + 1
DJNZ $9CD2 ; Цикл --> $9CD2
LD A,D ; Коррекция перехода на знакоместо ниже
SUB $08 ;
LD D,A ;
LD A,E ;
ADD A,$20 ;
LD E,A ;
POP BC ;
DJNZ $9CCF ; Цикл на число знакоместв в трети
LD A,D ; Коррекция перехода на треть ниже
ADD A,$08 ;
LD D,A ;
POP BC ;
DJNZ $9CCC ; Цикл на число третей
LD D,C ; Переход на следующий столбец
INC E ;
POP BC ;
DJNZ $9CC8 ; Цикл на число столбцов
; Распаковка атрибутов
LD E,$00 ;
LD A,$58 ;
ADD A,(IY+$01) ; D = (IY+1) + $58
LD D,A ; E = 0
LD B,(IY+$02) ; B = (IY+2) (BC - длина области)
LD C,E ; C = 0
SET 3,(IY+$03) ; бит 3 (IY+3) = 1
$9D11
PUSH BC
JR $9D24
$9D14 POP BC
DEC BC
INC DE
LD A,B
OR C
JR NZ,$9D11
LD (IY+$01),$FF
LD (IY+$02),$FF
RET
; Распаковка одного байта
$9D24 BIT 2,(IY+$03) ; Если бит 2 (IY+3) = 0, (не режим fill)
JR Z,$9D37 ; то --> $9D37
EXX ;
DEC B ; B' = B' - 1
LD A,C ;
EXX ;
JR Z,$9D33 ; Если B' = 0, то --> $9D33
LD (DE),A ; C' -> (DE)
JR $9D4B ; --> $9D4B
$9D33 RES 2,(IY+$03) ; бит 2 (IY+3) = 0 (сбросить режим fill)
$9D37 LD A,(HL) ; A = (HL)
INC HL ; HL = HL + 1
AND A ; Если A <> 0,
JR NZ,$9D4A ; то --> $9D4A (обычный режим)
; переход в режим fill
LD A,(HL) ; B' = (HL) ; B' - длина fill-области
EXX ;
LD B,A ;
EXX ;
INC HL ; HL = HL + 1
LD A,(HL) ; C' = (HL) ; C' - байт для заполнения fill-области
EXX ;
LD C,A ;
EXX ;
INC HL ; HL = HL + 1
SET 2,(IY+$03) ; бит 2 (IY+3) = 1 (установить fill-режим)
$9D4A
LD (DE),A ; A -> (DE)
$9D4B
BIT 3,(IY+$03) ; Если бит 3 (IY+3) = 1 (распаковка атрибутов)
JR NZ,$9D14 ; то --> $9D14,
JR $9CE1 ; иначе --> $9CE1
$01-$FF - режим обычного копирования
$00,len,byte - режим fill, где len - длина, byte - байт для заполнения
Восстановил, запаковав ручками выпавший кусок картинки, по алгоритму данного пакера.
http://s019.radikal.ru/i619/1706/60/38b3d5c1a10b.png
p.s.: Пакер - это нечто) Неэкономный, монстроидальный) Но спишем на ученичество автора, каждый через это проходил.