KITAQ 개발 시스템
사용 설명서 2026.09

KITAQ SERIES • 참고 판본

검증 기록

확인한 실행 화면

첫 코드 한 줄부터 실행, 관찰, 재시험까지.
소스 스냅샷: 2026년 9월 14일 · 한국어판: 2026년 9월 14일

네이티브 컴파일러 검증

Windows, Linux, macOS ARM 및 macOS Intel에서 네이티브 빌드와 실행 검증이 성공했습니다. KITAQGB는 환경별 테스트 48개와 보조 도구 검사 395개, KITAQFC는 55개와 401개를 통과했습니다. Rust 1.85도 검증했습니다. PUBLIC_DISTRIBUTION.json은 배치한 바이너리의 해시와 검증 출처를 기록합니다. 공개 GitHub Actions는 이 소스를 독립적으로 빌드하고 검증합니다.

저장된 참조 출력으로 ROM 바이트, 진단 및 보조 도구 형식을 검사합니다. 이전 C# 에뮬레이터 검증은 원래 소스 지문에 해당하는 과거 기록입니다. 모든 Rust API, 실제 하드웨어 또는 FDS BIOS를 통한 완전한 게임 시작을 입증하지는 않습니다. 원본 PNG 변환 스크립트는 없어 사양으로 재구현했으며 원본과의 바이트 일치는 확인할 수 없습니다.

KITAQGB · SHA-256 · KITAQFC · SHA-256

2026-10-03 로컬 라이브러리 변경 사항과 검증

C:/kitaqgb_project/lib 소스를 공개 버전 2de7f4b와 비교했습니다. 수정 시각만으로 최신 버전을 판단할 수 없습니다. 로컬에는 추가 기능이 있고 공개 버전에는 별도의 추가 기능과 수정이 있습니다. 아래 설명은 저장한 로컬 소스를 대상으로 하며 기존 공개 API의 검증 기록과 구분합니다.

physics2d.c는 접촉 API를 유지하고 KQ2D_CACHE_SURFACE에서 접촉 및 속도 제한의 캐시 구현을 제공합니다. 활성화할 때 ROM 뱅크 13을 확보하세요. KQ2D_EXTERNAL_SCALE_Q8, KQ2D_EXTERNAL_REST_COMPONENT, KQ2D_EXTERNAL_SURFACE를 정의하면 해당 구현을 직접 제공해야 합니다. 아래 8,872건은 이 정의가 없는 기본 경로의 결과입니다.

KQ3D_BODY_SPHERE=0x04는 구와 상자의 접촉을 선택합니다. 반지름은 half_x입니다. kq3d_overlap_sphere_aabb(sphere, box)는 접하는 경계를 포함하며 NULL 또는 0 이하의 반지름이면 0을 반환합니다. 구끼리의 전용 해법은 없습니다. 좌표 차이, 곱과 제곱 합을 16비트 범위 안에 두세요.

KQ3D_BODY_KINEMATIC=0x02인 활성 body는 역질량이 0이어도 kq3d_step에서 X/Y 속도와 위치를 갱신합니다. Z 위치와 속도는 그대로입니다. 역질량 0인 body는 접촉으로 밀리지 않습니다. kq3d_integrate_body는 정적 body를 계속 건너뜁니다. break_speed와 KQ3D_BODY_BROKEN은 자동 파괴를 일으키지 않습니다.

로컬 bank_switch는 kq_bank_current와 주소 0x2000에 씁니다. 공개 __bankswitch 경로와 달리 컴파일러의 뱅크 추적 상태를 갱신하지 않습니다. 고정 뱅크에서 전환하고 컴파일러의 복귀 상태도 유지해야 한다면 __bankswitch를 사용하세요.

로컬 cgb_bg_color/cgb_obj_color와 단색 RGB 래퍼는 팔레트 인덱스의 자동 증가를 켜지 않습니다. CGB 실행에서 0x1234의 하위 바이트가 0x12로 덮이는 것을 확인했습니다. 공개 수정이나 colors 배열 API를 사용하세요. DMG에서는 쓰지 않습니다.

로컬 metasprite_draw는 정상 완료할 때만 사용 수를 first_id+count로 늘립니다. 40개 제한에서 조기 반환하면 갱신하지 않습니다. first_id=39, count=2에서 반환값 1, 슬롯 39 활성, 사용 수 0이었습니다. 공개 버전은 각 슬롯 처리 시 사용 수를 갱신합니다.

로컬에는 vram_get_queue_used와 vram_get_queue_free가 있지만 공개 vram_get_queue_capacity는 없습니다. 용량은 VRAM_QUEUE_MAX이며 기본값은 32입니다. 명령 하나를 등록하면 사용 1, 여유 31이었습니다.

wire3d_dmg.h의 DrawRect2D 선언은 96줄 프로필에만 있습니다. DrawBoxEdges2D는 두 프로필에, DrawIndexedEdges는 120줄 프로필에만 있습니다. 프로필에 맞는 소스를 하나 선택하세요. 이번에는 이 함수들의 화면 결과를 다시 검증하지 않았습니다. 저장한 lib 소스에는 DrawRect2D와 DrawBoxEdges2D 구현이 없습니다. 선언만 있으므로 호출하려면 별도 구현이 필요합니다.

로컬 audio_vblank에는 공개 AudioVBlank_QueueReset/QueueRefill/QueuePlay와 audio_vblank_queue.inc가 없습니다. ZX0도 공개 버전에만 있습니다. 이 기능들은 공개 추가 기능이며 검증된 로컬 기능에 포함하지 않습니다.

kq3d_overlap_sphere_aabb
u8 kq3d_overlap_sphere_aabb(const KQBody3D* sphere, const KQBody3D* box);

KQ3D_BODY_SPHERE=0x04는 구와 상자의 접촉을 선택합니다. 반지름은 half_x입니다. kq3d_overlap_sphere_aabb(sphere, box)는 접하는 경계를 포함하며 NULL 또는 0 이하의 반지름이면 0을 반환합니다. 구끼리의 전용 해법은 없습니다. 좌표 차이, 곱과 제곱 합을 16비트 범위 안에 두세요.

physics3d.c / physics3d.h

이번에 실행한 검증

