레이블이 __TechNote인 게시물을 표시합니다. 모든 게시물 표시
레이블이 __TechNote인 게시물을 표시합니다. 모든 게시물 표시

2024년 1월 14일 일요일

[강좌] 09. 같은 종류의 사운드 카드를 여러개 사용

확장슬롯에 사운드 카드를 주렁주렁 달아서 쓰는 분들이 꽤 있으실텐데요 ㅎ.ㅎ

이 때 기억해야 할 내용들을 조금 정리해보았습니다.


주변기기의 I/O는 메모리맵 I/O (Memory Mapped I/O) 또는 포트 I/O (Port Mapped I/O)를 사용합니다.

물론 둘을 함께 쓰는 경우도 있구요.



사운드를 I/O 종류로 나누어 보면 이렇습니다.


1. 메모리맵 I/O 전용


SCC/SCC-I

OPM (YM2151)

OPNB (YM2610)

MP3/WMA (MPX)


하나의 슬롯에 두개의 기기를 꽂을 수는 없으니, 기기간의 메모리 영역이 충돌하지 않습니다.

예를 들어 SCC-I 카트리지 4개를 확장슬롯에 몽땅 꽂아놓아도 각각 동작합니다.

이 기기들은 아무 생각없이 꽂아주시면 됩니다 ㅎ.ㅎ



2. 포트 I/O 전용


PSG (AY-3-8910, YM2149)

Secondary PSG

MSX-AUDIO (Y8950)

MSX-MUSIC (YM2413)

MIDI Saurus

MSX-MIDI (A1GT, µ-pack)

u8 PCM (turboR, Covox, MusicModule)

s16 PCM (MoonBase)

DCSG (SN76489AN)

WSG (T-Wave)

OPL4 (YMF278B)

OPNA (YM2608)


포트 주소가 충돌하면 기기에 문제가 생길 수 있으니, 기본적으로 한개만 쓰셔야합니다.

근데 여러개를 지원하는 기기들이 있으니 이건 따로 숙지해주세요!

이 기기들은 부팅 시, BIOS INIT 루틴에서 시스템에 존재하는 I/O포트를 검사 후 포트 주소를 바꿉니다.


2.1 MSX-AUDIO 카트리지를 2개 사용


파나소닉의 오리지널 MSX-AUDIO (FS-CA1) 카트리지에 한합니다.

첫번째 Y8950은 C0H,C1H 포트로 설정되고,

두번째 Y8950은 C2H,C3H 포트로 설정됩니다.


주의)

필립스, 도시바의 저가형 Y8950 카트리지는 포트 ON/OFF가 불가능하며 C0H, C1H 포트로 고정됩니다.

중복으로 사용하시면 안됩니다. '필립스랑 도시바랑 함께 쓰면 되나요?' 등의 질문은 하지마시구요ㅋ

물론 파나소닉의 MSX-AUDIO와 함께 쓰는 것은 가능합니다.

MoonBase + OPL4를 연결해서 MSX-AUDIO 모드를 쓰는 것도 가능하구요.

참고로, MoonBase도 FS-CA1와 동일한 방식으로 포트를 선택합니다.


2.3 MMC/SD Drive V4를 2개 사용


첫번째 V4의 DCSG는 49H, PCM은 91H 포트로 설정되고,

두번째 V4의 DCSG는 3FH, PCM은 0AH 포트로 설정됩니다.



3. 메모리맵 I/O와 포트 I/O 모두 사용


FMPAC만 이 구조를 사용하는 것으로 알고있는데요. 혹시 더 있는지 모르겠네요 ㅎ.ㅎ


FMPAC은 PAC(SRAM 카트리지)에 FM 사운드(OPLL)가 추가된 기기인데요.

이 카트리지는 기본적으로 메모리맵 I/O로 OPLL 칩이 동작합니다.

만약 포트 I/O로 사용하고 싶다면, 스위치(메모리맵 I/O의 7FF6H에 있습니다)를 따로 켜야합니다.

본체 내장된 MSX-MUSIC은 메모리맵 I/O 없이, 항상 포트 I/O 모드로 동작합니다.

당연히 S/W를 만드는 입장에서는 FMPAC을 포트 I/O 모드로 쓰는게 편하겠죠?


그럼 여기서 의문이 하나 떠오를겁니다...

본체에 FMPAC을 여러개 꽂거나, MSX-MUSIC이 내장된 본체에 FMPAC을 추가하면 어떻게 될까요?


3.1 FMPAC을 여러개 꽂는 경우


각 슬롯의 메모리맵 I/O를 통해 각 OPLL을 따로 구동가능합니다.

일부 데모 프로그램에서 이렇게 사용하는 것으로 알려져있어요.

그 외 일반 프로그램에서는,

우선순위가 높은 슬롯의 FMPAC 한개에서만 사운드가 출력되고, 두번째 FMPAC은 PAC처럼 동작하게 됩니다.


3.2 MSX-MUSIC이 내장된 본체에 FMPAC을 꽂는 경우


FM 사운드는 본체의 OPLL에서 소리가 출력되며, FMPAC은 PAC처럼 동작하게 됩니다.


만약 본체의 MSX-MUSIC 슬롯보다 FMPAC 슬롯의 우선순위가 높다면, FMPAC의 포트 I/O 모드가 켜질 수 있습니다.

그러면 FMPAC의 OPLL과 본체의 OPLL이 동시에 동작하는 현상이 발생합니다.

두 칩에서 소리가 중복으로 출력되면, PSG와 FM밸런스가 무너지니까 이렇게 쓰시면 안됩니다요.

그리고 두 칩의 출력이 완벽하게 같지않을테니, FM 소리도 좀 이상할거에요.


참고로, 산요 MSX2+ 기종을 보면 SLOT 3쪽에 내장 MSX-MUSIC이 배치되어있는데, 그닥 좋은 설계는 아니라고 봅니다.


주의)

본체 내장형 MSX-MUSIC을 카트리지로 만든 기기를 쓰시는 분들이 많은데요. 알고계시면 좋습니다.

오래전 유럽에서 만들어진 FM-PAK이라는게 있습니다. 국산으로는 재미나 뮤직박스도 있었구요.

