예 1부터 20까지 합하기

상수 시간에 계산하는 공식이 있다.

하지만 6502는 곱셉 니모닉이 없기 때문에 반복문으로 해결할 수 밖에 없다.

while 문을 이용하기

MAX=20

최대값을 나타내는 상수

index=$10

색인을 저장하는 변수

  • 제로 페이지에 위치한다

out=$11

최종 결과를 저장하는 변수

  • 제로 페이지에 위치한다

clc

올바른 덧셈을 위한 사전 작업

lda #0

0부터 누적해서 더하기 위해 Accumulator 에 로드했다.

ldaN, Z 플래그 를 바꾼다.

ldx #1

X 레지스터즉시 모드 로 1을 로드했다.

색인 용도

cpx #MAX+1

X 레지스터 의 값 과 최대 루프 수(값)을 비교한다.

  • 20 까지 더한 뒤 다음 루프인지 확인하는 개념이다.

beq exit

X 레지스터 의 값이 21이면 exit으로 분기한다.

  • 21번째 루프일 때 분기
  • “X == 21” 조건을 비교

stx index

X 레지스터 의 현재값(루프 인덱스)를 index 변수에 저장한다.

X 레지스터 의 값을 바로 누산기에 더하는 방법은 없다. 따라서 메모리(index 변수)에 X 레지스터의 값을 저장했다.

adc index

index 변수의 값을 Accumulator 에 누적해서 더한다.

inx

X 레지스터 의 값을 증가시켰다.

jmp loop

처음 반복문으로 돌아간다.

  • 루프

반복문을 진행하면 누적해서 더한다

반복문을 진행하다가 X 레지스터 의 값이 21이 되었을 때 cpx 하면 Z, C 플래그가 켜진다.

  • 받아 내림 발생 X
  • 결과 비트의 모든 비트가 0이 된다.

sta out

점프해서 exit 으로 이동했다.

누산기의 값을 결과 변수에 저장했다.

바이트와 사이클

코드 크기(바이트)는 언제나 고정이다.

사이클은 루프 회차(N)에 비례해서 증가한다.

사이클을 꽤나 사용했다.