2D 기본 경로: KOKURA C API의 자동 하드웨어 선택으로 8,872건 모두 통과했습니다. 속도 제한, 접촉, 부호 있는 Q8 곱셈과 충돌 시각을 확인했습니다. DMG/CGB를 명시적으로 나눈 시험은 아닙니다.

물리 경계 19건을 DMG와 CGB에서 실행하여 총 38회 모두 통과했습니다. 별도 3D 추가 기능과 스프라이트/VRAM/팔레트 재현 시험도 두 모드에서 기대값과 일치했습니다. 팔레트와 스프라이트는 결함 재현 성공이지 정상 동작의 확인이 아닙니다.

C# 컴파일러가 생성한 ROM의 에뮬레이터 검증입니다. Rust 동등성, 실제 기기, 음성, 화면이나 모든 API의 정확성을 증명하지 않습니다. 기존 이미지와 검증은 각 기록의 소스 지문에 연결된 과거 결과입니다.

소스 지문, 입력, 기대값, 실측값과 재실행 절차 · evidence.tar.gz · verify_rom_cases.py · verify_surface.py

캡처 화면 모음

에뮬레이터에서 캡처한 화면을 샘플 설명 옆에 표시합니다. 명시된 기대 결과와 출력을 비교하세요. 화면만으로는 소리, 컨트롤러 입력, 주변기기 또는 실제 하드웨어의 동작을 검증할 수 없습니다.

제공된 문자 집합 표시 gb_font

목적: 제공된 독자 제작 글꼴에 어떤 문자·숫자·문장부호가 있는지, 그리고 어떻게 그리는지 알아봅니다.

동작 원리: m_init이 표시와 글꼴을 준비합니다. m_text가 각 행을 그리고, m_put은 문자 코드 34로 큰따옴표를 그립니다.

조작 방법과 기대 결과: 대문자 26개, 소문자 26개, 숫자 10개, 문장부호 30개가 있는지 확인하세요. 모든 글자가 읽기 쉬운지 살펴보세요. 입력 조작은 필요하지 않습니다.

제공된 문자 집합 표시: 대문자 26개, 소문자 26개, 숫자 10개, 문장부호 30개가 있는지 확인하세요. 모든 글자가 읽기 쉬운지 살펴보세요. 입력 조작은 필요하지 않습니다.
표시 예: 대문자 26개, 소문자 26개, 숫자 10개, 문장부호 30개가 있는지 확인하세요. 모든 글자가 읽기 쉬운지 살펴보세요. 입력 조작은 필요하지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

첫 텍스트 표시 gb_hello

목적: ROM을 시작하고 배경에 문자와 숫자를 그리는 기본 순서를 알아봅니다.

동작 원리: m_init 후 m_text가 인사말을 그리고 m_number가 42를 표시 형식으로 바꿉니다. 마지막 루프는 화면을 유지하며 프레임을 기다립니다.

조작 방법과 기대 결과: 화면에 HELLO WORLD와 042가 표시됩니다. 앞의 0은 십진수를 세 자리로 표시하기 위한 것입니다.

첫 텍스트 표시: 화면에 HELLO WORLD와 042가 표시됩니다. 앞의 0은 십진수를 세 자리로 표시하기 위한 것입니다.
표시 예: 화면에 HELLO WORLD와 042가 표시됩니다. 앞의 0은 십진수를 세 자리로 표시하기 위한 것입니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

더 넓은 타입의 중간값으로 연산 gb_arithmetic

목적: 8비트로 표현할 수 없는 중간 결과를 보관하는 방법을 알아봅니다.

동작 원리: (u16)200 + 100의 결과는 300입니다. 프로그램은 이를 10으로 나눈 뒤 u8로 변환해 표시합니다. 덧셈 전에 더 넓은 타입으로 캐스팅한다는 점에 주목하세요.

조작 방법과 기대 결과: 030은 계산 결과인 30을 나타냅니다.

더 넓은 타입의 중간값으로 연산: 030은 계산 결과인 30을 나타냅니다.
표시 예: 030은 계산 결과인 30을 나타냅니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

분기와 반복 gb_control

목적: 간단한 계산에서 for, continue, while, do/while, switch를 사용해 봅니다.

동작 원리: 0~7을 더하되 3을 건너뛰면 25가 됩니다. while 루프로 30까지, do/while로 32까지 진행한 뒤 switch의 case 32에서 42를 대입합니다.

조작 방법과 기대 결과: 042는 이 반복문과 분기의 최종 결과입니다.

분기와 반복문: 042는 이 반복문과 분기의 최종 결과입니다.
표시 예: 042는 이 반복문과 분기의 최종 결과입니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

함수, 배열, 구조체, 포인터 gb_aggregate

목적: 값을 묶고 함수와 포인터로 접근하는 방법을 알아봅니다.

동작 원리: 프로그램은 (10,20)을 담은 Point를 복사한 뒤 포인터로 배열에 1부터 4까지 씁니다. 함수 결과 30에 배열 값 1, 2, 4와 상수 5를 더합니다.

조작 방법과 기대 결과: 합계가 042로 표시됩니다. 구조체 복사, ptr[i]에 쓰는 과정과 함수 반환값을 따라가 보세요.

함수, 배열, 구조체, 포인터: 합계가 042로 표시됩니다. 구조체 복사, ptr[i]에 쓰는 과정과 함수 반환값을 따라가 보세요.
표시 예: 합계가 042로 표시됩니다. 구조체 복사, ptr[i]에 쓰는 과정과 함수 반환값을 따라가 보세요.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

비트 플래그와 버퍼 복사 gb_bits_memory

목적: 플래그를 한 바이트에 담고 버퍼를 별도 저장 공간에 복사합니다.

동작 원리: __memset으로 4바이트를 지웁니다. 비트 3을 설정하고 비트 1을 반전한 뒤 __memcpy로 4바이트 모두를 복사합니다.

조작 방법과 기대 결과: 복사 대상의 첫 바이트가 010으로 표시됩니다. 비트 3의 값 8과 비트 1의 값 2를 더한 결과입니다.

비트 플래그와 버퍼 복사: 복사 대상의 첫 바이트가 010으로 표시됩니다. 비트 3의 값 8과 비트 1의 값 2를 더한 결과입니다.
표시 예: 복사 대상의 첫 바이트가 010으로 표시됩니다. 비트 3의 값 8과 비트 1의 값 2를 더한 결과입니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