MSX-MUSIC이 없는 본체에 꽂아서, MSX-MUSIC 내장형 본체처럼 만들어주는 기기인데요.

2000년 이후 지금까지도 클론 카트리지가 꽤 제작이 된 걸로 알고 있습니다.

이 카트리지는 본체에 한개만 꽂으셔야 합니다!


그리고, FM-PAK과 FMPAC을 함께 쓰는 경우는 FMPAC을 우선순위가 낮은 슬롯에 꽂으면 됩니다.

뭐, 애초에 FM-PAK을 꽂지 않으면 문제가 생길 여지도 없겠지만요 ㅎ.ㅎ

만약 본체를 개조해서 FM-PAK (또는 클론)을 내장하는 경우는, 가능한 우선순위가 높은 슬롯에 장착해야합니다.

그냥 SLOT 0-X에 넣는다고 생각하심 되겠습니다요~



쓰다보니 FMPAC 얘기가 길어졌는데, 하나만 더 추가해봅니다 ㅎ.ㅎ

앞의 3.1, 3.2에서 OPLL 칩이 중복으로 장착되더라도 소리는 하나만 출력되니 괜찮다고 설명드렸는데요.

이건 정상적(ㅋ)으로 만든 S/W를 사용하는 경우이고, 늘 그렇지만 예외가 있습니다.


마이크로캐빈에서 만든 게임에서는 OPLL 칩들이 동시에 출력되는 문제가 존재합니다.

XAK, XAK2, 프린세스메이커, 프레이, 환영도시 정도만 테스트해봤는데 모두 같은 문제가 있네요.

(심지어 터보알 전용 게임도 이렇게 해놨...ㅋ)

일단 '마이크로캐빈' 이름을 기억해주세요!


타사의 게임들은 별 문제없었습니다. 테스트해본 것들은 적어보면,

알레스트, 알레스트2, 레이독2, 삼국지2, 신장의야망(전국군웅전),

피드백, 팩매니아, 퀸플, 테트리스, 파이어호크, 싸이코월드, 파이널판타지

이 정도가 되겠습니다.


조금 특이한 게임은 '드래곤슬레이어6'였는데요.

요놈은 아시다시피 SRAM 세이브를 지원하지만, PAC은 인식불가이고 FMPAC만 가능한데요.

아마 FMPAC 체크 루틴과 FM 사운드(OPLL) 초기화 루틴을 섞다가 꼬인건지...

암튼 이 게임에서도 두개의 OPLL에서 동시에 소리가 출력됩니다. 참고하세요.


그럼, 즐거운 일요일 되셔요~ ㅎ.ㅎ


2022년 5월 20일 금요일

[WIN] 2HD 디스켓을 2DD로 포맷하기

4년(?)마다 돌아오는 재방송 시간입니다~ ㅎ.ㅎ/

이미 잘 알고계시는 내용이겠지만, 재방송도 가끔은 재밌으니 한번 봐주세요~


2DD 디스켓은 생산이 중단된지 오래되어서, 대신 2HD 디스켓을 많이 사용하시는데요.

저도 마찬가지입니다요~ㅎ



그럼, 본론으로 넘어갑니다.


2HD 디스켓을 준비합니다.

안쓰는 놈을 하나 골랐습니다. 오래되서 배드섹터도 몇개 있어요ㅋ





외장형 USB FDD에 디스켓을 넣고, 윈도에서 '명령 프롬프트'를 열어봅니다.

CHKDSK로 현재 디스크가 1.44MB의 정상적인 2HD 디스크임을 알 수 있습니다.

디스켓의 우측 2HD 인식 용 홀을 막으면 2DD로 포맷할 수 있는데요.

이 때 "FORMAT A: /T:80 /N:9" 명령을 사용합니다.

아래 스샷은 순서대로 진행한 모습입니다.





윈도에서는 720KB 용량의 정상적인 2DD 디스크로 표시가 되었는데,

이게 MSX에서도 인식이 잘 될까요?

GT에 한번 넣어봅니다. 잘 인식이 되네요! (당연한 얘기를...ㅋ)





그럼, 디스크가 잘 기록되는지 테스트도 해볼까요?

COPY720 프로그램으로 YS1_K.DSK 이미지를 씁니다.





MMC/SD를 뽑고 디스켓으로 부팅해봅니다.

이스가 잘 실행되네요!





보너스로 스샷 한장 더 찍어봅니다.

paraMSX 에뮬에서는 PC의 FDD를 직접 읽을 수 있습니다.

실기에서 기록했던 이스 디스켓을 아래처럼 paraMSX로 구동이 가능합니다.





그럼, 이만~~


.

.

.

FAQ 하나만 적고 갈께요 ㅎ.ㅎ


Q: 저는 윈도XXX에서 2DD를 FORMAT하면 에러가 나오는데, 왜 그럴까요?

A: 쓰시는 FDD 또는 디스켓이 불량입니다.


-끝-


2021년 11월 10일 수요일

[WIN] 여러개의 DSK 파일을 간단히 합치는 방법

여러개의 DSK 파일들을 에뮬 또는 MMC/SD 등에서 사용하기 위해,

하나의 파일로 합쳐야하는 경우가 생기는데요.


방법은 여러가지가 있겠지만,

이번에는 배치파일과 윈도의 보내기(Send To) 기능을 활용해보아요~ ㅎ.ㅎ


먼저 파일을 합치는 BAT 파일을 받으세요.

Download: File Combine.zip


배치파일 내용은 이렇습니다.

제가 대충 만든거니까 맘에 안드시면 수정해서 쓰세요ㅋ





배치파일을 윈도의 GUI와 연동해서 쓰는 가장 쉬운 방법은

보내기(Send To) 기능을 쓰는건데요.


윈도10의 경우는 아래 폴더에 배치파일을 넣으면 되겠습니다.

배치파일 원본을 넣어도 되고, 바로가기 링크를 넣어도 됩니다.

C:\Users\계정이름\AppData\Roaming\Microsoft\Windows\SendTo





DSK 파일들의 이름을 잘 정리해서, 탐색기에서도 순서가 정렬되도록 해줍니다.





