6809 어셈블리로 28x28 타일 복사를 스택 명령으로 처리한 옛 게임 해킹
- 1980년대 8비트 PC에서 친구가 만들던 사이드스크롤 아케이드 이식판이 너무 느려 플레이가 불가능했고, 루프 언롤링과 불필요한 드로 제거까지 끝낸 코드에는 더 손볼 곳이 없었음
- 배경 타일은 28x28 픽셀에 16색(픽셀당 4비트)이라 행당 14바이트 28행, 화면 버퍼는 320x240이라 행당 160바이트 240행이며 블리터 없이 바이트 단위로 직접 복사해야 했음
- 6809의 16비트 인덱스 레지스터와 auto-increment 주소 모드로 LDU ,X++ / STU ,Y++ 두 명령이 4픽셀씩 옮기고 LEAY 160-14,Y로 다음 행으로 넘어가는 COPYTILE 서브루틴이 나옴
- 토론에서는 해법을 PSHU/PULS 스택 명령을 이용한 메모리 복사 트릭으로 지목하며, 1983년 무렵 코코 개발자들 사이에 이미 알려져 있었고 Defender(1981)나 Joust(1982)가 가장 이른 상용 사례일 수 있다는 증언이 나옴
- 유진 자비스가 이 트릭을 PUSH-U / PUL-Me라고 불렀다는 일화와 함께, 게임보이 Monster Max가 ld de,NNNN / push de 루프를 메모리에 만들어 VRAM에 쓴 사례도 언급됨
Hacker News 의견들
요즘 AI 시대에 딱 빠져 있는 게 이런 과정 아님? Claude한테 레버나 당기면 해결된다고 하는 건 좀 슬프지.
사람들은 언제나 같이 머리 맞대고 문제를 푸는 법을 찾아냄. 다만 요즘 기계가 워낙 좋아서 이런 트릭이 지난 25년간 주된 기여는 아니었던 것도 사실이고, PS2 VU나 레지스터 스왑 정도는 있어도 전체 제품 규모에 비하면 작음.
6502에서 페이지 경계 써가며 짠 내 작업이 우습게 보이네. 그 시절이 좋았다.
이건 멜 이야기랑 같은 정신임. 기계를 속속들이 알아서 원래 용도가 아닌 방식으로 명령을 쓰는 거니까. 그래도 톰은 진짜 프로그래머는 아님, 진짜 프로그래머는 기계어 썼으니까. 그래도 나는 톰 이야기가 더 좋음, 전설 만들기가 아니라 기계를 이해하는 즐거움에 대한 이야기라서.
비디오 세븐에서 VGA 클론 만들 때 토드 윌슨이 파라다이스가 FIFO를 넣었다는 소문만 듣고 밤새 고민한 이야기가 생각남. 그 FIFO라는 것도 그냥 2상 핸드셰이크 비트 달린 레지스터였을 수 있는데, 그 시절엔 그런 걸 부를 용어가 없었지.
게임보이 Monster Max는 ld de,NNNN / push de 루프를 메인 메모리에 만들어서 VRAM에 씀. 1994년작이고 영국 아이소메트릭 플랫포머 계보의 마지막 작품임.
게임보이는 VBlank/HBlank에만 메모리에 쓸 수 있으니까 그 트릭이 잘 먹힘. 내 실험에도 훔쳐야겠다.
HN에서 테리 데이비스가 TempleOS 홍보하던 댓글이 붙은 것도 반가움. 그분 이야기가 어떻게 끝났는지 생각하면 좀 슬프지만.
HolyC 좀 써봤는데 환경 자체는 꽤 재밌음. 종교적인 부분은 걷어내기 쉬움. 실행 중인 커널을 고칠 수 있다는 건 진짜 매력임.
TI-83+ TI-BASIC으로 게임 만들면서 시작했는데 끝 괄호를 다 빼는 이상한 트릭을 썼음. 이상한 언어에서 트릭 쓰는 훈련이 됐지. TI-81은 더 심해서 레이블 테이블이 없으니 분기가 뒤로 갈수록 느려지고 Then/Else도 없었음.
6809 PSHU/PULS 트릭은 톰 뫼르텔보다 먼저 여러 번 독립적으로 발견됐을 거임. 코코 3가 1986년인데 1983년 Rainbowfest에서 이미 들었고 스티브 비요크도 DataSoft 개발자들이 쓴다고 했음. 가장 이른 상용 사례는 Defender(1981)나 Joust(1982)일 듯.
6502는 마이크로코드가 아님, 완전 단순한 칩임. 벡트렉스도 6809인데 벡터 드로잉 루틴이 스택으로 명령을 엮어서 처리함.
그 시절엔 알아내는 건 잘해도 문서로 정리해 퍼뜨리는 건 못했음. 책에는 opcode만 실려 있어서 이런 트릭은 아는 사람한테 듣거나 직접 다시 알아내야 했지.
요즘 CPU에서는 이런 트릭이 의미 없음. 한 클럭에 여러 명령을 처리하니까 병목이 명령 실행이 아니라 메모리 접근임.
그건 좀 아닌 게, 이 기사는 SIMD 없는 명령어 집합에서 SIMD 흉내 내는 해킹임. SIMD가 지금도 이득인 건 컴파일러가 계속 내보내니까 당연한 거고.