커먼도어 64 보드를 핀 단위로 재현한 하드웨어 시뮬레이터

레디스(Redis) 개발자로 잘 알려진 살바토레 산필리포(antirez)가 1980년대 홈컴퓨터 커먼도어 64(Commodore 64)의 메인보드를 핀 단위로 시뮬레이션하는 오픈소스 프로그램 c64-hw-sim을 공개했다. 단순히 게임을 구동하는 에뮬레이터가 아니라, 실제 보드의 배선과 칩 동작을 그대로 흉내 내 칩 다리를 들어 올리거나 저항을 끊는 등의 ‘고장’을 인위적으로 만들고 그 결과를 눈으로 확인할 수 있는 도구라는 점이 특징이다. 레트로 컴퓨터 수리 커뮤니티와 하드웨어 교육에 관심 있는 사람이라면 눈여겨볼 만한 프로젝트다.

무엇을 시뮬레이션하는가

c64-hw-sim은 커먼도어 64의 특정 보드 리비전인 ASSY 250407을 대상으로 한다. 이 프로그램은 보드의 네트리스트(PCB상의 전기적 연결 정보)와 각 칩이 핀 단위에서 어떻게 동작하는지에 대한 모델을 가지고 있다. 중요한 점은 이 시뮬레이터가 “고장난 C64가 어떻게 보이는지”에 대한 지식은 전혀 갖고 있지 않다는 것이다. 즉 화면이 깨지는 결과를 미리 정해놓고 보여주는 것이 아니라, 회로 동작을 그대로 계산해서 나온 결과라는 설명이다.

사용자는 화면에서 특정 칩의 다리를 들어 올리거나, 그라운드(GND)나 +5V에 단락시키거나, 소켓에서 칩 자체를 뽑아내거나, 저항·페라이트 비드·수정발진자를 끊어볼 수 있다. 그 다음 모니터에 출력되는 화면, 키보드 반응, 보드 위 모든 신호를 관찰하며 어떤 일이 벌어지는지 확인하는 방식이다.

실제 사례로 보는 동작 방식

원문에서 소개한 예시가 흥미롭다. 전원을 켜기 전에 컬러 RAM의 17번 핀(주소선 A7)을 들어 올리면, 컴퓨터는 멀쩡하게 부팅되는 것처럼 보인다. CPU가 쓰기 작업을 할 때와 VIC 칩이 읽기 작업을 할 때 같은 잘못된 주소를 사용하게 되어 RAM이 단순히 앨리어싱(주소 겹침) 현상을 일으키기 때문이다. 이후 다리를 다시 꽂으면, 한 번도 기록되지 않았던 절반의 컬러 RAM 영역이 무작위 색상으로 나타난다. 다시 핀을 들어 올리면 화면은 다시 깨끗해진다. 실제 2114 RAM 칩도 동일하게 동작한다고 한다.

또 다른 예시로, 유명한 베이직 한 줄 명령어 10 PRINT CHR$(205.5+RND(1));:GOTO 10으로 생성되는 미로 패턴이 화면에 그려지는 도중 캐릭터 ROM(U5)을 소켓에서 뽑으면, CPU와 RAM, 프로그램 로직은 정상 작동하지만 문자의 모양만 사라진다. 실제 수리 기술자들 사이에서 잘 알려진 증상이다. 오실로스코프를 ROM 소켓의 데이터선 D0에 연결해두면, 소켓이 비어있을 때 VIC가 문자 모양을 읽어오려 할 때마다 버스가 붕 뜨는(floating) 모습도 확인할 수 있다.

기존 에뮬레이터와 무엇이 다른가

antirez는 이 프로젝트가 안드레 바이스플록(Andre Weissflog, 닉네임 floooh)이 만든 6502, VIC-II, CIA, SID 등의 칩 에뮬레이터에서 영감을 받았다고 밝혔다. floooh의 에뮬레이터들은 핀을 인터페이스로 사용하는 방식이었는데, c64-hw-sim은 이 접근을 극단까지 밀어붙여 RAM, ROM, 로직 칩, PLA 등 보드의 나머지 모든 부품까지 핀 수준의 모델로 구현했다. 칩 코어 자체는 zlib 라이선스의 c64-llm 프로젝트에서 가져온 floooh의 코드를 사용하고, 보드 설계는 bwack이 만든 C64-250407-Replica-KiCad(CERN OHL 라이선스)에서, PLA 로직은 82S100 칩을 리드아웃한 데이터를 기반으로 했다.

