예 1부터 20까지 합하기

상수 시간에 계산하는 공식이 있다.
하지만 6502는 곱셉 니모닉이 없기 때문에 반복문으로 해결할 수 밖에 없다.
while 문을 이용하기

MAX=20
최대값을 나타내는 상수
index=$10
색인을 저장하는 변수
- 제로 페이지에 위치한다
out=$11
최종 결과를 저장하는 변수
- 제로 페이지에 위치한다

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

lda #0
0부터 누적해서 더하기 위해 Accumulator 에 로드했다.
lda 는 N, Z 플래그 를 바꾼다.
- a == 0 참고

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)에 비례해서 증가한다.

사이클을 꽤나 사용했다.