2021년 8월 10일 화요일

[강좌] 08. 디스크 게임의 실행환경 만들기

디스크 전용 게임(2DD/1DD)들은 FDD에 디스켓을 넣고 전원을 켜면 게임이 실행됩니다.

뭔가 더 필요할까요?ㅋ

.

.

.

지금부터 얘기하려는 내용은...

아마 십여년 전부터 MMC/SD를 쓰신 분들이라면 잘 아시는 내용이겠지만,

읽다가 금시초문이라고 하실 분이 분명히 계실 듯 해서 적어봅니다 ㅎ.ㅎ

기억이 가물가물하셨던 분이라면, 글 마지막의 [요약]만 보고 넘어가시면 되겠습니다.



[본론]


80년대 FDD를 쓰셨던 분들의 대부분은 아마 아이큐2000 + FDD 또는 X-II 환경이겠죠?

FDD가 내장된 X-II 및 일제 MSX2/2+를 본체 그대로 쓰면 그대로 완벽한 환경이 되겠습니다.


90년대부터는 상황이 좀 바뀌기 시작했는데요.

쯔지가와씨의 MEGA-SCSI, 선라이즈 IDE 등의 외장 디스크기기가 널리 쓰였구요.

제가 만든 MMC/SD 드라이브는 2004년에 등장하면서 국내에서 많은 분들이 쓰기 시작했습니다.


이제 슬슬 문제가 발생합니다.

보통 대용량 디스크 기기에서는 기존 2DD 게임을 구동하기 위해,

DSK 파일(디스크 섹터를 덤프한 이미지)을 FDD에서 쓰는 것처럼 에뮬레이션을 하게되는데요.


FDD는 드라이브 문자가 2개(A: B:)인 장치입니다.

디스켓 구멍이 하나뿐인 싱글 드라이브를 쓰더라도 가상의 B: 드라이브가 생성이 되어서,

디스크를 사용하는 S/W입장에서는 둘을 구분하지 않습니다.


요즘 많이 쓰시는 MMC/SD V4의 경우, 번들된 SD카드는 파티션이 6개가 있으니까...

드라이브 A: ~ F:가 할당이 됩니다.

이 상태에서 DSK 파일을 구동하면?

기기가 FDD 에뮬모드로 전환되면서 DSK 이미지를 드라이브 A: B:로 매핑해줍니다.

다른기기들의 에뮬도 비슷한 방식으로 구동하고 있을거에요.


여기까지만 보면 FDD를 쓰는 경우와 별차이가 없는데요.

특히 아이큐2000처럼 본체에 FDD가 내장되지 않은 경우는,

일반 외장 FDD를 쓰는 경우와 대용량 디스크기기의 FDD에뮬 모드의 동작이 거의 같습니다.

실사용에서도 문제가 발생하지 않습니다.


하지만, FDD가 내장된 본체를 사용하게 되면 큰 문제가 발생하는데요.

S/W 구동 시, 에러를 표시하지않고 그냥 뻗어버리거나, 그래픽이 깨지는 등의 문제가 발생합니다.


이 문제는 디스크 커널의 특성과 거기 맞춰서 개발된 S/W의 문제가 모여서 발생합니다.


보통 DOS1 롬이라고 부르는 디스크 커널은 부팅할 때, WORKAREA에 필요한 메모리를 할당 후 사용합니다.

이 때 약 3KB가 사용이 되구요, FDD를 여러개 사용하면 그만큼 메모리 사용량도 늘어납니다.

본체에 FDD가 내장되어있는데, 외장 디스크를 추가연결하면 6KB가 소진되는 셈이죠.


근데 대부분의 디스크 게임들은 FDD 한개를 사용하는 환경을 기준으로 제작이 되어있습니다.

따라서, FDD를 여러개 꽂아서 WORKAREA가 많이 소진된 상태에서는?

스택(STACK) 영역이 부족하다보니, 힙(HEAP)과 스택이 충돌하는 상황이 발생하는거지요.

게임 구동 중 오동작하거나 그냥 멈추는 모습(?)으로 나타납니다.


그러면 디스크 기기가 2개 이상인 경우는 게임을 실행할 방법이 전혀 없는걸까요?

그건 아닙니다 ㅎ.ㅎ


모든 디스크롬에서는 공통으로 지원되는 기능이 하나 있는데요.

부팅 시 CTRL 키를 누르고 있으면, 드라이브 A: 한개만 할당하고 넘어갑니다.

그러니까 FDD의 드라이브 B:가 사라지게 되는거죠.

이렇게 드라이브 문자가 한개 줄어들면 WORKAREA에 할당되는 메모리도 줄어듭니다.

약 1.5KB가 되어요.


참고로, 유저의 CTRL 키 입력을 기다리는 표시가 따로 나오지 않기 때문에,

