2010년 11월 29일 월요일

그레이 스케일 팔레트로 게임 실행해보기

MSX2에서는 V9938의 팔레트 기능을 사용할 수 있습니다.

BASIC의 COLOR 명령으로 쉽게 설정이 가능한데요.


COLOR = (팔레트 번호, R밝기, G밝기, B밝기)

여기서 각 RGB 밝기 값은 0에서 7사이 숫자로 설정하면 됩니다.


이번에는 요걸 이용해서,

일반적으로 팔레트를 재설정하지 않는 MSX1용 게임들을, 모노크롬 모니터로 실행한 듯한 효과를 내봤습니다.


무슨말인지 감이 안온다면...

아래 동영상을 보시면 바로 이해가 되겠지요? ㅎ.ㅎ




그레이 스케일로 팔레트를 바꾸려면, R,G,B 값을 하나의 밝기(Y) 값으로 바꿔야하는데요.

아래의 수식을 이용하면 됩니다.

Y = 0.3*R + 0.59*G + 0.11*B


위의 동영상에서 쓴 프로그램은 BASIC으로 만들었습니다.

VDP의 기본 RGB 팔레트 값을 밝기로 변환해서 설정하는 간단한 프로그램이지요.

심심하시면 아래 코드도 한번 보세요. ㅋ

10 CLS

20 PRINT "Calculating grayscale...";

30 DIM Y(16)

40 FOR I=0 TO 15

50 READ R,G,B

60 Y(I)=.3*R + .59*G + .11*B

70 Y(I)=INT(Y(I) + .5)

80 'PRINT Y(I)

90 NEXT I

100 PRINT"Done":PRINT

110 PRINT "* Choose color style"

120 PRINT "1. Gray"

130 PRINT "2. Red"

140 PRINT "3. Green"

150 PRINT "4. Blue"

160 PRINT "5. Yellow"

170 PRINT "6. Cyan"

180 PRINT "7. Purple"

190 INPUT SEL

200 IF (SEL < 1) OR (SEL > 7) THEN 110

210 FOR I=0 TO 15

220 IF SEL = 1 THEN COLOR=(I,Y(I),Y(I),Y(I))

230 IF SEL = 2 THEN COLOR=(I,Y(I), 0  , 0  )

240 IF SEL = 3 THEN COLOR=(I, 0  ,Y(I), 0  )

250 IF SEL = 4 THEN COLOR=(I, 0  , 0  ,Y(I))

260 IF SEL = 5 THEN COLOR=(I,Y(I),Y(I), 0  )

270 IF SEL = 6 THEN COLOR=(I, 0  ,Y(I),Y(I))

280 IF SEL = 7 THEN COLOR=(I,Y(I), 0  ,Y(I))

290 NEXT I

300 DATA 0,0,0

310 DATA 0,0,0

320 DATA 1,6,1

330 DATA 3,7,3

340 DATA 1,1,7

350 DATA 2,3,7

360 DATA 5,1,1

370 DATA 1,6,7

380 DATA 7,1,1

390 DATA 7,3,3

400 DATA 6,6,1

410 DATA 6,6,3

420 DATA 1,4,1

430 DATA 6,2,5

440 DATA 5,5,5

450 DATA 7,7,7

2010년 10월 17일 일요일

M File Manager v1.1 for MSX-DOS2

지난주 릴리즈했던 v1.0의 버그 2개가 수정되었습니다.

Download: M_v1.1.zip 


아래 내용 참조하세요.


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

    M v1.1 (MSX-DOS2용 파일 매니져 2010.10.17)

        By 서영만 (E-mail:sharksym@hitel.net)

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


* 변경 내용


  TSR 처리가 개선되었습니다.

  파일 1개만 삭제할때, 프로그램이 멎는 문제가 수정되엇습니다.


2010년 9월 17일 금요일

[강좌] 05. 15KHz 비디오 신호

올봄에 글을 꾸준히 써본다는게... 최근 3달은 잠잠했군요. ㅎ.ㅎㅋ

 

비디오 신호에 관한 내용을 조금 쓰려고 합니다.

MSX에 한정된 내용이라기보단 그냥 일반적인 비디오 신호 얘기가 될 것 같네요.

 

그럼, 출발~~

 

 

05. 15KHz 비디오 신호

 

아마 RGB 15KHz 등등 15KHz 신호라는 말을 많이 들어 보셨을 겁니다.

물론 잘 알고 계시는 분들도 있겠지만...

비디오 공학 쪽으로 공부를 안해보셨으면, 제대로 알기가 좀 어렵긴 합니다.

 

일단 Hz 라는게 뭔지 알아야겠지요?

자세한 정보는 wiki 를 참고하시고, 간단하게 설명드리면...

Hz 는 주파수의 단위를 나타냅니다.

주파수라는 건 어떤 신호가 1초에 몇번 반복되는지의 빈도를 나타내는 건데요.

 

예를 들어, 1Hz 신호라는건 1초에 1번씩 반복되는 신호를 의미합니다.

그럼, 15KHz 신호는 1초에 15000번 반복되는 신호가 되겠죠?

 

근데 15KHz 비디오는 무슨 신호가 15000번씩 반복되는 것일까요?

그 전에 아날로그 비디오 신호에 대한 이해가 있어야겠지요?

 

아날로그 비디오는 화면 한장(프레임)을 기기간에 전송하기 위해,

색(또는 밝기) 시그널와 싱크 시그널 두가지를 사용합니다.

싱크 시그널라는 건 신호 처리를 위해 쓰이는 보조 신호인데요,

 

현재의 색(또는 밝기)이 영상에서 어디 쯤 위치하게 되는가를 결정하도록 만들게 됩니다.

실제로는 화면의 좌표를 계속 알려주는 건 아니고요.

수평/수직 위치가 초기화(원점 위치)되는 시점을 알려주게 됩니다.

 

요걸  수평 싱크 신호, 수직 싱크 신호라고 말하는데요.

신호의 상태가 HIGH 또는 LOW 두가지 상태를 이용해서 반복되기 때문에,

싱크 신호도 주파수(Hz)의 형태로 표현하게 됩니다.

 

이 쯤 되면, 한가지 의문이 생기는 분들이 계실꺼에요.

왜 비디오 신호 얘기하는데, 해상도는 언급하지 않는 것일까...

LCD 모니터나 그래픽 카드 얘기할때 해상도를 꼭 따지게 되지 않나요?

640x480, 1024x768, 1920x1080 등 주로 수평/수직 해상도만으로 신호 종류를 나타내는데요.

이것들은 사실 정확한 비디오 신호의 종류를 얘기하는게 아니라,

비디오 신호에 포함된 실제 영상 신호는 어떤 해상도를 갖느냐를 나타내는 것으로,

비디오 신호 종류와는 조금 다른 의미입니다.

만약 디지탈 신호로 넘어가게 되면 수평 해상도도 중요한 정보가 되긴하는데요.

일단, 이해가 잘 안되시더라도 지금은 그냥 넘어가세요.

 

다시 15KHz 비디오 신호로 넘어와서...

"15KHz 비디오" 말에는 주파수라는 의미만 들어있지, 실제로 화면에는 어떻게 나오는지 감이 안오죠?

해상도로 표현하면 쉬운데, 주파수로 써놓으면 참 애매합니다. ㅎ.ㅎㅋ

 

여기서 15KHz 라는건 수평 싱크 주파수가 15KHz라는 걸 의미합니다. 그냥 줄여서 15KHz라고 부르는 것이에요.

그리고 한가지 더 생략한게 있는데요.

수직 싱크 주파수는 50Hz 또는 60Hz 라는 정보가 생략된 것이지요.

사실 정보를 빠뜨렸다고 말하긴 애매하고요.

 

좀 더 정확히 말하면,

1. 수평 15734Hz, 수직 59.94Hz 신호와

2. 수평 15625Hz, 수직 50Hz 신호 두가지를 묶어서 표현한다고 보면 되겠습니다.

 

1번은 우리나라, 미국 등에서 주로 쓰이는 NTSC 비디오 신호와 타이밍이 동일하고요.

         (참고로, 수직 싱크는 보통 60Hz로 표기합니다.)

2번은 유럽에서 주로 쓰이는 PAL,SECAM 비디오 신호와 타이밍이 같습니다.

 

참고로 1,2번 모두 V9938, V9958에서 출력되는 신호입니다.

 

그러면, 해상도에 관해 설명을 드리겠습니다.

계속 이해가 안되셨던 분들도 여기서 부터는 쉬울꺼에요. ㅎ.ㅎㅋ

 

1번 수직 싱크 60Hz 신호의 경우.

수평 라인 갯수(수직 해상도)는 15734 / 59.94 = 약 262.5 라인이 됩니다.

2번 수직 싱크 50Hz 신호의 경우는.

수평 라인 갯수가 15625 / 50 = 312.5 라인이 되고요.

 

근데 실제 모니터/TV에 출력할때는 모든 라인을 표현하는게 불가능합니다.

원래 CRT에서 출력되는 걸 고려해서 영상 신호를 넣기 때문에

약 240라인 정도(50Hz의 경우 288라인)만 실제 영상으로 쓰입니다.

(수직 싱크 신호가 발생한 후, 전자총을 화면의 수직 리셋 위치로 바꾸는데 여유 시간을 둔 것이죠.)

 


근데 이마저도 방송국이나 기기에 따라 편차가 있기 때문에,

시작 또는 마지막 라인에서 나올수 있는 노이즈 또는 검색 바탕화면이 나오는걸 막기 위해서,

TV/모니터 등에서는 약 5% 정도는 오버스캔(CRT 밖으로 크게 스캔)을 하게됩니다.

그럼 결국 수직 해상도는 약 220라인 정도 되겠죠.

 

MSX의 VDP인 TMS9918의 경우 192라인(V9938은 모드에 따라 212라인)만 문자/그래픽 표시에 사용되고,

나머지 라인들은 테두리 색으로 표시하도록 되어있습니다.

특히 V9938 이상 모델에서는 ADJUST 기능으로 화면 위치를 조금 조정하는게 가능합니다.

TV/모니터 제조사마다 오버스캔 양이나 영상 시작 위치가 조금씩 다르기 때문에 이를 MSX에서 보정하는 것이지요.

 

여기서 TV/모니터에 쓰이는 기법 한가지를 설명드릴텐데요.

초기에 TV 신호 규격을 처음 만들었을 때, 영상을 빠르게 재현할수 있고,

데이터(신호의 대역폭)는 줄이고, CRT에서 깜박임(플리커)을 최소화 하기 위해

인터레이스 디스플레이라는 방법이 고안되었습니다.

인터레이스라는건 수평 영상 신호를 홀짝 라인으로 나눠서 한번에 반씩 표시/전송하는 걸 의미합니다.

 

앞에서 수직 싱크 60Hz 일때는, 수평 라인수가 전체 240라인 정도라고 했는데요.

실제 NTSC에서는 인터레이스로 구현이 되기 때문에,

원본 영상은 480라인이 되고, 모니터에서는 240라인씩 60번 그려지게 됩니다.

이런 방법은 실용적으로 상당히 효과가 좋은데요.

 

예를 들어,

정지 영상의 경우는 수직 해상도가 480라인이 되는 30프레임 화면이 만들어지고,

빠르게 변하는 동영상의 경우는 수직 해상도 240라인의 60프레임의 화면으로 표시가 되는것이지요.

이때문에 극장에서 24프레임 영상을 보다가, 집에와서 TV의 영상으로 보게 되면

TV가 훨씬 부드럽게 느껴지게됩니다.

물론 모니터에 따라 깜빡임이 심하게 느껴질수도 있습니다.

대우 RGB 모니터가 대표적이죠. ㅎ.ㅎ

 

NTSC,PAL 등의 TV 방송 신호는 모두 인터레이스가 사용되고요.

MSX의 경우는 V9938부터 인터레이스를 쓸수 있습니다.

예를 들어 스크린 7의 경우,

일반 모드(넌인터레이스)는 해상도가 512x212이고, 인터레이스 모드에서는 512x424가 되는 것이지요.

보통 인터레이스 신호인 경우에는 세로 해상도에 i를 붙여서 표기를 하고,

넌인터레이스(프로그래시브)신호는 p를 붙여서 표기합니다.

480i, 1080i, 240p, 480p, 720p 등등

 

그럼 수평 해상도는 어떻게 될까요?

사실 아날로그 영상 신호에서 수평 해상도는 존재하지 않습니다.

원본 신호의 대역폭이 얼마나 넓으냐에 따라 해상도가 결정됩니다.

 

그러니까 다 같은 수평 15KHz 신호인데,

어떤건 수평 해상도가 640이 될 수도 있고, 800이 될수도 1000이 될수도 있는것이지요.

혹시 NTSC가 640x480 또는 720x480의 해상도라고 물으시는 분도 있는데요.

이건 디지털 신호 규격이 나오면서 SD 영상의 해상도를 720x480 또는 720x576으로 정한 것이고,

원래 해상도와는 상관없는겁니다요.

 

근데 수평 해상도는 막~ 높인다고 화면에 다 표시할수 있는건 아닌데요.

컬러 CRT TV/모니터의 경우 구조적으로 RGB 형광 패턴이 수평(또는 삼각형)으로 연속 배열 되어있기 때문에

각 패턴의 갯수보다 높은 해상도를 출력하면 실제 모니터에서는 나타내지를 못합니다.

 

대게 CRT가 크면 해상도가 높아지는데요.

같은 크기의 CRT라도 형광 패턴에 따라 최대 해상도가 다르게 됩니다.

단순하게 CRT 계열은 값이 비싸면 해상도도 좋다고 보시면되죠.

 

MSX 경우는 모드에 따라 수평 해상도가 제각각인데요.

 스크린 0 (80컬럼 모드): 480

 스크린 3 : 64

 스크린 1,2,4,5,8 : 256

 스크린 6,7 : 512

로 되어 있습니다.

 

