2023년 12월 26일 화요일

MRC의 병신들

남의 이름을 맘대로 지어내는 방법은 어디서 배웠을까?


근데 한글 이름은 그대로 복사?ㅋ


2023년 12월 25일 월요일

MMC/SD Drive V3/V4 - BIOS & Tool v5.72

Download: 20231225_MMCSD_Drive_V3_V4_BIOS_Tool_v572.zip


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

MMC/SD Drive(tm) V3/V4 - BIOS & Tool

    By Yeongman Seo <sharksym@hitel.net>

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



[ BIOS & Tool v5.72 ]


- BOOT_MENU


  SCC-I 128KB 오동작 수정

  -> v5.69 ~ v5.71에서 발생함



- FDD_EMU


  DSK 이미지가 DOS2 디스크가 아니면 /DT 옵션 무시



[ 업데이트 가이드 ]


1. MMCSD.COM, MMCSD.OVL 두개 파일을 SD카드에 복사.

   기존 파일을 덮어쓰면 됩니다.(예:UTILS 디렉토리)


2. MMCSD572.ROM 파일을 SD카드 루트에 복사.


3. MSX-DOS2 부팅 후 명령창에서 아래처럼 입력.

   A:\>MMCSD MMCSD572.ROM


4. 다운로드 완료 후 리턴키 눌러서 재부팅.


5. 끝


2023년 12월 15일 금요일

T-Wave - MuPLAY로 이스2 MGS를 들어보아요~ (feat. 노랑불꽃)

PAC-V FRAM 보드가 1장 남았는데요, 요걸로 노란색 LED바를 넣어봤습니다.

T-Wave로 강화된 이스2 음악(FM 어레인지)도 들어보셔요~ ㅎ.ㅎ/




그럼, 이만~~


2023년 12월 13일 수요일

T-Wave 2차 제작 완료

지난 1차 제작 후 3년만이네요!

작업에 한달반 정도 걸린 것 같습니다요.

T-Wave가 PAC-V만큼 제작에 손이 많이가서 쬐금 힘들었슴다 ㅎ.ㅎ





2023년 12월 3일 일요일

2023-12-02 송년회 잘 다녀왔어요


어제 토요일에 'MSX의 천국' 2023년 송년회가 있었습니다.


정모에 처음으로 오신 깜빡핑님(앞), 카롱아빠님(옆)이 자리를 빛내주셨습니다~ ㅎ.ㅎ

아자씨들끼리 얘기나누면서 재밌는 시간을 보냈네요.

Valman님, 파스타님과 나눴던 S/W개발 (Z80 어셈블러 등) 관련 얘기들이 기억에 남습니다요.

남은 얘기는 다음 기회로~~


나눔용으로 가져갔던 RSV5 to SLTSL 어댑터는 필요하신 분들이 잘 가져가신 것 같구요.

저도 가위바위보로 젤다 피겨를 득했습니다.

제공해주신 마이콜님과 기념사진도 찰칵!



만나서 반가웠습니다. 모임 진행하느라 고생하신 요원님들께 감사드리구요, 다음 정모에서 또 뵈어요~ ㅎ.ㅎ/


2023년 12월 1일 금요일

카시오 A220 시계 배터리 교체

음... 2001년 아니면 2002년이겠네요. 손목에 전자시계를 차고 다니던 시절의 물건입니다.

서랍에 쳐박아놓은지 15년 넘은 것 같은데, 갑자기 생각이 나서 꺼내보았어요.




배터리는 오래전에 방전되었겠죠? 다이소에서 CR2025 전지를 구해서 교체했습니다 ㅎ.ㅎ

시각, 날짜도 맞추고 백라이트도 켜보았어요. 잘 동작하네요!




20년전 기억들이 잠시 머리를 스쳐갑니다...


그럼, 이만~~


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

빠른 8BIT 컴퓨터가 필요한 이유가 뭐에요?

일주일 전에 파라동에 글을 하나 올렸습니다.

빠른 8BIT 컴퓨터가 있으면 좋겠다고 생각하시는 분들께, 왜 필요한지 이유를 여쭤보았는데요.

필요한 이유를 적어주신 분은 아무도 없었구요 ㅎ.ㅎ


만약 빠른 컴퓨터가 나온다면 '이런 기능이 있으면 활용가능' 등의 의견을 주신 분이 2명 계셨습니다.

재밌게도 두분의 댓글 내용이 똑같았는데, 요약하면 이렇습니다.

-> 동작 속도를 실시간으로 조절하는 기능: 기존 게임 진행 시 동작이 느린 경우 플레이 속도를 올려줄 수 있다


물론 여기서 중요한 건, 시스템 속도를 조절하더라도 그래픽, 사운드, 주변 H/W가 오동작하지 않도록 되어야겠지요.

그리고 게임 진행도 적당히 빨라져야합니다.

기존 트윈비, 악마성 드라큐라, 메탈기어 등의 게임들을 turboR 고속모드로 구동해보신 분들은 이미 경험해보셨으니 잘 아시겠죠? ㅎ.ㅎ


네, 이게 전부입니다.


-끝-



.

.

.


여기서부터는 보너스입니다.


지난 20년간 "빠른 CPU에 그래픽, 사운드가 향상된 MSX가 나오면 좋겠다" 이런 얘기는 수도 없이 들었습니다만...

"그런 컴퓨터가 나오면 뭘 하실거에요? 빠른 컴퓨터가 왜 필요하세요?"라고 대놓고 여쭤보지 못했습니다.

왜 그런 얘기를 하시는지도 알고 있고, 그런거 물어보면 대화만 중단된다는거 알고 있으니까요 ㅎ.ㅎ


뭐, 우리도 그렇고, 외국 유저들도 마찬가지인데요.

고성능 8비트 호환 컴퓨터가 나온다고 해서, "내가 거기에 맞는 S/W를 만들겠다"라고 얘기하는 사람은 거의 없습니다.

결국 초기 번들된 데모 프로그램 한두개 외엔 딱히 할 게 없을거에요.


근데 이 컴퓨터의 가장 큰 문제점이 뭐냐면요.

오리지널 기종(예: MSX, 애플2, ZX 스펙트럼, 코모도어64 등)과 비교하면 엄청난 고성능이겠지만,

현재 여러분들이 쓰시는 데스크탑, 노트북, 휴대폰에 비하면 한없이 초라한 성능입니다.


결국 고성능 8비트 컴퓨터로 나오게 될 S/W는 20년전 윈도XP 시절에 썼던 프로그램들 수준에도 못 미치게 될거라는 걸 알고 있습니다.

빠른 8비트 컴퓨터로 멋진 그래픽에 MP3로 BGM을 넣어서 게임을 만들더라도,

돌아오는 반응은 "수고 많으셨어요!" 정도의 덕담으로 끝날겁니다.

누군가가 웹브라우저를 만들어도, 이걸로 네이버 카페에 접속해서 글을 읽는 사람이 있을까요?


활용할 S/W가 개발이 안되는 것도 문제입니다만,

막상 S/W가 개발되어 나오더라도, 내가 활용할 이유를 찾아야 한다는 것도 큰 문제입니다.


컴퓨터나 휴대폰에 에뮬레이터를 설치해서 쓰는 분들이 많은데요.

그렇게 쓰는게 제일 활용도가 높으니 그런거지. 뭐, 딱히 다른 이유가 있겠습니까요? ㅎ.ㅎ


아마 이런 질문을 하실 분도 계실 듯 한데요.

'고성능의 MSX3가 나오면, MSX1 용 게임을 제작할 때에도 더 편리하지 않을까요?'

저의 답변: 그냥 PC(데스크탑, 노트북)에서 개발하는게 훨씬 편하고 빠릅니다.


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


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년은 쓰윽~ 흘러갔습니다...


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


2023년 10월 6일 금요일

지난 20년 개발의 추억 #3 - 램상주 폰트의 시작과 끝

연휴는 잘 보내셨나요? 그럼 #3편이 나갑니다요~ ㅎ.ㅎ

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

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

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



[본론]


8. M 파일매니저에 잡다 기능을 통합해보자


컴퓨터 활용에 가장 걸림돌이 되는 것이 뭘까요? 역시 귀차니즘이겠죠ㅋ

이젠 S/W 개발에 불편함이 없으니, 더 편하게 쓰는 쪽으로 나가봅니다.

흩어져 있던 기존 프로그램들을 개선하느니, 걍 M 파일매니저에 다 때려넣는거죠 ㅎ.ㅎ



8.1 MP3 플레이어 통합


기존 MPXP 프로그램은 파일명을 커맨드라인으로 받아서 처리합니다.

별도의 UI 없이 ESC를 누르면 종료하는 식이었죠.

이 MPXP를 M 파일매니저에 통합해서, 백그라운드 재생을 해보아요~


MP3, WMA 등의 음악을 들으면서, 디렉토리 브라우징을 할 수 있게되니 좋네요 ㅎ.ㅎ

듣고싶은 파일들을 선택해서 연속재생까지 해놓으니 손도 편해졌구요.



8.2 IMS 플레이어 통합


MPXP처럼 IMSP 프로그램도 M에서 백그라운드 재생으로 해보아요~

MP3 재생 시에는 파일을 읽어서 바로 디코더(MPX 카트리지)로 전달하면 끝입니다만...

IMS는 파일 전체를 메모리에 로딩 후 처리합니다. 대부분 파일이 128KB 이하니까 크게 부담은 안되겠죠?

혹시 이게 부담되는 환경이라면, 아마 기존 M, IMSP를 실행하는 것도 힘드셨을테니 어차피 상관없을 듯요ㅋ


M에 IMSP를 통합해서 백그라운드 처리로 구현해보니, Z80에서는 조금 부담이 되네요.

최대한 인라인 어셈으로 때워서 막아봅니다.

.

.

혹시 GT가 필요하시면 지금이라도 일옥으로 달리세요! ㅎ.ㅎ



8.3 M LITE 버전


시간이 흐르니 MSX2/2+에서도 M을 쓰시는 분들이 조금씩 늘어나더라구요.

그.래.서. 결국 그래픽과 메모리 사용량을 줄인 M LITE 버전을 만들게 됩니다.


넌인터레이스 그래픽으로 처리하면 화면처리 속도가 2배 넘게 빨라지니까, MSX2/2+에서도 쾌적합니다요.

물론 turboR에서는 겁나 빠른 속도로...ㅎ


참고로, 2013년 초에는 M 기본 버전과 LITE 버전의 실행파일을 따로 릴리스했습니다만,

이제는 M 실행파일 하나로 통합되어있습니다. 메모리 용량이 모자라면 자동으로 LITE모드로 전환합니다.


M.INI 파일에서 넌인터레이스 설정으로 바꿀 수도 있으니, 인터레이스 출력이 안좋은 모니터에서도 도움이 되겠습니다.

그리고, M에 내장된 영문폰트가 맘에 안들면, 외부 폰트를 로딩할 수도 있으니 참고하시고~



9. KS X 1001


80년대 대우 MSX2에서는 조합형 한글이 사용되었습니다.

현재 M 파일매니저에서도 한글 출력을 위해 844 조합형 폰트를 사용합니다만,

한글 코드는 조합형, 완성형 모두 지원이 됩니다.


한글 윈95 시절부터는 폴더, 파일명에 MS CP949가 기본으로 사용되고, 긴파일명(LFN)에서는 유니코드가 쓰입니다.

폴더이름이 한글로 되어있으면, 윈도와 MSX의 M 파일매니저에도 똑같이 볼 수 있으니 편하죠.


근데, M에 IMSP, MP3 플레이어를 넣다보니... 한글 외 특수문자 또는 한자를 표시해야되는 경우가 종종 생기더라구요.

한글은 조합형 폰트가 12KB 정도라서, 프로그램에 넣어도 부담이 없는데요.

KS X 1001 (KS C 5601)의 특수문자(37KB)와 한자(153KB)를 모두 넣으면 용량이 꽤 됩니다.


어떻게 할까 고민을 해보니...

폰트는 램상주로 올려놓고, 여러 프로그램들이 공용으로 사용하면 괜찮을 것 같더라구요.

아무래도 파일이 크니까, 부팅할 때 한번만 로딩하는 편이 좋겠죠? ㅎ.ㅎ

