2016년 4월 8일 금요일

paraMSX-R 제작 #3 - IQ-2000 구동 성공 그리고...

VHDL 코드를 수정하니 MSX2 설정이 제대로 동작합니다~ ㅎ.ㅎㅋ


아래는 IQ-2000, X-II, FS-A1F 순으로 부팅하는 모습입니다.

아이큐 교실도 잘 나오구요.




아래는 X-II 모드에서 스크린9 및 WIDTH 64 설정한 모습입니다.

실제 X-II 에서는 명조체 한글/한자가 나오겠지만, 아직은 출력이 안됩니다.

EPM3128으로 테스트는 여기까지가 한계네요. ㅎ.ㅎ

EPM570 넣어서 새로 보드를 만들어야 되겠습니다.




끝으로 현재까지 생각한 요구사항을 정리해봤습니다.


- DISK 없는 환경에서도 사용가능

- 기본 모드(MSX1,2,2+ 몇개)의 데이터는 플래쉬롬에 미리 다운로드

- 사용자 설정 모드 지원 -> DOS2 상에서 SRAM에 로딩 후 구동

- 외부 연결 용 슬롯 1개 지원 -> bypass 모드에서는 본체 슬롯으로 동작

- 메인램 매퍼 64KB, 128KB, 256KB, 512KB 설정 가능

- FM-PAC BIOS, DOS2 + KANJI-DRV 등의 매퍼 지원



보드에는 EPM570, 플래쉬롬 1MB, SRAM 2MB 정도가 들어갈 예정입니다.

CPLD 용량이 부족하면 추가 매퍼롬은 삭제될 수 있습니다.

물론 여유가 된다면 메가램(ASCII 8K/16K)이 추가되면 좋겠구요. (가능하면 재미나 디럭스박스?ㅋ)


외부 연결 슬롯은 아래 사진처럼 카트리지 위로 커넥터가 장착됩니다.

본체 MSX를 처음 켜면, 카트리지 없이 외부 슬롯의 기기만 동작하게 되구요.

paraMSX-R S/W로 구동이 되면, 연결된 슬롯은 에뮬모드의 슬롯으로 동작이 바뀌게됩니다.

아마 저처럼 확장 슬롯에 기기들 몽땅 꽂아서 쓰는 경우라면, 가장 편리한 방법일 듯 하네요.




그럼 즐거운 밤 되셔요~ ㅎ.ㅎ


2016년 4월 4일 월요일

paraMSX-R 제작 #2 - 일단 달려보자!

머리속으로 끼워맞춘 것들을 실제로 구현해보았습니다.

아주 일부분이지만요. ㅎ.ㅎㅋ

문득 아이언맨 1편의 대사가 떠오르네요.

"걸음마 떼려면, 뜀박질부터 해야할 수도 있어!!"


일단 테스트 용으로 쓸만한 보드가 있어야 하는데...음~

작년에 폰트팩 개발할 때 썼던걸로 재활용합니다.

램이 32KB 밖에 없지만 아이큐1000 정도는 괜찮겠죠? ㅋ

CPLD는 EPM3128 박혀있어요~


그럼, 재료(?)는 준비됐고 설명 들어갑니다!!


지난번 paraMSX-R 구상에 관한 글에서는, 실제 동작이 어떻게 이루어지는지 자세한 내용은 없었어요.

이부분을 조금 더 설명드립니다.


일반적으로 MSX 같은 구시대 8BIT PC는 CPU, 메모리 등 각종 로직들이 대게 보드 한장에 들어있습니다.

만약 현재 구성된 본체 상태가 아닌 다른 모양(?)으로 쓰고 싶다면 어떻게 하는게 좋을까요?

완전히 다른 모양 말구요. 동일한 MSX 머신 테두리 안에서요~ ㅋ

예를 들어 "turboR을 대우 IQ-1000 처럼 쓰고 싶다" 정도가 되겠네요.


물론 조건이 있습니다.

기존 보드에 박힌 CPU는 그대로 써야합니다.

PC에서 가장 중요한 부분이 CPU인데, 다른 CPU를 외부에 달면 기존 본체는 노예(Slave)가 되겠죠?

이런식의 구동은 제외합니다.


현재 CPU를 그대로 써서 내 맘대로 MSX를 조작하려면 어떻게 해야할까요?

가장 쉬운 방법은 CPU와 CPU주변의 BUS를 끊고 내가 만든 보드를 끼워넣는겁니다.

모든 신호를 중간에서 잘라먹고 맘대로 변형을 하는거죠.


