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 생활 하세요!!

2016년 3월 28일 월요일

FontPack 제작 #8 - 한글 BASIC 지원

오랜만에 FontPack BIOS 업뎃을 해보았습니다.

최근 맛탱이님의 폰트팩 활용 프로그램을 보며 많은 생각(약 10초)이 들더군요.ㅋ

BASIC에서 한글 출력을 해보려는 분들이 얼마나 될까?...


생각은 10초면 충분했구요.ㅋ 일단 수정작업으로 들어갑니다.

결론: 기존 코드의 버그들도 소탕하면서~ 주말을 홀라당 까먹었네요. ㅎ.ㅎ


[ 사용 환경 ]

- 텍스트 모드: 기존 ANSI 스크린 모드 활용 (ANSI1, ANSI2 모드, Fake SCREEN 0)

- 그래픽 모드: 문자 출력 디바이스 지원 (기존 BASIC의 GRP 디바이스와 유사, SCREEN 2 ~ 12 지원)

- 한글 코드: SET HAN 명령 추가 (아스키 폰트는 8x8, 8x16 크기선택 가능)

- IME 모드: 기존 폰트팩 입력기 활용 (조합/완성 한글 및 한자 입력)


[ 사용 예 ]

국딩 때 만든 아이큐2000 용 BASIC 프로그램을 수정/구동하고 싶다.

> 2바이트 조합형 코드 편집을 위해, ANSI2 및 IME1 모드 켜기

> 텍스트 한글 출력은 PRINT 명령 그대로 사용

