2016년 9월 25일 일요일

[WIN] VS Code에서 GEN80 어셈블러 출력을 색칠(!)

간단한 C코드 빌드하거나 어셈블리로 개발하는 프로젝트인 경우, VS Code를 애용합니다.

대개 빌드하면 터미널(CMD) 창을 열고 작업하거나, 그냥 Task로 등록해서 빌드 명령을 쓰는데요.


VS Code 익스텐션을 살펴보니, Task OUTPUT에서도 언어 익스텐션이 동작 가능하더라구요.

터미널 창은 ANSI라서 git을 실행하면 알록달록 잘 나와서, 요게 Task에서도 되려나...했거든요.

GEN80 같은 어셈블러 출력 시, 에러 메시지에 색깔이 칠해지면 눈에 잘 보이고 좋으니까요. ㅎ.ㅎ


요약하면,

1. 어셈블리 프로젝트 빌드시, VS Code의 Task 사용

2. Task OUTPUT의 빌드 메시지를 언어 익스텐션으로 색칠

이 되겠습니다.


백문이 불여인견! 스크린샷 나갑니다~~

색칠 보여드리려고, 일부러 소스에 에러코드를 좀 넣어봤어요. ㅎ.ㅎ





에러 메시지가 빨갛게 잘 보이니까, 좀 더 편하게 개발할 듯 합니다.


혹시 익스텐션 써보실 분은 gen80으로 검색하시면 나와요.





그럼 즐거운 일요일 되세요!


2016년 9월 20일 화요일

[WIN] VS Code에서 MSX 어셈블리를 색칠(!)

혹시 Visual Studio Code 쓰시는 분 계세요?

코딩 용 에디터인데요, 저는 쓴지 1년 가까이 되어가는 듯 합니다.

보통 VS Code라고 부르더라구요.

안써보신 분은 한번 깔아보셔도 괜찮을 듯 합니다.



일단 본론으로 넘어가서~ ㅋ

대부분 에디터가 그렇지만...

VS Code에서는 언어 익스텐션이라는걸  추가하게 되면, 해당 언어에 대해 키워드 색칠놀이(?)을 할 수 있습니다.

저야 뭐~ 이걸로 MSX 용 코드 작업할 때 쓰고 있는데요. ㅎ.ㅎ

Z80 어셈 명령어와 MSX BIOS의 엔트리 심볼, 워크에어리어 변수들을 등록해놨어요.


요거 익스텐션을 야매(!)로 만들어서 쓰고 있었는데,

이걸 마켓플레이스에 등록하는 방법이 의외로 간단하더라구요.

(뭔가 복잡한 계정 설정이 필요할까봐 쳐다보지도 않았는데..ㅋ)


그.래.서.

작업한걸 VS Code 마켓플레이스에 올렸습니다. ㅎ.ㅎ


아래처럼 VS Code의 익스텐션(확장) 메뉴에서 msx로 검색하면 나옵니다.

README 템플릿를 대충 편집하다보니, 요구사항 도움말이 안지워지고 남아있네요.ㅋ





아까 저녁에 올렸는데, 벌써 두분이 받아가셨습니다. MSX 개발자에게 경의를 표합니다!

익스텐션 설치 후, VS Code를 재실행하면 동작합니다.


파일 확장자는 GEN, MAC, INC 세개만 넣었어요.

MSX 용 어셈 소스를 열어보면 아래처럼 키워드에 이쁘게 색칠되어서 나옵니다.


참고로 아래 코드는 폰트팩 소스 일부분인데, Cobalt 컬러 테마를 쓸 때의 색깔입니다. 푸르딩딩~~~





결론은,

VS Code로 MSX 어셈 코딩하시는 분 있으시면 받아서 쓰시라는 얘기지용~ ㅎ.ㅎ


그럼 즐거운 MSX 되세요!


PS. 20160921 업뎃
아이콘 추가하고 디스플레이 이름 바꿨습니다. extension 이름은 asm-msx 그대로입니다.
그리고 키워드는 대소문자 구분하지 않도록했습니다. ㅎ.ㅎ




2016년 9월 18일 일요일

MMC/SD Drive V3 제작 #12 - Hybrid 모드 (SUBROM + MegaRAM)

일요일을 맞아, MMC/SD Drive V3의 기능을 확장해보았습니다.


MMC/SD Drive V3 내부에는 플래쉬롬(SUBROM)과 SRAM이 함께 들어있습니다.

기본 H/W는 SUBROM 1024KB + SRAM 512KB가 들어있구요,

