2026년 10월 20일 화요일

21세기 DOS 프로그래밍 #8 - ASO 리메이크

국딩 시절 잼나게 했던 슈팅게임이었는데, 아마 해보신 분들이 많으실 듯요.

아이큐2000의 비트맵 그래픽으로 멋진 슈팅을 만들어보는 것이 당시 어린이들의 꿈이었는데요.

BASIC으로는 스프라이트만 움직이는 것도 버거웠고, 최소한 어셈은 써야되었죠 ㅎ.ㅎ


ASO 같은 슈팅 게임을 만들어보려다 포기한 결정적인 이유는 이거였습니다.

컴파일에서 만든 자낙EX, 알레스트 같은 슈팅 게임을 본 후였죠.

상용게임 제작사도 MSX로는 오락실 수준의 슈팅게임은 무리였구나 ㅠ.ㅠ


그렇게 시간은 흘러, GT를 쓰게 되고 기본적인 주변기기들과 DOS2 프로그래밍 환경이 준비되었네요.

이제 다시 국딩 어린이의 꿈을 이뤄봅시다! ASO 리메이크 ㄱㄱㄱ


ASO 같은 세로 슈팅 게임들은 모니터를 90도 돌려서 사용합니다. 세로 해상도가 높아요.

VDP의 오버스캔 트릭을 쓰면 212라인이 아닌 240라인을 출력할 수 있습니다.

이렇게 해도 화면이 조금 잘려서 답답합니다만, 이게 최선이니...ㅋ


VDP가 블랭킹 없이 계속 디스플레이를 출력하면, VDP 커맨드가 가속되는 구간도 함께 사라집니다.

최대한 60프레임으로 게임을 구현하려면,

VDP 커맨드로 비트맵 복사하는 것과 CPU가 직접 VRAM을 R/W하는 것을 잘 섞어야합니다.

특히 turboR의 고속모드에서는 VRAM R/W에 WAIT가 걸리니까, 이걸 최소한으로 줄여야죠.


스프라이트 컬러, 어트리뷰트 테이블만 업뎃(복사)하는 것도 부하가 꽤 됩니다.

이 테이블들은 VRAM에 더블버퍼로 넣어놨는데요.

처음 설계할 때, 60fps가 불가능하면 30fps로 구현하려고 계획했던 것 때문이었습니다요.

스프라이트도 페이지 플립을 할 수 있으니까요.

근데 실제로 돌려보니, 60과 30프레임의 차이가 하늘땅 차이 수준이라서 60fps 최적화로 갔습니다.


스프라이트 32개로는 화면에 움직이는 캐릭터(총알 포함)를 모두 표시하는 게 불가능합니다.

지상에서 움직이는 적들은 모두 비트맵이구요.

모든 총알들은 홀짝 프레임에 맞춰서 절반씩 교대로 표시합니다.

깜빡임으로 두배의 스프라이트를 쓰는 거죠.


공중에서 움직이는 적들은 모두 스프라이트 2장으로 처리합니다.

주인공 기체는 스프라이트 3장이구요.


보스는 화면의 절반을 덮을 정도로 큰 사이즈입니다.

이 녀석은 스프라이트나 비트맵 복사로는 60프레임으로 움직이는 게 불가능합니다.

그래서 보스의 움직임을 V9958의 H/W 스크롤로 처리하고,

나머지 스프라이트(주인공, 레이저, 총알 등)를 반대로 위치 보정해서 표시합니다.

게이머가 봤을 때에는 보스가 움직이는 것으로 느껴지겠죠?


마지막으로 사운드는 MAME 소스를 수정해서, 채널별 데이터를 덤프 후 가공해서 사용합니다.

오리지널이 OPL 사운드라서, MSX-Audio 또는 MoonSound 호환 카트리지로 구동할 수 있죠.


조이메가 지원도 넣어서, 기본 3버튼 + START 버튼(PAUSE 용도)으로 동작합니다.


ASO를 처음 해본 게 1986년으로 기억하는데요.

2012년이 되어서야 비슷하게 구현을 해보게 되었네요.

국딩 어린이의 꿈을 실현ㅋ turboR이 없었다면 시도도 안해봤을 작업이었습니다.


아래는 2022년에 출격씬을 추가한 버전의 영상입니다 ㅎ.ㅎ



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


2026년 10월 18일 일요일

21세기 DOS 프로그래밍 #7 - TETRIS

테트리스, 누구나 아는 게임이죠?

문자 출력, VDP 커맨드, SPRITE, BGM 등의 기본 라이브러리를 테스트하기 위해 만들어봤습니다.


사실은...

