2024년 12월 3일 화요일

HI-TECH C - ROM 카트리지 만들기

프로그래밍 글은 오랜만에 쓰네요. 지난 글을 검색해보니 마지막 글이 2016년이었..ㅎ.ㅎㅋ


지난 송년회 때 ROM파일 제작 얘기가 나와서, 관련 내용으로 글을 한번 적어봅니다.

일단, 여기서 설명하는 'HI-TECH C'는 제가 만든 뱅킹 툴과 결합된 툴체인을 의미합니다.

기존 CP/M 및 MS-DOS 버전과는 차이가 있으니, 잘 모르는 부분이 있으시면 지난 글을 검색해서 보시면 좋겠습니다.



CFG 파일에서 설정된 app-mode에 따라 DOS1 또는 DOS2용 실행파일(COM 또는 COM + OVL)이 생성됩니다.

이건 뭐 다 알고 계시죠? ㅎ.ㅎ


그러면, 생성된 실행파일을 롬 카트리지로 제작하려면 어떻게 해야될까요?

몇가지 방법이 있습니다.



1. 플래쉬롬 카트리지 사용


프로그램 종류에 맞는 부팅 디스크에 완성된 프로그램을 넣은 후,

DSK2ROM 등의 프로그램으로 롬디스크 이미지를 만듭니다.


롬디스크는 보통 DOS1 커널이구요. 각종 플래쉬롬 카트리지 등에 다운로드해서 사용가능합니다.

읽기전용 디스크로 동작하지만, 프로그램에서 디스크 쓰기를 하지 않는다면, 이정도로 충분하겠죠.


만약 DOS2 프로그램을 실행해야 한다면?

본체에 별도의 DOS2 카트리지가 있거나 turboR 같은 DOS2 내장 기종이 필요합니다.



2. MMC/SD V1 및 V2 카트리지 사용


요즘은 보통 V3나 V4를 쓰시겠지만, 구버전인 V1, V2는 플래쉬롬의 일부분을 부팅 디스크로 사용이 가능합니다.

이 롬디스크는 R/W가 가능하도록 설계되어 있어서, 실제 디스크처럼 사용가능합니다.

단, DSK 이미지 용량이 384KB로 제한이 되어있어요.

512KB 플래쉬롬에 MMCSD BIOS 128KB + DSK 이미지 384KB를 붙여서 다운로드합니다. (ATLOAD 툴 사용)


만약 MMC/SD 보드를 자작한다면, 매뉴얼에 나와있는 회로도의 SCC 카트리지 파트만 제작하시면 되는데요.

이제와서 이걸 만드실 분은 아마 없으시겠죠? ㅎ.ㅎ



3. Flash Drive 사용


DOS1 및 DOS2 커널이 내장되어 있어서, 자작한 DOS2 프로그램을 실행하는 용도로 쉽게 사용가능합니다.

플래쉬롬의 일부분을 쓰기가능한 디스크섹터로 구성되어있어서,

디스크 세이브/로드가 필요한 때에 활용하면 좋습니다. 디스크 용량도 1.44MB이구요.


참고로, 제가 샘플로 보여드린 활용법은, GRUN 세이브 및 YS2 HDD 버전 세이브였습니다.

관련 글은 Flash Drive로 검색하시면 볼 수 있어요.


.

.

.


뭔가 생각하시는 것과 거리가 있나요? ㅎ.ㅎ

다른 분들이 원하시는 것은 보통 이렇더라구요.

-> 디스크 루틴이 필요없는 32KB, 48KB 등의 저용량 롬팩용 프로그램 제작


원래 제가 HI-TECH C 뱅킹 툴을 만든 목적은,

- DOS2에서 대용량 프로그램(32KB 뱅킹) 제작

- turboR의 빠른 내장 메모리 매퍼를 활용

- 비트맵 그래픽, 한글 디스플레이 활용

입니다.


그렇게 제작된 것들이 ASO remake, M 파일매니저, HV 한글뷰어, 한자/특수 문자 로더, MMCSD 툴 등의 프로그램입니다.

자낙, 마성전설 같은 32KB 게임팩 제작과는 한참 떨어진 거라고 봐야겠죠.



그.래.서. 하나 더 추가합니다.