여기가 가장 중요합니다! 잘 보세요ㅋ

DSK 파일들을 모두 선택 후,

첫번째 DSK파일에서 마우스 우클릭으로 팝업메뉴를 띄웁니다.

배치파일에 파일명을 전달하는 순서때문에 이렇게 해야됩니다!

뭐, 파일명을 자동으로 정렬하는 기능을 넣을 수도 있겠지만...

스크립트를 복잡하게 만드는게 귀찮으니 그냥 이렇게 합시다~





CMD 창이 열리면서 작업이 수행됩니다.

COMBINE.OUT 파일을 생성하고, DSK 파일을 하나씩 붙이는거라 금방 끝나요.





작업이 완료되면 COMBINE.OUT 파일명을 적당히 바꿔서 쓰시면 되겠습니다.





흐... 배치파일 만드는 것 보다 글 쓰는게 더 귀찮네요.


.

.

.



근데 "어? 나는 구버전 윈도 쓰는데, 가능할까요?" 물어보실까봐

VM으로 윈도2000에서도 테스트해봤습니다.


윈도2000의 보내기 폴더의 위치는 아래처럼 나와요.

여기에 배치파일을 넣으면 됩니다.

C:\Documents and Settings\계정이름\SendTo


실행방법은 똑같습니다. 스샷 구경하셔요~







그럼, 즐거운 윈도 + MSX 생활하셔요~ ㅎ.ㅎ/~


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년 5월 9일 일요일

와이드(16:9) 모니터의 활용

MSX 디스플레이의 기본 출력은 240p입니다.

전체 262라인 중 240라인을 사용하게 됩니다.

물론 MSX의 문자/그림이 표시되는 영역은 스크린 모드에 따라 192라인/212라인이죠.


만약 사용하는 모니터가 16:9 비율이라면, 화면비 설정을 4:3으로 두고 사용하실텐데요.


아래는 스크린1로 부팅된 BASIC 화면입니다.

LCD 모니터에서 출력된 모습이고, 오버스캔이 없는 상태의 240p 화면입니다.

사실 오버스캔은 CRT에서 쓰이는 용어라서 100% 정확한 표현은 아닙니다만,

대충 의미만 떠올리시면 되겠습니다요~





70,80년대에 쓰였던 AV 모니터(CRT)들은 약 10% 전후의 오버스캔으로 설정되어있습니다.

PC 용으로 쓰인 모니터들은 화면의 폭과 높이를 따로 조절할 수 있는 경우가 대부분이었구요.


오버스캔 10% 일때는 아래 사진과 유사하게 나옵니다.




BIOS의 스크린1 기본 WIDTH가 29로 되어있는 이유는 위의 사진을 보시면 금방 아시겠죠?

모니터 제품에 따라 화면 위치의 편차가 있으니까,

WIDTH 32로 꽉 채우면 좌측 또는 우측의 글자가 잘리는(보이지않는) 현상이 생길 수 있습니다.


아래 사진처럼 오버스캔을 17%로 과하게 설정하면 좌우가 잘리는 모습을 볼 수 있어요.





참고로, 요즘 TV 또는 AV 모니터는 기본 오버스캔이 3% ~ 7% 정도가 됩니다.

80년대 삼성에서 오버스캔을 조금 낮춘 TV를 팔면서 선전을 크게 했던 기억도 나네요.

광고가 '숨어있는 1인치를 찾아서'이었나... 그랬죠ㅋ



그럼, 본론으로 넘어갑시다요~


수평 라인수에 맞춰서 화면을 오버스캔으로 늘리면, 화면을 크게 볼 수 있으니 좋겠죠?

마냥 오버스캔을 늘리면, 가로 사이즈가 디스플레이 크기를 넘어가니 사용이 불가능해집니다.

MSX2의 VDP ADJUST 기능으로 가로 스크롤을 구현한 게임이라면 더 많이 잘려나가겠네요.


그래서,

오버스캔 설정을 그대로 두고, 화면을 줌인 해주는 기능을 설정해보아요.


아래는 줌 17% 상태입니다.

조금 위에서 본 오버스캔 17%에서 잘렸던 좌우 영역이 아래 화면에서는 잘 보이시죠?




이 상태에서 보여지는 화면비율은 4:3 아닌 14:9 정도가 됩니다.

화면이 17% 확대가 되니까...

17인치 와이드 모니터에서 보면, 20인치 모니터에서 보는 것처럼 되는거겠죠.



그럼, 실제 세팅은 어느정도가 좋을까요?

MSX2의 비트맵 모드는 212라인을 쓰니까, 줌 10%를 적용하면 되겠구요.

V9938/V9958의 오버스캔 트릭모드를 쓸때는 240p 전체 출력이 필요하니 줌을 꺼야겠죠.


아래는 실제 화면에서 적용된 모습입니다.

스크린5의 212라인 및 스크린2의 192라인을 쓰는 게임이네요.





아래는 스크린7의 인터레이스 424라인을 쓰는 M 파일매니저의 모습입니다.

위아래 꽉찬 화면이네요.





아래는 오버스캔 트릭모드를 사용하는 ASO REMAKE입니다.

줌을 해제하고 240라인을 모두 표시하고 있어요.





결론:

사용하시는 모니터가 와이드 비율이라면,

모니터의 오버스캔 또는 줌 설정을 적당히 맞춰서 쓰시면 되겠습니다.


.

.

.

.


하... 글 쓰고 보니 또 현타가...


사실 이 글을 쓰게 된 이유가 있는데요ㅋ

십년 넘게 잘 쓰던 32인치 모니터가 맛이 가는 바람에 ㅠ.ㅠ

구닥다리 17인치 모니터를 써야 할 상황이 되었습니니다요~





예전 2009년 모임 때 이 모니터를 갖고 갔었는데, 아마 기억하시는 분도 계시겠네요.

아래는 그 모임의 사진입니다~ (모니터 뒷통수가~ ㅎ.ㅎ)





한줄 요약: 갑자기 작은 화면을 보니 답답해서, 모니터에 ZOOM 모드 두개를 사용!


그럼, 즐 MSX하셔요~ ㅎ.ㅎ


