2015-01-31 7 views
9

6510 어셈블리를 배우려고하고 있고 데비안을 실행하고 있으므로 xa65는 사용하려는 어셈블러입니다.xa65 어셈블러를 사용하여 Commodore 64를 생성하십시오.

내가 지금까지 그렇게 보이는 코드의 조각을 작성했습니다 :

*=$0801 
.byte $0c, $08, $0a, $00, $9e, $20 
.byte $34, $30, $39, $36, $00, $00 
.byte $00 

*=$1000 
INC 53280 
INC 53281 
JMP $1000 

이제 첫 .byte 섹션이 suposed있다 "자동 시작"한 번로드 된 프로그램. 이것은 튜토리얼에서 발견 한 것으로, SYS 4096 만 실행하면 CPU가 주소 $ 1000의 코드를 실행하기 시작한다는 것을 이해할 수 있습니다.

나머지 코드는 간단히 외부 및 내부 테두리를 깜박 거리기 시작해야합니다. C64와 영원히 반복합니다.

xa test.s -o test.prg 

을하고 나는 그것을 테스트 할 VICE에 TEST.PRG로드하려고 :

것은이 단순히 다음 실행 조립합니다. LOAD "TEST.PRG", 8,1 : 그리고로드 파일이 자동 시작하지 않는 경우에도 내가 RUN을 입력하면 아무 일도 일어나지 않습니다. 그리고 LIST를 입력해도 동일합니다 - 유일한 결과는 유명한 READY입니다. 평소처럼 커서가 아주 행복하게 깜박입니다.

자동 시작 물건을 제거하고 * = $ 1000에서 시작하는 코드 만 어셈블했지만 동일한 결과가 나타납니다. SYS 4096으로 시작하려고하면 READY와 아무것도 표시되지 않습니다.

필자는 xa 어셈블러를 제대로 사용하지 않을 것이라고 확신하지만, C64를 사용하기 위해 적절한 PRG 파일을 만드는 방법을 알지 못합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

FWIW 시퀀스 '$ 34, $ 30, $ 39, $ 36'은 단순히 '4096'에 대한 ASCII (PETSCII) 인코딩입니다. 다른 곳에서 기계 코드를로드하려는 경우 변경하면됩니다. '$ 9E'는'SYS'의 기본 토큰입니다. '$ 0a $ 00'은 줄 번호 (10)입니다. '$ 0c, $ 08'는 다음 행의 시작 주소입니다. – JeremyP

답변

4

나는 당신의 질문을 만났을 때 xa65를 어떻게 출력하는지 알아 내려고 노력했고 어떻게 작동 하는지를 배웠습니다. 여기 내가 찾은 것이 있습니다.

jester가 말했듯이 PC 설정시 패딩을 수행하지 않으므로 코드가 $1000이되지 않습니다. .dsb 지시문을 사용하여 xa65에서 지원되는이지만 일부 어셈블러의 .org 지시문에서 허용하는 것처럼 주소가 아닌 지시문에 여러 바이트를 지정해야합니다.어셈블러에서 단순한 산술 연산을 허용하므로 바이트 수는 <desired address> - PC에 의해 제공됩니다.

누락 된 .prg 주소 헤더를 추가하고 두 번째 PC 변경을 패딩 지시문으로 변경하면 결과가 예상대로 작동합니다. 그러나 이것은 여전히 ​​자동 시작으로 만들지 않습니다. 그래도 LOAD "TEST.PRG",8,1:RUN이 작동합니다.

.byte $01, $08 ; Load this .prg into $0801 

*=$0801 
.byte $0c, $08, $0a, $00, $9e, $20 
.byte $34, $30, $39, $36, $00, $00 
.byte $00 

.dsb $1000 - * ; Pad with zeroes from PC to $1000 

INC 53280 
INC 53281 
JMP $1000 

FWIW는, 패딩 방법을 사용하는 방법을 xa65의 문서에 즉시 명확하지 않았다 (나에게, 적어도).

+0

고마워요. - 제 하루 (또는 밤이 오히려)였습니다. – Waxhead

4

내가 기억하는 한 $0801basic 프로그램의 시작 주소이고 아무 것도 자동 시작하지 않습니다. 자동 시작하려면 트릭을해야했습니다.

$1000으로 어셈블하고 sys 4096을 사용하여 프로그램을 시작하기 만하면됩니다. 어셈블리 도우미가 자주 사용하는 영역은 일반 basic 프로그램을 방해하지 않으므로 $c000 (sys 49152)입니다.


나는 xa65에 익숙하지 오전하지만 내 테스트에 따라 당신은 *에하지 패드 파일을 지정 않은 경우. 따라서 $1000에있을 것으로 예상되는 코드는 실제로 존재하지 않습니다. 실제로는 이전 블록 바로 뒤에 있습니다. 또한 c64 prg 형식에서는 처음 두 바이트의 시작 주소가 필요하므로 xa64도 채워지지 않는 것으로 보입니다. 나는 일이 그럭저럭 한 : sys 4096

*=$0FFE 
.byte $00, $10 
INC 53280 
INC 53281 
JMP $1000 

시작.

PS : VICE에는 내장 모니터 (컴퓨터 수준 디버거)가 있습니다.

+0

사실 내 질문에 SYS 4096으로 시작하려고했음을 포함하도록 편집했습니다. $ 0801 이후의 데이터는 SYS 4096을 실행하는 기본 프로그램으로 간주됩니다.) – Waxhead

+0

아, 그래, 바이트로 인코딩되어 있습니다. 버전'sys 4096'. 자동 시작하지는 않지만 실행하려면 시작해야합니다. – Jester

1

저는 개인적으로 CC65 패키지의 CA65를 사용하고 있으며 이에 적합한 매크로를 발견했습니다.

"왜 이렇게 어려운지"궁금한 점이 있다면, 주소 중 하나 (컴퓨터 코드가 시작되는 곳)를 10 진수 문자열로 변환해야한다는 것입니다. 여기

당신이 VIC-20, 실제로 그 미스터리 .byte 년대가 무엇인지 알려줍니다 비슷한 솔루션을 볼 수 http://techtinkering.com/2013/05/10/adding-a-basic-stub-to-a-vic-20-assembly-language-program/

필자는 개인적으로 매크로 다음을 사용 (나는 그것이 C64에 동일합니다 가정) CA65에 기본 스텁을 만듭니다 자리

.macro Address address, digits 
.ifblank digits 
    dig=5 
.else 
    dig=digits 
.endif 
.if dig>4 
    .byte <(((address/1000) .mod 10) + $30) 
.endif 
.byte <(((address/100) .mod 10) + $30) 
.byte <(((address/10 ) .mod 10) + $30) 
.byte <(((address) .mod 10) + $30) 

.endmacro

는 arg를, 당신은 c를 자릿수를 4로 설정하십시오. 그렇지 않으면 SYS 04096과 같은 코드가 생깁니다 (큰 거래는 아니지만 1k 소개에 여분의 바이트를 낭비하지 않으려 고합니다.) -

.byte $ 01, $ 08 -은 16 비트 값을 "최하위 바이트 우선"형식으로 삽입합니다.