2016년 12월 17일 토요일

HI-TECH C 용 BGM 라이브러리 만들기 #4 - FM 지원

기존 BGM 루틴에 FM 사운드도 추가하였습니다.

여기서 FM은 MSX-MUSIC(YM2413-OPLL) 칩을 의미합니다요.

왠만한 후기형 MSX2/2+에는 MSX-MUSIC이 내장되어있어요.

물론 turbo R에서도 지원되구요.


MSX-MUSIC은 두가지 동작 모드가 있어요. 멜로디/리듬 모드인데요.

멜로디 모드는 9채널 모두 멜로디 악기로 동작하는 모드이고,

리듬 모드는 마지막 3채널(7,8,9번)을 리듬 악기(5가지)로 구동하는 모드입니다.


아마 20여년전에 BASIC으로 구동해보셨던 분 많으시죠? ㅎ.ㅎ

이제 C로 한번 해보셔요~ㅋㅋ


그리고 라이브러리 내에서 CPU 모드를 체크해서, 칩 액세스 타이밍을 적절하게 세팅합니다.

Z80 일반모드, R800 고속모드 상관없이 자동으로 처리되니까 참고하세요.



그럼, 이쯤에서 1편에서 나왔던 요구사항을 점검해봅니다.


1. 배경음악 재생

2. 효과음 등의 사운드 믹스

3. PSG 구동

4. OPLL 구동

5. MML 사용


오홍~ 대충 완성이군요. ㅎ.ㅎ

유X군님께, 올 연말까지 라이브러리 정리해드리기로 약속했는데...

미션 성공이네요. 만세~!



백문이불여일견! 소리를 들어보겠습니다요! (쓰고보니 반대네요~. 백견이불여일문? ㅋ)

듣기전에 기존 테트리스 프로그램의 PSG, FM 채널 설정부분의 코드를 잠깐 보시지요.




BGM 채널 0,1,2는 PSG로 출력이 되구요.

채널 3,4,...,11은 FM으로 출력이 됩니다.


만약 FM 리듬모드를 켜면,

채널 3,4,...,8는 FM 멜로디 출력

채널 9는 FM 리듬 출력으로 처리됩니다.



그럼, 동작 영상 나갑니다~

PSG/FM 테스트 프로그램과 테트리스 구동 모습입니다.





그럼, 즐거운 주말되세요!


2016년 12월 12일 월요일

2016 송년회 - 잘 다녀왔어요~

지난 토욜 천국동 송년회가 있었습니다.

준비하느라 수고하신 유령군님, 우유속의소주님께 감사를 드립니다. 최고! ㅎ.ㅎb


이번엔 작년보다 더 많은 분들이 오셔서, 더욱 신나는 시간이 되었습니다.

그럼, 사진 몇장 나갑니다~


밥먹다 찍은 셀카! (좀 흐릿하네요~ㅋ)





제 맞은편에 계시던 미남 3인조! 으흐흐...




이번 송년회 나눔, 경매에서는 가위바위보 전문가님(!)들 덕분에 많은 득템은 힘들었지만...

키티야님이 주신 GT 골드 메탈 스티커~

(키티야님이랑 사진을 같이 찍었어야 하는건데!)




요건 저의 나눔/경매품이구요.




아래는 최종 득템상황입니다.

이올로님의 멋진 센스! 천국동 이름이 새겨진 볼펜이랑 메모지입니다.

ASTERiS님의 MS 마우스도 있구요. (무려 볼마우스입니다 ㅎ.ㅎb)




저는 10시쯤에 2차 치킨집에서 남영역으로 후다닥 뛰쳐나왔어요.

집에오니 거의 12시가 되었네요.

시간이 후딱 지나가서 아쉬웠지만... 그래야 다음에 만나면 또 할 얘기가 남아있겠죠? ㅋㅋ


천국동 여러분 사랑합니다~ ㅎ.ㅎ



PS. 키티야님의 골드 스티커를 붙여보았습니다.




이랬던 저의 GT가 아래처럼 번쩍번쩍하게 되었어요! 유후~ ㅎ.ㅎ




2016년 12월 9일 금요일

HI-TECH C 용 BGM 라이브러리 만들기 #3 - 소리가 나는 테트리스?

2011년이니까 5년전이군요.

그래픽 라이브러리 데모용으로 테트리스를 만들었는데요.

아마 기억하시는 분 계시리라 생각됩니다. ㅋ




드디어! 조용한 테트리스 게임에 소리를 넣을 수 있게 되었습니다~ 오예~

무려 5년이 흘렀지만요 ㅋ


음악을 넣으려고 구글에서 악보 검색을 하다보니, 문득 생각이 나더라구요.

워낙 유명한 게임인데, 이거 MML로 만든사람 있지않을까?


역시나, 검색하니 딱 나오네요. ㅎ.ㅎb

감사히 쓰겠습니다~ 




C 코드로 복사해서 넣고 돌렸어요. 음~ 소리 잘나오네요!




배경음악만 있으면 심심하니까, 효과음도 몇개 넣어봅니다.

블럭 이동/회전/낙하/라인삭제, 4가지 효과음을 넣었습니다.

저의 실력으로는 이정도가 한계군요. ㅎ.ㅎ




전체 소스는 github에서 받으시면 되겠구요.

https://github.com/sharksym/CPMEMU_HI-TECH_C


게임만 구동해보실 분은 첨부파일 받으시면 되겠습니다