2019년 12월 3일 화요일

[강좌] 07. MSX 기본사양

오랜만에 [강좌]글을 적어봅니다.

제목은 [강좌]지만... 절반은 잡담이니 참고하셔요~ ㅎ.ㅎ





07. MSX 기본사양


[서론 aka 잡담]


요즘에도 MSX를 쓰시나요?


저는 국딩시절 학교와 학원에서 아이큐1000을 주로 만졌습니다.

디스플레이는 잔상이 멋지구리하게 남는 그린모니터가 주류였습니다.

6학년 때가 되어, 아이큐2000 + RGB모니터 + 3.5"FDD 최강(!)의 사양으로 MSX가 집에 들어왔습니다. ㅎ.ㅎ


95년부터는 fMSX 에뮬레이터가 등장하면서 MSX2+를 간접적(?)으로 쓸 수 있었습니다.

(고딩 때 친구집에서 본 A1-WSX가 아직도 기억에 생생하네요. 그 때는 MSX 오타인가...했었지만요ㅋ)

나중에 fMSX 기반으로 paraMSX 에뮬를 만들어서 입맛에 맞게 잼나게 즐겼구요.


자연스레 실기 MSX에서 한동안 멀어졌는데...

갑자기 MSX2+ 실기를 한번 써보고싶더라구요.

그 때가 첫 회사에 들어와서 기숙사에 살던 때였습니다. 2001년 경

기숙사 사진도 한장 올려봅니다. 소니 디카(FDD 내장ㅋ)로 찍었던 640 x 480 사진입니다요~





MSX2+ 기종은 종류가 몇개 없는데, 파나소닉의 FS-A1WSX 기종이 S-Video 출력이 가능해서 요걸로 골랐습니다.

램도 512KB로 늘리고 DOS2 카트리지도 만들고, 플래쉬롬팩도 만들어서 쓰다보니... 결론이 나오더군요.

--> 정답은 GT


아마 2003년으로 기억합니다. 옥션에 A1GT가 올라온걸 바로 구매했었지요.

당시에는 주로 ebay랑 옥션만 사용했습니다.

야후 재팬 옥션은 나중에서야 구매대행으로 몇번 이용했었네요.


GT의 빠른 속도를 쓸 수 있게되니, 점점 더 욕심은 커져만가고~ ㅎ.ㅎ

빠른 디스크드라이브를 위해 MMC Disk interface를 만들었구요.

나중에는 MMC/SD Drive로 개명하게 되어서, 지금은 이걸 MMC/SD Drive V1으로 부르고 있습니다.





그 후, 준성님의 MPX 카트리지, 필립스 Music Module (MSX-AUDIO), 선라이즈 MoonSound 순으로...

저의 MSX 주변기기 사양은 점점 높아져갑니다.


.

.

.


제가 이런 잡다한 얘기를 왜 꺼냈냐면요.

요즘들어 MSX를 사용하시는 분들이 모두 저와 같진 않을꺼라는 생각이 들더라구요.


파라동 게시판에 올라오는 글을 볼 때도 그렇고, 정모에서 이런저런 얘기를 나눠보면...

80년대 아이큐1000/2000 잠깐 쓴 후 한동안 MSX를 끊었다가 (혹은 MSX를 친구집에서만 접했다가)

21세기로 넘어와서 뭔가 좀 오버스러운 MSX 사양으로 다시 접하게 되는거지요.

뭔가 히스토리를 건너뛰다보니 국민학교에서 대학교로 바로 간 느낌?

아닌가요? 그냥 저의 느낌일뿐...일지도요. ㅎ.ㅎ


그래서 기본 정리를 좀 해보려고 합니다.

MSX를 처음 접하시는 분들께도 도움이 될 듯 합니다요~~



[본론]


MSX 기본 사양(specifications)을 먼저 알아보겠습니다.

기본은 말 그대로 "필수 (Mendatory)"인 사양을 의미합니다.

이 부분이 부족하면 그냥 MSX 표준은 아닌거에요.

그리고, 옵션 사양은 추가 가능한 부분을 의미합니다.


버전은 MSX1, MSX2, MSX2+, MSX turbo R 4개가 나와있습니다. 곧 turboR 30주년이 ㅠ.ㅠ

MSX turboR의 경우는 표기법이 애매해서,

MSXturboR, MSX turbo R, MSX TurboR 등으로 여러가지 모양이 있으니 참고하세요.



1. MSX1


CPU    = Z80 3.579545MHz 호환

RAM    = 8KB

ROM    = Main BIOS 32KB

VDP    = TMS9918A 60Hz 또는 TMS9929A 50Hz

VRAM   = 16KB

PSG    = AY-3-8910 호환

카세트 = 카세트 1200/2400bps

키보드 = 영문 + (옵션: 일어/한글/러시아/유럽 문자)

외부슬롯 = 1개 (옵션: 확장버스)

범용포트 = 1개 (옵션: 2개)

프린터 = (옵션)

한자롬 = (옵션)


저가형 기종을 제외하면 대부분 MSX1은 램16KB, 범용포트 2개가 들어있습니다.

그만큼 MSX에서 게임의 비중이 크다는 얘기겠죠?ㅋ

게임롬팩은 램 8KB에서도 구동가능한 것도 있고, 16KB 전용도 있으니 잘 보셔야합니다.

정품 게임은 케이스에 표기되어있어요. ㅎ.ㅎ


그리고,

재믹스 CPC-50/51은 MSX1 기반으로 만들어졌고, MSX 로고는 없습니다. 키보드도 없구요.



2. MSX2


MSX1과 다른 부분만 표기합니다.


RAM    = 64KB (옵션: 메모리매퍼)

ROM    = Main BIOS 32KB + Sub BIOS 16KB

VDP    = V9938 (60Hz/50Hz 지원가능)

VRAM   = 64KB (옵션: 128KB)

FM 음원= (옵션: MSX-AUDIO)

프린터 = 8BIT 센트로닉스 인터페이스

범용포트= 2개

한자롬 = (옵션: JIS1, JIS2)

한자DRV= (옵션)

RTC    = RP5C01 호환