이 기능을 쓰려면 본체를 켠 후(또는 리셋 후) CTRL 키를 계속 누르고 있어야합니다.


그럼, FDD 두대를 연결했을 때 CTRL 부팅을 하게 되면?

첫 FDD가 드라이브 A:로 사용되고, 두번째 FDD가 드라이브 B:로 사용됩니다.

결국 WORKAREA 사용량이 FDD 한대일때와 똑같아지는거죠.


만얀 FDD가 세대 이상 연결되어있다면?

CTRL 부팅을 해도 드라이브 A: B: C: 3개가 할당되어서 게임이 안돌아갈겁니다요~

결국 FDD 두대 정도는 항상 연결해놓더라도 크게 문제 없다는 얘기죠.


하지만 복병이 하나 있었으니ㅋ

코에이 게임처럼 메모리를 빡빡하게 사용하는 경우는,

처음부터 CTRL 부팅을 요구합니다.

FDD가 한대뿐인데도 CTRL키를 눌러야 실행이 됩니다. (램 1.5KB만 봐주겠다! 뭐 그런거죠)

이런 경우는 디스크 기기가 두대 이상 연결되어 있으면, 딱히 방법이 없죠.


제가 만든 MMC/SD의 경우는 OneDrive라는 기능이 있는데요.

이걸 쓰면 외부 슬롯(SLOT 1 또는 2)으로 DSK 에뮬모드로 진입 시,

본체 내장된 FDD가 구동되지 않도록 게임 디스크를 바로 부팅시킵니다.

그리고 CTRL 키를 누른 것 처럼 초기화를 합니다.

FDD가 한대뿐인 환경에서 CTRL 키를 누르고 부팅하는 것과 같은 조건을 만들어주는 것이지요.


제가 예전에 올린 사진이나 영상을 보시면 항상 MMC/SD V2 두개가 꽂힌걸 볼 수 있는데요.

이 상태에서도 게임을 구동할 수 있는게 OneDrive 기능때문이었습니다요.

그럼 이대로 상황종료?

.

.

.

그럴리가 있겠습니까요? ㅋ

또다른 복병 바로 마이크로캐빈의 게임인데요.

이넘들은 FDD 한대 그대로 부팅하는 상황(드라이브 문자 A: B: 유지)에서만 실행이 됩니다.

만약 내 본체에 FDD가 내장되어 있고, MMC/SD로 DSK 파일을 구동한다면?

OneDrive를 끄고 유저가 CTRL 부팅을 해주는 방법밖에 없습니다.

물론 본체에 FDD가 내장되지 않았다면, 그냥 OneDrive만 끄면 잘 실행되겠습니다.


마지막으로 보너스 입니다.

MMC/SD Drive V4에서는 GameRunner II라는 막강(?)한 환경을 제공합니다.

가상의 슬롯, BIOS, 디스크 등으로 구동되어, 본체의 주변기기 조건과는 별개의 공통 환경을 만들 수 있습니다.

예) 아이큐2000 + FDD 한대의 환경 구동



[요약]


- 대부분의 디스크 게임은 FDD 한대만 있는 환경에서만 실행이 됨

- FDD가 두대인 경우는 CTRL 부팅으로 해결가능

- FDD가 세대 이상이면 해결책이 없음

- MMC/SD Drive의 OneDrive 기능으로 추가된 FDD를 무력화 할 수 있음

- 코에이의 게임은 OneDrive으로 간편하게 실행가능

- 마이크로캐빈의 게임은 CTRL 부팅 시 실행안됨 (OneDrive OFF 필수)

- MMC/SD V4의 GameRunner II로 FDD 한개뿐인 가상의 환경을 만들 수 있음

- MMC/SD 외의 디스크기기로 구동하는 환경은 제게 물어보지마세요 (잘 몰라요)


2021년 8월 1일 일요일

MoonBase 제작 #5 - OPLL 용 PCM 드럼셋을 두개로~

플래쉬롬과 로직에 조금 여유가 있어서, PCM 드럼셋을 하나 더 추가해보았습니다.

약간 드라이(?)한 느낌 드럼셋입니다 ㅎ.ㅎ


먼저 사이코월드 오프닝 영상을 녹화해보았습니다.

첫 오프닝은 기존 드럼셋을 사용하구요. 두번째 오프닝은 추가된 드럼셋을 사용합니다.

비교해서 한번 들어보셔요~





아래는 MGS 파일 3개를 재생 후,

기존 드럼은 왼쪽 오디오로, 추가된 음원은 오른쪽 오디오로 편집해서 넣었습니다.

OPLL 멜로디는 양쪽이 같으니까 모노로 들리겠구요.

드럼 사운드는 스테레오로 들리겠습니다.


드럼 비교용으로 만든건데, 이렇게 들어보는 것도 재밌네요.