이런 이유로 인해 15KHz 영상(비디오) 포맷을, 해상도로 표시할때는 아래처럼 나타냅니다.

240p 60Hz, 480i 60Hz, 

288p 50Hz, 576i 50Hz

 

 

마지막으로 컬러 포맷에 대해 조금 더 설명드리겠습니다.

 

앞에서 설명했던 건, 싱크 신호에 의해 결정되는 비디오 종류에 대한 것들이라면...

지금부터는 15KHz 비디오에서 주로 쓰이는 컬러 인코딩에 대한 내용입니다.

 

일단 맨 처음 만들어진 컬러 신호는 아날로그 RGB라고 보시면됩니다.

Red, Green, Blue 세가지 빛의 삼원색의 세기를 전달해서 영상을 만들어내는 것이지요.

 

근데 MSX의 RGB 출력처럼 원래의 아날로그 RGB 신호를 각각 연결하는 것도 있지만,

컴퍼짓 비디오(Composite Video) 처럼 컬러 정보를 압축해서 흑백 영상에 삽입하는 것도 많이 쓰입니다.

대부분 영상 기기에서 노란색 RCA 커넥터로 출력되는 것이 이 컴퍼짓 비디오인데요.

 

컬러 포맷에 따라 주로 NTSC, PAL, SECAM로 인코딩 되어,

영상 신호의 고주파 영역에 같이 전송됩니다. 국가별로 정해져 있습니다.

 

이 때, 어쩔수 없는 컬러 손실이 발생하게 되는데요.

원래 6~8MHz 정도의 대역폭을 갖는 흑백 영상/음성 신호에 컬러 신호(약 2MHz)가 겹치도록 만들기위해 개발된 것이라서

어쩔수 없습니다. (예전에 방송하던 흑백 신호와의 HW 호환성을 갖도록 설계된 것이지요.)

특히 이 색 열화는 공중파 신호의 경우 더 심하게 되고요.

S-Video 처럼 컬러와 흑백 밝기 신호를 분리해서 전송하는 경우는 조금 덜합니다.

컴퍼짓 비디오처럼, 영상의 고주파 영역(고해상도 영역)에 컬러 신호가 겹치는 것을 막기 위해

케이블을 두개로 따로 전송하는 것이죠.

 

원래의 RGB 신호를 그대로 전송하는 경우는 이런 컬러의 열화없이 깨끗하게 볼수가 있습니다.

 

 

끝으로, 15KHz 비디오 신호를 요약하면,

1. 수직 싱크 60Hz 경우(우리나라,일본,미국 등) 240p, 480i 신호를 의미한다.

2. 수직 싱크 50Hz 경우(유럽, 중국 등) 288p, 576i 신호를 의미한다.

3. 영상의 수평해상도는 원본 영상을 만드는 기기에 의해 결정된다. 

4. MSX1의 경우 사용된 VDP 종류에 따라, 수직 50Hz/60Hz가 고정된다.

    MSX2의 경우 VDP 세팅으로 50Hz/60Hz 및 인터레이스/넌인터레이스를 설정할 수 있다.

5. 컬러 포맷은 국가별로 정해져있으며,

   MSX의 경우 모델에 따라 NTSC, PAL, SECAM 세 종류로 고정되어 있다.

 

궁금한 점은 댓글 달아주세요~ ㅎ.ㅎ


2010년 8월 29일 일요일

HV v1.1 - Hangul Viewer for MSX-DOS2

Download: HV_v1.1.zip 

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

    HV v1.1 (MSX-DOS2용 한글 텍스트 뷰어 2010.08.29)

        By 서영만 (E-mail:sharksym@hitel.net)

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



* 개선 사항 v1.1


- 프로그램 종료 후, 인터럽트 HOOK이 비정상으로 복구되는 문제가

  수정되었습니다.



* 한글 텍스트 뷰어


  MSX-DOS2에서 영문 및 한글 텍스트를 보여주는 프로그램입니다.

  한글 코드는 KS 완성형 및 2바이트 조합형을 지원합니다.



* 요구 사항


  MSX-DOS2가 구동되는 MSX2 이상의 기종.

  메모리 매퍼 64KB 추가로 필요함.

  (기본 메모리 256KB이상이면 충분함.)



* 사용법


  HV FILENAME.EXT [리턴] 하면 됩니다.

  텍스트 뷰어 상에서는 아래의 키를 사용합니다.

  ESC       - 뷰어 종료

  TAB       - 완성/조합 한글 코드 전환

  커서 UP   - 위로 스크롤

  커서 DOWN - 아래로 스크롤



* 환경 변수


  HVMODE 이름으로 마지막 선택된 한글 코드를 기록합니다.

  KS이면 완성형, KSSM이면 조합형입니다.

  환경 변수가 없는 경우, 기본은 완성형으로 처리합니다.



* 폰트 크기


  자체 영문/한글 폰트를 내장하고 있습니다.

  폰트 크기는 영문 8x16, 한글 16x16 입니다.

  한글의 경우 초중종 8x4x4벌식 폰트를 사용합니다.



* 화면 모드


  문자 출력은 인터레이스 스크린7 모드를 사용합니다.

  영문의 경우 수평 64, 수직 26개의 문자를 출력가능합니다. 


  텍스트 파일에서 수평 64컬럼을 넘는 경우는,

  다음 라인으로 넘겨서 표시합니다.



* 마지막으로


  이 프로그램은, HI-TECH C용 DOS2 뱅킹 툴로 만들어졌습니다.

  엉성하게 만든 프로그램이라 버그들이 있을 수 있습니다.

  문제점 발견 시, email 또는 파라동 게시판으로 알려주시면

  감사하겠습니다.


MPXP v1.63

거의 10달만에 새버전을 릴리즈하는군요.


기능이 업그레이드 된 건 아니지만,

제가 만들고 있는 파일 매니져 M 과 동작시 문제되던 부분이 수정되었습니다.

MPXP_v1.63.zip

 


아래 설명 참고하세요.


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

    MPXP v1.63 (2010.08.29)

        By 서영만 (E-mail:sharksym@hitel.net)

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


* 개선 사항 v1.63


- 파라미터로 공백을 쓰는 경우 슬롯 지정 옵션으로 오동작 하던 버그가

  수정되었습니다.


- 슬롯 지정을 하더라도 MPX가 발견되지 않으면,

  전체 슬롯을 한번더 검색하도록 했습니다.


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


* MPXP 란?


 김준성님이 만드신 미디어-플레이어 카트리지인 MPX(TM) 용 프로그램입니다.

 MSX-DOS1 및 MSX-DOS2 환경에서 동작합니다.


* 실행 방법


  MPXP FILENAME [P-Slot][S-Slot]

    슬롯 번호를 생략할 경우, 실행 시 MPX 카트리지를 찾아줍니다.



  MPXP SONG.MP3 [RETURN]

  MPXP B:SONG.MID [RETURN]

  MPXP C:\MP3\*.* [RETURN]


2010년 8월 18일 수요일

[강좌] 03. MSX의 메모리 매퍼

"어디선가 많이 듣던 말인데, 어떻게 동작하는건지 모르겠네~" 라고

생각하신 분을 위한 강좌입니다. ^^



일단 메모리 매퍼는,

MSX에서 쓰이는 메모리을 특정 크기로 분할해서,

HW/SW로 편리하게 쓸수 있도록 만든 기기라고 생각하시면 되겠네요.



근데, 여기서 중요한 사실 한가지가 있는데요.

일부 모델을 제외한 MSX2 이상의 본체에는 DRAM에 매퍼가 장착되어 있고,

코나미 메가롬팩 안에도 대용량 롬을 처리하기위한 매퍼가 들어가 있습니다.

둘다 메모리 매퍼라고 불러도 상관없지만,

일반적으로 MSX 에서 메인램에 연결된 것을 '메모리 매퍼'라고 부르고요,

메가롬팩이나 재미나 메가램팩 등에 들어 있는 건, '메가롬 매퍼'라고 합니다.

헷갈릴 수 있지만, 오래전(?)부터 그렇게 이름을 붙인거니 그냥 이해해주세요.

그럼, 이번 내용은 메인램에 관리하는 '메모리 매퍼'에 대한 것임을 알수 있겠죠? ^^

(메가롬 매퍼는 필요하시면, 따로 강좌를 만들겠습니다요~)



MSX의 슬롯 구조에서 64KB의 CPU 메모리 공간은 16KB 4조각으로 관리됩니다.

만약 슬롯에 메모리 최대 용량인 64KB를 모두 채우면,

기본적으로 MSX-DOS에서 모두 램으로 활용이 가능하고요. (물론, 시스템의 Work Area는 제외)

BASIC에서는 주소가 8000H~FFFFH인 Page2,3만 램으로,

Page0,1은 BIOS/BASIC인터프리터로 세팅이 되는데요.

CALL MEMINI 등의 램디스크 기능을 사용하면,

나머지 0000H~7FFFH의 32KB를 램 디스크로 모두 활용할 수 있습니다.



여기서 잠깐 Work Area의 대한 얘기도 해야겠군요.

MSX가 구동되는 동안에는, 각종 시스템 설정이 저장될 공간이 필요한데요.

이 영역을 Work Area라고 부릅니다.

주소는 FFFFH 에서부터 0000H 방향으로 내려오면서 메모리가 할당 되는데,

시스템의 중요 변수들은 미리 주소가 정해져서 할당되어 있습니다.

예를 들어, LINLEN 이라는 시스템 변수의 주소는 F3B0H 인데요,

현재 텍스트 모드의 WIDTH 값을 저장하고 있습니다.

BASIC에서 WIDTH 명령을 쓰거나, DOS에서 MODE 명령으로 수평 글자수를 바꿀수가 있는데,

이때 설정 값이 기록되어 있습니다.

만약 프로그램에서 텍스트 화면의 특정 영역을 복사 또는 스크롤 한다면,

이런 설정값을 참조해서 프로그래밍를 하면 되겠지요.



시스템 변수 이외에도, 각종 BIOS 점프 루틴(확장BIOS처리 또는 HOOK)이나

슬롯에 있는 롬SW가 사용하는 설정 값들도 Work Area에 저장됩니다.

특히 BASIC 인터프리터가 사용하는 영역도 꽤 됩니다.



그렇다면, MSX에서 메인램에 로딩할 수 있는 프로그램의 크기는,

DOS상에서 약 55KB 정도, BASIC라면 23KB 정도 되겠네요.

만약 MSX에 연결된 디스크 기기가 많거나, Work Area를 많이 쓰는 SW가 슬롯에 존재할 경우,

여유 메모리는 점점 줄어들게 됩니다.



만약 BASIC 상태에서 여러가지 커맨드 확장 루틴(기계어 코드)을 로딩했을때는,

이런 부족한 메모리로는 활용이 쉽지 않다는 상태에 직면하게 됩니다.

물론 롬으로 만들어서 슬롯에 주르륵 탑재한다면 편하겠지만,

매번 EPROM에 구워서 SW 교체하는 식은 별로 편하다고 볼수 없겠지요.



일단 메모리 매퍼가 없는 경우에도 메모리를 확보할수 있는 방법은,

BASIC 모드에서 사용하지 않는 0000H~7FFFH의 메모리를 슬롯 전환을 통해 쓰거나,

비디오 메모리의 일부를 데이터 저장으로 활용할수 있습니다.

MSX2의 경우는 0000H~7FFFH의 메모리를 램디스크로 사용하면

디스크에서 데이터/프로그램 읽고 쓰는 것보다 훨씬 빠르니 좋죠.



더 많은 메모리가 필요하다면... 메모리 매퍼를 사용해야합니다.

메모리 매퍼 레지스터 사용법은 슬롯 전환 방법과 매우 유사한데요.

메모리는 16KB로 분할되어 세그먼트 번호가 매겨집니다.

만약 128KB 램이 매퍼에 연결되어 있다면, 총 16KB x 8개의 세그먼트를 쓸수 있는것이죠.

근데 한가지 주의해야될 사항은,

MSX/MSX2의 메인 BIOS는 메모리 매퍼 구성에 관여를 하지 않습니다.

좀 애매한 설명이지만, ^^

메모리 매퍼를 활용하려면 BIOS와는 상관없이 메모리 관리하는 SW를 만들어야한다는 얘기입니다.

MSX2+/MSXturboR은 부팅시 모든 슬롯의 메모리 매퍼의 용량은 체크합니다만,

실제 관리는 DOS2의 메모리 매퍼용 확장 BIOS 루틴을 써야만 합니다.



일단 DOS2의 도움없이 사용하는 방법은 이렇습니다.

I/O 주소는 아래 네개가 사용됩니다.

FCH : Page0(0000H~3FFFH)의 세그먼트 전환

FDH : Page1(4000H~7FFFH)의 세그먼트 전환

FEH : Page2(8000H~BFFFH)의 세그먼트 전환

FFH : Page3(C000H~FFFFH)의 세그먼트 전환



만약 Page1의 메모리를 세그먼트 5로 바꾼다면,

LD A,5

OUT (0FDH),A

등의 명령으로 바꿀수 있습니다.

사실 바꾸는건 간단한데, 다시 이전 세그먼트로 복구하는건 쉽지 않습니다.

원래 Page1에 세팅된 세그먼트 번호를 알아야하는데요.

그걸 알아내려면,

다른 Page에 램 세그먼트를 하나씩 바꿔가면서 특정 값을 기록하고,

원래 Page의 값이 같이 바뀌는지를 체크하면 알수가 있습니다.

물론 체크후에는 원래 값으로 복구시켜야겠지요.

저도 이런건 생각만 했지 실제로 메모리 활용하기위해 이렇게 프로그래밍해본 적은 없습니다.

한때 매퍼 레지스터를 읽어서 세그먼트 번호로 쓴적은 있었어요.

나중에 알고보니 이렇게 하면 안되는거더군요.

상당수 프로그램(터보알용 게임 포함)이 이런 잘못된 램 테스트를 함으로써, 구동에 실패합니다.



