PDA

Просмотр полной версии : Игра "Королевство Эйфория" для УКНЦ, восстановление исходника



nzeemin
23.04.2021, 22:57
Сделал грубый дизасм KINGOM - https://github.com/nzeemin/uknc-various/blob/master/KINGOM/KINGOM.MAC
По объёму примерно в полтора раза больше чем STALK. И всё во FLOAT сверху донизу.

Код на Паскале - https://github.com/nzeemin/uknc-various/tree/master/KINGOM-PASCAL

Alex_K
23.04.2021, 23:07
И всё во FLOAT сверху донизу.
А почему FIS не дизасмится?

Не уверен что осилю этот объём.
Главное уже начал. А там уже всё пойдёт.

А с какого диска "Королевство Эйфория"?

nzeemin
23.04.2021, 23:36
А почему FIS не дизасмится?

Главное уже начал. А там уже всё пойдёт.

А с какого диска "Королевство Эйфория"?

Надо мой дизасмер научить FIS понимать.

Эйфория с диска disk2.dsk - который ещё со старого SVN-репо - https://github.com/troosh/ukncbtl/blob/master/lib/disks/disk2.dsk
Я уже не помню откуда этот диск взялся.

Alex_K
23.04.2021, 23:39
Надо мой дизасмер научить FIS понимать.
Это очень просто. Команды всего четыре плюс регистр к ним.

Эйфория с диска disk2.dsk - который ещё со старого SVN-репо - https://github.com/troosh/ukncbtl/bl...isks/disk2.dsk
Я уже не помню откуда этот диск взялся.
Посмотрел в DESS, у меня такая же.

nzeemin
24.04.2021, 00:56
Это очень просто. Команды всего четыре плюс регистр к ним.

Да, с этим понятно.
А есть какой-то калькулятор, чтобы подставил туда два восьмеричных числа - и на тебе плавающее число в привычной записи?

Alex_K
24.04.2021, 00:58
А есть какой-то калькулятор, чтобы подставил туда два восьмеричных числа - и на тебе плавающее число в привычной записи?
Если только написать самому.

Alex_K
25.04.2021, 01:42
А есть какой-то калькулятор, чтобы подставил туда два восьмеричных числа - и на тебе плавающее число в привычной записи?

Если только написать самому.
Набросал начерновую:


#include <stdio.h>
void main(void)
{
unsigned short O1, O2;
short exp;
unsigned long mant, scmant;
long double res, sres;
while (1)
{
printf("#>");
scanf("%ho %ho", &O1, &O2);
printf("%ho %ho\n", O1, O2);
mant = ((((unsigned long)O1 << 16) | O2) & 0x7FFFFFL) | 0x800000L;
exp = (O1 >> 7) & 0xFF; exp -= 128;
printf("%hi %lX\n", exp, mant);
scmant = 0x800000L; sres = 0.5; res = 0.0;
while (scmant != 0)
{
if ((scmant & mant) != 0) res += sres;
scmant >>= 1; sres /= 2;
}
while (exp != 0)
{
if (exp < 0)
{
res /= 2; exp++;
}
else
{
res *= 2; exp--;
}
}
if ((O1 & 0x8000) != 0) res = -res;
printf("%Lg\n",res);
}
}

nzeemin
12.05.2021, 00:37
"Королевство Эйфория":
Код на MACRO-11, постепенно пополняется комментариями - https://github.com/nzeemin/uknc-various/blob/master/KINGOM/KINGOM.MAC
Код на Паскале, незакончено - https://github.com/nzeemin/uknc-various/tree/master/KINGOM-PASCAL

По моим прикидкам, общий объём работы - около 20 дней - на первые 20% ушло 4 дня.

Alex_K
15.05.2021, 23:26
По поводу переменной VAR224 - она типа INTEGER.
Функция L57170 получается что-то типа местного рандомайзера.

FUNCTION L57170(A:INTEGER; VAR B:INTEGER):REAL;
LABEL 1;
BEGIN
IF A<>0 THEN B:=A;
B:=B*5;
1:
IF B>=16384 THEN B:=B-16384;
IF B>=8192 THEN B:=B-8192;
IF B>=4096 THEN B:=B-4096;
IF B>4096 THEN GOTO 1;
L57170:=B/4096;
END;