근데, 이 방법은 후기형 MSX2,2+,turboR의 경우는 사용이 불가능합니다.

왜냐면요...

MSX-ENGINE이라는 큼지막한 원칩안에 CPU, PPI, PSG, 등등 왠만한 칩/로직들이 다 숨어있어요.

중간에 끼어들 공간이 없습니다.


그럼, 차선책이 필요하겠군요.

방법은 하나 S/W에 변형을 가하는 것입니다.

음... 뭔가 이상한가요?

네, 이상하죠? ㅋ

MSX 슬롯에 존재하는 모든 S/W를 변형(패치)를 하는 것은 사실 불가능합니다.

롬 뽑고 교체하는 것도 생각해볼 수 있겠지만, 범용적으로 적용하기는 힘든 방법이겠죠.


그럼, 내가 외부 슬롯에 존재하는 S/W만으로 뭔가 구현을 해야하는데 어떻게 하면 될까요?

paraMSX-R에서 사용한 방법은 본체 내장된 슬롯의 S/W를 몽땅 외부로 옮기는 것입니다.

"어... 외부로 옮겨도 슬롯 구조가 바뀌는건 아니잖아요?"

"그게 어떻게 구동이 되나요?" 라는 생각이 바로 떠올랐다면, 당신은 이미 MSX 전문가~ ㅎ.ㅎㅋ


만약 CPU가 보는 슬롯을 속이면 가능할까요?

예를 들어 CPU(S/W)는 슬롯0-2의 FM BIOS를 구동(read)하고 있지만,

실제로는 FM BIOS가 카트리지 슬롯1에 들어있고, S/W 혼자 슬롯0-2라고 속고 있다면??

이런 상황이 가능할까요?


일단 이걸 구현하려면, MSX가 구동하고 있는 모든 S/W를 실기간으로 간섭할 수 있어야합니다.

결국 MSX의 슬롯 전체를 외부 카트리지로 구현을 해야한다는 얘기겠죠?

예를 들어 본체의 슬롯1에 카트리지가 장착되겠지만,

카트리지 내부는 슬롯0,1,2,3 모두 구현하고 필요한 부분은 서브슬롯 확장이 되어야겠지요.


MSX의 슬롯처리는 PPI의 GPIO를 사용하는데, PPI 슬롯 I/O 주소(port)는 A8H 입니다.

주로 Z80 명령 LD A,N 및 OUT (0A8H),A을 사용합니다.

카트리지에 구현된 슬롯은 기존 PPI와 주소가 겹치면 안되겠죠?

일단 22H 포트를 사용해서 구현해봅니다.


음... 왜 계속 슬롯얘기만 하나요?

그러게요...ㅋ


그럼, CPU(S/W)를 속이는 방법을 생각해보죠.

카트리지에 MSX 슬롯 전체를 구현해서 S/W가 동작할 공간은 만들었지만...

어떻게 내부 슬롯을 액세스 못하게 만들수 있을까요?

예를 들어 LD A, 0 및 OUT (0A8H), A 명령이 실행되면 슬롯0으로 제어가 넘어가겠지요.

이걸 막기 위해, 약간(?)의 H/W 를 추가합니다.


CPU가 명령어 fetch를 하게 되면, 메모리에서 바이트 단위로 BUS를 접근하게 되는데요.

이걸 단계를 나눠서 머신 사이클이라고 표현합니다.

각 사이클을 M1, M2, M3 이런식으로 이름 붙여서 부르고 있어요.

각각의 M 사이클은 CPU clock 카운트에 따라 T1, T2,... 이렇게 T state로 쪼개집니다.


암튼! ㅋ 이렇게 명령어를 메모리에서 읽어갈 때,

paraMSX-R 카트리지는 누가 슬롯을 전환하는지 매번 체크합니다.

M1, M2 사이클의 DATA BUS를 훔쳐보다가...

"어라~ 이거 슬롯 전환하려는건가?" 싶으면 DATA를 변경합니다.

예를 들어 OUT (0A8H),A 명령이 OUT (022H),A 명령으로 바뀌는것이죠.

이때 DATA는 BUS 상에서만 변경되니까, 실제 메모리의 S/W 코드는 그대로 유지됩니다.

결국 이렇게 명령어가 바뀌면(해킹 ㅋ), 본체 내의 슬롯의 여전히 카트리지 슬롯1 설정이 유지되구요.

paraMSX-R 카트리지 내의 슬롯 설정만 바뀌게 됩니다.


여기까지가 슬롯 처리에 관한 내용이었습니다.

그림을 그리면 설명이 더 쉽겠지만, 밤이 늦었으니 이해해주셔요. ㅎ.ㅎㅋ

