2017-04-19 6 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 파일의


헥스 덤프는 다음과 같습니다

(doynax에서 알 수 있듯이) 귀하의 경우 $의 C000 메모리의 높은 영역으로 데이터를로드는, 메모리 포인터가 고장 때때로 후
00 c0 a9 00 8d 20 d0 60 
+1

BASIC 환경의 메모리 포인터를 버리는 것 같습니다. 얼핏 보면 빌드 스크립트는 합리적인 것처럼 보입니다.'$ C000'로드 주소를 내보내고 존중해야합니다. 결과 바이너리의 HEX 덤프를 표시 할 수 있습니까? – doynax

+2

', 8,1'을로드하고'sys 49152'를 사용하여 실행해야합니다. 기본 동작은 아마도 기본 프로그램에 맞게 조정됩니다. – Jester

+0

@Jester 에뮬레이터가 자동으로', 8,1'과 함께로드되고 문제가 발생합니다. 나는', 8'로 로딩을 시도했지만 아무런 문제가 없었다. – wizofwor

답변

6

이것은 코모도어 64가 어떻게 프로그램을로드하는지 아티팩트 한 것처럼 보입니다. LOAD 명령을 사용하여 메모리에 내용을로드하면 다양한 BASIC 데이터 영역의 시작과 끝 포인터가로드 된 프로그램 바로 다음의 주소로 설정됩니다. 따라서 $ C000에로드 된 6 바이트 프로그램의 경우이 포인터는 $ C006으로 설정됩니다. 그러나 기본 메모리 포인터의 끝은 $ A000입니다. 이것은 BASIC의 데이터 영역에 대한 포인터가 BASIC이 사용할 수있는 최대 주소보다 높기 때문에 잘못된 상황을 만듭니다. BASIC의 메모리가 부족한 것처럼 보입니다.

일반적으로 이것은 문제가되지 않습니다. 어셈블리 프로그램은 $ C000으로만로드 할 수 있습니다. 따라서 프로그램을로드 한 후 일반적으로 가장 먼저 수행해야하는 작업은 Jester에서 언급 한 것처럼 SYS 49152을 입력하여 프로그램을 실행하는 것입니다. 프로그램을로드하고 바로 실행하지 않으려면 Peter Kofler의 답변에 나온대로 NEW 명령을 사용하여 유효하지 않은 포인터 문제를 해결할 수 있습니다. 코드를 $ C000으로로드 한 상태에서 올바른 기본 상태로 포인터를 재설정해야합니다. 수정되지 않은.

4

. 이 문제를 해결하려면

NEW 

해야합니다. 기본 메모리 포인터가로드 된 파일의 끝으로 업데이트됩니다. 파일이 $ A000 이후에 끝나면 기본 메모리가 없어서 OUT OF MEMORY ERROR이됩니다. 그 후에 $를로드 할 수 있습니다. Basic 코드가 없으므로 아무런 해가 없습니다.

내가 사용하는 도구를 모르지만 Jester에서 언급했듯이로드 주소가 존중되도록 코드를 8,1로로드해야합니다. 공유 한 코드가 정확합니다.로드 주소 인 처음 2 바이트로 00 C0으로 시작합니다.

load "$",8이 성공하고 파일이 디스크에 있으면 ,8,1을로드 한 다음 sys 49152 (0xC000)을 시도하십시오.

+0

'NEW' 명령이 작동하지만 왜이 문제가 있는지 이해하지 못했습니다. 'load "file", 8,1'을 써서 수동으로 파일을로드하면 같은 문제가 발생합니다. 'load "파일을 쓸 때 문제가 없습니다. – wizofwor

+0

@wizofwor LOAD FILE을 쓸 때, 파일은 $ C000에서 메모리로로드되지 않지만 기본 메모리는 $ 0801에서 시작됩니다. 'SYS2049'를 사용하여 거기에서 시작해야하며, 이것은 기계 프로그램이 코드 나 데이터의 절대 주소 지정을 사용하지 않기 때문에 작동합니다. – BlackJack