SRAM을 확장하면, SUBROM 1024KB + SRAM 1024KB 상태가 됩니다.


만약 롬 이미지를 구동는 경우,

MegaRAM 또는 SUBROM 모드를 쓰면 최대 1024KB의 롬 파일을 로드할 수 있습니다.


대부분 MSX 롬은 512KB 이하의 크기이지만, 가끔 2048KB나 되는 대용량 롬을 볼 수 있습니다.

Pointless Fighting, 수퍼 게임 월드(126합팩) 등이요. (두개 뿐이었나...ㅋ)


이런 롬들을 SUBROM과 SRAM에 나눠서 다운로드 후 구동하는 기능을 추가하게 되었습니다.

물론 기존에도 전혀 불가능하지는 않았어요.

사용자가 직접 파일을 쪼개서 다운로드해서 구동하는 방법도 있었습니다.


하지만 이 방법으로는 SCC 매퍼만 구동가능하다는 단점이 있구요.

결정적으로 귀찮아요.

그래서 한방에 동작하는 모드로 구현했습니다.


SUBROM과 SRAM을 함께 쓰니까, 이름은 Hybrid 모드라고 지었구요~ ㅋ

MMCSD.COM 프로그램으로 ROM 실행 시, 사용자가 선택해서 모드전환을 할 수 있습니다.

롬 용량이 1024KB 넘는 경우만 쓸 수 있어요.


아래는 2048KB 용량의 Pointless Fighting 롬을 다운로드 하는 모습입니다.

초반 1024KB는 SUBROM에 들어가겠구요. 후반 1024KB는 SRAM(MegaRAM)으로 다운로드됩니다.





V3의 SRAM을 확장(1024KB)한 경우만 2048KB 롬을 실행할 수 있구요.

V3 기본 상태의 SRAM(512KB)인 경우는 1536KB 롬까지 실행 가능합니다.

수퍼 마리오 월드(1304KB)를 다운로드 할 수 있겠네요.



그럼, 실제 동작하는 영상을 보시겠습니다요~

Pointless Fighting -> Super Mario World -> Super Game World 순으로 실행합니다.

PAC-V 카트리지도 함께 출연했어요. ㅋㅋ





그럼, 즐거운 일요일 밤 되세요!!

MMC/SD Drive V3 제작 #11 - 게임 내의 카세트 세이브/로드

지난번엔 카세트테입 이미지로 된 게임을 로드해봤었지요?

이번엔 일반 롬팩 게임 내에서 카세트테입에 데이터를 세이브/로드하는 것을 구현해봤습니다.


GameRunner 모드 용 BIOS에 카세트 루틴으로 구현되었구요.

게임 내에서 카세트에 저장하게 되면, MMC/SD Drive의 SRAM을 이용하여 데이터를 저장합니다.

CTRL + ESC 눌러서 게임을 강제종료하게 되면, 디스크에 파일 형태로 저장됩니다.


게임에서 세이브 데이터를 크게 필요로하진 않으니까, 테입 용량은 16KB 정도로 제한했습니다.

뭐, 이정도면 충분하겠죠? ㅋ


생성된 CAS 파일은 나중에 ROM 파일을 로딩할 때, 자동으로 함께 로딩됩니다.

예) CASTLE.ROM, CASTLE.CAS 두개 파일이 존재하는 경우,

    MMCSD CASTLE.ROM /G 명령으로 실행하면, CASTLE.CAS 파일도 함께 로딩됨.


아래 사진처럼 되겠습니다.





음... 근데 지난번 소개드린, 카세트 게임 로딩 방법과의 차이가 이해되시나요?

이해하셨으리라 믿고 넘어갑니다요. ㅎ.ㅎ



카세트 테입을 쓰다보면 테입을 되감아야하는 경우가 생깁니다.

게임 중에서는 CTRL + BS 를 누르면, 테입 되감기가 됩니다.

물론 게임을 종료하고 다시 실행하면, 테입이 맨처음 위치로 시작하겠구요.



실제로 잘 동작하는지 봐야겠죠?

메탈기어와 캐슬로 테스트 해봤습니다.


메탈기어의 경우는 세이브/로드 시 이름을 입력하도록 되어있습니다.

로드할 때 보니, 해당 이름의 데이터가 나올 때 까지 자동으로 SKIP 하더라구요. ㅎ.ㅎb

테입을 맨 앞으로 되감더라도 별로 불편하지 않았습니다. 카세트 에뮬이 워낙 빠르다보니~ㅋ





