안녕하세요. 저는 오래된 게임들을 놓지 않는 평생의 Flight Simulator 팬입니다. 사람들이 Claude Code를 사용해서 전혀 관련 없는 두 개의 게임을 섞어 아무 문제 없이 작동하는 멋진 모드들을 만들어내는 것을 보고, 저도 Claude Code에게 64비트 Windows에서 실행되지 않는 오래된 두 게임인 FS95와 FS98을 주고 왜 안 되는지 알아봐 달 생각을 했습니다. 아주 간단한 일이죠? 저는 약 10년 전부터 이 두 게임 모두 2D 및 3D 창 처리 과정에서 발생하는 '0으로 나누기 예외(divide by zero exceptions)' 때문에 충돌한다는 것을 알고 있었고, 그래서 문제는 두 게임의 DLL인 WINDOW.DLL과 G3D.DLL 중 두 개와 관련이 있을 것이라고 의심했습니다. 저는 DxWnd를 사용하여 '예외 처리(handle exceptions)' 상자를 체크한 채로 두 게임을 실행해 보았지만, 극도로 글리치가 심한 렌더링 때문에 게임 플레이가 불가능했습니다. Reddit 사용자 u/rozniak은 몇 년 전에 이와 관련하여 흥미로운 내용을 작성한 적이 있습니다. 어쨌든, 저는 Claude에게 앞서 언급된 DLL들을 FS95에 대해 패치하게 했고 성공했지만, FS98을 디버깅하는 과정에서 문제가 된 것은 DLL이 아니라 게임의 EXE 파일 자체라는 것을 발견했습니다. Claude는 이 발견을 이용해 FS95에서도 동일한 문제를 추적했습니다. Claude가 말한 내용은 다음과 같습니다: "FLTSIM98.EXE에는 게임이 이러한 오류 나누기를 처리하기 위해 작성한 루틴이 포함되어 있습니다. 나눗셈에 실패하면, 메모리에서 명령어를 읽고, 적절한 레지스터에 제한된 결과를 넣은 다음, 해당 명령어 건너뛰기를 합니다. 이 게임은 __try / __except를 사용하여 모든 것을 실행하는데, 이것이 바로 64비트 Windows가 창 콜백 내부에서 도달할 수 없는 정확한 메커니즘입니다. Windows에는 '벡터 핸들러(vectored handler)'라는 또 다른 종류의 예외 처리기가 있는데, 이는 해당 콜백 경계가 중요해지기 전에 실행됩니다. 이 게임의 루틴은 바로 그러한 핸들러가 필요로 하는 정확한 시그니처를 가지고 있습니다. 따라서 패치는 프로그램 진입점(entry point)에 86바이트를 추가하여 AddVectoredExceptionHandler에 해당 루틴을 등록하고 그 후 정상적으로 게임을 시작합니다."
"하나의 패치는 게임이 원래 의도했던 결과와 정확히 일치하는 모든 디비전(division)을 커버합니다." 덧붙여서, FS95는 루틴(routine)이 FS98처럼 EXE에 있는 것이 아니라 DIVTRAP.DLL 파일에 위치합니다. 제가 테스트해 본 결과, 이제 두 게임 모두 64비트 Windows에서 문제없이 실행됩니다. 제가 직접 EXE 파일을 제공하기는 어려워서, 여기 EXE 패처(patcher) 다운로드를 첨부합니다. 게임 자체는 여전히 CD나 다른 경로를 통해 설치해야 합니다. 지침은 포함된 read me 파일을 읽어 주시기 바랍니다. 또한, 문제가 발생하면 댓글로 알려주세요. 제출자: /u/Torturephile [link] [comments]