> 그래픽 모드에서 문자 출력 디바이스는 GRP 대신 FNP 사용 ( OPEN"FNP:" AS #1 )


IME는 꺼져있어도 한글 출력에 영향을 주지 않습니다.

그리고, 그래픽 모드만 사용하는 BASIC 프로그램일 경우, GRP -> FNP 디바이스만 변경하면 실행됩니다.

SET HAN 명령은 대우 CPC-300/400 과 유사하지만, 인자 사용은 다릅니다.

기존 코드를 그대로 쓸 때에도 에러가 발생하지 않도록 처리를 하고 있습니다. (그냥 인자를 무시합니다. ㅋ)


사용 가능한 경우는 아래 4종류 입니다.

SET HAN 0 -> 아스키 코드 8x8 크기, 조합형 한글 16x16 크기

SET HAN 1 -> 아스키 코드 8x16 크기, 조합형 한글 16x16 크기

SET HAN 2 -> 아스키 코드 8x8 크기, 완성형 한글 16x16 크기

SET HAN 3 -> 아스키 코드 8x16 크기, 완성형 한글 16x16 크기


그럼, 설명이 대충 끝났으니 사진 한장이랑 동영상 하나 올려봅니다.

아래는 아이큐2000(CPC-300)의 내장 프로그램 "아이큐 교실"을 실행한 모습입니다.

원본코드는 BASIC 롬으로 되어있는데, 소스로 받아서 그래픽 디바이스만 변경했습니다. (GRP -> FNP)

잘 나오네요. 아마 스크린 7 모드일겁니다.




아래는 동영상으로 찍어본 모습입니다.

아이큐 교실 및 BASIC으로 작성된 바이오리듬 프로그램(제가 만든건 아닙니다~)을 실행해보았어요.




2016년 3월 17일 목요일

FS-A1GT 키보드 필름커넥터 보수

제 터보알은 키입력이 가끔 안되는 경우가 있어요.ㅋ

키보드의 필름으로 된 커넥터 부분이 문제인데... 뺏다 꽂았다 반복하면서 많이 긁힌게 원인이 아닐까 싶었습니다.


암튼, 키가 잘 안눌리면 커넥터쪽을 좀 건드려주면 되었는데, 이젠 완전히 끊어진건지 살아날 생각을 안하더군요. 어흥...-_-

연필로 칠하면 좀 나을까 해서, 이리저리 색칠도 해보고 지우개로 좀 지웠다가... 삽질을 좀 했더니!!


드.디.어. 두둥~

.

.

.

입력 안되는 키가 더 늘었습니다!!!!!!!!!!!!!!! -_- 망했...

커넥터 끝부분을 2~3mm 정도 잘라내고 꽂았더니... 그래도... 역시나 안되네요.

아~ 멘붕!


일단 사건을 덮기(?) 위해, 멀쩡한 A1WSX를 열었습니다.

키보드 적출~ 흐흐흐 ㅋ


키보드를 바꾸고 사건은 깨끗하게 마무리~ 룰루루~ㅎ

색깔도 나름 잘 어울리네요. ㅎ.ㅎb




이렇게 끝나면 WSX가 섭섭하겠지요?


게시판을 뒤져보니, 고명호님의 키보드 수리기에서 "열선 보수제" 얘기가 있더군요.

옥션에서 검색해보니 종류가 하나 나오네요.

아래처럼 생긴 용액입니다. 사진은 크게 나왔지만 실제로는 쬐그만 병에 들어있어요.

1.4ml 대용량! 




먼저 멀티미터로 단선된 부분을 찾아서, 테스트 해봤습니다.

제품 안에 작은 붓이 하나 들어있는데요, 요걸로 칠하고 말리고 또 칠하고 반복하면 됩니다.


키보드 필름이 두장인데, 아래 사진의 필름은 그나마 양호한 편이구요. 선 하나만 끊어졌더군요.

살살 발라서 테스트해보니... 오호~ 전기가 통합니다. 구리를 갈아서 만든 용액인지는 몰겠지만, 암튼 신기합니다. ㅎ.ㅎㅋ




그럼, 본격적으로 작업에 돌입!

심각하게 긁힌 필름을 전부 재도색 하기로 결정했습니다.

3M 마스킹 테입으로 선따라 붙여주었구요.

붓으로 열심히 덧칠했습니다. 용액 한병으로 꽤 많이 쓸 수 있더라구요.




24시간 건조 후, 마스킹 테입을 걷어냈습니다.

약간 지저분하지만 OK 하고 넘어갑니다. ㅋ




살살 조심해서 메인보드에 끼우고, 키입력 테스트를 해봤습니다.

오오... 잘 되네요. "역시 돈으로 안되는건 없구나."를 가슴 깊이 새기고~ ㅎ.ㅎ

본체 나사를 조였습니다.


WSX랑 GT의 키보드가 서로 바뀌었는데, 그냥 이대로 쓰렵니다.

괜히 커넥터 뺏다 꽂았다 반복하다, 맛이 가면 머리가 아프니까요~ㅋ



그럼 즐거운 밤 되셔요~



2016년 3월 10일 목요일

MMC/SD Drive V3 제작 #9 - 스캔라인 효과를 넣어보자

저희 집에는 CRT 모니터가 하나도 없습니다. 전부 LCD만 갖고 있어요.

가끔 MSX로 게임하다 보면, 옛날(?) CRT에서 보여주던 스캔라인이 그리울 때가 있습니다.


그.래.서.

이걸 한번 만들어 봤습니다!


"응? 혹시 5년전에 만들었던 [스캔라인 이레이져] 얘기인가요? 라고 물으신다면,

"NO" 라고 일단 대답을 드리구요. ㅎ.ㅎㅋ


이번엔 순수 S/W 만으로 구현을 해보았습니다.

에뮬레이터 아니고, 실기에서 돌아가는거에요. 흐...


CRT 스캔라인 효과를 잠깐 설명드리면...

CRT에 전자가 주르르 스치며 영상을 만들어내면, 가로방향 전자 이동한 곳은 영상이 남게 되는데요.

화면 전체를 가로선(스캔라인)으로 모두 채우기 힘들기 때문에, 빈공간이 검게 남아있게 됩니다.

뭐, CRT 크기가 아주 작으면 이 공간이 안보일 수도 있어요.

20인치 쯤 되는 모니터에 240p 같은 몇개(?) 안되는 스캔라인 뿌리면, 검은 부분(라인)이 상당히 도드라지게 보입니다.


이런 현상은 LCD처럼 촘촘히 픽셀을 뿌려주는 디스플레이 기기에서는 나타나지 않습니다.

일부러 만들어내지 않는다면요.

MAME 같은 에뮬레이터는 단순히 빈 검정 라인뿐만 아니라, CRT/LCD의 RGB 형광 패턴도 흉내내는 기능도 있더라구요.


암튼, 이걸 MSX에서 S/W적으로 만들어보는겁니다.

최종 목표는 아래 그림처럼 되겠습니다.

캐슬에 나오는 주인공 되겠습니다요~ ㅋ



완전히 검정라인을 넣는 것 보다는, 50% 정도의 어두운 색으로 보이는게 좀 더 보기가 좋네요.



그럼, 이걸 어떻게 만들면 될까요?

아래처럼 주인공 그림이 16라인으로 만들어져 있는데, LCD 모니터는 이 그림을 화면 비율에 맞게 세로로 늘려서 표시합니다.

MSX에서 넌인터레이스 모드(240p)에서 쓰이는 부분이 192 또는 212라인 정도인데요.

1920 x 1080 해상도의 LCD 모니터에 출력하면, 세로가 5배 뻥튀기 되는 셈이죠.



만약 인터레이스 모드(480i)로 출력하게 되면 어떻게 될까요?

아래처럼 홀수, 짝수 화면이 번갈아가며 출력됩니다. 보통 odd, even field라고 불러요.

이 신호를 받은 LCD 모니터는 원래의 480라인 화면으로 재구성(디인터레이스) 후, 화면 크기에 맞게 늘려서 표시합니다.


아래 주인공은 원래 16라인으로 출력되지만,

LCD 모니터는 "아... 이거 원래 32라인 그림이구나" 라고 생각해서 홀/짝 화면을 합성하게 되는거지요.

눈에 보이는 영상에는 별 차이가 없지만, LCD 모니터가 생각하는 원본 영상은 이미 해상도 두배가 되었습니다.



그럼 여기서 홀/짝 화면 중 하나만 어둡게 만들수 있다면...

PC 용 에뮬레이터에서 보던 스캔라인 효과가 되지 않을까? 생각이 들지요?


아래처럼 홀수 화면(필드)는 원래 그림 그대로 출력하고, 짝수 화면(필드)는 어둡게 출력하면...

LCD 모니터가 합성을 해줍니다. "이건 원래 32라인으로 된 그림이야"라고 하면서요~

(줄무니가 있는 이상한 그림이라고 생각하겠죠. ㅋ)



그럼 어두운 화면은 어떻게 만들면 될까요?

잘 생각해보시면 답이 나옵니다. ㅋ



그럼, 결과 화면 감상하셔요~

MMC/SD Drive V3에서 구현된 CRT 스캔라인 효과입니다.

바이오스 다음 버전(v5.13)에서 기능 추가될 예정입니다.