라이브러리 문서를 만들다가 '어차피 보는 사람도 없는데 왜 시간낭비를 하고 있을까' 생각이 들어서,

문서를 폐기하고 참고용 샘플 코드를 넣기로 했거든요. 그 결과입니다 ㅎ.ㅎ


그래픽은 스크린 5를 쓰고 있구요. 패턴 데이터는 코드로 내장됩니다.

사운드 데이터는 MML을 쓰도록 되어있어서, 별도의 컨버터는 필요하지 않습니다.

바꿔말하면 DOS 프로그램인데 외부 데이터 파일을 하나도 안쓴다는 얘기죠.

이 때문에 ROM 빌드 샘플에도 활용이 됩니다. (이 부분은 나중에 따로 글을 써야겠네요)


아래는 테트리스의 동작 모습입니다.



DOS2용 기본 코드는 아래를 참고하세요.

https://github.com/sharksym/CPMEMU_HI-TECH_C/tree/master/EXAMPLE/2TETRIS


ROM 빌드는 아래를 참고하세요.

32KB 롬에 맞추느라 PSG BGM라이브러리만 사용했습니다.

FM BGM을 쓰려면 48KB 롬으로 빌드하면 될 듯요.

https://github.com/sharksym/CPMEMU_HI-TECH_C/tree/master/EXAMPLE/0HELLO.ROM



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


2026년 10월 17일 토요일

21세기 DOS 프로그래밍 #6 - M 파일매니저

DOS2에서는 서브디렉토리, 환경변수를 쓸 수 있어서 편리합니다.

메모리매퍼용 확장 BIOS가 포함되어서, 여러 프로그램들이 충돌없이 메모리를 활용할 수 있죠.


시스템 세그먼트에 로딩되면 램상주가 가능하니까, 용량 큰 프로그램을 제작할 때도 편리합니다.

초기 로딩 한번이면 이후는 빠르게 구동할 수 있어요.


예전 ST가 처음 나왔을 때에는 가용 메모리가 적어서 사실 DOS2가 그닥 활용되지 않았지만,

지금은 넉넉한 메모리를 쓰는 분들이 많아서 걱정없는 코딩이 가능합니다 ㅎ.ㅎ


그럼, DOS2용으로 쓸만한 파일매니저를 만들어봅니다.

90년대 MS-DOS 시절, Mdir과 NC를 써보셨으리라 생각됩니다.

Mdir은 하나의 디렉토리 내에서 필요한 여러가지 작업하거나 파일 확장자에 따른 메뉴 처리가 편하구요.

NC는 두개의 디렉토리를 비교하거나 같이 작업할 때, 또는 DOS 출력과 파일목록을 동시에 볼 때 편리하죠.


M 파일매니저의 이름에서 눈치를 채셨겠지만, 기본적으로 Mdir의 장점을 많이 가져왔습니다.

대신 NC의 듀얼 패널 형태의 디스플레이를 사용합니다.

디렉토리 복사 시, 재귀로 동작하니까 서브디렉토리를 함께 복사할 때도 편리합니다.


인터레이스 모드에서 한글폰트(16 x 16) 출력을 위해, 영문폰트도 8 x 16 사이즈를 사용했구요.

기본 영문,한글 폰트는 프로그램에 내장됩니다.

폰트팩이 존재하는 경우는 폰트팩의 데이터를 우선으로 사용하도록 되어있어요.


기본 디스플레이 영역은 512 x 424입니다만,

H/W 스크롤로 아래 영역의 VRAM도 모두(512 x 512) 사용합니다.

메모리매퍼와 VRAM을 마구마구 써버리는 프로그램이 되었죠 ㅎ.ㅎ


그 외, IMS, MP3 플레이어와 LED 비주얼라이저가 들어갑니다. 간단한 그래픽 파일 뷰어도 내장했구요.

M의 메인 화면을 유지한 상태에서 외부 프로그램을 백그라운드로 실행하는 기능도 있습니다.


초기에는 인터레이스 모드 전용이었는데, 넌인터레이스 영문 디스플레이 전용 옵션도 들어갔습니다.

고속모드가 없는 일반 MSX2에서도 그럭저럭 쓸 수 있게 되었죠.


최근에는 개선된 LFN 모드와 WAU용 MP3 스트리밍과 간이 브라우저 기능도 들어갔네요.

앞으로 새로 나오는 주변기기가 있다면, 내장기능도 계속 추가되겠습니다.


첫 버전이 2010년에 나왔으니까 참 오랫동안 개발중인 프로그램입니다요.

아마 제가 실기 사용을 멈추는 날까지 버전업이 되겠죠? ㅎ.ㅎ


아래는 LFN 모드에서 MP3 플레이어가 동작하는 모습입니다.


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