경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!=== PPUCTRL - 기타 설정 ($2000 쓰기) === ---- 7 bit 0 ---- ---- VPHB SINN |||| |||| |||| ||++- 기본 네임테이블 주소 |||| || (0 = $2000; 1 = $2400; 2 = $2800; 3 = $2C00) |||| |+--- PPUDATA의 CPU 읽기/쓰기 당 VRAM 주소 증가 |||| | (0: 1씩 증가, 가로로 진행; 1: 32씩 증가, 세로로 진행) |||| +---- 8x8 스프라이트의 스프라이트 패턴 테이블 주소 |||| (0: $0000; 1: $1000; 8x16 모드에서는 무시됨) |||+------ 배경 패턴 테이블 주소 (0: $0000; 1: $1000) ||+------- [[Sprite size]] (0: 8x8 픽셀; 1: 8x16 픽셀 – [[PPU OAM#Byte 1]] 참조) |+-------- PPU 마스터/슬레이브 선택 | (0: EXT 핀에서 배경 읽기; 1: EXT 핀에 색상 출력) +--------- [[wikipedia:Vertical blanking interval|Vblank]] [[NMI]] 활성화 (0: 꺼짐, 1: 켜짐) PPUCTRL ("컨트롤" 또는 "컨트롤러" 레지스터)은 렌더링, 스크롤 위치, vblank NMI, 그리고 듀얼 PPU 구성과 관련된 설정의 조합을 포함한다. [[PPU power up state|전원/리셋 후]], 이 레지스터에 대한 쓰기는 첫 번째 프리 렌더 스캔라인까지 무시된다. ==== Vblank NMI ==== PPUCTRL에서 NMI를 활성화하면 vblank 시작 시(스캔라인 241, 도트 1) NMI 핸들러가 호출된다. 이것은 소프트웨어가 디스플레이의 프레임 속도로 실행될 수 있도록 신뢰할 수 있는 시간 소스를 제공하고, 소프트웨어에 vblank를 알린다. Vblank는 렌더링이 활성화된 상태에서 소프트웨어가 VRAM 및 OAM에 데이터를 보낼 수 있는 유일한 시간이며, 이 NMI는 vblank를 감지하는 ''유일한'' 신뢰할 수 있는 방법이다. [[#PPUSTATUS|PPUSTATUS]]에서 vblank 플래그를 폴링하는 것은 vblank를 완전히 놓칠 수 있다. [[#PPUSTATUS|PPUSTATUS]]의 vblank 플래그가 1인 동안 NMI 활성화를 0에서 1로 변경하면 즉시 NMI가 트리거된다. 이것은 PPUSTATUS 레지스터가 아직 읽히지 않은 경우 vblank 중에 발생한다. NMI 루틴이 vblank에서 너무 늦게 실행되어 제시간에 끝나지 못하게 하여 그래픽 결함을 일으키거나, 게임이 실제로 발생한 것보다 더 많은 프레임을 처리하게 할 수 있다. 이 문제를 피하려면, PPUCTRL에서 NMI를 활성화하기 전에 먼저 PPUSTATUS를 읽어 vblank 플래그를 지우는 것이 신중하다. ==== 스크롤링 ==== PPUCTRL 비트 0과 1의 현재 네임테이블 비트는 스크롤 좌표의 최상위 비트로 간주될 수 있으며, 이는 9비트 너비이다([[PPU_nametables|네임테이블]] 및 [[#PPUSCROLL|PPUSCROLL]] 참조): 7 bit 0 ---- ---- .... ..YX || |+- X 스크롤 위치 비트 8 (즉, X에 256을 더함) +-- Y 스크롤 위치 비트 8 (즉, Y에 240을 더함) 이 두 비트는 [[PPUSCROLL]]에 기록된 값과 동일한 [[#Internal registers|내부 t 레지스터]]로 이동하며, 스크롤 위치를 완전히 지정하려면 [[#PPUSCROLL|PPUSCROLL]]과 함께 기록되어야 한다. ==== 마스터/슬레이브 모드와 EXT 핀 ==== PPUCTRL의 비트 6은 PPU를 손상시킬 수 있으므로 순정 콘솔에서는 절대 설정해서는 안 된다. 이 비트가 클리어되면(일반적인 경우), PPU는 EXT 핀에서 배경색에 대한 [[PPU_palettes|팔레트 인덱스]]를 가져온다. 순정 NES는 이 핀들을 접지하여 예상대로 팔레트 인덱스 0을 배경색으로 만든다. EXT 핀에 연결된 보조 그림 생성기는 배경 팔레트의 색상을 사용하여 배경을 다른 이미지로 교체할 수 있으며, 이는 시차 스크롤링과 같은 기능에 사용될 수 있다. 비트 6을 설정하면 PPU는 각 픽셀에 대해 EXT 핀에 팔레트 메모리 인덱스의 하위 4비트를 출력한다. 4비트만 출력되므로 일반적으로 배경과 스프라이트 픽셀을 이 방법으로 구별할 수 없다. 이 비트를 설정해도 PPU의 컴포지트 비디오 출력의 이미지는 영향을 받지 않는다. 수정되지 않은 NES에서는 EXT 핀이 접지되어 있으므로, 비트 6을 설정하는 것은 0이 아닌 픽셀 값을 출력할 때마다 칩을 손상시킬 수 있으므로 권장되지 않는다(실질적으로 Vcc와 GND를 함께 단락시키기 때문). 투명 픽셀에 대한 EXT 출력은 일반적인 배경색이 아니라 해당 배경 슬라이버 팔레트의 항목 0이라는 점에 유의하라. 렌더링이 비활성화되면 [[PPU palettes|배경 재정의]]에 관계없이 EXT 출력은 항상 인덱스 0이다. ==== 비트 0 경쟁 조건 ==== 수평 네임테이블 배열(일명 수직 미러링) 또는 4화면 VRAM을 사용하는 경우 vblank 외부에서 이 레지스터에 쓸 때 주의하라. 특정 CPU-PPU 정렬의 경우, [[PPU scrolling#At dot 257 of each scanline|도트 257]]에서 시작하는 쓰기는 다음 스캔라인만 왼쪽 네임테이블에서 잘못 그려지게 한다. 이것은 눈에 보이는 결함을 유발할 수 있으며, 해당 스캔라인에 대한 스프라이트 0 히트를 방해할 수도 있다(잘못된 배경으로 그려지기 때문). 이 결함은 수평 또는 단일 화면 미러링에서는 왼쪽과 오른쪽 네임테이블이 동일하기 때문에 효과가 없다. 도트 257에서 시작하여 도트 258까지 계속되는 쓰기만 이 결함을 유발할 수 있다. 다른 모든 수평 타이밍은 안전하다. 이 결함은 구체적으로 열린 버스의 값을 레지스터에 쓰는데, 이는 거의 항상 주소의 상위 바이트가 될 것이다. 원하는 네임테이블에 따라 이 레지스터 또는 $2100에 있는 이 레지스터의 미러에 쓰는 것이 [//forums.nesdev.org/viewtopic.php?p=230434#p230434 기능적인 해결 방법]으로 보인다. 이것은 ''슈퍼 마리오 브라더스''에서 프로그램이 게임 로직 끝에 PPUCTRL에 쓸 때 가끔 [[Game bugs|보이는 결함]]을 생성한다. 게임 로직 중에 NMI를 껐다가 게임 로직이 끝나면 NMI를 다시 켜서 게임 로직이 끝나기 전에 NMI 핸들러가 다시 호출되는 것을 방지하는 것으로 보인다. 또 다른 해결 방법은 PPU의 NMI 활성화를 사용하는 대신 소프트웨어 플래그를 사용하여 NMI 재진입을 방지하는 것이다. {{Anchor|PPUMASK}}{{Anchor|Reg2001}}{{Anchor|Mask_($2001)_>_write}} 요약: 한식구 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 한식구위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 자동 편집 스팸으로부터 위키를 보호하기 위해, 다음 CAPTCHA를 풀어주세요: 취소 편집 도움말 (새 창에서 열림)