일반적인 C64 에뮬레이터가 게임을 빠르고 정확하게 돌리는 데 목적이 있다면, 이 프로젝트는 고장 재현과 회로 동작 이해에 초점을 맞춘다. 그 대가로 속도가 상당히 느리다. 원문에 따르면 애플 M3 Max에서 실제 C64 속도의 31%, AMD 라이젠 AI Max+ PRO 495에서 39%, 애플 M5 Max에서 48% 수준으로만 동작한다. 게임을 즐기기 위한 도구가 아니라는 점을 개발자 스스로도 명확히 밝히고 있다.

사용 방법과 활용 범위

macOS와 리눅스(X11) 환경에서 OpenGL을 이용해 동작하며, 그래픽 라이브러리로 sokol, 인터페이스 라이브러리로 nuklear를 사용한다. 화면에는 보드, 모니터, 컨트롤 패널, 오실로스코프가 함께 표시된다. 핀을 클릭하면 오실로스코프에 연결해 신호를 관찰하거나 플로팅·GND 단락·+5V 단락 같은 고장을 만들 수 있고, 칩을 클릭하면 뽑아낼 수 있으며, 저항이나 페라이트 비드, 수정발진자를 클릭하면 끊을 수 있다. 핀 상태는 실제 로직 프로브처럼 빨강(하이), 파랑(로우), 노랑(펄스), 회색(플로팅), 마젠타(두 출력이 충돌) 색상으로 구분해 표시된다.

컨트롤 패널에서는 .prg 파일을 불러올 수도 있는데, 이때 파일은 실제 프리저 카트리지가 하는 방식 그대로 DRAM 칩에 직접 기록되기 때문에 보드가 고장난 상태에서도 로딩이 가능하다. 키보드 입력도 지원해 ESC는 RUN/STOP, PgUp은 RESTORE, TAB은 CTRL, 왼쪽 ALT는 C= 키에 대응한다.

헤드리스 모드도 제공되는데, 창 없이 4초(200프레임) 동안 실행해 모니터 화면에서 읽히는 텍스트를 사람이 읽듯 출력하고 화면 이미지를 저장하는 기능이다. 이를 활용해 tests/faults.sh 스크립트는 31가지 흔한 고장 상황을 자동으로 테스트하며, 각 고장에서 예상되는 증상은 시뮬레이터를 돌리기 전에 미리 문서로 기록해둔 뒤 결과를 대조하는 방식으로 검증했다고 한다. 또한 tools/kicad2c.py 도구는 bwack의 KiCad 설계 파일을 C 코드 테이블로 변환하는데, 이 과정에서 216개 부품, 그 핀들, 249개의 네트가 다뤄진다.

한국 개발자와 레트로 하드웨어 애호가에게 주는 의미

국내에도 레트로 컴퓨터 수집과 수리를 취미로 하는 개발자 커뮤니티가 존재하는데, 이런 시뮬레이터는 실제 보드를 망가뜨릴 위험 없이 다양한 고장 패턴을 실험하고 그 원리를 배울 수 있는 좋은 교육 자료가 될 수 있다. 또한 디지털 회로 설계나 임베디드 시스템을 공부하는 학생·개발자 입장에서는, 추상화된 에뮬레이션이 아니라 실제 전기적 신호 레벨에서 칩들이 어떻게 상호작용하는지 관찰할 수 있다는 점에서 흥미로운 학습 도구다. 다만 현재 macOS와 리눅스만 지원하고 윈도우 지원 여부는 원문에 언급되어 있지 않으며, 실행 속도가 실제 하드웨어보다 느리다는 점은 미리 감안해야 한다.

원문: The Commodore 64 hardware simulator: break chips and pins, see the results


코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다