1P by GN⁺ | ★ favorite | 댓글 1개
  • 1984년 Macintosh 초기 게임 중 하나인 ChipWits가 40주년을 맞아 원본 Mac·Commodore 64 FORTH 소스 코드를 오픈소스로 공개함
  • 공개 목적은 게임의 유산을 보존하고, 1984년 8비트 마이크로컴퓨터에서 크로스플랫폼 개발이 어떻게 이뤄졌는지 공유하는 데 있음
  • Doug Sharp가 보관하던 40년 된 디스크에서 데이터를 복구했으며, 일부 불량 섹터가 있었지만 대부분의 디스크는 정상적으로 읽힘
  • Mac 버전 전체 소스는 약 3,000줄의 FORTH인 반면 현대화 포트는 35,000줄의 C# 에 달해 당시 코드의 압축성과 제약이 드러남
  • 프로젝트는 원본 디스크 이미지와 추출 코드를 GitHub에 공개했고, 최신 소스 식별·빌드 방법 작성·스프라이트 추출을 커뮤니티와 함께 진행하려 함

ChipWits 원본 코드 공개

  • ChipWits 40주년을 기념해 원본 Mac 및 Commodore 64 FORTH 소스 코드가 오픈소스로 공개됨
  • 복구된 원본 코드와 디스크 이미지는 chipwits/chipwits-forth에 정리됨
  • 공개 목적은 ChipWits의 유산 보존과 1984년 8비트 마이크로컴퓨터 대상 크로스플랫폼 개발 경험 공유임
  • 원본 시스템에 익숙한 사람들은 소스 탐색과 정리에 참여할 수 있으며, 프로젝트는 ChipWits Discord Server를 통해 협업을 요청함

1984년 FORTH를 선택한 이유

  • ChipWits는 1984년 Macintosh에 출시된 초기 게임 중 하나였음
  • 공동 제작자 Doug Sharp와 Mike Johnston는 8비트 마이크로컴퓨터 사이에서 교육용 게임을 포팅하며 첫 오리지널 게임 ChipWits를 설계함
  • 게임은 Rocky’s Boots, Logo 등 당시 프로그래밍 게임의 영향을 받은 로봇 프로그래밍 게임임
  • 1984년 Mac 개발 환경은 제한적이었고, 주요 개발 방법은 Apple Lisa를 구매하는 것이었음
    • Apple Lisa의 원래 가격은 $9,995였고, 현재 가치로는 $30,373에 해당함
    • 인디 게임 스튜디오가 감당하기 어려운 비용이라 Doug와 Mike는 Mac에서 직접 실행되는 MacForth Plus로 개발함
  • 당시 여러 8비트 마이크로컴퓨터에 FORTH 변종이 있어, 이후 포팅을 염두에 둔 언어 선택으로 적합했음
  • 개발은 1984년 4월 시작됐고, 첫 버전 개발과 출판까지 약 7개월이 걸려 크리스마스 시즌에 맞춰 완료됨

Commodore 64와 Apple II 포팅

  • Epyx는 ChipWits의 퍼블리셔가 될 예정이었고, Commodore 64가 가장 큰 시장이었음
  • Epyx에는 Mac 게임이 없었고 Brainworks는 당시 Apple이 강했던 교육 시장을 목표로 했기 때문에, Epyx는 Commodore 64 버전만 퍼블리싱함
  • C64 포트는 1985년에 완료됐고, Super Forth 64로 작성됨
  • Commodore 64 포팅은 Mac과 같은 전반적 UI 설계를 유지해야 해 까다로웠음
    • 마우스 대신 조이스틱으로 작동하는 풀다운 메뉴 시스템을 개발해야 했음
    • 컬러 그래픽과 SID 칩 사운드를 추가함
    • Mac 디스크의 400KB 대신 165KB 디스크에 모든 것을 넣어야 했음
    • Mac의 128KB RAM 대신 64KB RAM과 더 느린 프로세서를 사용해야 했음
  • Commodore 64 버전 성공 이후 Apple II 버전도 제작됐고, 이 역시 FORTH 변종으로 작성됨