Download: TETRIS_20161209.zip



그럼 돌아가는 모습을 한번 볼까요?

모니터가 밝아서 그런지, 폰 영상이 춤을 추는군요! ㅋ





그럼, 즐거운 밤되셔요~


2016년 12월 6일 화요일

HI-TECH C 용 BGM 라이브러리 만들기 #2 - 소리가 날까?

MML이 뭔지 아시죠?

Music Macro Language 인데요. 음악을 표현하는 언어(?) 정도로 생각하시면 되겠습니다.

BASIC의 PLAY 명령에서 사용되는 문법이 대표적인 MML이라고 보시면 되겠습니다.


더 궁금하시면 wiki 문서를 찾아보셔요~ ㅎ.ㅎ

https://en.wikipedia.org/wiki/Music_Macro_Language


아래는 MSX-MUSIC BASIC 매뉴얼에 나오는 샘플곡입니다.

채널 2개로 출력하는 프로그램이네요.




OPLL 악기 설정만 빼면, 일반 PSG용 MML과 같은 구조로 되어있습니다.

요걸 C 코드로 옮기면 아래처럼 됩니다.




BASIC 코드와 C 코드의 MML 문자열이 똑같은걸 볼수가 있지요?

"BASIC에서 PLAY 코딩하던 것처럼 배경음악을 만들 수 있다"를 기억하시면 되겠습니다~


xxx_enqueue()가 모두 끝나면, xxx_play()로 배경음악을 시작하고 xxx_stop()으로 멈출 수 있습니다.

음악이 재생완료되었는지는, xxx_get_stat() 함수로 상태확인이 가능합니다.


위의 코드에서는 음악 연주를 가만히 기다리고 있으면 심심하니까,

놀고있는 PSG 채널로 짧은 효과음을 출력해봅니다.

shot() 함수는 아래처럼 구현되어있습니다.




총알소리에 쓰인 MML에 Z 명령어가 보이시죠?

요건 BASIC MML에서는 없던건데, PSG 노이즈 주파수 설정하는 용도로 사용됩니다.

참고하셔요.


실행하면 아래처럼 현재 버퍼 상태를 확인할 수 있구요.

스페이스 키 누르면 총소리가 나게됩니다~ ㅎ.ㅎ

PSG 두개 채널은 배경음악 용, 나머지 한개 채널은 총소리 출력으로 사용됩니다.




그럼 이번엔 3채널 모두 사용하는 BGM을 연주해봅니다.

베토벤 할아버지께서 작곡하신 "환희의 송가"가 되겠습니다요~




3개 채널이 모두 사용되니까, 스페이스 눌러서 총소리를 출력하게 되면,

PSG 마지막 채널은 배경음악과 총소리로 번갈아서 출력됩니다.

일단 설명만 드리고 넘어갑니다.

이 글 마지막에 동영상이 있으니까 그걸로 확인하셔요! ㅎ.ㅎ



라이브러리가 어떻게 사용되는지 대충 아시겠죠?


마지막으로 MML 데이터를 연속으로 enqueue()해서, 배경음악을 무한으로 연주해봅시다~

코드는 아래처럼 만들었습니다.

템포 240으로 "학교종이 땡땡땡~"을 연주해보았어요 ㅋㅋ




처음 enqueue()를 한번 해주고 play() 시작합니다.

그 후, 버퍼에 여유가 있으면 계속 데이터를 enqueue()합니다.

ESC 누르면 종료하도록 해주고요. 간단하죠? ㅎ.ㅎㅋ



그럼, 실제 동작하는 모습을 영상으로 보시겠습니다.

보기전에 약간의 설명들어갑니다 ㅋ

영상에 보시면 아래처럼 나오는데요.

화면의 빨간색 띠는 배경음악 처리에 사용되는 CPU 점유율입니다.

터보알 고속모드랑 Z80 3.58MHz 모드 두번 구동하니까 한번 비교해보셔요~





마지막으로 영상 나갑니다~




그럼, 즐거운 하루 되세요!


HI-TECH C 용 BGM 라이브러리 만들기 #1 - 플레이어 함수

오랜만에 라이브러리를 추가하고 있습니다.


사실 올해초에 만들다가 잠시 쳐박아둔 코드였는데요. (딴짓 하느라 바빠서요~ㅋ)

올해가 넘어가기 전에 PSG 용 BGM 루틴이라도 마무리해야될 것 같아서, 지난 주에는 코딩을 좀 했습니다. ㅎ.ㅎ


암튼, 글을 쓴다는 것도 까먹고 있다가... 대충 완성이 되고나서야 올리는 글이 되었습니다!



대강의 요구사항은 이렇습니다.


1. 배경음악 재생

2. 효과음 등의 사운드 믹스

3. PSG 구동

4. OPLL 구동

5. MML 사용



간단한 게임 프로그램에서 쓸 수 있도록 만드는 것이 목표입니다.

기능이 복잡하게 될 필요는 없고, 배경음악 + 효과음을 쉽게 처리할 수 있는 방식이면 충분합니다.


각 요구사항들을 자세히 만들어 보았습니다.


먼저 1번 배경음악 재생과 5번 MML 사용에 관한 내용입니다.

- 음악 데이터 양이 많은 경우, 동적으로 데이터를 버퍼에 enqueue 할수 있어야 함.

  양이 적은 경우는 몽땅 enqueue 후 반복 재생도 가능해야 함.