@ 32KB/48KB/64KB 넌매퍼 롬 카트리지 사용


작년에 TapTapRevolution을 구상하면서,

메인 프로그램을 HI-TECH C로, 디스크 없는 환경 용도로 만들어볼까? 라는 생각이 들더라구요 ㅎ.ㅎ


프로그램은 DOS 환경과 똑같은 램 64KB 영역에서 동작하지만,

프로그램 로더는 일반 32KB 롬팩처럼 실행됩니다.

기존 라이브러리에서 디스크 R/W를 제외한 코드를 구동할 수 있도록, BDOS의 에뮬도 구현이 되어있구요.

64KB 롬팩으로 구현하는 경우는 마지막 16KB 영역을 그래픽 데이터로 활용하는 것도 구현되어 있습니다.


프로그래머 입장에서는 HI-TECH C로 DOS1용 프로그램을 빌드하는 것과 같은 방식으로 제작이 가능합니다요.


CFG 파일에 새로 추가된 rom-mode 스위치를 사용하면 ROM파일로 출력물이 생성됩니다.

아래는 샘플 프로그램인 0HANGUL.ROM 디렉토리의 CFG 설정부분입니다.

'app-mode = 0' 및 'rom-mode = 2'로 설정되어 있습니다.




프로그램 로딩 및 실행은 카트리지의 INIT 루틴에서 이루어집니다.

따라서 프로그램이 종료되면 DOS로 복귀하는 게 아니라, 메인 BIOS의 슬롯 INIT 루틴으로 복귀합니다.


github의 EXAMPLE 디렉토리에 ROM 샘플이 있으니 참고하시구요.

-> 0BGM.ROM, 0HANGUL.ROM, 0HELLO.ROM, 0TETRIS.ROM


아래는 blueMSX에서 0HANGUL.ROM을 실행한 모습입니다.




롬 카트리지를 만들 때에는 넌매퍼 타입의 보드를 사용하면 되겠습니다.

48KB로 빌드된 ROM과 VRAM data 16KB를 붙여서 64KB의 롬 카트리지도 가능하구요.


마지막으로,

HI-TECH C 패키지 전체를 받으시려면, 아래의 오늘자 release 링크를 이용하셔요!

https://github.com/sharksym/CPMEMU_HI-TECH_C/releases/tag/2024-12-03



그럼, 이만...


2024년 11월 10일 일요일

WAU 제작 #8 - 리모트 플레이어

MSX의 사운드 기기만으로 재생이 불가능한 미디어파일들이 많이 있는데요.

이것들을 PC쪽 리모트 드라이브에 놓고 플레이해보아요~


WAU 서버가 오디오(PCM)를 MP3 320kbps로 인코딩 후 MSX로 스트리밍해주는 방식입니다.

MSX에서는 Wi-Fi로 데이터를 받아서 VS1003으로 재생(디코딩 출력)합니다.

PAC-V가 있다면 LED 비주얼라이저도 함께 동작하겠네요 ㅎ.ㅎ


WAU 서버에는 OpenMPT와 VGMplay가 내장되어 있습니다.

ffmpeg의 경우는 외부 프로그램으로 구동되지만, 데이터를 pipe로 전달받아서 사용합니다.


ffmepg  -> MKV, MP4, FLAC, OGG 등의 오디오 처리

OpenMPT -> S3M, MOD 등의 모듈 음악 플레이

VGMplay -> VGM, VGZ(압축) 음악 플레이


M 파일매니저에 내장된 #MPXP, #VGMP 플레이어에서는,

현재 재생하려는 파일이 리모트 드라이브에 존재하는 경우, 자동으로 WAU 리모트 플레이어로 전환합니다.

이렇게 동작하는 방식이 사용자 입장에서는 제일 편한 것 같네요.


그럼, 실기에서 동작하는 모습을 감상하시죠~

부팅 후 리모트 드라이브를 연결하고 S3M -> MP4 -> VGM 순으로 재생하는 모습을 볼 수 있습니다.



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


2024년 11월 1일 금요일

WAU 제작 #7 - S3M 플레이어 테스트

WAU에 들어있는 Wi-Fi 모듈은 ESP-12F입니다.