일단 텍스트뷰어(HV)와 M 파일매니저는 해결이 되겠고... 추후 DOS2용 게임을 만들 때도 활용을?!


그렇게 램상주 폰트가 만들어지게 되었습니다 ㅎ.ㅎ



9.1 램상주 폰트 로더


특수문자 로더인 KS_SPE 프로그램입니다.

https://sharksym.blogspot.com/2014/10/ksspe-v10-ks5601.html


한자 로더인 KS_HANJA 프로그램입니다.

https://sharksym.blogspot.com/2014/10/kshanja-v10-ks5601.html



9.2 램상주 폰트... 이대로 좋은가?


특수문자와 한자표시를 할 수 있어서 좋은데, 약간의 애로사항이 있네요.

부팅 시 매번 폰트를 로딩하는 시간이 걸린다는 것과, 여전히 메모리 점유의 부담이죠.

저야 뭐 1MB의 GT라서 걱정 NoNo입니다만...

반년정도 상황을 지켜보니, 저 외엔 폰트로더를 쓰시는 분이 한명도 없더라구요 ㅎ.ㅎ;


MSX에서 MP3나 IMS를 듣는 사람이 별로 없으니...

M, HV에 내장된 한글지원 정도면 충분하다고 생각하시는 거겠죠? ㅎ.ㅎ



10. 한글 폰트팩(FontPack V1)을 만들어보자.


부담없이 한글/한자를 쓸 수 있도록 H/W의 도움을 받아보도록 합시다.

자세한 내용은 아래 블로그 글들을 보셔도 되겠습니다.

https://sharksym.blogspot.com/search/label/_FontPack



10.1 폰트롬 I/O


Kanji 폰트처럼, I/O 포트를 사용합니다.

전체 용량은 2MB입니다. 유저 폰트를 128KB SRAM에 로딩할 수도 있습니다.

자작 프로그램에서 런타임으로 폰트를 변경하는 등으로 활용할 수 있겠네요.


폰트팩의 폰트롬은 Kanji 폰트처럼 1bit의 데이터로 저장됩니다.

대신 스크린6의 2BPP 컬러, 스크린5,7의 4BPP 컬러 변환 기능을 H/W로 넣어보아요~


MSX1의 패턴맵 그래픽은 1BPP로 된 폰트를 읽어서 바로 쓰면 되지만,

MSX2의 비트맵 그래픽은 2BPP, 4BPP, 8BPP입니다.

화면에 표시하려면 컬러로 계산 후 메모리에 써넣어야하죠.


이걸 폰트 I/O에서 직접 처리하면 편할 것 같더라구요.

Fore Color, Back Color 레지스터만 설정하면, 컬러가 적용된 폰트 데이터를 포트로 읽을 수 있습니다.

이 값을 그냥 VRAM에 써넣으면 OK! ㅎ.ㅎ



10.2 문자 코드는 확장 완성형 (CP949)


1995년 MS에서 윈도95를 만들 때 등장했던 코드입니다. 당시에는 논란이 많았던 코드죠?ㅋ

완성형 한글(KS C 5601)에 빠져있던 한글을 몽땅 때려박은...ㄷㄷ


20여년이 지났지만, 지금도 윈도의 파일 시스템에서 기본으로 쓰이는 한글입니다.

폰트롬은 이 코드영역의 문자를 그대로 넣습니다.

S/W에서 상호간 코드 변환(한글 조합, 유니코드 등)을 빠르게 할 수 있도록, 코드변환 I/O도 넣어줍니다.


윈도의 긴파일명(LFN) 또는 MP3 ID3v2의 유니코드를 표시할 때, 코드변환기를 활용하면 좋겠죠? ㅎ.ㅎ

M 파일매니저에서 LFN 표시가 지원된건 2022년이라는 게 함정이네요. (폰트팩 개발된지 7년이 지난ㅋ)



10.3 폰트의 픽셀사이즈는 16 x 16 및 12 x 12


고해상도 모드(가로 512픽셀)에서는 가로폭 16픽셀 폰트로는 64컬럼밖에 구현하지 못합니다.

12픽셀 폰트를 쓰면 85컬럼까지 가능합니다. 저해상도 모드에서도 40컬럼도 가능하겠구요.

이정도면 실사용에서는 충분할 것 같네요.



10.4 문자 출력용 DEVICE


그래픽 모드에서는 GRP라는 DEVICE를 사용합니다.

국딩 때 BASIC 좀 써보셨으면, OPEN"GRP:"AS#1 명령은 달달 외우셨겠죠? ㅎ.ㅎ


폰트팩에서는 FNP라는 DEVICE가 추가됩니다.

본체의 GRP DEVICE와 함께, OPEN"FNP:"AS#2으로 폰트팩 디바이스도 사용가능합니다.

일제 기종에서 일어와 폰트팩 한글을 동시에 출력할 수도 있다는 얘기죠.

대우 X-II에서는 본체의 명조체 한글과 폰트팩의 한글을 동시에 쓸 수 있겠구요.


80년대 만들어졌던 BASIC 프로그램들의 GRP 디바이스명을 FNP로 바꾸면,

폰트팩의 한글로 쉽게 대체할 수 있습니다.

일제 기종에서 아이큐교실 프로그램을 이렇게 구동할 수 있어요.





10.5 한글 IME


한글 출력을 H/W로 넣었으니, 한글 입력기도 S/W로 넣어봅니다.

2바이트 조합형과 CP949 모두 지원됩니다.

폰트팩이 없는 대우 MSX2용 한글 프로그램을 만들 때는 조합형으로 입력해야겠죠? ㅎ.ㅎ


IME 설정은 BASIC, DOS 모두 가능합니다요.

M에서 파일명 바꿀 때에도 한글을 입력할 수 있구요.



10.6 ANSI 스크린


BASIC 및 DOS등에서 활용가능한 ANSI 출력모드입니다.

조합형 한글, 완성형(CP949) 한글의 전환이 가능합니다.

초기에는 인터레이스 모드만 있었지만, 나중에는 넌인터레이스 모드도 추가되었습니다.

그래도 고해상도 모드(가로폭 512픽셀)라서 RGB 모니터가 아니라면 글씨를 읽기 힘들겠네요.




.

.

.


이렇게 램상주 폰트의 말로는 폰트팩의 탄생으로 연결되었습니다.

HV, M에서는 램상주 폰트를 지원하니까 에뮬 등에서 활용하시려면 한번 써보셔요.

(에뮬에서는 폰트팩을 지원안하니까요ㅋ)


2012년 ~ 2015년 사이의 작업들이었습니다.


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


2023년 9월 11일 월요일

Ponpoko Remake #5 - 완성

완성판을 영상으로 보여드려요~

부팅 로고도 살짝 넣었습니다. Ponpoko 일러스트도 함께 나오구요 ㅎ.ㅎ




그리고 치트키도 지원됩니다. (어떤 키를 눌러야하는지 나중에 찾아보세요ㅋ)


XXX키 -> 스테이지 넘기기

YYY키 -> 타이머 멈추기    (한번 더 누르면 해제)

ZZZ키 -> 화난 너구리 모드 (한번 더 누르면 해제)


아래 스샷은 타이머 멈춤과 화난 너구리 모드를 켠 상태입니다~




Ponpoko 리메이크는 이렇게 완료되었습니다.

이번 작업은 기존과는 다른 방식이라서, 나름 재미가 있었네요.


그럼, 즐거운 저녁 되세요! ㅎ.ㅎ/


2023년 9월 10일 일요일

Ponpoko Remake #4 - 사운드 추가

이제 오리지널 3채널 사운드를 MSX쪽에서 구현하면 되겠습니다.


오리지널 보드에서는 각채널의 주파수가 16BIT로 설정됩니다.

볼륨은 4BIT로 설정이 되구요. 뭔가 PSG랑 비슷하죠? ㅎ.ㅎ

이걸 부가 H/W를 쓰지않고 그냥 본체의 PSG로 출력해보아요~


아시다시피 PSG의 레지스터는 주파수(Frequency)가 아닌 주기(Period)를 설정하도록 되어있습니다.

구형파(HIGH/LOW)가 바뀌는 시간을 클럭 카운트 수로 표현하는거죠.


그러면 이 카운터를 구하려면 나눗셈(1/주파수)을 해야하는데, Z80으로 느릿느릿하면 안좋겠죠?

그냥 결과값만 모아서 테이블로 만들어둡시다~

참고로, 이번 Ponpoko 리메이크는 메가롬 카트리지로 제작될 예정입니다 ㅎ.ㅎ


16BIT 주파수를 입력하면 12BIT PSG 카운터(2바이트)이 나오는 테이블입니다.

테이블 계산이 쉽도록 16BIT 주파수에서 하위 12BIT를 잘라서 테이블 주소값으로 사용하고,

상위 4BIT는 메가롬 매퍼의 페이지값으로 넣으면 쉽게 찾을 수 있겠네요.


결과적으로 8KB 테이블 16개가 나옵니다.

이걸 걍 롬에 때려넣어요. 16K 매퍼를 쓰고 있어서, 실제 롬에서는 256KB를 차지합니다 ㅎ.ㅎㅋ



모든 파형을 PSG의 구형파로 출력하니까, 조금 날카롭게 들립니다만... 이대로도 괜찮네요.

근데 볼륨이 이상한지, 채널간 밸런스가 엉망이군요.


왜 그럴까... MAME의 사운드 보드 설명을 읽어보니,

4BIT DAC과 볼륨 조절이 선형(linear)으로 출력되도록 만들어져있네요.

PSG에서 비슷하게 맞도록 조절해줍니다 ㅎ.ㅎ

참고로, PSG 출력 그래프에 직선을 그어보연 이정도로 꽤 차이가 납니다.




이제 대충 밸런스가 맞는 듯 하군요.

그리고, 이 사운드가 PSG로 출력되니까...

PSG I/O로 동작하는 사운드 카트리지(예: T-Wave)가 있으면 좀 더 재밌게 들을 수 있습니다 ㅎ.ㅎ


Ponpoko는 게임 중에는 BGM없이 효과음만 나오는데요.

이게 원래 의도된건지, 프로그램 용량제약 등 다른 문제로 사운드가 간단해진건지 궁금하네요.

스테이지 클리어 하면 짧은 음악이 또 나오긴해요.

근데 움직일 때 '띠띠띠~' 효과음만 나오는게 나름 잘 어울립니다 ㅎ.ㅎ


그럼, 다음편에서 ...


PS. 실제 소리는 다음편에서 영상으로 보여드릴게요 ㅎ.ㅎ/


Ponpoko Remake #3 - 그래픽 작업

메인 화면은 스크린4를 212라인 모드로 구동합니다.

8 x 8 패턴 처리는 MSX1 TMS9918의 스크린2와 비슷합니다.

TMS9918은 모든 스크린이 192라인으로 고정되어있어서, BASIC 명령어도 거기에 맞춰 구성이 되어있어요.


V9938에서는 수직 해상도를 212라인으로 늘려서 쓸 수 있지만, BASIC에서는 지원하지 않습니다.

인터레이스 모드도 BASIC으로는 아무것도 못하니까, 국딩 때는 이걸 어케 쓰는건지 궁금했던 추억도 있습니다요ㅋ


근데, 스크린4에서 패턴 테이블을 4개 쓰더라도, 수직 스크롤을 쓰지 않는다면...

화면 하단에 20라인(212 - 192)이 추가로 보여지는 것 뿐인데요.

패턴 관리에 필요한 CPU 로드는 33%(3장 -> 4장)가 늘어나지만 보여지는 스크린은 약 10% 증가 ㅎ.ㅎ


게임중에 변경이 필요한 부분들은 패턴 4장 모두 똑같이 고정하고,

장면전환 등 CPU 로드가 늘어도 상관없는 때만 패턴을 변경하는 식으로 처리하면 사실 큰 부담은 안됩니다요.


보통 비트맵 그래픽을 작업할 때는 DD구락부를 많이 썼는데요.

이번엔 패턴 편집이 대부분이라, 윈도용 폰트 에디터 yy-chr을 썼습니다.



영문 폰트처럼 여러가지 컬러를 써야하는 경우는, 미리 중복패턴으로 채웠습니다.

아무래도 컬러 테이블(8바이트)을 변경하는 것 보다는, 패턴 코드(1바이트)를 변경하는게 빠르거든요.