새로 누른 버튼 횟수 세기 gb_input

목적: 버튼을 새로 누른 경우와 계속 누르고 있는 경우를 구분합니다.

동작 원리: 매 프레임 input_update를 호출합니다. input_pressed(BTN_A)가 참일 때만 카운터가 증가합니다.

조작 방법과 기대 결과: 초기값은 000입니다. A를 누르면 001이 되며, 누르고 있어도 증가하지 않습니다. 버튼을 놓았다가 다시 누르면 002가 됩니다. 바이트 카운터는 255 다음에 000으로 돌아갑니다.

새로 누른 버튼 횟수 세기: 초기값은 000입니다. A를 누르면 001이 되며, 누르고 있어도 증가하지 않습니다. 버튼을 놓았다가 다시 누르면 002가 됩니다. 바이트 카운터는 255 다음에 000으로 돌아갑니다.
표시 예: 초기값은 000입니다. A를 누르면 001이 되며, 누르고 있어도 증가하지 않습니다. 버튼을 놓았다가 다시 누르면 002가 됩니다. 바이트 카운터는 255 다음에 000으로 돌아갑니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

Q8.8 고정소수점 값 곱하기 gb_fixed

목적: 정수를 Q8.8로 변환하고 곱한 다음 다시 정수로 바꾸는 방법을 알아봅니다.

동작 원리: fix_from_int가 3과 4를 Q8.8로 변환합니다. fix_mul로 곱하고 fix_to_int로 결과를 다시 정수로 바꿉니다.

조작 방법과 기대 결과: 012는 3 × 4 = 12를 뜻합니다. 256배로 저장된 내부값이 아니라 변환한 정수입니다.

Q8.8 고정소수점 값 곱하기: 012는 3 × 4 = 12를 뜻합니다. 256배로 저장된 내부값이 아니라 변환한 정수입니다.
표시 예: 012는 3 × 4 = 12를 뜻합니다. 256배로 저장된 내부값이 아니라 변환한 정수입니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

고정 오브젝트 풀에서 할당 gb_entity

목적: 동적 할당 없이 고정 슬롯 집합에서 오브젝트를 생성합니다.

동작 원리: entity_init이 풀을 초기화합니다. entity_create가 (20,30)에 타입 1을 만들고, 프로그램은 실패 ID 0xFF가 아닌지 확인한 뒤 vx를 2로 설정합니다.

조작 방법과 기대 결과: 001은 활성 오브젝트 수이며 ID나 좌표가 아닙니다. 이 예제는 오브젝트를 갱신하거나 그리지 않으므로 움직이는 캐릭터는 나타나지 않습니다.

고정 오브젝트 풀에서 할당: 001은 활성 오브젝트 수이며 ID나 좌표가 아닙니다. 이 예제는 오브젝트를 갱신하거나 그리지 않으므로 움직이는 캐릭터는 나타나지 않습니다.
표시 예: 001은 활성 오브젝트 수이며 ID나 좌표가 아닙니다. 이 예제는 오브젝트를 갱신하거나 그리지 않으므로 움직이는 캐릭터는 나타나지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

RAM에 진단 값 기록 gb_debug

목적: 화면 표시와 별개로 이름이 붙은 게임 값을 진단 버퍼에 보관합니다.

동작 원리: 디버깅을 초기화하고 프레임 태그를 1로 설정한 뒤 HP라는 이름으로 값 42를 기록합니다.

조작 방법과 기대 결과: 001은 추적 항목 수입니다. HP=42는 진단 버퍼에 저장되며, 화면만으로는 그 내용을 보거나 검증할 수 없습니다.

RAM에 진단 값 기록: 001은 추적 항목 수입니다. HP=42는 진단 버퍼에 저장되며, 화면만으로는 그 내용을 보거나 검증할 수 없습니다.
표시 예: 001은 추적 항목 수입니다. HP=42는 진단 버퍼에 저장되며, 화면만으로는 그 내용을 보거나 검증할 수 없습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

위치 이력 저장 gb_chain

목적: 위치 이력을 링 버퍼에 저장하는 방법을 알아봅니다.

동작 원리: chain_init은 점 4개를 담을 수 있는 배열을 연결합니다. 그다음 chain_push_head가 (20,30)을 기록합니다.

조작 방법과 기대 결과: 042는 고정된 완료 표시이며 좌표나 개수가 아닙니다. 저장된 이력은 trail과 points를 살펴보세요. 이 프로그램은 따라오는 몸체를 그리지 않습니다.

위치 이력 저장: 042는 고정된 완료 표시이며 좌표나 개수가 아닙니다. 저장된 이력은 trail과 points를 살펴보세요. 이 프로그램은 따라오는 몸체를 그리지 않습니다.
표시 예: 042는 고정된 완료 표시이며 좌표나 개수가 아닙니다. 저장된 이력은 trail과 points를 살펴보세요. 이 프로그램은 따라오는 몸체를 그리지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

라이브러리 프레임 카운터 읽기 gb_system

목적: 프레임 단위 대기가 라이브러리 프레임 카운터에 미치는 영향을 확인합니다.

동작 원리: system_init 후 프로그램은 system_wait_vblank를 두 번 호출하고 system_get_frame8을 표시합니다.

조작 방법과 기대 결과: 결과는 002입니다. 대기 루프는 매뉴얼 보조 함수 m_wait를 사용하므로 표시 값이 계속 증가하지 않습니다.

라이브러리 프레임 카운터 읽기: 결과는 002입니다. 대기 루프는 매뉴얼 보조 함수 m_wait를 사용하므로 표시 값이 계속 증가하지 않습니다.
표시 예: 결과는 002입니다. 대기 루프는 매뉴얼 보조 함수 m_wait를 사용하므로 표시 값이 계속 증가하지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

현재 장면 ID 선택 gb_scene

목적: 타이틀 화면과 플레이 화면 등을 구분하는 ID를 선택하는 방법을 알아봅니다.

동작 원리: 0으로 초기화한 SceneDef 항목 두 개를 등록하고 scene_change로 ID 1을 선택합니다.

조작 방법과 기대 결과: 001은 scene_get_current가 반환한 현재 ID입니다. 이 예제에는 장면 콜백이나 전환 그리기가 등록되어 있지 않습니다.