SW 만드는 사람 마음이겠지만, 개조안된 특정 본체에서 구동되도록 만들었다면,

같은 모델 쓰든 다른 사람도 같은 결과물을 얻을수 있겠지요.

무슨 소리인지 대충 이해하셨으리라고 믿고, 간단하게 BASIC으로 테스트해보겠습니다.



MSX2의 BASIC 모드에서 기본 메모리맵은 아래처럼 됩니다.

Page0/1 : 메인 BIOS 및 BASIC 인터프리터

Page2/3 : 메인 램 (Page3 끝에는 WorkArea 존재)



만약 BASIC 프로그램을 작성하게 되면 Page2 부터 저장이 되는데요.

그럼, Page2의 메모리 세그먼트(16KB)를 바꾸면 기존 프로그램을 지우지 않고

새로운 프로그램을 저장할 수 있게됩니다.

아래 BASIC 프로그램을 그대로 따라서 한번 해보세요.

실제 MSX 기종에서는 매퍼 상태에 따라 동작 안될수 있으니,

에뮬레이터에서 MSX2 기종으로 부팅해서 해보시기 바랍니다.

참고로 저는 paraMSX의 FS-A1WSX 설정으로 테스트했습니다.



부팅후, 프로그램 하나(한줄짜리 ^^)를 입력합니다.

10 PRINT "This is RAM segment 1"

run으로 실행시키면 아래처럼 되겠죠? (Ok는 BASIC 프롬프트입니다. 입력하지는 마세요. ㅋ)

This is RAM segment 1

Ok



그럼, 여기서 Page2의 세그먼트를 바꿔서 다른 프로그램을 입력해보겠습니다.

OUT (&HFE),2

Ok

new

Ok

새 프로그램을 입력합니다.

10 PRINT "New program in RAM segment 2"

20 PRINT "Hello MSX"

run으로 실행하면

New program in RAM segment 2

Hello MSX

Ok

라고 나오죠?



그럼, 다시 Page2를 원래 세그먼트로 복구해보겠습니다.

OUT (&HFE),1

Ok

list

10 PRINT "This is RAM segment 1"

Ok

처음에 입력한 프로그램이 나오나요?



매퍼의 상태를 설명드리면,

현재 동작중인 MSX 본체의 메모리 매퍼가 초기에 아래처럼 됩니다.

한번더 강조하지만, 매퍼 설정은 모든 MSX에서 동일한 것이 아닙니다.

제품 만드는 사람 마음이에요. ^^

Page0: RAM segment 3

Page1: RAM segment 2

Page2: RAM segment 1

Page3: RAM segment 0



뭔가 감이 오시죠?

처음 프로그램을 입력 후, Page2의 세그먼트를 2번으로 전환하고 다른 프로그램을 입력한 것입니다.

요건 간단한 메모리 세그먼트 전환이 어떻게 되는지 설명하기 위한것이었고요.

실제로 사용시, 여러개의 BASIC 프로그램을 빠르게 전환하려면

램디스크 기능을 쓰는게 훨 편합니다. ^^



만약 DOS1에서 프로그램을 만든다면,

기본 프로그램은 Page0,1을 쓰고 부가적인 루틴은 16KB씩 나눠서

Page2에 세그먼트 전환으로 사용하면 좋겠지요.



만약 DOS2에서 구동되는 프로그램이라면, 매퍼 레지스터를 직접 액세스하면 안됩니다.

DOS2의 확장 BIOS에서 제공하는 루틴을 쓰면 쉽게 세그먼트 관리를 할수가 있습니다.

자세한 설명은 아래 홈페이지를 참고하세요. "5. MAPPER SUPPORT ROUTINES"를 보시면 됩니다.

http://map.grauw.nl/resources/dos2_environment.php



실제 사용은 어셈블리로 해야되니,

이번 강의에 예제 코드를 올리는건 좀 무리겠네요. ^^

방법을 요약하면,

1. 먼저 확장 BIOS 루틴의 매퍼 엔트리(주소)를 얻어와야합니다.

2. 엔트리에서 필요한 루틴(세그먼트 할당/전환 등등)을 직접 CALL하면 됩니다.

3. 세그먼트 할당시 유저/시스템 두가지 영역을 지정할 수 있습니다.

4. 유저 영역은 프로그램이 종료되면 할당된 세그먼트가 자동으로 반환됩니다.

5. 시스템 영역은 프로그램이 종료하더라도 할당된 상태가 유지됩니다.

   시스템 영역은 서로 다른 프로그램이 데이터를 공유하거나,

   프로그램이 종료된 후 다시 실행해서 재사용 하는데 쓸수 있습니다.


PS. 아래 스크린샷은 paraMSX에서 BASIC 프로그램 예제를 실행한 모습입니다.




2010년 8월 11일 수요일

인터레이스 용 한글 출력 루틴이 쓸모가 있을까?

얼마전 HI-TECH C용 뱅킹 툴을 공개했었는데요.

 

일단 이것 저것 만들어야할 것들은 널렸지만(?)...

먼저 조합형 한글 폰트 출력 루틴을 완성하려고 합니다.

 

물론 기존 국산 MSX에도 한글은 내장되어있고, SAS 카트리지 같은 한글SW 있지만,

한때 많이 쓰였던 16x16 크기의 8x4x4 벌 조합형 한글 폰트(약 11KBytes)를 쓰면 괜찮지 않을까 생각해봤습니다.

 

출력 루틴은 BASIC 또는 BIOS의 문자 출력에 한글을 섞는 건 아니고요.

표준 그래픽 모드에서 폰트를 그리는 방식만 구현을 하려고 합니다.

그러니까 BASIC 모드에서 코딩하면서 한글을 입력하는 건 불가능하다는 얘기지요.

 

그래픽 모드는 고해상도 인터레이스 모드(스크린 6,7)을 쓰려고 합니다.

512 x 424 사이즈에 16 x 16 크기의 한글 그리보면, 고작 가로 32개에 26라인밖에 안되지만...

간단한 한글 뷰어/에디터 정도는 활용이 가능하겠지요.

 

어제 폰트를 덤프해서 인터레이스 스크린7에서 잠깐 뿌려봤는데, 글씨는 볼만하네요.

오래전에 HITEL로 접속한 듯한 그런 화면이랄까요. ㅎ.ㅎ;

 

앞으로 계획은...

1. 한글 뷰어 제작

2. 초간단 파일 매니져(LFN 지원 할까말까...?, MPX 배경음악 지원) 제작

3. MPXP GUI 버전 제작

 

늘 그랬지만, 만들다가 딴생각 들면 스케쥴을 바뀝니다요.

아마도 그래픽/사운드 라이브러리 제작이랑 병행해야 될 것 같은 느낌입니다. ㅋ

 

아래는 에뮬에서 폰트 출력해본 모습입니다. 스크린7 인터레이스 모드에서요.

8x16 영문 폰트랑 16x16 한글 폰트입니다. (한글폰트는 예전에 많이 쓰던 8x4x4벌이고요.)




2010년 7월 30일 금요일

DOS2 Banking Library & Build tool 제작 #5

이번에는 특정 슬롯의 메모리를 R/W 할수 있는 함수들을 만들어봤습니다.

MPX 또는 MMC/SD 드라이브, 메가플래시롬팩 등의 메모리맵 I/O를 쓰는 기기를 액세스시 사용할 수 있습니다.

 

1바이트 R/W는 MSX 메인 바이오스 루틴을 쓰면 페이지 제한없이 가능하니깐,

일단 메인 바이오스 콜을 기본으로 넣었습니다.

 

그 다음은 블럭 메모리 전송인데, 이 경우는 목적지 페이지1,2만 가능하도록 했습니다.

메모리 위치는 페이지 상관없지만, 목적지 페이지와 동일하면 안되겠지요.

물론 전송 사이즈가 커서 어드레스가 페이지를 가로지르면 문제가 됩니다요. ㅋ

안전하게 페이지0->1, 페이지1->2, 페이지2->1 등등으로 

 

테스트용으로 MPXP 프로그램을 뱅킹 라이브러리를 쓰도록 초간단 버전을 하나 만들었습니다.

이름은 MPXPS (마지막 S는 Simple을 의미합니다.ㅋ)

참고로, 뱅킹라이브러리 릴리즈할때, MPXPS 소스도 예제로 들어갈 예정입니다.

 

실행해보니, MMC/SD HW V2에서 128KBPS짜리가 겨우 돌아가는 정도는 되네요. ㅎ.ㅎ

사실 원본 MPXP는 전송루틴이 어셈으로 되어서 속도가 조금 빠른편인데요,

어셈 안쓰고 일반 C함수 콜만으로도 어느정도는 쓸만한 것 같습니다. ㅋ

  

그 외, 틈틈히 필요한 함수들 만들고 있습니다.

키보드 입력(RAW I/O)이나 터보알/파나소닉MSX2P CPU 모드 등등...

점점 라이브러리가 커지고 있네요. ㅋ

 

그래픽과 사운드(BGM?) 예제 두어개 만들면, 이대로 1차 릴리즈해야될거 같습니다.

생각날때마다 조금씩 진행하다보니 진도가 넘 느리네요. ㅎ.ㅎ

 

혹시 관심있으신분, 요청사항 있으면 댓글 달아주세요.


2010년 7월 18일 일요일

DOS2 Banking Library & Build tool 제작 #4

몇주 쉬다가 다시 작업 들어갔습니다. ㅎ

 

인터럽트 처리를 보완하기 위해 구상을 좀더 해봤습니다.

 

일단 DOS2 상태에서 인터럽트가 발생되면,

기존 SW의 ISR(Interrupt Servie Routine)을 구동하기 위해, 페이지0이 원래의 메인 BIOS로 변경이 됩니다.

 

결국, 이 때는 원래 프로그램 내의 루틴이 정상으로 돌아갈 수 있는 상태가 아닌 것이지요.

각 뱅크(페이지0,1) 내의 ISR을 처리하기 위해, 페이지0의 슬롯 처리 및 뱅킹 처리가 같이 되어야 합니다.

 

그외 BIOS의 ISR 처리는 여러가지 키보드 등의 입력 기기와 음악(PLAY) 루틴이 함께 들어가있는데,

필요 없는 코드를 그대로 실행할 필요는 없을 것 같고요.

여기에 추가로 KEYI와 TIMI 두개의 훅(HOOK) 으로 실행되는 유저 ISR도 옵션 처리가 가능하도록 바꿨습니다.

보통 TIMI 훅에는 디스크 드라이버의 타이머 루틴이나 그 외 타이머 류의 SW가 들어가게 되는데,

필요한 경우 멈출수 있도록 하는 것이지요.

 

이렇게 하려면, 메인 BIOS에서 첫 KEYI 훅으로 유저 ISR이 콜될때 강제로 스택의 리턴 주소를 지우고,

따로 필요한 ISR만 콜해주면 쉽게 됩니다.

기존 BIOS 루틴의 JIFFY 카운트도 따로 처리합니다.

 

VDP의 스프라이트 충돌, 스캔라인 인터럽트(H-Blank), V싱크 인터럽트(V-Blank) 3개의 인터럽트와

외부 인터럽트 8개를 사용할 수 있도록 했습니다. (좀 많나요? ㅋ)

 

일단 ISR 우선 순위는 아래처럼 해놨습니다.

EXT0,EXT1,HBLK,EXT2,EXT3,SPRT,VBLK,EXT4,EXT5,EXT6,EXT7

의 순으로 체크됩니다.

 

EXTn -> 외부 인터럽트

HBLK -> VDP H-Blank

VBLK -> VDP V-Blank

SPRT -> VDP Sprite 충돌

인데요.

여기서 스프라이트 충돌은 실제 VDP에서는 인터럽트가 아니라 단지 State만 알려주는 것인데,

V-Blank 때 같이 인터럽트로 ISR를 콜하도록 해놨습니다.

 

특별히 게임이나 음악 등 타이밍 처리를 위한 wait 함수들도 구현해봤습니다.

VDP의 60Hz V-Blank 인터럽트를 활용한 것인데요.

물론 기존의 JIFFY 값으로 처리해도 상관없지만 어셈으로 만든 라이브러리가 쓰기편할테니...ㅋ

wait_60hz(), wait_30hz() 이런식의 함수로, 타이밍 동기처리를 할 수 있습니다.

 

그리고, 게임 등 경우에 따라, 범용 키보드 I/O가 필요없을 때에는,

메인 BIOS의 키처리 루틴을 스킵할 수 있습니다.

물론 C라이브러리의 scanf 등으로 키입력을 쓸때는 켜놔야겠지요. (기본은 상태는 ON 입니다.)

 

실제로 모두 구현해서 테스트해보니,

DOS2의 매퍼 뱅킹 처리나, 슬롯 전환 등의 코드가 수행되느라 인터럽트 응답이 약간 느리긴한데요.

그래도 편리성을 생각하면, 이런식이 훨씬 쓰기 편한 것 같습니다요.

 

인터럽트 처리는 이정도로 마무리하고,

다음은 각 슬롯의 메모리맵 I/O를 위한 루틴을 만드려고 합니다. 

 

아래는 인터럽트 테스트를 위해 만든 코드가 돌아가는 모습인데요.

터보알에서 VDP의 스캔라인 인터럽트와 V-Blank의 타이밍 루틴을 이용해서,

화면이 좌우로 흔들리는 효과를 구현해봤습니다. (참고로 좌우 흔들림은 V9938의 ADJUST 기능입니다.)




2010년 6월 22일 화요일

[강좌] 04. MSX의 메가롬 매퍼

메가롬 매퍼를 모르시는 분은 아마 없겠지만, 간단하게 설명해볼까합니다. ㅎ.ㅎ

(MSX로 게임을 안하셨다면, 모르실지도 !!!)


먼저 메가롬이 뭔지 알아야겠지요?


일반적인 롬카트리지 형태의 SW는 기본적으로 페이지1,2를 사용하도록 되어있습니다.