게다가 한 테이블에서 서로다른 색의 문자가 나오는 경우도 있으니, 무조건 이렇게 구성해야합니다요!

화면상단에 나오는 타이머 막대기는 짧아지면 색이 바뀌는데요. 이건 팔레트를 바꾸는식으로 처리했습니다.


기본 패턴에 컬러를 입혀서 표시하면 이렇게 나오게 됩니다.



과일 패턴을 4개씩 모아서 찍으면 요렇게 볼 수 있구요.

도트를 열심히 찍었지만, 8도트에 2컬러 제약때문에 품질이 떨어지는 부분도 조금 있습니다요ㅋ



이제 스프라이트도 넣어야겠죠?


오리지널 4컬러 스프라이트는 V9938의 스프라이트 모드2에서 레이어 2개를 겹치면 똑같이 구현가능합니다.

OR되는 픽셀 컬러를 휴리스틱 알고리듬으로 잘(!) 선택해서 배치하면 이렇게 되네요.


0. 0000 = 검정 

1. 0001 = 타이머 전용  -> 파랑/노랑/빨강

2. 0010 = 오렌지       -> 당근, 감, 옥수수, 파인애플, 오렌지

3. 0011 = 연보라       -> 가지, 포도, 복숭아

4. 0100 = 녹색         -> 완두콩

5. 0101 = 살구색

6. 0110 = 갈색         -> 밤, 땅콩

7. 0111 = 파랑         -> 가지

8. 1000 = 짙은 하늘색  -> 멜론, [사다리], [층바닥]

9. 1001 = 갈색         -> 너구리 전용

A. 1010 = 빨강         -> 너구리 전용

B. 1011 = 흰색         -> 너구리 전용

C. 1100 = 흰색         -> 무, 문자열

D. 1101 = 빨강         -> 앵두, 버섯, 수박, 딸기, 사과, [압정]

E. 1110 = 하늘색       -> [외벽], [스코어 숫자]

F. 1111 = 노랑         -> 바나나, 맥주


스프라이트 OR 컬러의 경우, 너구리를 예로 들면요...

갈색(9번) 레이어와 빨간색(10번) 레이어가 사용되는데요.

픽셀이 겹치는 부분은 OR연산으로 흰색(11번)으로 표시됩니다.

이런식이죠.




전체 스프라이트 패턴은 아래처럼 볼 수 있습니다.



실제 데이터는 이런 테이블이 4장 들어갑니다. 8 x 8 패턴이 1024개!

게임 내에서는 너구리가 좌우, 상하 반전되는 것 때문에 그렇습니다요.

오리지널 Ponpoko에서는 스프라이트를 패턴 개별로 XY flip 처리되는 속성이 있어서, H/W가 그냥 해주더라구요.

H/W가 딸리는 MSX2에겐 대용량 VRAM 128KB으로 떼우는 방법이...ㅋ

결국 Ponpoko 리메이크에서는 스프라이트를 4페이지로 구성했다는 얘기였습니다.


여담이지만,

MSX2 BASIC에서는 비트맵 스크린의 ACTIVE, VIEW 페이지 명령어가 있는데요.

사실 V9938은 패턴맵 테이블, 스프라이트 패턴, Attrib 테이블 등도 바꿀 수 있습니다.

게임에서는 이런 테이블을 여러개로 만들어서 페이징을 하게 됩니다. 참고하세요~


도트 작업(막노동ㅋ)을 하다보면 언젠가는 끝이 납니다 ㅎ.ㅎ


그럼, 실제 화면에서는 패턴 그래픽과 스프라이트가 어떻게 나오는지 보시죠!






아마 나중에 동영상으로 보시면 확인되겠지만,

스프라이트의 레이어 우선순위도 오리지널과 똑같게 구성했습니다.

너구리가 앞쪽, 항아리/뱀은 중간에, 애벌레는 뒷쪽 레이어로 나옵니다 ㅎ.ㅎ


그럼, 다음편에서 보아요~


2023년 9월 9일 토요일

Ponpoko Remake #2 - 소스없이 포팅

게임을 공식적으로 리메이크를 하게되면, 원본 소스(코드, 그래픽 등)를 포팅(이식)하게 됩니다.

근데 비공식으로 리메이크하게되면, 원본 소스가 없으니 사실상 게임을 새로 만드는 것과 비슷합니다.


게임을 새로 기획하거나, 캐릭터를 새로 디자인하는게 아니니까,

간단한 게임의 리메이크라면... 프로그래머 한명으로도 가능합니다요.

제작하는데 시간이 많이 걸리느냐, 적게 걸리느냐 정도의 차이는 있겠네요 ㅎ.ㅎ


이 경우 리메이크의 완성도를 결정하는 것은,

프로그래머가 그 게임을 얼마나 잘 알고 있느냐의 정도라고 생각되네요.


그럼, Ponpoko 리메이크는 어떻게 진행하면 좋을까요?

늘 하던대로 눈카피? ㅎ.ㅎ


먼저 아래 스샷을 보시죠. MAME에서 실행하면 처음에 나타나는 게임정보입니다.




먼저, 리메이크를 만들 때 가장 중요한 부분은 비디오쪽입니다.

아무래도 게임에서 그래픽이 차지하는 비중이 높은데, 이게 쉽게 되면 좋죠 ㅎ.ㅎ

제가 지난글에서도 그래픽부터 언급한 이유가 그 때문입니다.

사실 이게 안되면 걍 포기해야됩니다요~~ㅋ


사운드 정보는 간단하게 남코의 96KHz H/W로 나오는데요.

보드 내부적으로는 파형샘플을 주파수에 맞춰 3개 채널을 믹스해서 최종 모노 오디오를 만듭니다.

결국 3채널짜리 SCC를 보드로 만들었다고 생각하시면 되겠네요.

SCC는 샘플램에 데이터를 매번 로딩해야하지만, Ponpoko는 롬샘플이라 CPU가 로딩할 필요가 없습니다.

지난글에서 구동환경을 MSX2 최소사양으로 잡았는데요.

만약 PSG 3채널로 그럭저럭 괜찮은 소리가 나온다면 좋겠네요 ㅎ.ㅎ


보통은 여기까지 생각하고 넘어갑니다만, 이번엔 하나를 더 봅시다요!

CPU 정보를 보니, 3MHz짜리 Z80 하나만 나와있네요?!

보통 오락실 기판에 Z80이 박혀있으면, 사운드 컨트롤 전용으로 쓰이는게 대부분인데요.

그게 아니면 여러개의 Z80 CPU가 들어있거나요.


근데 Ponpoko는 MSX의 3.58MHz 보다 느린 CPU입니다 ㅎ.ㅎ

이걸로 추측해볼 수 있는 것은...

CPU 로드가 낮다 -> H/W에 의존하는 그래픽, 사운드 외의 S/W 테크닉은 사용하지 않음!


네, 그냥 게임 로직을 돌리는거 외엔 별로 하는 일이 없다는 얘기입니다.

게임을 만들다보면 CPU 로드가 늘어나서 사양을 높이거나 다른 처리(그래픽, 사운드)를 삭제하게 되는데요.

Ponpoko 리메이크는 진짜 MSX2만으로 충분할 것 같은 느낌이라는거죠.



자! 그럼 작업을 시작합니다!!

너구리의 숏점프, 롱점프 움직임을 스샷으로 한프레임씩 잡고 데이터를 테이블로 정리!

적들(애벌레, 오리)의 프레임당 이동량을 확인! (참고로 애벌레는 속도가 다른 3종류가 나와요.)

이것만으로 힘들다면...?

MAME 디버그 창을 띄워놓고 프레임을 끊어서 변수값을 보거나,

소스를 수정해서 데이터를 직접 로그(파일)로 저장 등의 방법을 씁니다.

.

.

.

근데, 이번엔 이렇게 안했어요ㅋ


사실 로직이 워낙 단순해서 이렇게 해도 금방 만듭니다만...

방금 Ponpoko의 메인 CPU가 Z80이라고 했잖아요?


보통 게임을 눈카피하게 되면, 원작과 미세하게 차이가 나는 부분들이 생기게 마련입니다.

적 또는 아이템 충돌 범위가 다르거나, 점프할 때 적용되는 중력 가속도가 다르거나 등등이요.

만약 원본 코드를 가져다 쓸 수 있으면, 이 부분을 똑같이 구현할 수 있습니다.


공식 리메이크라면 소스를 가져와서 컴파일했겠지만,

이번 Ponpoko 리메이크는 비공식이니, 그냥 롬에 들어있는 Z80 머신코드를 가져다 쓰는거죠. (Z80 만세!)


그리고 이게 쉽게 되는 이유 중 하나가 더 있는데요.

Ponpoko의 주변 I/O는 모두 메모리맵 I/O이고 포트맵 I/O를 쓰지않습니다.

반대로 MSX는 대부분 주변 I/O가 포트맵 I/O이고 메모리맵 I/O들은 이미 슬롯으로 보호받고 있습니다.

그러니까 메모리맵 I/O만 잘 분리해주면, MSX에서 충돌하지 않는다는 얘기에요.

관련된 코드는 잘 정리(패치)를 해서 오동작하지 않도록 해주면 됩니다.

인터럽트 관련 코드도 마찬가지겠구요.


뭔가 일반적인 리메이크 작업과는 상당히 다르게 진행되는데요.

저도 이런식으로는 처음 해보는거라 꽤 재미있었습니다.


그럼, Ponpoko의 메인코드를 초간단 그래픽 에뮬을 넣어서 테스트해봅니다.

걸음마 떼는게 쉽게 되면, 나머지 구현은 시간문제니까요.


아래 스샷의 왼쪽은 MAME, 오른쪽은 MSX입니다.




MSX쪽은 스크린1을 212라인 모드로 전환해서 돌렸구요. 패턴 데이터는 BIOS 폰트 기본값입니다.

오른쪽 스샷을 매트릭스 네오의 눈으로 보면, 왼쪽이랑 똑같죠?ㅋㅋ



지난글의 댓글에서 제가 "느낌이 아케이드랑 99% 같을거에요. 이건 제가 보장합니다."라고 적었는데요.

왜 그런건지 이제 이해되시죠? ㅎ.ㅎ


그럼, 다음 편에서 이어집니다~


2023년 9월 8일 금요일

Ponpoko Remake #1 - 너구리 게임을 아시나요?

[서론]


80년대 오락실에 있던 너구리 게임을 아시나요?

원제는 Ponpoko입니다.




단순한 그래픽, 사운드에 너구리의 스킬이라고는 숏점프, 롱점프 뿐이지만...

적들을 피하면서 고득점 보너스를 받으려고 발악(?)하는 재미가 있었지요 ㅎ.ㅎ

실력이 늘면 클리어 속도도 빨라집니다만, 그만큼 실수할 확률도 올라가서... 흐~


사실 이 게임을 한동안 잊고 있었는데요.

한달전에 게시판에서 Ponpoko 게임얘기가 나와서, 뭔가 팍 머리를 스쳐지나갑니다! 응?


여태 이 게임이 정식으로 리메이크가 나온적이 없더라구요.

이거 한국에서만 인기가 있었나? 뭐 그런 생각도 들었습니다.

심지어 그 흔한 ZX Spectrum 용 포팅도 없네요.


그럼, 뭔가 동기부여가 되는 느낌이죠? MSX용 Ponpoko 리메이크 제작에 대한 동기부여욤 ㅎ.ㅎㅋ



[본론]


Ponpoko는 이미 수십년(?) 전에 MAME에서 에뮬이 되고, 비디오, 오디오에 대한 분석도 끝난 게임이라...

지금와서 리메이크를 만드는 데에 별 어려움은 없습니다.


늘 그랬지만, 한가지 문제라면... 역시 MSX의 게임성능이겠죠?

구동 환경을 어느정도의 선에서 그어야 할지 일단 좀 살펴보아요~


12년 전에 ASO 리메이크를 만들 때는 turboR 외엔 답이 없는 게임이었지만,

Ponpoko는 조금 저사양을 타겟으로 만들어도 괜찮을 것 같습니다요.




80년대 흔했던 5층 아파트 구조입니다ㅋ 옥상을 포함하면 총 6층이네요.

각 층은 32라인으로 그려지고, 옥상도 동일합니다.

