2021년 6월 25일 금요일

MoonBase 제작 #1 - 달기지 건설

작년에 T-Wave를 만들었는데, 이번엔 조금 다른 사운드 카트리지를 만들어봅니다.

카트리지 이름은 'MoonBase'로 지었습니다. 우리말로 하면 '달기지' 정도?ㅋ



[서론]


PSG, PPI 1BIT 사운드는 MSX1부터 기본으로 들어간 사운드인데요.

그 후 MSX-AUDIO, MSX-MUSIC가 표준기기로 추가되었습니다.

나중에 90년대에 선라이즈가 OPL4 칩을 이용한 MoonSound 카트리지가 등장했구요.


근데 MSX-MUSIC 경우는 본체에 내장된 기종이 나올 정도로 보편화되었지만,

MSX-AUDIO는 사용자가 많지 않았습니다.

나중에 나온 저가형 MSX-MUSIC에 완전히 밀려버렸지요 ㅎ.ㅎ


MSX-AUDIO는 기본 OPL 사운드에 4BIT ADPCM 입출력, 뮤지컬 키보드, 미디 입출력까지 들어간...

좀 후덜덜한 외장 기기였습니다.

ADPCM 샘플 메모리는 기본 32KB가 내장이고, 최대 256KB로 증설가능합니다.

당시 많은 MSX1 기종의 메인램이 32KB였던걸 고려하면, ADPCM 기능 하나만으로도 좀 오버스펙이었습니다요~

필립스의 MSX-AUDIO인 MusicModule 카트리지에는 8BIT PCM 사운드도 추가되어있었구요.


유럽쪽은 뮤직모듈이 흔해서 그랬던걸까요? 유저들이 만든 MSX-AUDIO 용 뮤직 디스크가 꽤 있습니다.

물론 Unknown Reality 같은 유명한 데모에서도 ADPCM을 들을 수 있죠.

"Jump Jump~" 목소리가 나오는 데모는 샘플램이 256KB가 아니면 플레이 안되고 스킵됩니다 ㅎ.ㅎ

이거 들으려고 뮤직모듈을 사자마자 뜯어서 램 추가했었지요~


그 후 문사운드를 구해서 IMS, MOD 등을 주로 듣다보니, MSX-ADUIO쪽은 좀 멀어지긴했네요.

물론 MPX로 MP3를 듣는 시간도 꽤 늘었구요.

.

.

.

그렇게 수년이 흘렀습니다.

2016년 정모때였나요? 준소프트님이랑 잠깐 얘기나눴던 기억이 나네요.

그게 "ADPCM을 추가해서 만드실 계획은 없나요?"였죠.


문사운드의 OPL4는 기본적으로 OPL, OPL2, OPL3 하위 호환이 됩니다.

MSX-AUDIO의 Y8950 칩은 OPL에 ADPCM과 GPIO가 추가되어있는데요.

OPL4에 ADPCM을 추가하게 되면, 굳이 두개 카트리지를 꽂을 필요없이 하나면 충분하겠죠?

구하기 힘든 MSX-AUDIO 보다는 OPL4를 확장하는게 더 쉬우니까요.


이제 2021년입니다.

그렇게 목마른 사람이 우물을 파는 해가 되었습니다 ㅎ.ㅎ




[본론]


MoonBase의 기본(최소) 기능은 Y8950의 4BIT ADPCM 출력입니다.

(그 외의 부가기능은 다음편에서 알려드리겠습니다요)


야마하 사운드칩에서 흔하게 보이는 ADPCM은 두종류가 있는데요. ADPCM-A, ADPCM-B이죠.

Y8950에 들어간 놈은 ADPCM-B입니다.

최대 16KHz 출력이 가능하구요.

샘플램 256KB를 다 채우면, 16KHz 샘플을 32초 동안 플레이가능합니다.

8KHz 정도의 낮은 음질이라면 64초를 버틸 수 있겠네요.


기본 환경은 ADPCM을 문사운드의 OPL4와 조합해서 MSX-AUDIO + OPL2 환경으로 만들어주는겁니다.

OPL4를 Full로 사용하는 S/W는 MSX-AUDIO의 OPL를 함께 쓸 확률이 없으니,

이렇게 조합하면 여러가지로 활용이 가능하겠죠?


MSX-AUDIO는 최대 두개의 카트리지를 쓸 수 있습니다.

Primary는 C0H, C1H 포트를 사용하고

Secondary는 C2H, C3H 포트를 사용합니다.


문사운드(OPL4)의 FM 사운드(OPL3)는 Main C4H, C5H 포트와 Sub C6H, C7H 포트를 사용합니다.