머리속에서 그림을 그리시면 아마 쉽게 이해되실겁니다.


그럼, 슬롯처리만 구현해서 한번 테스트해볼까요?


폰트팩 보드를 이용해서 VHDL 삽질을 해봅니다~ㅋ

CPLD 용량이 크지 않으니, 

슬롯0-0, 슬롯0-1, 슬롯0-2, 슬롯0-3, 슬롯2를 우선 구현하구요.

플래쉬롬에 IQ-1000, IQ-2000 등의 BIOS롬을 정리해서 올렸습니다.


그럼 동작 테스트~ ㅎ.ㅎ

SRAM이 32KB뿐이라 일단 이상태로 구동해봅니다.


1차 IQ-2000 고고고~

결과는 실패ㅋ 부팅로고까지 진입을 못하고, 뺑뺑이 돌고 있네요.

화면에 요상한 글자를 찍으면서..ㄷㄷㄷ


2차 IQ-1000 고고고~

결과는? 오홍~ 뭔가 나오는구나! 제대로 부팅이 되네요.

큐닉스 한글 메시지가 저를 반겨주는군요~ ㅎ.ㅎ




실제로 구동하는 모습을 동영상으로 찍었습니다.

제 turboR에서 실행한 모습입니다요~




음... 겨우 이정도 구현하는데 CPLD(EPM3128) 용량이 FULL입니다. ㅎ.ㅎ;;

X-II 한글롬 테스트 하려면 보드 한장을 더 꽂아야되겠네요.ㅋ


그럼, 또 다음편에서 뵙겠습니다.

2016년 3월 31일 목요일

paraMSX-R 제작 #1 - 구상

paraMSX라고 들어보셨나요? 개발 중단된지 오래된ㅋ 윈도 용 MSX 에뮬레이터인데요.

이걸 실기에서 돌아가도록 만들면 어떨까? 망상을 해봅니다.


일단 망상에 앞서 이름부터 대충 붙여보았어요.

"paraMSX-R"

여기서 R은 레알의 R입니다요~ㅋ



이제 망상 설명 들어갑니다!


paraMSX-R는 무엇인가?

실기에서 다른 MSX 머신을 흉내내주는 카트리지입니다.

내부적으로는 CPLD와 대용량의 SRAM으로 구성이 됩니다.


어떤식으로 사용이 되나요?

내가 쓰는 실기는 파나소닉 A1WSX 이지만, 대우 X-II를 구동하고 싶다??

이럴때 실기 본체를 X-II처럼 보이게 만들어주는 역할을 합니다.



그럼, MSX의 내부는 어떻게 구현할 것인가?


1. CPU


MSX의 Z80 에뮬레이터를 SW로 구현한다면, turboR CPU로도 불가능하겠죠?

turboR R800 속도가 50배정도 빠르다면 한번 해볼만할까요? ㅎ.ㅎ

그냥 본체의 CPU를 그대로 쓰기로 합니다.

응? 그럼 본체에 붙어있는 주변장치들은 어떻게 되나요?

걔네들은 끌수도 없는데 그럼 뭘 에뮬레이션 한다는 얘기일까요? ㅋ

자세한건 2부에서...ㅎ.ㅎ


2. SLOT


MSX의 가장 중요한 부분이겠군요.

슬롯은 paraMSX-R 카트리지 내부에 구현됩니다.

기본 슬롯 4개가 존재하구요. 슬롯0, 슬롯3은 확장슬롯으로 선택가능합니다.

결국 아래처럼 되겠죠?


# 최소 사양

슬롯0 (기본) - 롬 에뮬

슬롯1 (기본) - 카트리지 슬롯

슬롯2 (기본) - 카트리지 슬롯 or 롬 에뮬

슬롯3 (기본) - 롬 에뮬 or 카트리지 슬롯


# 최대 사양

슬롯0 (확장) - 롬 에뮬

슬롯1 (기본) - 카트리지 슬롯

슬롯2 (기본) - 카트리지 슬롯 or 롬 에뮬

슬롯3 (확장) - 롬 에뮬


여기서 롬 에뮬 영역은 MAIN/EXT BIOS, FM BIOS, Virtual DISK ROM 등이 탑재됩니다.

각 슬롯은 64KB SRAM으로 구현되니까 용량을 계산해보면...

메모리 64KB x (4 + 1 + 1 + 4) = 640KB가 필요하군요!

음... 확장슬롯 2개 정도는 CPLD 용량을 많이 먹지않으니 괜찮겠죠? ㅎ.ㅎ