Хотя можно было сделать проще: B:=B*5 AND 4095;

nzeemin
16.05.2021, 02:12
Спасибо, это сэкономило мне время.
Пока не понял что в процедуре L60060 заставляет сохранять SP в R4 - пока воткнул там NOP для выравнивания.
В конце 4-го .PAS модуля (KINGM4.PAS) стоит какой-то заполнитель из слов 011404 - пока не понял что это.

- - - Updated - - -

В общем, первый проход по основному модулю (KINGOM.PAS) - сделан.
Недоделаны процедуры в остальных модулях (KINGM3.PAS, KINGM4.PAS, KINGM5.PAS).
Приготовил всё ко второму проходу по основному модулю - дальше пока буду этим заниматься.

Alex_K
16.05.2021, 11:54
Пока не понял что в процедуре L60060 заставляет сохранять SP в R4 - пока воткнул там NOP для выравнивания.
В дополнительных модулях везде при вызове своих подпрограмм перед заносом параметров в стек стоит MOV SP,R4. В главном модуле такого нет.
Мне тоже воспроизвести не удалось.

- - - Добавлено - - -


В конце 4-го .PAS модуля (KINGM4.PAS) стоит какой-то заполнитель из слов 011404 - пока не понял что это.
Это есть в нескольких местах.

И команды MOV %6,%4 и MOV (%4),%4 присутствуют в исполнимом модуле транслятора Паскаля. Вот только при каких условиях они включаются в исходный код.

Sandro
16.05.2021, 13:29
И команды MOV %6,%4 и MOV (%4),%4 присутствуют в исполнимом модуле транслятора Паскаля. Вот только при каких условиях они включаются в исходный код.

Вложенные процедуры?

Alex_K
16.05.2021, 13:41
Вложенные процедуры?
Нет. Не получается.

nzeemin
16.05.2021, 14:52
Я сделал второй проход по основному модулю (KINGOM.PAS), исправил там все ошибки.
Там остаются только два различия - в двух строках вначале должен стоять символ <016>, вместо него я поставил '_', в коде это помечено комментарием {NOTE: Тут в начале символ 016}

- - - Updated - - -

Я пока беру тайм-аут по этой работе - сильно вложился временем и усилиями и поэтому запустил другие свои дела.

^m00h^
16.05.2021, 16:11
Это оригинальная версия КЭ, с которой делали порт на спектрум ?

nzeemin
16.05.2021, 18:30
Это оригинальная версия КЭ, с которой делали порт на спектрум ?

Под этим названием было множество игр.
Например вот на Бэйсике исходник в книге 1981 года - возможно, отсюда и взято название: http://www.retrotechnology.com/memship/Son_of_TFBOTBAS.HTM#chapter3
Учитывая несложную механику игры - было множество реализаций, сделанных разными авторами.
Также и с вариантами для Спектрума - скорее всего это было не портирование, а переписывание "по мотивам".

hobot
17.05.2021, 20:49
Под этим названием было множество игр.
Например вот на Бэйсике исходник в книге 1981 года - возможно, отсюда и взято название: http://www.retrotechnology.com/memship/Son_of_TFBOTBAS.HTM#chapter3
Учитывая несложную механику игры - было множество реализаций, сделанных разными авторами.
Также и с вариантами для Спектрума - скорее всего это было не портирование, а переписывание "по мотивам".

Именно по приведённому исходнику, скорее это "наш вариант"
(https://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/LA_REPUBLIKA_DE_ANCHURIA/)LA REPUBLIKA DE ANCHURIA (https://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/LA_REPUBLIKA_DE_ANCHURIA/)



- - - Добавлено - - -

https://pic.maxiol.com/thumbs2/1621273721.787614931.20210517174423934.png (https://pic.maxiol.com/?v=1621273721.787614931.20210517174423934.png&dp=2)

Игрушка была обнаружена на дискетах из коллекции AFZ , в 90-х мне она не встречалась как-то ! ;-)

Alex_K
17.05.2021, 22:53
Вложенные процедуры?

Нет. Не получается.
Я сначала неправильно подумал про рекурсивный вызов и ничего этого не получил.
А теперь сделал небольшой пример - внутри внешней процедуры объявил две функции и получил то, что надо.

(*$E+*)

PROCEDURE A;
VAR A,B,C,D:INTEGER;