- 음악 데이터는 버퍼 enqueue 시점에 일부분 MML 번역을 하여, BGM 코드의 CPU 부담을 줄임

- BASIC MML과 비슷한 문법의 MML 데이터를 사용. (별도의 PSG 트래커 필요없음)


2번 효과음 믹스에 관한 내용입니다.

- 배경음악 및 효과음은 PSG 3채널 모두 활용가능해야함

- 배경음악과 효과음 동시 출력 시, 효과음 우선으로 출력함


3번 PSG 및 4번 OPLL 구동

- PSG only 또는 OPLL only 또는 PSG + OPLL 동시 사용 시나리오 가능해야 함.

- PSG H/W 엔빌롭 대신 S/W 볼륨 방식의 엔빌롭 사용. (실제 악기와 유사한 패턴)

- PSG 노이즈 설정 가능해야함.

- OPLL 내장 보이스 및 사용자 보이스 설정 가능해야 함.



대충 감이 오시지요? ㅎ.ㅎ

PSG만 사용하는 게임들을 살펴보면, 빈약한 3채널만으로도 배경음악과 효과음을 잘 처리하고 있는데요.

그런 게임들처럼 비슷하게 구현할 수 있는 방법으로 만들어갑니다.



그럼, 실제로 코드를 만들어봐야겠네요.


배경음악처럼 메인 코드에 영향받지 않고, 정확한 타이밍으로 출력하려면 인터럽트가 필수겠습니다.

주기적인 인터럽트 처리는 VDP의 V-Blank 인터럽트를 활용하면 되겠죠?

메인 BIOS의 TIMI 훅 사용과 비슷하게 만들어줍니다.


아래는 BLSTDINT.H 파일에 선언된 인터럽트 리스트입니다.




"어... MSX는 Z80 IM 1 모드라서 인터럽트 여러개 처리가 안될텐데요?"

라고 생각하시는 분도 계시겠죠?


제 라이브러리를 예전부터 쓰셨으면 이미 알고 계시겠지만~ ㅎ.ㅎ

모두 S/W 로 구동됩니다.

메인 인터럽트 핸들러는 뱅킹 라이브러리 내에 이미 포함이 되어있구요.

프로그래머가 사용하기 편하도록, 특정 조건에 따라 콜백함수를 호출하는 방식입니다.

(참고로 IRQ 번호는 작은 숫자가 우선순위가 높습니다.)


배경음악 재생을 위해, IRQ_SND_CYCL IRQ가 사용됩니다.

실제로는 VDP V-Blank 주파수에 따라, 60Hz 또는 50Hz 주기로 호출이 되겠습니다.


음... 그러고보니 V-Blank 주기에 따라 배경음악 Tempo를 조절하는 기능도 필요할지 모르겠네요. ㅎ.ㅎ

60Hz/50Hz 바뀔 때, 음악 속도가 영향받지 않으면 좋겠지요?

.

.

하지만 실제로 게임 만들게 되면, V-Blank 주기를 하나로 고정하니까... 별로 의미없을 수도 있어요.

실제로 코나미 게임들을 보면, VDP 신경 안씁니다요~ㅋ

유럽산 MSX에서 게임 구동하면, V-Blank 50Hz에 맞춰서 게임전체가 느려져요.

원래 60Hz 기준으로 만든 게임들이라 그렇습니다.


암튼 그렇구요.

이제 함수들을 대충 만들어봅시다~ ㅎ.ㅎ





초기화하고 데이터 밀어넣고(enqueue) 재생!

경우에 따라 잠시 멈춤이라든가 효과음 섞어 출력!

"효과음을 섞는다"라는 표현을 쓰긴 했지만...

실제로 PSG에서 배경음악과 효과음 소리가 믹스되어 동시에 나오는건 아니구요.

효과음 출력을 넣으면, 그 시점의 배경음악 소리가 잠시 들리지 않게 처리가 됩니다.


만약 배경음악 3채널을 쓰고, 효과음을 넣어야한다면...

주 멜로디가 되는 채널을 피해서 효과음을 넣어야겠지요?

효과음이 두개라면?? 채널 우선순위를 잘 정하시면 됩니다. 누가? 프로그래머가요 ㅋㅋ

어쨌거나 라이브러리는 배경음악, 효과음 모두 3채널 활용가능합니다.


배경음악은 xxx_enqueue() 함수로 데이터 처리가 되구요.

내부적으로 512바이트 버퍼를 갖고 있습니다. (더블 버퍼 방식으로 되어있어요.)

미리 버퍼를 채울 수 있어요.

그리고 버퍼 상태는 xxx_get_pos(), xxx_get_avail() 함수를 쓰면 됩니다.


효과음은 xxx_overlay() 함수로 데이터를 밀어넣습니다.

소리가 나야하는 시점에 xxx_overlay() 함수를 호출하면 즉시 데이터가 출력됩니다.

이전에 출력되던 효과음 데이터가 남아있다면 지우고 새로운 데이터로 교체됩니다.

총알을 빠르게 쏘면, "다다다다~아~" 식으로 소리가 들리겠네요. ㅎ.ㅎ


글이 너무 길어지면 읽기 힘드니까 1편은 여기서 줄입니다.


그럼, 이만...

2016년 11월 28일 월요일

뮤팩(mu-pack)이란?

게시판에 mu-pack 얘기가 나와서 글 하나 적고 자러갑니다. ㅎ.ㅎ