일부 특수 기종외에는 모두 VRAM 128KB가 장착되어있습니다.

대부분 MSX2 게임은 VRAM 128KB가 필요하니 참고하시구요.

VRAM이 64KB인 경우는 SCREEN 7,8을 사용할 수 없습니다.

부트로고가 SCREEN 6으로 구현된 이유가 그 때문 듯 생각됩니다요.

SCREEN 5,6의 페이지 절반만 쓸 수 있어서, 대부분 MSX2 게임이 구동안될꺼에요.


원래 부팅할 때 MSX로고와 함께 VRAM 용량이 표시되지만,

아이큐2000에서는 VRAM 용량 대신 날짜/시각이 표시됩니다. (왜 그랬을까)

X-II에서는 MSX 로고는 안나오지만, VRAM 용량은 표시됩니다. (날짜/시각은 또 어디로?)


그리고,

재믹스 CPC-61는 MSX2 기반으로 만들어졌고, MSX2 로고도 부착되어있습니다.

키보드가 옵션처리 되어있고, RTC가 제거되어 관련 BIOS 루틴들도 모두 삭제되어있습니다.



3. MSX2+


MSX2와 다른 부분만 표기합니다.


ROM    = Main BIOS + Sub BIOS 16KB + 한자DRV 16KB (옵션: 32KB)

VDP    = V9958 (60Hz/50Hz 지원가능)

VRAM   = 128KB

FM 음원= (옵션: MSX-AUDIO, MSX-MUSIC)

한자롬 = JIS1 128KB (옵션: JIS2)

한자DRV= 한자 입력기



마이크로소프트가 MSX를 포기한 후, ASCII가 전담하는 시절입니다.

이젠 국제 표준이 아니라 일본 표준 컴퓨터가 되었어요.

한자롬과 한자드라이버는 기본이구요.

MSX-MUSIC은 옵션이지만, FS-A1FX 외의 기종은 모두 MSX-MUSIC 내장되어있습니다.

MSX-AUDIO는 MSX2/2+에 내장된 기종이 아마 없을꺼에요. (비싸서?)


VRAM은 128KB 기본이 되어, 부트로고 밑에 VRAM 용량 표시를 하지않습니다.

대신 Main RAM의 용량이 표시됩니다.

MSX2는 메인램 64KB가 먼저 디텍션되는 슬롯(빠른 슬롯)을 메인램으로 사용하지만,

MSX2+부터는 모슨 슬롯의 램을 검색 후, 가장 용량이 큰 슬롯을 메인램으로 사용합니다.

하지만, DOS2 카트리지가 있으면 MSX2에서도 램 용량이 큰 슬롯으로 강제 전환됩니다.

메모리 슬롯을 가변으로 사용하는 S/W를 만들 때는 주의가 필요해요.



4. MSX turbo R


MSX2+와 다른 부분만 표기합니다.


CPU    = Z80 + R800 7.15909MHz

ROM    = Main BIOS + Sub BIOS + 한자DRV 32KB + MSX-MUSIC BIOS 16KB + DOS1 16KB + DOS2 48KB

RAM    = 메모리매퍼 256KB

FM 음원= MSX-MUSIC (옵션: MSX-AUDIO)

PCM    = 8BIT DAC/ADC

MIDI   = (옵션: MSX-MIDI)

TIMER  = 255682Hz

FDD    = 3.5" 1DD, 2DD



CPU가 두개 들어갑니다. R800은 Z80에 비해 클럭사이클이 약 4배 빠릅니다.

그 때문에 Z80 28MHz로 부르기도합니다.

turboR 외부버스가 3.58MHz라서 실제로 28MHz 속도는 안나와요ㅋ


R800에는 Z80에 없는 곱셈 명령어가 추가되어있습니다.

근데 실제로 쓰는 S/W가 거의 없는걸로 알고 있어요.

(제가 제작한 터보알 전용 S/W는 쓰고 있습니다.)


H/W 타이머는 S/W에서 종종 쓰이는걸로 알고 있습니다. PCM 출력도 마찬가지이구요.

8BIT DAC 출력은 프린터 포트 용 Covox 같은 것과 유사합니다.


한자롬 JIS2는 옵션이지만, A1ST/GT 두 기종 모두 JIS2 폰트가 들어있습니다.


일반 MSX-DOS2 카트리지(v2.20)는 DOS2 48KB와 한자DRV 16KB가 들어있지만,

한자DRV가 MSX2+부터 내장되어있어서, 대신 FDD(DOS1 16KB)가 들어가있습니다.

turboR 내장된 DOS2는 v2.30 (A1ST), v2.31 (A1GT) 두 버전이 존재하구요.

모두 Z800/R800 CPU 모드 전환 및 FDD 드라이버 통합으로 동작합니다.

참고로 OCM에 들어있는 디스크롬이 v2.31 기반으로 제작되어있어요.

Okei 씨의 FAT16 드라이버 통합된 롬이죠.


2017년 8월 25일 금요일

MMC/SD Drive는 어떻게 SCC 사운드와 공존할까?

"MMC/SD Drive는 어떻게 SCC 사운드와 공존할까?"

혹시 이런 의문 가져보신 분 있으세요?


"보드에 SCC 칩이 들어있으니, SCC 사운드가 나오는게 당연한게 아니었나?"

아마 깊게 생각안해보신 분들도 계실 듯 해서 짧게 설명드려봅니다~ ㅎ.ㅎ


MSX의 슬롯에서 동작하는 SW는 16KB 페이지 단위로 관리됩니다.

Z80 CPU 주소가 64KB니까 4개 페이지로 나뉘는거죠.

페이지0 = 0000H ~ 3FFFH

페이지1 = 4000H ~ 7FFFH

페이지2 = 8000H ~ BFFFH

페이지3 = C000H ~ FFFFH


그럼, MMC/SD Drive는 어떤 페이지를 사용할까요?


2004년에 처음 제작했을 시, MMC/SD BIOS는 페이지1,2를 사용했었습니다.

그러니까 4000H ~ BFFFH 영역을 사용하는거죠.


근데, SCC 사운드는 페이지2를 사용합니다.

오리지널 SCC = 9800H ~ 98FFH