화면의 필수영역(빨간 박스)은 32라인 x 6 = 192라인(많이 보던 숫자?!)입니다.

가로 화면은 256픽셀이니까, 이거 최소 256 x 192 픽셀이 필요하다는 얘기죠.


전체 스크린은 256 x 224픽셀으로, V9938의 오버스캔 트릭을 쓰면 손실없이 모두 출력가능합니다만,

이번에는 오버스캔없이 정식 출력을 쓸 계획입니다.


1층의 하늘색 바닥을 그리지 않고, 스크린 테두리(Border)로 표현하면 1라인 여유가 있으니까...

여기에 스코어를 표시하면? MSX1의 스크린2 (256 x 192)에서도 대충 그려볼 수 있겠구요.


하단(녹색 박스)부분은 제외하고, 상단(노란색 박스)를 포함하면 256 x 208라인이 되는데요.

만약 V9938의 스크린4(그래픽3) 모드에서 212라인출력을 써서 구현하는 방법도 있겠습니다.

이 경우는 하단의 남은 너구리 표시는 우측 상단에 넣어도 되겠네요.

오리지널 Ponpoko는 2인 플레이 시 우측상단에 2P 스코어가 표시 되지만, MSX에서 굳이 넣을 필요는 없으니까요.



다음으로, 아이템과 움직이는 캐릭터를 봅시다.




과일 아이템은 16 x 16 그래픽인데, 내부적으로는 8 x 8 패턴 4개를 붙여서 만들어져있습니다.

그 외 작은 압정, 사다리 등도 8 x 8 패턴입니다.


Ponpoko의 아케이드 보드도 패턴 데이터를 출력하는 방식이라서,

VDP의 패턴 그래픽 모드를 비슷하게 활용해도 될 것 같네요.

아이템은 화면상의 8픽셀 단위로 그려집니다. 더이상 움직이지도 않구요. 패턴 그래픽에 딱맞는 그림이죠?


물론 VDP의 패턴모드에서는 수평 8픽셀에 컬러 2개 밖에 못 쓰니까, 실제 구현 시 안이쁘게 나올 여지는 있습니다.

사실 말이 컬러 2개지, 실제로는 1개랑 마찬가지에요. 배경에 다른색 하나 찍는거니깐ㅋ


참고로 Ponpoko 보드는 패턴에 4컬러를 쓸 수 있습니다.

검정 배경을 제외하면, 3개의 컬러가 한 패턴에 나올 수 있습니다.


주인공 너구리와 적 캐릭터(애벌레, 뱀)는 모두 1픽셀 단위로 이동이 되구요.

컬러는 패턴과 동일한 4컬러 출력을 사용합니다. 역시 투명색을 제외하면 3컬러가 출력되겠네요.


참고로, TMS9918에서 스프라이트로 3색을 구현하려면, 레이어 3개를 겹쳐야합니다.

TMS9918, V9938 모두 스프라이트 레이어가 32개 있으니...

캐릭터 하나당 3개씩 쓰면 화면상에 총 캐릭터 10개까지는 가능합니다.


사실 MSX의 스프라이트는 레이어 갯수 보다는, 수평 출력 제약때문에 구현이 좀 어렵습니다.

TMS9918처럼 같은 수평라인(Scanline)에 4개밖에 출력이 안되는 경우엔, 프레임을 나눠서 스프라이트 레이어를 섞어야하죠.

결과적으로 레이어 우선순위에 따라 캐릭터가 깜박거리게 됩니다만,

아예 안보이는 것 보다는 나으니까, 이렇게라도 해야겠지만요 ㅎ.ㅎ (사실 MSX1용 게임 99%가 이런식이죠.)


전체 스테이지 20개를 모두 스샷으로 잡아서 확인해보니,

수평라인에 스프라이트가 최대 4개까지만 나오네요 ㅎ.ㅎ

애벌레, 뱀이 각 층에 분산되어 최대 3마리만 나옵니다. 너구리까지 포함하면 수평으로 최대 4개가 표시되는거죠.


만약 이걸 MSX2의 스프라이트 모드2를 쓰게 되면, 라인 제약인 스프라이트 8개로 모든 컬러를 구현할 수 있겠습니다!!

사실 캐릭터가 빠르게 움직이는 경우(슈팅 게임)는 스프라이트가 좀 깜박이더라도 봐줄만 합니다만,

Ponpoko는 죄다 느리게 움직이는 애들이라, 실제로 깜박이면 상당히 짜증이 날거에요.

1982년산 허접해보이는 Ponpoko 스프라이트도, MSX1으로 구현하려면 ㅠ.ㅠ

좀 제대로 보이게 하려면, 스프라이트 모드2를 써야겠네요.


그럼 답은 나왔네요.

수직, 수평 스크롤이 필요한 게임도 아니니까, MSX2 기본사양(램 64KB)을 타겟으로 리메이크를 시작합니다!

최종 S/W는 카트리지로 구동이 되며, 디스크롬은 사용하지 않을 예정입니다.


.

.

.


일단 시작했으니, 타이틀 화면부터 만들어보아요~ ㅎ.ㅎ/




참고로, 화면에 나오는 "The 80s REVIVAL"은 이번 Ponpoko 리메이크를 제작한 팀 이름입니다.


그럼, 이만~


2023년 8월 29일 화요일

지난 20년 개발의 추억 #2 - 램상주 폰트로의 여정

#1편의 기억이 잊혀질 때 쯔음, #2편이 시작됩니다 ㅎ.ㅎ

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

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


[서론]


2004년 ~ 2008년,

그 동안 MMC/SD Drive V1, V2 보드가 제작되면서, 다시 파라동으로 돌아온 분들이 꽤 계셨습니다.

물론 다시 돌아오신 분들은 'MSX 게임들을 실기로 다시 해보고싶다'의 바램이셨겠지요? 아마 맞을겁니다ㅋ


어쨌든 동호회 내에서 MSX를 갖고 노는 아자씨들이 늘어나려면, 공통 분모가 될만한 것들이 생겨야하는데요.

제가 만드는 것들을 다른 분들도 원하느냐? 아니냐?가 중요한게 아니라...

만들어진 것들 중 하나라도 그 분들의 관심을 끌어서, 같이 얘기할 수 있는 것들이 되어야합니다.


저한테만 필요한 것들을 만들어서 혼자만 놀면 어떻게 되나구요? 음... 조금 덜 재밌습니다. 그리고, 외롭구요 ㅎ.ㅎ

오락실에서 원코인 클리어를 하더라도, 뒤에서 구경하는 친구들이랑 같이 떠들면 더 신나는 것과 비슷한 느낌?ㅋ



[본론]


4. 개발환경을 MSX-DOS2로 옮겨보자


MMC/SD V2를 쓰시는 분들이 많아지니까, 이젠 DOS 정도는 대충 익숙해지셨다고 판단됩니다.

FAT16에 대용량 파티션(4GB)를 쓰려면 DOS2가 필수니까, 반강제로 본체 메모리도 많이 증설하셨을테구요ㅋ


이제 앞으로 개발하는 프로그램들은 DOS2용으로 가도록 합니다.

일단 좀 편하게 시작하기 위해, 구글링을 해봅니다. 쓸만한 DOS2용 툴이 있으면 가져오면 되니까욤~

.

.

.

없네요 없어... -_-



4.1 메모리 매퍼에 프로그램을 올리자


메모리 매퍼는 MSX2와 함께 등장했습니다.

근데, Main BIOS에서 지원되는 기능도 없고, '개발자가 알아서 잘(?) 사용하세요!'의 개념이라 좀 애매했습니다.


나중에 DOS2가 등장하면서 메모리 매퍼용 확장 BIOS가 추가되었는데요.

시스템 세그먼트, 유저 세그먼트 등으로 메모리를 구분해서 할당하고 사용할 수 있도록 되었습니다.

하지만 관련 개발툴이 하나도 없다보니... '개발자가 알아서 잘(?) 사용하세요!'의 개념은 여전합니다.


90년대 메모리 매퍼를 활용하는 자작 프로그램들이 몇몇 있었는데,

결국 이것들은 모두 개발자가 잘(!) 사용한 경우라고 봐야겠네요 ㅎ.ㅎ


사실 "메모리 매퍼에 프로그램을 올리자"를 구현하는 방법은 여러가지가 있겠지만,

일반적인 메모리 뱅킹 구조로 개발하는 툴을 만들어서 DOS2 메모리 매퍼에 맞추는 것이, 가장 좋은 방법이라고 생각되었습니다.

(혹시 메모리 뱅킹이 뭔지 모르시면 구글링 해보셔요~ ㅎ.ㅎ)


각 코드(오브젝트)가 분배되는 뱅크의 번호만 지정해두면, 개발툴이 자동으로 코드를 만들어주는 것이죠.

보통 작은 MCU에 대용량 코드롬을 붙여서 개발되는 제품에서 흔히 볼 수 있습니다.

(물론 사용자는 알 수 없고 개발자들만 알겠지만요)


그렇게 시작된 프로젝트가 이겁니다.

https://github.com/sharksym/CPMEMU_HI-TECH_C


기존 DOS1을 위해 사용하던 HI-TECH C 환경에 'MSX-DOS2 Banking toolkit'을 만들어서 붙이는 것이죠.

요약하면, 개발자가 순수 C코드만 만들고 Makefile에 뱅크 번호만 붙여주면, 툴이 알아서 빌드해줍니다.


아래는 예제 프로그램인 테트리스의 설정 중 일부입니다. 참고하셔요~




조금 설명을 붙여보면요,

뱅킹 영역은 32KB(0100H ~ 7FFFH)입니다.

각 뱅크별로 코드와 Heap(~7FFFH)을 쓸 수 있고, 전역 변수(데이터)를 위해 공용 Heap(9400H ~)도 사용가능합니다.

Stack은 Page 2, 3 남은 영역을 모두 쓸 수 있구요.

뱅킹 Stack은 별도의 메모리 영역을 쓰기 때문에, 함수(Function)에서 스택으로 인수를 전달할 때 문제가 생기지않습니다.

큰 데이터를 사용할 수 있도록 메모리 매퍼 용 함수들도 들어있습니다.


기존 DOS TPA(64KB)에서 개발하던 방식 그대로 코딩하더라도, 큰 용량의 프로그램을 제작할 수 있게 되었죠.

최대 2048KB 크기의 프로그램을 만들 수 있습니다. 각 뱅크가 32KB를 넘지않도록 잘 나눠주기만 하면 Ok!


초기에는 툴을 MSX-DOS용으로 만들어서, 실기에서도 빌드를 할 수 있게 했는데요.

이게 옵티마이저 코드가 계속 늘어나다보니, 실기에서는 무리라고 판단.

결국 윈도 용으로만 남게되었습니다.


CP/M 에뮬, make, 뱅킹 툴은 윈도(win32) 프로그램이구요.

HI-TECH C의 컴파일러, 링커는 그대로 사용됩니다. CP/M 에뮬을 통해서요.



4.2 그래픽 라이브러리도 넣자


이제 메모리 제약이 없어지니, 굳이 Main/Sub BIOS를 호출할 필요가 없네요.

그냥 DOS2 램에서 실행하는게 짱입니다.

특히 turboR의 고속모드를 사용하는 경우라면 더욱 효과적이죠.


예전엔 BASIC, 어셈블리로 힘들게 코딩했는데...

그냥 C 라이브러리로 용량 제약없이 만들 수 있게되니 좋네요.

필요한 거 다 때려넣어요~ 인터레이스 모드 그래픽, 스프라이트 페이징 등등

특히 그래픽 함수들이 인터레이스를 지원하도록 다 만들고나니 너무~너무~ 좋네요.


사실 인터레이스 출력은 MSX2 시절 V9938부터도 되었는데, BIOS에서 전혀 지원이 안되었습니다.

개발자가 아니라면 건드리지도 못했다고 봐야죠. 이건 MSX2, MSXturboR 시절에도 마찬가지였죠.


아래는 그래픽 데모입니다. 오래되서 화질이 안좋지만 대충 봐주셔요~ ㅎ.ㅎ




4.3 사운드 라이브러리도 넣자


MML 데이터를 사용하는 BGM 플레이어와 효과음 출력루틴을 만들어봅니다.