캐슬의 경우는 여러번 세이브 했을 때, 원하는 데이터를 로딩하려면 조금 귀찮았습니다.

테입 로드를 맘대로 할 수 있는게 아니라, 타이틀 화면에서만 로드하도록 되어있더라구요.

로드 했는데 원하는 데이터가 아니라면,

F2 눌러서 게임오버 후 F3 눌러서 다시 로드... 이걸 반복해야합니다.



그럼, 실제 동작하는 모습을 영상으로 보시지요~ ㅎ.ㅎ





그럼, 즐거운 주말 되세요!!

2016년 9월 9일 금요일

MMC/SD Drive V3 제작 #10 - 테입 로딩을 해보자

MSX로 카세트 테입으로 게임 해보셨죠?

어린시절 기억이겠지만요~ ㅎ.ㅎ

저는 국딩 때, 테입 게임이 열몇개 정도 있었어요.

나중에 쓸모가 없어져서, 아마 고딩 때였던 것 같네요, 다 내다버렸었지요.

한 두개는 기념품으로 남겼어야하는데...바보같이 ㅜ.ㅜ

보람소프트 테입이 보고싶군요~


그래서!! 이번엔~~

MMC/SD V3로 테입으로 된 게임실행에 도전해봤습니다.

사실 지난 4월 정모에 우유속의소주님이셨나요?

테입 게임은 지원 안되냐고 하셔서리, 한번 해봤어요. ㅎ.ㅎ



아래 내용을 구현하면 되겠네요.

1. MMCSD.COM 유틸로 CAS 파일을 MegaRAM으로 로딩

2. BIOS TAPIxx 루틴을 MegaRAM의 CAS 데이터를 쓰도록 구현

3. 이상한 게임들은 테입 루틴을 직접 패치



구현에 앞서, 기존 테입 게임들이 어떤 구조로 되어있는지 분석이 필요하겠습니다.

크게 나누면 두 종류의 게임이 있어요.


1. 처음부터 MSX 용으로 만든 게임

  - MSX 롬팩이었던 16KB/32KB 게임을 덤프한 해적판 테입

  - MSX 테입 전용 게임 (ZARTH 등)


  얘들은 MSX 표준 환경에 맞춰서 돌아갑니다.

  특별한 문제가 없다면 저장매체를 바꾸는건 별 문제가 되지 않아요.


2. 타 기종의 S/W를 포팅한 게임

  이부분은 확실하진 않지만...

  대부분 ZX 스펙트럼 게임을, MSX에서 구동되도록 VDP 부분을 수정한 것으로 생각됩니다.

  그래픽 구현이 ZX 스펙트럼이랑 똑같아요. 스프라이트 없는 8x8 단색 패턴 -_-

  ZX 스펙트럼 쪽은 VRAM이 CPU 메모리맵 I/O로 직결되는걸로 아는데,

  이걸 MSX VDP쪽으로 옮기면 포트 I/O가 되어서 속도가 상당히 떨어지게됩니다.

  그 때문인지 이런 게임들은 실행해보면 많이 느릿느릿 하더라구요.



일단 MSX BIOS의 TAPIxx 루틴들을 변경해야, 기존 테입루틴 대신 MMC/SD의 메가램을 쓸수 있는데요.

아시다시피 MSX의 하위 디바이스 I/O 루틴은 훅이 없습니다.

결론부터 얘기하면 별도의 H/W 도움없이는 힘들다는 얘기죠.

하지만 MMC/SD V3는 MSX 슬롯처럼 16KB 페이지의 뱅킹으로 메가램을 구동할 수 있습니다.

사실 이부분이 예전 MMC/SD V1/V2에서는 지원이 안되던거였죠. (SCC 매퍼로는 못 만듭니다.)


암튼 가짜 BIOS를 구동해서 테입을 실행해봤습니다.

롬팩 덤프한 파일들은 귀찮아서 안돌려봤구요. 안될 이유가 없으니~ㅋ

일단 ZARTH랑 잡다 소용량 게임들 돌려봤습니다.

잘 되군요! 오호~ ㅎ.ㅎ (사진은 없어요 ㅋ)


MSX의 BIOS/WORKAREA/HOOK 이런 표준이 참 좋은 구조같아요.

이리저리 코드가 많이 구동되어서 속도가 떨어지는 단점은 있지만,

지금 21세기에 이런저런 기능들을 추가해서 돌리는게 얼마나 큰 장점인지...

옛날 사람들 존경합니다! ㅎ.ㅎb

언젠가 만나게 되면, 코리안 떡볶기를 대접해드리는걸로~ ㅎ.ㅎ



