BIOS 비디오 INT 10h와 속성 바이트 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
# 54.BIOS 비디오 INT 10h와 속성 바이트 문서의 계산 확인. 실행: python3 54_bios-video-int10h_verify.py
# 화면에 실제로 그리지 않는다. 속성 바이트와 레지스터 값의 비트 계산만 확인한다.
BLUE, GREEN, RED, INTENSITY = 0b0001, 0b0010, 0b0100, 0b1000
def attribute(background, foreground):
"""(배경 SHL 4) OR 글자색"""
return ((background << 4) | foreground) & 0xFF
def split(attr):
return attr >> 4, attr & 0x0F
if __name__ == "__main__":
# 색 4비트
light_gray = RED | GREEN | BLUE
white = INTENSITY | RED | GREEN | BLUE
cyan = GREEN | BLUE
magenta = RED | BLUE
assert (light_gray, white, cyan, magenta) == (0b0111, 0b1111, 0b0011, 0b0101)
# 속성 바이트
assert attribute(BLUE, light_gray) == 0x17
assert attribute(RED, white) == 0x4F
# SHL 4 = × 16. Irvine32에서 쓰는 yellow + (blue * 16)과 같은 계산
yellow = INTENSITY | RED | GREEN
assert yellow == 14 and yellow + BLUE * 16 == attribute(BLUE, yellow) == 0x1E
# 겹치는 비트가 없으니 더하기와 OR가 같다 (모든 조합 전수)
for bg in range(16):
for fg in range(16):
a = attribute(bg, fg)
assert a == bg * 16 + fg and split(a) == (bg, fg)
# 보통 속성 7 = 검은 배경에 밝은 회색 글자 (Clrscr의 bh,7)
assert split(0x07) == (0, light_gray)
# or bl,10000000b: 맨 윗비트만 켠다
for bl in range(256):
r = bl | 0b10000000
assert r & 0x80 and (r & 0x7F) == (bl & 0x7F)
assert 0x17 | 0x80 == 0x97
# Clrscr: mov ax,0600h -> AH=6(위로 스크롤), AL=0
assert (0x0600 >> 8, 0x0600 & 0xFF) == (6, 0)
# mov cx,0 -> CH=0, CL=0 (왼쪽 위 0,0). mov dx,184Fh -> DH=24, DL=79
assert (0x184F >> 8, 0x184F & 0xFF) == (24, 79)
# 25줄 × 80칸, 칸마다 글자 1바이트 + 속성 1바이트 = 4,000바이트
assert 25 * 80 * 2 == 4000
# 카드 C2: 파란 배경 노란 글자 = 1Eh, 깜빡임 비트까지 켜면 9Eh
assert attribute(BLUE, yellow) | 0x80 == 0x9E
# 카드 C3: 속성 4Eh -> 배경 4(빨강), 글자 14(노랑)
assert split(0x4E) == (RED, yellow)
print("ALL CHECKS PASSED")