FUNCTION AA:INTEGER;
BEGIN
AA:=A;
END;
FUNCTION BB:INTEGER;
BEGIN
BB:=B;
END;

BEGIN
A:=1; B:=2; C:=AA; D:=BB;
END;

.GLOBL $RESR6,$RESR5,$KORE,$SAV10,$VER
.GLOBL $BEGIN,FILE,$TTY,$END
.RADIX 10
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
L1:
MOV %4,-(6)
JSR %0,$B74
.GLOBL $B74
MOV 10(6),%0
MOV @%0,14(6)
JSR %0,$B76
.GLOBL $B76
ADD #2,%6
RTS %7
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
MOV (%4),%4
L2:
MOV %4,-(6)
JSR %0,$B74
MOV 10(6),%0
MOV 2(0),14(6)
JSR %0,$B76
ADD #2,%6
RTS %7
L0:
.GLOBL A
A:
SUB #8,%6
JSR %7,$B127
.GLOBL $B127
MOV #1,@%6
MOV #2,2(6)
CLR -(6)
MOV %6,%4
ADD #2,%4
JSR %7,L1


MOV (6)+,%0
MOV %0,4(6)
CLR -(6)
MOV %6,%4
ADD #2,%4
JSR %7,L2


MOV (6)+,%0
MOV %0,6(6)
ADD #8,%6
RTS %7
.END

hobot
17.05.2021, 22:59
По поводу "той самой КЭ" совсем недавно обсуждалось на страницах журнала DOWNGRADE (http://dgmag.in/list.htm#old_games) и в теме
https://zx-pk.ru/threads/13979-zhurnal-downgrade.html?p=1087156&viewfull=1#post1087156

Alex_K
17.05.2021, 23:11
{$E+}
{$S+}

procedure L57632;

procedure CURSORTO(R,C:integer); external; {L57476}
procedure ESCJ; external; {L57444}

begin
CURSORTO(0,0);
ESCJ;
end;

{ Разделяем C на тысячи A и остаток B }
procedure L57660(var A:integer; var B:integer; var C:real);
begin
if C > 32000000.0 then
C := 32000000.0;
A := TRUNC(C / 1000.0); {L57744}
B := TRUNC(C - A * 1000.0);
end;

AFZ
20.05.2021, 20:51
Игрушка была обнаружена на дискетах из коллекции @AFZ , в 90-х мне она не встречалась как-то ! ;-):) Эта игрушка мне попалась на Искре-226 в расширенном комплекте - с 8" дискетами и диском Изот-1370. У меня тогда была Э-60 с ЭПМ "Консул" и перфоленточным оборудованием. Как раз, в это время, к нам в политеховскую лабораторию занесло на практику какую-то студентку. Мне предложили загрузить ее хоть чем нибудь, так я взял с той Искры листинг этой игрушки и посадил практикантку набирать этот текст, в перфоленточном Бейсике Э-60. Перфоленту эту я сохранил, когда получилось завести на Э-60 RT11, я скормил эту ПЛ РТ-шному Бейсику, вот это и есть та самая Анчурия.

nzeemin
05.01.2022, 22:33
Реверс, можно сказать, завершён.
Различие с оригиналом в трёх байтах:

Comparing files KINGOM.SAV and KINGOM.GME
00000028: 0E 10 -- это в заголовке различие в длине на слово, возможно, из-за другой версии компилятора
00004824: 5F 0E -- это символ переключениия на русский в КОИ7 я заменил на "_"
00004A80: 5F 0E -- то же

Alex_K
05.01.2022, 22:38
Comparing files KINGOM.SAV and KINGOM.GME
00000028: 0E 10 -- это в заголовке различие в длине на слово, возможно, из-за другой версии компилятора
Есть у меня подозрение, что увеличенный на 2 адрес конца программы делался программой LINK в третьей или четвёртой версии RT-11. Ведь кроме версии 5.x и её аналога ФОДОС В03.00, были ещё ФОДОС В02.00 и ОС ДВК.

Radon17
06.01.2022, 00:59
Ура, поздравляю! :)
Кстати у меня такая мысль возникла. Ведь можно же так же "развернуть" до паскалевского исходника и самую первую версию тетриса.
Мировое сообщество будет в восторге, ведь это тот самый (тм) тетрис из скобочек!