2023년 11월 30일 목요일

지난 20년 개발의 추억 #5 - paraMSX-R

월간 추억팔이 #5편이 나왔습니다~ ㅎ.ㅎ


이전글을 보시려면, 아래 링크를 눌러주세요!

https://sharksym.blogspot.com/2023/07/20-1.html

https://sharksym.blogspot.com/2023/08/20-2.html

https://sharksym.blogspot.com/2023/10/20-3.html

https://sharksym.blogspot.com/2023/10/20-4-mmcsd-drive-v3.html



12. paraMSX-R 


이제 2016년으로 넘어갑니다.

저의 MSX 환경은 8년째 비슷하게 유지가 되고있네요.

GT의 상단슬롯은 게임팩 또는 주변기기 테스트 용도로 비워두고,

후면슬롯에는 확장슬롯(서브슬롯 6개)에 주변기기가 주렁주렁 달린 모습이죠.


어느날 문득 이런 생각이 들더라구요.

주변기기들이 모두 GT의 후면 슬롯(확장슬롯)에 모여있으니, 본체와 확장슬롯 사이에 뭔가를 넣어보면 어떨까?

확장슬롯 및 주변기기들을 몽땅 피기백으로 올려서 쓰는 기기를 만들게 됩니다 ㅎ.ㅎ



12.1 머신 에뮬레이터


가상머신이라고 부르긴 애매하고, 그렇다고 완전한 에뮬이라고 할 수도 없고.

외부기기들은 그대로 연결되어 사용되지만, 내부의 H/W는 우회하는 방법들...


사실 H/W 자체의 주기능은 I/O remap입니다만, 이게 가능하게 되면 SLOT 환경을 속일 수가 있겠죠?

SLOT의 메모리 영역과 I/O 액세스를 마음대로 바꿀 수 있다면, 원래는 구현할 수 없는 것들(SLOT 0 개조)을 해볼 수 있습니다.

예를 들면, GT를 아이큐2000처럼 동작하게 하거나, WSX를 아이큐1000 처럼 보이도록 하는 것들이요 ㅎ.ㅎ


기기의 이름인 paraMSX-R은 사용자 입장에서 쉽게 이해할 수 있는 이름을 붙이려고 고민하다가 나온 이름입니다.

윈도용 MSX 에뮬레이터인 paraMSX를 실기(Real Machine)에서 구동하는 경험을 만들어주는 느낌같은거라고 보시면 되겠습니다.


아래 영상은 제 GT에서 대우 아이큐1000의 환경을 만들어본 모습입니다.



나중에는 런처의 UI도 윈도용 paraMSX와 유사하게 만들게됩니다.

아래는 2017년에 찍은 UI 데모영상이네요.





12.2 외부기기는 피기백으로


원칙적으로 I/O remap을 구현하려면 본체의 Z80과 BUS 사이에 기기가 설치되어야합니다.

근데 대부분 MSX들(후기형)이 Z80을 내장한 MSX-ENGINE을 쓰기 때문에 이런 개조가 불가능하죠.

그래서 CPU가 명령어 fetch 할 때, 오퍼랜드의 포트 주소를 바꾸는 식으로 구현이 되어있습니다.

단순 메모리 R/W에서는 CPU는 원래 코드로 인식하지만, 실제 실행될 때는 코드가 바뀌는 것이죠.

그냥 코드가 런타임으로 패치되는 방식이라고 이해하셔도 무방할 듯 싶습니다.


신호의 흐름은 이런식이겠죠?

MSX-ENGINE (Z80 + 내장 I/O) <-> paraMSX-R <-> 확장슬롯(외부 S/W, H/W)


확장슬롯은 paraMSX-R이 생성한 SLOT 1,2,3 중 하나(기본슬롯)만 연결이 되구요.

paraMSX-R 내부에서는 SLOT 0과 확장슬롯을 제외한 나머지 슬롯에 내장기기를 구현(탑재)합니다.