야마하가 OPL 하위 호환을 위해 이렇게 일부러 이렇게 만들어놨어요.

칩 매뉴얼 보시면 Main/Sub의 FM 레지스터(20H ~ FFH)가 동일하게 되어있습니다.

그러니까 OPL2의 FM 사운드를 두개 넣었다고 보시면 무방합니다.

(레지스터 00H ~ 1FH 사이는 칩별로 조금씩 차이가 있어요.)


그러면, 달기지에서 C0H, C1H 포트로 레지스터 00H ~ 1FH를 구현하고,

FM 레지스터는 문사운드의 C6H, C7H 포트로 쓰도록 해주면??

두개를 잘 활용할 수 있겠죠?


이걸 수식으로 적어보면요 ㅋ

OPL4 = OPL3 + Wave

OPL4 = OPL2 + OPL2 + Wave

OPL4 + MoonBase = OPL2 + (OPL2 + MoonBase) + Wave

OPL4 + MoonBase = OPL2 + Y8950 + Wave

이렇게 되겠습니다.


왜 이 짓(?)을 하는지 이해가 안되시면, 위의 [서론]을 다시 읽어보세요ㅋㅋ

마음 같아서는 MoonBase에 OPL4를 때려넣고 싶지만,

이미 OPL4 호환기기가 워낙 많기도 하고...

OPL4 관련 칩들을 구하는것도 쉽지않고... 뭐 그렇습니다.


(흐... 제가 쓰는 뮤직모듈은 카트리지가 두꺼워서, 확장슬롯에 꽂아두기가 좀 힘듭니다.

이것도 사실 좀 문제였어요.)



그럼, ADPCM 부터 구현해보아요~

로직을 VHDL로 다 때우면 CPLD 용량을 많이 잡아먹으니, 최대한 외부 플래쉬롬을 활용해서 구현합니다.


일단 기본적인 컨트롤 레지스터와 샘플 메모리 R/W 및 ADPCM 디코딩, PCM 출력부분을 넣었습니다.

타이머 2개와 인터럽트는 미완인데, 대부분 뮤직 디스크들은 구동이 되네요. 타이머를 안쓰나봐요.


아래 영상은 실제로 구동한 모습입니다.

테스트를 위해, "GT 본체 + V4 + MoonBase" 딱 요렇게만 환경을 구성했어요.


영상에서는 MSX-AUDIO 전용인 Impact4 뮤직 디스크가 실행됩니다.

처음부터 끝까지 자동재생이라 테스트하기 좋군요.

전체 재생시간이 30분을 넘어가니까, 대충 돌려보세요 ㅎ.ㅎ

FM으로는 만들기 힘든 드럼, 박수, 목소리를 ADPCM으로 어떻게 활용하는지 쉽게 확인가능합니다.

(주의: 영상에서는 OPL 사운드 없이 ADPCM만 나옵니다!)






[요약]


OPL4 카트리지를 MSX-AUDIO 처럼 활용하려면?

-> MoonBase(달기지) 카트리지와 합체하세요.



그럼, 오늘은 여기까지이구요. 다음편에서 또 이어지겠습니다~


2021년 6월 17일 목요일

SLT-Turbo 제작 #9 - V2의 바뀐 모습

V2의 방향은 어디로 가는게 좋을까? 그동안 고민을 많이 했습니다요~ ㅎ.ㅎ

대충 요약을 해보면요...


1. Z280의 확장 명령어를 포기


R800은 Z80에서 추가된 명령어가 곱셈 두개뿐이지만, Z280은 많은 명령어가 추가되어있습니다.

곱셈, 나눗셈 명령어를 활용하면 각종 계산 루틴을 빠르게 구동할 수가 있어요.


R800을 보면 아시겠지만, 2개 추가된 곱셈조차 사용하는 프로그램이 거의 없습니다.

S/W 개발자 입장에서 보면 소수 터보알 유저를 위한 프로그램 보다는,

 일반 MSX2 수준에서 쓸 수 있어야 많은 유저가 활용할거라는게 명백하니까요.

참고로 기존 터보알 전용 프로그램에서도 거의 사용하지 않습니다. 상용 프로그램은 아예 없죠.


제가 만든 M 파일 매니저, ASO 리메이크 등에서는 R800 명령어를 쓰지만,

돌아오는 피드백은 보통 이렇죠.

> 일반 MSX2 용으로 만들어 주세요. MSX1에서도 되면 더 좋겠구요.

> V9938이면 충분해 보이는데 왜 터보알 전용인가요? 님은 알레스트 안해보셨나요?


