예: LCD 문자열 패딩하기

; LCD에 문자열을 출력하는 코드 …

생략했다.

; X 문자열 길이 ; Y LCD 커서의 열 위치

LCD에 문자열을 출력하는 코드 실행 결과 X 레지스터 에는 문자열의 길이가 저장된다. Y 레지스터 에는 LCD 커서 열 위치가 저장된다.

out=4001

4001 주소에 열의 위치가 저장

thanks 를 출력했다.

X: 6 Y: 6

txa

X의 값을 A에 옮긴다.

  • 나머지 연산을 하기 위해서 옮긴다.

and #$00000011

4로 나머지 연산

즉시 주소지정 모드

결과적으로 A: 2

beq pad0

and 결과 비트가 모두 0인지 여부에 따라 Z 플래그 가 결정된다.

결과 비트가 모두 0인 경우 즉, Z 플래그가 0인 경우 4로 나누어 떨어진다는 뜻이기 때문에 패딩할 필요 없다.

레이블 pad0으로 분기

thanks 를 출력한 경우 A 플래그 값이 2다. 따라서 Z 플래그 는 0이다. 분기하지 않고 진행

ldx # ‘.

X 레지스터 에 문자 ’.’을 저장한다.

cmp #3 beq pad1

A 레지스터 의 값을 3과 비교한다. 3이라면 beq 레이블 로 점프한다.

pad1: stx out iny sty column

X 레지스터 의 값’.‘을 out 변수 에 저장한다.

  • 패딩 1개를 찍은 것

Y 레지스터 의 값 증가, 열 색인을 증가 시킨다.

증가된 열 색인을 column 변수 에 저장한다.

cmp #2 beq pad2

A 레지스터 의 값이 2면 pad2 로 점프한다.

thanks 를 출력한 이번 입력의 경우 pad2 레이블로 이동한다.

pad2: stx out

X 레지스터 의 값’.‘을 out 변수 에 저장한다.

[INFO] 슬라이드의 오른쪽 출력을보면 thanks. 이라고 . 이 추가되엇다. stx out 을 실행하면 LCD에 X 레지스터 에 저장된 값을 출력한다.

iny sty column

Y 레지스터 의 값 증가, 열 색인을 증가 시킨다.

증가된 열 색인을 column 변수 에 저장한다.

[INFO] sty column 을 실행하면 다음 LCD에서 다음에 출력할 열을 알 수 있게 된다.

thanks 를 출력한 이번 입력의 경우 pad2 레이블로 이동하고, 그대로 진행해 pad1 레이블의 코드도 실행된다.

똑같은 일을 반복하니 ..을 출력했다. 그리고 열 색인도 증가하고(커서 이동)

fall-through 처럼 동작하는 군

만약 문자열 길이가 255를 점는다면?

멀티 바이트 숫자 mod 4

바이트 0 & %00000011만 하면 됨

  • 상위 바이트들은 어차피 모두 0이 되니 무시

mod 연산의 특징을 활용한다.

  • 가장 왼쪽(하위) 바이트만 활용한다.
  • 멀티 바이트라도 mod에는 활용되지 않구나?!