일단 구조설명은 여기까기만 하겠습니다요.

더 자세한 내용은 게시판에서 'paraMSX-R 제작'으로 검색해서 보셔요~ ㅎ.ㅎ


아래 사진은 GT의 후면슬롯에 paraMSX-R을 장착하고 확장슬롯 케이블이 연결된 모습입니다.



만약 머신 에뮬의 기능이 꺼진 상태에서는 paraMSX-R는 모든 신호를 확장슬롯으로 bypass합니다.

평상시엔 paraMSX-R을 안 꽂은 것과 똑같다는 얘기에요.



12.3 난관과 마무리


paraMSX-R v1.0 보드에 저의 확장슬롯(6슬롯)을 연결해서 이리저리 테스트를 해보니, 문제점이 좀 발생하네요.

BUS 신호들이 여러 단계의 버퍼 및 스위칭을 거치게 되니까, 결국 코드 remap 타이밍을 못 맞추는 경우가 생기더라구요.

물론 주변기기에 따른 편차도 있구요.


결국 이 문제 때문에 paraMSX-R의 피기백 구조는 보류합니다.


물론, 확장슬롯 자체를 보드에 통합하는 방법도 생각해봤는데요, 이건 컨셉을 모호하게 만드는 것 같아서 안되겠더라구요.

다른 확장슬롯을 활용 못하도록 강요하는 것은 바람직한 방향이 아니겠죠?


차라리 외부슬롯의 사용은 제약이 좀 따르더라도, paraMSX-R을 단독 카트리지로 만들고 자체의 에뮬기능을 더 넣는 방법은??

원래 계획했던 것과는 상당히 다른거라서, 이건 좀 고민해보기로 합니다. (결국 이 방안으로 가게됩니다 ㅠ.ㅠ)


이렇게 paraMSX v1.0은 미완성으로 마무리되었네요~



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


2023년 11월 4일 토요일

오랜만에 구버전의 paraMSX를 실행해보았어요!

지난주 파라동에서 펜티엄III 노트북을 나눔으로 받아왔습니다.

사양은 펜티엄 III 900MHz, 램 256MB입니다.


디스플레이가 망가진 상태라서, 힌지째 분리 후 외부 LCD 모니터에 연결해서 사용합니다.

누락된 INS키캡은 그닥 쓸모없는 'Sys Rq'키캡으로 바꿔 달았더니 쓸만하네요! ㅎ.ㅎ


옛날 노트북에는 옛날 프로그램을 깔아주는게 좋겠죠?ㅋ

그럼, paraMSX v0.48b 버전을 실행해봅니다. 잘 돌아가네요! ㅎ.ㅎ

(노트북 아래에 있는 X-II랑 WSX는 신경쓰지 마세요. 그냥 노트북 받침대입니다 ㅎ.ㅎㅋ)




실제 동작 모습은 아래 영상으로 구경하셔요~



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


2023년 10월 30일 월요일

지난 20년 개발의 추억 #4 - MMC/SD Drive V3

추억팔이 #4편이 나갑니다요~ ㅎ.ㅎ


이전글을 보시려면, 아래 링크를 눌러주세요!

https://sharksym.blogspot.com/2023/07/20-1.html

https://sharksym.blogspot.com/2023/08/20-2.html

https://sharksym.blogspot.com/2023/10/20-3.html




[본론]


11. MMC/SD V3 제작


2007년에 MMC/SD V2가 나온지 8년이 지났네요.

저의 MSX 환경은 1024KB램 증설된 A1GT와 확장6슬롯으로 조금 지겨워지고 있었습니다ㅋ

주변기기는 MMC/SD V2 + SCC-I + MoonSound + MPX + RS-232C + Music Module 조합으로 붙박이었네요.

.

.

.

이런저런 생각들이 하나 둘 쌓이다가 이런 결론에 도달하게 됩니다.

'필요한 기능을 모아서 새로운 MMC/SD를 만들어보자!'