현재 장면 ID 선택: 001은 scene_get_current가 반환한 현재 ID입니다. 이 예제에는 장면 콜백이나 전환 그리기가 등록되어 있지 않습니다.
표시 예: 001은 scene_get_current가 반환한 현재 ID입니다. 이 예제에는 장면 콜백이나 전환 그리기가 등록되어 있지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

제공된 문자 집합 표시 fc_font

목적: 제공된 독자 제작 글꼴에 어떤 문자·숫자·문장부호가 있는지, 그리고 어떻게 그리는지 알아봅니다.

동작 원리: m_init이 표시와 글꼴을 준비합니다. m_text가 각 행을 그리고, m_put은 문자 코드 34로 큰따옴표를 그립니다.

조작 방법과 기대 결과: 대문자 26개, 소문자 26개, 숫자 10개, 문장부호 30개가 있는지 확인하세요. 모든 글자가 읽기 쉬운지 살펴보세요. 입력 조작은 필요하지 않습니다.

제공된 문자 집합 표시: 대문자 26개, 소문자 26개, 숫자 10개, 문장부호 30개가 있는지 확인하세요. 모든 글자가 읽기 쉬운지 살펴보세요. 입력 조작은 필요하지 않습니다.
표시 예: 대문자 26개, 소문자 26개, 숫자 10개, 문장부호 30개가 있는지 확인하세요. 모든 글자가 읽기 쉬운지 살펴보세요. 입력 조작은 필요하지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

첫 텍스트 표시 fc_hello

목적: ROM을 시작하고 배경에 문자와 숫자를 그리는 기본 순서를 알아봅니다.

동작 원리: m_init 후 m_text가 인사말을 그리고 m_number가 42를 표시 형식으로 바꿉니다. 마지막 루프는 화면을 유지하며 프레임을 기다립니다.

조작 방법과 기대 결과: 화면에 HELLO WORLD와 042가 표시됩니다. 앞의 0은 십진수를 세 자리로 표시하기 위한 것입니다.

첫 텍스트 표시: 화면에 HELLO WORLD와 042가 표시됩니다. 앞의 0은 십진수를 세 자리로 표시하기 위한 것입니다.
표시 예: 화면에 HELLO WORLD와 042가 표시됩니다. 앞의 0은 십진수를 세 자리로 표시하기 위한 것입니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

더 넓은 타입의 중간값으로 연산 fc_arithmetic

목적: 8비트로 표현할 수 없는 중간 결과를 보관하는 방법을 알아봅니다.

동작 원리: (u16)200 + 100의 결과는 300입니다. 프로그램은 이를 10으로 나눈 뒤 u8로 변환해 표시합니다. 덧셈 전에 더 넓은 타입으로 캐스팅한다는 점에 주목하세요.

조작 방법과 기대 결과: 030은 계산 결과인 30을 나타냅니다.

더 넓은 타입의 중간값으로 연산: 030은 계산 결과인 30을 나타냅니다.
표시 예: 030은 계산 결과인 30을 나타냅니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

분기와 반복 fc_control

목적: 간단한 계산에서 for, continue, while, if/else를 사용해 봅니다.

동작 원리: for 루프는 0부터 7까지 더하면서 3을 건너뛰어 25를 만듭니다. while 루프는 32까지 증가시키고, 이어지는 if는 이 값이 일치하면 42를 대입합니다.

조작 방법과 기대 결과: 042가 최종 결과입니다. 이 프로그램은 if/else 분기를 사용합니다.

분기와 반복문: 최종 결과는 042입니다. 이 프로그램은 if/else 분기를 사용합니다.
표시 예: 042가 최종 결과입니다. 이 프로그램은 if/else 분기를 사용합니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

함수, 배열, 구조체, 포인터 fc_aggregate

목적: 값을 묶고 함수와 포인터로 접근하는 방법을 알아봅니다.

동작 원리: 프로그램은 (10,20)을 담은 Point를 복사한 뒤 포인터로 배열에 1부터 4까지 씁니다. 함수 결과 30에 배열 값 1, 2, 4와 상수 5를 더합니다.

조작 방법과 기대 결과: 합계가 042로 표시됩니다. 구조체 복사, ptr[i]에 쓰는 과정과 함수 반환값을 따라가 보세요.

함수, 배열, 구조체, 포인터: 합계가 042로 표시됩니다. 구조체 복사, ptr[i]에 쓰는 과정과 함수 반환값을 따라가 보세요.
표시 예: 합계가 042로 표시됩니다. 구조체 복사, ptr[i]에 쓰는 과정과 함수 반환값을 따라가 보세요.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

비트 플래그와 버퍼 복사 fc_bits_memory

목적: 플래그를 한 바이트에 담고 버퍼를 별도 저장 공간에 복사합니다.

동작 원리: __memset으로 4바이트를 지웁니다. 비트 3을 설정하고 비트 1을 반전한 뒤 __memcpy로 4바이트 모두를 복사합니다.

조작 방법과 기대 결과: 복사 대상의 첫 바이트가 010으로 표시됩니다. 비트 3의 값 8과 비트 1의 값 2를 더한 결과입니다.

비트 플래그와 버퍼 복사: 복사 대상의 첫 바이트가 010으로 표시됩니다. 비트 3의 값 8과 비트 1의 값 2를 더한 결과입니다.
표시 예: 복사 대상의 첫 바이트가 010으로 표시됩니다. 비트 3의 값 8과 비트 1의 값 2를 더한 결과입니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

새로 누른 버튼 횟수 세기 fc_input

목적: 버튼을 새로 누른 경우와 계속 누르고 있는 경우를 구분합니다.

동작 원리: 매 프레임 input_update를 호출합니다. input_pressed(BTN_A)가 참일 때만 카운터가 증가합니다.

조작 방법과 기대 결과: 초기값은 000입니다. A를 누르면 001이 되며, 누르고 있어도 증가하지 않습니다. 버튼을 놓았다가 다시 누르면 002가 됩니다. 바이트 카운터는 255 다음에 000으로 돌아갑니다.