평소에는 BGM을 출력하다가, 효과음이 필요할 때 한채널의 BGM을 끄고 효과음으로 전환하는 방식입니다.


아래는 예제 프로그램인 테트리스의 사운드 코드의 일부입니다. 참고하셔요~





4.4 R800 곱셈도 넣어보자


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

C로 프로그램을 만들게 되면, 테이블 주소 계산 시 곱셈이 꽤 사용되는데요.

turboR 전용 프로그램을 만들 때는 이걸 R800 전용 명령어로 교체하면 좋겠죠?




Makefile에 빌드 옵션도 넣고, 이리저리 삽질을~ㅋ

그러고보니, 초기 M 파일매니저에는 R800 전용 빌드도 따로 있었네요.


참고로, R800 코드로 변경하는 부분은,

컴파일러가 생성한 어셈코드를 옵티마이저가 파싱해서 패치하는 방식입니다.

곱셈 라이브러리를 2벌로 만들어도 되긴한데, 어차피 속도 때문에 넣은거니 걍 소스를 고치는 식으로ㅋ



5. DOS2에서 돌아가는 프로그램을 만들자


이제 어느정도 준비가 되었으니, 머리에 떠오르는 것들을 하나씩 만들어보아요~



5.1 한글 뷰어를 만들자


인터레이스 모드에 대용량 메모리도 가능하니, 조합형(8x4x4) 한글 폰트를 넣어봅니다.

마치 486 화면을 보는 것 같네요 ㅎ.ㅎ




십여년이 흘러 지금은 FontPack의 도움으로 유니코드도 표시가 됩니다요~





5.2 파일 관리자를 만들자


이미 90년대에 일본에서 DOS2 전용으로 제작된 파일관리자(MultiMente)가 있었습니다.

근데 제가 섬나라 감성과는 안맞네요. 화면을 보기만해도 표정이 (-_-) 이렇게 되서...ㅋ


MS-DOS에서 널리쓰이던 NC, Mdir을 적당히 섞어봅니다.

역시 본인 입맛에 맞게 만드는 게 제일입니다요~ㅎ.ㅎ

이름은 'M File Manager'로 붙였습니다.




처음부터 turboR 용으로 만든거라 프로그램이 꽤 무겁습니다.

초기에는 기본 빌드를 R800 전용으로 만들고, MSX2/2+를 위해 일반 Z80 빌드를 따로 추가했습니다.

그러니까 프로그램이 2개였죠 ㅎ.ㅎ


나중에는 메모리가 적은 환경을 위해 Lite 모드도 넣고,

넌인터레이스 모드도 지원하도록 되어서, MSX2에서도 조금 쾌적하게 만들었는데요.

그래서, 프로그램이 3개가 되었습니다요.

.

.

아마 MMC/SD V3,V4에 기본으로 넣어놔서, 반강제적으로 쓰고 계신 분들이 많을 걸로...ㅋ


참고로, 지금은 다 통합되어서 프로그램 1개입니다.

메모리 매퍼 여분이 부족하면 Lite로 런타임 전환됩니다~ ㅎ.ㅎ



5.3 IMS 플레이어를 만들자


메모리 매퍼를 코드뱅킹뿐만 아니라, 일반 대용량 데이터를 처리하는 용도로 쓸 수 있습니다.

lmem으로 16KB 세그먼트를 최대 64개, 1024KB까지 쓸 수 있습니다.




근데 이걸 어디에 쓰나구요?

MS-DOS 시절 OPL2로 만든 ROL/IMS 음악들이 한창 유행하던 시절이 있었습니다.

가사(ISS)를 보여줄 수 있는 IMS 파일들이 마구마구 쏟아져 나왔어요.


MSX에서 놀고있는(?) OPL4 사운드카트리지(MoonSound)를 이용해서 IMS 플레이어를 만들어봅니다.

IMS 데이터가 대게 64KB ~ 128KB 근처니까 테스트 용으로 딱 좋은거죠~ ㅎ.ㅎ


오래된 영상이라 화질이 안좋으니, 대충 소리만 들으셔요~





5.4 테트리스를 만들자


그래픽 테스트에는 역시 게임이 최고아닐까요?

간단하게 테트리스를 만들어봅시다.




아래 영상에서는 FM 사운드 테스트와 테트리스 BGM 테스트가 나옵니다.

화면 밝기가 엉망이네요, 대충 구경하셔요~ ㅎ.ㅎ





5.5 ASO 리메이크를 해보자


때는 2011년 여름...

회사에서 개발하던 제품(은하S2)의 출시가 끝나고 잠깐 여유가 생겨서, 좀 더 확실한 테스트 코드를 만들어보기로 합니다.


본격적으로 비트맵 그래픽을 활용하는 게임이 되겠네요.

화면에 등장하는 캐릭터가 워낙 많아서 스프라이트를 분할(홀짝 프레임 나누기)해서 처리해도 빠듯합니다.

- 지상에서 움직이는 물체는 S/W 스프라이트로 구현

- 사운드는 오리지널 OPL1 사운드를 MAME로 덤프해서 활용

- 기본 화면은 수직 스크롤을 쓰고, 거대 보스를 움직일 때는 수평 스크롤 트릭을 사용

- VDP의 수직 오버스캔 트릭으로 256 x 240 스크린 처리


오버스캔을 쓰면 블랭킹 구간이 짧아서, 배경화면 처리가 꽤 힘듭니다.

결국 이걸 60fps로 구현했죠. 물론 turboR 전용으로요. 흐흐~~


아래는 AREA1 구현 완료 후 올린 영상입니다.




5.6 16KB/32KB 게임 러너를 만들어보자


아마 ODO 같은 DOS의 TPA 메모리에 16KB/32KB의 롬 이미지를 로딩해서 구동하는 프로그램을 많이 써보셨을거에요.


이것과 비슷한 프로그램을 한번 만들어보아요~

차이라면... 상태저장이 된다는 것과 게임 중 다시 DOS로 복귀가 가능하다는 것?

이름은 GRUN입니다.

https://sharksym.blogspot.com/2012/04/grun_16.html


32KB 이하의 롬 카트리지들은 BIOS의 ISR 루틴을 그대로 활용합니다.

특별히 슬롯 전환을 하는 부분도 없구요. 구조가 간단한 프로그램들이죠.


Page 0에 Main BIOS를 복사해서 특수 키 처리를 넣으면 되겠구요. (DOS 복귀 등)

DOS 복귀할 때는 Page 3의 메모리만 원복해주면 되겠습니다.

사실 간단한 프로그램이에욤.


참고로, 이 프로그램은 나중에 MMC/SD V3의 GameRunner로 업그레이드됩니다 ㅎ.ㅎ

MMC/SD V4에서는 GameRunner II로 진화합니다.

사실 GRUN, GameRunner, GameRunner II 모두 이름은 같은데 내부 동작은 많이 다르긴해요.

암튼 그렇습니다요~



6. Scanline Eraser





MSX랑 직접적인 관계는 없지만, 제가 자작한 H/W 중에서는 가장 히트했던 물건이라 적어보아요~ ㅎ.ㅎ

https://sharksym.blogspot.com/search/label/_Scanline%20Eraser


아날로그 RGB 출력의 홀수(또는 짝수) 스캔라인을 지우는건데요.

LCD 디스플레이를 CRT처럼 스캔라인 사이의 검은 공간을 만들어주는 기능입니다.




외국에서 Scanline Generator로 개명당해서 많이 팔렸었죠.

알리익스프레스에서는 아직도 팔고 있...ㄷㄷ



7. MMC/SD V2 Multi-ROM II


때는 2012년 가을...

MMC/SD V2는 SCC 칩이 들어있어서, 내장 멀티롬 기능으로 코나미 게임을 즐기는 용도로도 꽤 쓰였습니다.

조금 아쉬운 점이라면, 멀티롬 용량이 최대 384KB라서요. 메탈기어2 같은 512KB 롬을 구동을 못한다는거죠.


SCC 사운드를 좋아하시는 분들에게 납땜 연습(?)거리를 만들어드리기로 합니다.

MMC/SD V2를 개조해서, 512KB 플래쉬롬 15개를 추가하는겁니다.

기본 멀티롬 용량 384KB에서 멀티롬II로 용량이 7680KB로 바뀌는거죠.

아래는 테스트용으로 플래쉬롬 7개를 추가한 모습입니다.




롬 용량은 커졌지만, SCC 매퍼의 한계 512KB 어드레싱은 넘을 수 없으니...

1024KB 등의 큰 롬은 다운로드가 불가능합니다.

16KB ~ 512KB 사이즈의 롬을 여러개 채워넣는 것만 가능합니다요.

요렇게요~




V2의 부트메뉴에서 진입하면 아래처럼 롬 선택 메뉴가 나옵니다.




나중에 V4에서도 비슷한 UI로 구현된 SUB-ROM이 들어갑니다 ㅎ.ㅎ


.

.

.


2010년에서 2012년까지 또 미친듯이 달렸던 기억들을 모아봤습니다.

이번에도 "램상주 폰트" 얘기는 못 넣었네요. 다음편에서는 꼭 나옵니다. 진짜루요 ㅎ.ㅎ


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


2023년 8월 23일 수요일

MMC/SD Drive V3/V4 - BIOS & Tool v5.71

Download: 20230823_MMCSD_Drive_V3_V4_BIOS_Tool_v571.zip


아래는 추가수정된 BIOS ROM파일입니다. MMCSD571.ROM 파일만 교체해서 쓰세요.

--------------------------------------------------
MMC/SD Drive(tm) V3/V4 - BIOS & Tool
    By Yeongman Seo <sharksym@hitel.net>
--------------------------------------------------


[ BIOS & Tool v5.71 ]

- GameRunner II

  FEEDBACK 로딩 시 멈춤문제 수정

- FDD_EMU

  내장 확장슬롯 처리 개선
  -> DOS2 Hybrid 모드 외에는 확장슬롯 OFF


[ 업데이트 가이드 ]

1. MMCSD.COM, MMCSD.OVL 두개 파일을 SD카드에 복사.
   기존 파일을 덮어쓰면 됩니다.(예:UTILS 디렉토리)

2. MMCSD571.ROM 파일을 SD카드 루트에 복사.

3. MSX-DOS2 부팅 후 명령창에서 아래처럼 입력.
   A:\>MMCSD MMCSD571.ROM

4. 다운로드 완료 후 리턴키 눌러서 재부팅.

5. 끝

2023년 8월 12일 토요일

제가 만든 기기의 PCM 출력 종류

어제 파라동에서 MV Player의 PCM 포트에 대한 댓글을 적다가 생각나서 조금 적어봅니다.


제가 만든 기기들 중에 PCM 기능이 들어간 3종류의 기기가 있습니다.


1) MMC/SD Drive V4

-> unsigned 8bit mono PCM


I/O 포트는 필립스 뮤직모듈(0AH) 또는 코복스(91H)로 선택가능합니다. (default: 91H)

참고로 V4를 두개 꽂으면, 각각 뮤직모듈과 코복스로 자동설정됩니다.

MMCSD/COM에서 MV/MA Play 시 사용됩니다.



2) T-Wave

-> unsigned 8bit stereo/mono PCM


전용의 I/O 포트(mono: 3CH, stereo: 3DH)를 사용합니다. (default: OFF)

스테레오 데이터는 L -> R -> L ... 순서입니다. WAV 파일의 데이터 순서와 같습니다.

MMCSD.COM에서 MV/MA Play 시 mono 포트가 사용되며, 스테레오 WAV를 재생할 때는 stereo 포트가 사용됩니다.



3) MoonBase

-> signed 16bit mono PCM, unsigned 8bit mono PCM


16bit PCM은 전용의 I/O 포트(3EH)를 사용합니다. (default: OFF)

16bit 데이터는 low 8bit -> high 8bit -> low 8bit ... 순서입니다. WAV 파일의 little-endian 순서와 동일합니다.

MMCSD.COM에서 16bit WAV 재생 시 사용됩니다.


8bit PCM은 필립스 뮤직모듈(Y8950 + unsigned 8bit PCM)을 에뮬레이션합니다.

I/O 포트는 뮤직모듈(08H ~ 0FH)를 사용하며, 리셋 기본값은 포트 OFF입니다.

Y8950의 GPIO 에뮬레이션으로 ON됩니다.