(참고로 MSX의 페이지, 슬롯이 헷갈린다면 지난 강좌를 찾아보세요~)


메인 BIOS가 부팅시 각슬롯의 롬 SW를 체크해서 초기화 루틴을 수행한다고 했었죠?

이때 롬의 초기화 루틴, BASIC 확장 루틴 등등 외부에서 콜되는 루틴들은

모두 페이지 1에 있어야 합니다. 요건 MSX SW 표준의 일부입니다.


롬 SW 전체 표준에 대해서는 여기서 다루지 않겠지만, 약간 설명드리면...

기본적으로 롬 SW는 BASIC 또는 DOS상에서 실행될 수 있도록 만들어져 있습니다.

사실 롬 자체는 페이지0부터 3까지 모두 사용하도록 만들어도 되지만,

일반적으로 페이지0의 메인 BIOS를 자주 액세스 하게 되고,

페이지3도 램으로 쓰는게 일반적입니다.


여기서 페이지 한개는 16KBytes이니까,

결국 롬으로 된 SW는 16KB 또는 32KB 크기로 만들수 있다는 말이 됩니다.

일반적으로 롬이나 램의 크기는 비트(어드레스 개수 x 데이터 라인 개수)로 나타내는데요.

대표적인 128KBit의 EEPROM이 16Kbytes 용량이 되겠습니다.

많은 MSX 롬팩들이 단일 128KBit 롬 하나로 만들어져 있지요.


그럼 256KBit 롬팩은 사이즈가 두배가 되는 프로그램이겠죠?

용량이 크면 좀 더 재밌는 게임이 될 확률은 있었지요. ㅎ.ㅎ


참고로 롬 카트리지 또는 주변기기의 BIOS를 만들경우, CPU가 페이지1,2를 액세스할때

 부가적인 어드레스 디코더 회로가 필요할 수 있습니다.

(어드레스 디코더란 원하는 CPU 어드레스가 되는 것을 디텍트 하는 용도로 쓰입니다.)


MSX 슬롯 커넥터의 핀들 중에 1,2,3번 핀이 각각 /CS1,/CS2,/CS12 신호를 출력하는데요.

이게 페이지 셀렉트 신호입니다.

롬팩 만드는데 매번 어드레스 디코더를 붙여야 한다면, 귀찮기도 하겠지만 HW 제작 단가도 

올라가겠죠? 그래서 요건 MSX 본체에서 기본적으로 신호를 만들어 주는 것이지요.

16KBytes EPROM 두개로 32KBytes 롬팩 만들때는 요긴하게 쓸 수 있겠지요.

(간단 롬 하나로 만들때는 /CSxx 핀들은 별로 쓸모가 없긴합니다요.)


메가롬과 메가롬 매퍼가 왜 필요한지 설명하려다 보니, 일반 롬 설명을 어쩔수 없이 하게 

되었네요.


서론이 길었습니다. 그럼 메가롬팩은 뭘까요?

롬 용량이 Mega Bit 급인 롬을 사용하는 롬팩입니다.

(참고로 1Mega Bit는 128KBytes입니다요.)


앞에서 얘기했지만, 기본적으로는 페이지1,2가 해당 롬의 슬롯으로 매핑되니까,

32KB를 초과하는 프로그램 또는 데이터는 그냥 액세스가 불가능하겠지요.

MSX2부터 지원되는 메모리 매퍼의 경우 16KB씩 세그먼트로 관리되어 매핑되는 것 처럼,

메가롬팩도 비슷한 방법을 사용합니다.


보통 메가롬팩은 8KB 또는 16KB씩 분할해서 매핑할수 있도록 회로를 내장하고 있습니다.

참고로 코나미 SCC의 경우는 사운드와 메가롬 매퍼가 합체(!)된 칩이고요.


그럼 분할된 8KB의 롬 뱅크는 어떻게 선택할까요?

메모리 매퍼의 경우는 IO 맵 방식으로 회로가 만들어져 있지만,

메가롬 매퍼는 메모리맵 방식으로 구현이 되어있습니다.

그러니까 특정 어드레스에 페이지 번호를 Write하면 원하는 뱅크의 메모리가 매핑되게 됩니다.


코나미 8KB 매퍼의 동작을 예로 들어보겠습니다.