mu-pack이 워낙 귀한 카트리지라서, 아마 잘 아시는 분이 별로 없을 것 같네요.

제가 아는 범위 내에서 이야기를 써내려갑니다요!


mu-pack은 A1ST에 장착해서 A1GT 비슷한 느낌(?)을 주는 카트리지입니다.

어랏? ST를 GT로 업글해주는 기기 아니었나요?


A1GT와 H/W적으로 동일한 MIDI 인터페이스 H/W가 들어있습니다.

S/W적으로 I/O 포트를 변경할 수 있어서 A1GT에서도 사용이 가능합니다.

내부는 확장 슬롯으로 구성되어 있어서, MIDI BASIC 롬과 256KB 램이 장착되어있습니다.

따라서 A1ST에 mu-pack을 꽂고 켜면,

부팅 화면에서 512KB RAM으로 표시되니까 A1GT 느낌을 받을 수도 있겠습니다. ㅎ.ㅎb


MIDI BASIC은 원래 별도의 롬으로 존재하진 않구요.

MUSIC BASIC이 확장되어 MIDI까지 지원하는 방식으로 만들어져 있습니다.


파나소닉에서 처음 제작한 오디오 용, 확장 BASIC은 MSX-AUDIO 인데요.

Y8950 사운드(OPL + ADPCM)가 들어간 큼지막한 카트리지에 비싼가격으로 쫄딱 망한걸로 알려져있지요.

그 후 저가로 만든 YM2413(OPLL)칩으로 MSX-MUSIC을 만들어냅니다.


MUSIC BASIC은 기존 BASIC의 음악 명령인 PLAY와 비슷하게 쓸 수 있도록 만든게 장점인데요.

호환성을 위해 BASIC 모드에서 CALL MUSIC으로 초기화를 해야 동작하도록 되어있습니다.

(참고로 AUDIO BASIC은 CALL AUDIO로 초기화 하는걸로 알고 있어요.)


바로 이 MUSIC BASIC이 A1GT가 나오면서 MIDI까지 제어할 수 있도록 버전업이 됩니다.

기존 MUSIC BASIC과는 차이가 있으니, 보통 MIDI BASIC 으로 부르고 있어요.


실제 롬 규격 자체는 MSX-MUSIC을 따릅니다.

롬인식 ID는 "APRLOPLL"로 되어있어요.

그럼, 미디 H/W가 없는 일반 MSX2/2+ 또는 A1ST의 MSX-MUSIC과 A1GT의 MSX-MUSIC을 어떻게 구분하느냐가 문제겠지요?

파나소닉에서 A1GT에 MIDI를 넣으면서, 메인 BIOS에 인식 ID를 박아버렸어요.

(이게 좀 큰 문제인데... 개인적인 생각으로는 이부분은 파나소닉의 설계오류 같습니다. ㅋ)


S/W에서 본체에 MIDI 인터페이스 확인하는 방법이, MSX-MUSIC의 롬인식 ID 방식에서 메인 BIOS롬 ID확인으로 바뀐거지요.

근데 메인 BIOS는 본체에 박힌거라 업그레이드가 불가능합니다.

따라서 외부 MIDI 인터페이스를 연결하더라도, S/W가 MIDI를 인식할 수가 없습니다.

결국 A1ST에 mu-pack를 꽂아도, ST는 영원한 ST인거죠. 안녕... GT...


그럼 왜 mu-pack을 A1ST를 A1GT처럼 만들어주는 기기라고 선전하냐구요?

정답은 간단합니다.ㅋ

A1ST가 아닌 일반 MSX2/2+에 꽂으면 MUSIC BASIC(MIDI BASIC)이 동작안되도록 설계했거든요. ㅎ.ㅎ

본체에 FM 용 MUSIC BASIC이 있어도 안됩니다. 물론 외부에 FM-PAC 꽂아도 안되구요.

태생이 A1ST를 위한 기기입니다.


솔직히 일반 사용자 입장에서는 MSX2에도 동작하는 MIDI H/W + BASIC이 더 유용하지 않을까요?

굳이 쓸모없는 256KB RAM 박아서 돈을 더 내고 싶지도 않겠구요.

아마도 A1ST 유저를 겨냥한 얄팍한 상술이 아닐까싶습니다.


"설마 MIDI 사용자가 돈이 부족하진 않겠지? ㅋ"

"MIDI 때문에 ST를 GT로 교환하는건 힘드니, 여러분 mu-pack을 사서 꽂으세요~~ ㅎ.ㅎ/"


하.지.만.

이것만으로 ST 사용자들을 속이기엔 역부족이었을겁니다. 과연 mu-pack이 몇개나 팔렸을까요? ㅎ.ㅎ;



흐... 주르르 막 적었더니 읽기 힘드시죠?

그럼, 정리를 해드립니다~


@ A1ST와 차이나는 A1GT의 기능

-> MSXView, 비휘발성 32KB SRAM 디스크, 메모리 매퍼 512KB, MIDI 인터페이스 및 MIDI BASIC


@ mu-pack의 기능

-> 메모리 매퍼 256KB, MIDI 인터페이스 및 MIDI BASIC


@ A1ST에 mu-pack을 꽂으면 생기는 일?

-> 장점: A1GT와 동일한 메모리 매퍼 512KB 용량 표시, 

         A1GT와 동일한 MIDI 인터페이스(H/W) 및 MIDI BASIC 사용 가능 (본체 MUSIC BASIC은 꺼집니다)

