2017-04-19 49 views
1

當我試圖在返回的彙編程序之後獲取磁盤的目錄列表時,我得到?OUT OF MEMORY ERROR在VICE仿真器中加載PRG文件後C64內存不足錯誤

我已經準備了一個簡單的程序只是爲了瞭解發生了什麼事,例如:

*=$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 
+1

你似乎在搗毀BASIC環境的內存指針。乍一看,構建腳本看起來很合理,但應該發出並尊重'$ C000'加載地址。你能告訴我們一個十六進制轉儲結果的二進制文件嗎? – doynax

+2

您需要使用',8,1'加載並使用'sys 49152'運行它。默認行爲可能是爲基本程序量身定製的。 – Jester

+0

@Jester模擬器自動加載',8,1'和問題appreas。我嘗試用',8'加載,沒有問題。 – wizofwor

回答

6

這似乎只是Commodore 64加載程序的一個神器。當您使用LOAD命令在內存中加載某些內容時,指向各種BASIC數據區域開始和結束的指針將在加載的程序之後立即設置爲地址。因此對於在$ C000中加載的6字節程序,這些指針設置爲$ C006。但BASIC內存指針的結尾保持在$ A000。這會導致無效情況,因爲指向BASIC數據區域的指針高於BASIC允許使用的最大地址。它最終看起來像BASIC已經耗盡內存。

通常這不是問題。您只能將彙編程序加載到$ C000,加載程序後通常只做第一件事,而且只能通過輸入SYS 49152執行程序,如Jester提到的。如果你想加載程序但不立即執行它,你可以使用Peter Kofler的答案中給出的NEW命令修復無效指針問題,這應該將指針重置爲其有效的默認狀態,同時將代碼加載到$ C000修改。

4

後有時將數據加載到內存較高的地區,你的情況$ C000,內存指針被打破(如doynax建議)。你需要做一個

NEW 

來解決這個問題。 (基本內存指針更新到加載文件的末尾,如果您的文件在$ A000之後結束,則基本內存不足,導致OUT OF MEMORY ERROR)。之後,您將能夠加載$。由於您沒有基本代碼,因此不會造成任何傷害。

我不知道你正在使用的工具,但正如Jester所說,你的代碼需要被加載爲8,1,所以加載地址是受到尊重的。您共享的代碼是正確的,它以00 C0作爲前兩個字節(它們是加載地址)開始。

如果load "$",8成功並且您的文件在磁盤上,請嘗試加載它,8,1,然後嘗試sys 49152(這是0xC000)。

+0

'新'命令的作品,但我不明白爲什麼我有這個問題。如果我通過編寫'load'文件手動加載文件,8,1'同樣的問題appreas。當我寫'加載'文件「時,8沒有問題。 – wizofwor

+0

@wizofwor當你寫'LOAD'FILE',8'時出現一個問題:該文件沒有被加載到$ C000內存中,而是在BASIC內存中以$ 0801開始。你需要用'SYS2049'來啓動它,並且只能用於你的機器程序不使用代碼或數據的絕對尋址。 – BlackJack