경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.스팸 방지 검사입니다. 이것을 입력하지 마세요!=== PPUSTATUS - 렌더링 이벤트 ($2002 읽기) === ---- 7 bit 0 ---- ---- VSOx xxxx |||| |||| |||+-++++- ([[Open_bus_behavior#PPU_open_bus|PPU 열린 버스]] 또는 2C05 PPU 식별자) ||+------- [[PPU_sprite_evaluation#Sprite_overflow_bug|스프라이트 오버플로]] 플래그 |+-------- [[PPU_OAM#Sprite_zero_hits|스프라이트 0 히트]] 플래그 +--------- Vblank 플래그, 읽을 때 지워짐. <u>'''신뢰할 수 없음'''</u>; 아래 참조. PPUSTATUS ("상태" 레지스터)는 렌더링 관련 이벤트의 상태를 반영하며 주로 타이밍에 사용된다. 이 레지스터의 세 플래그는 프리렌더 스캔라인의 도트 1에서 자동으로 지워진다. 설정 및 해제 타이밍에 대한 자세한 내용은 [[PPU 렌더링]]을 참조하라. 이 레지스터를 읽으면 PPU의 [[#Internal registers|내부 w 레지스터]]가 지워지는 부작용이 있다. 쓰기가 올바른 순서로 이루어지도록 [[#PPUSCROLL|PPUSCROLL]] 및 [[#PPUADDR|PPUADDR]]에 쓰기 전에 일반적으로 읽는다. ==== Vblank 플래그 ==== vblank 플래그는 vblank 시작 시(스캔라인 241, 도트 1) 설정된다. PPUSTATUS를 읽으면 이 플래그의 현재 상태가 반환된 다음 지워진다. 읽어서 vblank 플래그가 지워지지 않으면 프리렌더 스캔라인의 도트 1에서 자동으로 지워진다. <u>'''vblank 플래그를 읽는 것은 vblank를 감지하는 신뢰할 수 있는 방법이 아니다. 대신 [[NMI thread|NMI]]를 사용해야 한다.'''</u> 플래그가 설정되기 전 도트(스캔라인 241, 도트 0)에서 플래그를 읽으면 0으로 읽히고 지워지므로, vblank 플래그에 대해 PPUSTATUS를 폴링하면 vblank를 놓치고 게임이 버벅거릴 수 있다. 이 경우 NMI도 억제되며, 다음 도트 또는 두 도트에 걸친 읽기에 의해서도 억제될 수 있다. NTSC 및 PAL에서는 플래그가 두 프레임 연속으로 떨어지지 않는 것이 보장되지만, Dendy에서는 [[PPU_power_up_state#Dendy|매 프레임마다 발생]]하여 게임이 충돌할 수 있다. NMI를 사용하면 소프트웨어가 매 프레임마다 vblank를 올바르게 감지할 수 있다. 또한 PlayChoice-10에서도 필요하며, NMI가 너무 오랫동안 비활성화되면 게임을 거부한다. 콘솔을 부팅하는 동안에는 vblank 플래그를 폴링해야 하지만, 이 시점의 타이밍은 중요하지 않다(안전한 부팅에 대한 자세한 내용은 [[Init code]] 참조). vblank 플래그는 NMI 생성에 사용되며, 이 플래그가 1인 동안 NMI를 활성화하면 즉시 NMI가 발생한다([[PPU_registers#Vblank_NMI|PPUCTRL]] 참조). ==== 스프라이트 0 히트 플래그 ==== [[PPU_OAM#Sprite_zero_hits|스프라이트 0 히트]]는 OAM의 첫 번째 스프라이트(스프라이트 0)와 배경 간의 픽셀 단위 충돌을 감지하는 하드웨어 충돌 감지 기능이다. 스프라이트 0 히트 플래그는 스프라이트 0의 불투명한 픽셀이 배경의 불투명한 픽셀과 겹칠 때 즉시 설정되며, 스프라이트 우선 순위와는 무관하다. '불투명'은 픽셀이 '투명'하지 않다는 것을 의미한다. 즉, [[PPU_pattern_tables|두 패턴 비트]]가 %00이 아니다. 플래그는 프리렌더 스캔라인의 도트 1까지 설정된 상태를 유지하므로 프레임당 하나의 충돌만 감지할 수 있다. 이 플래그는 충돌을 감지하지만 주로 타이밍에 사용된다. 많은 게임에서 스프라이트 0을 화면의 고정된 위치에 배치하고 이 플래그가 설정될 때까지 폴링한다. 이를 통해 CPU는 화면에서 대략적인 위치를 파악하여 하드웨어 레지스터에 대한 화면 중간 쓰기 시간을 맞출 수 있다. 일반적으로 이것은 ''슈퍼 마리오 브라더스''와 같이 배경 기반 HUD를 허용하기 위해 화면 중간에 스크롤 위치를 변경하는 데 사용된다. 그러나 일부 최신 홈브루 게임은 [https://forums.nesdev.org/viewtopic.php?t=15850 ''Lunar Limit''] 및 [https://fiskbit.itch.io/irritating-ship ''Irritating Ship'']과 같이 실제 충돌에 이를 사용한다. 스프라이트 0 히트는 X=255에서 또는 [[#PPUMASK|PPUMASK]]를 통해 스프라이트나 배경이 비활성화된 곳에서는 충돌을 감지할 수 없다. 여기에는 가장 왼쪽 8픽셀이 숨겨져 있을 때 X=0..7이 포함된다. 그러나 PAL의 왼쪽 및 오른쪽 가장자리 자르기에는 영향을 받지 않는다. 타이밍에 이 플래그를 사용할 때 몇 가지 중요한 고려 사항이 있다. * 스프라이트 0 히트는 프리렌더 스캔라인까지 지워지지 않으므로 소프트웨어는 이전 프레임의 히트를 현재 프레임의 히트로 착각할 수 있다. 따라서 플래그가 다시 설정되기를 기다리기 전에 플래그가 지워질 때까지 폴링해야 할 수 있다. * 게임이 스프라이트 0 히트가 발생할 것으로 예상하고 발생하지 않으면 종종 충돌이 발생한다. 히트가 발생하지 않을 위험이 있는 경우(아마도 스크롤할 때 겹침이 발생하지 않거나 전원 주기, 콘솔 또는 에뮬레이터에 따라 달라질 수 있는 정확한 화면 중간 타이밍에 의존하기 때문에) 폴링 루프를 빠져나갈 다른 방법이 있는 것이 중요하다. 예를 들어, vblank 플래그를 폴링하거나 NMI 핸들러가 게임이 여전히 스프라이트 0 히트를 폴링하고 있는지 확인하여 이를 수행할 수 있다. * 게임은 종종 랙 프레임에서 스프라이트 0 히트를 처리하지 않아 화면 중간 이벤트가 발생하지 않는다. 이로 인한 일반적인 결과는 랙 중에 HUD가 깜박이는 것이다. 적어도 랙 프레임에서 NMI 핸들러에서 스프라이트 0 히트를 처리하면 이 문제를 해결할 수 있다. ==== 스프라이트 오버플로 플래그 ==== 스프라이트 오버플로 플래그는 스캔라인에 8개 이상의 스프라이트가 있을 때마다 설정되도록 의도되었다. 불행히도 이를 감지하는 논리가 제대로 작동하지 않아 PPU가 9번째 스프라이트를 검색할 때 OAM에서 잘못된 인덱스를 확인하게 된다. 이로 인해 거짓 양성과 거짓 음성이 모두 발생한다. 잘못된 동작에 대한 자세한 내용은 [[PPU sprite evaluation#Sprite_overflow_bug|PPU 스프라이트 평가]]를 참조하라. 실제로 스프라이트 오버플로는 스프라이트 0 히트와 같이 타이밍에 사용되지만, 버그가 있는 동작과 9개의 스프라이트 타일 비용 때문에 일반적으로 두 개 이상의 타이밍 소스가 필요할 때만 사용된다. 스프라이트 0 히트와 마찬가지로 이 플래그는 프리렌더 스캔라인 시작 시 지워지며 프레임당 한 번만 설정할 수 있다. 스프라이트 오버플로를 사용하는 것은 종종 최후의 수단이다. 매퍼 IRQ를 사용할 수 없는 경우 [[APU_DMC#Usage_of_DMC_for_syncing_to_video|DMC IRQ]]는 타이밍에 효과적인 대안이 될 수 있지만 사용하기 복잡하다. ==== 2C05 식별자 ==== 2C05 시리즈 아케이드 PPU는 PPU 열린 버스 대신 비트 4-0에 식별자를 반환한다. 이 값은 일종의 복사 방지 형태로 게임에서 확인한다. 이는 소비자용 2C05-99에는 적용되지 않으며, 평소와 같이 열린 버스를 반환한다. PPU에서 직접 데이터를 수집하지는 않았지만 2C05 게임은 다음 값을 예상한다. {| class="tabular" ! PPU ! 마스크 ! 값 |- | 2C05-02 | $3F | $3D |- | 2C05-03 | $1F | $1C |- | 2C05-04 | $1F | $1B |} {{Anchor|OAMADDR}}{{Anchor|Reg2003}}{{Anchor|OAM_address_($2003)_>_write}} 요약: 한식구 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 한식구위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요. 또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요! 자동 편집 스팸으로부터 위키를 보호하기 위해, 다음 CAPTCHA를 풀어주세요: 취소 편집 도움말 (새 창에서 열림)