SCC-I 모드   = B800H ~ B8FFH


어라? 페이지2가 겹치네요. ㅎ.ㅎ;

MMC/SD BIOS를 페이지1만 사용하도록 잘 구겨넣으면, SCC 사운드를 함께 쓸 수 있겠더라구요.


그래서 최종적으로 MMC/SD BIOS는 페이지1에서 구동되도록 제작이 되었구요.

따라서, 페이지2에 SCC 레지스터가 매핑되더라도 디스크 동작에 영향이 없게 되었습니다.


MMC/SD Drive V2하나만 꽂아도...

외장 SCC 지원하는 게임(메탈기어 디스크판, 스내쳐 등)의 사운드를 즐길 수 있게 된 이유입니다.

쉽죠? ㅎ.ㅎ


그럼, 이만~ 슈슝~~


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년 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년 2월 20일 토요일

메인 메모리의 최대치는?

얼마나 많은 메모리를 쓸 수 있을지 한번 테스트해보았습니다.

메인 메모리로 사용되는 메모리 매퍼만 의미합니다. VRAM 이런건 제외하구요.


실기에 4MBytes 확장램 카트리지를 꽂아서 테스트하면 좋겠지만,

제가 가진 카트리지가 얼마안되니, 에뮬레이터의 힘을 빌렸습니다.


참고로 MSX 슬롯은 총 16개이구요.

MSX2 이상인 경우 메인/확장 BIOS가 슬롯2개를 점유하니까,

남은 슬롯에 메모리 몽땅 장착하면 14개, 총 용량 4MB x 14 = 56MBytes 넣을 수 있습니다.

근데 이렇게 다 채우면, 디스크 드라이브도 없고 DOS2도 없고... 사실 할 수 있는게 없어요. ㅎ.ㅎ


그래서 일반 MSX2+ 모델인 파나소닉 A1WSX 모델을 기준으로 테스트하였습니다.

blueMSX의 A1WSX 머신 컨피그를 기본으로 사용합니다.

슬롯0,1,2,3 모두 확장한 상태에서 BIOS 등의 내장 롬이 있는 슬롯 외엔 몽땅 램 4MBytes 장착!!

컨피그 파일은 아래처럼 됩니다.

[CMOS]

Enable CMOS=1

Battery Backed=1

[FDC]

Count=1

[CPU]

Z80 Frequency=3579545Hz

[Board]

type=MSX-T9769B

[Video]

version=V9958

vram size=128kB

[Subslotted Slots]

slot 0=1

slot 1=1

slot 2=1

slot 3=1

[External Slots]

slot A=1 0

slot B=1 1

[Slots]

0 0 0 0 84 "" ""

0 0 0 0 32 "" ""

0 0 0 0 34 "" ""

0 0 0 0 26 "" ""

0 0 0 0 24 "Machines\MSX2+ - Panasonic FS-A1WSX\a1wskfn.rom" ""

0 0 0 4 20 "Machines\MSX2+ - Panasonic FS-A1WSX\a1wsbios.rom" ""

0 1 0 4096 22 "" ""

0 2 2 2 78 "Machines\MSX2+ - Panasonic FS-A1WSX\a1wsmus.rom" ""

0 3 0 4096 22 "" ""

1 2 0 4096 22 "" ""

1 3 0 4096 22 "" ""

2 0 0 4096 22 "" ""

2 1 0 4096 22 "" ""

2 2 0 4096 22 "" ""

2 3 0 4096 22 "" ""

3 0 0 4096 22 "" ""

3 1 0 2 20 "Machines\MSX2+ - Panasonic FS-A1WSX\a1wsext.rom" ""

3 1 2 4 42 "Machines\MSX2+ - Panasonic FS-A1WSX\a1wskdr.rom" ""

3 2 2 4 57 "Machines\MSX2+ - Panasonic FS-A1WSX\a1wsdisk.rom" ""

3 3 0 6 142 "Machines\MSX2+ - Panasonic FS-A1WSX\a1wsfirm.rom" ""

 


늘어난 램을 쉽게 테스트하기 위해, DOS2로 부팅합니다.

카트리지 슬롯 A에 DOS2를 장착하구요, 슬롯 B에는 4MBytes 램 카트리지 장착했습니다.

결국 램이 장착된 슬롯은 아래처럼 되네요.

슬롯0-1, 슬롯0-3

슬롯1-0, 슬롯1-2, 슬롯1-3

슬롯2-0, 슬롯2-1, 슬롯2-2, 슬롯2-3

슬롯3-0


슬롯 10개에 모두 4MBytes, 총 용량 40MBytes를 장착했습니다. ㅎㄷㄷㄷㄷ


그럼 제대로 부팅되는지 볼까요?

아래처럼 정상적으로 40960KBytes 표시됩니다.

전원 올리면, 화면 깜깜한 상태로 한참 있길래 안켜지는 줄 알았습니다.ㅋ

40메가 램 체크하는데 시간이 좀 걸리네요.




DOS2 부팅 후, 매퍼가 모두 인식되었는지 확인해봅니다.

memory 명령을 쳤어요.

슬롯0-1의 메모리가 메인(primary) 메모리로 등록이 됐군요. 






슬롯0-1 이후 부터는,

번호가 큰 슬롯3-0 부터 역순으로 슬롯0-3까지 10개 모두 제대로 표시가 되었습니다.


음... 결론은 "40MBytes 까지는 잘 되더라" 입니다.


그럼, 즐거운 주말되셔요~ ㅎ.ㅎ


PS. MSX-DOS2의 메모리 매퍼 루틴은 한가지 제약이 있습니다.


메모리 매퍼 한개는 H/W적으로는 4MB(4,194,304 bytes)가 최대 용량이니까,

각 매퍼의 세그먼트(16KB) 갯수는 256개가 됩니다.

근데, DOS2의 매퍼 세그먼트 루틴은 Z80의 8BIT 레지스터를 세그먼트 갯수로 사용하는데,

8BIT 최대치인 255까지만 쓸 수 있어요.


위의 스크린 샷에서 total RAM 정보에 4,177,920 bytes로 나오는 이유가 그 때문입니다.