-> 단점: 추가된 256KB 메모리는 turboR 고속모드 활용 제약 (사실상 쓸모 없음)

         S/W에서는 별도로 mu-pack을 지원해야 MIDI 사용가능

         일반 S/W에서는 여전히 A1ST(No MIDI)로 인식됨


@ 일반 MSX2/2+에 mu-pack을 꽂으면 생기는 일?

-> 장점: A1GT와 동일한 MIDI 인터페이스(H/W)가 추가됨

-> 단점: 기본적으로 S/W 지원 불가 (MIDRY가 MSX2에서 mu-pack 지원하는 유일한 S/W로 알고있어요.)


2016년 11월 25일 금요일

MMC/SD Drive V3 제작 #13 - PAC-V를 이용한 PSG 비주얼라이저

PAC-V에는 9채널의 LED 비주얼라이저가 들어있습니다.

기본적으로는 OPLL(FM 음원) 칩의 동작을 LED로 보여주는 것인데요.

이걸 S/W적으로 디스플레이하는 것도 가능합니다.

현재까지는 M에서 MPXP/IMSP 플레이어가 활용을 하고 있어요.


이제 MMC/SD Drive 차례가 왔습니다. ㅎ.ㅎ

MSX 본체에는 PSG 사운드가 기본으로 들어있구요.

FM 사운드가 보편화되기전의 수많은 게임들이 PSG만으로 소리를 내고 있습니다.

PSG 사운드에 맞춰 PAC-V의 LED 쇼를 즐길수 있으면 훨씬 신나겠지요? ㅎ.ㅎㅋ


S/W에서 PSG를 액세스 할때는 주로 두가지 방법을 사용합니다.

1. PSG I/O 포트로 직접 출력

2. 메인 BIOS의 WRTPSG 루틴 사용


1번처럼 I/O 포트를 직접 건드리면, 코드를 패치하지 않는 이상은 PAC-V 활용은 힘들겠구요.

2번의 메인 BIOS 루틴을 사용하는 경우는 방법이 있습니다.


사실 WRTPSG 루틴은 훅이 없어서, 코드를 가로채는게 불가능한데요.

MMC/SD의 GameRunner BIOS를 쓰게 되면 구현이 가능해집니다.

GameRunner에서는 PSG로 출력도 하고, 동시에 PAC-V LED으로 출력도 하는 것이죠.


아래 실제로 동작하는 모습을 보시지요~




PSG는 구형파(및 노이즈) 출력 채널이 3개 있습니다.

이걸 PAC-V의 LED바 9개 중에서 6개를 이용합니다.

PSG 한 채널에서 LED바 2개를 쓰는거죠~


노이즈만 출력하는 경우는 LED 2개 중 오른쪽 LED로 표시를 하구요.

그 외의 경우는 LED 2개로 보여줍니다.


MMCSD.COM 프로그램에서 GameRunner 모드(/G 옵션)를 사용하면,

슬롯의 PAC-V 카트리지가 인식되는 경우, 비주얼라이저를 쓸지 물어보게됩니다.

아래 사진 보셔요. Y 눌러주면 LED 쇼로 직행~ㅋ




제가 이런저런 게임들 테스트 해보니, 대부분의 경우 메인 BIOS의 루틴을 쓰고있더라구요.

이런 경우는 PSG 비주얼라이저가 동작하니까 신나게 겜을 할 수 있습니다

그 외 몇몇 BIOS 경유하지 않는 게임은 PSG를 직접 컨트롤하기 때문에, 비주얼라이저가 움직이지 않습니다.

워로이드 같은 ASCII에서 발매한 게임인데도 BIOS를 안쓰는 경우가 있었습니다요. 참고하시구요.


MSX에서 BIOS를 통한 S/W 호환성을 외치긴 했지만,

사실 게임에서 속도저하를 막으려면 VDP, PSG, PPI 등을 직접 컨트롤 하는 방법밖에는 없죠. ㅎ.ㅎ;


마지막으로 실제 동작하는 모습을 영상으로 담았습니다.

게임 이것저것 실행하다보니 13분짜리 긴 영상이 되었네요. 그럼, 즐감하셔요! ㅎ.ㅎ




2016년 11월 22일 화요일

MPX R2.0 사용기

[서론]


MPX R2.0 카트리지를 구동해보았습니다.

MPX R2.0은 준소프트님께서 2016년 올해 출시하신 기기되겠습니다.


잠시 역사를 되짚어보면...ㅋ


2007년 MPX R1.0 (VS1003 디코더)

2010년 MPX R1.1 (VS1033 디코더)

2013년 박ㄹ혜 취임(?)

2016년 MPX R2.0 (VS1053 디코더)


3년에 한번씩 버전업이 된걸로 보입니다. (중간에 요상한게...)

내년이면 MPX R1.0 출시 10주년이군요! ㅎ.ㅎb


MPX R2.0의 기능은 준소프님의 매뉴얼을 참고하시구요.

이번에는 몇가지의 음악파일 재생을 테스트해보기로 하겠습니다.



[본론]


그럼 본격적으로 구동을 해보아야겠지요?

아래는 저의 확장슬롯에 꽂힌 MPX의 모습입니다.



슬롯2-0: MMC/SD Drive V3

슬롯2-1: 한글 FontPack

슬롯2-2: MPX R2.0

슬롯2-3: MPX R1.1