ESP8266 32BIT MCU에 4MB(32Mbit) SPI 플래쉬롬이 붙어있는데요. 이 플래쉬롬은 1MB 영역만 CPU에 매핑됩니다.

결국 나머지 3MB는 코드가 아닌 다른 영역으로 활용하게 됩니다.


보통은 F/W를 2세트로 넣어서, 런타임으로 다운로드 및 교체하는 방식으로 2MB를 사용하구요.

나머지는 영역에는 파일시스템을 탑재하거나, 별도의 데이터로 활용하면 됩니다.

아니면 그냥 F/W를 4세트로 넣어버려도 좋구요 ㅎ.ㅎ


사실 1MB 맵에서 공용 데이터를 제외하면 실제 메인 프로그램의 영역은 896KB가 되는데요.

이게 TCP/IP 및 RF 등의 기본적인 코드만 넣어도 700KB 수준이라서,

사용자가 추가할 수 있는 코드가 200KB 정도로 보시면 되겠습니다.


현재 WAU에서는 기본 F/W 1개, MP3 스트리밍 모드 전용(TCP 수신버퍼 최대활용) F/W 1개가 들어갑니다.

이제 플래쉬롬 2MB가 남았네요.

남은 부분으로 뭘 만들면 재밌을까요? ㅎ.ㅎ


Wi-Fi 모듈 및 USB-UART 모듈은 둘 다 UART 921KBPS를 사용합니다.

UART start 1bit, data 8bit, stop 1bit 세팅에서 92KB/s 전송이 가능합니다.


만약 전송되는 데이터를 몽땅 사운드 PCM으로 활용한다면, 오디오 디코더처럼 쓸 수 있겠네요!

16BIT MONO 44KHz PCM은 가능하겠죠? STEREO PCM이라면 16BIT 22KHz 또는 8BIT 44KHz가 되겠습니다.

전송되는 데이터는 88KB/s입니다.


사운드 테스트를 위해 S3M 플레이어를 넣어보았습니다.

RTOS와 최소한의 라이브러리만 남기고, 기본적인 S3M 플레이어 코드를 넣으니, 285KB 정도의 F/W를 만들 수 있네요.

896KB 범위 내에서라면... 608KB 정도의 S3M 데이터를 넣어서 실행가능합니다.


참고로, ESP8266 칩은 사용자용 램(캐시를 제외)이 80KB밖에 없어요.

따라서 프로그램에서 쓰는 변수 외의 const 데이터 테이블은 모두 SPI 플래쉬롬 상에서 직접 액세스해야합니다.

캐시도 작아서, 악기용 PCM 샘플과 노트 데이터를 연속으로 읽으면 캐시미스로 성능이 대폭 하락할 예정ㅋ


그래도 한번 해보면 재미겠죠? ㅎ.ㅎ


전체적인 프로그램의 흐름은 이렇게 되겠습니다.

1. MSX의 디스크에서 S3M 데이터를 읽어서 ESP로 전송합니다. (SPI 플래쉬롬 1섹터 4KB단위)

2. ESP에서는 전송받은 S3M 데이터를 플래쉬롬에 다운로드합니다.

3. 전송 및 다운로드가 완료되면, ESP에서 S3M 전용 F/W로 전환하고 리부팅합니다.

4. ESP의 S3M 플레이어는 최종 PCM 데이터를 생성 후 MSX로 전송(스트리밍)합니다.

5. MSX에서는 수신된 PCM 데이터를 WAU의 VS1003 디코더로 전송합니다.

6. 주기적으로 VS1003의 스펙트럼 애널라이저 데이터를 수신하여, PAC-V의 LED 비주얼라이저를 설정합니다.


이렇게 해서, 최종 오디오는 WAU의 HP출력단자로 나오게 되겠습니다요~ ㅎ.ㅎ/


그럼, 제 GT에서 동작하는 모습을 보시죠!




이번 S3M 플레이어는 이런식으로 Wi-Fi(ESP) 모듈을 활용할 수 있다...정도로 보시면 되겠습니다.

이미 문사운드용 MOD/S3M 플레이어가 있어서, 굳이 WAU-S3M을 사용할 이유는 딱히 없어요 ㅎ.ㅎ


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