참고: 이하 MMC/SD Drive V2 및 V3는 V2, V3로 줄여서 쓰겠습니다.




11.1 메가램 합체


게임을 위해, 메가램이든 플래쉬 롬팩을 쓰다보면 조금 귀찮은 부분이 있습니다.

본체를 리셋하더라도 메가램에 다운로드된 게임이 재구동 되니까,

본체전원을 끈 후 메가램의 내용이 지워(파괴)지도록 조금 기다렸다가 다시 켜야하는 작업이죠.


그냥 본체리셋만으로 메가램의 재실행을 방지하고 DOS로 부팅되면 편하지않을까요?

사실 이건 V2에서 플래쉬롬을 멀티롬(디스크롬 + 게임롬)으로 바꿔서 구동하는 기능으로 이미 구현되어있어요.

V3에서는 여기에 메가램을 추가하는겁니다요ㅋ


메가램/롬 매퍼는 최대 2048KB이구요. FlashROM 1024KB + SRAM 1024KB 조합입니다.

실제 V3 보드에는 FlashROM 1024KB x 2 + SRAM 512KB가 들어갑니다.

SRAM은 1024KB로 확장이 가능하구요. (약간의 납땜 작업이 필요합...니다.)


V3에서는 전원을 켜면 항상 DOS2 디스크롬으로 구동이 되며,

MMCSD.COM 프로그램으로 ROM을 다운로드 후 메가램 모드로 전환 재부팅이 가능합니다.

참고로, 메가램 모드로 바뀌면 디스크롬은 보이지않게 됩니다.

소프트 리셋을 하는 경우는 메가램 모드가 계속 유지되구요, 하드 리셋의 경우에는 디스크롬 모드로 복귀됩니다.


이제 좀 편해졌군욤~ 흐흐...



11.2 서브롬 


V2의 메인 플래쉬롬을 쪼개서 구현한 멀티롬 기능은 V3에서 삭제됩니다.

대신 별도의 1024KB의 플래쉬롬을 넣어서 전체를 하나의 게임팩처럼 쓸 수 있도록 해봅니다.

가끔 쓰일 경우가 있으니까요.

.

.

.

라고 생각하며 넣었는데요.

나중에 이 서브롬을 이용해서 KOEI 게임의 롬 + SRAM 모드를 구현하거나,

1.5MB 등의 사이즈가 큰 롬을 플래쉬롬과 SRAM에 나눠 다운로드해서 구동하는 모드가 들어가게됩니다.

(서브롬 안 넣었으면 어쩔뻔?ㅋ)



11.3 디스크 파티션 변경


V2에서는 최대 2GB의 SD(SDSC)를 720KB씩 분할해서 할당하는 파티션(최대 4095개) 개념을 넣었는데요.

V3에서는 고용량의 SDHC를 지원하게 되어서, 이 방식을 포기하게 됩니다.

만약 이 방식으로 32GB의 SDHC를 720KB로 분할하면, 대략 4만6천개의 파티션이 생성되는 사태가 벌어지겠죠 ㅎ.ㅎ


PC에서 사용하는 일반적인 디스크 파티션을 그대로 사용하도록 변경되었구요.

해당 파티션은 자동으로 디스크 드라이브로 마운트됩니다. A: B: C: D: ... 이런순으로요~


참고로, 메인 플래쉬롬의 롬디스크를 A: 드라이브로 마운트하는 기능은 여전히 지원됩니다.

이 경우에는 SD카드가 B: C: D: E: ... 순으로 밀리게 되겠네요.


A: 드라이브는 DOS2 부팅을 위해 FAT12로 포맷이 되어야합니다.

V3의 롬디스크로 부팅해서 SD카드 초기화(INSTALL) 작업을 진행하면,

자동으로 32MB 파티션을 할당하고 FAT12로 포맷이 되니까 참고하셔요.



11.4 FDD 에뮬 변경