슬롯 IO: RS-232C

슬롯 IO: MoonSound


MPX 카트리지 두개가 보이네요~ ㅎ.ㅎ


부팅하면 아래처럼 MIOS 메시지가 나타납니다.




구버전 MPX에도 BIOS를 위한 플래쉬롬이 탑재되어있었지만,

MPX R2.0부터 정식으로 MIOS(MPX BIOS)가 탑재됩니다.

아직은 MIOS에 어떤 기능들이 들어가게 될지는 미지수이지만,

 준소프트님께서 멋진 기능을 넣어주실거라 믿습니다~ ㅎ.ㅎ



mpxtool r1.2b 버전부터, MP3 재생 시 ID3 정보가 표시됩니다.

한글/한자 표시를 위해, 폰트팩의 ANSI 스크린을 함께 사용했습니다.

아래는 FontPack ANSI1 모드를 켠 모습입니다.





가장 기본 기능이라 할 수 있는 MP3 재생 테스트입니다.




ID3v1 정보가 제대로 표시되는 것을 볼 수 있습니다.

제가 주로 M에 내장된 MPXP를 쓰다보니, MP3 파일들이 대부분 ID3v1을 쓰고 있네요.

참고로 MPXP는 ID3v2를 지원안합니다.ㅋㅋ


잘 돌아가니까 슈슝~ 패스!



이번엔 MP1, MP2 테스트입니다.

참고로 음악 파일로 주로 쓰이는 MPEG1 Audio는 Layer1, 2, 3 이렇게 세 종류가 있어요.





음... 둘 다 재생안되고 파일이 넘어가네요.

아래는 VS1053 매뉴얼에 나오는 내용입니다.

Layer1, Layer2는 기본 Disable 상태라서, SCI_MODE 레지스터로 켜야한다고 나옵니다.

MPX R1.1의 VS1033 칩도 그랬어요. 제가 MPXP 만들면서 테스트를 해봐서리~ㅋ





그럼 WMA도 돌려볼까요? 참고로 WMA는 MPX R1.1에서도 지원이 됩니다.




소리 잘 나오네요~ ㅎ.ㅎ



다음은 AAC 파일입니다. MPX R1.1부터 들을 수 있었지요.

문제는 디코더가 특정구조의 AAC 파일만 재생이 된다는건데...

일단 기본 R1.1에서 돌아가던 파일을 R2.0으로 재생해보았습니다.


음... 잘 되네요.

혹시나 해서 R1.1에서 안되던 파일들 재생해봤지만, 역시나 안됩니다. ㅎ.ㅎ;

저는 뭐 AAC는 안들어도 상관없어요 ㅋㅋ




이번 MPX R2.0에서는 OGG와 FLAC 파일이 지원됩니다.

구버전 MPX R1.1에서는 안되던 기능이었지요.


그럼, OGG 돌려볼까요?

bitrate는 430kbps인 파일입니다. OGG max bitrate는 500kbps까지 가능한걸로 알고 있어요.



소리 잘 나오네요. 이제 OGG를 MP3로 변환할 필요가 없어졌네요~ 유후~ ㅎ.ㅎb



이제 대망의 FLAC 파일 재생입니다~ ㅎ.ㅎ/

bitrate는 615kbps입니다.

bitrate 높은 파일로 테스트하려니 파일 복사의 압박으로~ㅋ 그냥 이걸로 합니다요!



재생하니 unknown audio file 에러 뜨면서 재생이 되지 않네요.

이 때는 /f 옵션으로 강제 재생으로 슈슈슉...

참고로, /f옵션을 쓰면 mpxtool에서 파서를 거치지않고, 그냥 스트림을 전송하는걸로 생각됩니다.


/f 옵션 쓰면, 소리 잘 나오네요! ㅎ.ㅎ



[결론]


많은 파일을 테스트해본건 아니지만, 파일 재생은 잘 됩니다.

아직 구동 안해보신 분들은 한번 테스트해보셔요~ ㅎ.ㅎ


PS. 미디파일은 테스트 안해봤어요. 음질이... ㅎ.ㅎ;

그냥 사캔 쓰시는게 좋습니다.

2016년 11월 16일 수요일

FontPack 제작 #9 - 넌인터레이스 ANSI 스크린 추가

FontPack BIOS에는 ANSI 스크린이 구현되어있습니다.


FontPack 만들 때, 처음 생각했던 기능은 H/W 폰트 엔진 + 한글 IME 였는데...

점점 프로젝트가 산으로 가고있어요~ ㅎ.ㅎ


기존 ANSI 스크린은 VDP 그래픽 모드 5, 6으로 구현됩니다.

(BASIC SCREEN 6, 7과 동일합니다.)


그래픽 모드의 가로 해상도가 512 픽셀이라, 글자를 그리면 새로로 길쭉하게 나옵니다.

하지만, 인터레이스 모드를 켜면 세로 해상도를 두배로 높일 수 있어서, 글자가 이쁘게 그릴수 있습니다.


인터레이스 디스플레이라는게 우리에겐 참 익숙한 화면인데요.

TV 화면이 그렇고, IQ-2000의 SCREEN 9 화면에서도 볼수 있었구요.

디스플레이 개발자라면, VGA의 1024x768 인터레이스 모드도 써보셨겠구요~


근데, 요즘 TV 보면서 "아... 화면이 너무 떨리네!" 이렇게 느끼시는 분 없으시지요?