MMCSD.COM에서 MV/MA Play 시 사용되며, 모노 WAV를 재생할 때에도 활용됩니다.


마지막으로,

MMCSD.COM에서 8bit PCM 출력시의 포트 우선순위입니다.

1. T-Wave

2. MMC/SD V4

3. turboR PCM

4. Philips Music Module



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


2023년 8월 11일 금요일

MMC/SD Drive V3/V4 - BIOS & Tool v5.70

Download: 20230811_MMCSD_Drive_V3_V4_BIOS_Tool_v570.zip


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

MMC/SD Drive(tm) V3/V4 - BIOS & Tool

    By Yeongman Seo <sharksym@hitel.net>

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



[ BIOS & Tool v5.70 ]


- Video Player


  싱크 타이밍 향상 및 구버전 SD의 성능개선


  재생 조절용 키처리 추가

  -> SELECT: 역재생

     RETURN: 빨리감기(8배속)

     BS: 되감기(8배속)

     CAPS Lock On: 현재 파일의 반복재생


- Audio/Video Player


  파일명에 와일드카드를 사용할 수 있음

  예) MMCSD.COM *.MV

      MMCSD.COM *.WAV


  여러개의 파일을 연속재생 시, 키 처리 추가

  -> ESC 키: 현재 재생을 중단하고 다음파일로 넘어감

     SHIFT + ESC: 모든 재생을 중단하고 DOS2로 복귀



[ 업데이트 가이드 ]


1. MMCSD.COM, MMCSD.OVL 두개 파일을 SD카드에 복사.

   기존 파일을 덮어쓰면 됩니다.(예:UTILS 디렉토리)


2. MMCSD570.ROM 파일을 SD카드 루트에 복사.


3. MSX-DOS2 부팅 후 명령창에서 아래처럼 입력.

   A:\>MMCSD MMCSD570.ROM


4. 다운로드 완료 후 리턴키 눌러서 재부팅.


5. 끝




2023년 8월 9일 수요일

MMC/SD Drive V4 제작 #20 - 동영상 플레이어 대공사

현재 MMC/SD V3,V4에서 사용되는 스크린2 동영상(MV) 플레이어가 나온지 벌써 5년이 되었네요.

기존 코드는 구조적으로 개선하는 것이 힘들어서, PAC-V LED 비주얼라이저 처리만 겨우 추가한 상태로 오랫동안 쓰였는데요.

이번 여름 방학을 맞아, 코드를 갈아엎었습니다.


새로 만들면서 SD카드 몇 종류를 테스트해보니, 나중에 나온 SD가 커맨드 응답이 빠르네요.

아래는 주로 쓰던 microSD 3종류입니다.

왼쪽은 V3에 번들 된 SanDisk 8GB, 중앙은 V4에 번들 된 SanDisk 16GB,

오른쪽은 제가 요즘 쓰고 있는 삼성 EVO 32GB입니다.



참고로, EVO 32GB는 원래 UHS(UHS-I)를 지원합니다만...

MMC/SD에서는 3.3V SPI(1BIT)로 구동중이라서, 전송속도는 SanDisk Class4와 똑같습니다.

하지만 메모리 R/W를 위한 커맨드 응답 속도는 EVO가 가장 빠르고, SanDisk Class4가 가장 느립니다.


제가 처음 스크린2 MV 플레이어를 제작할 때에는, V3에 8GB 메모리의 동작에서 맞춰서 겨우 구동되도록 구현했었는데요.

근데 이젠 SD의 커맨드 응답이 빨라지민, 코드를 잘 만들면... 동영상 재생 타이밍을 정확하게 맞출 수 있을 것 같더라구요.

뭔가 알 수 없는 느낌적인 확신(?) ㅋ


사실 기존 MV 플레이어에서 음질이 왔다갔다하는 이유가...

이 커맨드 응답속도 문제에 PAC-V용 비주얼라이저 데이터 처리를 추가되면서 발생한 CPU 부하때문입니다.

하지만 이 코드를 더 개선할 방법이 없었어요. 당시 SD카드에서는 이미 한계라서요 ㅎ.ㅎ


이번 리뉴얼 되는 MV 플레이어의 1차 구현 목표는

- SanDisk class10과 삼성 EVO 등의 빠른 SD 용으로 더 정확한 타이밍을 구현

- 느린 SanDisk class4에서도 약간의 음질 저하만으로 타이밍 맞춤

입니다.


그리고 2차 구현 목표는 

- LED 비주얼라이저의 리프레쉬 올리기 (기존 12fps -> 24fps)

- 되감기, 역재생 구현

- 무한 루프 구현

입니다.



1차 구현을 해보니, 예상했던대로 싱크 타이밍은 좀 더 정확히 맞춰지니까 음질은 상당히 좋아졌습니다.

하지만 PAC-V LED 처리를 넣을 코드 공간이 안나오네요ㅋㅋ


머리를 쥐어뜯으면서 고민해보니,

VRAM 전송 루프를 더 크게(클럭을 더 쓰게) 만들면?

메인 루프의 idle time은 줄어들지만, VRAM 전송 시 PAC-V LED 컨트롤 함께 넣어버릴 수 있더라구요.

예전 코드에서는 비디오+오디오 따로 PAC-V LED 따로 처리했는데, 지금은 몽땅 한 루프에서 처리합니다.

대신 코드 여유가 줄어서, PAC-V 처리 옵션을 넣지는 못했네요. 그러니까 LED 출력코드가 '항상' 동작하게 됩니다.

물론 PAC-V가 없어도 아무일도 생기지 않습니다만... 다른분이 I/O 주소가 겹치는 기기를 만들게 된다면 문제가 될 수는 있겠네요 ㅎ.ㅎ


이제 남은 2차 목표는 되감기, 역재생, 무한 루프 처리입니다.

영상 재생 중 ESC 키는 무조건 해야하니까, 코드 양을 많이 늘리지 않고 추가적인 키 처리를 해야한다면...?

ESC 키와 같은 ROW의 키들을 활용해야겠죠? (사실 커서키를 쓰고 싶었는데...ㅋ)

ROW 7에는 RETURN, SELECT, BS, STOP, TAB, ESC, F5, F4가 들어있습니다.

여기서 MSB쪽의 RETURN, SELECT, BS를 사용합니다.

RETURN -> 빨리감기 (이건 기존 코드에서도 있었죠?)

SELECT -> 역재생

BS     -> 되감기

로 동작합니다.


열심히 짱구를 굴려서 구현이 되었네요. 

이제 남은 Z80 CLK이 별로 없으니, 무한루프 기능 포기입니다. ㅎ.ㅎ

.

.

.

라고 생각하면서 코드를 며칠 놔뒀더니... 또 아이디어가 떠올랐어요.

CAPS LED를 변수처럼 사용하면서 키가 연속입력이 되지않도록 구현하는데, 딱 마지막 여분의 CLK으로 구현이 되네요.

CAPS 키는 ROW 6에 있어서, PPI 컨트롤이 추가되는 것도 큰 짐이었는데요. 역시 궁지에 몰리니 두뇌 풀가동이...ㅎ.ㅎㅋ



어쨌든 계획했던 기능은 모두 구현이 되었습니다.

- 빠른 SD에서 좀 더 정확한 타이밍 (음질 저하 최소화)

- 두배 리프레쉬 되는 PAC-V LED 비주얼라이저

- RETURN키로 빨리감기 (8배속)

- BS키로 되감기 (8배속)

- SELECT키로 역재생

- CAPS ON 상태로 무한루프



실제 동작 모습은 아래 영상으로 확인하시죠~





개선된 기능은 좀 더 테스트 후, 다음번 MMC/SD Tool에서 릴리스 될 예정입니다~


2023년 7월 29일 토요일

[IPS] FEEDBACK RAM SLOT patch (2023-07-29)

 


Download: FEEDBACK_(RAM_SLOT_Patch).zip


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

FEEDBACK RAM SLOT patch (2023-07-29)

    By Yeongman Seo <sharksym@hitel.net>

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


외장 메모리가 존재할 때의 동작오류를 수정합니다.

예) turboR에 메모리 매퍼 카트리지 사용


IPS 패치이며, FEEDBACK 오리지널 및 한글패치판에 적용가능합니다.


그럼, 이만~


MMC/SD Drive V3/V4 - BIOS & Tool v5.69

Download: 20230729_MMCSD_Drive_V3_V4_BIOS_Tool_v569.zip

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

MMC/SD Drive(tm) V3/V4 - BIOS & Tool

    By Yeongman Seo <sharksym@hitel.net>

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



[ BIOS & Tool v5.69 ]


- FDD_EMU


  turboR에서 ONE-Drive Off 시, DiskROM 호환성 개선

  -> '/O' 옵션 시 자동적용됨

     eg: Moon Light Saga


  turboR DOS2 용 Fake FDD_EMU 모드 추가

  -> '/DT' 옵션으로 설정

     DOS2 디스크로 부팅 시,

     MMC/SD가 본체의 FDD(SLOT 3-2)처럼 동작하며,

     별도 드라이브로 등록되지않음



[ 업데이트 가이드 ]


1. MMCSD.COM, MMCSD.OVL 두개 파일을 SD카드에 복사.

   기존 파일을 덮어쓰면 됩니다.(예:UTILS 디렉토리)


2. MMCSD569.ROM 파일을 SD카드 루트에 복사.


3. MSX-DOS2 부팅 후 명령창에서 아래처럼 입력.

   A:\>MMCSD MMCSD569.ROM


4. 다운로드 완료 후 리턴키 눌러서 재부팅.


5. 끝





2023년 7월 26일 수요일

2023년 7월 25일 화요일

지난 20년 개발의 추억 #1 - 램상주 폰트를 써보신 분 있나요?

아래는 일부러 에뮬(blueMSX)에서 돌려본 모습입니다.

제 GT의 화면을 찍으면, '이거 폰트팩 아녀?'라고 하실지 몰라서 ㅎ.ㅎ





[서론]


10년 전에 만들어서 잠깐 썼지만, 특수문자/한자 폰트(16 x 16 사이즈)를 램상주용으로 만든 적이 있어요.

여기서 램상주 폰트라는 것은요,

DOS2의 메모리매퍼의 시스템 세그먼트에 로딩해서, 여러 프로그램이 함께 액세스해서 활용하는 걸 의미합니다.


최근 HI-TECH C 라이브러리 업뎃하고 동작 확인하려고, M으로 이것저것 해보다보니....

옛 생각이 나서 머리속의 기억들을 좀 긁어봅니다.


저의 1994년~2000년은 MSX 에뮬레이터를 신나게 돌리던 시절이었는데요.

국딩 때 샀던 아이큐2000은 상태도 안좋고, 사실 주변기기를 모아서 구동할 여력도 안되었어요.

아이큐2000 외의 실기는 없었습니다 ㅎ.ㅎ/


2001년이 되어서야 A1WSX를 구해서 책상위에 같이 올려놨습니다.

PC의 TV수신카드에 연결해놨었지요.

이렇게라도 해두면 자주 MSX를 켜지않을까 싶었는데...

결과는 꽝이었네요.

디럭스박스 꽂고 FDD로 메가롬 파일을 로딩해서 돌리는 것도 한두 번이죠ㅋ

WSX는 먼지만 쌓여가고~


2002년이 되니, 불타오르던 MSX 에뮬계도 꺼져가는 불꽃이 되네요.

하긴 MSX 에뮬이 워낙 초기부터 등장했었기 때문에, 10년이면 다들 지겨워질만도 했죠.

물론 저도 관심에서 한참 멀어져있었구요.


당시 대부분 에뮬들의 개발이 중단되었고 (저의 paraMSX도ㅋ)

가장 늦게 등장했던 blueMSX가 우주 대통합(?)을 이룰 때 쯔음... 갑자기 openMSX가 등장합니다.

여전히 뭐 관심 밖~ㅋ


2003년에는 하이텔 VT가 폐쇄 된 후에는 활동하는 분들이 엄청 줄었습니다.

활동이 줄어든게 아니라, 웹으로 전환된 게시판을 보고 있으니 회원님들 활동이 더 잘 보여서 그런걸지도요ㅋ


여담이지만, 예전 파라동의 한마디 게시판을 보면, 94년~97년 사이에 올라온 글이 전체의 70%쯤 됩니다.