(http://bifi.msxnet.org/msxnet/tech/megaroms.html 한번 참고하세요.)


아래처럼 뱅크 4개로 나누어져 있고,

처음 부팅을 하게 되면 페이지가 순서데로 매핑이 되어있습니다. (롬의 첫 32KB영역)

여기서 페이지는 메가롬 매퍼의 8KB 분할 공간을 의미하는 것입니다.

MSX 슬롯의 16KB 분할된 페이지를 말하는 건 아니에요.


Bank 1: 4000H - 5FFFH  -> Page0

Bank 2: 6000H - 7FFFH  -> Page1

Bank 3: 8000H - 9FFFH  -> Page2

Bank 4: A000H - BFFFH  -> Page3


각 뱅크의 페이지는 아래의 주소에 해당 페이지 값을 쓰면 바뀌게 됩니다.


Bank 1: 변경 불가

Bank 2: 6000H - 7FFFH (주로 6000H)

Bank 3: 8000H - 9FFFH (주로 8000H)

Bank 4: A000H - BFFFH (주로 A000H)


만약 부팅 후 6000H에 4를 쓰고, 8000H에 5를 쓴다면,

각 뱅크의 페이지는 아래처럼 바뀌게 되겠죠?


Bank 1: 4000H - 5FFFH  -> Page0

Bank 2: 6000H - 7FFFH  -> Page1

Bank 3: 8000H - 9FFFH  -> Page4

Bank 4: A000H - BFFFH  -> Page5


이런식으로 슬롯의 페이지1,2 영역에서 32KB를 초과하는 롬의 데이터를 매핑할수 있도록 됩니다.

만약 그라디우스 같은 슈팅 게임에서 배경화면 데이터를 8KB로 관리한다면,

뱅크 하나만 바꾸면서 쉽게 데이터를 읽을 수가 있겠지요.

물론 SW 관점에서 본다면, 매핑되는 뱅크 페이지에 따라 CPU의 주소가 결정되니까,

각종 데이터나 서브루틴들을 잘 관리해야 되겠지요.


이런 메가롬 매퍼는 코나미, 아스키 매퍼가 많이 쓰이고요.

게임에 따라 특수한 분할방식과 IO를 쓰는 경우도 있습니다.

뱅크는 8KB 또는 16KB 분할이 주로 쓰입니다.

특이하게 MSX-AUDIO 카트리지는 32KB 분할의 메가롬 매퍼를 갖고 있지요.

부팅시 첫 페이지 매핑은 롬팩에 따라 조금씩 다른 경우가 있지만,

대부분 페이지0,1,2,3 이런 순서 그대로 초기화됩니다.


특이하게 MSX-DOS2 카트리지는 용량이 64KB인데요. (DOS2 커널 48KB + KANJI 드라이버 16KB)

16KB 분할 매퍼로 구현되어있습니다.

메가롬은 아니지만 메가롬 매퍼와 비슷하게 구현되어 있습니다.

참고로 MMC/SD 드라이브의 BIOS도 8KB 분할의 SCC 매퍼로 구현되어 있는데요.

DOS1 커널 + DOS2 커널 + MMC/SD 드라이버 + 롬디스크가 512KB 한개 플래쉬롬으로 되어있지요.


일종의 메가롬팩 에뮬레이터인 재미나 램카드는, 8KB 매퍼와 16KB 매퍼를 다 갖고 있는데요.

게임에 따라 8KB 또는 16KB로 설정해서 사용합니다.

참고로 재미나 8KB 매퍼는 코나미 8KB 매퍼와 구조가 동일합니다.

따라서 아스키 8KB 매퍼용 게임은 코나미 매퍼 방식으로 롬을 패치해서 로딩하게 됩니다.


코나미의 스내쳐/SD스내쳐 게임에 들어있는 SCC사운드 카트리지에는 64KB의 DRAM이 들어있는데요.

DRAM을 128KB로 증설하게 되면, 1메가비트 메가롬팩 처럼 사용이 가능합니다.

물론 SCC칩도 들어 있으니, 파로디우스,사라만다 등의 게임에서 SCC 사운드도 즐길수가 있지요.


근데, 이런 메가램카드의 경우 전원을 끄면 내용이 사라지게 때문에,

게임을 하려면 매번 디스크에서 롬파일을 다운로드해야합니다.

요즘엔 플래시롬을 활용한 카트리지가 있어서, 실제 롬팩을 쓰는 것처럼 즐길 수가 있지요.

(참고로, 플래시롬은 한번 Write되면 전원이 꺼져도 내용이 그대로 남아있습니다.)

SCC메가플래시팩이나 MMC/SD 드라이브의 롬팩 기능이 대표적이겠지요.


글 내용을 요약하면 아래와 같습니다.

- 메가롬팩은 용량이 메가비트급이다. (1MBit = 128KBytes)

- 롬 SW는 페이지0,1,2를 주로 사용, 메가롬팩은 페이지1,2를 주로 사용.

- 32KB를 초과하는 영역은 메가롬 매퍼로 페이지1,2에 매핑됨.

- 메가롬 매퍼는 주로 8KB 또는 16KB 단위로 매핑됨.

- 재미나 램카드, SCC메가플래시팩 등으로 메가롬팩을 에뮬할수 있다.

2010년 6월 16일 수요일

DOS2 Banking Library & Build tool 제작 #3

지난번까지 기본적인 뱅킹 라이브러리와 관련 툴을 만들었는데요.

조금씩 개선하면서 진행중입니다.

 

기본 C 라이브러리에서 빠져있던 getenv(), setenv() 함수를 DOS2 기준으로 쓸수 있도록 추가되었습니다.

현재 뱅킹 툴로 소스 빌드를 하면,

로딩 프로그램(*.COM)과 별도의 뱅크에 로드되는 코드(*.OVL)가 생기는데,

로더가 구동시 같은 디렉토리에 존재하는 OVL을 읽을수 있도록 했습니다.

(이때 getenv()가 필수가 되지요.)

 

계획되었던 뱅크간 공유 메모리용 함수들도 만들었습니다.

요건 간단하게 malloc(), free() 같은 기존 함수에 wrapper로 구현했습니다.

메모리 영역 9000H~ 부터가 공유 힙이 되는 것이지요.

참고로, 뱅크 내의 코드에서 malloc()을 쓰는 경우는 해당 뱅크 메모리(0000H~7FFFH)가 사용됩니다.

 

뱅크간 함수로 파라미터 전달은 기본적으로 스택이 쓰입니다.

큰 메모리를 포인터만 전달하거나, 공유용으로 쓸때만 이 영역이 사용되는 것이고요.

 

다음은, ISR(인터럽트 서비스 루틴) 처리인데...

일단 0038H의 Z80 인터럽트 벡터는 DOS2와 메인 BIOS가 서로 다르게 세팅해서 사용하고 있기 때문에

이걸 직접 수정하면 안됩니다.

 

메인 BIOS에서 제공하는 KEYI 훅과, 타이머용 TIMI 훅을 쓰도록 만들었습니다.

(사실 타이머는 VDP의 V Sync 인터럽트지요.)

 

실제로 훅 동작시에는 이미 Page0가 메인 BIOS로 변경이 되는데요. (DOS2에 의해)

유저 ISR이나 메모리를 Page0에서 쓸수도 있으니,

기본적으로 슬롯 세팅 및 뱅크 전환도 함께 되도록 구현할 생각입니다.

ISR의 뱅크 위치와 상관없이 구동 되도록 합니다.

 

아직은 간단한 카운트만 하는 ISR(외부 인터럽트 및 타이머 인터럽트)이 동작하는지 테스트했습니다.

최종적으로는 외부 ISR은 8개정도, 타이머 ISR은 1개를 등록하도록 만들 생각입니다.

 

아래 스크린샷을 보세요.




DOS2 환경 변수를 몇개 출력해보았고,

9000H~ 에 위치하는 공유 버퍼를 할당 받은 것도 표시해보았습니다.

(뱅크1에서 한개, 뱅크2에서 한개 할당했네요.)


맨 아래쪽 라인에서는,

0CE1, 0CE0, 0CE0 세개의 카운터가 올라가는 것을 출력하는 중인데요.

왼쪽은 메인 BIOS의 JIFFY 값,

중앙은 유저의 외부 ISR의 카운터

오른쪽은 유저의 타이머 ISR의 카운터 입니다.


2010년 6월 1일 화요일

DOS2 Banking Library & Build tool 제작 #2

얼마전부터 만들던 HI-TECH C용 뱅킹 라이브러리가 기본 틀이 완성되었습니다.

 

Makefile에서 소스 파일들을 뱅크 별로 목록만 만들면,

뱅크간 참조되는 함수 콜을 생성해서, DOS2의 세그먼트 전환으로 실행되도록 구현했습니다.

 

빌드가 완료되면, 실행파일(*.COM)과 각 뱅크의 코드 묶음(*.OVL)이 생성됩니다.

DOS2에서 실행하면 *.OVL 파일 크기에 따라 필요한 메모리 세그먼트를 할당 하고 파일을 로딩합니다.

로딩이 완료되면 main() 함수가 실행됩니다.


뱅크 내의 각 함수(main 함수 포함)들은 크기 제한(32KB)외에는 자유롭게 뱅크를 선택해서 만들수 있습니다.

 

뱅크간 참조 함수 처리는 빌드시, 특정 프로그램으로 생성되는데요. 아래의 순서로 진행됩니다.

 

1. 각 뱅크별로 소스들을 컴파일 하고, 임시로 라이브러리와 링크를 수행합니다.

    이 때, 링크 시 없는 함수들은 따로 리스트를 만들어 놓습니다. (*.LST 파일)

 

2. 각 뱅크별로 소스들만 컴파일/링크해서, 존재하는 함수 목록을 만듭니다. (링크 시 생성된 *.MAP 사용)

 

3. 모든 소스의 함수들의 실제 엔트리 주소와 뱅크 번호를 모아서 목록을 만듭니다. (*.REF 파일)

 

4. 1번 리스트에 등록된 함수와 3번의 전체 함수 목록을 참조해서,

    뱅크 전환 후 점프되는 가짜 함수를 만듭니다. (어셈블리 *.AS 생성)

 

5. 각 뱅크별 소스와 가짜 함수 코드를 같이 컴파일해서 링크합니다.

    참고로 가짜 함수는 콜을 하는 소스와 같은 뱅크에 존재하지만,

    실제 실행되면 진짜 함수가 존재하는 뱅크로 메모리 전환 후 콜됩니다.

    함수에서 리턴시, 원래 뱅크로 복귀.

 

6. 뱅크0의 코드는 Loader프로그램과 함해져서 실행파일(*.COM)로 생성되고,

   나머지 뱅크들은 1개의 *.OVL 파일로 합쳐집니다.

 

 

아래는 MSX 에뮬레이터에서 MSX-DOS2 환경으로 실행된 모습입니다.

뱅크가 3개인 프로그램(TESTAPP)를 실행한 모습입니다.

뱅크0는 기본으로 로딩되기 때문에 2개 뱅크(4개 메모리 세그먼트)가 추가로 할당되는 모습을 볼수 있습니다.




라이브러리 및 빌드시 필요한 프로그램은 좀 더 정리되면, 자료실에 업로드하겠습니다.

 

어셈블리 코드로 만들 필요가 없으니,

앞으로 메모리 걱정없이 편하게 C로 코딩할수 있게 되었습니다. ㅎ.ㅎ

2010년 5월 16일 일요일

파라동-4SLOT #3 케이스 합체 및 테스트

꿈꾸는 소년님이 제작하신 아크릴 케이스가 도착했습니다. ㅎ.ㅎ

6각 너트 드라이버가 없어서, 소형 롱노즈-플라이어로 열심히 돌렸습니다. ㅋ

케이스가 반짝반짝 아름답군요~~~

 

일단 파나소닉 MSX 3형제에 연결해서 잠깐 테스트했습니다.

(MSX2: FS-A1, MSX2+: FS-A1WSX, MSXturboR: FS-A1GT)

 

이미 테스트 하신 분과 같이,

FS-A1에서 매퍼램을 켰을때, 제대로 부팅이 되지 않았습니다.

제가 프로토타입으로 만든 확장슬롯+1MB 보드로 돌렸을때는

서브슬롯0에 램, 서브슬롯1또는2에 MMC/SD 드라이브 상태에서 동작이 되었는데...으흑...

 

이게 뭔가 HW적인 타이밍 문제가 있는 것 같습니다.

확장슬롯 + 램 + MMC/SD 드라이브 세개를 한번에 쓸때만 나오는 문제 같네요.

혹시나해서 IQ2000에서도 해봤는데 무한 리부팅됩니다. ㅡ.ㅡ;

 

풀업저항은 제 프로토타입이랑 같고

차이는 어드레스 라인과 MERQ등의 컨트롤 신호가 74LS244를 경유 하는 것인데요. (버퍼링과 슬롯 스위치 역할)

근데 이게 WSX랑 GT는 괜찮고 A1이랑 IQ2000만 문제가 생기니... 이유를 잘 모르겠습니다.

 

일단 FS-A1이나 IQ2000, X-II, 소니 MSX등에서 확장슬롯 연결해보신 분, 결과 좀 알려주세요.

X-II에서도 안될 확률이 높겠지만... 소니 MSX에서도 안되면... 좀 난감하네요. ㅜ.ㅜ;

 

  

아래 사진들은 WSX에서 서브슬롯0에 1024KB램, 서브슬롯1에 MMC/SD 드라이브 꽂고 테스트하는 모습입니다.

왼쪽에 세워놓은 사라만다 케이스는 지난 오프모임때 유령군님이 선물로 주신거에요. ㅎ.ㅎ

(사진 찍다보니 갑자기 생각나서 배경으로 등장했습니다. 두둥~ㅎ )





파나소닉 FS-A1 파워 개조

얼마전에 전원 어댑터가 없는 FS-A1을 샀었습니다.

뚜껑만 한번 열어보곤, 별로 만지지는 못했었지요. (어댑터가 없으니 당연한 건지도...ㅋ)

 

전원부를 어떡하나 고민하다가, 모 쇼핑몰에서 소형 ATX 파워를 하나 샀습니다.

요건 220V에 바로 연결되는게아닌, DC 12V 입력을 받아서 5V, 3.3V, +12V, -12V 를 출력해줍니다.

 

혹시 관심있으신 분은 아래 링크에서 해당 제품을 보실수 있습니다요.

http://www.eleparts.co.kr/front/productdetail.php?productcode=022005015001000004

가격이 26,400원으로 후덜덜하지만, 용도에 딱맞는 녀석이라 보자마자 바로 구매했습니다. ㅋ

 

 

아래는 제 A1 뚜껑을 벗긴 모습입니다.

좀 어둡게 찍혔군요.




원래 A1의 전원 입력은 외장 어댑터로 부터 DC 9V, AC 18V를 받도록 되어있습니다.

이걸로 MSX에서 주로 쓰이는 DC 5V, +12V, -12V로 바꾸게 됩니다요.




일단 메인보드 좌측 상단의 전원쪽 부품을 들어냅니다. (보드를 뒤집으면 우측 상단이네요.)

기존의 전원 스위치는 그대로 사용할수 있도록 주변 정리(?)를 했습니다.




아래 사진의 조그만 보드가 ATX 파워 서플라이입니다.

원래 제작사에서는 카PC에 쓰일 목적으로 만든 것 같네요.

소형 저전력 PC에 쓰면 딱맞겠습니다. (사실 MSX에는 좀 과분하죠...ㅋ)

참고로, 사진에서는 ATX 보드에 연결되는 커넥터가 제거되어 있습니다.





새로 장착된 파워 서플라이와 보드의 기존 5V, +12V, -12V 라인에 연결된 모습입니다.

78L12, 79L12의 O라고 표시된 부분에 +12V, -12V 연결하면 되고요.

5V는 본체의 커다란 방열판에 연결된 5V 레귤레이터의 2번째 핀이 있던 곳에 연결하면됩니다.



 

ATX 전원은 RGB 및 카세트 커넥터 있는 부분에 글루건으로 고정했습니다.

원래 이부분을 방열판이 덮고 있던 곳이지요.

본체 덮개랑 공간이 많이 있는 곳이라 대충 고정해도 괜찮은 것 같습니다.

 

사진에서 빨강/검정 전선이 외부 12V(5A) 어댑터에서 들어오는 전원이고요.

노랑색으로 5V 출력, 두개의 회색선은 +12V, -12V입니다.




외부 12V 어댑터 연결부를 찍어봤습니다. (촛점이 엉뚱한데에 맞춰있군요. ㅎ.ㅎ)

기존 3핀 전원 커넥터를 제거하고, 둥근 모양의 어댑터 잭을 달았습니다. 위치가 딱 맞습니다요.




키보드를 얹은 모습입니다.




원래 있던 부품들이네요.

이걸 따로 보관해야할까요... 아님 그냥 버릴까요? 흠~




부팅시 MSX 로고가 나온 모습입니다.

A1은 원가절감을 너무한건지... 리셋 버튼도 없고 CAPS/KANA LED도 없고 참 심플하네요.

대신 외부 전원 어댑터를 쓰느라 본체는 상당히 작고 가볍습니다.

간단히 롬팩 게임을 즐길때는 딱 좋을 것 같네요. ㅎ.ㅎ



2010년 5월 11일 화요일

DOS2 Banking Library & Build tool 제작 #1

그냥 오래전부터 생각했던 프로젝트였는데, 이제서야 실천(!)에 옮기려고 진행하는 것인데요...

그게 뭐냐고요? ㅋ 으흠~ ㅎ.ㅎ



MSX에는 메모리 매퍼를 이용해 64KB 이상의 메모리를 사용할 수 있도록 설계되어있습니다.

이 메모리를 좀 더 효과적으로 사용하는 프로그램을 만들자라는 것이 목표이고요.

물론 기존에도 그냥 메모리 매퍼를 직접 액세스하거나 DOS2의 매퍼 루틴으로 잘 썼긴했습니다.

근데 솔직히, DOS2에 메모리도 넉넉하게 쓸수 있는 유저가 많지 않았었죠?

저도 이것 때문에 일반적으로 배포하려고 만드는 프로그램은,

메모리 매퍼를 쓰지않고 DOS1의 기본 메모리에서 구동되도록 했었습니다.

대신, 디스크 퍼포먼스는 DOS2 쪽이 좋기 때문에,

DOS2에서 실행되는 경우에는 DOS2의 시스템 콜을 쓰도록 만들었습니다.



최근에 저와 흥건남자님과 힘을 합쳐 확장슬롯+1MB램을 쓸수 있는 기기가 나오게 되었는데요,

이제 메모리를 활용할수 있는 프로그램을 본격적으로 만들어도 될때가 되지않았나 생각됩니다.

메모리가 많으면, 스크린7의 인터레이스 모드 그래픽을 쓰거나,

안티앨리어스 적용되는 한글 폰트룰 만든다던가...  재밌는걸 할수 있겠지요. ^^



일단 메모리 매퍼를 조금 설명드리면...

다른 대부분의 MSX기본 기기처럼, 메모리 매퍼도 IO 맵 I/O로 동작합니다.

근데 한가지 이상한 부분이 있죠.

MSX에서는 메모리 매퍼를 여러개 써도 되도록 규격이 만들어져 있습니다.

그러니까 슬롯1에는 1024KB, 슬롯3-0에는 512KB... 이런식으로 쓸 수 있다는 것이지요.



근데, 중요한건 메모리 매퍼용 IO 주소는 슬롯 제한을 받지 않는다는 사실인데요.

(IO 맵 방식이니까, 당연한 것이지만요.)

이게 SW 개발하는 사람한테는 참 머리아픈 문제입니다.

왜냐면, 예를 들어 현재 Page2 메모리(8000H~BFFFH)를 다른 세그먼트(뱅크 또는 페이지라고 보시면됩니다.)로

할당하게 되면, 모든 슬롯에 장착된 메모리 매퍼의 세그먼트가 같이 바뀝니다.



게다가 한가지 문제가 더 있는데요.

메모리 매퍼중에는 현재 세그먼트 번호를 읽을 수 있도록 만들어진게 대부분입니다.

MSX2 이상의 본체 내장된 건 아마 다 읽을 수 있을꺼에요.

문제는 Write 할때는 같은 주소에 연결된 기기가 한번에 동작은 하는데,

반대로 Read 할때는 램의 용량에 따라 세그먼트 최대 갯수가 다르니 읽은 값도 다를 수가 있겠죠?

이 때문에, 매퍼 레지스터를 읽는 것은... 법(!!)으로 금지되어 있습니다.



하지만 안타깝게도 MSX의 메인 바이오스는 메모리 매퍼에 관한 루틴이 하나도 없어서,

메모리 매퍼를 컨트롤하려면 SW 만드는 사람이 알아서 해야된다는 것이었죠.

이 때문에 많은 메모리 관련 호환성 문제가 발생하게 되었습니다.



어떤 슬롯에 얼마나 메모리가 장착되어 있는지, 확인하는 것이 쉽지가 않습니다.

아까 말했듯이 특정 세그먼트를 바꾸면, 원하지 않는 슬롯의 메모리도 변경이 되고...

용량을 확인하려면, 16KB 영역을 R/W 해보면서 램인지 일일이 체크를 해야하는데 쉽지 않죠.



그래서 많은 프로그래머들이 그냥 용량 체크는 세그먼트 값을 썼다가 읽은 값이 같아지는 숫자만을 인식하거나,

특성 슬롯만 메모리 확인을 하거나... 매퍼가 두개 이상일때는 메인(Primary) 매퍼만 사용하거나... 등의

방법을 썼습니다.



제 경우에도 터보알(A1GT)의 내장램을 1024KB로 확장하니까, 대부분 유럽산 프로그램들이 동작하지 않더군요.

보통 128KB~256KB 메모리를 요구하는 프로그램들입니다.

재밌게도 일본에서 만든 프로그램은 대부분 64KB 전용이라 크게 문제될게 없더군요.

국내 SW는 대우 MSX에 맞춰서 슬롯/메모리 등을 설정해서 또 문제가 됐었고요.



단지 일반 개발자 뿐만 아니라 유명한 게임들도 비슷한 제들이 있었습니다.

마이크로 캐빈의 FRAY는 메모리 확장된 터보알에서 부팅 안되는게 제일 유명한가요?



암튼 HW 설계상의 약점과 SW 개발의 어려움이 한데 뭉쳐져서 메모리 활용이 상당히 힘들었습니다.



이게 MSX-DOS2의 디스크 바이오스에서 메모리 매퍼를 지원하게 되어 이런 문제가 해결되었습니다.

바이오스 콜을 통해 메모리 세그먼트의 할당/해제/전환을 쉽게 할수 있게 되었지요.



Page3을 제외한 Page0,1,2 (0000H~BFFFH)의 메모리를 마음데로 바꿀수가 있습니다.

Page0의 경우는 인터럽트 사용시 주의해야겠지만... 암튼요.



방법은 DOS2 매뉴얼에 나오니 여기서 설명하진 않겠습니다.

다시 말씀드리지만, 메모리 매퍼 강좌를 하려는게 아니에요. ^^;



어쨋꺼나 DOS2 바이오스의 지원으로 메모리는 좀 더 사용이 쉬워졌지만,

개발자가 메모리 구성을 잘해서 SW를 만들어야 하는 것은 변함이 없습니다.

MSX용 개발 툴 중에서 DOS2 메모리 관련 루틴을 활용한 것이 따로 있는지는 잘 모르겠네요.

몇 종류의 어셈블리와 파스칼, C 정도의 컴파일러가 있지만, 대부분 CP/M용이라 (MSX-DOS1 겸용)

활용이 불가능 할 겁니다.



암튼, 서론이 길었는데요. ㅎ.ㅎ;

이번에 HI-TECH C에서 DOS2 메모리 매퍼 활용을 높일 수 있도록,

관련 라이브러리와 단일화된 메모리맵을 만들고 있습니다.



일단 컴파일러로 HI-TECH C를 고른 이유는...

라이브러리가 풀 소스로 제공되고, 인라인 어셈블리 사용도 편리한 편이고,

ANSI C를 풀로 지원한다거나 여러가지가 있겠지만,

제가 최근 수년간 쓰면서 많이 익숙하다는게 주 이유일 것 같네요.

함수 파라미터와 로컬 변수가 모두 스택에 할당되기 때문에

퍼포먼스가 좀 딸린다는 단점이 있지만, 대신 항상 함수의 Re-entrant(재진입)가 가능합니다.



메모리 관리는 DOS2의 확장 바이오스 루틴에 의존합니다.

메모리 세그먼트가 다른 함수 간의 호출은 별도의 뱅킹 루틴을 통해 이루어지는데요.

총 약4MB의 메모리를 사용할 수 있습니다.(DOS2와 터보알의 시스템 영역은 제외)

16KB 세그먼트 2개를 한개의 프로그램 뱅크로 사용합니다.

그러니까 최대 128개의 뱅크(32KB x 128 = 4096KB)를 프로그램으로 쓸수 있습니다.

일단 아래 메모리 맵을 보세요.



0000H~00FFH : DOS 시스템 콜 영역

0100H~7FFFH : 뱅킹 가능한 프로그램 영역(TEXT/DATA/BSS) (약 32KB)

8000H~8FFFH : 뱅킹(세그먼트 전환) 루틴, 뱅킹 스택 (4KB)

9000H~9FFFH : 공용 ISR 및 뱅크간 공유 DATA 영역 (4KB)

A000H~FFFFH : 스택 및 Work Area (24KB)


한동안 고민했던 메모리맵이었는데요,

함수 갯수가 많아지고 뱅킹간의 함수 콜도 왠만큼 하려면 스택이 많이 필요해지는데,

일단 현상태로 괜찮을지는 모르겠습니다.

부족하면 뱅크간 공유 DATA 영역을 줄여야겠지요. ^^



0100H~7FFFH 영역을 프로그램으로 할당한 것은,

Page1(4000H~7FFFH) 영역을 다른 슬롯에 있는 SW를 사용하거나,

메모리맵 IO를 쓰는 주변기기를 쉽게 액세스하기 위함입니다.

그리고, 실제 뱅킹은 Page0,1(0000H~7FFFH) 전체 영역이 바뀌게 되니까,

개별적인 인터럽트 루틴을 잠깐씩 쓸때도 유용하지 않을까 생각되네요.

아직 DOS2 시스템 콜을 사용시, Page0를 제대로 복구하는지는 테스트를 해봐야됩니다.



현재 뱅킹 루틴을 만들어서 테스트 중인데요.

HI-TECH C 컴파일 했을때 일반 함수에서 다른 뱅크로 잘 전환되는지 확인중입니다.



진행 상황은 가끔 글로 올리겠습니다.

혹시 질문 있으면 댓글로 달아주세요~




2010년 5월 4일 화요일

[강좌] 02. MSX의 주변기기 I/O

I/O라는 말을 처음 들어보셨나요?

I/O는 Input/Output의 준말로 CPU와 주변 기기와의 입출력의 의미합니다.

참고로, 자주 쓰는 말인 'BIOS'의 IO도 Input Output을 의미하고 있습니다.



만약 컴퓨터에 CPU와 ROM/RAM만 달려있으면, 별로 쓸만한 기기가 못되겠죠?

뭔가 사용자로 부터 입력(키보드/조이스틱 등)도 받고,

결과를 출력(모니터/프린터 등)도 하는 방법이 있어야겠습니다.

사운드를 듣고 싶다면 PSG 등의 사운드 칩을 제어할 수 있는 방법이 있어야하겠지요.



Z80 CPU와 주변 장치를 제어할 수 있는 방법은 크게 두가지가 있습니다.

Memory Mapped IO와 IO Mapped IO 인데요.



메모리맵 방식은 CPU가 보기엔 RAM 같은 메모리에 값을 읽기/쓰기를 하는 것 처럼 보이지만,

실제로는 주변 장치에 데이터를 입력/출력하는 방법입니다.



IO맵 방식은 CPU에서 주변기기 입출력을 위해 만들어진 별도의 명령으로,

데이터를 입력/출력하는 방법입니다.



MSX에서는 메모리를 슬롯이라는 것으로 여러개의 공간으로 관리한다고 그랬었죠?

메모리맵 방식의 IO를 쓸때는 특정 슬롯에 RAM 같은 메모리 아닌,

HW 기기를 연결하고 CPU의 /MERQ, /RD, /WR 신호에 맞춰 동작하게 구성합니다.

참고로 CPU의 /MERQ는 메모리 액세스 요청, /RD는 읽기 신호, /WR은 쓰기 신호입니다.



IO맵 방식의 IO를 쓸때는 슬롯의 메모리 공간과는 별도로,

특정 IO 주소에 HW 기기를 연결하고 CPU의 /IORQ, /RD, /WR 신호에 맞춰 동작하게 구성합니다.

참고로 CPU의 /IORQ는 IO 액세스 요청하는 신호입니다.



기억하실 부분은...

Z80 CPU에서 메모리 R/W와 IO R/W 관련된 명령이 따로 존재한다는 것.

MSX에서 메모리는 슬롯으로 관리되니까,

같은 주소에 메모리맵 IO를 만들더라도 선택된 슬롯에만 실제 IO가 이루어집니다.

IO맵 IO는 슬롯 상관없이 주소만 맞으면, IO가 이루어집니다.

만약 같은 주소의 IO맵 IO를 쓰는 기기를 2개가 연결되었다면 동시에 동작하게 됩니다.



그럼, 실제로 메모리맵 또는 IO맵 방식 사용시, 어떤 장단점이 있을까요?



장점을 먼저 생각해보면,



메모리맵 IO는 컨트롤 주소가 같은 기기를 여러개 쓰더라도,

슬롯 선택을 먼저 해야되니까 개별로 동작시키는 것이 가능합니다.

예)FDD 같은 디스크 장치는 기본적으로 메모리맵 IO방식입니다.

   여러개를 연결했을때 개별로 동작이 가능해야되니까요.

   코나미 메가롬팩 등의 카트리지 내에도 뱅킹을 위한 IO가 들어있습니다.

   그냥 롬 영역을 읽을 때는 롬의 코드가 읽혀지지만,

   IO 영역에 데이터를 쓰면 8KB 단위 등으로 페이지가 바뀌는 것이지요.

   물론, 해당 주소의 롬 데이터가 바뀌지는 않습니다.