디인터레이서 기술이 보편화된지 십여년이 지났습니다.

모션 보정 기능도 상향 평준화되서 왠만한 저가 기기 아니면 화면이 잘 나옵니다.


하.지.만.

레트로 느낌을 위해서 구형 CRT 디스플레이를 쓰시는 분들도 많이 있습니다.

우리 천국동도 마찬가지구요~ ㅎ.ㅎ


잡설이 길었네요.

암튼 디인터레이서 없는 CRT 모니터에서는, 인터레이스 화면의 떨림이 눈에 상당히 거슬립니다.

그래서, 세로 해상도를 절반으로 낮춘 넌인터레이스 화면으로 ANSI 스크린을 추가했습니다


아래 사진을 보시지요. ANSI3 모드로 설정된 화면입니다.





참고로, 아래는 현재 지원되는 전체 ANSI 모드에 관한 설명입니다.




ANSI1,2 모드와는 달리 12x12 폰트를 사용합니다.

원래 MSX 표준 텍스트 모드는 세로 글자 24개 사용됩니다.

ANSI3,4 모드는 세로로 글자 17개를 쓸 수 있습니다. 원래 화면의 70%정도 되는 셈이지요.

글자가 세로로 길쭉하니까, MSX가 아닌 것처럼 보이네요~ㅋ


VDP VSync 출력을 50Hz로 바꾸면, 출력 해상도가 240p(또는 480i)에서 288p(또는 576i)로 바뀝니다.

출력 해상도 바뀌어도 실제 그래픽 화면의 도트수는 변하지 않습니다.

결국 수평 라인수만 늘어난 셈이라 글씨 높이가 줄어드는 현상만 생기게 되지요.

근데 요렇게 하니까, 글자가 적당히 이쁘게 보이네요. ㅎ.ㅎ

아래 사진 보셔요~ 참고로 VDP 설정 바꾸려면, BASIC에서 CALL 50HZ 치면 됩니다.


 



CRT 모니터 쓰시는 분들께 활용이 잘 되었으면 하는 바램입니다요~

마지막으로 동작 영상 짧게 하나 찍어봤습니다.





즐거운 하루 되셔요!



2016년 10월 28일 금요일

FAT16.COM ver0.12 기능 추가 버전 (1026.10.28)

Download: FAT16_20161028_OCM_DiskROM_and_RAMD_SEG.zip

----------------------------------------------------------------

    FAT16.COM ver0.12의 기능 추가 버전 (2016.10.28)

        By 서영만 <sharksym@hitel.net>

----------------------------------------------------------------


* 이 프로그램은...


  - OKEI씨의 FAT16.COM 에 추가 코드를 넣은 프로그램입니다.


  - 로더 + 원본 FAT16 ver0.12 를 하나의 파일로 묶었습니다.

    원본 FAT16 코드 자체를 수정한 것이 아닙니다.


  - 첨부된 FAT16.COM 은 새로운 파일입니다.

    OKEI씨의 원본 파일은 fat012.zip을 참고하세요.



* 추가 내용


  - OCM DiskROM 디텍션

    OCM의 MEGA-SD 커널은 FAT16 루틴이 이미 내장되어있습니다.

    이 경우 원본 FAT16 프로그램을 실행하면 오동작합니다.

    MEGA-SD를 사용하는 경우 FAT16을 로딩하지 않도록 했습니다.

    OCM 딥스위치 8번 OFF 시, FAT16을 정상적으로 로딩합니다.


  - 램디스크 보완

    원본 FAT16 프로그램은 BDOS의 _RAMD(68H) 호출을 막습니다.

    따라서 램디스크 크기 변경/확인 등의 시스템콜을 못 씁니다.

    이 경우, 현재 설정된 램디스크 크기를 알 수 있도록,

    FAT16 로딩 전 RAMD_SEG 이름의 환경 변수를 설정합니다.

    HEX 값으로 설정됩니다.

    예) RAMD_SEG = 10 인 경우, 할당된 세그먼트 갯수는 16개



* 사용법


  원본 FAT16.COM과 형태 및 실행 방법 동일합니다.



* 마지막으로


  이 프로그램 관련 요청 사항이 있으시면, 이메일을 보내주세요.

  



  

2016년 10월 25일 화요일

BASIC에서 DOS 커맨드 실행

BASIC 모드에서 DOS 모드로 복귀(전환) 후 특정 커맨드를 자동으로 실행하는 방법입니다.

어떻게 구현하는지 궁금해하시는 분이 계셔서, 직접 보여드리겠습니다요~ ㅎ.ㅎ


일단 도스로 복귀하는 방법부터 알아야겠네요.

BASIC에서 CALL SYSTEM 명령을 사용하면 됩니다.

(참고로 CALL은 MSX에서 외부 슬롯의 BASIC 커맨드를 실행하는 명령어입니다.)


여기서 한가지 알고계셔야 할 부분은,

DOS1에서는 CALL SYSTEM 명령으로 DOS 복귀만 가능.

DOS2에서는 CALL SYSTEM("문자열") 식으로 DOS 복귀 후 실행할 명령까지 입력가능.

이라는 점입니다.


지금부터 설명드릴 "DOS 복귀 후 커맨드 실행하기"는 DOS1 환경 기준입니다.

DOS2에서는 CALL SYSTEM("문자열")만으로 쉽게 가능하다고 위에서 알려드렸구요.


DOS1에서 이걸 구현하려면, 약간의 꼼수가 필요합니다.

