패미컴 게임을 만들어보자! 4번째 6502 addressing modes

HyunsubYun·2023년 3월 26일
0

어셈블리를 처음부터 하려니 정말 어려운거 같다 심지어 자료가 영어로 돼 있어서
해석먼저 하는게 고역이다.

오늘 배운 내용은 6502 프로세서의 어드레싱 모드다

immediate: 말그대로 즉각적으로 값을 넣는 모드다 주소 형식으로 값을 보내는 것이 아니라 매우 직관적이고 사용할땐 # 사인을 앞에 붙인다
ex) LDA #10 ;Accumulator에 십진수 10 값을 로드한다.

direct: direct 모드는 주소를 직접적으로 보내어 그 주소에 있는 값을 참조하는 모드다. 주소에 어떤값이 있는지만 생각하면 돼 사용하기 편하다.
ex)LDA $1011 ;Accumulator에 $(16진수)1011 번지에 있는 값을 로드한다.

indexed direct: 여기서부턴 X,Y레지스터를 사용한다. 주소,X or Y의 형태로 사용하고 주어진 주소에 X 혹은 Y 레지스터에 있는 값만큼 더한 뒤의 주소를 참조한다.
루프를 사용하여 여러 주소를 참조할때 사용하는 용도로 활용할 수 있을 것 같다.(아직 실제로 만든 프로그램이 없어서 확실하지 않음)
ex)LDA $1010, X;Accumulator에 ($1010 + X 레지스터에 있는 값) 번지에 있는 값을 로드한다.

indirect:간접 주소 지정 방식이라고 부른다. 주소에 소괄호(parentheses)를 붙이는 방식으로 사용하고 주어진 주소값에 있는 값과 그 다음 주소가 가진 값의 주소를 참조한다 예를들어 ($1530)이 주어지면 $1530에 있는 값과 $1531에 있는 값을 참조하고 $(1531의 값 2자리)($1530의 값 2자리)로 주소를 만들어 그 주소를 참조하는 것이다. 이 방법은 아직 활용도를 잘 모르겠다. direct를 사용하면 직관적이고 편할텐데 언젠간 유용하게 사용하지 않을까 싶다.
이 방식은 6502 프로세서에선 오직 JMP 문에서만 사용이 된다고 한다.
ex)JMP ($1530);$1530과 다음 바이트 $1531의 값을 참조하여 그 4자리 값의 주소로 점프한다.

pre indexed indirect:사전 인덱스 간접 주소 지정방식이라 부른다. (주소, X)의 형식으로 사용되고 주어진 주소에 X레지스터를 더한 만큼의 주소를 참조한다.
pre indexed indirect 방식은 제로페이지(주소 앞자리가 $00인것들 보통00이 생략된 두자리만 주소로 입력한다)에서만 작동한다.

만약 ($FF, X)에서 X 레지스터 값이 $10일때 $FF+$10은 $109가 되지만 무조건 제로페이지에서만 작동해야되므로 자동으로 $09라는 값으로 변경된다.
ex)LDA $0030, X; X레지스터에 5라는 값이 있을시 $0030+5 = $0035의 주소의 값을 accumulator에 로드한다.

post indexed indirect:사후 인덱스 간접 주소 지정방식이라 부른다. (주소),Y의 형식으로 사용되고 주어진 주소의 값에 Y 레지스터 값만큼 더한 값의 주소를 참조한다.
ex)LDA ($1010),Y ;만약 $1010에 있는 값이 $65이고 Y레지스터 값이 $15라면 $65+$15 = $7A 의 주소에 있는 값을 accumulator에 로드하는 것이다.

relative:관계형 주소 지정방식이다. 이 방법은 오직 branch instruction(특정 분기로 넘어가는 명령)에서만 사용된다. 이 방식은 돌아가는 현재 주소와 넘어가는 분기의 주소의 차이만큼을 구해서 그만큼 넘어가는 방식이다. 프로그래머의 레벨에선 보통 label을 만들어놓거나 직접적인 주소를 넘겨주는 방식으로 이를 사용하기 때문에 큰 어려움은 없지만 이것을 사용할때 주의할 점은 기계어 branch 연산은 1바이트로 제한돼 있기 때문에 -128~+127사이의 이동만 가능하다는 것을 명심해야 한다.

참고문헌:https://www.google.com/search?q=6502+assembly+language+programming&biw=2009&bih=1078&ei=xPEfZP6FPKmbseMPq4qFgAs&ved=2ahUKEwjCpduFh_n9AhUjT2wGHXFdBWYQnZMFegQIWRAC&uact=5&oq=6502+assembly+language+programming&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzIJCAAQDRCABBATMgkILhANEIAEEBMyBggAEB4QEzoKCAAQRxDWBBCwAzoICAAQCBAeEBM6BQgAEIAEOgQIABAeOgcIABCABBATOgcILhCABBATOgUIIRCgAUoECEEYAFCyBVjjQ2DeRGgDcAF4AYAB1wGIAfwtkgEGMC40MC4ymAEAoAEByAEKwAEB&sclient=gws-wiz-serp&si=AMnBZoG3LdTOK9CLLaTEr5J1eNwT-OeISTB05biqpUHGWTy7eo1oqIkKxC_u4FcfCfflqPhGz-9yIVm3Ur2QgSknJexxGFhJadTlKOARScOQoXFCrTbAHMdATSBkSS39WOXoA-ha4MuX&ictx=1

profile
게임 개발 지망생 입니다

0개의 댓글