IO맵 IO는 슬롯 선택에 관한 메모리 제한이 없으니, 쉽게 SW로 컨트롤이 가능합니다.

예)키보드, VDP, PSG 등의 경우가 대표적이죠.

  SW 구동 환경이 DOS이거나 BASIC이거나 32KB롬팩이거나 FDD의 디스크롬 상관없이,

  쉽게 키보드의 눌러진 키를 확인하거나 화면의 글자색을 바꾸는 것들을 할 수 있습니다.



그럼, 단점은 뭘까요? 각각의 장점이 서로의 단점이 됩니다. ^^



메모리맵 IO의 경우는 해당 기기가 장착된 슬롯으로 먼저 전환해야만 액세스가 가능하니까,

SW를 만들때 좀 복잡해지는 경우가 많습니다.

같은 기기가 몇개나 장착되어 있는지, 해당 기기는 메모리의 어떤 PAGE에서만 구동이 되는지 등등

인터럽트 또는 BIOS 구동시 제약은 없는지 상당히 고려를 해야합니다.

예) 도스에서 DIR C: 라고 명령했을때,

    해당 드라이브는 누구의 디스크 인터페이스가 처리하는지,

    그 인터페이스는 어느 슬롯에 있는지 미리 다 알고 있어야 하겠죠?

    김준성님의 MPX 카트리지도 메모리맵 IO방식이라서,

    저의 MPXP 프로그램을 구동하면 먼저 MPX가 어느 슬롯에 존재하는지 검색하게됩니다.



IO맵 IO의 경우는 같은 IO 주소에 한개의 기기(물론 예외도 있습니다)만 존재해야합니다.

예) FM 사운드 칩의 경우, FM-PAC, MSX-AUDIO, MOON-SOUND, turboR PCM, PPI 1BIT Sound 등

    MSX에서 여러가지 사운드를 쓸수 있는데요. 모두 주소가 다릅니다.

    MOON-SOUND의 경우 비교적 레어 기기인 MSX-AUDIO를 대체하기 위해서 같은 주소를 쓰지만,

    이 경우엔 두개의 사운드 기기를 동시에 사용하는 것은 불가능합니다.


    

이런 각각의 장단점으로 있으니 대개 주변기기 구현시는 아래 사항이 고려되겠지요.

자주 액세스가 필요하고 슬롯같은 메모리 제한을 받지않고 쉽게 액세스 가능해야되지만,

시스템에는 하나만 있으면 충분한 기기의 경우는 IO맵 IO를 쓰게 됩니다.

예) 키보드, VDP의 경우 왠만한 SW는 자주 컨트롤할 필요성이 높죠?

    하지만 컴퓨터에는 하나만 있으면 충분한 경우입니다.

반대로 여러개의 기기를 동시에 사용가능해야 하는 경우는,

컨트롤시 메모리의 슬롯 제한이나 여러가지 불편하더라도 메모리맵 IO방식을 쓰게 됩니다.



그 외, 메모리맵 방식은 특성상 IO 메모리 영역을 비교적 넓게 쓸수 있지만,

이건 HW 만들기 나름이라 IO맵 IO방식도 가능합니다.

예) V9938 칩은 IO맵 IO방식으로 만들어져 있는데, (몇개의 Port로만 컨트롤합니다.)

   128KB의 VRAM을 R/W 가능하도록 되어있습니다.



그럼 실제로는 어떤 명령어를 써야 하는지 보겠습니다.



-메모리맵 방식으로 B000H 주소에 'K'를 출력하는 경우.

(참고로 'K'는 ASCII 코드로 문자 A의 값을 의미합니다.)



어셈블리의 경우,

LD A,'K' ; CPU 레지스터 A에 'K'문자 값을 넣음.

LD (0B000H),A ; 메모리 주소 B000H에 레지스터 A의 내용을 출력.



BASIC의 경우,

A = ASC("K") ; A 변수에 'K'문자 값을 넣음.

POKE &HB000,A ; 메모리 주소 B000H에 변수 A의 내용을 출력.



너무 간단한가요? ㅋ

물론, 주소에 데이터를 출력하기 전에 해당 슬롯이 전환되어 있어야합니다.



-IO맵 방식으로 20H 주소에 'K'를 출력하는 경우.

(참고로, 원래 Z80은 IO맵 IO 사용시 16비트 주소를 쓸 수 있지만, MSX는 하위 8비트만 사용합니다.)



어셈블리의 경우,

LD A,'K' ; CPU 레지스터 A에 'K'문자 값을 넣음.

OUT (020H),A ; IO 주소 20H에 레지스터 A의 내용을 출력.



BASIC의 경우,

A = ASC("K") ; A 변수에 'K'문자 값을 넣음.

OUT &H20,A ; IO 주소 B000H에 변수 A의 내용을 출력.



어셈블리/BASIC 명령어가 거의 똑같죠?

근데, 코드가 별로 가슴에 와닿지 않죠? ^^



자~ 그럼, 실제 MSX에 존재하는 하드웨어를 제어해봅시다.

키보드를 보면 대문자 선택을 나타내는 CAPS LED가 있죠?

MSX의 기본 인터럽트 서비스 루틴(보통 ISR이라고 합니다)이 동작하는 동안에는,

메인 BIOS가 키의 상태를 주기적으로 스캔해서 저장해놓는데요,

이 때 CAPS LOCK 키가 눌러지면 CAPS LED를 켜고 끄는 일도 합니다.

이걸 수동으로 한번 해보는거에요.



그냥 LED만 켜고 끄면 재미없으니, PPI의 1BIT 사운드를 같이 ON/OFF하면서 소리도 들어봅시다.

MSX의 키보드와 1BIT 사운드 하드웨어는 8255라는 병렬 포트 칩으로 컨트롤하게 되어있습니다.

회로도를 보면서 설명해도 좋겠습니다만, 일단 실습부터 해보죠.



여기서 8255는 IO맵 방식으로 컨트롤하는데 AAH 주소에 값을 쓰게 되면,

키보드 신호 셀렉트, CAPS LED, 1BIT SOUND, 카세트 출력을 한번에 조작할 수 있습니다.

데이터는 아래처럼 사용할 수 있는데요.

비트0-3: 키보드 매트릭스의 ROW 선택

비트4: 카세트 모터 0:ON, 1:OFF

비트5: 카세트 출력 0:LOW, 1:HIGH

비트6: CAPS LED 0:ON, 1:OFF

비트7: 1BIT 사운드 출력 0:LOW, 1:HIGH



여기서 비트7,6을 한번에 바꿔서, 사운드 출력 주파수에 맞춰 LED가 반짝이도록 합니다.

카세트 포트도 바꿔주면 카세트 출력도 함께되겠지만 일단 비트7,6만 바꿔봅니다.

BASIC에서 아래 프로그램을 실행해보세요.



10 FOR L=0 TO 20

20 OUT &HAA,&B00110000

30 FOR I=0 TO L:NEXT

40 OUT &HAA,&B11110000

50 FOR I=0 TO L:NEXT

60 NEXT:GOTO 10



터보알 고속모드에서는 10 FOR L=0 TO 70 으로 하고 실행해보세요.