마지막 1개 세그먼트(16KB)를 사용하지 못하기 때문에 나타나는 현상이에요. ㅎ.ㅎ


2015년 5월 25일 월요일

DOS2 램디스크 간단 활용 및 버그(?) 소개

일단 서론 나갑니다. ㅎ.ㅎㅋ


DOS2부터 커널에서 메모리 매퍼를 지원합니다.

근데, 대부분의 DOS프로그램들은 TPA(기본 메모리 64K 이하 영역) 만으로 구동되기 때문에,

메모리를 많이 확장하더라도 그다지 활용되지 않습니다.


20여년 전 국내 상황에서는 turboR 기종이 아니면, DOS2 사용하기가 힘들었던 것도 이유가 되겠구요.

DOS2 용 프로그램 만들어봐야 구동 가능한 사용자가 별로 없으니,

차라리 재미나 램카드를 활용하는 프로그램이 더 유용했을 것 같기도 하네요. ㅎ.ㅎ


어쨌거나 20여년이 지난 지금, 많은 분들이 DOS2 를 사용하고 계시지요. (맞나요? ㅋ)

DOS2는 자체적으로 램디스크를 지원합니다.

메모리 매퍼 일부분을 가상의 디스크로 만들어주는 것이지요.


기본적인 사용법은 DOS2 프롬프트에서 HELP RAMDISK 라고 입력하면, 도움말을 볼 수 있으니 참고하시구요.

그럼, 본론 나갑니다~


1) 램디스크 설정

   RAMDISK 숫자

   숫자는 KB단위로 인식됩니다. 128KB 램디스크를 만드려면, RAMDISK 128 입력하면 되겠습니다.

   램디스크는 항상 H: 드라이브로 생성이 됩니다.

   만약 H: 드라이브가 이미 존재한다면, 램디스크 추가가 불가능합니다.


2) 램디스크 해제

   RAMDISK /D

   입력하면 할당된 메모리가 해제되며, H: 드라이브는 더이상 사용 불가능합니다.

   임시로 저장했던 파일이 있다면, 미리 다른 물리 디스크로 복사해야 되겠지요.


3) 주의 사항

   FAT16 드라이버(Okei 씨 프로그램)를 함께 사용하려면,

     먼저 RAMDISK 설정 후 FAT16 드라이버를 실행해야합니다.

   FAT16 드라이버가 실행된 상태에서는 RAMDISK 설정/해제가 불가능합니다.


4) 실제 활용

   램디스크가 FDD보다는 훨 빠르지만,

     MMC/SD 드라이브, 선라이즈 IDE, OCM MEGA-SD 등의 기기보다는 느립니다.

   이 경우는 CPU, 메모리가 고속인 turboR에서만 램디스크 효과가 있겠습니다.


   DOS2에서 응용 프로그램 실행/종료가 되면 항상 COMMAND2 쉘 프로그램이 재로딩됩니다.

   이 때, COMMAND2가 램디스크에서 로딩되면 조금 더 쾌적한 환경이 됩니다.

   제 경우는 아래처럼 AUTOEXEC.BAT 및 REBOOT.BAT 설정하고 있습니다.

   SET SHELL 설정 참고하셔요.


[AUTOEXEC.BAT]

SET EXPERT=ON

SET SHELL=A:\COMMAND2.COM

SET PATH=B:\UTILS\;B:\M\;C:\

SET HELP=B:\HELP

MODE 80

VER

RAMDISK /D

RAMDISK 64

COPY COMMAND2.COM H:\

VOL H:RAM_Disk

FAT16

KS_SPE

KS_HANJA

REBOOT %1


[REBOOT.BAT]

SET SHELL=H:\COMMAND2.COM

SET PATH=H:\;B:\UTILS\;B:\M\;C:\

SET TEMP=H:\

C:

cd \

MODE 80

M



마지막으로, 램디스크의 버그로 보이는 동작 하나 소개합니다.

RAMDISK는 항상 H: 드라이브로 할당되도록 만들어져있는데요.

근데 램디스크 해제 명령인 RAMDISK /D는

 H: 드라이브가 실제 물리적인 디스크인 상태에서 실행하면, H: 드라이브를 날려버립니다.

H: 드라이브가 없어지면 접근이 불가능해집니다. 흐흠...


저는 요걸 터보알에서 유용하게 쓰고 있는데요.

부팅 시 MMC/SD 두대가 A: B: C: D: E: F: 로 할당되고,

G: H: 가 본체 내장 FDD로 할당됩니다. (FDD는 물리적인 디스크는 한개지만 가상으로 2개를 지원합니다.)


이 상태에서는 DOS2의 드라이브 문자가 모두 할당되어서 더이상 RAMDISK 설정이 불가능합니다.

근데 RAMDISK /D 를 실행하면, FDD인 H: 가 삭제됩니다. ㄷ ㄷ ㄷ

그러면 RAMDISK 설정 시, 에러나지않고 정상 할당이 됩니다.

저~~~기 위의 AUTOEXEC.BAT 내용에 RAMDISK /D가 포함된게 그 이유 때문이에요.


그럼, 줄입니다.

궁금한 점 있으시면, 덧글 달아주세요~ ㅎ.ㅎ


2011년 5월 13일 금요일

[강좌] 06. VDP의 수직 오버스캔 트릭

아시는 분도 있겠지만, 모르시는 분이 많을거라 생각되서...

점심 시간 여유를 타서 잠깐 소개를 해볼까 합니다. ㅎ.ㅎ

 

제목엔 트릭(Trick)이라고 썼지만, 사실 오버스캔은 일종의 VDP 버그입니다.

 

VDP는 최종 아날로그 RGB 화면을 출력할때,

그래픽이 표시되는 영역과 바깥쪽의 단색 테두리 영역이 있습니다.

 

여기서 테두리는 메인 화면의 상하좌우 바깥쪽에 표시되는데,

VDP 버그(!?)를 이용하면, 상하 영역의 테두리를 없애버릴수 있습니다.

 

스크린5 모드(그래픽 4 모드)의 경우, VRAM의 비트맵 영역은 256 x 256 픽셀인데요.