출시 후 평가와 원본 실행

  • ChipWits는 출시 후 여러 리뷰와 상을 받았음
  • MacUser Editor’s Choice 1986 Award는 ChipWits를 “가장 즐거운 프로그래밍 개념 입문”으로 평가했고, 아이콘 기반 언어와 교육적 설계를 높게 봄
  • Macazine은 ChipWits가 Macintosh 사용자와 아이들에게 컬트 인기작이 될 것이라고 예상함
  • MacWorld는 프로그래밍을 좋아한다면 ChipWits를 좋아할 것이라고 평가함
  • Creative Computing은 새벽 4시 30분에 만화 로봇에게 욕하는 장면을 담은 리뷰를 남김
  • 2008년 Maclife.com은 ChipWits를 역대 Top 10 Apple II / Mac Games 중 하나로 선정함
  • 원본 버전은 오픈소스 프로젝트 EmularityApple2js를 통해 브라우저 에뮬레이터에서 실행 가능하게 준비됨

40년 된 디스크 복구

  • 새 버전 ChipWits 작업 중 Doug Sharp가 보관 중이던 원본 디스크를 발견함
  • 3.5인치 디스켓과 5.25인치 플로피 디스크는 40년 동안 가정 보관 상태였지만, 대부분의 디스크는 불량 섹터 없이 읽힘
  • Commodore 64 디스크 복구에는 eBay에서 구매한 1541 Commodore 64 Disk Drive가 사용됨
    • USB XoomFloppy 어댑터를 통해 현대 PC에서 데이터를 읽음
  • Mac 3.5인치 디스켓은 Mac의 독자적 섹터 배치 때문에 현대 드라이브의 표준 방식으로 읽을 수 없었음
    • Mac은 디스크 용량을 800KB까지 늘리기 위해 독자적 섹터 레이아웃을 사용함
    • PowerMac G3 WallStreet은 3.5인치 드라이브와 네트워킹 스택이 있어 브리지 시스템으로 쓰였지만, 최신 MacOS에서 400KB 지원이 비활성화돼 800KB 디스크만 읽을 수 있었음
    • 이후 팬의 제안으로 USB 디스크 드라이브 제어용 커스텀 하드웨어 컨트롤러 GreaseWeazle을 사용했고, 이 방식은 정상 동작함
  • 모든 디스크는 블록 단위 이미지로 뜬 뒤 GitHub 저장소에 정리됨
    • 파일명은 디스크 라벨을 사용함
    • 불량 섹터가 감지된 경우 파일명 앞에 bad를 붙임
    • 현대 컴퓨터에서 읽기 쉽도록 Python 스크립트로 블록을 추출하고 UTF-8 ASCII 파일로 재포맷함
    • Commodore 64의 독자 문자 인코딩인 PETSCII는 ASCII로 변환함

FORTH 소스에서 보이는 개발 방식

  • 전체 원본 디스크 이미지와 코드는 chipwits/chipwits-forth에서 확인할 수 있음
  • Mac용 ChipWits 전체 소스는 약 3,000줄의 FORTH
  • 현대화 포트는 이미 35,000줄의 C# 에 이르러 원본 FORTH 코드의 압축성이 두드러짐
  • 별도 글 Forth Code for Electrocrabs in 1984 ChipWits Deciphered는 전기게(electrocrabs)를 제어하는 FORTH 코드 한 “screen”을 분석함
  • FORTH는 스택 기반 언어이며, Reverse Polish Notation과 유사함
    • 1 + 1 대신 1 1 + 형태로 작성함
    • if random(3) == 1 대신 3 irnd 1 = if 형태를 사용함

코드 예시로 보는 1984년 게임 구현

  • Mac 버전의 로봇 이동 코드는 현대 게임 개발처럼 프레임별 렌더링 루프를 분리하지 않음
    • 게임 로직과 그래픽 렌더링이 명령형 코드 안에 함께 섞여 있음
    • 애니메이션은 루프 안에서 픽셀을 직접 렌더링하는 방식으로 구현됨
    • 빈 바닥 타일로 이동하는지, 벽에 부딪히는지, 폭탄에 닿는지를 몇 단어의 코드로 처리함
    • ?boom 정의는 폭탄 접촉 시 게임 종료 여부까지 결정함
    • 로봇 위치에 따라 점수에 0을 더해, 로봇이 지나가며 지워졌을 수 있는 점수 표시를 강제로 다시 그리게 함
  • Commodore 64 버전의 스프라이트 정의는 코드와 애셋 데이터가 함께 섞이던 방식을 보여줌
    • FORTH 소스는 파일이 아니라 번호가 붙은 screen 단위로 저장되고, 필요한 순서로 로드됨
    • C64 흑백 스프라이트는 24×21 픽셀이며, 한 화면에 8개 스프라이트만 사용할 수 있었음
    • 4색 스프라이트를 선택하면 해상도는 12×21로 낮아지고 픽셀이 두 배 폭이 됨
    • ChipWit 캐릭터는 여러 스프라이트를 겹쳐 렌더링되며, 빈티지 만화의 셀 애니메이션과 유사한 방식임
    • 이 선택은 가용 스프라이트를 ChipWit에 많이 쓰는 대신 더 선명한 이미지와 부분별 애니메이션을 가능하게 함
  • Mac 버전의 아이템 점수 테이블은 한 screen에 맞도록 데이터가 압축돼 있음
    • ( 110584 dws) 같은 표기는 screen의 날짜 스탬프이며, 1105841984년 11월 5일, dws는 Douglass Walter Sharp를 뜻함
    • 해당 screen은 최종 릴리스 전 마지막으로 수정된 screen 중 하나로 보이며, 마지막 변경 screen은 11월 8일임
    • d,는 값을 10배로 곱해 저장하도록 정의돼 있어, 150점을 15 d처럼 표현할 수 있었음
    • 이 방식은 표 정렬을 유지하면서 한 screen에 맞추는 데 도움이 됐고, 릴리스 전 점수 밸런싱 중 전체 점수 값을 조정하기 쉽게 했을 가능성이 있음

