6502의 논리 연산

A와 M 사이의 논리 연산
- 각 비트 별로 연산
- 결과는 A에 저장
adc와 유사한 매커니즘
각 비트 별로 and, or xor

영향받는 플래그: N, Z
“캐리 플래그”, “오버플로 플래그” 는 산술 연산에 적용되는 개념이죠? 논리 연산에 적용되면 이상해
“음수 플래그”는 산술 연산에만 적용될 것 같지만, 영향 받는구나
“제로 플래그”는 결과 비트가 모두 0이면 된다.

예 1: 비트 마스킹

lda #VAL and #MASK0
결과 비트는 %01000000 로 “A 레지스터”에 저장된다.
- “제로 플래그”는 켜지지 않는다.
- “음수 플래그”도 켜지지 않는다.
lda #VAL and #MASK1
결과 비트는 %00000000 로 “A 레지스터”에 저장된다.
- “제로 플래그”는 켜진다.
- “음수 플래그”는 켜지지 않는다.
예2: 대문자 → 소문자

ch=$80
021. 상수, 포인터 변수로 리터럴에 이름을 지어준다.
lda ch
“ZP 주소지정 모드”로 “A 레지스터”에 제로페이지 $80의 값을 로드한다.
- $80 은 8비트잖아!
ora #MASK
32랑 OR 연산으로 “bit 5”를 킨다. 따라서 65 → 97, ‘A’ → ‘a’
- 제로피이지 41 이라고 가정하자.
예 3: eor를 사용한 두 수 교환

lda num0 eor num1 sta num0
다음과 같이 표기해보자
- $0080 주소의 값 == num0
- $0081 주소의 값 == num1
“A 레지스터”에 num0 ^ num1 이 저장된다.
$0080에 “A 레지스터”의 값 num0 ^ num1이 저장된다.
eor num1 sta num1
“A 레지스터”에 num0 ^ num1 ^ num1 이 저장된다.
$0081에 “A 레지스터”의 값 num0 ^ num1 ^ num1 이 저장된다.
- 이 값은
num0과 동일하다
eor num0 sta num0
“A 레지스터”에 num0 ^ num1 ^ num1 ^ ($0080에 저장된 값)이 저장된다.
$0080에 저장된 값은num0 ^ num1- 최종적으로 계산하면
num1이 저장된다.
$0080에 “A 레지스터”의 값 num1이 저장된다.
25사이클이라 개선해보자
더 나은 두 수 교환

lda num0 ldx num1 sta num1 stx num0
“A 레지스터”에 임시로 0081 주소의 값 num1을 로드한다.
“A 레지스터”에 저장된 값 num0을 0080 주소에 저장한다.
NOT 연산



복습 퀴즈
VAL에 대한 NOT 비트 연산을 구현한 코드는 무엇인가요?
VAL=%01011000
lda #VAL
eor #%11111111