영국 8비트 이야기를 하다 보면 늘 이 기계가 나온다. 국내에서는 MSX와 애플 II가 익숙하지만, 유럽에서는 이 검은 벽돌이 한 세대의 프로그래밍 입문기였다. 실물을 처음 만지면 두 가지에 놀란다. 손바닥만 한 크기와, 눌러도 눌린 것 같지 않은 고무 키감이다.

싱클레어 ZX Spectrum 48K는 1982년 싱클레어 리서치(Sinclair Research)가 내놓은 저가 홈 컴퓨터다. Zilog Z80을 3.5MHz로 돌리고 48KB 램을 얹었으며, 화면 전체를 통틀어 8x8 픽셀 칸마다 색 두 개만 쓸 수 있는 독특한 컬러 구조를 가졌다. 이 제약이 특유의 화면과 그 유명한 "어트리뷰트 클래시"를 만들었다.
어떤 기계였나
Spectrum은 1980년의 ZX80, 1981년의 ZX81을 잇는 싱클레어의 세 번째 홈 컴퓨터다. ZX81이 흑백 화면에 1KB 램으로 승부했다면, Spectrum은 컬러와 소리를 붙이고 램을 크게 늘렸다. 램 16KB 모델과 48KB 모델 두 가지로 나왔고, 48K 쪽이 사실상 표준이 됐다.
산업 디자인은 릭 디킨슨(Rick Dickinson)이 맡았다. 검은 쐐기꼴 본체에 무지개 색 띠를 넣은 그 디자인은 지금 봐도 정리가 잘 돼 있다. 다만 예산을 맞추느라 키보드는 통고무 한 장으로 찍어냈고, 이 촉감을 두고 당시 리뷰어들이 "죽은 살(dead flesh)" 같다고 적었다. 애정을 담아 하는 말이지만, 실제로 눌러 보면 무슨 뜻인지 바로 안다.
| 항목 | 내용 |
|---|---|
| CPU | Zilog Z80 @ 3.5MHz |
| 램 | 48KB (16KB 모델도 존재) |
| 롬 | 16KB (BASIC 인터프리터 내장) |
| 화면 | 256 x 192 픽셀 |
| 색 | 15색 (기본 7색 + 밝은 7색 + 검정) |
| 소리 | 단일 채널 비퍼(beeper) |
| 키보드 | 고무 멤브레인 40키 |
| 발표 | 1982년 4월 23일 (48K) |
| 가격 | 48K 기준 175파운드 |
| 제조 | 싱클레어 리서치 |
8x8 칸마다 색 두 개, 컬러 어트리뷰트 구조
Spectrum 화면의 핵심은 픽셀 정보와 색 정보를 따로 저장한다는 데 있다. 256 x 192 픽셀의 흑백 비트맵이 램 0x4000 번지부터 6144바이트를 차지하고, 그 뒤 0x5800 번지부터 768바이트가 어트리뷰트(attribute) 영역이다. 화면을 8x8 픽셀 칸 32x24개로 나누면 정확히 768칸이고, 칸 하나에 어트리뷰트 바이트 하나가 대응한다.
어트리뷰트 바이트 한 개의 구성은 다음과 같다.
- 비트 0-2: 잉크(ink), 즉 픽셀이 켜진 곳의 색
- 비트 3-5: 페이퍼(paper), 즉 배경색
- 비트 6: 브라이트(bright), 밝은 계열로 전환
- 비트 7: 플래시(flash), 잉크와 페이퍼를 주기적으로 교체해 깜빡임
여기서 문제가 드러난다. 색은 픽셀 단위가 아니라 8x8 칸 단위로만 지정된다. 한 칸 안에서는 잉크색 하나와 페이퍼색 하나, 도합 두 색만 쓸 수 있다. 스프라이트 하나가 칸 경계를 넘어가면 겹친 칸의 색이 통째로 바뀌어 버린다. 이것이 Spectrum 게임 화면에서 캐릭터 주변에 색 얼룩이 번지는 현상, 바로 어트리뷰트 클래시(attribute clash)다. 지금 보면 결함이지만, 당시 개발자들은 이 제약을 역이용해 칸 격자에 맞춰 그래픽을 설계하는 요령을 키웠다.
테이프 로딩음의 정체
Spectrum은 카세트테이프에 프로그램을 담았다. LOAD 명령을 치고 카세트 플레이 버튼을 누르면 스피커에서 귀를 찌르는 잡음이 한참 흘러나온다. 이 소리가 곧 데이터다.
구조는 세 부분이다. 먼저 일정한 음높이의 파일럿 톤(pilot tone)이 몇 초간 이어진다. 수신 회로가 게인을 맞추고 "데이터가 곧 온다"를 인식하는 구간이다. 이어서 짧은 싱크 펄스가 데이터 시작을 알리고, 그다음 0과 1을 길이가 다른 펄스로 실어 보낸다. 짧은 펄스가 0, 긴 펄스가 1이다. 그러니까 그 삑삑거리는 소리는 펄스 폭으로 부호화된 비트열을 그대로 스피커로 들려주는 것이다.
표준 롬 로딩 속도는 약 1500보(baud)로, 평균 전송률은 초당 170바이트 안팎이다. 48KB를 다 채우는 게임이면 몇 분씩 걸렸고, 마지막 순간 에러가 나면 처음부터 다시 감아야 했다. 이 지루함을 줄이려고 나온 것이 속도를 높인 터보 로더다. 파일럿 톤을 줄이고 펄스를 짧게 잡아 전송을 빠르게 했는데, 이 비표준 타이밍을 그대로 보존하려고 만든 파일 포맷이 뒤에서 다룰 TZX다.
Fuse로 TAP, TZX 돌려보기
실기가 없어도 Fuse(Free Unix Spectrum Emulator)로 거의 똑같이 재현할 수 있다. 이름은 유닉스용이지만 지금은 리눅스, macOS, 윈도우를 모두 지원한다. 안정판은 1.9.2다.
테이프 이미지 포맷은 두 가지를 알아 두면 된다. TAP은 테이프의 논리적 데이터 블록만 담은 단순한 형식이라 표준 속도 프로그램에 적합하다. TZX는 펄스 타이밍까지 기록해 터보 로더나 커스텀 로딩 화면이 있는 프로그램까지 정확히 재현한다. 어느 쪽으로 배포됐는지 모르겠으면 TZX가 안전하다.
설치는 배포판 패키지를 쓰는 게 가장 빠르다.
# Debian, Ubuntu 계열 sudo apt install fuse-emulator-gtk spectrum-roms # macOS (Homebrew) brew install fuse-emulator # 소스 빌드 시 libspectrum이 먼저 필요하다
실행한 뒤 테이프를 올리는 절차는 다음과 같다.
- 메뉴에서
File>Open으로 TAP 또는 TZX 파일을 연다. 창에 파일을 드래그해도 된다. - 48K BASIC 화면에서
J키를 누르면LOAD키워드가 입력된다. Spectrum 키보드는 키 하나에 BASIC 명령이 통째로 배정돼 있다. - 이어서 큰따옴표 두 개를 넣어
LOAD ""를 만들고 엔터를 친다. 큰따옴표는Symbol Shift와P조합이다. - Fuse는 기본적으로 테이프 트랩(tape trap)으로 롬 로딩 루틴을 가로채 빠르게 읽어 들인다. 이 상태면 자동으로 로딩이 시작된다.
일부 TZX는 테이프 트랩과 충돌한다. 그럴 때는 옵션에서 테이프 트랩을 끄고 F8(또는 Media > Tape > Play)로 재생을 직접 시작한다. 실시간 로딩이라 느리지만, Fastloading 옵션을 켜면 테이프가 도는 동안 에뮬레이터를 최고 속도로 돌려 대기 시간을 크게 줄인다. 로딩이 진행되면 화면 테두리에 그 시절 그대로 색 줄무늬가 흐른다.
수집가 관점과 더 파볼 자료
실기는 아직 어렵지 않게 구할 수 있다. 대신 40년 된 고무 키보드는 멤브레인이 삭아 특정 키가 안 먹는 경우가 흔하고, 전원부 커패시터와 화면 출력을 담당하는 ULA 칩이 고장의 단골이다. 오래된 전원 어댑터를 그대로 꽂기 전에 출력 전압부터 확인하는 편이 안전하다.
소프트웨어 아카이브는 놀랄 만큼 잘 정리돼 있다. World of Spectrum이 TAP과 TZX 이미지의 표준 저장소 역할을 하고, archive.org에도 상당량이 올라와 있다. 사양과 역사는 Wikipedia의 ZX Spectrum 문서가 출발점으로 충분하다. 에뮬레이터로라도 LOAD ""를 치고 삑삑거리는 로딩음을 한번 끝까지 들어 보면, 왜 이 기계가 한 세대의 추억으로 남았는지 감이 온다.