리부트와 커뮤니티 작업

  • 팀은 원본 FORTH 버전 공개와 별개로 현대화된 ChipWits도 작업 중임
  • 리부트 버전은 원작의 재미와 컴퓨터 과학적 엄밀함을 유지하면서, 학습 곡선부터 경쟁형 글로벌 리더보드까지 여러 측면을 개선하려 함
  • Steam에서 ChipWits를 위시리스트에 추가하면 최종 버전 출시 알림을 받을 수 있음
  • 원본 FORTH 코드 관련 현재 GitHub 이슈의 즉시 목표는 다음과 같음
    • raw disk image에서 관련 소스 코드가 모두 추출됐는지 확인
    • 일부 소스 파일의 정렬 문제 수정
      • 일부는 40자 폭, 일부는 64자 폭임
    • 어떤 디스크가 가장 최신 소스 코드를 담고 있는지 파악
    • Mac과 C64에서 소스로부터 빌드하는 방법 작성
    • 디스크에서 raw sprite와 이미지를 추출해 .png 파일로 변환
  • 최종 목표는 현대 PC용 커뮤니티 유지 FORTH 버전의 ChipWits임

댓글과 토론

Hacker News 의견들
  • 1984년에 ChipWits를 FORTH로 만든 이유를 적어둔 글이 있음
    https://chipwits.com/2023/04/08/forth-programming-language-g...

    • ChipWits는 1984년, 6살 때 첫 컴퓨터였던 Apple Macintosh에서 처음 해본 게임 중 하나였음
      좋아하던 게임을 만들어줘서 고맙고, 새 데모도 받아봤으며 Steam 찜 목록에도 추가했음
  • Forth는 몇 년째 배워보고 싶었던 언어임
    옛 컴퓨터에서는 빠른 프로그램을 원하면 어셈블리어, 느려도 괜찮으면 BASIC을 쓰는 선택지가 있었는데, Forth는 꽤 고수준처럼 보이면서도 “중간 속도” 언어처럼 남아 있는 점이 신기함

    • Forth는 오랫동안 C와 함께 하드웨어 개발과 드라이버 쪽의 표준 언어였고, 지금도 여러 곳에서 쓰임
      스택 기반 언어임
      https://www.forth.com/starting-forth/
    • Forth를 네이티브로 실행하는 단일 보드 컴퓨터를 살 수 있음
      USB 케이블을 컴퓨터에 꽂고 터미널 프로그램만 띄우면 바로 시작할 수 있어서 언어에 완전히 몰입하기 좋음
      다만 호주에서 오는 제품은 도착까지 몇 달 걸릴 수 있으니, 먼저 가까운 공급처를 찾아보는 게 좋음
      또 다른 좋은 방법은 1984년처럼 배우는 것임. 현대 컴퓨터에서 Commodore 64, Apple ][ 같은 에뮬레이터를 띄우고 그 안에 Forth 개발 환경을 올리면 됨
      당시 문서는 완전 초보자를 대상으로 쓰여서 따라가기 아주 쉽고, 인터넷에 무료 스캔 PDF도 많음
    • 장난감 Forth 인터프리터를 직접 만들어보는 게 언어를 배우는 좋은 방법이라고 봄
      쉽고 재미있었지만, 어느 지점까지는 너무 말도 안 되게 쉬워서 누군가에게는 지나치게 기초적으로 느껴지거나, 장난감 구현을 넘어가고 싶은 유혹이 커질 수 있음
    • Forth는 매우 빠르고, 순진하게 짠 어셈블리어보다도 빠를 수 있지만 전혀 고수준 언어는 아님
      스택을 직접 관리해야 해서 꽤 번거롭고, 직접 FORTH를 만드는 일은 재미있음. 꼭 어셈블리어로 만들 필요는 없고, 예전에 C++로 Forth 비슷한 스크립트 언어를 만든 적도 있음
    • 오래된 8비트 가정용 컴퓨터는 10대와 아이들을 염두에 두고 설계됐고, Alan Kay의 영향도 있었을지 모름
      BASIC은 “Beginner's All-purpose Symbolic Instruction Code”라서 잘 맞았음
      Amstrad CPC 6128에는 교육용 Lisp 방언인 Logo 구현도 별도 디스크로 제공됐고, 어릴 때 그 연관 리스트가 정말 충격적이었음
      당시에는 “오픈소스”가 일반적인 개념이 아니었고, 여러 언어의 컴파일러와 인터프리터는 전문적인 상용 도구였음
      [1] https://en.wikipedia.org/wiki/Amstrad_CPC#Other_languages
      [2] https://en.wikipedia.org/wiki/An_Open_Letter_to_Hobbyists
  • 아주 멋져 보임
    관련해서 http://tumbleforth.hardcoded.net/도 있는데, 꽤 보기 좋다고 생각함. 이걸 끝까지 해본 사람이 있다면 어떤 경험이었는지 궁금함

    • 일이 한가했던 주에 절반 정도 진행해봤고, 대학 시절 하드웨어 수업이 떠올랐음
      컴퓨팅을 다르게 생각하게 만들어줬음
      아직 어리고 부족하지만 뒤돌아보면, 예전에는 하드웨어 제약 때문에 특정 추상화가 선택됐고, 현재 프로그래밍 언어의 “진화 가지”에는 잘 늙지 못한 추상화가 많이 쌓여서 하중을 떠받치는 잡동사니 층이 많아진 것처럼 보임. 다른 공학 프로젝트와 비슷함
      Collapse OS가 오늘날 실용적이지는 않을 수 있지만, 여러 추상화 층에서 벗어난다는 해방감은 있음. 1960년대식 컴퓨팅을 끔찍한 개발자 경험 없이 즐기는 방법처럼 느껴짐
      지금의 허황된 프로젝트는 이런 것들을 따라가며 Dusk OS를 가상 머신에서 빌드하고, 이후 물리 머신으로 옮기고, C로 Dusk OS용 Scheme 인터프리터를 쓴 다음 마음껏 확장하는 것임
      거기까지 가기 전에 넘어야 할 강이 몇 개 있음. Python으로 Scheme 인터프리터를 몇 시간 만에 구현했고, 몇 시간 더 들여 스캐너/토크나이저를 개선했음. 지금은 C로 Scheme 인터프리터를 구현하려면 어떻게 해야 할지 보려고 Crafting Interpreters를 읽는 중임. C 인터프리터를 만든 뒤 이 가이드를 다시 보고 DuskOS에 정면으로 뛰어들 생각임
    • 막 보기 시작했는데 공유해줘서 고마움
      벌써 글쓴이의 말투가 마음에 듦
      예를 들면:

      Much terser than the C version right?
      This little assembler crash course gives us a better understanding of what is compiled by the C compiler, but not how it compiles it. We don't know how it's ran either. To know that, we'd have to dig through software that weighs millions of lines of code. Maybe you'd have the patience to do it, I don't, so let's continue tumbling down the rabbit hole. We'll go bare metal and then build an operating system of our own, with a C compiler of our own. It's simpler this way.
      What’s a linker? Aw, forget about it, it’s another piece of overcomplicated software that has convinced the world that it’s essential. We won’t need one in what’s coming.

    • Tumble Forth 시리즈의 저자인 Virgil Dupras는 커스텀 Forth로 전부 작성된 운영체제 DuskOS도 만들고 있음
      꾸준하고 엄청난 산출물이 인상적임. Collapse 철학에 완전히 동의하지는 않지만, DuskOS 메일링 리스트는 눈팅하기에 딱 좋은 정도의 트래픽을 가짐
      Virgil의 작업을 보고 Forth를 조금 시도해봤고, 작년에는 SmithForth[1]를 손으로 역컴파일하는 데 시간을 썼음
      언어를 부트스트랩하는 데 필요한 어셈블리어가 정말 적다는 점이 놀라움. Forth가 임베디드 환경에서 REPL을 제공할 수 있다는 게 완전히 이해되고, 흔히 듣는 일반적인 개발 주기보다 훨씬 재미있어 보임
      [0]:https://duskos.org/
      [1]:https://dacvs.neocities.org/SF/
    • 처음에는 Forth 기반의 실제 무언가를 보고 흥분해서 남긴 반응이었음
      이후 ChipWits의 위키피디아 페이지와 블로그 글을 읽어봤는데, 원작 게임이 정말 멋져 보임. 위키피디아 매뉴얼에 있는 로고도 아주 좋음
      최근 퍼즐과 프로그래밍 요소가 있는 옛날/새 게임 목록을 만들고 있었는데, 여기에 넣을 예정임. ketman 어셈블리 “게임”을 끝낸 뒤 바로 해볼 수도 있음. 사실 그건 게임이라고 하긴 애매하지만
      ChipWits가 아주 잘되길 바람
  • Valpar의 ValForth는 Atari ST 생태계에서 초기 크로스플랫폼 FORTH 구현 중 하나였고, 게임용으로 영리한 확장도 갖고 있었음
    https://www.atarimagazines.com/rom/issue1/jumping_forth.php
    글에서 말하듯 8비트에도 Elcomp의 FORTH가 있었고, https://www.atarimania.com/documents/FORTH-on-the-Atari-Lear... 같은 책도 있었음. Leo Brodie의 “Starting FORTH”는 지금도 훌륭한 입문서임
    모두 BASIC을 배웠지만, 이런 대안 언어들은 장치를 프로그래밍하는 데 완전히 다른 은유가 실제로 존재한다는 걸 알려줬음
    80년대 아이에게는 시야가 확 넓어지는 일이었음

  • Forth는 Perl처럼 한 번 쓰고 나면 읽기 어려운 언어 중 하나처럼 보임
    쓰기와 만들기는 쉽지만 1년쯤 뒤에 코드로 돌아오면 뭘 하는지 알 수 없을 것 같음
    그래도 정말 빠르고 효율적임

    • Perl이 그런 평판을 받는 건 전적으로 부당하다고 봄
      방금 3년 넘게 건드리지 않았던, 꽤 큰 Perl 프로그램 하나를 무작위로 열어 소스를 훑어봤는데, 무엇을 하는지 이해하는 데 전혀 문제가 없었음
      Perl 코드가 다른 대부분의 프로그래밍 언어보다 다시 읽기 어렵다고 생각하지 않음. 어려움은 주로 개발자가 그 언어에 얼마나 능숙한지, 그리고 그 언어로 코드를 마지막으로 쓴 지 얼마나 됐는지에 달려 있음
      언어가 많이 녹슬었거나 애초에 숙련도가 높지 않았다면, 어떤 언어든 예전 코드를 다시 보기 힘들어짐
      물론 자기 코드가 아니면 더 어렵고, 코드가 얼마나 잘 작성됐는지도 크게 작용함. 어떤 언어든 쓰레기 코드는 많고, 처음부터 쓰레기였다면 시간이 지나도 좋아지지 않음
    • 개인적으로는 반대로 느낌
      Forth는 쓰기 어렵지만 읽기는 쉽다고 봄
  • 어릴 때 Commodore 64에서 많이 했음
    독특하고, 흥미롭고, 재미있는 게임이었음

    • 새 게임에서도 원작의 게임플레이를 거의 그대로 유지했음
      Hacker News에 스팸을 하고 싶지는 않지만, 원작을 해봤다면 리부트에 대한 반응을 꼭 듣고 싶음: https://chipwits.com
  • 어릴 때 이 게임을 정말 간절히 갖고 싶었음
    내가 참 늙었구나 싶음

  • 현대판 ChipWits는 무엇으로 작성됐는지 궁금함

    • 글에 따르면 C# 이고, 코드 양은 최소 10배라고 함
      이 게임을 정말 좋아했음. C64용 Forth 패키지도 갖고 있었지만, 이 게임이 그걸로 만들어졌다는 걸 연결해 생각하지 못했음
    • Unity와 C#임
  • Human Resource Machine을 사서 대부분 재미있게 했음. 너무 어려워지기 전까지는
    ChipWits와 같은 개념, 즉 스택 기반 프로그래밍을 게임으로 만든 것처럼 보임
    둘 다 해본 사람이 있다면 어떻게 비교되는지 궁금함