모노 오디오는 뭔가 좀 먹먹한 느낌이 있어요. 흐...

https://soundcloud.com/yeongman-seo/moonbase-drum-set-l-r-mgs-music



그럼, 즐거운 일요일 되세요! ㅎ.ㅎ


2021년 7월 18일 일요일

MoonBase 제작 #4 - 동작 모드

먼저 기존 MSX-Audio 기기들의 차이를 설명해드리는게 좋겠죠?


파나소닉 FS-CA1, 필립스 NMS 1205 (뮤직모듈), 도시바 HX-MU900 세종류의 카트리지가 있습니다.

모두 Y8950 칩과 32KB의 샘플램(ADPCM 용 SRAM) 내장이구요, 뮤직 키보드 용 커넥터가 있습니다.

기본 기능은 똑같다고 보시면 되겠네요.


* 파나소닉 FS-CA1 

Y8950 (OPL + ADPCM 32KB)

Audio BIOS: O

I/O Port 변경: O

MIDI: X

PCM u8: X


* 필립스 NMS 1205

Y8950 (OPL + ADPCM 32KB)

Audio BIOS: X

I/O Port 변경: X

MIDI: O

PCM u8: O


* 도시바 HX-MU900

Y8950 (OPL + ADPCM 32KB)

Audio BIOS: X

I/O Port 변경: X

MIDI: X

PCM u8: X


S/W 호환성(BIOS)을 고려하면 파나소닉이 최선의 선택지입니다만,

BIOS 보드 개조를 기본으로 가정하면, H/W 기능이 더 많은 필립스 NMS 1205가 좋습니다.

ADPCM 샘플램을 32KB -> 256KB로 증설하는게 기본 소양(?)이라서,

BIOS 보드(Audio BIOS 1.3 개조버전)도 함께 추가 해주는게 좋습니다요.

필립스/도시바 카트리지 용으로 개조 보드가 제작/판매된 적도 있었죠.


MoonBase의 기능은 아래처럼 정리가 되겠네요.

Ext.OPL + ADPCM 256KB: O

Audio BIOS: O

I/O Port 변경: O

MIDI: X

PCM u8: O

PCM s16: O


저는 필립스 NMS 1205의 샘플램이 256KB으로 개조되어있구요.

문사운드는 샘플램 1024KB 증설해서 사용하고 있습니다.


근데, 필립스 뮤직모듈의 출력이 좀 작은편에 노이즈가 좀 있어서,

항상 꽂아놓고 쓰기가 좀 애매하더라구요. (믹서 출력을 많이 높이다 보니..ㄷㄷ)

최근 5년정도는 거의 문사운드 하나만 꽂고 쓴 듯 합니다.

그러다보니, MSX-Audio 용 프로그램을 쓰려고 뮤직모듈을 꺼내기도 귀찮고 좀 그랬죠.


MoonBase를 제작하게 된 이유가,

문사운드(OPL4) 호환 기기는 흔하게 쓰이고 있으니,

"슬롯 낭비 없이 카트리지 두개를 합체해서 MSX-Audio 기기로 동작하도록 해보자"였습니다요~ ㅎ.ㅎ


그리고 듀얼 MSX-Audio를 쓰려면, 파나소닉의 FS-CA1 두개가 필요한데요.

MoonBase도 포트 변경이 가능하니, 필립스/도시바 기기와 조합으로도 쓸 수 있습니다.

포트 변경이 안되는 필립스/도시바 카트리지는 기존 포트 C0H/C1H 사용,

MoonBase는 C2H/C3H 포트를 사용하는거죠.


보통 C0H/C1H 포트가 기본(마스터)으로 쓰이기 때문에,

NMS 1205 + MoonBase + MoonSound 조합으로 구동하면 NMS 1205의 OPL + ADPCM이 기본포트가 됩니다.

.

.

.

듀얼 Audio를 쓰는 프로그램이 거의 없다는게 함정이지만요ㅋㅋ


그 외, 필립스 카트리지와 호환되는 Mono PCM u8 (unsigned 8bit)이 들어있구요.

Mono PCM s16 (signed 16bit)도 들어있습니다.

MMCSD.COM의 WAV 플레이어를 구동하면,

Mono/Stereo u8 WAV는 T-Wave로

Mono u16 WAV는 MoonBase로 출력가능합니다.




이제 본론으로 넘어가서...

MoonBase의 동작모드에 대해 알아보겠습니다요~


아래처럼 보드 왼쪽에는 3단 슬라이드 스위치가 있는데요.

부팅 할 때 스위치 위치에 따라 동작 모드가 결정됩니다.

일단 부팅 후에는 슬라이드를 움직여도 모드가 바뀌지는 않아요.

BIOS가 동작하는 도중에 바꾸면 죽으니까, 일부러 막아놨습니다ㅋ