새로 누른 버튼 횟수 세기: 초기값은 000입니다. A를 누르면 001이 되며, 누르고 있어도 증가하지 않습니다. 버튼을 놓았다가 다시 누르면 002가 됩니다. 바이트 카운터는 255 다음에 000으로 돌아갑니다.
표시 예: 초기값은 000입니다. A를 누르면 001이 되며, 누르고 있어도 증가하지 않습니다. 버튼을 놓았다가 다시 누르면 002가 됩니다. 바이트 카운터는 255 다음에 000으로 돌아갑니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

Q8.8 고정소수점 값 곱하기 fc_fixed

목적: 정수를 Q8.8로 변환하고 곱한 다음 다시 정수로 바꾸는 방법을 알아봅니다.

동작 원리: fix_from_int가 3과 4를 Q8.8로 변환합니다. fix_mul로 곱하고 fix_to_int로 결과를 다시 정수로 바꿉니다.

조작 방법과 기대 결과: 012는 3 × 4 = 12를 뜻합니다. 256배로 저장된 내부값이 아니라 변환한 정수입니다.

Q8.8 고정소수점 값 곱하기: 012는 3 × 4 = 12를 뜻합니다. 256배로 저장된 내부값이 아니라 변환한 정수입니다.
표시 예: 012는 3 × 4 = 12를 뜻합니다. 256배로 저장된 내부값이 아니라 변환한 정수입니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

고정 오브젝트 풀에서 할당 fc_entity

목적: 동적 할당 없이 고정 슬롯 집합에서 오브젝트를 생성합니다.

동작 원리: entity_init이 풀을 초기화합니다. entity_create가 (20,30)에 타입 1을 만들고, 프로그램은 실패 ID 0xFF가 아닌지 확인한 뒤 vx를 2로 설정합니다.

조작 방법과 기대 결과: 001은 활성 오브젝트 수이며 ID나 좌표가 아닙니다. 이 예제는 오브젝트를 갱신하거나 그리지 않으므로 움직이는 캐릭터는 나타나지 않습니다.

고정 오브젝트 풀에서 할당: 001은 활성 오브젝트 수이며 ID나 좌표가 아닙니다. 이 예제는 오브젝트를 갱신하거나 그리지 않으므로 움직이는 캐릭터는 나타나지 않습니다.
표시 예: 001은 활성 오브젝트 수이며 ID나 좌표가 아닙니다. 이 예제는 오브젝트를 갱신하거나 그리지 않으므로 움직이는 캐릭터는 나타나지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

RAM에 진단 값 기록 fc_debug

목적: 화면 표시와 별개로 이름이 붙은 게임 값을 진단 버퍼에 보관합니다.

동작 원리: 디버깅을 초기화하고 프레임 태그를 1로 설정한 뒤 HP라는 이름으로 값 42를 기록합니다.

조작 방법과 기대 결과: 001은 추적 항목 수입니다. HP=42는 진단 버퍼에 저장되며, 화면만으로는 그 내용을 보거나 검증할 수 없습니다.

RAM에 진단 값 기록: 001은 추적 항목 수입니다. HP=42는 진단 버퍼에 저장되며, 화면만으로는 그 내용을 보거나 검증할 수 없습니다.
표시 예: 001은 추적 항목 수입니다. HP=42는 진단 버퍼에 저장되며, 화면만으로는 그 내용을 보거나 검증할 수 없습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

위치 이력 저장 fc_chain

목적: 위치 이력을 링 버퍼에 저장하는 방법을 알아봅니다.

동작 원리: chain_init은 점 4개를 담을 수 있는 배열을 연결합니다. 그다음 chain_push_head가 (20,30)을 기록합니다.

조작 방법과 기대 결과: 042는 고정된 완료 표시이며 좌표나 개수가 아닙니다. 저장된 이력은 trail과 points를 살펴보세요. 이 프로그램은 따라오는 몸체를 그리지 않습니다.

위치 이력 저장: 042는 고정된 완료 표시이며 좌표나 개수가 아닙니다. 저장된 이력은 trail과 points를 살펴보세요. 이 프로그램은 따라오는 몸체를 그리지 않습니다.
표시 예: 042는 고정된 완료 표시이며 좌표나 개수가 아닙니다. 저장된 이력은 trail과 points를 살펴보세요. 이 프로그램은 따라오는 몸체를 그리지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

라이브러리 프레임 카운터 읽기 fc_system

목적: 프레임 단위 대기가 라이브러리 프레임 카운터에 미치는 영향을 확인합니다.

동작 원리: system_init 후 프로그램은 system_wait_vblank를 두 번 호출하고 system_get_frame8을 표시합니다.

조작 방법과 기대 결과: 결과는 002입니다. 대기 루프는 매뉴얼 보조 함수 m_wait를 사용하므로 표시 값이 계속 증가하지 않습니다.

라이브러리 프레임 카운터 읽기: 결과는 002입니다. 대기 루프는 매뉴얼 보조 함수 m_wait를 사용하므로 표시 값이 계속 증가하지 않습니다.
표시 예: 결과는 002입니다. 대기 루프는 매뉴얼 보조 함수 m_wait를 사용하므로 표시 값이 계속 증가하지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

현재 장면 ID 선택 fc_scene

목적: 타이틀 화면과 플레이 화면 등을 구분하는 ID를 선택하는 방법을 알아봅니다.

동작 원리: 0으로 초기화한 SceneDef 항목 두 개를 등록하고 scene_change로 ID 1을 선택합니다.

조작 방법과 기대 결과: 001은 scene_get_current가 반환한 현재 ID입니다. 이 예제에는 장면 콜백이나 전환 그리기가 등록되어 있지 않습니다.

현재 장면 ID 선택: 001은 scene_get_current가 반환한 현재 ID입니다. 이 예제에는 장면 콜백이나 전환 그리기가 등록되어 있지 않습니다.
표시 예: 001은 scene_get_current가 반환한 현재 ID입니다. 이 예제에는 장면 콜백이나 전환 그리기가 등록되어 있지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

월드 좌표를 화면 좌표로 변환 gb_camera

목적: 월드 위치에서 카메라 위치를 빼서 화면상 위치를 구합니다.

동작 원리: Camera_Set에 Q8.8 값 2560, 즉 X=10픽셀을 전달합니다. 그다음 Camera_WorldToScreenX가 월드 좌표 X=52를 변환합니다.

조작 방법과 기대 결과: 052에서 010을 빼면 표시된 042가 됩니다. 좌표 계산이며 배경을 스크롤하지 않습니다.