3. PPI


8255 PPI는 MSX의 기본 슬롯, 키보드, 카세트 출력, 1BIT 사운드, CAPS LED를 구동합니다.

실기에서 paraMSX-R이 동작하려면 최소한 키보드는 공유가 되어야겠지요?

그냥 포트 A9H, AAH, ABH에 연결되는 것들은 모두 본체의 PPI를 사용합시다~ㅋ

슬롯 처리 용 포트 A8H은 본체 대신, paraMSX-R의 슬롯 동작이 되어야겠지요?

그렇게 하자구요! 근데 어떻게??

자세한건 2부에서...ㅎ.ㅎ


4. VDP


MSX의 VDP는 디스플레이와 타이머 용도로 사용됩니다.

이걸 외부 HW로 구현하려면 진짜 VDP 칩을 달던가 FPGA로 구현해야겠죠?

그래서 걍 본체의 VDP를 씁니다.

어허... 그럼 MSX2 실기에서는 V9958 에뮬이 안되겠네요? 맞습니다요ㅋ

그럼 어떻게 해야할까요? MSX2+를 사면 됩니다. ㅎ.ㅎ

결국 paraMSX-R을 쓰더라도, 실기보다 높은 사양의 VDP 처리는 불가능합니다.


5. PSG


MSX의 PSG는 구형파/노이즈 사운드를 출력하지만, 한가지 기능이 더있죠?

AY8910에 붙어있는 GPIO를 통해 조이스틱/마우스 및 카세트 입력, KANA/한글 LED를 구동합니다.

그냥 본체 PSG 그대로 사용합니다.

MSX 버전 상관없이 동일한 H/W니까 안전하게(?) 쓸 수 있겠습니다요~ ㅎ.ㅎ


6. OPLL


MSX-MUSIC YM2413 칩입니다. 이건 당연히 본체 내부의 칩을 공유하는게 도리겠죠?

아... 그럼 FM 팩 BIOS(64KB)를 로딩하더라도, 아이큐2000에서는 FM 사운드가 안나겠네요???

빙고~ ㅎ.ㅎb


7. RTC


MSX2 이상부터 표준으로 들어가는 리얼타임 클럭 칩입니다.

약간의 메모리 공간이 있어서, 게임 세이브 혹은 부트 패스워드 등으로 쓰이고 있어요.

이건 크기가 작으니 메모리 부분만 CPLD로 구현해서 넣습니다.

본체 RTC를 공유하게되면, paraMSX-R 데이터랑 섞여서 엉망되겠죠? ㅋ


8. System Flag


보통 F4 레지스터로 불리는 놈입니다. 본체가 SW 리셋되는지 확인하기 위한 1BIT 레지스터지요.

간단하니까 CPLD에 구겨넣습니다.


9. KANJI 및 한글/한자 폰트


일제 MSX2에는 JIS1(128KB) 또는 JIS2(256KB) 롬으로 만들어진 폰트 IO가 들어가있구요.

대우 X-II에는 한글/한자 롬(256KB)으로 구성된 폰트 IO가 들어있습니다.

아이큐1000/2000에는 아무것도 없어요~ㅋ

이건 CPLD로 구현해서 넣습니다. 


10. 메모리 Mapper


최소 64KB에서 최대 256KB 용량의 메모리 매퍼 1개가 들어갑니다.

메인 매퍼니까 S/W 호환성을 위해, 레지스터 Read 기능이 있어야겠네요.

아...CPLD 용량이 약간 걱정됩니다~ㅋ


11. FM-PAC (OPLL 없음)


OPLL 없는 FM-PAC을 구현합니다.

FM BIOS만으로도 게임하는데엔 문제가 없겠지만, FM-PAC의 SRAM 세이브가 되면 더 좋겠죠? ㅎ.ㅎ

OPLL 칩은 안넣을꺼니까, MSX-MUSIC 내장이 아닌 본체에서는 소리는 안나겠습니다요!

CPLD 용량이 딸리게되면 구현 제외 1순위!!


12. 메가램 팩


머신 에뮬은 해놨는데, 게임팩 에뮬도 있어야겠지요?

SCC 등의 사운드 칩을 넣으면 돈 아까울 것 같구요 ㅋ

재미나 램카드 정도의 단순 8K/16K 매퍼로 구현합니다.

그냥 재미나 디럭스카드(256KB) 클론이라고 보셔도 되겠네요.



망상은 여기까지입니다

글이 너무 길어지면 재미없으니, 망상 2편에서 계속하도록 하겠습니다...


그럼, 즐거운 MSX 생활 하세요!!