예: 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 레지스터 에 문자 ’.’을 저장한다.
- 즉시 주소지정 모드
- 021. 상수, 포인터 변수의 상수 표기법 참고

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에는 활용되지 않구나?!