그럼 본격적으로 유럽에서 유통되던 게임들을 돌려봐야겠지요.


1차 시도는 After Burner로 정했습니다.

일단 한번 실행해볼까요?

아래는 터보알에서 MMC/SD로 구현한 TAPIxx 바이오스로 구동한 모습입니다.

BASIC에서 BLOAD까지는 당연히 잘 됩니다요!





문제는 그 다음인데, 바로 먹통이네요. 으어~~

디버깅하려면 윈도의 영원한 친구 blueMSX가 필수죠! ㅋ


대충 살펴보니 가관이네요 ㅜ.ㅜ

확실히 "난 MSX게임이 아니야"라고 아우성치는 듯 합니다.

Page3의 WORKAREA 다 날리고 시작하네요.

BIOS의 ENASLT, CALSLT 이런 것 다 필요없습니다.

그냥 포트 A8H 출력으로 슬롯 바꾸고, CALL xxxx 이렇게 다이렉트로 돌아가네요.

게다가 스택을 Page1이랑 Page3 번갈아서 씁니다.

어허허... MMC/SD를 Page2에 매핑해야하나...


blueMSX만 뚫어져라 보니, 완전 방법이 없는건 아니더라구요.

메모리 마지막 부분 수십 바이트는 안쓰고 있군요. ㅎ.ㅎ

ZX 스펙트럼이 이쪽에 IO가 있나... 확인해보진 않아서 잘 몰겠지만요.

암튼 이쪽으로 코드를 우회해서 돌아가도록 해봤습니다.


결과는?

.

.

.

체크썸 에러! ㅋ

아~~ 데이터를 조금 바꿨는데, 이걸 로더가 체크썸으로 확인하는군요.

역시 테입 로딩과 헤더 조절 드라이버는 절친인 걸로~ ㅎ.ㅎ


체크썸 루틴도 마저 패치했습니다.

다시 구동!!


결과는? 아래 사진이 증거가 되겠습니다요.




오~~~ 돌아가네요.

한판 끝나면, 테입을 REWIND 해달라고 띄우네요. ㅎ.ㅎ;;

이건 게임 많이 하지말라는 얘기겠죠? 하루에 한판만? ㅋ

뭐, 이건 나중에 구현하는걸로 약속하고 다른 게임으로 넘어갑니다.



2차 시도는 PAC MANIA입니다.

며칠전에 게시판에서 본 기억도 나고해서리... 도전해봅니다.

요건 유럽 아저씨들이 남코 라이선스 받아서 만든거네요.

회사 이름이 GRANDSLAM ㄷㄷㄷ


윈도 에뮬로는 잘 돌아가는거라, 바로 터보알로 구동!

.

.

.

안되네요. 얘들도 이상한 구조로 되어있나봅니다.

blueMSX 출동!!

아... 얘도 "난 MSX 출신이 아님"이라고 외치고 있습니다.

스택을 Page1에서 돌리는 경우도 있네요.

문제는 테입에서 데이터 로딩하는데, 메모리 FFFEH 까지 덮어씁니다.

애프터버너는 양반이었네요. ㅎ.ㅎ;;;


음... 자세히 보니, 다행하게도 메모리 끝부분은 게임에서 쓰는 데이터가 아닌걸로 보입니다.

일단 데이터 잘라내고 돌려봅니다.


결과는?

흐흐... 돌아가네요.

참고로 이 게임은 터보알 고속모드에서 쾌적하게 돌아갑니다. 마치 이게 원래 속도라는 듯이요~



게임 두개 분석하는 것도 시간이 꽤 걸리네요.

그나마 다행인건 다른 게임도 좀 봤더니, 구조가 비슷해보였습니다.

안돌아가는 애들은 심심할 때 하나씩 분석하면 재밌을 듯 하네요.

.

.

.

라고는 하지만 연말에 paraMSX-R을 만들면 그냥 구동될게 뻔하니... 시간을 아끼도록 하겠습니다. ㅎ.ㅎ


그리고 한가지 테입 로딩을 편하게 할 수 있도록,

BASIC으로 전환 후, RUN"CAS:", CLOAD + RUN, BLOAD"CAS:",R 을 자동으로 실행합니다.

이 테입을 어케 로딩하더라? 기억할 필요없습니다. 그냥 M에서 리턴키 한방으로 끝! ㅎ.ㅎb


백문이 불여일견이죠?

테입 게임 구동하는 모습을 영상으로 담았습니다.





그럼, 즐거운 불금되셔요!