각 모드의 설명 나갑니다~


* (상) BIOS FS-CA1 OPL with ADPCM


MoonBase + MoonSound(OPL4 호환) 카트리지 하나만 사용하는 경우 유용합니다.

파나소닉의 오리지널 BIOS와 ADPCM용 샘플 데이터 64KB롬이 동작합니다.

BASIC의 COPY PCM 등의 모든 명령어가 다 동작합니다.

단, MoonBase는 ADPCM 레코딩(encoder) 기능이 없다는걸 기억하시구요! ㅎ.ㅎ


FS-CA1와 같은 방식으로 포트 스위칭이 가능합니다.

만약 파나소닉 카트리지가 있다면, 함께 꽂아서 마스터/슬레이브로 사용가능합니다.

(참고: 빠른 슬롯에 꽂은 카트리지가 마스터가 됩니다.)



* (중) BIOS 1.3 OPL with ADPCM


개조 BIOS인 Audio BIOS 1.3 (HX-MU900 모드)을 사용합니다.

MoonBase + MoonSound(OPL4 호환) 단독으로 사용 시, C0H/C1H으로 구동됩니다.

필립스/도시바 카트리지에 BIOS 개조킷(+ ADPCM 256KB)을 장착한 것과 동일한 상태가 됩니다.

개조 BIOS는 ADPCM 샘플롬을 지원하지 않기 때문에 COPY PCM 등의 명령은 사용불가능합니다.

그 외 기능은 FS-CA1과 동일합니다.

개조 BIOS 문서 상에는 OPL 중복 처리 등의 코드가 제거(개선)되어 있다고 하네요.


만약 필립스/도시바 카트리지를 추가 장착하는 경우는

MoonBase의 포트가 C2H/C3H로 변경되어 슬레이브로 동작합니다.

저처럼, MoonBase + MoonSound를 기본 세팅으로 쓰다가,

뮤직모듈 추가해서 듀얼 ADPCM을 쓰는 시나리오에서 가장 유용하게 쓸 수 있겠습니다.


아래 사진은 GT의 슬롯1에 MoonBase + MoonSound를 꽂고

후면 확장슬롯에 필립스 뮤직모듈을 꽂은 상태입니다.





* (하) BIOS 1.3 OPL3 with OPLL Drum


개조 BIOS인 Audio BIOS 1.3 (OPL3 모드)을 사용합니다.

이 때는 MoonBase의 포트 포워딩(C0H/C2H -> C4H/C5H)이 비활성됩니다.

BIOS에서 직접 OPL3(OPL4)를 컨트롤하기 때문에 필요가 없죠.


근데 OPL3 모드에서는 ADPCM 관련 루틴이 제거되어있습니다. OPL3/OPL4 칩은 ADPCM이 없으니까요.

대신 MoonBase의 OPLL Drum 기능을 사용할 수 있습니다.

MSX-Music의 OPLL 리듬모드 I/O를 5채널의 PCM으로 변환해서 구동하는 모드입니다.

부드러운 FM 멜로디에 강력한(!) 드럼 소리가 추가됩니다.

YM2608의 FM + PCM 드럼 사운드와 유사한 방식입니다~ ㅎ.ㅎ



* OPLL Drum without BIOS


이 모드는 슬라이드 스위치 설정과 상관없이, 부팅 시 M 키를 누르면 선택됩니다.

Audio BIOS가 인스톨 되어있을 때 S/W 호환성 문제가 생기거나,

MSX-Audio를 지원하는 S/W에서 강제로 MSX-Music을 쓰고 싶을 때 쓰시면 됩니다.


예를 들어 제비우스처럼 MSX-Music과 MSX-Audio를 둘 다 지원하는 게임에서,

이 모드를 선택하면 MSX-Audio 사운드 대신 MSX-Music + PCM 드럼 사운드를 들을 수 있게됩니다.




[요약]


(상) BIOS FS-CA1 OPL with ADPCM

-> MoonBase + MoonSound 단독 또는 MoonBase 2개으로 사용 시.


(중) BIOS 1.3 OPL with ADPCM

-> MoonBase + MoonSound 사용 중, 필립스/도시바 카트리지를 추가 사용으로 듀얼 ADPCM 구동.


(하) BIOS 1.3 OPL3 with OPLL Drum

-> OPL3(OPL4) 모드를 주로 사용하고, Audio BIOS (ADPCM 제외) 및 OPLL 드럼 사운드 활용 시.


OPLL Drum without BIOS

-> Audio BIOS 호환 문제 회피 또는 MSX-Audio 대신 MSX-Music + OPLL 드럼으로 고정 사용 시.




MoonBase의 기본 정보는 요렇게 마무리합니다.

그럼, 즐거운 일요일 되세요! ㅎ.ㅎ