월드 좌표를 화면 좌표로 변환: 052에서 010을 빼면 화면에 042가 표시됩니다. 좌표 계산 예제이며 배경을 스크롤하지 않습니다.
표시 예: 052에서 010을 빼면 표시된 042가 됩니다. 좌표 계산이며 배경을 스크롤하지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

RLE 데이터를 RAM으로 압축 해제 gb_rle

목적: 반복 바이트를 횟수와 값으로 간결하게 표현해 봅니다.

동작 원리: 압축 바이트 {3,42,0}은 42를 세 번 반복한 뒤 반복 횟수 0으로 끝낸다는 뜻입니다. rle_decode는 3바이트 대상 버퍼에 씁니다.

조작 방법과 기대 결과: 마지막 바이트 out[2]가 042로 표시됩니다. 해제된 세 바이트의 값은 모두 42여야 합니다.

RLE 데이터를 RAM으로 압축 해제: 마지막 바이트 out[2]가 042로 표시됩니다. 해제된 세 바이트의 값은 모두 42여야 합니다.
표시 예: 마지막 바이트 out[2]가 042로 표시됩니다. 해제된 세 바이트의 값은 모두 42여야 합니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

보드 셀 읽기와 쓰기 gb_board

목적: 보드게임의 격자 좌표가 저장 위치에 어떻게 대응하는지 알아봅니다.

동작 원리: 16바이트 배열로 4×4 보드를 저장합니다. 프로그램은 보드를 지우고 셀 (2,1)에 42를 쓴 뒤 같은 셀을 다시 읽습니다.

조작 방법과 기대 결과: 042는 다시 읽어 온 값입니다. 프로그램은 4×4 보드 자체를 그리지 않습니다.

보드 셀 읽기와 쓰기: 042는 다시 읽어 온 값입니다. 프로그램은 4×4 보드 자체를 그리지 않습니다.
표시 예: 042는 다시 읽어 온 값입니다. 프로그램은 4×4 보드 자체를 그리지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

상자를 물리 계산 한 단계만큼 진행 gb_physics

목적: 월드와 상자 물체를 초기화한 다음 속도로 위치를 갱신합니다.

동작 원리: 물체는 위치 (40,40), 속도 (2,0), 중력 0으로 시작합니다. 프로그램은 kq2d_step을 한 번 호출합니다.

조작 방법과 기대 결과: 042는 계산된 X 좌표이며, 이 예제의 단위는 정수 픽셀입니다. 상자 모양이나 연속 애니메이션은 그리지 않습니다.

상자를 물리 계산 한 단계만큼 진행: 042는 계산된 X 좌표이며, 이 예제의 단위는 정수 픽셀입니다. 상자 모양이나 연속 애니메이션은 그리지 않습니다.
표시 예: 042는 계산된 X 좌표이며, 이 예제의 단위는 정수 픽셀입니다. 상자 모양이나 연속 애니메이션은 그리지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

뱅크 인수로 ROM 데이터 읽기 gb_bank

목적: ROM 데이터를 RAM으로 복사할 때 필요한 인수를 알아봅니다.

동작 원리: far_data_read가 뱅크 인수 0과 길이 2를 사용해 바이트 7과 42를 copied로 복사합니다.

조작 방법과 기대 결과: 복사 대상의 두 번째 바이트가 042로 표시됩니다. 이 예제는 고정 ROM을 읽으며 서로 다른 전환 가능 뱅크 사이의 전송은 보여 주지 않습니다.

뱅크 인수로 ROM 데이터 읽기: 복사 대상의 두 번째 바이트가 042로 표시됩니다. 이 예제는 고정 ROM을 읽으며 서로 다른 전환 가능 뱅크 사이의 전송은 보여 주지 않습니다.
표시 예: 복사 대상의 두 번째 바이트가 042로 표시됩니다. 이 예제는 고정 ROM을 읽으며 서로 다른 전환 가능 뱅크 사이의 전송은 보여 주지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

자산 ID로 데이터 불러오기 gb_asset

목적: 자산의 위치와 길이를 등록한 뒤 ID로 바이트 데이터를 가져옵니다.

동작 원리: 자산 0의 타입은 RAW, 뱅크는 0이며 {7,42}를 가리키는 포인터와 길이 2를 갖습니다. asset_load_raw가 이를 2바이트 RAM 버퍼에 복사합니다.

조작 방법과 기대 결과: 두 번째 바이트가 042로 표시됩니다. 자산 검색과 복사를 보여 주는 예제이며 이미지 렌더링 예제는 아닙니다.

자산 ID로 데이터 불러오기: 두 번째 바이트가 042로 표시됩니다. 자산 검색과 복사를 보여 주는 예제이며 이미지 렌더링 예제는 아닙니다.
표시 예: 두 번째 바이트가 042로 표시됩니다. 자산 검색과 복사를 보여 주는 예제이며 이미지 렌더링 예제는 아닙니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

탄 하나 할당 gb_danmaku

목적: 탄 풀을 초기화하고 생성 후 사용 중인 슬롯 수를 확인합니다.

동작 원리: danmaku_reset 후 프로그램은 danmaku_spawn(40,40,16,0)을 호출하고 dm_count를 표시합니다.

조작 방법과 기대 결과: 001은 할당된 탄 수입니다. 탄 갱신 루프나 배경 합성기가 없으므로 움직이는 탄은 그리지 않습니다.

탄 하나 할당: 001은 할당된 탄 수입니다. 탄 갱신 루프나 배경 합성기가 없으므로 움직이는 탄은 그리지 않습니다.
표시 예: 001은 할당된 탄 수입니다. 탄 갱신 루프나 배경 합성기가 없으므로 움직이는 탄은 그리지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

Q5.3 소수 단위 이동 누적 fc_subpixel

목적: 서브픽셀 이동량은 나머지로 보관하고, 정수 픽셀만 위치에 더합니다.

동작 원리: X=40에서 시작해 루프가 2/8픽셀을 여덟 번 더합니다. 오른쪽 시프트로 정수 픽셀을 추출하고 마스크로 나머지를 유지합니다.

조작 방법과 기대 결과: 총 이동량은 2픽셀이므로 화면에 X=42가 042로 표시됩니다. 이 직접 적분 예제는 양의 방향 이동을 처리합니다. 음의 방향에는 알맞은 빌림 처리 경로가 필요합니다.

