편집 요약 없음 |
편집 요약 없음 |
||
| 2번째 줄: | 2번째 줄: | ||
* '''[[#메모리 미러링|메모리 미러링]]'''은 동일한 메모리가 여러 주소에서 접근될 수 있을 때 발생하며, 명백한 중복을 야기한다. | * '''[[#메모리 미러링|메모리 미러링]]'''은 동일한 메모리가 여러 주소에서 접근될 수 있을 때 발생하며, 명백한 중복을 야기한다. | ||
* '''[[#네임테이블 미러링|네임테이블 미러링]]'''은 NES의 2x2 [[네임테이블 미러링|배경 네임테이블]] 그래픽의 레이아웃을 설명하며, 일반적으로 미러링된 메모리에 의해 달성된다. | * '''[[#네임테이블 미러링|네임테이블 미러링]]'''은 NES의 2x2 [[#네임테이블 미러링|배경 네임테이블]] 그래픽의 레이아웃을 설명하며, 일반적으로 미러링된 메모리에 의해 달성된다. | ||
2025년 10월 1일 (수) 00:10 판
NES에는 두 가지 유형의 미러링이 있다:
- 메모리 미러링은 동일한 메모리가 여러 주소에서 접근될 수 있을 때 발생하며, 명백한 중복을 야기한다.
- 네임테이블 미러링은 NES의 2x2 배경 네임테이블 그래픽의 레이아웃을 설명하며, 일반적으로 미러링된 메모리에 의해 달성된다.
메모리 미러링
메모리 미러링은 메모리 또는 I/O 레지스터가 둘 이상의 주소 범위에 나타나는 것을 말하며, 동일한 바이트가 둘 이상의 주소에서 접근 가능하다. 이것은 전체 주소가 완전히 디코딩되지 않았을 때, 즉 칩이 하나 이상의 주소 라인을 무시할 때 발생한다. 주소를 완전히 디코딩하는 것은 일반적으로 칩에 훨씬 더 많은 핀을 필요로 하기 때문에, 불완전한 디코딩은 필요한 하드웨어를 줄이기 위해 사용된다. 미러가 그렇지 않으면 사용되지 않는 주소 공간을 차지하는 경우, 아무런 문제가 되지 않는다.
NES 내에서는 많은 것들이 미러링된다:
- $0000-$07FF의 시스템 메모리는 $0800-$0FFF, $1000-$17FF, $1800-$1FFF에서 미러링된다 - 예를 들어 $0173에서 메모리에 접근하려고 시도하는 것은 $0973, $1173, 또는 $1973에서 메모리에 접근하는 것과 같다.
- $2000-$2007의 PPU I/O 레지스터는 $2008-$200F, $2010-$2017, $2018-$201F 등 $3FF8-$3FFF까지 미러링된다.
- 대부분의 단순한 매퍼에 있는 단일 레지스터는 $8000-$FFFF 전체에 걸쳐 미러링된다.
- 많은 일반적인 ASIC 매퍼(예: MMC1 및 MMC3)의 레지스터도 $8000-$FFFF 전체에 걸쳐 그룹으로 미러링된다.
- 아래에 설명된 네임테이블 미러링은 PPU $2000-$2FFF 내의 메모리 미러링으로 인해 발생한다(따라서 그 이름이 붙여졌다). 그러나 이 경우 메모리 미러링은 의도적이고 필요하다.
- NROM-128에서는 16k PRG ROM이 $8000-$BFFF와 $C000-$FFFF 모두에 미러링된다.
- 대부분의 mapper에서 PRG 또는 CHR ROM의 끝을 지난 뱅크는 이전 뱅크의 미러로 나타난다. 예를 들어, UNROM PRG 뱅크 8-15는 각각 뱅크 0-7의 복사본이다. Non-power-of-two ROM size는 더 복잡한 미러링을 의미할 수 있다.
네임테이블 미러링
네임테이블 미러링은 현재 네임테이블의 오른쪽 및 아래쪽 가장자리를 지나 표시되는 내용에 영향을 미친다. 특정 축(수평 및/또는 수직)에 대해 미러링이 활성화되면 좌표는 현재 네임테이블에서 단순히 래핑된다. 이런 식으로 "미러링된" 배경은 뒤집히지 않고 반복된다. 미러링이 비활성화되면 두 번째 네임테이블이 사용된다. 미러링에는 네 가지 일반적인 조합이 있다:
수평

네임테이블의 수직 배열은 수평 미러링을 초래하며, 이는 32x60 타일맵을 만든다.
이것은 수직으로만 또는 모든 방향으로 스크롤하는 게임에 가장 일반적으로 사용된다.
수평 미러링을 사용하여 수평 스크롤을 하는 것은 부드럽게 하기가 어렵다. 왜냐하면 화면 오른쪽의 데이터가 미러링으로 인해 즉시 왼쪽에 표시되기 때문이다. 하드웨어 왼쪽 화면 클리핑을 영리하게 사용하면 모든 네임테이블 결함을 숨길 수 있지만, 속성 테이블의 해상도가 2x2 타일이기 때문에 화면의 왼쪽 및/또는 오른쪽에 항상 속성 결함이 있을 것이다. 그것을 숨기는 가장 좋은 방법은 양쪽에 잠재적으로 잘못된 속성을 가진 4개의 픽셀을 두는 것이지만, 대부분의 상용 게임은 보통 8개 또는 그 이상의 결함 픽셀을 가지고 있어 그보다 더 나빴다. 그래서 많은 NES 게임이 화면 경계에 색상 결함을 가지고 있는 것이다.
일부 텔레비전은 왼쪽과 오른쪽 경계 모두에서 최대 8픽셀까지 overscan하지만 대부분은 그렇지 않다. 완벽주의 프로그래머는 Alfred Chicken 게임에서처럼 속성 결함을 숨기고 화면을 대칭적으로 보이게 하고 모든 속성 결함을 절대적으로 숨기기 위해 오른쪽 경계에 단색 검은색 스프라이트를 사용할 수 있었지만, 스캔라인당 스프라이트 수를 7개로 줄이고 많은 OAM 공간(8x16 픽셀 스프라이트 모드에서 약 1/4)을 낭비하기 때문에 이렇게 하는 게임은 거의 없다.
카트리지 보드를 수평 미러링으로 구성하려면 PPU A11을 CIRAM A10에 연결하라. 닌텐도에서 만든 카트리지 보드에서는 "V" 솔더 패드("수직 배열"용)를 단락시켜 선택한다.
수직

네임테이블의 수평 배열은 수직 미러링을 초래하며, 이는 64x30 타일맵을 만든다.
이것은 수평으로만 스크롤하는 게임에 가장 일반적으로 사용된다. 수직으로 스크롤하고(어떤 양으로든 상태 표시줄 없이) 한 화면 이상 수평으로 스크롤하지 않는 게임은 이 미러링을 사용한다(예: Lode Runner, Bomberman, Fire Emblem, Crystal Mines). 그러면 수평으로 스크롤할 때 아무것도 로드할 필요가 없다.
물론 상태 표시줄 없이 양방향으로 스크롤하는 게임에도 사용된다. 화면 상단/하단에 있는 데이터가 즉시 다른 쪽에 나타나기 때문에, NTSC overscan을 영리하게 사용하면 결함 없는 다방향 스크롤을 만들 수 있지만, PAL 텔레비전(그리고 오버스캔 범위가 약간 벗어난 NTSC 텔레비전)에서는 결함이 나타날 것이다. 결함을 숨기는 가장 좋은 방법은 양쪽에 잘못된 타일을 가진 4개의 픽셀과 잘못된 색상을 가진 4개의 추가 픽셀을 만드는 것이지만, 대부분의 상용 게임은 이보다 훨씬 더 나빴다. 그래서 오버스캔이 비활성화되면 그렇게 나쁘게 보이는 것이다.
완벽주의 프로그래머는 Jurassic Park 및 M.C. Kids 게임에서처럼 결함을 숨기기 위해(그리고 아마도 VRAM을 업데이트하기 위해 더 많은 블랭킹 시간을 제공하기 위해) 래스터 분할을 사용할 수 있었지만, 작은 이점을 위해 코드를 많이 복잡하게 만들기 때문에 거의 수행되지 않았다.
카트리지 보드를 수직 미러링으로 구성하려면 PPU A10을 CIRAM A10에 연결하라. 닌텐도에서 만든 카트리지 보드에서는 "H" 솔더 패드("수평 배열"용)를 단락시켜 선택한다.
단일 화면

단일 화면 미러링은 AxROM, SxROM, TLSROM 보드와 같은 특정 매퍼에서만 사용할 수 있으며, 두 개의 32x30 타일맵을 생성한다.
주요 장점은 화면 상단이나 하단에 상태 표시줄을 사용하면서 플레이 필드를 모든 방향으로 동일하게 확장할 수 있다는 것이다. 이는 상태 표시줄을 하나의 네임테이블에 저장하고, 다른 네임테이블에서 플레이 필드를 렌더링하고, 렌더링 중 적절한 화면 위치에서 미러링(및 스크롤 매개변수)을 전환하여 수행할 수 있다.
1화면 미러링을 사용할 때 대폭 단순화될 수 있는 다른 많은 것들도 있다. 화면에 업데이트할 데이터의 PPU 주소를 계산하는 데 사용되는 공식도 훨씬 간단하며, 상태 표시줄의 크기가 가변적이거나 스크롤되는 경우 1화면 미러링 없이는 이 모든 것이 골칫거리가 될 것이다.
이 미러링을 수평으로 스크롤하는 데 사용하면 수평 미러링과 유사한 결함 및 스크롤 문제가 발생한다. 그러나 상태 표시줄이 있는 한, 화면 하단(또는 상단)에서 떨어지는 데이터가 오버스캔 요인에 관계없이 상태 표시줄에 의해 "숨겨진" 영역으로 들어오기 때문에 수직으로는 결함이 발생하지 않는다.
카트리지 보드를 단일 화면 미러링으로 구성하는 방법에는 여러 가지가 있다. 일부 보드에는 MMC1 및 AxROM과 같이 매퍼 제어되는 단일 화면 미러링이 있다. AxROM의 경우 레지스터(예: 74HC161)의 출력을 CIRAM A10에 연결한다(AxROM은 PRG D4를 래치함). 소프트웨어로 변경할 수 없는 고정된 단일 화면 미러링을 만드는 더 간단한 방법은 CIRAM A10을 Gnd 또는 Vcc에 간단히 연결하는 것이다. iNES Mapper 218을 구현하는 보드는 CIRAM A10을 PPU A10, A11, A12 또는 A13에 연결하여 게임이 카트리지에 CHR ROM이나 CHR RAM 없이 CIRAM에 타일을 저장할 수 있도록 한다.
4화면

카트리지에 추가 RAM 및/또는 PPU 주소 매핑이 있으면 PPU 버스를 통해 4개의 고유한 네임테이블을 주소 지정할 수 있으며, 64x60 타일맵을 생성하여 보다 유연한 화면 레이아웃을 허용한다. 이 미러링 부족을 활용한 게임은 거의 없다.
4화면 RAM 네임테이블을 사용하는 것으로 알려진 게임:
- Rad Racer II
- Gauntlet
- Napoleon Senki
- Rocman X (Sachen)
- 모든 Vs. System 게임
ROM 네임테이블과 함께 4화면을 사용하는 예제 게임:
- Final Lap
- King of Kings
4화면 네임테이블과 함께 사용되는 것으로 알려진 매퍼:
- MMC3 (Rad Racer II).
- iNES 206은 MMC3 기능의 하위 집합을 구현하며 4화면 RAM을 사용할 수 있다(Gauntlet).
- iNES 77은 PPU 메모리 공간 전체에 RAM을 매핑하여 내부 VRAM과 결합하여 4개의 RAM 네임테이블과 패턴 테이블용 CHR-RAM 및 ROM 조합을 제공한다(Napoleon Senki).
- Vs. System은 NES보다 두 배 많은 VRAM을 가지고 있어 영구적인 4화면 설정을 제공한다. 이것은 iNES 99로 가장 잘 보이지만, 여러 다른 매퍼도 이 하드웨어에서 사용되었다.
- Namco 163은 1k CHR-ROM 페이지를 4개의 네임테이블 화면에 임의로 매핑할 수 있다(Final Lap, King of Kings).
- JY Company 매퍼는 1k CHR-ROM 페이지를 4개의 네임테이블 화면에 임의로 매핑할 수 있다.
- UNROM 512 및 GTROM은 4화면 구성의 홈브루 매퍼이다.
일반적이지 않은 4화면 레이아웃이 가능한 다른 매퍼:
- VRC6은 1k CHR-ROM 페이지를 4개의 네임테이블 화면에 임의로 매핑할 수 있다.
- MMC5는 내부 RAM을 사용하여 세 번째 네임테이블을 만들고, 네 번째 네임테이블에 대한 빈 데이터 페이지를 절차적으로 생성하여 (간신히) 4개의 다른 화면을 한 번에 매핑할 수 있다.
iNES 형식은 헤더에 4개의 네임테이블을 지정할 수 있어, 이와 구조적으로 충돌하지 않는 모든 매퍼에 4화면 RAM 네임테이블을 적용할 수 있다(에뮬레이터에서 지원하는 경우).
카트리지 보드에 추가 네임테이블 RAM을 구현하는 방법에는 여러 가지가 있다:
- 보드에 2KiB의 RAM을 추가하고 콘솔에 이미 있는 CIRAM과 디코더 칩으로 결합하여 $2000-$2FFF에서 선형으로 접근 가능한 4k 블록의 RAM을 만든다.
- 보드에 6264 8KiB RAM을 추가하여 콘솔에 있는 CIRAM을 교체한다. 이것은 CIRAM 칩 전체, 즉 $3000-$3EFF에 있는 (일반적으로 사용되지 않는) 4KB의 추가 메모리를 효과적으로 "낭비"한다. 그러나 이것은 더 간단한 단일 칩 솔루션으로 이어진다(또한 오늘날 8KiB RAM 칩은 2KiB 칩보다 더 일반적이고 저렴하다).
- 보드에 더 큰 RAM을 추가하고 전체 PPU 주소 공간에 매핑한다. 이를 통해 동일한 RAM 칩을 공유하는 $0000-$1FFF의 8KiB 패턴 테이블과 $2000-$2FFF의 4KiB 네임테이블을 사용할 수 있다.
기타
-
대각선
-
L자형
-
3화면 수직
-
3화면 수평
-
3화면 대각선
-
1화면 고정
TxSROM 변형의 MMC3, MMC5에서 사용할 수 있는 확장 기술, Namco 163에 의한 임의의 VRAM 미러링 배열, 또는 ROM 네임테이블을 허용하는 매퍼를 사용하는 ROM 미러링 배열과 같은 다른 보드에서는 다른 일반적이지 않은 유형의 미러링을 사용할 수 있다.
대각선 미러링 (CIRAM A10 = PA11 XOR PA10)은 수평 및 수직 미러링 사이를 전환할 필요 없이 스크롤 방향 변경을 용이하게 한다.
Sachen의 374N 및 8259 제품군에서 볼 수 있는 L자형 미러링 (CIRAM A10 = PA11 OR PA10)은 스크롤이 화면 경계에서만 방향을 변경하는 한 네 방향으로 스크롤할 수 있다.
특이한 경우:
- Castlevania 3는 MMC5에서 사용할 수 있는 세 번째 네임테이블 RAM을 사용한다 (그림)
- Laser Invasion은 MMC5에서 사용할 수 있는 세 번째 네임테이블 RAM을 사용한다
- After Burner는 Sunsoft-4 (iNES 68)에서 사용할 수 있는 ROM 네임테이블을 사용하지만 1/H/V 배열만 지원한다.
- Mighty Morphin Power Rangers III, IV (JY Company)는 3화면 수평 구성으로 ROM 네임테이블을 사용하지만 하단 화면은 표시되지 않는다 (그러나 하단 화면은 상태 표시줄에서 사용되었다).
미러링 차트
이 표는 더 간단하고 이해하기 쉬운 미러링 및 스크롤링 기술을 나열한다. 더 복잡한 기술은 매우 다양하다. 보다 포괄적인 조사를 보려면 List of games by mirroring technique를 참조하라.
| 스크롤링 유형 | 미러링 | 예제 게임 | 코멘트 |
|---|---|---|---|
| 없음 | 모두 | Donkey Kong, Tennis | 단일 고정 화면만 있으면 모든 미러링 유형을 사용할 수 있다. |
| 수평만 | 수직 | Super Mario Bros., Gimmick! | 상단의 status bar는 sprite-0 hit로 쉽게 구현할 수 있다(Super Mario Bros. 참조). |
| 수직만 | 수평 | Ice Climber, Gun.Smoke | 상태 표시줄이 없으면 수평 미러링이 수직 전용 스크롤링에 가장 적합한 선택이다. 상태 표시줄이 있으면 수직 또는 단일 화면 미러링은 네임테이블에 상태 표시줄을 렌더링할 위치를 제공하며 스크롤 이음새는 막대 아래에 숨겨져야 한다. |
| 교대 수평/수직 | 매퍼가 H/V 전환 | Metroid, Air Fortress | 움직임은 주어진 시간에 단일 축으로 제한되며, 방향은 새 화면에 도달했을 때만 변경할 수 있다. |
| 제한된 양방향 | 수평/수직 | Super Mario Bros. 3, Fire Emblem | 스크롤링 축 중 하나를 2화면 너비로만 제한함으로써 다른 축에서 무제한 스크롤링을 간단하게 만든다. 무제한 수평 스크롤링을 사용하면 화면 한쪽에 피할 수 없는 속성 결함이 있을 것이다(Super Mario Bros. 3 참조). 그러나 무제한 수직 스크롤링을 사용하면 NTSC 지역에서 overscan으로 숨길 수 있다(Fire Emblem 참조). |
| 무제한 양방향 | 다양함 | Castlevania II, Battletoads, Crystalis, Final Fantasy | 한 번에 양 축에서 무제한 스크롤링은 게임별 솔루션이 필요한 고급 기술이다. |
게임에서 사용되는 미러링 기술을 이해하는 가장 좋은 방법은 디버깅 에뮬레이터를 사용하여 네임테이블을 보는 것이다. 상태 표시줄은 일반적으로 화면의 시간 지정된 위치에서 스크롤 분할이 필요하다. 이것은 매퍼 기반 IRQ로 가장 쉽게 수행할 수 있지만 sprite-0 hit 또는 다른 기술로도 수행할 수 있다.