1980년대 후반, 한 개발자는 친구 집에서 본 아미가(Amiga)의 '크랙 인트로'를 흉내 내려고 ZX 스펙트럼 앞에서 싱클레어 베이직과 잡지에서 베껴 온 어셈블러 루틴을 끝없이 입력했다. 당시의 시도는 번번이 실패했지만, 수십 년이 지난 지금 그는 기본 사양의 128KB 스펙트럼에서 돌아가는 레트로 데모신 인트로를 손수 완성했다. 부드럽게 흐르는 스크롤 텍스트와 커스텀 폰트, 3채널 AY 사운드칩 음악, 움직이는 VU 미터, 그리고 빠질 수 없는 패럴랙스 스타필드까지, 1980년대 말 크랙 인트로의 전형적인 요소를 모두 담았다. 코드 분량은 10,287바이트, 테이프 이미지 전체로는 19,552바이트다. 작년 12월 13일부터 작업했다는 점을 감안하면 주당 약 455바이트를 생산한 셈으로, 본인 표현대로 '초라한' 속도다.
크랙 인트로에서 데모신으로
이 프로젝트의 뿌리는 소프트웨어 불법 복제 그룹이 게임의 복사 방지 장치를 풀어 배포하면서 앞에 붙이던 '크랙트로(cracktro)'에 있다. 피 흘리는 로고, 과시용 텍스트, 회전하는 3D 오브젝트나 스크롤하는 스타필드, 그리고 동료 크래커들에게 보내는 인사와 불법 BBS 광고로 가득한 스크롤 텍스트가 공식처럼 반복됐다. 크래킹 문화가 저물면서 코더와 그래픽 담당, 뮤지션들은 그룹의 기량을 겨루는 본격적인 작품으로 옮겨갔고, 이렇게 데모신이라는 '예술로서의 코드' 문화가 자리 잡았다. 저자는 화려한 장편 프로덕션보다 단일 화면에 스크롤 텍스트와 스타필드만 담은 초기 크랙트로에 늘 매료됐다고 밝힌다. 바깥에서만 들여다볼 수 있었던 그 문화가 이번 작업의 동기였다.
계기는 우연한 대화였다. 스펙트럼용 네트워크 카드를 매개로 알게 된 'Desertkun'은 스피시(Speccy)용 새 와이파이 네트워크 카드를 개발하며 프로토타입을 보내줬고, 영상 통화 중 왜 직접 Z80 어셈블리를 쓰지 않느냐고 물었다. 저자는 자신이 운영하는 TNFS 사이트(스펙트럼용 구식 BBS 겸 인터랙티브 사이트)를 통째로 어셈블리로 다시 쓰는 대신, 그것을 홍보하는 독립형 인트로를 만들기로 했다.
바이트와 비트마스크를 손으로 그리며
개발 환경은 TNFS 사이트를 만들 때와 같은 구성을 재활용했다. Pasmo 어셈블러로 코드를 빌드하고, 직접 포크한 zmakebas로 베이직 파일을 만들며, FUSE 에뮬레이터에서 테스트했다. 실기 검증은 .tap 파일을 로컬 TNFS 서버에 올려 +3 기종에서 돌리는 방식이었다. 여기에 Z80 명령어 레퍼런스와 함께 메모리·레지스터 상태 변화를 단계별로 보여주는 웹 기반 'asm-editor'가 큰 도움이 됐다. djnz 같은 반복 명령이나 add 실행 시 캐리 플래그의 변화를 한 명령씩 짚어볼 수 있었기 때문이다. 다만 Pasmo와 문법이 달라 코드를 그대로 옮길 수는 없었다.
흥미로운 점은 가장 효과적인 디버깅 도구가 메모장과 펜, 그리고 두 마리 반려견이었다는 고백이다. 고수준 언어에 익숙한 그는 바이트와 비트마스크를 직접 그리고 레지스터 플래그 표를 손으로 정리하며, 화면 메모리 일부를 스케치해 본 뒤에야 자신의 Z80 코드를 이해할 수 있었다. 저녁 산책은 이상적인 '러버덕' 디버깅 시간이 됐다.
하드웨어에 바싹 붙은 코드
첫 단계는 로고와 배경 이미지를 '무대'로 띄우는 것이었다. 스펙트럼의 SCREEN$ 파일은 16384번지부터 6912바이트에 걸친 화면 메모리 덤프에 불과해, 해당 위치에 파일을 올리기만 하면 표시된다. 이 간단한 출발점을 통해 out 명령으로 ULA·AY 칩 같은 하드웨어와 통신하는 법, INCBIN으로 바이너리를 끌어오는 법, 블록 복사 명령 ldir, 16비트 주소 지정용 레지스터 쌍, 레이블 분기 같은 핵심 개념을 익혔다. 화면 출력 단계에서는 현대 운영체제의 시스템 콜에 비견되는 ROM 루틴을 탐구했는데, PR_STRING처럼 문자열을 한 글자씩 도는 루프 구조가 특히 좋은 학습 자료였다. 다만 불필요한 의존성이 딸려 와 실제 코드에서는 ROM 루틴을 대부분 쓰지 않았다. 밋밋한 기본 폰트는 Jim Blimey의 폰트 모음으로 교체해 '데모신다운' 모양새를 갖췄다.
한국 실무자에게 주는 의미
이 글의 가치는 완성품 자체보다 과정에 있다. 추상화가 두텁게 쌓인 고수준 언어에 익숙한 개발자가 하드웨어 설계 당시의 제약과 트레이드오프에 직접 노출되는 경험을, 저자는 가장 좋아하는 사이드 프로젝트인 동시에 가장 자주 좌절한 작업으로 꼽는다. 실무 개발자에게 이런 베어메탈 레트로 작업은 당장의 생산성과는 거리가 멀지만, 메모리 레이아웃·플래그·명령어 사이클을 몸으로 이해하게 만든다는 점에서 저수준 디버깅 감각을 되살리는 훈련이 된다. 한편 한계도 분명하다. 주당 수백 바이트라는 속도가 보여주듯 이런 작업은 철저히 취미와 학습의 영역이며, Pasmo·FUSE·asm-editor 같은 특정 도구 조합과 실기 환경에 상당히 의존한다는 점은 재현을 시도하는 사람이 감안해야 한다. 글은 효과 구현에 들어서자마자 자신이 몰랐던 것이 얼마나 많은지 절감했다는 대목에서 멈춰 있어, 스타필드나 AY 음악 같은 핵심 효과의 구체적 구현 기법은 후속 설명으로 넘겨둔 상태다.