뭐 그렇습니다요 -_-


근데 Z280의 경우는 상황이 더 안좋은게, 이쪽은 개발자가 저 하나뿐이라는게 문제라서ㅋ

결국 Z280 칩을 제거하고 R800 곱셈명령만 로직으로 구현해서, 터보알 호환성을 유지하도록 합니다.



2. 고속 BUS를 지원하려면?


이것 때문에 고민을 많이 했는데요.

SLT-Turbo V1은 A1GT 수준으로 업그레이드 해주는 것 뿐이라서,

외부 슬롯은 3.58MHz BUS를 그대로 유지합니다. 터보알과 똑같죠~ ㅎ.ㅎ

이 방법은 H/W 호환성을 유지하는데엔 좋지만, 빨라진 시스템을 활용하는게 쉽지 않습니다.

쉽게 말하면 내장 메모리와 내장 기기를 활용하는 경우만 고속으로 동작하니까요.


결국 외장 기기를 만들 때, 처음부터 터보알을 고려해서 설계해야하는데 그게 애매하거든요.

특히 비디오 카드처럼 외부에서 단독으로 동작하는 경우는 완전 치명적이구요.


사실 제가 아는 것 중에는... 터보알에 최적화된 기기는 MMC/SD V3와 V4밖에 없네요.

V2는 A1WX 반터보(5.37MHz)나 1chipMSX의 터보(8.06MHz)에서 더 빠르게 동작합니다만,

V3, V4는 터보알의 고속모드(외부 3.58MHz)에서 훨씬 더 빠릅니다.


그렇다면 20MHz 고속 BUS를 쓸 수 있는 슬롯을 따로 할당하면 어떨까요?

가장 쉬운 방법은 외부 기본 슬롯인 SLOT 1 또는 2 전체를 고속으로 만드는건데요.

MSX의 슬롯이 16니까 외부 기본슬롯(서브4개) 하나를 할당해도 괜찮지 않을까 생각되시죠?


근데 카트리지 호환성 때문에 SLOT 1은 기본슬롯 하나로 완전히 빼놔야 하는데요.

그럼 남는게 SLOT 2 하나뿐이에요.

SLOT 0, 3은 대부분 BIOS랑 내장 S/W가 점유하고 있으니 서브슬롯 두개정도 남으려나요?

그러면 SLOT 2를 고속으로 해버리면, 외장형 주변기기들을 꽂을 슬롯이 별로 없게됩니다.

제 경우 최소 T-Wave, FontPack, MPX, MoonSound는 항상 꽂혀있어야 해서, SLOT 2는 항상 만차에요ㅋ


고속의 외부 슬롯은 할당하는건 무리라고 판단됩니다.

결국 내부만 고속으로 돌리는걸로 합의했어요. (저 혼자  합의ㅋ)


GT를 20년 가까이 썼는데, 외부 슬롯은 기존을 유지해야된다는게 MSX의 숙명...ㅎ



3. 고속 모드를 활용하는 내장 기기들


그럼 내장 기기를 추가할 때 고속모드를 잘 활용할 수 있는건 어떤 것들이 있을까요?

가장 먼저 떠오르는게 디스크, 비디오, 오디오겠죠? ㅎ.ㅎ


3.1 디스크 드라이브


SLT-Turbo V1에서는 터보알과 비슷한 DOS2 호환 커널이 SLOT 3-2에 탑재됩니다.

대신 FDD는 호스트 본체의 디스크롬을 경유하도록 되어있어요.

잘 이해가 안되신다면, paraMSX-R의 V-Disk 기능(호스트 디스크 매핑)을 떠올려보심 되겠습니다.

그거랑 똑같아요! ㅎ.ㅎ


물론 이 상태는 고속모드랑 전혀 관계가 없습니다.

아마 그냥 활용하는 것도 MMC/SD 같은 외부 디스크 장치에 의존하게 될거에요.

그래서 SLT-Turbo V2에서는 본체 FDD 대신, SLT-Turbo에 내장된 SD카드를 기본으로 사용합니다.

참고로, 요놈의 이름은 SLT-Drive입니다요.


3.2 비디오


요놈땜에 설계하는데 시간이 많이 걸렸어요. 이랬다가 저랬다가 왔다갔다~ㅋ

SLT-Turbo가 MSX 본체에 꽂는 주변기기처럼 생겼지만...ㅋ

사실은 이놈이 메인 기기이고, 호스트 본체를 외장 주변기기처럼 사용하는데요.

호스트에서 가장 중요한 부분은 비디오(VDP 관련)와 키보드, PSG입니다.