파란 웹으로 전환된 후 2012년 네이버 이사하기 전까지의 글은 전체의 10%도 안됩니다요.

활동하는 분들이 20명도 안될걸요? 아마ㅋ


그러던 어느날,

"이젠 좀 다른 걸 해보자!!"라는 생각이 머리속에 팍! 떠오릅니다.


서론이 겁나 길었는데요, 이제부터 시작(응?)입니다. 아주 긴 글이 될 것 같아요ㅋ



[본론]


때는 2003년,

영혼의 친구였던 아이큐2000을 창고에 넣고, turboR로 실기생활을 다시 시작하게 됩니다.

지금이 2023년이니까, 지난 세월을 돌아보는 것도 재밌겠죠? (재미없으면 뒤로 가기 버튼을!ㅋ)


일단 A1GT부터 장만합니다.

사실 예전에도 turboR에서 DOS2를 구동하면 어떤 느낌일까? 한번 몸으로 느껴보는게 필요하겠더라구요.

에뮬을 쓰면 속도도 빠르고, 디스크 부팅도 순식간이라 별 감흥이 없었는데,

GT에 전원넣고 돌려보니... 아~~ 느낌이 오네요.

이걸 1991년~1993년 사이에 실제로 쓰신 분들, 존경합니다 ㅎ.ㅎb


한참 신나서 이것저것 돌려보고, 사캔88로 미디도 들어보고 그랬네요.

근데 가만보니 GT의 램이 512KB인데, 이걸 활용하는 프로그램이 거의 없더라구요.


Q: 내가 쓸만한 프로그램이 없으면 어떻게 하나요?

A: 본인이 직접 만드세요~


음, MSX용 프로그램을 만드는 건 중고딩 때 BASIC + 어셈 섞어서 대충 때우던게 전부였는데...ㅋ


이제 멀리 바라보며 계획을 세웁니다.

개발자가 다 그렇죠. 망상에 망상만 가득ㅋㅋ



1. S/W 개발 환경을 찾아보자


여기서 가장 중요한 목적은 turboR MSX-DOS2에서 활용을 극대화 하는데 있습니다.

옛날처럼 16KB/32KB 롬팩용 프로그램을 만드는건 아닙니다요.


몇가지 어셈블러와 C 컴파일러들을 만져보면서 주력으로 쓸 툴을 골라봅니다.

물론 롬팩으로 되어있거나, BASIC의 메인램에 로딩해서 구동되는 방식은 예선탈락입니다 ㅎ.ㅎ

필수조건: CP/M 또는 MSX-DOS에서 실행되어야 함


'GEN80'

HiSoft Devpac80 개발툴에 포함된 어셈블러입니다. CP/M용 프로그램입니다.

1987년 버전이니까 꽤 최근(ㅋ)에 등장한 프로그램입니다 ㅎ.ㅎ

20년째 쓰고 있는데, 이거 하나면 충분하더라구요.

사실 어셈블러는 특별한 제약사항이 없으면 뭐든 괜찮습니다요.


'HI-TECH C'

HI-TECH 사에서 만든 초강력 C 컴파일러입니다.

아마 CP/M, MSX-DOS용 C 컴파일러 중에서 ANSI C를 지원하는 유일한 프로그램일거에요.

마지막 버전인 v3.09(1989년)을 사용합니다. 제작사가 free로 풀어버렸기에 아무런 제약없이 쓸 수 있습니다.

C 라이브러리가 소스로 제공이 되어서, 추가/수정해서 MSX용 라이브러리를 추가할 때도 편리합니다.



2. 플래쉬 메모리 기반의 디스크드라이브를 만들자


S/W 개발은 어차피 윈도 PC에서 하니까 불편함은 없는데, 막상 실기로 구동하면?

...21세기에 FDD는 좀 아니잖아요?


한동안 에뮬 개발에 미쳐있어서, 디스크드라이브를 구현하는데는 문제가 없는데요.

회사에서 이것저것 써보는 H/W들이 많지만, 그걸 직접 만들어보는 건 처음이라... 걸음마부터 시작합니다.



2.1. 개발용 카트리지를 찾아보자


PCB를 만드는 건 힘드니까, 이미 있는 기기를 활용하는게 좋겠죠?

코나미의 '코파의 야망' 카트리지가 눈에 보입니다.

SCC도 들어있어서 메가롬 매퍼도 활용할 수 있으니 딱 좋네요ㅋ


롬을 적출하고 EPROM으로 구워서 이리저리 돌려봅니다. 잘 되네요.

ebay에서 비싸게 준 카트리지인데 어쩔수 없이 살팩을! ㅎ.ㅎ



2.2 플래쉬롬 카트리지로 개조하자


현업에서 쓰이는 칩들이 죄다 3.3V, 2.5V 쓰는데, 5V짜리 FlashROM이 있으려나요?

근데 찾아보니 아직도 팔더라구요 ㅎ.ㅎ

Atmel의 512KB 플래쉬롬인 AT29C040A 칩을 골라봅니다.


ATLOAD라는 이름으로 다운로더를 만들어서 테스트해봅니다. 잘 되는군요.

이제 실기에서 롬 S/W 테스트할 때는 편리하게 쓸 수 있겠습니다.

GT는 배터리백업되는 램디스크가 내장되어있어서, 본체의 내장 S/W를 켜면 사용가능한데요.

여기에 ATLOAD.COM처럼 자주쓰이는 프로그램을 넣으면 편하게 쓸 수 있습니다.

참고로, 이 램디스크에 AUTOEXEC.BAT가 존재하면 부팅 후 MSXVIEW가 실행되지않고, 사용자의 AUTOEXEC.BAT가 실행됩니다.

초고속으로 DOS2 부팅이 되는거죠 ㅎ.ㅎ (ST는 이런 기능이 없어요. 램만 고자인게 아니라능ㅋ)


아래 사진에서 D: 드라이브가 GT전용 램디스크입니다.

참고로, A: B: 드라이브는 FDD이구요,  C: 드라이브는 GT의 롬디스크입니다.

(20년전 휴대폰으로 찍은거라 화질이 안좋아유~)





2.3 롬 디스크드라이브를 만들자


기본적으로 디스크드라이브의 DiskROM은 DOS 커널과 물리디스크 드라이버로 이루어집니다.

커널은 그대로 사용하고 하위 레이어의 물리디스크 루틴은 만들어서 넣으면 간단히 완성되는거죠.

카트리지의 플래쉬롬 AT29C040A은 512KB이니까, DiskROM 영역 16KB를 제외하면 496KB를 롬디스크로 쓸 수 있겠네요.

포맷루틴은 필요없고 그냥 고정 사이즈의 FAT 볼륨이니까... 대충 Disk I/O 루틴을 구현해서 돌려봅니다.

잘 되는군요. 흡사 GT의 내장 롬디스크를 쓰는 느낌일까요? 암튼 빠른게 좋은겁니다요!



2.4 MMC 디스크드라이브를 만들자 


2004년 드디어 MMC/SD V1의 등장입니다.

당시 외장 디스크로 쓸 수 있는 플래쉬메모리 카드는 몇 종류가 있었습니다.

CF (CompactFlash): IDE라서 쓰이는 곳이 많았고, MSX에서는 이미 2002년에 선라이즈 CF ATA-IDE가 있었습니다.

SM (SmartMedia): 얇은데 사이즈는 좀 넓직한 편이었습니다.

MMC (MultiMediaCard): 1bit 시리얼 인터페이스이구요. 90년대 후반에 나와서 종종 볼 수 있었습니다.

SD (Secure Digital): 1bit 또는 4bit 인터페이스이구요. 모양이 MMC와 비슷하지만 약간 더 얇았습니다.


그럼 어떤걸로 할까요?

이미 선라이즈가 있는데 IDE를 또 만들 이유는 없었고, 저물어가는 SM는 이제 관심 밖ㅋ

MMC와 SD가 남아있는데, SD가 비싸서 개인프로젝트로 테스트하기엔 부담이 좀 되어서, 걍 MMC로 선정!

기억이 가물가물하지만, 그 때 샀던 256MB짜리 MMC가 25,000원 정도였던걸로 생각나네요.

10년 전, 94년에 장만한 저의 486DX 컴퓨터가 퀀텀 270MB HDD를 쓰고 있었는데, 기술의 발전은 후덜덜합니다 ㅎ.ㅎ


열실히 구글링해서 찾아보니, MMC 1bit I/O를 SPI I/O로 전환해서 간단히 쓸 수 있다는걸 알게되었네요.

TTL 몇개로 I/O를 구현하고 테스트를 해보니... 대박! 잘되네요ㅋㅋ


만들어진 기기는 'MMC Disk Interface'라고 이름을 붙였어요.

파라동에서는 다들 'MMC Disk'라고 불렀습니다 ㅎ.ㅎ

https://sharksym.blogspot.com/2004/10/mmc-drive-aka-mmcsd-drive-v1.html


DIY용 회로도를 공개해서 올렸지만, 실제로 제작하신 분은 별로 없었네요.

스페인 등의 외국에서도 몇몇 제작이 되었습니다.



2.5 MMC Disk를 좀 더 빠르게


기존 1bit I/O는 FDD와 비슷한 속도였습니다.

FDD가 빠를 때는 10KB/sec 속도가 나오는데요. MMC Disk는 8KB/sec 정도였습니다.

여담이지만 이 상태의 MMC Disk에서 FDD 에뮬(2DD 파티션)을 구동하면 진짜 FDD 느낌이 났었어요 ㅎ.ㅎ


이제 걸음마를 떼었으니 달려봅시다.

H/W 쉬프터(TTL 칩)을 이용해서 1bit x 8 -> 8bit로 빠르게 묶어보아요.

S/W로 하던 작업을 칩이 대신 해주니 좋네요.

MMC Disk의 속도가 30KB/sec가 되었어요.

역시 디스크가 빠르니까 GT가 날라갑니다 +_+


하지만 속도가 빨라지니 FDD 에뮬에선 오동작하는 게임이 주르르~ ㅎ.ㅎ

이건 뭐 paraMSX 만들 때에도 많이 봤던 것들이라, 속도조절(느리게 해주는) 옵션을 넣는걸로 대충 넘어갑니다.



2.6 SD를 쓰려면 어떻게 해야할까?


이젠 SD도 싸졌으니 SD를 꽂아볼까? 생각해봅니다.

사실은 일반 사용자용 메모리 카드 시장에서 SD가 MMC를 밀어버려서 MMC가 뾰로롱~ 다 사라졌어요 ㅎ.ㅎ

MMC는 임베디드 칩에 들어가는 용도로 쓰이고, SD는 일반 사용자용 리무버블 디스크가 되어버린거죠.


암튼 또 구글링을 해보니, SD도 1bit SPI를 쓸 수가 있네요.

으음... 초기화 커맨드도 비슷하고, 걍 SD를 사서 꽂아봅니다.

코드 몇줄만 고치니깐 잘 되네요. 우후훗~


이제 이름을 'MMC Disk'에서 'MMC/SD Drive'로 바꿉니다.

그러니까 게시판에서 MMC/SD V1 이런게 보이면 MMC Disk랑 똑같은거라고 보심 됩니다요.



3. 빨라진 디스크를 활용해보자


3.1 SymbOS의 등장


디럭스박스에 로딩하거나 미디플레이어를 구동할 때도 쾌적해서 좋습니다만...

새 H/W에는 새 S/W를 붙이는게 더 재밌겠죠?


유럽에서는 SymbOS라는 Z80 용 멀티태스킹 OS가 나옵니다.

기본적으로 Amstrad CPC 기종 용으로 만들어졌는데, 제작자가 MSX 버전도 보여줍니다.

최대 1024KB까지 활용가능한 OS라고 하는군요.

오~~ 내 GT가 램 1024KB인데, 어떻게 알았지? (농담입니다)


디스크드라이버만 제작해서 넣으면, MMC/SD에서도 돌릴 수 있겠군요.

SymbOS의 문서와 샘플 드라이버를 받아서 분석해봅니다.

오호.. 하위 드라이버 만드는게 간단하네요.

대충 구현해서 돌려봅니다.


MSX에서 멀티태스킹은 이런 느낌인가!? 신세계네요 +_+

느리지만 초당 6프레임의 영상도 볼 수 있고, PSG 음악 플레이어도 기본으로 들어있네요.