최종 출력시는 수직 192 또는 212 라인만 표시하고 나머지는 테두리 색이 출력됩니다.

이 상하의 테두리가 없어지고 원래의 수직 픽셀이 표시됩니다.

 

일반적인 NTSC 모드에서 한필드의 총 스캔라인은 약 262개인데요.

대개 가시 영역을 240개로 간주합니다.

인터레이스일때는 480i, 프로그레시브일때는 240p 라고 보통 표현합니다.

 

제가 RGB 모니터로 확인은 못했지만,

LCD TV에서 240라인까지 제대로 출력되는건 확인이 되었습니다.

RGB 모니터의 경우 수직 size를 조정하면 아마 256픽셀 근처까지 출력이 될 것 같네요.

 

이 오버스캔 트릭을 쓰는 프로그램으로는,

Unkown Reality의 일부 화면에서 볼수가 있습니다. (이건 유명하죠 ㅎ.ㅎ)

그외 Ark-A-Noah 랑 Sex Bomb Bunny 에서도 사용되었다고는 하는데 제가 확인은 못해봤어요.ㅋ

 

아래는 Unkown Reality에서 오버스캔을 쓴 모습입니다.

TV가 검정색이라 잘 안보이지만, 수직화면이 LCD 전체로 다 출력되는걸 볼수가 있습니다.

인터레이스 스크린7 모드라서 실제 수평라인이 480개가 출력되고 있어요. 한번 세어보세요. ㄷㄷㄷ



 


참고로 V9938의 데이터쉬트에는,

 212 라인모드와 192라인 모드의 스캔라인 위치가 정해져있습니다.

(참고로 출력 위치는 ADJUST 레지스터를 설정하면 상하(또는 좌우) 8픽셀 조정이 가능합니다.)

 

위치는 못 바꾸지만 첫 시작라인을 설정하는 레지스터를 사용하면,

수직으로 스크롤되는 효과를 얻을 수 있는데요.

오버스캔 모드에서는 수직 테두리가 없기 때문에 꼭 수직 위치를 바꾸는것 처럼 효과를 줄수 있습니다.

 

 

그럼, 이 오버스캔 트릭을 어떻게 구현하는지가 궁금하시겠죠? ㅎ.ㅎ

 

V9938에는 특정 수평 blanking 카운트에 인터럽트를 넣을 수 있습니다.

대개 스캔라인 인터럽트라고 얘기합니다.

 

이걸 이용하면, 특정 스캔 라인에 도달했을때 VDP 레지스터 설정을 하므로써

여러가지 특수(!!) 효과를 만들수 있는데요.

 

몇가지 예를 들어보면,

 

알레스터, 제비우스, 싸이코 월드, 스페이스맨보 등의 배경 스크롤:

-> 특정 부분은 스크롤 위치를 고정해서 안움직이는 것 처럼 만듭니다. 점수 표시판 등등.

 

싸이코 월드, 스페이스 맨보 그래픽 모드 2개 동시 출력:

-> 화면을 반으로 나눠서 스크린4 + 5, 또는 스크린 5 + 6 을 함께 표시.

 

싸이코 월드, 프린세스 메이커의 32개 팔레트:

-> 게임 배경과 하단의 아이템 화면의 서로 다른 16개 팔레트를 사용.

   (원래 MSX에서는 팔레트가 16개 밖에 없죠.)

 

정도가 되겠습니다. 실제 MSX2용 많은 게임들이 스캔라인 인터럽트를 쓰고 있죠.

 

그럼 오버스캔 모드를 만드는 방법은,

1. 스캔라인이 처음 시작할때는 192라인 출력 모드로 세팅합니다.

2. 스캔라인이 192라인에 도달하기 전에 (예: 100라인, 150라인 등)

   212라인 출력 모드로 바꿉니다.

   그러면, 스캔라인이 192를 넘어가더라도 화면이 계속 출력됩니다.

3. 스캔라인이 192를 지난 후 212 라인이 되기 전에, 다시 192라인 출력 모드로 세팅합니다.

   이러면 VDP의 라인 카운터가 오동작을 하게 되어,

   212라인이 넘어가더라도 수직 테두리가 표시되지 않고 계속 VRAM의 픽셀이 출력됩니다. ㅎ.ㅎㅋ

4. 3번에서 이미 192라인 모드로 설정했기 때문에, 다음 프레임 부터는 2~3번을 반복.

 

이러면, 상하 테두리 없는 넓은(?) 화면을 계속 볼수가 있습니다.

 

물론 장점이 있으면, 단점도 있겠지요? ㅋ

 

상하 테두리가 출력이 안되면서, VDP 내부의 수직 Blanking 인터럽트(보통 V-sync 인터럽트로 표현)

가 발생하지 않습니다.

MSX에서는 V-blank 인터럽트가 아주(!!) 중요한데요.

BIOS의 메인 타이밍 루틴이 모두 이 VDP의 인터럽트에 의존해서 구동됩니다.

 

따라서 오버스캔 모드가 동작중이면,

BIOS의 키 스캔 루틴이 동작안하게 되고, 타이머 관련 Jiffy 값이 안바뀌며,

PLAY 명령등의 사운드도 동작이 불가능해집니다.

타이밍에 따라 처리되는 디스크롬의 일부 루틴도 멎게 됩니다. ㅎ.ㅎ

하지만... 이 모든걸 게임중에는 안써도 되니까 별 상관은 없게 되겠지요. ㅋ

(FDD 액세스는 좀 주의를 해야겠네요.)

 

 

참고로, 현재 진행중인 "파라의 탑" 과 "ASO 리메이크 버전"에서

 오버스캔 모드를 사용하려고 계획 중입니다. ㅎ.ㅎ


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년 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월 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년 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년 2월 28일 일요일

재미나 메가램 카드 사용자 매뉴얼

자료 정리하다보니, 재미나 램카드 매뉴얼 스캔 자료가 보이더군요.

아마도 Cronos님이 스캔한 자료로 기억합니다.


암튼 자료 보존 차원으로, 타이핑해서 PDF문서로 만들었습니다.

필요하신 분은 참고하시기를...


Zemina_MegaRAM_Card_Users_Manual.pdf