Портирование с кода клона Santaka ZX Spectrum на Z80 для компиляции игры Santaka - как перевести на этот диалект?

Это продолжение https://retrocomputing.stackexchange.com/questions/27077 .

Пытаюсь портировать игру отца для компилятора Z80. Мне удалось прочитать учебные пособия и другие ресурсы (например, другие примеры программирования на BASIC) для решения примитивных проблем с компиляцией игры, но они до сих пор не решены мной:

      dump.bas:182: error: Syntax Error. Unexpected token 'INT' <INT>
6220 GO TO 6221 ; INT(RND*3)*4
dump.bas:206: error: Operator AND cannot be used with STRINGS
7040 PRINT AT y(e)-1,x(e)+1;"__" AND r(e)=1
dump.bas:291: error: Cannot convert value to string. Use STR() function
dump.bas:292: error: Cannot convert value to string. Use STR() function
 9992 READ L$: LET L=LEN L$: LET S=0: LET K=2: LET N=N+1
 9993 IF L=0 THEN RETURN 
dump.bas:295: error: Cannot convert string to a value. Use VAL() function
9996 IF K<L THEN POKE A,C: LET S=S+C: LET K=K+2: LET A=A+1: GO TO 9994

Таким образом, для первой ошибки точка с запятой не распознается. Возможно ли на диалекте BASIC Z80 изменить этот код, чтобы он работал? Для каждой строки я добавил соответствующий код, если подряд не две строки.

Кажется, это особый диалект. Как мне его портировать для компилятора zxbasic (Z80)?

Или этот код поврежден из-за использования плохого преобразователя TAP?

У меня все еще есть записанный на ленту файл .WAV.

1 ответ

Вот моя попытка расколоть этот орех.

Проблема 1

      dump.bas:182: error: Syntax Error. Unexpected token 'INT' <INT>
6220 GO TO 6221 ; INT(RND*3)*4

Точка с запятой обычно не является оператором или токеном в BASIC, за исключениемPRINTзаявления. Кроме того, это уже следующая строка, что не имеет смысла — не будет строк, которые можно было бы пропустить. Более того, он просто висит там. Все это подразумевает, что это может быть реализация таблицы переходов.

Синклер БЕЙСИКRNDвозвращает значения [0,1) , таким образомINT(RND*3)*4выдаст значения 0, 4 или 8. Вы упомянули, что код мог быть поврежден, и это весьма вероятно для старых лент. Значение точки с запятой в шестнадцатеричном формате равно 0x3B, а знака плюса — 0x2B — разница составляет один бит.

Поэтому я бы поспорил, что строка должна быть такой:

      6220 GO TO 6221 + INT(RND*3)*4

Код вашего отца совершает случайный переход на 6221, 6225 или 6229, что легко проверить, просмотрев еще немного кода.

Проблема 2

      dump.bas:206: error: Operator AND cannot be used with STRINGS
7040 PRINT AT y(e)-1,x(e)+1;"__" AND r(e)=1

Sinclair BASIC позволяет использоватьANDсо струнами. Это встроенное условие, указывающее, что строка должна выводиться только в том случае, если условие возвращает ненулевое значение. Это описано в главе 13 руководства по программированию ZXSpectrum BASIC . Я бы сказал, что используемая вами среда BASIC (вы не указываете какую) не совместима с ZXSpectrum BASIC.

Пример того, как это работает на ZXSpectrum 48k BASIC. Первые две строки — это результат работы программы под ней. Цветные акценты добавлены мной.

Проблема 3

      dump.bas:291: error: Cannot convert value to string. Use STR() function
dump.bas:292: error: Cannot convert value to string. Use STR() function
9992 READ L$: LET L=LEN L$: LET S=0: LET K=2: LET N=N+1
9993 IF L=0 THEN RETURN 
dump.bas:295: error: Cannot convert string to a value. Use VAL() function
9996 IF K<L THEN POKE A,C: LET S=S+C: LET K=K+2: LET A=A+1: GO TO 9994

Я снова считаю, что ваша среда BASIC несовместима с ZXSpectrum BASIC, который позволяет называть числовые и строковые переменные одним и тем же идентификатором.

Строка 9992 считывает определение DATA в строку.L$а затем присваивает длину строки числовой переменной. Возможно, это сбивает с толку, но работает в ZX BASIC. Ошибка в строке 9993IF L=0является результатом реализации BASIC, которую вы используете, думая, чтоLэто строка. То же самое со строкой 9996.IF K<L.

Пример из ZXSpectrum 48k BASIC:

Краткое содержание

Диалекты BASIC сильно различаются, и многие (большинство?) программ нелегко переносить из одной среды в другую. Как предложено в упомянутом вопросе, лучше всего запустить программу в эмуляторе.

Когда вы пишете вопрос, пожалуйста, включите как можно больше соответствующей информации и контекста. Эти три проблемы было довольно легко обнаружить, но это сэкономило бы некоторое время, если бы у меня был хотя бы код, окружающий первую проблему.GO TOлиния.

Наконец, не существует «Z80 BASIC» или «Компилятора Z80». Я думаю, вы, возможно, используете boriel/zxbasic, но вам наверняка следовало упомянуть, с какой средой у вас проблемы.

Постскриптум

Удачи в восстановлении кода твоего отца. Я думаю, что это отличная идея, и я надеюсь, что вам удастся ее реализовать!

Другие вопросы по тегам