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 레지스터”에 저장된 값 num00080 주소에 저장한다.

NOT 연산

복습 퀴즈

VAL에 대한 NOT 비트 연산을 구현한 코드는 무엇인가요?

VAL=%01011000
 
	lda #VAL
	eor #%11111111