목표: PCM방식이 아닌 FM사운드를 원하는 트렉을 선택하여 플레이어 형태로 듣고 싶다
1. FMDRV.COM 후킹(실패)
- 게임 내부 BGM을 트랙 단위로 직접 재생하는 플레이어로 돌파하자
- dosbox-x로 배경음악이 바뀌는 위치를 트렉의 시작으로 추정하고 도전
· INT 66h를 기준으로 bx/dx를 찾았는데 결국 INT 66h는 아무것도 아닌 존재라서 헛발질
- FMDRV 바이너리 패치해보자
· 필요한 코드 공간 약 20~30Kb 그러나 실제로 확보 가능한 빈 공간 5Kb 수준
· 점프망 구성 불가, 재배치 불가
2. TSR 후킹(실패)
- TSR로 인터럽트 후킹 → FMDRV 호출 가로채기 시도
· 도스언어 masm으로 컴파일 엄청 했음 masm.exe link.exe exe2bin.exe
· INT 66h을 타깃으로 오인해서 실패
- 시간이 남아돌고 근성이 있다면 0~255h까지 도전한다면 성공할수도 있지 않을까..
<애중의 INT 66h>
- FMDRV 코드 분석 중 사운드 관련 루틴 근처에서 빈번하게 등장하는 INT 66h를 발견
→ FMDRV 내부 음악 서비스 인터럽트일 것으로 추정
- INT 66h의 실체
· 엔진 내부 동기화/상태 처리용 인터럽트
· BGM 호출이나 곡 선택과 직접적 관계 없음
· 음악 트랙 제어 신호는 OPL I/O 레벨(0x388/0x389)에 직접 내려감
3. IDA Pro 정적 분석
- FMDRV 코드 정적으로 추적
- OPL 루틴 → wait 루틴 → helper 루틴 등
- 핵심 루틴(sub_10328, sub_10384, OPL_Write 등) 식별
- 하지만 이 함수들이 서로 호출만 반복하는 코어 루프(탁구만 계속침;;;)
- BGM “곡 시작 엔트리”는 정적으로 추적 불가능
- 역시 INT 66h 루트 착각 때문에 상위 제어 경로를 찾지 못함
4. I/O 388 389에 브레이킹
- OPL 실제 출력 포트 후킹
- 0x388 (레지스터) 0x389 (데이터)
- 86Box 공개 소스에서 봉인된 디버거 기능 해제하여 컴파일
(86Box오기전에 bochs에서 삽질한 것은 안비밀... bochs는 ems사용시 고자가된다.)
- I/O out 경로에 직접 후킹 코드 삽입
- MSYS + gdb 환경 구축
<절반의 성공 – OPL 로그 플레이>
- 86Box 실행 중 → OPL out 이벤트 실시간 로깅
- 커맨드를 FMDRV script 형태로 변환
- 자체 FM 플레이어 제작
- 실제 FM 사운드 재생 성공

왼쪽 = OPL 레지스터 주소
오른쪽 = 그 레지스터에 쓰인 값
순서 = 실제 대항해시대2 BGM 재생 스트림 그대로
<절반의 실패 – 템포>
- 타임라인 정보 미존재
- 딜레이/W 값 수작업 삽입
- 곡 템포 자동 동기화 불가능
- 실기와 완벽한 싱크는 포기
<결론>
결국 가장 효율적이고 완전한 방법은 FM사운드 직접 녹음(=PCM)
<후기>
대략 3주간 chat GPT, gemini, claue, 딥시크와 재미있게 놀았다.
그 와중에 GPT유료 결재도 했다;;;;
'컴퓨터' 카테고리의 다른 글
| ISA 62pin XT + 36pin AT(확장) = 98pin (0) | 2025.12.12 |
|---|---|
| 실기와 DOSBox에서 게임 엔딩 BGM 길이가 다른 이유(대항해시대2) (0) | 2025.12.09 |
| midi to vgm(vgz) 변환 (0) | 2025.12.08 |
| Turbo deburgger 2.86 (0) | 2025.12.05 |
| Turbo Debugger (인스톨본) (0) | 2025.12.05 |