카테고리 Archives: 취미생활

MSX-MIDI BASIC, play문의 변경.

출처 : http://takumi-cb.com/column_2/004.html

아는 분의 트윗에서 A1GT가 play문 어긋남이 없는 유일한 기종이다…라는 것을 보고 이리저리 찾아보다가 play문의 버그에 관한 언급이 있는 것을 찾아서, 살짝 번역해봤습니다.

 

[#004]2003/12/14 MSX의 추억

 

어제 “MSX 매거진 영구보존판2″(아스키)라는 무크가 발매되었습니다. 작년에 이어 2번째입니다.
모르는 사람을 위해 살짝 설명하자면, “MSX”라는 것은 1980년대~1990년대전반에 존재했던 8bit 퍼스널 컴퓨터의 명칭입니다. 요즘이라면 터무니 일이지만 당시에는 여러 메이커가 호환성이 없는 퍼스컴을 발매했습니다.  MSX는 메이커의 벽을 뛰어넘는 퍼스컴의 공통 사양으로, 매우 획기적인 것이었습니다. 거기에 저가격으로, TV를 모니터로 사용할 수 있다라는 일반 가정을 상정해 만든 사양이었습니다.
따라서, 나는 그 MSX 개발의 가장 마지막 시기에 아스키의 개발부대에 있었습니다. 그래서 이 책의 내용은 몹시나 그리운 것이 있는 것이죠. 우와아, 니시 사장이다, 우와아 당시의 상사다,라든지요 (웃음).하지만, 이 책에 가장 중요한 것은 다른 곳에 있는 것입니다!!p151에 이런 기술이 있습니다.

MIDI를 BASIC 레벨에서 서포트 하는 것은 컴퓨터 뮤직 사상 “처음이자 마지막의 위업“이라 말해진다.


위업입니다요,위업“!! 그것도 (史上)의 위업입니닷!! 좀더 좀더 말해줘 말해줘!!(^_^)

무엇을 감추겠습니까(감출 생각도 없음), 이 작업, 다시말해서 MSX-BASIC의 “play” 커맨드에 MIDI 출력을 위한 코드를 추가한 것은 바로 접니다!! 대단하죠〜!!(^_^)
그래요, 최후의 MSX머신에서 내가 써넣은 코드가 구워진 ROM이 탑재되어 있습니다.

당시, 나는 입사 2년차였습니다. 전년에 배속되었을 때에는 신제품인 MSX turboR은 거의 완성되었고, 개발에는 아무런 참가도 할 수 없었습니다. 2년째에는 내가 야마하의 MSX2로 음악을 했었던 일도 있어서인지, 이 “MIDI 실장”의 업무가 돌아왔습니다.

이 부분의 코딩 자체는 실은 어려운 것이 없었습니다. MIDI 신호는 1byte의 수치를 타이밍에 맞춰 발신하는 것뿐이므로, 매우 단순한 것입니다. 연주 루틴 그 자체는 이미 BASIC에 들어있었으므로, 손볼 필요는 없습니다. PSG나 FM음원을 컨트롤하는 부분을 MIDI용으로 변경하는 것뿐의 일입니다. 코드의 총 바이트수도 그리 크지 않았던 기억입니다.

프로그램 언어는 당시 Z80 어셈블러입니다. 지금은 이미 잊어버렸지만요 (웃음). 잘도 그런 코드를 슥슥 써내려갔구만. (CALL이 “CD”, RET가 “C9” 였던가? 이런것은 기억나네…)

큰일이었던 것은 차라리 하드웨어 쪽이었을까요. 외부 카트리지용 설계도는 이미 있었고, 회로 자체는 그리 복잡하지 않았습니다(간단히 말하자면 모뎀과 같은 녀석입니다.).  개발시에 사용했던 것은 시작품으로 배선이 드러난 기판이었습니다. 이것이 오래 사용하고 있으면 배선이 빠져버렸던 기억이…(웃음). 어떤 때는 시작품이 잘 동작하지 않아서, 하드웨어 부문의 분에게 도움을 청하러 가기도 했습니다.
그러고보니, 오실로 스코프를 사용해 신호가 제대로 나오나 확인하기도 했었네요.

MIDI에 관련해서, 지금이니까 말할 수 있는 이야기?를 소개하겠습니다. 실은 이거 꽤 중요한 것입니다.
실은, MSX2, 2+의 BASIC의 play문에는  1개의 play 커맨드가 종료할 때에 1카운드 분 쓸모없는 공백이 들어가고 있었습니다. 다시말해, 어떤 play문으로부터 다음 play문으로 연주가 넘어갈 순간에, 사이가 비어버리는 것입니다. 일순 템포가 어긋납니다만, 눈치채지 못했던 분들이 많았을지도 모릅니다. 나는 꽤 오래전부터 눈치채고 있어서 이게 사양인지 버그인지도 모른채 불만이었습니다.
이 MIDI 실장 작업을 할 때 BASIC의 소스의 음악 연주 부분을 차근차근 읽다가 확실히 위에 말한 현상이 일어나는 것을 확인했습니다. 즉, BASIC의 버그였던 것입니다. 이 버그는 MIDI 실장 시 함께 수정해두었습니다. 그러므로, 마지막 MSXturboR기(MSX-BASIC Ver4.1이려나?)에서는 play의 거동이 이전의 기종과 미묘하게 다른 것입니다.
이 수정을 하면서 버그란 것도 포함해 상사에게 전했습니다만, “호오~, 그랬었나?”라는 느낌의 반응이었으므로, 정말 눈치채지 못했던 버그였겠지요.

이런 것을 추억하고 있으면, 당시가 그리워지네요ー.
같은 책 p105에도 있는 것처럼

“그니깐! MSX야말로 내 청춘이었던 거쉬양”(by 반도 미미)

당시의 MSX 개발관계자 중에서 나는 아마도 가장 먼 세계로 가버린 사람이겠지요(웃음). 프로그래밍 따위 깡그리 잊어버렸습니다(폭소). 지금은 니시 사장도 아스키를 그만두셨고. 그런데, MSX는 10년 조금 전 쯤의 이야기네요. “추억한다면 멀리 온 거다…”라는데, 정말 꽤 오래된 것처럼 생각되네요.

 

 

그리고 위의 내용을 기초로 테스트를 해봤습니다.

사용기종은 MSX turboR FS-A1ST.

방법은 다음과 같습니다.

“도레미”를 연속으로 재생한다. 이것을 녹음한다. 파형을 살펴본다.

CALL MUSIC을 실행하고, 위의 프로그램을 실행시켜 다시 반복한다.

실행화면.

 

우선, 첫번째로 켜고 프로그램을 입력한 것의 결과

 

다음은 CALL MUSIC을 실행하고, 다시 반복해서 같은 프로그램을 실행.

 

기본적으로 play문은 버그를 가지고 있지만, FM음원등을 위해서 확장시킨 루틴에는 버그가 없어서 위와같은 차이를 보이는듯하다. 따라서, FM음원등이 내장된 기종이라면 CALL MUSIC을 실행시킨다음 PSG를 플레이시키는 것이 좀더 정확한 음을 재생할 것이다.

이런 문제를 A1GT에서는 수정했다고 나와있으므로, 확장하지 않은 상태의 play문에서도 저 공백은 사라졌을 것으로 보인다. (가지고 있지 않아 확인은 못해봄)

 

추가 —

 

간단히

PLAY”V15C”:PLAY”C”:PLAY”C”

라고 입력하면, Do!Do!Do!라고 소리가 나거나 Dooooo하고 소리가 나므로 쉽게 판단할 수 있는데,

A1GT를 가진 분의 테스트 결과 A1ST와 동일한 결과를 얻었다고 한다.

 

여기서 생각해볼 수 있는 것은 2가지인데,

  1. 지금까지 팔린 모든 MSX의 공통 버그라면 그것이 표준이므로, 호환성을 위해서 개선안을 원래 버그 상태대로 돌려놨다.
  2. 코드 버전관리의 실패로 누군가 과거 작업물로 뒤집어 씌워 원래대로 돌아갔다.

정도가 아닐까하는데, 대우전자가 기존의 공통 BIOS부분을 건드려 호환성을 엉망으로 만들어 놓았던 것에 대해서 ASCII 평이 안 좋았다는 소문도 있고, SCREEN9도 호환성이라는 이유로 외산기에서 빠진 것을 생각해보면, 비록 버그일지라도 1번쪽이 아닐까 싶긴하다.

MSX Superimpose GALAGA

MSX는 외부 비디오 신호를 컴퓨터 신호와 합성해서 내보내는 Superimpose 기능을 가진 기종들이 존재하는데, 그 기능이 빠진 기종도 별도의 주변기기를 사용하면 합성이 가능하다.

이런 기능을 해주는 주변기기 중에 Panasonic에서 나온 VIDEO TELOPER라는 제품이 있다.

이것을 이용해서 게임의 배경에 외부 비디오 신호를 합성하는 것을 해봤다.

 

 

사용된 기종은 YAMAHA MSX MUSIC COMPUTER CX7M/128

사용된 게임은 GALAGA. 롬팩으로도 가지고 있지만, Superimpose를 활성화시키기 위해서 롬 이미지 파일을 불러오는 방식으로 했다.

이때 사용된 것은 MMC/SD Drive V3, LUXURY BOX VIII다. 메모리 증설은 2048K Mapper.

이 VIDEO TELOPER는 두께가 제법 두꺼워 YAMAHA MSX기종처럼 슬롯 두 개가 가까이 붙어있는 기종에서는 한쪽 슬롯을 가려 쓸 수 없게 만든다.

따라서 FRC-RFC를 이용해서 슬롯을 외부로 길게 뽑아서 사용했다.

그리고, 이 것이 슬롯을 하나 잡아먹었으므로 두번째 슬롯을 확장해서 이것저것 끼우기로 한다.

말했던 것처럼 갤러그 롬팩은 직접 사용하지 않는다.

 

그리고 외부 비디오 신호를 담당할 것이 바로 Surface Pro 4다. 이제품은 miniDP로 출력되므로 miniDP to HDMI어댑터를 사용해서 HDMI신호를 뽑아주고,

여기에 MINI HDMI2AV라는 제품을 사용해서 다시 컴퍼지트 비디오 신호로 바꿔서 MSX에 입력하게 만든다.

 

 

동영상에 나온 것처럼 컴퓨터를 켜고 ( VIDEO TELOPER 내장 프로그램을 무시하고 BASIC 모드로 진입하려면 DEL키를 누르고 있으면 된다)

외부 비디오 신호를 배경에 깔아주기 위해서 COLOR 15,0,0 명령을 주고, SUPER IMPOSE 버튼을 누른다 (또는 SET VIDEO 2,0,0)

그리고 롬파일을 로드해서 실행시킨다. 이때 바로 본체 메모리에 로드하는 형식으로 실행시키거나, 롬로더가 본체를 리셋하지 않는 방식을 쓰면 된다.

이번에 사용한 것은 MGLUX 로더.

그리고, 배경으로 사용한 것은 Youtube에 올라온 것인데, 주소는 다음과 같다.