쀼~웅~ 소리와 함께 CAPS LED가 반짝이는 것을 볼수 있습니다.


위의 예처럼 간단한 하드웨어는, IO맵 방식으로 만들면 쉽게 조작할수 있습니다.

하지만 주소 공간이 256개 뿐이라 MSX에서는 이미 많은 주소가 할당(예약)되어 있지요.

궁금하신 분은 아래 싸이트에서 IO맵을 확인할 수 있습니다.

http://map.grauw.nl/resources/msx_io_ports.php



메모리맵 IO는 선택된 슬롯에서만 동작하니까, 다른 기기의 IO 주소가 겹칠수가 없겠죠.

MPXP 같은 메모리맵 IO로 된 기기를 두개를 장착하면,

두개의 MP3 파일을 동시에 소리나게 할수도 있겠습니다.


2010년 4월 27일 화요일

[강좌] 01. MSX의 슬롯과 메모리 공간

슬롯이라고 얘기하면, 보통 롬팩 꽂는 부분을 떠올리는데요.

여기서는 좀 더 MSX적인 개념의 슬롯(SLOT)을 설명하려고 합니다.



먼저 슬롯을 설명하기 전에 Z80 CPU와 MSX 컴퓨터의 기본 구조를 아셔야하는데요.

(왠지 설명이 길어질듯 한 예감이... ㅎ.ㅎ;)



Z80 CPU는 어드레스 버스가 16BIT이고 데이터 버스는 8BIT로 이루어져있습니다.

결국 0000H~FFFFH 총 64KB 영역의 메모리 공간을 액세스할수 있고,

데이터는 1Byte씩 Read/Write 하도록 되어 있습니다.

(참고로 0000H는 16진수 0000을 의미합니다.)

하지만 마냥 빈 메모리와 CPU을 연결하는 것만으로는 컴퓨터로 사용할수가 없습니다.

SW가 있어야 하는 것이겠죠.



컴퓨터가 부팅되려면 부트로더 같은 프로그램이 필요합니다.

사용자의 프로그램을 외부 저장 장치(디스크, EPROM 등)에서 로딩할수 있는

기본 프로그램이 있어야하는 것이지요.



윈도 PC에서도 맨처음 전원을 켜면 롬바이오스가 구동되면서,

메모리, 그래픽 카드, HDD 등을 테스트하고,

최종적으로 HDD 부트 파티션의 부트 프로그램을 읽어서 실행하는 것을 볼수가 있죠.



이 역할을 MSX에서는 메인 BIOS가 해줍니다.

MSX를 맨 처음 켜면 CPU 어드레스 0000H~3FFFH에 매핑되도록 HW가 만들어져있습니다.

참고로 Z80은 리셋되면 어드레스 0000H부터 기계어 코드가 실행됩니다.

그 때문에 BIOS가 0000H~3FFFH로 매핑되는 것이죠.



자~ 이제 슬롯 설명 들어갑니다. 눈 크게 뜨세요. ㅋ

조금 전에 메인 BIOS가 0000H~3FFFH 주소에 매핑된다고 썼는데요.

이 '매핑'이라는게 뭘까요?



CPU의 주소공간 64KBytes에서 실시간으로 여러개의 프로그램을 전환하면서

구동할수 있도록 만든 규격이 슬롯(SLOT)이라는 것입니다.

보통 뱅킹(Banking)라고 부르는 것이 MSX의 슬롯과 비슷한 개념입니다.

(Banking이 생소하게 들린다면 그냥 Pass 하시고~)



MSX에서는 총 16개의 슬롯이 존재합니다.

각 슬롯은 CPU 주소 공간 0000H~FFFEH 까지 64KBytes를 쓸 수 있습니다.

(FFFFH의 1Byte 메모리는 나중에 설명 나올겁니다요~)

여기서 어떤 매핑이라는 과정을 통해, 16개의 서로 다른 프로그램으로 전환하는데,

이 매핑을 슬롯 전환이라고 합니다.

당연한 것이지만, 슬롯 전환하기 전에 각 슬롯에는 SW가 존재해야 되겠죠?



해당 슬롯이 DRAM 같은 쓰기 가능한 메모리가 있다면,

부팅후 외부 기기에서 SW를 로딩할수가 있습니다.

만약 ROM으로 된 SW(롬팩)라면 슬롯에 꽂는 것 만으로 로딩이 끝납니다.



MSX 전원이 켜진 직후에는 BIOS의 슬롯이 최초 선택되어 실행이 됩니다.

그러면, BIOS 프로그램이 각 슬롯에 프로그램이 있는지, 램이 있는지...

램이라면 크기는 얼마인지 주욱 체크를 하게 되지요.

그리고 프로그램이 있는 슬롯은 초기화 루틴이 각각 실행되게 됩니다.



총 16개의 슬롯이 있다고 했는데요.

각 슬롯의 이름은 0번 부터 15번으로 된게 아니라,

슬롯0-0, 0-1, 0-2, 0-3, 1-0, 1-1, ... , 3-2, 3-3 이런식으로 되어있습니다.

(슬롯0.0, 0.1, ... , 3.2, 3.3 또는 슬롯00, 01, ... , 32, 33 이렇게도 씁니다.)

두자리 숫자 중 왼쪽은 '기본슬롯', 오른쪽은 '확장슬롯'을 나타내는데요.

일단은 그냥 외우세요. 확장슬롯은 조금 후에 설명드릴께요.

암튼 프로그램이 실행되는 슬롯은 총 16개라고만 이해하시면 됩니다. ^^



여기서 슬롯0(또는 슬롯0-0)에는 메인 BIOS가 들어가게 되고요.

나머지 슬롯은 순서 상관없이 프로그램이 들어가면 됩니다.

참고로, 디스크 드라이브의 롬은 초기화 순서에 따라 드라이브 명이 결정됩니다.



부팅 후, 메인 BIOS가 램 슬롯을 인식하고,

각 슬롯의 프로그램 초기화(INIT) 루틴을 실행한 후에는 BASIC 모드로 가게 됩니다.

이게 일반적인 경우이고요.



게임팩을 꽂을 경우는, 대게 초기화 루틴에서 바로 게임 SW가 실행되도록 되어있어서.

FDD같은 기기가 연결되어 있더라도 인식이 안되는 경우가 많습니다.



그럼 슬롯 전환 되면서 각 슬롯의 SW가 어떻게 구동이 될까요.

일단 간단하게 생각을 해보죠.

첫 부팅시, 슬롯 상태는 메인 BIOS가 차지하고 있습니다.

이 BIOS가 각 슬롯의 프로그램과 메모리를 확인한다고 했죠?



예를 들어 슬롯0의 BIOS 프로그램이 슬롯1을 확인하려면?

슬롯 전환을 해야하는데, 슬롯이라는게 CPU의 메모리 공간을 의미하니까...

64KBytes 전체 주소가 몽땅 다른 슬롯으로 바뀌면

현재 실행중인 프로그램은 어떻게 되는걸까요?

만약 CPU의 PC(Program Counter: 실행중인 CPU 주소)가 슬롯0의 2000H인데,

슬롯1의 2000H에는 어떤 코드가 들어있을지 모르겠죠?

당연히 슬롯이 0->1로 전환되면 프로그램이 제대로 실행이 안됩니다.



그래서, 뭔가 다른 구조가 더 필요한데요.

MSX에서는 CPU 메모리 공간(64KBytes)을 4조각(16KBytes)으로 나누어서,

슬롯 전환을 하도록 했습니다. 그러니까 16KBytes만큼만 슬롯 전환이 된다는 말이죠.

여기서 페이지(PAGE)라는 말을 쓰게 되는데요.

페이지는 16KBytes 크기의 영역을 의미하고, 각 페이지는 아래처럼 정의되어 있습니다.

 페이지0: 0000H~3FFFH

 페이지1: 4000H~7FFFH

 페이지2: 8000H~BFFFH

 페이지3: C000H~FFFFH



뭔가 감이 오시나요?

좀 전에 CPU 메모리 공간이 몽땅 슬롯 전환이 되면,

실행중인 프로그램은 처리가 곤란하지만, 메모리를 쪼개면 가능하게 됩니다.



MSX의 메인 BIOS는 슬롯0에 있는 16KBytes 프로그램인데요,

첫 부팅시는 페이지0,1,2,3이 모두 슬롯0이 됩니다.

하지만 BIOS 초기화 프로그램이 수행되면서,

먼저 페이지2,3을 RAM이 존재하는 슬롯으로 전환하고,

페이지1은 각 슬롯으로 전환되면서 해당 SW의 초기화 루틴이 실행됩니다. 

만약 슬롯1의 프로그램이 초기화 될때는 아래 처럼 슬롯 전환이 되겠지요.

램은 슬롯3에 있는 MSX라고 가정하면...

 페이지0: 슬롯0 메인 BIOS

 페이지1: 슬롯1 프로그램

 페이지2: 슬롯3 RAM

 페이지3: 슬롯3 RAM

(만약 16KB램만 내장된 저사양의 MSX1인 경우는 페이지2는 램으로 전환이 안되겠지요.)



참고로 일반적인 16KBytes(128Kb) 게임 롬팩을 슬롯1에 꽂았을 때에도,

위의 페이지의 슬롯 설정데로 똑같이 동작합니다.

대신 메인 BIOS는 슬롯1의 초기화 루틴 실행 후, 다시 복귀되지 않습니다.

롬팩게임은 프로그램 종료라는 개념이 없습니다.

(나중에 BASIC에서 시작/종료가 가능한 게임롬을 하나 만들어봅시다. ^^)



슬롯에 SW가 들어갈때엔,

메모리 주소가 4000H부터 시작해야한다는 규격이 있습니다.

MSX는 기본적으로 페이지0을 메인 BIOS로, 페이지3을 램으로 세팅하게 되어있습니다.

이때 확장 SW는 기본적으로 페이지1을 쓰도록 되어있는데,

용량이 더 필요한 경우, 페이지2 또는 0도 쓸수가 있죠.



일반적인 게임 롬팩을 예로 들면,

16KB 롬팩은 페이지1만 쓰이고, 32KB 롬팩은 페이지1,2를 씁니다.

당연히 페이지0는 BIOS, 페이지3은 RAM이고요.



참고로 슬롯의 SW는 초기화 루틴, BASIC 명령어 해석 루틴 등 규격이 정해져있습니다.

아마도 다른 강좌(?)에서 설명이 되지 않을까요. ^^



이제 MSX 슬롯과 CPU 메모리 공간에 대한 개념이 잡히시나요?

그럼, 확장 슬롯에 대해 설명드릴께요.

처음에 MSX의 슬롯은 16개가 있다고 했죠?

근데 실제 HW 구조적으로는 4개의 기본 슬롯이 먼저 존재하고,

확장 슬롯이라는 기기를 기본 슬롯에 장착하도록 되어있습니다.

여기서 확장슬롯은 최대 4개의 슬롯을 가질수 있고,

확장슬롯이 장착되면 해당 기본슬롯은 약간 의미가 없어집니다.

예를 들어 기본슬롯1에 확장슬롯 기기가 연결된다면,

그 순간 슬롯1은 없어지고, 슬롯1-0, 슬롯1-1, 슬롯1-2, 슬롯1-3이 생기는 것이지요.



이렇게 기본/확장 슬롯으로 나누어 놓으면...

슬롯이 많이 필요없는 MSX 모델을 만들때, 슬롯 전환에 쓰이는 I/O 칩을 줄일수가 있으니까

MSX 본체 제작 단가를 좀 낮출수가 있겠지요.



슬롯 전환 방법은 기본/확장슬롯에 따라 I/O가 조금 다른데 요건 다음 기회에 알려드릴께요.

기억 하실 것은, 확장 슬롯은 기본 슬롯 커넥터에만 꽂을 수 있다는 것입니다.

보통 본체에서 외부로 노출되어 있는 슬롯은 기본슬롯이라고 보시면 무방하고요.



암튼 기본 슬롯만 장착하면(대부분 MSX1의 경우),

i8255 칩 하나 만으로 4개의 기본 슬롯 처리가 가능하기 때문에 쉽게 MSX1을 만들수 있습니다.



그럼, 대우 IQ-1000(MSX1)의 슬롯 맵을 보겠습니다.



슬롯0 : 0000H~7FFFH 메인 BIOS / BASIC (32KB)

        8000H~9FFFH 한글 SW (8KB)

슬롯1 : 본체 상단 커넥터

슬롯2 : 0000H~FFFFH RAM (64KB)

슬롯3 : 본체 후면 커넥터



여기서 보면 눈치채셨겠지만,

메인 BIOS와 BASIC 인터프리터가 합해쳐서 32KB를 차지하고 있다는 것을 알수 있습니다.

BASIC 롬은 MSX 기본 내장이니까 별도 슬롯을 이용하는게 아니라,

BIOS와 함께 슬롯0에 들어가있습니다.

특이한 것은 한글 SW가 별도 슬롯이 아닌 슬롯0의 8000H~9FFFH 영역에 있다는 것인데,

이건 SW 만드는 사람 마음이겠죠.

확장슬롯을 안쓰고 여러개의 SW 구겨넣는(?) 것도 기술이라고 해야될까요? ^^



이번엔 대우 IQ-2000(MSX2)의 슬롯 맵을 한번 보겠습니다.



슬롯0-0 : 0000H~7FFFH 메인 BIOS / BASIC (32KB)

슬롯0-1 : 4000H~BFFFH 한글 SW (32KB)

슬롯0-2 : 0000H~FFFFH RAM (128KB)

슬롯0-3 : 0000H~7FFFH 확장 BIOS / BASIC (32KB)

슬롯1   : 본체 상단 커넥터

슬롯2   : 커넥터 없음

슬롯3   : 본체 후면 커넥터



슬롯0이 없고 확장된 슬롯 4개가 보이는군요.

MSX2는 MSX1에 비해 BIOS 루틴과 BASIC 명령어들이 추가되어 있습니다.

