- Magicore Anomala는 1985년 출시된 Amiga의 그래픽·사운드 능력으로 전체 화면 CG와 애니메이션식 전환을 구현하지만, 게임 엔진 안에서는 RAM 배치와 화면 분할, 스프라이트 제약을 동시에 풀어야 함
- 일반적인 Amiga 500 구성에서는 그래픽·사운드에 쓸 수 있는 Chip RAM이 512KB뿐이라, 320x240·32색 CG의 48KB 비압축 크기가 큰 부담이 됨
- CG는 ZX0 압축으로 약 8KB까지 줄여 확장 RAM에 두고, 표시 직전에 Chip RAM으로 풀면서 기존 화면 메모리 48,000바이트를 재사용함
- 전환 효과는 copper가 특정 스캔라인에서 하드웨어 레지스터를 바꾸고 bitplane DMA를 끄고 켜는 방식으로 만들며, CPU는 매 프레임 split 폭에 맞춰 copperlist 값을 조정함
- 배경의 motion lines는 Amiga 스프라이트의 색상·재사용·bitplane 의존성을 우회해야 하며, attached sprites와 더미 제어 비트, 1개 bitplane 유지,
BPLMOD1조정이 핵심 장치가 됨
Amiga 500에서 전체 화면 CG를 넣는 RAM 문제
- Magicore Anomala의 대상 플랫폼은 일반적인 Amiga 500이며, 구성은 512KB Chip RAM과 512KB 확장 RAM임
- Amiga 칩셋이 그래픽과 사운드 출력에 사용할 수 있는 메모리는 Chip RAM뿐임
- 확장 RAM은 CPU만 접근할 수 있어 그래픽·사운드용으로 직접 쓰기 어려움
- 전체 화면 캐릭터 그래픽(CG)은 320x240 비트맵의 32색 이미지이며, 비압축 상태에서 48KB를 차지함
- 공통 애셋, 레벨 데이터, 화면 메모리 할당까지 고려하면 48KB는 큰 오버헤드임
- 최근 추가된 애셋 압축 지원은 ZX0 압축 형식을 사용함
- 압축된 CG는 약 8KB로 줄어듦
- 레벨 애셋 로드 시 압축된 CG를 확장 RAM에 넣음
- 표시 직전에 Chip RAM으로 압축 해제함
48KB Chip RAM을 새로 확보하지 않는 방식
- CG를 위해 별도의 48KB 빈 Chip RAM을 찾지 않고, 기존 화면 메모리 일부를 재사용함
- 방 배경 이미지
- 위험 오브젝트 렌더링용 화면 레이어
- 텍스트박스 화면 영역
- 이 세 메모리 영역은 RAM에서 연속되어 있고, 합산 크기가 48,000바이트로 CG의 정확한 크기와 일치함
- 방 배경 이미지는 CG 표시가 끝난 뒤 복원할 수 있어 덮어써도 문제가 없음
- CG 압축 해제에는 약 500ms가 걸리지만, 컷신 흐름 안에 넣어 로딩처럼 보이지 않게 함
- Magicore Anomala의 게임플레이 proof-of-concept 영상은 YouTube에서 볼 수 있음
화면 분할 효과와 copper 사용
- 처음에는 세로 wipe 전환을 고려했지만, 보기 좋게 만들려면 스캔라인마다 색상 팔레트를 조정하는 그라디언트가 필요했음
- copper만으로는 수평 블랭크 하나에서 32색을 모두 설정하기 어렵다고 판단함
- “racing the beam”을 다루고 싶지 않아 화면 분할 효과를 선택함
- 화면 분할 효과는 일반 시청자에게 더 멋져 보이고, Amiga의 copper가 사실상 이런 효과에 맞게 설계된 것처럼 동작함
- 비슷한 효과가 Amiga Workbench에 내장된 사례는 이 영상에서 확인할 수 있음
- 구현에는 Amiga의 두 기능이 함께 쓰임
- copper는 CPU와 병렬로 자체 명령 목록을 실행하고, 특정 화면 라인에서 하드웨어 레지스터를 바꿀 수 있음
- 화면 포인터를 하드웨어 레지스터로 설정해 화면 메모리를 Chip RAM의 어느 위치로든 바꿀 수 있음
bitplane DMA를 멈췄다가 다시 이어 그리기
- 예시로 메인 화면 메모리가
0x20000에서 시작하면, 일반적으로 copper가 bitplane DMA 레지스터에 이 주소를 설정함- bitplane을 활성화하면 DMA가 해당 메모리 영역을 순서대로 읽으며 화면에 그림
- 각 수평 라인이
0x100바이트를 차지할 때 화면 포인터를0x20800으로 설정하면, 화면이 8라인 위로 스크롤된 것처럼 보임- 화면 시작점이 메모리상 8라인 아래로 이동하기 때문임
- 분할의 위쪽 절반은 이 방식으로 위로 스크롤함
- split 지점에서 copper는 bitplane DMA를 끄고 배경색을 빨간색으로 바꿈
- bitplane 관련 하드웨어 레지스터는 그 시점에서 사실상 멈춤
- split의 아래쪽에 도달하면 배경색을 복구하고 bitplane DMA를 다시 켬
- 화면은 멈췄던 위치에서 다시 이어 그려지지만, 실제 표시 위치는 더 아래가 됨
- 매 프레임 CPU는 split의 현재 폭에 따라
vs_TCopTop과vs_TCopBottom을 조정함- 위쪽 split을 위한 화면 포인터 조정도 함께 이뤄지지만, 코드 예시에는 포함되지 않음
“woosh” 모션 라인을 위한 스프라이트 우회
- 애니메이션식 배경의 motion lines는 스프라이트로 그림
- 스프라이트는 화면 메모리와 독립적으로 그려지고 이동할 수 있어 이 용도에 적합함
- 다만 Amiga 스프라이트는 제한이 많고 다루기 복잡함
-
색상 제약
- 스프라이트는 bitplane과 색상 팔레트를 공유하므로 가능한 적은 색상만 써야 함
- motion lines는 3색만 사용해 CG에 28색, 배경에 1색을 남김
- Amiga에서는 스프라이트 쌍마다 사용하는 팔레트 색상 범위가 다름
- 첫 두 스프라이트는 색상 16-19를 사용함
- 다음 두 스프라이트는 색상 20-23을 사용함
- 두 스프라이트를 attach하면 16색 팔레트를 가진 하나의 스프라이트처럼 동작하며 색상 16-31을 사용할 수 있음
- motion lines는 4개의 attached sprites를 사용하고, 그래픽에서는 색상 29-31만 씀
-
같은 스프라이트 그래픽을 여러 위치에 쓰기
- 스프라이트 그래픽의 처음 4바이트는 위치와 높이를 지정하는 제어 비트임
- 같은 그래픽을 여러 위치에 그리려면 이 구조가 문제가 됨
- 하드웨어 레지스터로 스프라이트 제어 비트를 직접 설정하려 했지만, 화면에 표시되게 만들지 못함
- Amiga sprite DMA는 bitplane DMA처럼 스프라이트 데이터 포인터를 따라가며 화면에 그림
- 해결 방식은 4바이트짜리 가짜 스프라이트 8개를 만드는 것임
- 이 가짜 스프라이트는 제어 비트만 포함함
- 모든 스프라이트 포인터를 먼저 가짜 스프라이트로 설정함
- 약 19라인에서 sprite DMA가 포인터를 보고 제어 비트를 장전함
- 그 뒤 모든 포인터를 실제 “motion line” 그래픽으로 바꿈
- 결과적으로 DMA는 서로 다른 위치에 스프라이트를 그리도록 장전된 상태에서 같은 그래픽을 사용하며, 이 전환은 copperlist에서 처리됨
bitplane을 끄면 스프라이트도 사라지는 문제
- CG가 화면 상단에 도달하기 전에는 화면 위쪽과 CG 시작 지점 사이에 빈 공간이 있음
- 이때 bitplane을 켜 두면 화면에 잡데이터가 그려짐
- 해당 영역에서는 bitplane을 꺼서 DMA가 잡데이터를 읽지 않게 해야 함
- 문제는 bitplane을 끄면 스프라이트도 그려지지 않는다는 점임
- motion lines가 CG의 경계 안에서만 보이는 현상이 생김
- 해결책은 bitplane을 완전히 끄지 않고 1개만 켠 채, 화면 포인터를 빈 데이터로 설정하는 방식임
- 화면에는 무언가를 그리지만 결과적으로 아무것도 보이지 않게 함
- 빈 화면 전체를 마련할 필요는 없음
- 1비트 픽셀 기준 320픽셀 한 줄은 320비트, 즉 40바이트임
BPLMOD1을-40으로 설정하면 각 라인 뒤에 포인터가 40바이트 뒤로 돌아가 같은 40바이트를 반복해서 그림- 화면의 safety margin에 있는 처음 40바이트를 비워두면 충분함
결과와 남은 세부 과제
- 처음에는 RAM 요구량 때문에 이런 CG를 게임에 넣을지 확신하지 못했지만, 데이터 압축 구현 뒤 오버헤드가 매우 합리적인 수준임을 확인함
- Magicore에 추가적인 시각적 장식을 넣을 수 있게 됨
- 다루지 않은 작은 과제도 남아 있음
- 예를 들어 100px motion line이 화면 위로 벗어난 뒤 아래쪽이 갑자기 사라지지 않게 만드는 문제
- 이 효과는 blitter를 전혀 사용하지 않음
- blitter 관련 글은 Getting clever with the Amiga blitter에서 다룸
- Amiga는 1980년대 후반 사람들에게 인상적이었던 것처럼, 오늘날에도 컬러 그래픽 표시 능력으로 사람들에게 인상을 줄 수 있는 플랫폼으로 남아 있음