SymbOS 자체는 완전한 OS입니다만, 로더가 DOS 용 프로그램이라서 일단 MSX-DOS로 부팅이 필요합니다.

암튼 잠시 재밌었네요~

https://sharksym.blogspot.com/2007/03/mmcsd-drive-symbos-v11-for-msx.html




3.2 turboR 용 MPX 플레이어를 만들자


2007년에 무서운 기기가 하나 등장합니다. 바로 김준성님(JunSoft)의 MPX 카트리지입니다. 

빠른 MSX가 있고 빠른 디스크드라이브가 있고, MP3 디코더 카트리지가 있다?

그럼, MP3를 재생해보는게 당연히 매너(!)아닌가요? ㅎ.ㅎ


목적은 간단합니다 --> 고속모드에서 MPX 카트리지를 활용

turboR은 내장 램에서는 빠르게 동작하고 외부 SLOT은 H/W 호환을 위해 느리게 동작합니다.

BUS 타이밍이 기존 MSX 3.5MHz에 맞춰 align 되어있어요.


결국 MP3 플레이어가 고속모드에서 손해를 보지않으려면,

SLOT I/O 영역을 R/W 할 때 외엔 S/W가 모두 램에서 구동되어야합니다. 간단하죠? ㅎ.ㅎ

그렇게 DOS/DOS2 용 MPX 플레이어를 만들게됩니다. 이름은 그냥 MPXPㅋ

https://sharksym.blogspot.com/2007/10/mpxp-v110-media-player-for-mpx.html


근데 아무리 최적화를 해도 좀 아쉬움이 남네요.

MMC Disk에서 구동해도 MP3 192kbps 재생이 한계네요. bitrate 높은 애들은 포기~ㅎ



3.3 S/W의 한계는 H/W로 극복(?)


목표는 'MPX로 320kbps의 MP3를 재생하기'


MMC/SD Drive의 SPI 처리에서 BIT 쉬프터를 SLOT의 CLK(3.58MHz)으로 직접 구동하도록 개선합니다.

기본 속도가 122KB/sec가 되었네요. turboR에서는 134KB/sec이구요.

V1보다 4배가 빨라지니, MP3 320kbps는 한방에 해결이네요! ㅎ.ㅎ

turboR 고속모드와 고속디스크의 향연~ MMC/SD Drive V2 ㅎ.ㅎ/

https://sharksym.blogspot.com/2007/10/mmcsd-drive-v2-swhw.html



3.4 FAT12 파티션의 한계


320kbps의 MP3 재생이 해결되니, 또 다른 문제가 떠오르네요.

DOS2가 사용하는 FAT12 파티션은 최대 사이즈가 32MB입니다.

MP3 3개를 넣으면 가득차는 용량이죠ㅋ


일본에서는 Okei씨가 DOS2에서 FAT16 파티션을 쓸 수 있도록 커널 패치를 제작하고 있었는데요.

수년에 걸쳐 개발, 수정이 되었지만 크게 사용이 되지못했습니다.

사실 MSX에서 큰 용량의 파티션이 그렇게 필요한 환경은 아니었거든요.

32MB 파티션을 여러개 쪼개서 쓰더라도 충분했습니다.

저는 MMC/SD V2 쓸 때 A: B: C: 드라이브를 32MB 파티션으로 썼는데, 그닥 불편함이 없었습니다.


그러다 2006년말 1chipMSX가 나올 때, 이 FAT16 패치가 기본적으로 탑재된 상태로 발매됩니다.

FAT16 패치 버그때문에 쓰는 사람이 별로 없었는데, 이제 안정버전이 되었나 싶더라구요.

참고로 현재 2023년에도 쓰이는 FAT16 패치 v0.12는 2006년 5월에 릴리스되었습니다.

1chipMSX 출시 눈앞이었던 때였어요 ㅎ.ㅎ

이제 2008년 MMC/SD Drive에서도 FAT16 지원을 해야할 타이밍입니다.


일단 MMC/SD의 SD카드 슬롯을 2개로 늘립니다.

기본 SD는 원래 용도(FAT12 부팅, 작업용 및 FDD 에뮬용)의 파티션으로 나눠서 쓰고,

추가된 SD는 전체를 FAT16 파티션으로 포맷해서 쓰는거죠.


일단 디스크롬은 paraMSX로 구현해서 테스트를 해봅니다.

에뮬에서는 SD카드(디스크 이미지 파일)가 망가져도 상관없으니 편하게 테스트가 가능합니다요~


완성 후 MMC/SD의 디스크롬에도 적용!

아... MP3, MIDI 등의 멀티미디어 데이터로 꽉꽉 채우니 완전 편하네요.

FAT16 만세! ㅎ.ㅎ/


2023년 요즘에도 가끔 MMC/SD V2 얘기가 나오곤 하는데요.

보통 V2라고 얘기하면, 이 때 만든 SD카드 슬롯이 두개인 MMC/SD Drive V2.2를 의미합니다.

https://sharksym.blogspot.com/2008/04/mmcsd-drive-v22.html



3.5 MMC/SD에 DOS2 커널을 넣어보자


FDD의 디스크롬에는 기본적으로 1984년에 개발된 DOS1 커널이 들어있습니다.

1988년에 DOS2가 별도의 카트리지로 출시되었지만, 국내에서는 보기 힘들었구요.

1990년 FS-A1ST turboR에 DOS2가 기본내장되면서 아마 접해보신 분들이 계셨을겁니다.


뭐 turboR 유저라면 DOS2 사용에 문제가 없지만, MSX2/2+를 쓰는 분들은 두가지 벽에 부딛히게 되는데요.

- 첫번째 벽:

메모리매퍼가 최소 128KB가 있어야 부팅이 되는데, 다른 프로그램을 활용하려면 최소 256KB 필요합니다.

많이 쓰이는 소니, 파나소닉의 MSX2+들이 죄다 램이 64KB밖에 들어있지않습니다.

본체의 램확장이 필수였던거죠. 기기를 만들어도 사용하는 사람이 별로 없으면 좀 심심합니다.

이 때부터 제가 "512KB 램 증설은 기본으로 하셔야죠~"라고 외치기 시작합니다요ㅋㅋ

- 두번째 벽:

DOS2 커널을 쓰려면 오리지널 DOS2 카트리지를 구해서 쓰거나, 커널롬만 따로 자작해서 써야합니다.

여기까지는 괜찮은데, 본체의 기본 슬롯이 2개뿐인데 DOS2랑 MMC/SD 카트리지를 꽂으면 남는 슬롯이 없게됩니다.

결국 또 확장슬롯을 기본으로 장착해야하는 사태가...ㅎ.ㅎ


암튼 어떻게든 MMC/SD 사용자 확보(!)를 위해, 디스크롬에 DOS2 v2.20 합체 작업을 해봅니다.

사실 turboR에 내장된 디스크롬이 이런 스타일(DOS1 + DOS2)이라, 비슷하게 구현하는건 문제가 아니었는데...

복병이 대우 아이큐2000에서 발생하더라구요.

DOS2와 일반 디스크롬이 각각의 슬롯에 있지않으면 초기화할 때 램이 엉망이 되어서 ㄷㄷㄷ

사실 DOS2 초기화가 좀 복잡합니다ㅋ

암튼 이리저리 디버깅을 해서, 결국 대우 기종에서도 쓸 수 있게 되었어요.

https://sharksym.blogspot.com/2008/06/mmcsd-drive-v1v2-bios-v310.html


모든 MSX2/2+/turboR에 MMC/SD Drive를 꽂는 날까지 달립니다~~~



3.6 동영상과 PCM오디오 플레이어


대용량 디스크를 낭비(ㅋ)하는 좋은 방법은 역시 멀티미디어 데이터로 채우는거죠.

그럼 먼저 동영상 플레이어를 만들어야하는데..응?


SD카드에서 데이터를 읽어서 메모리에 저장하는게 아니라, VRAM과 turboR PCM포트에 바로 출력하면 빠르게 출력할 수 있습니다.

한가지 고민해야할 부분은,

DOS1에서 DOS2로 바뀔 때, 디스크 Read 시 타켓 슬롯은 메모리만 된다는건데요.

이게 무슨 소리냐면...

예를 들어 Memory mapped I/O로 구현된 주변기기가 있더라도,

DOS2의 디스크 루틴을 사용하게 되면, 디스크를 데이터를 읽어서 해당 주변기기의 I/O로 전송하는게 불가능하다는 얘기입니다.

DOS2에서는 메모리매퍼를 이용해서, Page1은 디스크 커널, Page2는 소스/타겟 메모리로 고정하기 때문에,

전송 중 슬롯 전환 같은 불필요한 작업이 필요없고, 메모리 주소 영역에 따른 페이지 전환도 빨라서 성능이 더 좋습니다.

결국 이득이 훨씬 더 많은 커널인거죠.


암튼 동영상 플레이어처럼 데이터를 읽어서 비디오로 쓰인 후엔 바로 버려지는 경우는,

메모리에 로딩(DOS2 커널 무시)할 필요없이 그냥 디스크에서 읽은 데이터를 VRAM으로 보내면 끝입니다.

그리고 비디오 데이터를 처리하면서 간간히(ㅋ) 오디오 PCM을 출력하면 소리도 나오겠죠? ㅎ.ㅎ


동영상 인코딩은 MSX로 불가능하니, 윈도용 프로그램으로 대충 만들고,

동영상 플레이어 루틴은 MMC/SD 디스크롬에 넣어버립니다.

스크린12와 스크린8을 지원하니까 색깔은 꽤 괜찮게 나옵니다. 화면 크기가 작은게 좀 아쉽지만요 ㅎ.ㅎ

그리고 turboR에서는 S/W 구동 속도를 올리기위해 보통 고속모드(램 코드)를 사용하는데요.

고속모드에서는 VDP I/O 패널티(wait clock)가 있어서, 동영상 재생할 때는 Z80 노말모드(3.58MHz)로 구동합니다.

영상/음성 출력에 대한 자세한 내용은 아래 링크들을 보시면 되겠습니다.

https://sharksym.blogspot.com/2009/08/mmcsd-drive-v2-1.html

https://sharksym.blogspot.com/2009/08/mmcsd-drive-v2-2.html

https://sharksym.blogspot.com/2009/08/mmcsd-drive-pcm.html


동영상 인코더는 아래 링크에서 볼 수 있습니다만, 쓰실 일은 없겠네요. 이젠 V3,V4가 주력이니~ ㅎ.ㅎ

https://sharksym.blogspot.com/2009/12/mmcsd-drive-v1v2.html


그 때 찍었던 영상도 구경하시죠 ㅎ.ㅎ





3.7 메인 SD카드의 파티션 구조 변경


기존 파티션관리를 위해 사용되던 툴이 DISKMAN, DSKCOPY 인데...

이게 사용이 불편해서, 윈도용 Disk Manager을 만들어서 주로 사용했습니다.

이렇게 생겼습니다. 아마 못 보신 분들도 많을 듯요.




근데 이게 저만 그런게 아니라 다른 분들도 거의 윈도 프로그램만 쓰는거 같더라구요.

이건 올바른 방향이 아니라는 생각이 머리를 스치게됩니다.

그.래.서.

이제 MSX가 아닌 다른 컴퓨터의 도움을 빌리는 방식은 쓰지않기로 다짐합니다.

지난 5년 동안(2004년~2008년) 잘 썼던 프로그램들을 다 폐기하고, 새로운(이상한?) 세상으로 나가는겁니다. 흐...


디스크관리 툴은 DISKMAN 하나로 통합됩니다.

대충 이런 모습이에요.




S/W 개발/테스트 작업은 주로 paraMSX에서 했습니다.

괜히 실기에서 SD카드 포맷하고 이미지 전송하느라 시간 허비할 필요는 없으니까요.

에뮬에서 동작하는 모습은 아래 링크에서 볼 수 있습니다.

https://sharksym.blogspot.com/2009/10/paramsx-v050b-mmcsd-drive.html


.

.

.


2003년 turboR을 구하면서 2009년까지 미친듯이 달렸던 기억들을 모아봤습니다.

어랏... 근데 제목의 "램상주 폰트" 얘기는 언제 나오냐구요? 이건 다음편에서 ㅎ.ㅎ


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