IQ-2000의 한글 루틴도 IQ-1000에 비해 많이 늘어나있는걸 볼수 있고요.

슬롯0-2에 메인 RAM 128KB가 64KB 주소 공간에 매핑되어있는데,

이건 메모리 매퍼라는 것으로 다음 강좌에서 설명드리겠습니다.


2010년 4월 11일 일요일

파라동-4SLOT #2 보드 수정

얼마전 흥건남자님이 확장슬롯 보드를 만드셨는데요.

이게 PCB 그대로는 동작이 안되서 이리저리 에러난 곳을 찾아봤습니다.

 

몇군데 회로에서 빠진 부분을 래핑선으로 때우니 제대로 동작하네요. ㅎ.ㅎ

 

아래는 동작 모습과 보드 확대 사진입니다.

 테스트로 서브슬롯2에 MMC/SD V1, 서브슬롯3에 MMC/SD V2

매퍼램 1024KB는 서브슬롯0으로 선택해보았습니다.




아래는 보드 전면 사진입니다.

왼쪽 CPLD가 확장슬롯을 처리하고, 오른쪽 CPLD는 매퍼램을 처리합니다.

오른쪽 끝의 50핀 커넥터로 MSX의 슬롯으로 연결됩니다.




회로에서 누락된 부분을 수정한 곳입니다.

(SRAM의 5V 전원, /RD, /WR 세곳입니다.)




/RD, /WR은 74LS244 입력핀으로 끌어썼고,

4.7K 풀업 저항 빠진 부분은 74HC32에 연결했습니다.




보드 후면 사진입니다.




CPLD의 누락된 /WR, /RESET을 50핀 슬롯 커넥터에서 바로 연결하고,

매퍼램용 CPLD의 D5라인을 추가로 연결했습니다.

(요게 안되서 첨에 메모리가 512KB로 나오더군요. ㅋ)




제 터보알(내장램 1024KB)에서 구동해봤습니다. (후면 슬롯에 연결)

확장슬롯2-0에 램1024KB가 인식되어 총 2048KB 램으로 표시되는군요.




MMC/SD 부팅화면에서 인식된 슬롯번호를 볼수 있습니다.




DOS2로 부팅후 CHKMEM 프로그램을 실행해봤습니다.

슬롯 3-0과 슬롯 2-0에 램이 각각 1024KB로 인식되었습니다.




주말숙제(!)는 마쳤으니, 이제 바통을 흥건남자님께 넘깁니다. ㅎ.ㅎㅋ


PS. 사진 한장 더 추가합니다.

      보드와 MSX연결에 쓰이는 50핀 커넥터(카트리지)를 기존 제가 쓰던걸로 테스트했었는데...

      흥건남자님 주신걸로는 해보니 안되더군요.

      아침에 잠깐 확인해보니, 핀13과 핀14번이 연결되어있네요. ㅜ.ㅜ

      패턴 끊고 제대로 이으니깐 잘 됩니다요.

      이제 씻고 놀러갑니다~ ㅎ.ㅎ



2010년 3월 21일 일요일

paraMSX_Linux & RS-232C - 키보드 사운드

지난번 보여드린 TV 내장의 리눅스용으로 포팅된 paraMSX 활용을 위한,

터보알의 키보드 및 사운드(PSG)를 연결해보았습니다.

 

에뮬레이터와 터보알 실기 간의 연결은 RS-232C 카트리지를 썼습니다.

속도는 115200BPS 상태이고요.

 

에뮬레이터에서 PSG Port 출력은 터보알에서 시리얼로 받아 실제 PSG을 구동하고,

반대로 터보알의 키보드 포트 입력은 시리얼로 전달해서 에뮬레이터가 동작하는 형태입니다.

 

결국 키보드와 PSG 사운드 IO만 서로간의 전송이 되고,

나머지 VDP, CPU등 대부분 기능은 에뮬레이터에서 구현됩니다.

 

아래 동작하는 영상을 한번 보세요.

사운드랑 키보드 IO를 넣으니까 에뮬 구동 속도가 좀 떨어지는군요.

 

사운드를 안쓴다면 에뮬의 CPU클럭을 높여서 고속 MSX 에뮬하는 것도 재밌을것 같네요.




2010년 3월 1일 월요일

RS-232C 용 LPT 드라이버 제작

삼일절 기념으로 약간의 코딩이 들어갔습니다.

두 아들은 자고있습니다요. ㅎ.ㅎ

 

다 아시겠지만, MSX에는 프린터 포트가 준비되어있고,

관련된 루틴이 메인 BIOS에 들어가 있습니다.

 

이번엔 LPT 출력 훅을 고쳐서 프린터 대신 RS-232C TX를 사용하도록 해봤습니다.

그러니까, 도스에서 COPY PRN 이라던가 베이직에서 LPRINT 류의 명령을 시리얼로 출력하는 것이지요.

 

아래는 동작되는 모습을 찍은 것입니다.

구경하세용~

 

 

UARTLPT.COM 라는 간단한 드라이버를 만들었습니다.

물론 제가 만든 RS-232C 카트리지만 지원하고요.

Baud Rate는 선택가능합니다.

 

DOS에서 TYPE, ECHO 명령으로 PRN 으로 출력해봤습니다.




이번엔 BASIC 모드에서 LFILES, LLIST, LPRINT 명령을 사용해본 모습입니다.




아래는 윈도에서 시리얼 터미널에 출력된 모습입니다.




2010년 2월 28일 일요일

재미나 메가램 카드 사용자 매뉴얼

자료 정리하다보니, 재미나 램카드 매뉴얼 스캔 자료가 보이더군요.

아마도 Cronos님이 스캔한 자료로 기억합니다.


암튼 자료 보존 차원으로, 타이핑해서 PDF문서로 만들었습니다.

필요하신 분은 참고하시기를...


Zemina_MegaRAM_Card_Users_Manual.pdf


2010년 2월 21일 일요일

RS-232C 카트리지 만들기

즐거운(?) 주말을 맞아 작업중이던 RS-232C 카트리지를 완성했습니다.

 

속도는 115200BPS와 57600BPS 두가지만 지원합니다. ㅋ

포트는 한개밖에 없고요.

프로토콜도 한개만 지원합니다.

(Start 1Bit, Data 8Bit, No parity, Stop 1Bit)

 

아직 MSX 표준 232C BIOS는 미완입니다만, 차후 시간나면 만들어볼 예정입니다.

사실 I/O가 MSX 표준 232C랑 달라서 크게 의미는 없겠지만,

DOS에서 AUX 정도만 쓸수 있어도 괜찮지않을까 생각해봅니다용...

 

아래는 만들면서 찍어둔 사진인데 구경하세요.

마땅한 PCB를 구하기 힘들어서, 멀쩡한(?) 게임팩 하나 부셨습니다. 으흐..ㅎ

 

ALTERA CPLD인 EPM3064 한개와 232C 라인 드라이버 IC 하나가 사용되었습니다.

팩안에 잘 구겨넣기 위해 이리저리 궁리를 해봤는데, 결과는 아래를 보시면 됩니다용~~~


 

보드의 우측 상단부위를 잘라내고, 추가될 보드와 연결하기 위해 핀헤더 커넥터를 넣었습니다.

이렇게 해도 팩안에 들어가네요! 신기~ ㅎ.ㅎ




CPLD 보드가 합체된 모습입니다.






이렇게 만들면 팩 뚜껑이 닫힌다는 소중한(?) 경험을 얻게 되었습니다요.



 

완성된 모습입니다.

오른쪽 빈 자리에는 232C BIOS 또는 잡다 롬을 넣을 생각입니다.




콘덴서랑 어레이저항이 사이좋게 자리잡고 있네요.

아직 LED는 아무데도 연결되어있지 않습니다.

만들다가보니 CPLD 용량 문제로 일단 보류한 상태네요. ㅋ




뚜껑을 닫으면 이렇게 됩니다.

계속 보고있으니 조금 징그러운 느낌이... ㅡ.ㅡ




확장슬롯에 꽂은 모습입니다.

어쩌다보니 6개 슬롯이 다 찼네요. ㅎ.ㅎ




아래는 터보알에서 구동하는 모습을 동영상으로 찍은 것입니다.

현재 115200BPS로는 터보알에서만 제대로 사용이 가능합니다.

속도를 낮추면 일반 MSX2에서도 쓸수 있겠지요.

 

날림(?)으로 만든 시리얼 터미널 프로그램으로 윈도의 터미널과 동작하는 모습과,

시리얼로 ROM파일 전송받아서 실행하는 프로그램을 볼 수 있습니다.

 

마지막으로 제 모니터(LCD TV)의 리눅스에 로그인해서 paraMSX 를 구동하는 모습도 담아봤습니다.

그럼, 즐감하세용~~




2010년 1월 24일 일요일

paraMSX_Linux & RS-232C - MSX를 TV안에

제가 메인으로 쓰는 모니터가 원래 유럽향 DTV인데, 시스템이 리눅스로 구동되고 있습니다.

(이쪽에 관심 있으신 분은 아시겠지만, 요즘은 TV, 휴대폰 등 제품에도 리눅스가 많이 쓰이고 있습니다.)

참고로 CPU는 MIPS의 MIPS24kec 324MHz가 들어있습니다.


기존 MSX 에뮬레이터(paraMSX) 소스를 좀 고쳐서 리눅스(TV 내장)에서 실행될 수 있도록 해보았습니다.

윈도용 에뮬처럼 모든 기능이 동작하는 건 아니지만,

MSX1/2/2+ 기본 세팅과 V9958 에뮬까지는 제대로 되도록 해놨습니다.

에뮬 화면은 리눅스의 프레임버퍼에 올리고 있습니다.

배경에는 SCART RGB입력의 터보알 화면이 나오고 있고 그위에 오버레이 되는 것이지요.

바꿔말하면, 그냥 TV의 OSD 메뉴 대신 paraMSX가 뜨는거라고 생각하시면 됩니다. ㅋ

 

아래 동영상 한번 보세요.

LCD TV랑 노트북이 시리얼(RS-232C)로 연결되어있고, 터미널 상에서 에뮬을 실행시켰습니다.

에뮬에서 사운드가 안나오기 때문에, 대신 터보알님이 MP3 배경음악을 넣어주셨습니다요. ㅎ.ㅎㅋ




 

아래는 터미널 스크린샷입니다.

USB 메모리스틱을 마운트해서 쓰고 있습니다.




2010년 1월 16일 토요일

MMC/SD Drive V1,V2 - BIOS v4.03

Please, download new BIOS file.

(New MediaEncode is included.)


Download: MMCSD_BIOS_4.03_1.zip


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

    MMC/SD Drive v4.03 (16 Jan 2010)

        By Yeongman Seo (E-mail:sharksym@hitel.net)

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


* Updates


- BIOS v4.03

  Fixed minor bug regarding PCM.

  Changed MOV format.(Size changed from 112x68 to 112x96.)


- DISKMAN v3.04

  Removed WX/WSX Auto-Turbo ON during start-up.

  Fixed DSK Import problem in DOS1.

  Fixed FDD Imoprt problem in DOS1.


- FLASHMAN v1.10

  Reduced memory usage. Works in DOS1.


- MovEncode.exe v1.1

  Changed MOV format.(Size changed from 112x68 to 112x96.)


- MediaMan.exe v1.1

  Changed MOV format.(Size changed from 112x68 to 112x96.)


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



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

    MMC/SD Drive v4.03 (2010.01.16)

        By 서영만 (E-mail:sharksym@hitel.net)

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


* 개선 사항 v4.03


- BIOS v4.03

  PCM 22KHz 플레이시 CAPS LED 및 카세트 모터 켜지는 현상 수정.

  PCM 파일 길이 계산 오류 수정.

  PCM 플레이 시,

      CAPS OFF일때 해당 파일 플레이 후 정지.

      CAPS ON일때 정지하지 않고 모든 파일 플레이 함.

  동영상 포맷 교체

      112x68 12프레임 모드를 112x96 12프레임 모드로 바꿈.

      168x104 8프레임 모드는 그대로 유지.


- DISKMAN v3.04

  기동시, WX/WSX 터보 쓰는 기능 삭제. (R800 터보는 자동 ON)

  DOS1에서 DSK Import시 목록 안나오는 문제 수정.

  DOS1에서 FDD Import 에러로 종료되는 문제 수정.


- FLASHMAN v1.10

  메모리 사용량 줄임. DOS1에서 정상 동작됨.


- MovEncode.exe v1.1

  동영상 포맷 교체

      112x68 12프레임 모드를 112x96 12프레임 모드로 바꿈.

      168x104 8프레임 모드는 그대로 유지.


- MediaMan.exe v1.1

  동영상 포맷 교체

      112x68 12프레임 모드를 112x96 12프레임 모드로 바꿈.

      168x104 8프레임 모드는 그대로 유지.



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





2010년 1월 9일 토요일

MMC/SD Drive V1,V2 - CPC-300으로 동영상 플레이

주말을 맞아 동영상 플레이 하나 찍었습니다.

스크린8의 256컬러 비디오이고, 오디오는 터보알 PCM 출력호환의 8BIT DAC이 사용되었습니다.

 

아래는 DAC의 모습입니다.

작년 토즈 모임때에도 가져가서 OCM으로 데모했었지요. ㅎ.ㅎ




아래는 MSX2의 스크린8 모드로 인코딩된 "On Your Mark" 뮤직비디오입니다.

저작권 문제로 삭제될지도 모르니, 빨리 보세요. ㅎ.ㅎㅋ

 

소리가 좀 작게 녹음됐지만, 그럭저럭 들을만합니다.

참고로 전체적으로 샤~(윙~) 하는 소리는 파워 서플라이의 팬 소음인데용...

일부러 아이큐2000으로 플레이하는 걸 찍기 위해서 어쩔수가 없었습니다. ㅋ

 


PS. 동영상은 삭제했습니다. 지브리에서 저작권 관련으로 신고가 들어와서...ㅎ.ㅎ;;;;;