Q5.3 소수 단위 이동 누적: 총 이동량은 2픽셀이므로 화면에 X=42가 042로 표시됩니다. 이 직접 적분 예제는 양의 방향 이동을 처리합니다. 음의 방향에는 알맞은 빌림 처리 경로가 필요합니다.
표시 예: 총 이동량은 2픽셀이므로 화면에 X=42가 042로 표시됩니다. 이 직접 적분 예제는 양의 방향 이동을 처리합니다. 음의 방향에는 알맞은 빌림 처리 경로가 필요합니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

CGB 배경 팔레트 설정 gb_cgb_palette

목적: Game Boy Color의 RGB 성분으로 배경색과 글자색을 선택합니다.

동작 원리: 프로그램은 VBlank 중 LCD를 끄고 팔레트 0의 색상 0을 흰색 (31,31,31), 색상 3을 보라색 (12,0,22)으로 설정한 뒤 표시를 켭니다.

조작 방법과 기대 결과: CGB 모드에서 실행하면 흰 바탕에 보라색 글자와 042가 표시됩니다. DMG의 흑백 출력으로는 이 색상을 확인할 수 없습니다.

CGB 배경 팔레트 설정: CGB 모드에서 실행하면 흰 바탕에 보라색 글자와 042가 표시됩니다. DMG의 흑백 출력으로는 이 색상을 확인할 수 없습니다.
표시 예: CGB 모드에서 실행하면 흰 바탕에 보라색 글자와 042가 표시됩니다. DMG의 흑백 출력으로는 이 색상을 확인할 수 없습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

배경을 가로로 스크롤 gb_scroll

목적: 배경 내용을 다시 그리지 않고 화면의 표시 위치를 이동합니다.

동작 원리: 매 프레임 phase를 증가시켜 Scroll_SetBg에 전달합니다. 8비트 위치 값은 255 다음에 0으로 돌아갑니다.

조작 방법과 기대 결과: SCROLL이라는 글자가 왼쪽으로 이동합니다. 시간에 따라 위치가 바뀌는지 확인하세요. 스크린샷 한 장으로는 움직임을 확인할 수 없습니다.

배경을 가로로 스크롤: SCROLL이라는 글자가 왼쪽으로 이동합니다. 시간에 따라 위치가 바뀌는지 확인하세요. 스크린샷 한 장으로는 움직임을 확인할 수 없습니다.
표시 예: SCROLL이라는 글자가 왼쪽으로 이동합니다. 시간에 따라 위치가 바뀌는지 확인하세요. 스크린샷 한 장으로는 움직임을 확인할 수 없습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

타일 갱신을 큐에 등록 gb_vram_queue

목적: 그리기 요청과 이를 적용하는 VRAM 전송을 분리합니다.

동작 원리: vram_queue_bg_tile이 타일 좌표 (3,8)에 타일 52를 예약하고 vram_flush가 전송합니다. 제공된 글꼴에서 타일 52는 숫자 4입니다.

조작 방법과 기대 결과: 배경 타일 좌표 (3,8)에 숫자 4 하나가 표시되는지 확인하세요. 타일 갱신이며 숫자 카운터가 아닙니다.

타일 갱신을 큐에 등록: 배경 타일 좌표 (3,8)에 숫자 4 하나가 표시되는지 확인하세요. 타일 갱신이며 숫자 카운터가 아닙니다.
표시 예: 배경 타일 좌표 (3,8)에 숫자 4 하나가 표시되는지 확인하세요. 타일 갱신이며 숫자 카운터가 아닙니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

OAM DMA로 스프라이트 표시 gb_sprite

목적: 배경과 별개로 스프라이트를 할당하고 표시합니다.

동작 원리: 초기화된 풀은 슬롯 0을 제공합니다. 프로그램은 타일 65와 위치 (70,80)를 설정하고 OBJ 표시를 켠 뒤 매 프레임 섀도 OAM을 전송합니다.

조작 방법과 기대 결과: 지정한 스프라이트 위치에 정지된 문자 A가 나타납니다. 게임에서는 반환된 ID를 쓰기 전에 할당 실패 여부를 확인하세요.

OAM DMA로 스프라이트 표시: 지정한 스프라이트 위치에 정지된 문자 A가 나타납니다. 게임에서는 반환된 ID를 사용하기 전에 할당 실패 여부를 확인하세요.
표시 예: 지정한 스프라이트 위치에 정지된 문자 A가 나타납니다. 게임에서는 반환된 ID를 쓰기 전에 할당 실패 여부를 확인하세요.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

재현 가능한 난수 생성 gb_rng

목적: 시드를 사용해 의사 난수열을 재현합니다.

동작 원리: rng_seed(1234)로 생성기를 초기화한 뒤 rng_range(10)을 한 번 호출합니다. 상한인 10은 결과에 포함되지 않습니다.

조작 방법과 기대 결과: 화면에 000부터 009까지의 값 하나가 표시됩니다. 같은 프로그램을 같은 시드로 다시 시작하면 같은 값이 나오며, 매 프레임 바뀌지는 않습니다.

재현 가능한 난수 생성: 화면에 000부터 009까지의 값 하나가 표시됩니다. 같은 프로그램을 같은 시드로 다시 시작하면 같은 값이 나오며, 매 프레임 바뀌지는 않습니다.
표시 예: 화면에 000부터 009까지의 값 하나가 표시됩니다. 같은 프로그램을 같은 시드로 다시 시작하면 같은 값이 나오며, 매 프레임 바뀌지는 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

게임 상태 플래그 저장 gb_flags

목적: 이벤트 완료 여부 같은 불리언 상태를 플래그 번호로 표현합니다.

동작 원리: 프로그램은 플래그 12를 지우고 설정한 뒤 flag_get으로 다시 읽습니다.

조작 방법과 기대 결과: 001은 플래그 12가 참임을 뜻합니다. 이 예제는 RAM의 플래그를 조작하며 전원을 껐다 켠 뒤까지 저장하지는 않습니다.