V2에서는 부팅 드라이브(A:)의 파티션을 2DD로 할당된 파티션으로 바꿔서 FDD 에뮬을 했습니다만,

이제 이 방식은 쓸 수 없으니, 다르게 구현해봅니다요.


일반 파일로 저장된 디스크 이미지(*.DSK)를 그대로 R/W해서 FDD 에뮬을 처리하는 것이죠.

PC용 MSX 에뮬(예:paraMSX)에서 DSK 파일을 마운트하는 것과 똑같은 방식입니다. 멀티디스크 지원도 동일하구요.

실기에서 구동된다는 차이만 있을 뿐이죠 ㅎ.ㅎ


물론 뭐, MSX 실기에서 이걸 구현하려면...

DOS2와는 별개로 V3의 디스크롬에서 FAT12/FAT16의 디렉토리, 파일 엔트리를 처리해야 하니까 조금 부담이 됩니다.

근데 이렇게 하는 것보다 나은 방법이 없으니 Z80 풀파워로 구현해봅니다요 ㅎ.ㅎ


아마 사용자 입장에서도 이렇식의 FDD 에뮬이, 가장 직관적인 사용법이 아닐까싶으네요.

약간의 걸림돌이라면, 기존 V2에서 만들어뒀던 SD카드는 V3에서 못 쓴다는 점이겠죠ㅋ



11.5 turboR 최적화


V2에서  디스크 속도에 대한 큰 불편함은 없었는데, V3에서는 대용량 FAT16 디스크를 주로 써야하구요.

메가램 로딩, FDD 에뮬 등으로 디스크 R/W 부담이 늘게 되니, 디스크 속도를 올려야 덜 답답하겠더라구요.

기리고, turboR 구조에서 이득을 볼 수 있도록 설계했습니다.


결론적으로 turboR에서 디스크 Read 속도가 약 530KB/sec 정도가 되었습니다.

MSX2/2+에서는 속도가 155KB/sec 쯤 됩니다. 

V2의 속도가 130KB/sec 수준이었으니, turboR에서 V3는 상당히 쾌적하게 되었습니다~


MSX2/2+에서는 V3가 V2보다 조금 빨라진 정도니까, FAT16 드라이브를 쓰려면 좀 인내심이 필요합니다요.

사실 Z80 3.58MHz로는 좀 버겁습니다.



11.6 GameRunner


기존 GameRunner는 본체의 메인램과 VRAM을 사용하는 GRUN.COM 프로그램이었습니다.

이 프로그램과 비슷한 방식으로 V3의 메가램을 활용하는 GameRunner가 추가해봅니다.


기존 GRUN 프로그램이 V3의 추가기능을 지원하는 방식은 아니구요.

V3 전용 툴(MMCSD.COM)에 V3용 GameRunner가 포함되는 방식입니다. (MMCSD.COM의 /G 옵션 사용)



11.7 외부 SCC 사운드 처리


V2에는 SCC 칩이 들어있어서, 코나미 게임을 실행할 때 SCC 사운드를 그대로 들을 수 있습니다.

근데 V3에서는 SCC가 없어요ㅋ

대신 메가롬 및 GameRunner 모드에서 다른 슬롯에 장착된 SCC 사운드를 처리할 수 있는 기능이 들어갑니다.

물론 다른 슬롯의 기기(SCC)니까, 이걸 H/W적으로 처리는 불가능하구요. S/W 패치로 구현하게 됩니다.

MMCSD.COM에서 롬파일을 다운로드할 때, 다른 슬롯에 SCC가 발견되면 해당 기능이 자동으로 롬패치되어 구동됩니다.




[결론]


V2를 수년간 쓰면서 불편(귀찮아)했던 것들을 개선하고, 대용량 SDHC를 편하게 쓸 수 있도록 만드는게 주목적이었네요.

그렇게 2015년은 쓰윽~ 흘러갔습니다...


긴 글 읽어주셔서 감사합니다요~ ㅎ.ㅎ