워낙 유명한거라서 아시는 분들이 많을꺼에요. ㅎ.ㅎ


바로 "WORKAREA의 키입력 버퍼에 글자 밀어넣기"가 되겠습니다.


MSX의 BIOS에서는 주기적(VDP VBLANK 인터럽트)으로 키보드 입력을 체크해서 버퍼에 채워넣습니다.

키 매트릭스 버퍼는 현재 눌려진 키(스위치)의 상태를 나타내구요.

키입력 버퍼는 눌러진 키를 ASCII 코드로 변환하여 순서대로 채워넣습니다.


여기서 키입력 버퍼는 40바이트의 원형 버퍼(Circular Buffer/Queue)로 구현되어있구요.

WORKAREA FBF0H 부터 할당이 되어있습니다.

원형 버퍼니까 쓰기/읽기 포인터가 필요한데요.

각각 WORKAREA F3F8H, F3FAH에 저장됩니다.


여기에 ASCII 코드를 채워넣으면, 사용자가 키보드를 직접 누르지 않더라도 키입력이 된 것처럼 만들 수 있어요.


그럼 간단한(?) BASIC 프로그램으로 동작을 보여드리겠습니다요~

아래는 BASIC 모드에서 DOS 모드로 복귀 후, DIR 명령을 수행하는 프로그램입니다.

DOS 복귀 전에, 키입력 버퍼에 DIR + '\r' 4바이트 문자를 넣어서 자동으로 실행되는 것이죠.

Download: DOS_COMMAND_DIR.zip




프로그램 자체는 C$ 문자열을 키입력 버퍼에 집어넣고, CALL SYSTEM을 수행하는게 전부입니다.

DOS2에서는 그냥 CALL SYSTEM("DIR") 하면 끝나는 작업을, DOS1에서는 이렇게 힘들게 해야되네요.ㅋ



그럼, 실제로 실행해보겠습니다.

해당 BASIC 프로그램은 DIR.BAS라는 이름의 파일로 저장했습니다.

DOS 부팅 후 BASIC DIR.BAS 명령으로 프로그램을 실행하면...




BASIC 모드에서 DIR.BAS 프로그램이 실행되어 다시 DOS로 돌아옵니다.

복귀하면 자동으로 DIR 명령이 수행되구요.





어떻게 구현하는지 아시겠죠? ㅎ.ㅎ


그럼, 즐거운 밤되셔요~


2016년 10월 18일 화요일

[파라동 이벤트] 11111번째 게시물의 주인공은?

"MSX의 천국" 네이버 카페로 이사온지 꽤 되었는데, 게시물 히트 이벤트는 이번이 처음인가?

기억이 안나는걸 보면, 이번이 처음인 듯 하네요! ㅎ.ㅎ


10000번째 게시물로 이벤트를 하려했지만, 잠시 숫자를 착각해서 시기를 놓치는 바람에~ㅋ

급하게 11111번째 게시물 이벤트로 고고고!


2016년 10월 18일, 드디어 게시물의 주인공이 등장했네요.

이벤트 상품은, CPLD + NiMH 충전지로 만든 PAC 카트리지입니다.


원래 이건 PAC-V 만들면서 FM-PAC 매퍼 + OPLL I/O 테스트용으로 쓰던 것이었는데요.

이번에 이벤트 상품으로 둔갑(?)하게 되었습니다.ㅋㅋ


DevPack v1.1 보드 귀퉁이를 잘라서 충전지를 붙여놨습지요.





흰색 케이스에 레이블도 붙이고~

레이블은 예전 천국동 대문으로 쓰였던 이미지를 재활용.ㅋ

하지만 이쁘죠~ ㅎ.ㅎ





당첨자 닉네임도 박아넣고~ (타인에게 양도금지! ㅋ)

구름으로 가렸어요. ㅎ.ㅎ





간만에 즐거운 카페 이벤트였습니다.


2016년 10월 17일 월요일

PAC-V 레이블을 붙였습니다~ ㅎ.ㅎ

맛탱이님, 택배 잘 받았습니다!

레이블 사이즈가 PERFECT!! 두둥~ ㅎ.ㅎb


요건 케이스 앞면~




케이스 뒷면~




아래는 터보알에 꽂은 모습입니다.

앞으로 쭈~욱 슬롯1 고정 멤버로 활동예정입니다요~ ㅎ.ㅎb





즐거운 밤 되셔요~

2016년 10월 7일 금요일

天愛金壽 (천애금수) 가을 버전입니다~

납땜 시즌이 끝나고 천애금수가 돌아왔어요~ ㅎ.ㅎ/


내용물은 PAC-V 입니다.






이번에는 납땜하느라 좀 고생했어요.

보드 두장 합체에 LED, 저항 개수가 많아서 납도 많이 함유(?)되어있습니다.

보드 무게가 64g입니다. 제가 만든 것 중에서 가장 무겁네요.ㅋ

참고로 MMC/SD Drive V3 보드는 30g입니다.


사진에는 보드 30장만 보이지만, 책상 옆에 8개가 더 있어요. 총 38장입니다.

완성하니까 뿌듯하군요.

.

.

.

라지만 이제 매뉴얼을 만들어야 할 시간! ㅎ.ㅎ;


보드는 다음 주 중으로 맛탱이님께 전달할 예정입니다. (케이스 합체 예정)


그럼, 즐거운 주말 되세요!!