게임 상태 플래그 저장: 001은 플래그 12가 참임을 뜻합니다. 이 예제는 RAM의 플래그를 조작하며 전원을 껐다 켠 뒤까지 저장하지는 않습니다.
표시 예: 001은 플래그 12가 참임을 뜻합니다. 이 예제는 RAM의 플래그를 조작하며 전원을 껐다 켠 뒤까지 저장하지는 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

원을 물리 계산 한 단계만큼 진행 gb_circle

목적: 원형 물체를 설정하고 속도로 위치를 갱신합니다.

동작 원리: 활성 원의 반지름은 4, 위치는 (40,40), 속도는 (2,0)입니다. 중력은 0, linear_damping_q8은 255이며 kq2dc_step을 한 번 실행합니다.

조작 방법과 기대 결과: 042는 계산된 정수 X 좌표입니다. 이 예제는 원 외곽선이나 충돌 애니메이션을 그리지 않습니다.

원을 물리 계산 한 단계만큼 진행: 042는 계산된 정수 X 좌표입니다. 이 예제는 원 외곽선이나 충돌 애니메이션을 그리지 않습니다.
표시 예: 042는 계산된 정수 X 좌표입니다. 이 예제는 원 외곽선이나 충돌 애니메이션을 그리지 않습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

NES 배경 스크롤 fc_scroll

목적: PPU 스크롤 위치를 갱신해 배경을 이동합니다.

동작 원리: __scroll_set(0,0)으로 시작한 다음 매 프레임 phase를 한 번 증가시켜 가로 위치로 사용합니다.

조작 방법과 기대 결과: SCROLL이라는 글자의 가로 위치가 바뀝니다. phase는 255에서 0으로 돌아갑니다. 여러 네임테이블에 걸친 넓은 맵의 예제는 아닙니다.

NES 배경 스크롤: SCROLL이라는 글자의 가로 위치가 바뀝니다. phase는 255에서 0으로 돌아갑니다. 여러 네임테이블에 걸친 넓은 맵의 예제는 아닙니다.
표시 예: SCROLL이라는 글자의 가로 위치가 바뀝니다. phase는 255에서 0으로 돌아갑니다. 여러 네임테이블에 걸친 넓은 맵의 예제는 아닙니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

NMI를 통한 타일 갱신 적용 fc_vram_queue

목적: 메인 프로그램에서 PPU 갱신을 제출하고 NMI 처리 경로에서 적용합니다.

동작 원리: __vramq_put이 네임테이블 주소 0x2103에 타일 52를 예약하고 __vramq_commit이 제출합니다. 이 주소는 타일 좌표 (3,8)에 해당합니다.

조작 방법과 기대 결과: 배경 좌표 (3,8)에 숫자 4 하나가 나타납니다. 제공된 글꼴에서 타일 52는 숫자 4입니다.

NMI를 통한 타일 갱신 적용: 배경 좌표 (3,8)에 숫자 4 하나가 나타납니다. 제공된 글꼴에서 타일 52는 숫자 4입니다.
표시 예: 배경 좌표 (3,8)에 숫자 4 하나가 나타납니다. 제공된 글꼴에서 타일 52는 숫자 4입니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

NES OAM 스프라이트 표시 fc_sprite

목적: 배경과 독립적으로 이미지를 그릴 수 있도록 스프라이트 색상과 OAM 데이터를 준비합니다.

동작 원리: 스프라이트 팔레트를 불러오고 슬롯 0에 위치 (70,80), 타일 65, 속성 0을 설정합니다. 렌더링을 켠 뒤 OAM DMA를 반복합니다.

조작 방법과 기대 결과: 정지된 문자 A가 스프라이트로 나타납니다. OAM 설정과 전송을 보여 주는 예제이며 애니메이션은 아닙니다.

NES OAM 스프라이트 표시: 정지된 문자 A가 스프라이트로 나타납니다. 이 예제는 애니메이션이 아니라 OAM 설정과 전송을 보여 줍니다.
표시 예: 정지된 문자 A가 스프라이트로 나타납니다. OAM 설정과 전송을 보여 주는 예제이며 애니메이션은 아닙니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

APU 펄스음 재생 fc_sound

목적: NES 내장 펄스 채널의 제어·타이머·길이 값을 설정합니다.

동작 원리: nes_apu_init 후 프로그램은 nes_sfx_square1(0xBF,400,20)을 호출합니다. 제어값 0xBF는 고정 음량을 선택하고 길이 카운터를 멈추므로 음이 지속됩니다. 20은 20프레임이 아니라 길이 테이블 인덱스입니다.

조작 방법과 기대 결과: 042가 표시되는 동안 펄스음이 지속됩니다. 멈추려면 nes_apu_silence_all을 호출하세요. 화면의 표시만으로는 소리 출력을 검증할 수 없습니다.

APU 펄스음 재생: 042가 표시되는 동안 펄스음이 지속됩니다. 멈추려면 nes_apu_silence_all을 호출하세요. 화면의 표시만으로는 소리 출력을 검증할 수 없습니다.
표시 예: 042가 표시되는 동안 펄스음이 지속됩니다. 멈추려면 nes_apu_silence_all을 호출하세요. 화면의 표시만으로는 소리 출력을 검증할 수 없습니다.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기

매 프레임 효과음 처리 gb_sound

목적: 효과음 스트림을 시작하고 정기적인 프레임 갱신으로 진행시킵니다.

동작 원리: Audio_Init 후 Audio_PlaySFX가 채널 ID 1에서 tone을 시작합니다. 메인 루프는 프레임마다 Audio_Update를 한 번 호출합니다.

조작 방법과 기대 결과: 042가 표시된 채로 짧은 펄스 효과음이 재생됩니다. 숫자는 고정 표시이며 음량이나 재생 위치가 아닙니다. 소리는 오디오 출력이나 녹음으로 확인하세요.

매 프레임 효과음 처리: 042가 표시된 채로 짧은 펄스 효과음이 재생됩니다. 숫자는 고정 표시이며 음량이나 재생 위치가 아닙니다. 소리는 오디오 출력이나 녹음으로 확인하세요.
표시 예: 042가 표시된 채로 짧은 펄스 효과음이 재생됩니다. 숫자는 고정 표시이며 음량이나 재생 위치가 아닙니다. 소리는 오디오 출력이나 녹음으로 확인하세요.

컴파일러 매뉴얼의 예제로 돌아가기 / 라이브러리 매뉴얼의 예제로 돌아가기