Ошибка C64 нехватки памяти после загрузки файла PRG в эмуляторе VICE

Я получал ?OUT OF MEMORY ERROR, когда пытался получить список каталогов диска после возврата процедуры сборки.

Я подготовил простую процедуру, чтобы понять, что происходит, например:

*=$c000

 lda #$00
 sta $d020
 rts

И мой скрипт сборки:

C:\...\acme0.95.6win\acme.exe --outfile build\ROUTFILE --format cbm RSOURCEFILE
C:\...\tools\WinVICE-2.4-x64\x64.exe build\ROUTFILE

Когда я запускаю эмулятор сценария сборки, загружается файл PRG. Пытается запустить, но ничего не происходит, так как я не включил загрузчик BASIC. Даже после этого момента, если я напишу LOAD "$",8, чтобы получить список каталогов. Я получаю ?OUT OF MEMORY ERROR. Так что же не так в приведенном выше сценарии?


Шестнадцатеричный дамп файла PRG:

00 c0 a9 00 8d 20 d0 60 

person wizofwor    schedule 19.04.2017    source источник
comment
Кажется, вы портите указатели памяти среды BASIC. На первый взгляд сценарий сборки выглядит разумным и должен выдавать и учитывать адрес загрузки $C000. Можете ли вы показать нам дамп полученного двоичного файла в формате HEX?   -  person doynax    schedule 19.04.2017
comment
Вам нужно загрузиться с помощью ,8,1 и запустить его с помощью sys 49152. Поведение по умолчанию, вероятно, предназначено для базовых программ.   -  person Jester    schedule 19.04.2017
comment
@Jester эмулятор автоматически загружается с ,8,1, и проблема возникает. Я попытался загрузить с помощью ,8, и проблем не было.   -  person wizofwor    schedule 19.04.2017


Ответы (2)


Похоже, это всего лишь артефакт того, как Commodore 64 загружает программы. Когда вы используете команду LOAD для загрузки чего-либо в память, указатели на начало и конец различных областей данных BASIC устанавливаются на адрес сразу после загруженной программы. Таким образом, для 6-байтовой программы, загруженной в $C000, эти указатели устанавливаются в $C006. Однако конец указателя памяти BASIC остается на $A000. Это создает недопустимую ситуацию, поскольку указатели на области данных BASIC выше, чем максимальный адрес, который BASIC может использовать. В конечном итоге это выглядит так, как будто у BASIC закончилась память.

Обычно это не проблема. Вы можете загружать программы сборки только до $ C000, и обычно первое и единственное, что вы делаете после загрузки программы, - это запускаете программу, вводя SYS 49152, как упоминал Jester. Если вы хотите загрузить программу, но не выполнять ее сразу, вы можете исправить проблему с недопустимым указателем, используя команду NEW, как указано в ответе Питера Кофлера, это должно сбросить указатели в их допустимые состояния по умолчанию, оставив код загруженным в $ C000 неизмененный.

person Ross Ridge    schedule 19.04.2017

Иногда после загрузки данных в более высокие области памяти, в вашем случае $c000, указатель памяти не работает (как предполагает doynax). Вам нужно сделать

NEW

исправить это. (Указатель базовой памяти обновляется до конца загруженного файла. Если ваш файл заканчивается после $A000, у вас заканчивается основная память, что приводит к OUT OF MEMORY ERROR.) После этого вы сможете загрузить $. Поскольку у вас нет кода Basic, это не повредит.

Я не знаю, какие инструменты вы используете, но, как упомянул Jester, ваш код должен быть загружен как ,8,1, поэтому адрес загрузки соблюдается. Код, которым вы поделились, правильный, он начинается с 00 C0 в качестве первых двух байтов, которые являются адресом загрузки.

Если load "$",8 удалось, и ваш файл находится на диске, попробуйте загрузить его ,8,1, а затем попробуйте sys 49152 (то есть 0xC000).

person Peter Kofler    schedule 19.04.2017
comment
Команда NEW работает, но я не понял, почему у меня возникла эта проблема. Если я загружу файл вручную, написав load "file",8,1, возникнет та же проблема. Когда я пишу «загрузить файл», проблем нет. - person wizofwor; 19.04.2017
comment
@wizofwor Когда вы пишете LOAD"FILE",8, возникает проблема: файл не загружается в память с $C000, а в памяти BASIC начинается с $0801. Вам нужно начать его там с SYS2049, и это работает только потому, что ваша машинная программа не использует абсолютную адресацию кода или данных. - person BlackJack; 26.10.2017