그럼, SLT-Turbo에서 지원하는 비디오 기능은 뭘까요?

MSX의 기본화면을 생성하는 것은 본체의 VDP(V9938/9958) 그대로입니다.

SLT-Turbo에 추가된 비디오는 기존 본체의 화면에 새로운 비디오를 오버레이 해주는 방식입니다.

그러니까 본체의 RGB 입력을 받아서 SLT-Turbo의 비디오(가칭 SLT-Video)를 위에 올려서 함께 출력하는거죠.


컬러 포맷은 RGB555이구요. 팔레트는 8BPP입니다.

팔레트 모드에서는 기존 스크린8 모드 호환도 가능하고, V9990의 15BIT 비트맵과 같은 화면도 가능하겠죠.

인터레이스 모드는 필드 메모리 분할이 아닌 선형으로 주소가 매핑되구요.

여러개의 페이지(Max. 4개)를 오버레이 하거나 스크롤, 화면 분할 등이 H/W로 지원됩니다.

팔레트 셋도 거의 무제한으로 설정가능하구요.


자세한 내용은 나중에 SLT-Video 편에서 따로 설명드리겠지만,

일단 메인램을 할당해서 사용함...정도만 기억하셔요. ioremap과 비슷합니다.


참고로, SCART 출력의 화면비율 설정도 가능합니다.

4:3, 16:9 설정을 바꿀 수 있어서 걸그룹 뮤비를 만들 때 레터박스를 쓰거나 화면을 자르는 작업을 하지않아도 됩니다.

아마 일제 모니터를 쓰시는 분은 지원안될겁니다요.


3.3 오디오


제가 지난 십여년간 준소프트님의 MPX를 워낙 잘 썼기 때문에, 그냥 VS10x3 칩을 박아버릴까 생각도 해봤는데요.

이넘은 파서, 디코더와 렌더러가 합체된 구조라서 내장기기로 쓰기는 애매한 듯 해서...

그냥 오디오 DAC만 추가하기로 합니다.

쉽게 구할 수 있는 PCM5102 모듈을 붙이는 방법을 썼어요.

혹시나 모듈이 단종되면 회로를 그려야하는 불상사가... 하지만 일단 납땜 노가다를 줄이는 방향으로~ ㅎ.ㅎ

자세한 기능은 오디오 편에서 따로 얘기하겠습니다요. (가칭: SLT-Audio)


현재까지는 8핀 DIN 단자의 RGB + 오디오는 그대로 두고

SLT-Turbo의 서브슬롯 쪽의 오디오와 SLT-Audio만 믹스해서 3.5파이 단자로 출력합니다.

이렇게 하는게 본체의 오디오와 SLT-Turbo쪽의 오디오 밸런스 맞추기가 쉬울 것 같아요.

물론 외부 믹서가 있어야겠지만요~ ㅎ.ㅎ



4. DMA 컨트롤러


MSX1,2는 워낙 싸구려 홈컴퓨터 사양이라 그런지, DMA는 사양에 없는데요.

터보알에도 없어요 ㅎ.ㅎ


SLT-Turbo V2에서는 CPU 부담을 덜어주기 위해 간단하게 DMAC가 들어갑니다.

비디오, 오디오 처리 시 유용하게 쓸 수 있겠구요.

T-Wave의 DCSG 포트나 스테레오 DAC 포트, Covox 포트도 쓸 수 있겠습니다.

(물론 저혼자 쓰게 될 확률이 높...ㅋ)



5. I/O 메모리 리맵


SLT-Turbo에 내장된 메모리는 4096KB입니다.

단일 메모리 매퍼로 지원가능한 최대사이즈입니다.

내장 기기로 추가된 비디오, 오디오 기기는 별도의 로컬 메모리가 탑재되지 않고,

메인 메모리를 할당 받아서 사용하게 됩니다.


메모리 관리자를 따로 만들면 좋겠지만, 기존 메모리매퍼 확장 BIOS도 안쓰는 개발자가 수두룩한걸 볼 때...

뭔가 더 만들게 되면 관심에서 멀어지는 효과만 늘어나겠죠?ㅋ


비디오, 오디오에서 필요한만큼 할당해서 매핑가능합니다.

예를 들어 V9938의 경우는 스크린8의 페이지가 2개(64KB x 2개)뿐이지만,

SLT-Video는 4MB 내에서 충분히(?) 많이 만들 수 있어요.



나름 요약해본건데... 글씨만 많군요 ㅎ.ㅎ

마지막으로 사진 한장 올리고 물러갑니다요~




그럼, 다음편에서 보아요~