Просмотр полной версии : Игра "Королевство Эйфория" для УКНЦ, восстановление исходника
Сделал грубый дизасм KINGOM - https://github.com/nzeemin/uknc-various/blob/master/KINGOM/KINGOM.MAC
По объёму примерно в полтора раза больше чем STALK. И всё во FLOAT сверху донизу.
Код на Паскале - https://github.com/nzeemin/uknc-various/tree/master/KINGOM-PASCAL
И всё во FLOAT сверху донизу.
А почему FIS не дизасмится?
Не уверен что осилю этот объём.
Главное уже начал. А там уже всё пойдёт.
А с какого диска "Королевство Эйфория"?
А почему FIS не дизасмится?
Главное уже начал. А там уже всё пойдёт.
А с какого диска "Королевство Эйфория"?
Надо мой дизасмер научить FIS понимать.
Эйфория с диска disk2.dsk - который ещё со старого SVN-репо - https://github.com/troosh/ukncbtl/blob/master/lib/disks/disk2.dsk
Я уже не помню откуда этот диск взялся.
Надо мой дизасмер научить FIS понимать.
Это очень просто. Команды всего четыре плюс регистр к ним.
Эйфория с диска disk2.dsk - который ещё со старого SVN-репо - https://github.com/troosh/ukncbtl/bl...isks/disk2.dsk
Я уже не помню откуда этот диск взялся.
Посмотрел в DESS, у меня такая же.
Это очень просто. Команды всего четыре плюс регистр к ним.
Да, с этим понятно.
А есть какой-то калькулятор, чтобы подставил туда два восьмеричных числа - и на тебе плавающее число в привычной записи?
А есть какой-то калькулятор, чтобы подставил туда два восьмеричных числа - и на тебе плавающее число в привычной записи?
Если только написать самому.
А есть какой-то калькулятор, чтобы подставил туда два восьмеричных числа - и на тебе плавающее число в привычной записи?
Если только написать самому.
Набросал начерновую:
#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);
}
}
"Королевство Эйфория":
Код на 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 дня.
По поводу переменной 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;
Спасибо, это сэкономило мне время.
Пока не понял что в процедуре L60060 заставляет сохранять SP в R4 - пока воткнул там NOP для выравнивания.
В конце 4-го .PAS модуля (KINGM4.PAS) стоит какой-то заполнитель из слов 011404 - пока не понял что это.
- - - Updated - - -
В общем, первый проход по основному модулю (KINGOM.PAS) - сделан.
Недоделаны процедуры в остальных модулях (KINGM3.PAS, KINGM4.PAS, KINGM5.PAS).
Приготовил всё ко второму проходу по основному модулю - дальше пока буду этим заниматься.
Пока не понял что в процедуре L60060 заставляет сохранять SP в R4 - пока воткнул там NOP для выравнивания.
В дополнительных модулях везде при вызове своих подпрограмм перед заносом параметров в стек стоит MOV SP,R4. В главном модуле такого нет.
Мне тоже воспроизвести не удалось.
- - - Добавлено - - -
В конце 4-го .PAS модуля (KINGM4.PAS) стоит какой-то заполнитель из слов 011404 - пока не понял что это.
Это есть в нескольких местах.
И команды MOV %6,%4 и MOV (%4),%4 присутствуют в исполнимом модуле транслятора Паскаля. Вот только при каких условиях они включаются в исходный код.
И команды MOV %6,%4 и MOV (%4),%4 присутствуют в исполнимом модуле транслятора Паскаля. Вот только при каких условиях они включаются в исходный код.
Вложенные процедуры?
Вложенные процедуры?
Нет. Не получается.
Я сделал второй проход по основному модулю (KINGOM.PAS), исправил там все ошибки.
Там остаются только два различия - в двух строках вначале должен стоять символ <016>, вместо него я поставил '_', в коде это помечено комментарием {NOTE: Тут в начале символ 016}
- - - Updated - - -
Я пока беру тайм-аут по этой работе - сильно вложился временем и усилиями и поэтому запустил другие свои дела.
Это оригинальная версия КЭ, с которой делали порт на спектрум ?
Это оригинальная версия КЭ, с которой делали порт на спектрум ?
Под этим названием было множество игр.
Например вот на Бэйсике исходник в книге 1981 года - возможно, отсюда и взято название: http://www.retrotechnology.com/memship/Son_of_TFBOTBAS.HTM#chapter3
Учитывая несложную механику игры - было множество реализаций, сделанных разными авторами.
Также и с вариантами для Спектрума - скорее всего это было не портирование, а переписывание "по мотивам".
Под этим названием было множество игр.
Например вот на Бэйсике исходник в книге 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-х мне она не встречалась как-то ! ;-)
Вложенные процедуры?
Нет. Не получается.
Я сначала неправильно подумал про рекурсивный вызов и ничего этого не получил.
А теперь сделал небольшой пример - внутри внешней процедуры объявил две функции и получил то, что надо.
(*$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
По поводу "той самой КЭ" совсем недавно обсуждалось на страницах журнала DOWNGRADE (http://dgmag.in/list.htm#old_games) и в теме
https://zx-pk.ru/threads/13979-zhurnal-downgrade.html?p=1087156&viewfull=1#post1087156
{$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 , в 90-х мне она не встречалась как-то ! ;-):) Эта игрушка мне попалась на Искре-226 в расширенном комплекте - с 8" дискетами и диском Изот-1370. У меня тогда была Э-60 с ЭПМ "Консул" и перфоленточным оборудованием. Как раз, в это время, к нам в политеховскую лабораторию занесло на практику какую-то студентку. Мне предложили загрузить ее хоть чем нибудь, так я взял с той Искры листинг этой игрушки и посадил практикантку набирать этот текст, в перфоленточном Бейсике Э-60. Перфоленту эту я сохранил, когда получилось завести на Э-60 RT11, я скормил эту ПЛ РТ-шному Бейсику, вот это и есть та самая Анчурия.
Реверс, можно сказать, завершён.
Различие с оригиналом в трёх байтах:
Comparing files KINGOM.SAV and KINGOM.GME
00000028: 0E 10 -- это в заголовке различие в длине на слово, возможно, из-за другой версии компилятора
00004824: 5F 0E -- это символ переключениия на русский в КОИ7 я заменил на "_"
00004A80: 5F 0E -- то же
Comparing files KINGOM.SAV and KINGOM.GME
00000028: 0E 10 -- это в заголовке различие в длине на слово, возможно, из-за другой версии компилятора
Есть у меня подозрение, что увеличенный на 2 адрес конца программы делался программой LINK в третьей или четвёртой версии RT-11. Ведь кроме версии 5.x и её аналога ФОДОС В03.00, были ещё ФОДОС В02.00 и ОС ДВК.
Ура, поздравляю! :)
Кстати у меня такая мысль возникла. Ведь можно же так же "развернуть" до паскалевского исходника и самую первую версию тетриса.
Мировое сообщество будет в восторге, ведь это тот самый (тм) тетрис из скобочек!
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot