레이블이 _SLT-Turbo인 게시물을 표시합니다. 모든 게시물 표시
레이블이 _SLT-Turbo인 게시물을 표시합니다. 모든 게시물 표시

2025년 11월 13일 목요일

FS-A1에서 잠깐 SLT-Turbo를 꽂아보았습니다

FS-A1에서 잠깐 SLT-Turbo를 꽂아보았습니다.


제가 예전엔 A1을 테스트용으로 많이 썼는데요.

요즘엔 X-II, 아이큐2000으로 테스트하다 보니, A1이 구석에 쳐박혀있었습니다요.


암튼 꺼내서 SLT-Turbo를 잠시 동작시켜보았습니다.

A1은 전원 개조외엔 순정 상태입니다. 노말램 64KB에 v9938 그대로 박혀있어요 ㅎ.ㅎ


내장 폰트팩의 한글 출력입니다.



프레이도 한번 돌려보구요.



곧 국민겜(?)이 될 환영도시(aka 웰컴시티)도 실행해보아요.



터보알 전용인 Pleasure Hearts도 실행 ㄱㄱ



마지막으로 MIDRY + SC-88 연주입니다.



당연한 소리겠지만...

v9958의 기능(자연화 모드, 가로 스크롤)을 쓰는 부분에서는 화면이 엉망이 됩니다요 ㅎ.ㅎㅋ


그럼, 이만~~


2025년 10월 18일 토요일

SLT-Turbo 제작 #18 - 기본 사용법


1) SLT-X 및 MIDI 케이블 연결


단자 위치를 확인하세요.




2) 기본 셋업


대부분의 MSX2 이상 기종들은 외부 슬롯 커넥터가 2개 있습니다.

IQ2000, X-II는 슬롯 커넥터 1개와 확장버스 커넥터(IDC 단자 모양)가 1개 있죠.


사용자 환경에 따라, 상단/전면 또는 후면 슬롯에 SLT-Turbo를 장착하면 되겠습니다.

아래는 A1WSX의 상단 슬롯에 장착한 모습입니다.



아래는 A1WSX의 후면 슬롯에 장착한 모습입니다.

상단 슬롯에 PAC-V를 꽂으면 딱 맞는 셋업이 되겠습니다!



아래는 X-II의 전면 슬롯에 장착한 모습입니다.

전면에 카트리지를 세로로 꽂을 수 있는 어댑터를 쓰셔도 좋겠습니다.



만약 IQ2000, X-II의 후면 슬롯에 연결하려면, 당연히 '확장버스 to 에지슬롯' 어댑터가 필요하겠습니다.

갖고 계신 분은 활용하시면 좋을 듯요! ㅎ.ㅎ



3) 최소 셋업


'나는 SLT-X도 없고 주변기기도 별로 없는데, 그냥 SLT-Turbo만 꽂아서 쓸 수 없나요?'

라고 생각하시는 분들을 위한 사용법입니다 ㅎ.ㅎ


SLT-X 대신 카트리지를 연결할 수 있는 어댑터가 제공됩니다.

이걸 MMC/SD V4에 꽂으세요! ㅎ.ㅎ



아래는 A1WSX의 후면 슬롯에 SLT-Turbo와 MMC/SD V4를 장착한 모습입니다.

MIDI 모듈이 있다면, 케이블을 함께 연결하면 되겠네요.

PAC-V를 상단 슬롯에 꽂으면 더 좋구요 ㅎ.ㅎ



이 상태에서 본체의 전원을 켜면, SLT-Turbo가 turboR GT로 부팅되는 걸 볼 수 있겠습니다.

그 다음은 뭐... 그냥 GT를 쓰는 것 처럼 사용하시면 되겠네요. ㅎ.ㅎ/


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


2025년 10월 16일 목요일

SLT-Turbo 제작 #17 - Z80 듀얼 프로세서

[서론]

제목이 살짝 낚시(ㅋ) 같습니다만... 으흠, 암튼 그렇습니다요 ㅎ.ㅎ


본체에 SLT-Turbo를 꽂으면, 본체의 Z80은 기본적으로 I/O 프로세서로 동작합니다.

실제로는 Z80 2개가 병렬로 동작하고 있지만, 사용자 입장에서는 CPU가 하나처럼 느껴지게 됩니다.


만약, 아예 작업을 나눠서 두개의 CPU로 구동할 수 있다면 어떨까요? 작업시간을 절반으로 낮출 수 있겠죠!


예를 들어 곱셈 구구단 표를 만들 때,

Z80 1번: 1단 ~ 5단 계산

Z80 2번: 6단 ~ 9단 계산

-> 이렇게 동시에 동작하는 걸 의미합니다.


물론 단순 계산작업이 아닌 주변기기 I/O가 포함된 작업이라면, I/O를 기준으로 CPU 코드를 나눠야겠지만요.



[본론]


그럼, 실전으로 넘어갑시다!

듀얼 CPU를 활용하는 동영상 플레이어를 만들어보아요~

이름은 MV2 player입니다!


기존 MV player의 경우,

초당 12프레임의 비디오 데이터를 SD카드에서 VRAM으로 전송하고,

VRAM 전송 중 틈틈이 오디오 데이터를 PCM으로 출력합니다.

SD카드는 커맨드를 보내고 응답받는데 걸리는 시간이 제각각이라서, 동작 시간도 계산해서 구현해야하죠.

코딩할 때 명령어 하나씩 사이클 계산해서 맞추느라 무쟈게 귀찮...ㅋ



MV2에서는 아래처럼 작업을 나눕니다.


SLT-Turbo:

 SD카드에서 데이터 읽기

 비디오 데이터를 공유버퍼로 전송

 MP3 데이터 출력(WAU 카트리지)


본체:

 공유버퍼의 비디오 데이터를 VRAM으로 전송

 키입력(ESC 키) 상태를 SLT-Turbo로 전달


본체의 Z80은 동작시간 대부분을 VRAM 전송하며 보내게 됩니다.

페이지 플리핑이나 팔레트 변경도 들어가겠지만, VRAM 데이터량에 비하면 '새발의 피'입니다요.


CPU가 단순 VRAM 전송만 해도 된다면, 최대 전송량은 얼마가 될지 계산해봐야겠죠?

OUTI 풀어쓰기로 VRAM 전송과 팔레트 설정을 할테니,

-> 1바이트 전송에 Z80 19클럭이 필요합니다. (MSX2+, turboR 기준)


SCREEN 2 풀스크린 256 x 192 화면에서 전송량

패턴테이블 = 6144 bytes

컬러테이블 = 6144 bytes

팔레트 = 30 bytes

-> 총 12318 bytes


초당 처리가능한 bytes 수를 계산해보면....

3579545clk / 19clk / 12318 = 15.29 frame/s

-> 초당 15프레임이 가능하다는 결론이 나옵니다.


15프레임은 디스플레이 60프레임 / 4로 나눠지니까, 페이지 플립을 해도 문제없으니 딱 좋네요 ㅎ.ㅎ



본체의 Z80에서 비디오 1프레임을 VRAM에 전송 후 CPU IDLE 타임을 표시해보면 아래처럼 나타납니다.

화면 아래쪽에서 스캔라인 테두리(BD) 영역이 녹색으로 보이는 부분이 CPU IDLE입니다.




SLT-Turbo쪽에서는 MMC/SD V4에서 MV2 데이터를 읽은 후 공유 버퍼에 저장합니다.

오디오는 직접 출력을 하는데요. 기존 MV 11kHz PCM에서 MV2 128kbps MP3로 바뀌었습니다.

I/O는 WAU 전용이니까, WAU가 없으면 무음으로 출력됩니다 ㅎ.ㅎ


설명이 길었네요. 그럼, 실제 동작 모습을 보시죠!




[결론]


예전 SLT-Turbo V1을 만들고 나서, 활용할 방법을 생각하느라 시간이 좀 걸렸습니다.

사실 SLT-Turbo V2도 애매한 포지션이라서 접었었구요.

결국 이 듀얼 CPU 활용 때문에 SLT-Turbo V2.1으로 진행이 되었습니다~ ㅎ.ㅎ/


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


2025년 10월 8일 수요일

SLT-Turbo 제작 #16 - Z80 확장명령

1) Z280 호환 명령


turboR 호환기를 만들기 위해서는 R800에 추가된 곱셈 명령도 구현이 필요합니다.

SLT-Turbo V1에서는 Z280을 활용했지만, 이번에는 그냥 CPLD의 도움으로 처리했어요.


Z80 명령어 ED C0 ~ ED FF, 총 64개 명령어 공간을 사용합니다.

오리지널 Z80에서 이 명령어를 쓰면 그냥 무시됩니다. NOP 명령을 2개 쓴 효과랑 같아요.


참고로, Z280의 경우는 이 영역 대부분이 확장 명령어로 들어 있습니다.

8bit 곱셈/나눗셈, 16bit 곱셈/나눗셈, signed/unsigned 다 있죠.


R800은 unsigned 8bit, 16bit 곱셈 명령어 중에서 극히 일부인 6개만 들어가는데요,

SLT-Turbo에서는 unsigned 곱셈 명령어 10개를 넣었습니다.


ED C1 ; MULUB  A,  B -> HL ; Z280/R800

ED C3 ; MULUW HL, BC -> DE:HL ; Z280/R800

ED C9 ; MULUB  A,  C -> HL ; Z280/R800

ED D1 ; MULUB  A,  D -> HL ; Z280/R800

ED D3 ; MULUW HL, DE -> DE:HL ; Z280

ED D9 ; MULUB  A,  E -> HL ; Z280/R800

ED E1 ; MULUB  A,  H -> HL ; Z280

ED E3 ; MULUW HL, HL -> DE:HL ; Z280

ED E9 ; MULUB  A,  L -> HL ; Z280

ED F3 ; MULUW HL, SP -> DE:HL ; Z280/R800


한가지 주의할 부분은 이 곱셈 명령어들의 결과 flag 처리는 넣지 않습니다요.

(사실 곱셈결과에 의미있는 flag가 없...ㅋ)

간단한 테스트 프로그램으로 곱셈 결과가 맞는지 확인해보아요~



그나저나, turboR이 나온지 거의 35년이 됐는데, R800 곱셈을 쓰는 상용프로그램이 없다는 게 참 신기하죠?

제가 만든 ASO remake가 유일한 R800 테스트 프로그램이라고 볼 수 있겠는데요.

지난번 동작하는 영상을 보셨을테니 ASO는 넘어갑니다~ ㅎ.ㅎ



2) X-II BIOS 확장


X-II의 BIOS는 롬영역을 다 쓰고 있어서, 추가 코드를 넣을 공간이 없습니다.

심지어 BIOS 엔트리까지 다 잡아먹고 있죠. (역시 내일이 없는 회사ㅋ)


CHGGPU(0180H), GETCPU(0183H) 루틴을 명령어 하나로 대체하도록 해봤습니다.

ED FE ; CHGCPU

ED FF ; GETCPU


원래 BIOS 엔트리는 JP NN 코드(3바이트)를 넣게 되어있는데,

확장 명령어가 2바이트니까 RET 명령까지 다 넣으면 딱 3바이트로 끝나게 됩니다.

아래처럼 되겠네요 ㅎ.ㅎ



음... 사실 굳이 이렇게 만들 필요는 없는데요.

예전 paraMSX-R과 MMC/SD V4에서는 BIOS롬을 뱅킹으로 처리해서 코드를 확장하긴 했었죠 ㅎ.ㅎ



3) 고속 LDIR


Z80에서는 LDIR, OTIR의 비중이 큰데요.

OTIR, OUTI 등의 경우는 주변장치의 속도(VDP 등)때문에 고속으로 최적화할 여지가 별로 없겠구요.

LDIR은 LDI x N개로 풀어(unroll)쓰는 걸 많이 사용합니다.

메모리 여유가 있다면 루프 명령을 쓰는 것 보다는 많이 빠르니까요.


물론 기존 디스크롬들은 이미 다 적용이 되어있죠.

지금 해보려는 건... 고속모드에서 더 빠르게 돌리기 위해 메인램에서 코드를 구동하는 것입니다.


요약하면, '외부 슬롯의 코드에서 LDI x N 풀어쓰기가 필요할 때 메인램에서 구동'입니다.


일단 2개의 명령어를 만들어봤어요.

ED CF ; LDIR

ED DF ; LDIR256


ED CF는 기존 LDIR과 똑같은 기능이지만 속도만 더 빠른 버전이구요.

실제로는 RAM에서 LDI x 32개로 풀어진 명령어로 최적화가 됩니다.


ED DF는 LDIR 수행 시 반복(루프)를 256 배수일 때 쓰면 더 빠른 버전입니다.

실제로는 RAM에서 LDI x 256개가 루프를 돌게 됩니다요.

보통 디스크에서 섹터를 읽게 되면 1섹터 512바이트씩 전송을 하니까 이 경우 꽤 쓸모가 있어요.


turboR에서는 MMC/SD V4로 DOSSCAN을 돌려보면 520~540KB/s 정도가 나오는데요.

SLT-Turbo + V4에서 구동하면 470KB/s 정도가 나옵니다.

이걸 LDIR 최적화 명령어를 이용하면 560KB/s 수준으로 빨라지게 됩니다.

아래 사진 참고하세요.




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


2025년 10월 3일 금요일

SLT-Turbo 제작 #15 - MIDI

GT의 미디 인터페이스를 구현하려면, UART Tx/Rx 및 i8253 타이머가 필요합니만...

SLT-Turbo에서는 출력용 필수기능만 넣어봅니다ㅋ


MIDI OUT (Tx) -> 포함

MIDI IN (Rx)  -> 제외

i8253 Counter 0 -> UART baudrate 고정

i8253 Counter 1 -> 제외

i8253 Counter 2 -> 포함

... 요렇게 되겠습니다.


문득 25년 전의 추억이 떠오르네요.

paraMSX에 turboR GT 에뮬을 넣을 때, 미디 H/W 정보가 없어서 걍 포기하고,

타이머를 안쓰는 WSX의 MusicROM을 넣어서 돌리고 그랬죠. 짭ST 느낌? ㅎ.ㅎ


암튼 SLT-Turbo에는 MIDI OUT 커넥터만 하나만 들어있으니, 좋아하시는 미디 모듈을 붙여주시면 되겠네요.

저는 SC-88VL과 mt32-pi를 연결해서 쓰고 있습니다.


미디는 더 설명이 필요없네요. 아래 영상으로 구경하세요~

MIDRY 플레이, 문라이트사가 오프닝은 SC-88VL의 사운드이구요,

뒤의 환영도시 오프닝은 mt32-pi의 사운드입니다. (mt32-pi가 좀 버벅거려서 음이 가끔 튀니까 참고하시고...)





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


2025년 9월 28일 일요일

SLT-Turbo 제작 #14 - 외부 슬롯 (SLT-X)


먼저 지난 글에서 알려드린 X-II 모드에서, 바뀐 부분을 알려드립니다.


X-II 모드에서는 메인램이 SLOT 0-2에 배치되어있고,

고속모드는 ROM모드까지만 지원되는 것으로 설정했었는데요.

아무래도 기존 turboR용 S/W를 사용할 때 CPU 모드 전환이 불편할 것 같아서,

그냥 GT모드와 동일하도록 메인램을 SLOT 3-0으로 옮겼습니다.

Shadow RAM도 GT모드와 비슷하게 정리했습니다.

결국 고속모드 ROM/RAM 모두 가능합니다.


메인 BIOS에는 2+/turboR 호환용 엔트리 4개를 추가했습니다.

#017A RDRES,  #017D WRRES

#0180 CHGCPU, #0183 GETCPU

VDP와 관련된 루틴(스크린10,11,12 및 수평 스크롤)을 제외하면 turboR처럼 사용가능합니다.


X-II모드에 내장된 디스크롬도 GT모드와 동일한 DOS2 v2.31 롬이 들어있어서,

부팅 환경에 따라 자동으로 고속모드/일반모드로 전환됩니다.

COMMAND2 2.44의 CPU 명령도 그대로 쓸 수 있습니다.

아무래도 별도의 유틸을 쓰는 것 보다는 turboR 호환모드로 두는 방식이 쓰기 편할 것 같습니다.

표준에서는 좀 벗어나지만, 대충 넘어가는 걸로...ㅋ


그럼, 외부 슬롯 이야기로 갑니다요~


SLT-Turbo의 외부 커넥터에는 SLT-X V2를 연결합니다.

8개의 서브슬롯이 SLOT 1-x, SLOT 2-x로 동작합니다.

SLT-X가 연결된 상태에서는 파란색 LED가 켜지는 것으로 확인가능합니다.

바이패스 커넥터에 연결하면 LED가 켜지지 않으니 참고하시구요.




위의 사진에서는 데모를 위해 WSX의 상단 슬롯에 꽂아놨지만,

실사용할 때는 대부분 후면 슬롯에서 사용하실 거라고 봅니다. 미디 케이블도 연결하구요.

이 상태에서 상단 슬롯에 PAC-V만 추가하면 해피 엔딩이 되겠죠 ㅎ.ㅎ


외부 슬롯의 CLOCK핀은 3.58MHz 출력으로 기존 turboR과 똑같습니다.

신호를 제대로 구현하려면 3.58MHz phase에 맞춰서 내부 클럭 폭을 늘려야겠지만,

일단 단순하게 wait로 때우는 식으로 만들어봅니다.

일부 타이밍에 민감한 기기 외에는 대충(ㅋ) 동작하겠습니다.


저의 기기들을 동작시키는 모습과 turboR 전용 프로그램을 실행하는 모습을 영상으로 담았습니다.

본체는 MSX2+ 기종(A1WSX)을 사용했구요. 영상 전반은 GT모드, 후반은 X-II모드로 돌렸습니다.

현재 보드는 SLT-X 연결시 고속클럭에서 문제가 있어서, Z80 클럭을 15MHz로 낮춘 상태입니다.

실제 turboR보다 약간 느린편이니, 영상을 보실 때 참고하셔요.





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


2025년 9월 21일 일요일

SLT-Turbo 제작 #13 - 내부 슬롯

고속 모드를 제대로 활용하려면, turboR처럼 동작해야 되겠죠? ㅎ.ㅎ



@ GT 모드


A1GT와 유사한 구조로 되어있구요. 내부 슬롯은 아래처럼 배치됩니다.


SLOT 0-0 = MainROM     (Page 0,1)

SLOT 0-1 = BASIC'N 2.1 (Page 1) + reserved (Page 2)

SLOT 0-2 = MusicROM GT (Page 1) + SLT-OPT  (Page 2)

SLOT 0-3 = CPU helper  (Page 0) + MSX LOGO (Page 1)


SLOT 3-0 = RAM 4096KB

SLOT 3-1 = SubROM      (Page 0) + KanjDRV  (Page 1,2)

SLOT 3-2 = DOS2 v2.31  (Page 1)

SLOT 3-3 = FontPack V2 (Page 1,2)


기존 turboR과 차이라면... BASIC'N, FontPack V2 내장 정도겠네요.

여기서 FontPack V2는 BIOS뿐만 아니라 한글폰트도 포함됩니다.

특별한 이유가 없다면 외부슬롯에 FontPack을 꽂을 필요가 없습니다.

내장 I/O로 빠르게 구동하는 쪽이 더 좋으니까요~ ㅎ.ㅎ/

(물론 내장 FontPack을 끄고 외장을 쓸 수 있습니다.)



@ X-II 모드


고속모드도 없는 MSX2 기종이지만, 옛날 국산 프로그램들을 실행하는 용도로 쓰려구요.

내부 슬롯은 아래처럼 배치됩니다.


SLOT 0-0 = MainROM      (Page 0,1)

SLOT 0-1 = Hangul/Hanja (Page 1,2)

SLOT 0-2 = RAM 4096KB

SLOT 0-3 = SubROM       (Page 0) + HangulROM (Page 1)


SLOT 3-0 = MusicROM     (Page 1) + SLT-OPT   (Page 2)

SLOT 3-1 = BASIC'N 2.1  (Page 1) + reserved  (Page 2)

SLOT 3-2 = DOS2 v2.31   (Page 1)

SLOT 3-3 = None


X-II에서 숨긴(?) 저작권 및 버전 표시는 다시 켜놨습니다.

내장된 완성형 한글폰트는 명조체가 아니라 '둥근모' 폰트입니다.


SLOT 3-3의 FontPack은 기본적으로 OFF됩니다.

대우의 SCREEN9 출력루틴과 조금 간섭이 되더라구요.

BIOS의 한글 입력기와 ANSI 스크린만 제외되는 것이라서,

일반 프로그램에서 한글 폰트 I/O는 그대로 활용가능합니다. (예: M 파일매니저)

물론 FontPack BIOS를 켜는 것도 가능합니다.


CPU 모드 설정을 위해 별도의 BASIC CALL CPUn 명령을 추가했습니다.

CALL CPU0, CALL CPU1, CALL CPU2 이렇게요.

숫자만 봐도 뭔지 아시겠죠? 노말모드, 고속모드(ROM), 고속모드(RAM)입니다.

(참고로 이 명령은 GT 모드에서도 똑같이 사용가능합니다.)



@ BIOS shadow RAM


고속모드에서는 BIOS를 RAM에 복사해서 wait 없이 빠르게 구동할 수 있습니다.

turboR의 shadow RAM과 같은 방식으로 동작합니다.

기존 turboR은 shadow RAM에 64KB를 할당하지만, SLT-Turbo에서는 256KB를 할당합니다.

내장 BIOS 대부분이 shadow RAM으로 전환된다고 생각하시면 맞습니다.


그 외 추가 256KB의 shadow RAM이 예약되어있습니다.

FontPack에서 128KB를 사용하는데요.

FontPack을 끄고 Kanji(또는 X-II 한글) 폰트를 shadow RAM으로 변경할 수도 있습니다.

MMC/SD V4의 Kanji RAM 기능과 동일합니다. 사용자가 원하는 폰트롬으로 로딩가능합니다.


전체 4096KB의 램에서 512KB가 shadow RAM으로 할당됩니다.

따라서 가용 메모리는 3584KB가 되겠습니다.



그럼, 실제로 동작하는 모습을 영상으로 보시죠!

GT 모드에서 FontPack 사용 및 X-II 모드에서 SCREEN 9를 사용하는 모습입니다.





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


2025년 9월 15일 월요일

SLT-Turbo 제작 #12 - Z80 30MHz, OPLL wait

1) Z80 30MHz


지난번에 28.63MHz로 구동했었는데요. 클럭을 더 올려서 테스트를 해봤습니다.


일단 최대치라 생각되는 33MHz까지 올려보니, 아래처럼 속도가 나옵니다.




이 상태로 게임을 돌려봤는데, 시간이 5분쯤 흐르니 SLT-Turbo가 멈추거나 리부팅되는 등 난리네요 ㅎ.ㅎㅋ


조금 낮춰서 30MHz로 테스트해봅니다.

M1 wait를 끈 상태에서 루프 카운트가 딱 100으로 나오네요ㅋ




GT와 X-II에서 테스트를 해보니, 1시간 넘게 게임을 돌려도 괜찮았습니다.


근데 지난번 보다 왜 클럭을 더 올려서 테스트했냐구요?


아무래도 20MHz로 구동하면 turboR 실기와 비슷한 성능이 나오잖아요?

20MHz랑 30MHz 두개의 모드를 넣으면 좀 더 유용하지 않을까? 그런 생각이 들더라구요.


기본 고속모드는 그냥 30MHz로 사용하구요.

기존 turboR 전용 프로그램을 구동 시, 타이밍 문제가 생기는 경우에 20MHz로 낮추면 좋겠죠!

.

.

.

사실은 60MHz 오실레이터 하나로 2분주된 30MHz, 3분주된 20MHz, MIDI용 31250Hz를 쉽게 만들 수 있거든요.

현재 보드에는 오실레이터 2개 박혀있는데, 하나 제거하면 CPLD 여유핀이 1개 생기게 되어서...읍읍...ㅎ



2) OPLL wait


OPLL을 써서 프로그래밍 해보신 분은 아시겠지만, 이 칩이 액세스 사이클이 좀 느립니다.

turboR에서는 VDP I/O에는 auto wait가 구현되어있지만, OPLL쪽은 이 기능이 없어요.

그래서 Z80, R800 공용으로 코드를 만들게 되면 라이브러리 사이즈도 커지고... 그런 단점들이 있습니다.


아마 turboR 나오기 전에 발매된 게임들을 강제 고속모드로 돌려보신 추억이 있으시죠?ㅋㅋ

Z80 3.58MHz에 맞춰 제작된 게임들은 죄다 OPLL 소리가 먹통되거나 요상한 소리가 나오게 됩니다.

이 때문에 고속모드 패치 중에는 OPLL 코드도 함께 패치가 들어있는 경우도 있고 그랬습니다요.


암튼, SLT-Turbo에서는 OPLL를 액세스 할 때 자동으로 wait가 처리되도록 했습니다.

CPU 속도 3.58MHz, 20MHz, 30MHz 상관없이 코드가 잘 돌아가도록이요~ ㅎ.ㅎ



그럼, 실제 동작 모습도 구경하셔요!

- 30MHz 모드로 부팅 후 BASIC 루프 테스트 

- FMPAC 데모 프로그램에서 OPLL 동작 확인

- 프레임 싱크가 메롱인 게임 테스트(트윈비)





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


2025년 9월 9일 화요일

SLT-Turbo 제작 #11 - Z80 28.63MHz

칩 번호가 Z84C0020 으로 시작하는 Z80은 최대 20MHz로 동작합니다. 

이 상태에서 turboR과 비슷한 성능이 나온다는 걸 보셨을텐데요.

기억 안나시면 V1 제작글을 찾아보세요~ ㅎ.ㅎ


구글링 해보니, '이 칩들을 33MHz로 오버클럭을 해도 잘 동작함'이라는 내용의 블로그가 나오더라구요.

그래서, 이번 SLT-Turbo v2.1에서는 3.58MHz x 8 = 28.63MHz로 한번 돌려보기로 합니다!


28.63MHz 클럭은 주기가 약 35ns인데요.

보드에 10ns 타입의 SRAM을 넣어놨기 때문에 대충 돌려도 타이밍 문제가 없도록 해놨습니다.


간단한 VDP 테스트 코드를 한시간 정도 돌려보니 괜찮은 듯 하군요.



BASIC으로 루프 테스트를 해보면, 아래처럼 나옵니다.


제 실기 turboR(R800 DRAM mode)에서는 TIME 카운트가 174로 나오니 참고하셔요.



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


2025년 9월 7일 일요일

SLT-Turbo 제작 #10 - 보드 v2.1로 변경

2020년에 SLT-Turbo V1가 나온 후 5년이 지났습니다. 시간 참 빨리 가네요...


아시다시피 2021년에 진행했던 SLT-Turbo V2 프로젝트는 컨셉이 애매해서 중단이 되었는데요.

그동안 확장슬롯 부분을 SLT-X V2로 만들었구요.

오디오 부분도 작년에 나온 WAU를 많이 쓰시는 걸로 알고 있습니다. 맞나요?ㅋ


이제 주변 환경이 좀 정리(?)되었으니, SLT-Turbo v2.1로 가보아요~~ ㅎ.ㅎ/


아래는 SLT-Turbo v2.1 보드의 모습입니다.




SLT-Turbo v2.1의 기능들을 정리해봤습니다.


1. 외부 슬롯


기존 v2는 6개의 슬롯 커넥터가 있었죠.

기본슬롯(SLOT 1) + 확장슬롯(SLOT 2-x) + 고속BUS 슬롯(I/O 전용)


v2.1에서는 외부 슬롯이 없는 대신 SLT-X V2를 연결해서 사용합니다.

참고로, Bypass용 커넥터도 들어있는데요.

여기에 연결하면 SLT-Turbo 기능은 OFF되고, SLT-X V2만 동작하게됩니다.



물론 기존 v2에 있던 고속 BUS용 IO 슬롯은 제외입니다.

고속으로 동작하는 기능들은 SLT-Turbo 내장 기능들만 가능하다고 보시면 되겠습니다.


2. R800 곱셈 등의 추가된 CPU 명령어


기존 v2와 동일합니다. 추가 명령어는 CPLD 로직으로 구현되며, CPU는 Z80 한개만 사용합니다.

R800 곱셈 외의 다른 명령어를 추가할지는 아직 미정입니다.



3. 내장램


기존 v2와 동일한 SRAM 4MB를 사용합니다.

BIOS, Kanji Shadow로 예약되는 영역이 있어서, DOS2에서 사용자가 쓸 수 있는 램은 약 3MB입니다.



4. 고속 모드용 내장 기기


4.1 디스크 드라이브


v2의 SD 드라이브는 제외되었습니다.

물론 빠르게 동작하는 디스크가 있으면 좋습니다만...

아무래도 실기 MSX를 쓴다는 컨셉(?)에서는 본체 내장된 FDD를 활용하는 것이 맞다고 생각되네요.


paraMSX-R의 V-Disk 에뮬과 동일한 방식으로 구현됩니다.

예를 들어 X-II에서 SLT-Turbo v2.1를 구동하면,

SLT-Turbo의 디스크(SLOT 3-2)를 액세스 시 X-II 본체의 FDD(SLOT 2)가 동작하는 식이죠.


4.2 비디오


사실 요놈 때문에 오랫동안 고민했었는데요.

추가된 비디오 기능을 활용할 수 있는 시나리오를 결국 못 찾았습니다 ㅠ.ㅠ


결론: 비디오 기능은 제거


4.3 오디오


v2에서 VS10x3, I2S DAC 정도를 고려했었는데요.

이젠 WAU가 있어서, 딱히 MP3, PCM 오디오를 추가 할 필요는 없어졌습니다.


결론: 오디오 기능은 제거



5. DMA 컨트롤러


기존 v2와 동일합니다.

약간의 차이라면...

v2는 슬롯 신호(/SLTSL)가 내장이라서, 외부 슬롯의 Memmory mapped I/O 사용 시 편리한데,

v2.1은 외부의 SLT-X를 컨트롤을 해야되니, 약간의 추가 클럭을 소진하게 됩니다.

아마 실제 활용은 I/O mapped 기기들이 될 확률이 높겠죠.



6. turboR 호환 기능들


기존 v2의 H/W Timer, 8BIT PCM 출력, MIDI 출력은 동일하게 들어갑니다.

단, MIDI OUT 포트는 2개에서 1개로 줄었습니다.


Z80 DRAM, R800 DRAM 모드는 BIOS Shadow포함 turboR 그대로 호환입니다.

Kanji Font는 Shadow(RAM)로 구현되어서, 런타임으로 폰트를 바꾸는 것도 가능합니다.


SLOT 3-3의 매퍼(일명 Panasonic mapper 8K)는 지원되지 않습니다.



마지막으로 보드 납땜 확인하느라 찍은 사진을 올려봅니다요.


MSX1 JP BIOS를 로딩해서 BASIC 루프 테스트를 한 모습입니다.



Z80 3.58MHz에서 M1 wait 클럭을 제거 및 Z80 7.16MHz로 구동한 경우의 모습입니다.



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


2021년 6월 17일 목요일

SLT-Turbo 제작 #9 - V2의 바뀐 모습

V2의 방향은 어디로 가는게 좋을까? 그동안 고민을 많이 했습니다요~ ㅎ.ㅎ

대충 요약을 해보면요...


1. Z280의 확장 명령어를 포기


R800은 Z80에서 추가된 명령어가 곱셈 두개뿐이지만, Z280은 많은 명령어가 추가되어있습니다.

곱셈, 나눗셈 명령어를 활용하면 각종 계산 루틴을 빠르게 구동할 수가 있어요.


R800을 보면 아시겠지만, 2개 추가된 곱셈조차 사용하는 프로그램이 거의 없습니다.

S/W 개발자 입장에서 보면 소수 터보알 유저를 위한 프로그램 보다는,

 일반 MSX2 수준에서 쓸 수 있어야 많은 유저가 활용할거라는게 명백하니까요.

참고로 기존 터보알 전용 프로그램에서도 거의 사용하지 않습니다. 상용 프로그램은 아예 없죠.


제가 만든 M 파일 매니저, ASO 리메이크 등에서는 R800 명령어를 쓰지만,

돌아오는 피드백은 보통 이렇죠.

> 일반 MSX2 용으로 만들어 주세요. MSX1에서도 되면 더 좋겠구요.

> V9938이면 충분해 보이는데 왜 터보알 전용인가요? 님은 알레스트 안해보셨나요?


뭐 그렇습니다요 -_-


근데 Z280의 경우는 상황이 더 안좋은게, 이쪽은 개발자가 저 하나뿐이라는게 문제라서ㅋ

결국 Z280 칩을 제거하고 R800 곱셈명령만 로직으로 구현해서, 터보알 호환성을 유지하도록 합니다.



2. 고속 BUS를 지원하려면?


이것 때문에 고민을 많이 했는데요.

SLT-Turbo V1은 A1GT 수준으로 업그레이드 해주는 것 뿐이라서,

외부 슬롯은 3.58MHz BUS를 그대로 유지합니다. 터보알과 똑같죠~ ㅎ.ㅎ

이 방법은 H/W 호환성을 유지하는데엔 좋지만, 빨라진 시스템을 활용하는게 쉽지 않습니다.

쉽게 말하면 내장 메모리와 내장 기기를 활용하는 경우만 고속으로 동작하니까요.


결국 외장 기기를 만들 때, 처음부터 터보알을 고려해서 설계해야하는데 그게 애매하거든요.

특히 비디오 카드처럼 외부에서 단독으로 동작하는 경우는 완전 치명적이구요.


사실 제가 아는 것 중에는... 터보알에 최적화된 기기는 MMC/SD V3와 V4밖에 없네요.

V2는 A1WX 반터보(5.37MHz)나 1chipMSX의 터보(8.06MHz)에서 더 빠르게 동작합니다만,

V3, V4는 터보알의 고속모드(외부 3.58MHz)에서 훨씬 더 빠릅니다.


그렇다면 20MHz 고속 BUS를 쓸 수 있는 슬롯을 따로 할당하면 어떨까요?

가장 쉬운 방법은 외부 기본 슬롯인 SLOT 1 또는 2 전체를 고속으로 만드는건데요.

MSX의 슬롯이 16니까 외부 기본슬롯(서브4개) 하나를 할당해도 괜찮지 않을까 생각되시죠?


근데 카트리지 호환성 때문에 SLOT 1은 기본슬롯 하나로 완전히 빼놔야 하는데요.

그럼 남는게 SLOT 2 하나뿐이에요.

SLOT 0, 3은 대부분 BIOS랑 내장 S/W가 점유하고 있으니 서브슬롯 두개정도 남으려나요?

그러면 SLOT 2를 고속으로 해버리면, 외장형 주변기기들을 꽂을 슬롯이 별로 없게됩니다.

제 경우 최소 T-Wave, FontPack, MPX, MoonSound는 항상 꽂혀있어야 해서, SLOT 2는 항상 만차에요ㅋ


고속의 외부 슬롯은 할당하는건 무리라고 판단됩니다.

결국 내부만 고속으로 돌리는걸로 합의했어요. (저 혼자  합의ㅋ)


GT를 20년 가까이 썼는데, 외부 슬롯은 기존을 유지해야된다는게 MSX의 숙명...ㅎ



3. 고속 모드를 활용하는 내장 기기들


그럼 내장 기기를 추가할 때 고속모드를 잘 활용할 수 있는건 어떤 것들이 있을까요?

가장 먼저 떠오르는게 디스크, 비디오, 오디오겠죠? ㅎ.ㅎ


3.1 디스크 드라이브


SLT-Turbo V1에서는 터보알과 비슷한 DOS2 호환 커널이 SLOT 3-2에 탑재됩니다.

대신 FDD는 호스트 본체의 디스크롬을 경유하도록 되어있어요.

잘 이해가 안되신다면, paraMSX-R의 V-Disk 기능(호스트 디스크 매핑)을 떠올려보심 되겠습니다.

그거랑 똑같아요! ㅎ.ㅎ


물론 이 상태는 고속모드랑 전혀 관계가 없습니다.

아마 그냥 활용하는 것도 MMC/SD 같은 외부 디스크 장치에 의존하게 될거에요.

그래서 SLT-Turbo V2에서는 본체 FDD 대신, SLT-Turbo에 내장된 SD카드를 기본으로 사용합니다.

참고로, 요놈의 이름은 SLT-Drive입니다요.


3.2 비디오


요놈땜에 설계하는데 시간이 많이 걸렸어요. 이랬다가 저랬다가 왔다갔다~ㅋ

SLT-Turbo가 MSX 본체에 꽂는 주변기기처럼 생겼지만...ㅋ

사실은 이놈이 메인 기기이고, 호스트 본체를 외장 주변기기처럼 사용하는데요.

호스트에서 가장 중요한 부분은 비디오(VDP 관련)와 키보드, PSG입니다.


그럼, SLT-Turbo에서 지원하는 비디오 기능은 뭘까요?

MSX의 기본화면을 생성하는 것은 본체의 VDP(V9938/9958) 그대로입니다.

SLT-Turbo에 추가된 비디오는 기존 본체의 화면에 새로운 비디오를 오버레이 해주는 방식입니다.

그러니까 본체의 RGB 입력을 받아서 SLT-Turbo의 비디오(가칭 SLT-Video)를 위에 올려서 함께 출력하는거죠.


컬러 포맷은 RGB555이구요. 팔레트는 8BPP입니다.

팔레트 모드에서는 기존 스크린8 모드 호환도 가능하고, V9990의 15BIT 비트맵과 같은 화면도 가능하겠죠.

인터레이스 모드는 필드 메모리 분할이 아닌 선형으로 주소가 매핑되구요.

여러개의 페이지(Max. 4개)를 오버레이 하거나 스크롤, 화면 분할 등이 H/W로 지원됩니다.

팔레트 셋도 거의 무제한으로 설정가능하구요.


자세한 내용은 나중에 SLT-Video 편에서 따로 설명드리겠지만,

일단 메인램을 할당해서 사용함...정도만 기억하셔요. ioremap과 비슷합니다.


참고로, SCART 출력의 화면비율 설정도 가능합니다.

4:3, 16:9 설정을 바꿀 수 있어서 걸그룹 뮤비를 만들 때 레터박스를 쓰거나 화면을 자르는 작업을 하지않아도 됩니다.

아마 일제 모니터를 쓰시는 분은 지원안될겁니다요.


3.3 오디오


제가 지난 십여년간 준소프트님의 MPX를 워낙 잘 썼기 때문에, 그냥 VS10x3 칩을 박아버릴까 생각도 해봤는데요.

이넘은 파서, 디코더와 렌더러가 합체된 구조라서 내장기기로 쓰기는 애매한 듯 해서...

그냥 오디오 DAC만 추가하기로 합니다.

쉽게 구할 수 있는 PCM5102 모듈을 붙이는 방법을 썼어요.

혹시나 모듈이 단종되면 회로를 그려야하는 불상사가... 하지만 일단 납땜 노가다를 줄이는 방향으로~ ㅎ.ㅎ

자세한 기능은 오디오 편에서 따로 얘기하겠습니다요. (가칭: SLT-Audio)


현재까지는 8핀 DIN 단자의 RGB + 오디오는 그대로 두고

SLT-Turbo의 서브슬롯 쪽의 오디오와 SLT-Audio만 믹스해서 3.5파이 단자로 출력합니다.

이렇게 하는게 본체의 오디오와 SLT-Turbo쪽의 오디오 밸런스 맞추기가 쉬울 것 같아요.

물론 외부 믹서가 있어야겠지만요~ ㅎ.ㅎ



4. DMA 컨트롤러


MSX1,2는 워낙 싸구려 홈컴퓨터 사양이라 그런지, DMA는 사양에 없는데요.

터보알에도 없어요 ㅎ.ㅎ


SLT-Turbo V2에서는 CPU 부담을 덜어주기 위해 간단하게 DMAC가 들어갑니다.

비디오, 오디오 처리 시 유용하게 쓸 수 있겠구요.

T-Wave의 DCSG 포트나 스테레오 DAC 포트, Covox 포트도 쓸 수 있겠습니다.

(물론 저혼자 쓰게 될 확률이 높...ㅋ)



5. I/O 메모리 리맵


SLT-Turbo에 내장된 메모리는 4096KB입니다.

단일 메모리 매퍼로 지원가능한 최대사이즈입니다.

내장 기기로 추가된 비디오, 오디오 기기는 별도의 로컬 메모리가 탑재되지 않고,

메인 메모리를 할당 받아서 사용하게 됩니다.


메모리 관리자를 따로 만들면 좋겠지만, 기존 메모리매퍼 확장 BIOS도 안쓰는 개발자가 수두룩한걸 볼 때...

뭔가 더 만들게 되면 관심에서 멀어지는 효과만 늘어나겠죠?ㅋ


비디오, 오디오에서 필요한만큼 할당해서 매핑가능합니다.

예를 들어 V9938의 경우는 스크린8의 페이지가 2개(64KB x 2개)뿐이지만,

SLT-Video는 4MB 내에서 충분히(?) 많이 만들 수 있어요.



나름 요약해본건데... 글씨만 많군요 ㅎ.ㅎ

마지막으로 사진 한장 올리고 물러갑니다요~




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


2021년 4월 23일 금요일

SLT-Turbo 제작 #8 - 정리하고 다음 단계로...

한동안 잠잠하던 SLT-Turbo 이야기가 이어집니다.


기본적인 구조는 작년말에 완성되었구요.

남은 것들은 Z280 추가 명령어 활용과 MIDI OUT 인터페이스, DMA 처리 등이 되겠습니다.

.

.

.

근데 Z280 활용과 데모용 프로그램 제작 중, 현타가 좀 오네요! ㅎ.ㅎ;


이미 알려드린 것처럼,

SLT-Turbo의 목표는 "외장 CPU와 본체의 CPU 조합으로 turboR 비슷한 환경을 구현" 입니다.


I/O 프로세서, 고속 Z80, Z280 코프로세서 모드까지 해놓고 보니... 더 이상 재미가 없네요!

아마 제가 20년 가까이 GT를 쓰는 중이라 그렇겠죠?ㅋ


그리고,

추가된 Z280 명령어로 재밌는 S/W가 나오면 좋겠지만...

저 혼자 S/W를 다 만들어야하는 상황이라서, 뭔가 많이 기대하는건 좀 힘들구요.

몇개 남지 않은 Z280 칩을 이런 용도로 써버리는게 좀 아깝기도 하고 그렇습니다.



그.래.서.


SLT-Turbo V1은 이쯤에서 정리하고, V2로 넘어갑니다~ ㅎ.ㅎ

좀 더 재밌는 환경이 되도록 설계가 조금 바뀔 예정입니다.



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


2020년 12월 26일 토요일

SLT-Turbo 제작 #7 - 코프로세서 모드

[서론]


처음 SLT-Turbo 설계할 때는 기존 turboR과 같은 CPU전환 방식이었습니다.

Z80 10MHz과 Z280 12.5MHz을 넣었었죠.

당연히 Z280 12.5MHz가 R800의 역할을 합니다.


turboR 고속모드에서 프로그램을 돌려보면 대략 Z80 노말모드에 비해 5배정도의 속도가 나오는데요.

만약 Z280 성능이 Z80의 1.5배 정도만 나와준다면, R800이랑 비슷한 속도가 나오지않을까...

대충 그렇게 생각했던거죠~ ㅎ.ㅎ

12.5MHz x 1.5배 성능이라면 Z80 18.75MHz 정도와 동급일테니까요.

그럼 18.75MHz / 3.58MHz = 5.24 이런 계산이면, Z80 노말모드의 5배 성능으로 추측해볼 수 있습니다.

이 때부터 희망회로가 불타기 시작ㅋㅋ


외부 OSC는 50MHz 정도를 사용합니다.

Z80은 본체의 3.58MHz와 OSC의 5분주 10MHz 사용하구요.

Z280은 OSC의 2분주 25MHz를 칩에 입력해서, CPU 코어는 절반의 12.5MHz로 돌아가게됩니다.


그리고 Z80은 3.58MHz 대신 10MHz 버전으로 넣은 이유는...

Z280을 메인으로 구동하는 동안 Z80을 서브 CPU로 활용하면 어떨까? 하는 마음이었습니다.


S/W를 만들 때, 주기적으로 동작하는 기능(예: BGM 처리)을 전담하는 서브 CPU가 있으면 좋을 듯 해서요.

메인 CPU가 바라보는 슬롯 맵과 서브 CPU가 보는 슬롯 맵을 다르게 할 수 있으면,

프로그래밍을 다양한 방법으로 할 수 있겠죠? 프로그래밍 재미도 늘어난다면 금상첨화~ㅋ

.

.

.

근데 첫 보드를 제작하고 CPU 성능 테스트를 해보니...ㅋ

Z280의 성능이 동클럭의 Z80에도 밀리는 상황이 나오더라구요. 캐시 OFF에 8비트 호환 BUS ㅠ.ㅠ

고민 끝에 Z80을 20MHz 버전으로 바꾸고, Z280을 서브 CPU로 만드는 방법을 생각하게 됩니다.

결국 turboR 스타일의 두 CPU 전환과는 다른 방식이 된거죠.



[본론]


그럼, SLT-Turbo에서는 CPU를 어떤식으로 써야할까요?


기본적으로 SLT-Turbo는 MSX turboR BIOS의 코드를 100% 그대로 사용가능합니다.

S1990의 시스템 컨트롤 레지스터(E4h ~ E7h)가 그대로 호환되기 때문에,

BIOS 루틴을 쓰지않고 레지스터를 직접 컨트롤해도 동작합니다.


성능을 보면,

일단 SLT-Turbo의 OSC는 60MHz를 사용합니다.

노말모드는 Z80 3.58MHz로 똑같이 구동이 되구요.

고속모드는 Z80 20MHz로 구동(OSC 3분주 클럭)합니다. 성능은 turboR의 R800 DRAM모드와 비슷해 보입니다.

Z280은 20MHz가 칩에 공급되고, CPU 코어는 10MHz로 동작합니다.


고속모드에서 R800의 전용 명령어의 처리만 제외하면, 기본적인 노말/고속모드는 turboR과 거의 같습니다.


R800 전용 명령을 처리하기 위해서는 기존 turboR과 다른 방식의 구현이 필요한데요.

Z280을 코프로세서 구조로 구동하는 방식을 사용합니다.


메인 CPU(Z80 20MHz)가 동작 중 해당 명령을 만나면...

1. Z80의 처리를 멈춤

2. 레지스터 데이터를 Z280으로 전달

3. Z280으로 명령 처리 후 결과값(레지스터)를 Z80으로 전달

4. Z80에서는 다음 명령부터 진행

이렇게 되는 것이죠.



참고로 R800은 곱셈 명령어 두개가 추가되어, 8비트 및 16비트 연산이 가능합니다.





두 명령어는 Z280에도 그대로 지원됩니다. 코드도 똑같이 할당되어있어요.

아래는 Z280에 추가된 2바이트 및 3바이트 명령어 모음입니다.




2바이트 명령어의 ED C0 ~ ED FF 영역이 많이 사용되는 곱셈, 나눗셈, 비교 명령어가 들어있어요.

참고로 이 명령어들은 Z80에서는 없는 명령어라서 그냥 00 00 으로 처리됩니다.

NOP x 2개로 시간만 때우는것이죠.


이 때 SLT-Turbo의 BUS 아비터는,

Z80에서 코드 실행 중 해당 범위의 명령어가 디텍션되면,

CPU 전환과 관련된 일련의 작업들을 처리하게 됩니다.

Z280은 멈춰서 대기하다가 요청이 들어올 때만 동작하게 되구요.


현재는 2바이트 명령어만 구현되어있습니다.

3바이트 명령어는 Z80에서 안전하게 skip 될 수 있을지 확인 후 구현예정입니다.

(귀찮으면 지원안하게 될지도요ㅋ)



아래는 8비트 곱셈, 나눗셈 명령어 두개를 테스트하는 프로그램입니다.

ST나 GT 갖고 계시면 한번 실행해보세요. ㅎ.ㅎ

Download: CPUTEST.ZIP



SLT-Turbo의 고속모드에서 실행하면 아래처럼 결과가 나옵니다.

turboR에서는 곱셈만 성공합니다만, SLT-Turbo의 Z280은 나눗셈도 처리가 됩니다요~ ㅎ.ㅎ






그럼, R800 곱셈 명령을 쓰는 실전(?) 프로그램을 돌려보아요~

제가 만든 ASO 리메이크는 turboR 전용 프로그램인데요.

처음 업로드했던 파일은 Z80 명령만 쓰는 버전입니다. 에뮬에서 쉽게 테스트하기 위함이었구요.

그 후 조이메가 지원을 넣으면서 R800 명령어를 쓰는 버전으로 교체한 파일을 업로드했습니다.


아래 영상에서는 CPUTEST.COM 프로그램을 실행 후 ASO R800 버전을 실행하는 모습이 나옵니다.

호스트 MSX는 MSX2+ 기종인 A1WSX를 사용했습니다.



00:00 Host MSX, Booting

00:32 SLT-Turbo, Booting as turboR mode

00:55 SLT-Turbo, Coprocessor mode

01:13 SLT-Turbo, Instructions executed by Z280

01:31 SLT-Turbo, ASO remake with MULT instruction



[결론]


한줄로 요약하면,

'turboR의 R800 고속모드와 유사한 성능을 제공하는 Z80 + Z280 코프로세서 모드를 구현'

으로 되겠습니다.



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


2020년 12월 20일 일요일

SLT-Turbo 제작 #6 - Z280의 운명은?

[서론]


MSX의 메인 CPU는 Z80 3.58MHz입니다. MSX1,2,2+,turboR 모두 기본은 똑같습니다.


마지막 기종인 turboR은 CPU가 두개가 들어있어서, 동작모드도 두가지로 분리됩니다.

외부 카트리지의 S/W를 구동하는 경우는, Z80 3.58MHz의 노말모드로 동작합니다.

MSX-DOS2 또는 DiskBASIC으로 부팅하면 R800 7.16MHz CPU를 사용하는 고속모드로 동작합니다.


물론 경우에 따라 특수한 동작모드(듀얼 CPU 및 고속 클럭)를 사용하는 기종도 있었고,

사용자가 고클럭으로 CPU를 개조하는 경우도 종종 있었습니다.

유럽에서는 7MHz 터보킷이 유행했던 것 같더군요. 아마 MSX2를 주로 쓰다보니 그런게 아닐까싶기도...


그리고, 본체와는 별개로 동작하는 외부 가속기 형태의 기기도 있었습니다.

저는 써보지 못했지만, Leonardo Padial 씨가 제작한 Z380 보드가 제일 먼저 떠오르네요.


Z80 3.58MHz 사용하는 표준 모드가 아닌 경우는 아래 두가지로 정리됩니다.


1. 메인 CPU의 클럭을 올리거나 고속 CPU로 전환 후 구동

2. 외부 CPU를 사용하여 빠른 S/W를 활용


1번은 메인 CPU의 동작모드가 바뀌는거니, 어느정도 기존 S/W의 호환성을 갖도록 설계가 가능합니다.

목적은 '기존 S/W의 고속화'과 'CPU 파워가 필요한 S/W 제작'이 되겠죠?


2번은 외부 CPU를 활용하는 전용 S/W 제작하려는 의도입니다.

단순 CPU 파워로는 어마어마한 이득을 볼 수 있겠지만...

전용 S/W가 없으면 무용지물이니, 기기가 많이 보급되기가 힘들다는 단점이 있습니다.

.

.

.

그럼, SLT-Turbo는 어느 방향을 보고 있을까요?

개발 초기 때에도 얘기했던 것 같지만... 다시 한번 적어보면요~ㅎ.ㅎ


목표는

- 일반 확장슬롯과 비슷한 형태의 기기처럼 보이도록(쓰이도록) 한다.

- 본체를 turboR과 비슷한 기기로 쓸 수 있도록 해준다.

입니다.


일단 터보 메인보드를 슬롯보드 아래에 숨겼습니다.

멀리서 보면 일반 확장슬롯과 구분이 안됩니다요~ 실제 동작도 확장슬롯과 비슷하죠.


근데 turboR 같은 고속모드를 만들기 위해서는 중요한 걸림돌(!)이 있는데요.

-> Z80/R800과 호환되는 동작 모드(H/W 타이밍 및 I/O 구조)를 갖는 CPU가 필요!!


근데 이게 해결책이 있을까요?

이제 turboR 나온지 30년이 지났는데요. 혹시 turboR 호환기종을 보신적 있으세요? (에뮬 말구요ㅋ)

사실 R800, S1990 칩을 못 구하니까 호환기종을 만들 수가 없습니다.


만약 '이런저런 칩들로 비슷하게 만들면 될 것 같은데, 왜 아무도 안만들었지?'라는 의문이 들면,

'그렇게 만들면 실패하는구나' <- 이게 떠올라야합니다.

좀 단정적으로 쓰긴 했지만, 대부분의 경우는 이게 맞아떨어집니다요~ ㅎ.ㅎ;


암튼 그렇게 30년이 흘렀습니다.

turboR 외에는 제대로 돌아가는 쓸만한 고속 기종은 나오지 못했어요.




[본론]


turboR과 똑같이 만드는건 힘드니, '비슷하게 돌아가는 쓸만한 놈을 만들어보자'에 집중합니다.


사실 오래전부터 생각했던 것은...

Z80 3.58MHz + eZ80 50MHz 듀얼 CPU를 사용하는 보드였습니다.

물론 본체의 CPU는 I/O 프로세서로 사용되구요.


천국동 오프모임에서는 단골메뉴로 나오는게 고속 MSX 제작인데요.

그럼, 기존 R800 S/W 호환이 필요할까?

CPU 성능이 높아지면, 활용하는 S/W가 많이 나올까? 이런 의문이 따라오게 마련입니다.

과연 내가 이걸 만들면 써보고싶은 사람이 과연 있을까? 흐... 애매합니다.


생각에 생각에... 결국 마음속으로만 남겨두다, 작년에 페북에서 Z280에 대한 글을 보게 되었습니다.

이 Z280을 넣은 CPU280이라는 이름의 보드 제작된 내용도 있었구요. (90년초 쯤인 듯 합니다.)


'어.. Z80, Z180, Z380 이렇게 나가는거 아니었던가? Z280은 처음 듣는데?'

이게 오래전 1987년 쯤에 나왔다가 90년대에 단종된 CPU인데요.

ebay에 가보니 중고품이 팔리고 있고~ PDF로 스캔된 매뉴얼도 구할 수 있었습니다요. 이게 뭐야?ㅋ


Z280 매뉴얼을 찾아보니 충격적인 내용이 나오네요.

- Z80 호환 16BIT CPU, 최고 12.5MHz 클럭

- 다수의 추가 명령어 내장 (R800 곱셈 명령도 포함됨)

- DATA BUS는 16BIT 또는 모드 8BIT 모드로 선택가능

- 256바이트의 캐시(I/D) 내장

- 24BIT memory 및 I/O address 사용 (헉!!)

- MMU, Refresh, DMA, CTC, UART 등을 내장


여기 가장 중요한 부분은

8BIT BUS모드로 설정하면 기존 Z80과 유사한 BUS 동작모드가 가능함

주변 회로를 복잡하게 만들지 않아도 기존 MSX의 Z80 버스에 물릴 수 있다는 얘깁니다.


물론 메모리 R/W가 opcode fetch와 별개로 동작하기 때문에 M1 사이클 신호는 없어요.

근데 이건 모든 Z80 후속 CPU의 숙명이니 어쩔 수 없겠습니다요~

(Z180는 M1 호환 모드가 있지만 I/O 문제로 예선 탈락 ㅎ.ㅎ;)


I/O 주소는 메모리와 동일한 24BIT인데, 상위 8BIT BANK + 하위 16BIT 주소로 구성됩니다.

여태 봐왔던 Z80 후속 CPU들은 내장 I/O들이 하위 8BIT 주소를 쓰고 있어서,

MSX I/O 주소와 정면으로 충돌했거든요.

Z280의 내장 주변기기는 FEh, FFh BANK에 할당되어 있습니다.

하위 BANK로 설정하면 내장 I/O와 겹치지않으니, 결국 메인 CPU로 쓸 수 있다는 얘기죠!

(오우~~ 왜 이 CPU를 이제서야 알았을까?)


R800의 곱셈명령(몇개 안되지만ㅋ)과 똑같은 명령이 포함된것도 아주~ 매력적입니다.

아마 R800과 Z280 사이에는 어떤 히스토리가 숨어있겠죠?

자일로그 CPU 중에서 R800 명령이 그대로 호환되는건 Z280뿐입니다.


캐시의 경우는 어차피 MSX의 슬롯, 메모리매퍼 때문에 못 쓰겠네요.

약간의 성능 하락이 예상됩니다.


DRAM Refresh 사이클은 Z80과 다르지만, R800 때에도 비호환이라서 별문제는 없겠습니다.

리프레쉬 얘기가 나왔으니 Z80, R800의 리프레쉬가 어떻게 다른지 한번 보실까요?


예전 paraMSX-R 개발 때, /RFSH 타이밍이 안맞아서 고속모드 지원은 포기했었는데요.

MMC/SD V4 보드로 로직 애널라이저 같은걸 만들어서, 신호를 캡쳐한적이 있습니다.


아래는 JP nn 명령과 OUT (n),A 명령 두개를 쓰는 경우의 신호를 잡은 모습이에요.


먼저 Z80입니다.

매뉴얼에 나오는 파형과 거의 똑같죠? M1 사이클에 RFSH가 연속해서 나오는 모습입니다.




R800입니다. /RFSH가 전혀 안움직이네요ㅋ

JP, OUT 명령만 있어서 Z80보다 적은 클럭으로 동작하는걸 볼 수 있습니다.




그렇다고 DRAM이 깨지는건 아니구요. 실제로는 리프레쉬 사이클이 랜덤한 위치에 나타납니다.

아래는 JP 명령 직전에 /RFSH가 움직인 모습을 잡은거에요.




이렇게 보면 R800에서 클럭을 더 많이 먹는 것처럼 보이지만,

일정한 주기로 리프레쉬 하니까 Z80보다는 R800으로 구동하는게 평균적으로 더 빠릅니다.


참고로, 캡쳐한 신호는 모두 A1GT의 슬롯1의 출력신호입니다. 모두 3.58MHz 타이밍이죠.

turboR에서 호환성을 위해 속도를 희생한 설계때문입니다.

.

.

.

Z280을 MSX 메인 CPU로 쓸 수 있다는 엄청난 희망을 안고 ebay로 달려갑니다!


일단 몇 개를 구해서 살아있는지 확인해보아요~

딱봐도 리마킹이라 좀 불안하네요. (2003년 생산이라니... 말도 안되는ㅋ)





어헛... 동작하는거 같아요! ㅎ.ㅎ





그럼 turboR의 Z80 3.58MHz + R800 7.16MHz와 유사한 Z80 3.58MHz + Z280 12.5MHz으로 구성해봅니다.

그렇게 만들어진 보드가 지난 10월초에 보여드린 사진이었지요.





흐흠.. 과연 ebay에서 온 Z280이 제대로 동작이 될까요?

Z280은 외부 BUS의 타이밍을 CPU와 1:1, 2:1, 4:1로 동작하도록 설정가능합니다.

CPU 클럭이 12.5MHz면 BUS 1:1로 하더라도, SRAM 55ns와 FlashROM 70ns를 돌리는데는 문제가 없어요.

물론 캐시는 모두(I/D) 끈 상태입니다.


12.5MHz로 돌아가는 Z280은 얼마나 빠를까요?

FOR 루프를 돌려봅시다!




어? 8BIT 모드에서는 메모리 R/W 속도가 절반으로 깎이니까, 성능하락은 어쩔 수 없지만...

이거 생각보다 많이 느리네요! @.@


참고로 아래는 Z80 12.5MHz로 구동한 모습입니다.

동클럭의 Z80이 훨씬 빠르네요ㅋㅋ




참고로 A1GT에서는 동일한 FOR 루프로 테스트하면 170정도가 나오구요.

Z80 20MHz로 돌리면 150정도가 됩니다. (자세한 내용은 지난 글을 보시면 되겠습니다요)



[결론]


'Z280을 8BIT BUS 모드로 구동하면 많이 느려짐'

'Z280의 캐시를 활용할 방법이 필요'


Z280을 고속모드로 사용하는건 성능이 아쉬우니 포기하고, Z80 20MHz를 고속모드를 쓰기로 합니다.

이전에 썼던 글들이 모두 Z80 20MHz 얘기만 나왔던게 이런 결과때문이었습니다. ㅎ.ㅎ


'어? SLT-Turbo는 turboR 호환이라고 하지않았나요? 그럼 R800 명령은 어떻게 되나요?'

네, 맞습니다. Z80으로는 turboR 전용 S/W를 구동하는게 불가능하죠.

.

.

그.래.서.

R800 전용 명령을 포함한 곱셈, 나눗셈 명령만 Z280으로 실행하는 방법으로 갔습니다.

Z280을 coprocessor의 형태로 동작하는 모습이 되었지요.


이 내용은 다음 글에서 이어집니다~ ㅎ.ㅎ/


그럼, 이만...


2020년 11월 29일 일요일

SLT-Turbo 제작 #5 - I/O 프로세서 개선

V4 납땜하다가... 다시 SLT-Turbo로 달려봅니다요~

이번엔 데모 영상을 위해 X-II에 기기를 연결했습니다.




I/O 프로세서는 호스트의 CPU가 담당하지만, 실제 코드는 SLT-Turbo의 BUS Arbiter가 생성합니다.

예전에 이게 DMA 컨트롤러의 마이크로 코드 작업과 비슷하다...라고 설명했는데요.

코드가 동적으로 변경되는거라서 좀 차이는 있겠습니다요~ (사실 일반 DMAC는 구조가 간단합니다)


초기 버전과 현재 버전의 동작차이를 요약하면 이렇습니다.


@ 초기 버전

  모든 코드는 호스트 메모리에서 구동

  호스트 CPU가 SLT-Turbo의 BUS 상태를 체크하고 필요한 루틴을 실행


@ 현재 버전

  모든 코드는 SLT-Turbo 슬롯에서 구동

  BUS Arbiter가 필요한 코드를 생성함



호스트 CPU의 코드 공간(주소)는 Page 0 (0000H ~ 3FFFH) 입니다.

어차피 인터럽트 처리 때문에 Page 0을 쓰는게 공간을 적게 차지하겠습니요.

참고로 Page 1,2는 SLT-Turbo의 가상 슬롯 매핑에 쓰입니다. (자세한건 나중에 설명을~ㅋ)

Page 3는 호스트의 메모리 그대로 유지합니다. DATA, Stack 용으로 계속 쓰이는거죠.



이번에 데모로 찍은 영상은 X-II 순정에 V9958 교체 후 XII-V만 내장된 상태입니다.

그러니까 MSX-MUSIC이 없는걸로 보시면 맞습니다.


지난번 A1WSX로 데모했을 때에는 OPLL 칩이 본체에 내장되어있어서,

I/O 프로세서가 처리한 사운드 결과만 확인이 가능했는데요.

이번엔 XII-V(LED 비주얼라이저)가 호스트에 있고, OPLL은 SLT-Turbo에 있습니다.

그러니까, LED와 사운드가 동시에 동작하는걸 확인할 수 있다는 얘기입니다.



그럼 영상으로 확인해보시죠~ ㅎ.ㅎ

X-II의 전면 슬롯에는 MMC/SD V4가 있고,

후면 슬롯에는 50핀 케이블로 SLT-Turbo가 직결되어있습니다. (케이블은 27cm 정도 되네요)



아래는 영상 설명입니다.


00:00 Host MSX, Booting

-> 호스트 본체가 부팅됩니다.


00:35 SLT-Turbo, Illusion City

-> GT 모드로 구동 후 환영도시를 실행합니다.


03:30 SLT-Turbo, Fray

-> GT 모드로 구동 후 프레이(터보알 버전)을 실행합니다.


05:55 SLT-Turbo, Video Play

-> GT 모드로 구동 후 MV 영상 재생합니다.

원본 영상 속도와 거의 동일한걸 볼 수 있어요.



MV 재생 시, 음성이 약간 빨라졌다 느려지는 현상이 나오는데요.

이건 기기특성은 아니고, MMC/SD의 MV 플레이루틴이 기기를 진짜 A1GT로 착각해서 발생하는 현상입니다.

WSX, GT에서 쓰인 T9769는 VDP IO처리시 1클럭 wait가 더 추가됩니다.

이 때문에 일반 MSX2보다 조금 느리게 동작합니다.


MV 재생처럼 VDP를 과도하게 쓰는 경우는 이 차이를 사람이 느낄 수 있는 정도가 되거든요.

MMC/SD의 MV 플레이어는 1클럭 wait가 없는 기종에서는 속도 보상을 하도록 구현되어있습니다.

그래서 MSX2, MSX2+, turboR 모두 영상재생 속도가 동일하도록 처리됩니다.

.

.

.

사실 모든 기종을 다 커버하지는 못합니다 ㅎ.ㅎㅋ

MSX-ENGINE이 좀 다른 MSX2/2+ 기종이 있는걸로 알고 있어요.

지금 영상의 MSX2 본체에서 VDP를 V9958로 개조하고 SLT-Turbo를 구동하면,

현재의 MMC/SD의 MV 플레이어는 본체를 GT로 인식하게 됩니다. 이 경우도 커버가 안되는거죠.

이건 나중에 MMC/SD BIOS 업뎃할 때 지원하도록 하겠습니다.



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


궁금한 점 있으시면 댓글로 ㄱㄱㄱ


2020년 11월 1일 일요일

SLT-Turbo 제작 #4 - turboR 흉내내기

지난 글에서는 그냥 빠른 Z80에 대한 내용이었습니다.

그럼, 이번에는 터보알과 비슷하게 동작하도록 해봅시다요.

일단 사진 한장 올려놓고 시작을~ㅋ





[서론]

 

터보알은 동작 모드가 두개입니다. 다 아시는 그... Z80 일반 모드와 R800 고속모드욤 ㅎ.ㅎ


일반 모드에서는 MSX-ENGINE(T9769C)을 메인 칩으로 구동합니다.

기존 A1WSX 등의 MSX2+ 기종과 H/W적으로 똑같이 동작하니까, S/W 또는 H/W 호환이 100% 되는거겠죠?

R800 고속모드는 외부 슬롯은 3.58MHz의 기존 BUS를 유지한 상태로, 본체 내부만 고속으로 동작합니다.

외부 BUS가 고속으로 동작하면, 기존 H/W(외부 주변기기)들의 동작 보증이 안되니 어쩔 수 없는 선택이었겠죠.


그럼 외부 슬롯만 고려하면 될까요?

아니겠죠? 기존 3.58MHz 속도에 맞춘 S/W를 그냥 빠르게 돌리면 내장기기들도 엉망이 됩니다.


근데 SLT-Turbo를 만드는데 터보알 얘기를 자꾸 하는지 궁금하실 분들도 있겠네요.

만약 그냥 제 마음대로 만들게 되면, SLT-Turbo가 기존 ST/GT보다 활용도가 낮을 확률이 높습니다.

최소한 기존 터보알의 고속모드와 호환되는 동작모드가 있어야, 기존 고속모드 만큼의 효용은 생길 것 같아요.

물론 GT 클론을 만들겠다는 의미 보다는 S/W, H/W 호환기기에 의미를 두시면 되겠구요.


SLT-Turbo에 SLT-X를 합체(?)시킨 결과물도 결국 이 활용도 때문에... 이렇게 되었습니다요.

두 기기를 분리해서 만들면, 함께 사용하실 분들이 별로 없을 것 같아서요ㅋ



[본론]


제가 GT를 18년쯤 썼으니, 뭐 이정도면 대충 느낌 아니까...

적당히(?) 이것저것 넣으면 되지않을까 싶으네요 ㅎ.ㅎㅋ


지원되어야 할 필수 기능들을 적어봅시다~

- CPU 동작 모드 전환 (Z80 3.58MHz 일반모드, Z80 20MHz 고속모드)

- R800 명령어 지원 (8BIT/16BIT 곱셈)

- 고속모드에서 외부 슬롯 액세스 타이밍

- 고속모드에서 내장 기기 액세스 타이밍 (VDP, PSG, 키보드 등)

- 16BIT H/W Timer

- 8BIT PCM 출력, PCM Timer (15.7KHz)

- 메모리 매퍼 (512KB GT 모드, 4096KB Full 모드)


참고로, SLT-Turbo가 구동가능한 최소 사양은 MSX2 램64KB입니다.

만약 MSX2+ 기종을 쓰거나, MSX2의 VDP를 V9958로 개조하셨다면...

SLT-Turbo만 장착하면 본체를 터보알 수준으로 쓸 수 있게됩니다.


현재까지, R800 명령어를 제외하고 나머지는 모두 구현이 되었습니다.

최적화 이슈는 좀 남아있지만요 ㅎ.ㅎ


사실은 지난번 글 이후에 Z280 글을 올릴려고 계획했는데, 이게 성능 문제가 있어서 ㅎ.ㅎ;

R800 고속모드를 전체에 적용하기는 무리더라구요.

이것 저것 테스트를 많이 해봤는데 결국 내린 결론은...

'Z80 20MHz를 고속모드 기본으로 사용하고 Z280은 코프로세서로 사용'입니다.

이쪽은 다른 글로 올릴테니, R800 명령은 일단 스킵합니다요~



Z80 20MHz로 구현해서 테스트를 해보니, 요게 터보알 고속모드와 성능이 비슷하더라구요.

실기의 느낌적인 느낌으로는, 터보알이 기존 MSX에 비해 4~5배 정도의 체감성능이 나오는데요.

SLT-Turbo의 고속모드가 딱 비슷한 느낌입니다. ㅎ.ㅎ


말로 설명하는 것보다는 영상을 보시는게 빠르겠죠?

오랜만에 A1WSX를 꺼냈습니다. 참고로 요놈은 MSX2+ 기종입니다.

내장 메모리는 512KB로 증설되어있습니다.

이 정도로도 충분히 쓸만한 기종이지만, 터보알에 한번 맛들이면... 그냥 창고행~ ㅎ.ㅎ


SLOT 1에는 SLT-Turbo가, SLOT 2에는 MMC/SD V4가 장착되어있습니다.


SLT-Turbo는 A1ST의 수준의 BIOS 롬으로 구동이 됩니다.

내부 SLOT 3-0에는 메모리매퍼가 4096KB 풀로 채워져있구요.

외부 SLOT 1은 MMC/SD V4

외부 SLOT 2-1은 폰트팩, SLOT 2-3은 문사운드가 있습니다.


영상에서는 아래 순서로 나옵니다.

내부외부의 각종 기기들의 동작 모습을 볼 수 있습니다.

영상의 ASO 리메이크는 처음 릴리스했던 파일을 사용했습니다. (R800 곱셈 명령을 쓰지않는 버전)

이후 업뎃된 버전은 R800 명령을 쓰고 있어서, 현재의 SLT-Turbo에서는 실행되지 않습니다.


00:00 본체 부팅

00:37 SLT-Turbo turbo R mode @ 20MHz으로 기동

01:24 SLT-Turbo 일반모드의 속도측정

02:08 SLT-Turbo 고속모드의 속도측정

02:31 SLT-Turbo 칸지 스크린 테스트

02:47 SLT-Turbo 한글 폰트팩 테스트

03:25 SLT-Turbo 메가리포트

04:09 SLT-Turbo IMS 플레이

05:22 SLT-Turbo 프레이 터보알 버전

07:02 본체 리부팅

08:04 SLT-Turbo ASO 리메이크


아래는 유투브에 올린 영상입니다.

위의 설명과 함께 보시면 되겠습니다요~ ㅎ.ㅎ





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


궁금한 점 있으시면 댓글로 ㄱㄱㄱ


2020년 10월 16일 금요일

SLT-Turbo 제작 #3 - Z80 20MHz

터보 MSX를 만들 때 가장 중요한게 뭘까요?

속도? 물론 중요합니다만... 기존 S/W의 동작 호환성이 가장 중요하겠죠?


1.

Z80 매뉴얼에는 없는 비공식(hidden) 명령어를 쓰는 프로그램(일부 게임 등)이 제대로 동작되어야겠구요.


2.

I/O의 경우에도 Z80 3.58MHz 모드에서 기존 I/O와 똑같은 성능이 나와야 의미가 있습니다.

기존 MSX에 비해 느려도 안되고, 더 빨라도 안됩니다 ㅎ.ㅎ


3.

기존 터보 기종(ST/GT)의 호환성을 생각한다면, R800 명령어들도 제대로 지원이 되어야겠구요.

그게 안되면 turboR 딱지를 붙일 수가 없겠지요.


4.

기존 터보 기종보다 빠르게 동작하는 모드에서는 속도가 더 빨라도 문제는 없겠습니다.

S/W 개발하시는 분들이 잘~~ 알아서 만들어주시겠죠? (물론 당분간은 저혼자 원맨쇼를~ ㅎ.ㅎㅋ)




기존 S/W 호환성을 유지하고 3.58MHz 클럭에서 기존 Z80와 똑같은 성능을 내려면 어떻게 해야할까요?

가장 쉬운 방법은 Z80 칩을 사다가 붙이면 되겠습니다.

Zilog Z80 칩은 현재도 여전히 생산중인걸로 알고 있구요.

최대 동작 클럭은 20MHz까지 지원됩니다.


아래는 제가 작년에 엘레X츠에서 샀던 Z84C0020AEG 칩입니다.

십여년 전에 썼던 FEG 칩은 QFP 였는데, 이번 AEG 칩은 LQFP네요. 칩 높이가 절반입니다.

2018년 생산품이에요 ㅎ.ㅎ





20MHz 클럭은 주기가 50ns가 됩니다.

속도가 빨라지면 주변 장치(롬, 램)도 빠르게 동작할 수 있어야, 함께 빨라지겠죠?


그리고 3.58MHz MSX는 opcode fetch 시의 메모리 Read(M1 사이클)에 WAIT 1클럭을 넣어서 3클럭으로 동작합니다.

일반 메모리 R/W 사이클은 원래 3클럭이라서 변함이 없구요.

만약 M1 사이클에서 WAIT를 제거할 수 있으면 좀 더 빠른 시스템을 만들 수 있겠습니다.


Z80의 Memory R/W 사이클에서 /MREQ 구간은 2클럭으로 동작하지만,

Memory Write의 경우는 Write 펄스가 1클럭입니다.

이것 때문에 램을 사용할 때는 빠른 칩을 쓰거나, Write 시에만 WAIT를 추가하는 방법을 써야합니다.


일단 터보 보드에 장착할 SRAM을 좀 찾아봅시다요~ ㅎ.ㅎ

ALLIANCE 사의 SRAM은 요즘에도 생산이 되고 있어서 많이 쓰이는데요.

이번 SLT-Turbo에서는 8MB의 램을 쓰려고 합니다.

찾아보니 칩 하나가 나오네요 ---> AS6C6416-55TIN

액세스 타임이 55ns, R/W 사이클 타임도 55ns입니다. 20MHz 시스템의 2클럭이면 100ns니까 충분하네요.

그리고 중요한 Write 펄스 타임은 최소 45ns입니다. 1클럭에 처리가능하네요. ㅎ.ㅎb

SRAM은 이걸로 ㄱㄱ합니다요~


FlashROM은 M29W640 70ns 칩으로 쓰고 있는데요.

Memory read 사이클 2클럭, I/O read 사이클 2.5클럭이라 별 문제없을거라 생각합니다.

Write 펄스가 최소 35ns라서 괜찮을꺼 같은데...

잘 안되면 CPU 클럭을 낮추면 되니 대충 ㄱㄱ합니다~ ㅎ.ㅎㅋ



그럼 실제로 얼마나 빠른지 확인해봅시다!

현재 구현된 I/O 프로세서 로직이 느린편이니까 조금 고려하시고 봐주세요.

VDP I/O랑 인터럽트 처리가 꽤 느립니다ㅋ



아래는 20MHz로 구동한 모습입니다.

일반 MSX와 동일한 M1 사이클 3클럭 read로 되어있습니다. (WAIT 1클럭이욤ㅋ)




아래는 20MHz 속도는 같지만, M1 사이클의 WAIT를 제거한 상태입니다.

훨씬 빠릅니다.

사진에서는 "with M1 1clock wait"라고 되어있는데 'without'이라고 쓴다는게 실수였슴다 ㅋㅋ





참고로 아래는 제 GT의 R800 DRAM 모드에서 테스트한 모습이구요.

디스크롬이 동작중이라 약간 느리긴합니다. 참고하세요.





영상으로도 한번 찍어보았습니다.

뒷부분에 트윈비, 캐슬EX 구동 모습도 넣었어요. (CPU가 빨라지면 속도도 빨라지는 X같은 게임들ㅋ)





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


궁금한 점 있으시면 댓글로 ㄱㄱㄱ


2020년 10월 12일 월요일

SLT-Turbo 제작 #2 - I/O 프로세서

설명에 앞서 일단 SLT-Turbo 겉모습부터 보시죠~ ㅎ.ㅎ


아래는 터보 보드입니다. 두장이 아니라 앞뒷면 사진이니 착오없으시기를...ㅋ

서브슬롯 보드와 합체 할 때 부품의 간섭이 생기지 않도록 머리를 많이 굴렸습니다.

보드 그리는데 한참 걸린 것 같아요 ㅠ.ㅠ





서브슬롯 보드를 합체한 모습입니다.

/SLTSL, /IORQ를 ON/OFF 할 수 있는 스위치가 있구요.

슬롯 SOUND 출력을 헤드폰 Left/Right로 나누어 출력할 수 있습니다.

본체의 SOUND IN으로 입력하거나 헤드폰 출력으로 따로 출력가능합니다. 물론 강제 모노도 가능하구요.

사용하려면 외부 DC 5V 어댑터가 필수입니다. 3A 정도면 힘이 남아돌겠죠?




처음부터 위아래 보드를 딱 붙이면 디버깅이 힘드니까, 분리할 수 있도록 핀헤더 소켓을 사용했습니다.






[본론]


대충 구경하셨나요? 그럼 I/O 프로세서 설명으로 넘어갑니다 ㅎ.ㅎ


SLT-Turbo는 MSX 본체가 아닌, 본체의 CPU를 고속으로 바꾸는 효과를 내는 'CPU 가속기'의 형태입니다.

메인 BIOS, 메모리 등의 고속으로 구동하는데 필요한 주변기기들은 모두 SLT-Turbo 보드에 내장됩니다.

근데 외부 기기는 본체 내부의 주변장치를 접근 할 수가 없죠.,

그래서, 본체에 내장된 CPU를 SLT-Turbo의 버스 아비터(Arbiter)와 결합해서 I/O 프로세서를 만듭니다.


"본체에 SLT-Turbo를 꽂고 동작하는 것" VS "본체를 고속 CPU로 개조 후 확장슬롯을 연결한 것"

사용자가 이 두가지 환경의 차이를 느끼지 못하도록 만드는 것이 I/O 프로세서의 역할인거죠.



구현방식은 여러가지가 있겠지만... 1차구현은 간단한 방식으로 시작해봅니다~


I/O가 처리되는 과정을 순서대로 적어보면 이렇게 됩니다.

1. 터보 보드의 CPU가 I/O 명령이 수행되면, 아비터가 CPU /WAIT를 유지하고 I/O 요청을 걸어놓습니다.

2. 본체의 CPU는 아비터에 걸린 I/O 요청이 있는지 폴링(Polling)하면서 대기합니다.

3. 본체의 CPU는 I/O 요청을 처리 하고 결과를 아비터로 돌려줍니다.

4. I/O가 완료되면 아비터는 BUS에 전달받은 데이터를 로딩하고 터보 보드의 CPU /WAIT를 해제합니다.


I/O 명령 시작부터 처리완료까지 시간이 꽤 걸릴거라고 예상가능하죠?

지금은 절뚝거리더라도 일단 달려야 되는 상황이니 이해해주세요.

뭔가 동작하는 상태를 만들어야 보드를 동작을 테스트할 수 있으니까요~ 흐흐...



그럼, 한번 달려봅시다~

터보 보드의 Z80 CPU에 3.58MHz 클럭을 연결하고 구동합니다.

SLT-Turbo쪽 슬롯 설정은 아래처럼 초간단 MSX2+ 모드로 해줍니다.

슬롯0 = MSX2+ BIOS

슬롯1 = SLT 서브슬롯

슬롯3 = RAM 64KB


그리고, I/O 프로세서는 아래의 장치들을 본체에서 대신 구동합니다.

PPI (A8H SLOT 제외), VDP, PSG, RTC



아래 영상을 보시면 어떻게 동작하는지 볼 수 있습니다.





영상에 대한 설명 나갑니다~


00:00 Host MSX, Booting

-> 기기를 연결하고 본체를 부팅합니다.


00:23 SLT-Turbo, Booting

-> 임시로 제작된 툴을 이용, SLT-Turbo를 MSX2+모드로 부팅합니다.


01:22 SLT-Turbo, PCM Play with Host Keyboard

-> SLT-Turbo쪽의 V4를 이용하여 44.1Hz PCM을 재생합니다.

PCM Player는 512bytes 재생할 때 마다 ESC 키를 체크합니다.

초당 86번의 PPI를 액세스합니다만, 부하가 작아서 귀로 느끼기는 힘드네요. 


03:07 SLT-Turbo, Video Play with Host VDP & Keyboard

-> SLT-Turbo쪽의 V4로 비디오를 재생합니다.

Video Player는 대부분의 시간을 VDP의 VRAM, 팔레트를 처리하는데 소진합니다.

I/O 프로세서의 처리시간이 얼마나 부담이 되는지 처절하게 느낄 수 있어요.

(사실 생각보다 빠른 듯해서 좀 놀랐습니다ㅋㅋ)


04:18 Host MSX, Re-booting

-> 본체를 재부팅합니다.


04:45 Host MSX, Video Play

-> 본체로 비디오를 재생해봅니다. 정상속도의 영상과 비교하기 위함입니다~



마지막으로 CPU 속도 테스트를 해봅니다.

FOR 루프를 구동하는 것이라 I/O 딜레이가 크게 부담되지않습니다.







[결론]


SLT-Turbo의 제작목표

-> 사용자가 외부에 CPU가 있다는걸 눈치채지 못하도록 자연스러운 고속 CPU 환경을 만드는 것


I/O 프로세서의 목표

-> 터보 보드의 I/O처리가 거의 딜레이없이 구동되도록 구현




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


궁금한 점 있으시면 댓글로 ㄱㄱㄱ



2020년 10월 10일 토요일

SLT-Turbo 제작 #1 - 슬롯터보

[서론]


터보알이 등장한지 이제 30년이 된 것 같네요.

혹시 '이게 진짜 빠른 MSX가 맞나!?' 의심이 들었던 분 있으세요?

MSX를 주로 게이밍 용도로 쓰신다면, 터보알의 용도는 '환영도시 게임기'에 그치는게 맞겠죠? ㅎ.ㅎ


터보알은 고속의 R800 CPU와 내장기기, 그리고 3.58MHz 버스 타이밍이 공존하는 오묘한 MSX입니다.

제가 터보알을 처음 접한 건, ST/GT 실기가 아니라 NLMSX 에뮬레이터였는데요.

그 때는 빠른 MSX의 느낌보다는 '환영도시 게임기'에 가까웠습니다.

딱히 활용할 곳이 없었으니까요ㅋ


그렇게 몇해가 지나고 실제 GT를 구하게 되었습니다.

BASIC과 DOS2을 구동해보니...어? 이게 예상과는 좀 다르네요.

생각보다 너무 빠르더라구요.

이 때부터 MSX 실기를 계속(?) 써야겠다는 생각이 들었고, 이걸 어떻게 해야 쓸모있는 환경이 될까?

고민을 해봤습니다. 사실 정답은 정해져있습니다ㅋ


터보알의 외부 슬롯은 3.58MHz 타이밍이라서, 내장 메모리에서 프로그램이 동작해야만 고속으로 돌아갑니다.

제 개발 환경을 DOS2 기반으로 만들고, 메모리매퍼를 적극적으로 쓸 수 있는 툴을 만들기 시작했습니다.

HI-TECH C에 전용 툴을 섞는 식으로 만들었지요.


그렇게 차근차근 진행되어 처음 나온 프로그램이 HV 한글뷰어였습니다.

메모리 사용량과 인터레이스 스크린7을 보면 딱 느낌이 들죠? "이거 터보알 아니면 못 쓰겠네!"

그리고는 M 파일 매니저가 등장합니다. (본격적으로 터보알을 갈구는 프로그램이...)

MMC/SD V3,V4처럼 터보알 구조에서 빠르게 동작할 수 있는 기기도 만들게 되었구요.

아마 벤치마킹해보셨으면, 이게 3.58MHz 버스가 맞는지 의심이 갈 정도일겁니다ㅋ

.

.

.

그렇게 10년이 흘러 여기까지 왔습니다.

한때는 MSX 본체 메모리를 512KB로 늘려야한다고 얘기하면, DOL-A-I 취급당하던 시절도 있었는데...

이제는 많이 변했죠~ㅋ


하지만 여전히 문제는 있습니다... '고속 MSX를 어디에 써야하나?' 입니다.

활용할 방법이 없으면 고속 MSX도 필요가 없고, 고속 MSX 사용자가 적으니 활용할 H/W, S/W를 만들 이유도 없죠.

근데 '닭이 먼저냐 알이 먼저냐'라는 개발자의 고통을 20년동안 "떠들기"만 해서는 바뀌는게 아무것도 없습니다.

뭔가를 직접 만들고 보편화시키는 것 말고는 방법이 없...ㅋ


그.래.서.

이제 때가 된 것 같네요.

'고속 MSX를 활용할 수 있는 환경을 만들고 같이 활용해보자'로 가는겁니다요~ ㅎ.ㅎ


서론을 좀 주절주절 썼지만...

제가 나름 생각하는 '앞으로 가는 MSX 환경'에 공감하시는데 도움이 되고자 길게 적어봤습니다ㅋㅋ



[본론]


고속 MSX를 활용하려면? 뭐, 고속의 본체가 있어야겠죠? ㅎ.ㅎ;

ST, GT가 널려있다면 고민할 필요가 없는데 말이죠.

그래서 SLT-Turbo라는게 나오게되었습니다.


이름에서 대충 짐작하셨겠지만, 요놈은 SLT-X에 CPU 가속기가 합체된 기기입니다.

일반 MSX를 빠르게 구동하기 위한 가장 간단한 방법은 본체의 CPU를 고속으로 바꾸는건데요.

빨라진 만큼 외부 I/O에 WAIT를 넣는 식으로, 유럽에서는 MSX2 용 Z80 7MHz킷으로 쓰인 것으로 알고 있습니다.

그 외 스페인의 레오나르도 아자씨가 만든 Z380 카트리지도 있는데...

이건 I/O없는 단순한 코드를 빠르게 구동하는 것만 되는 듯 합니다.

저도 실사용하는걸 본적이 없어요. (사용자가 별로 없는 듯요)


SLT-Turbo는 MSX 표준 주변기기입니다.

기본슬롯에 꽂는 확장슬롯과 유사하게 생겼구요. 3.58MHz로 동작하는 일반 버스 타이밍으로 돌아갑니다.

BIOS를 포함 모든 코드는 SLT-Turbo의 터보 보드에서 구동이 됩니다.

본체에 내장된 키보드, VDP, PSG 등은 본체의 CPU가 처리를 대신하게 됩니다.


사실 MSX는 슬롯 구조를 쓰면서 얻는 장점이 매우 큽니다만...

Z80 상위 CPU의 Cache, MMU, DMA를 쓸 수 없는 단점을 갖고 있어요. (단점이라고 하긴 좀 그렇지만요ㅋ)

슬롯 외부의 CPU가 메인으로 구동하려면, 본체 내장 I/O는 본체의 CPU로 처리할 수 밖에 없는 구조입니다.


.

.

.

아마 이쯤에서 궁금한 부분이 하나 있으실 것 같은데...

'기존 MSX의 주변기기가 아닌 본체를 만드는게 더 좋지 않나요?'

사실 파라동 오프모임에서 단골 메뉴로 등장하는 얘기죠.


MSX2+, turboR 기종들이 나온지 30년 넘었는데, 이걸 제대로 활용하는 S/W, H/W도 잘 없어요.

근데 새로운 MSX가 나온다고해서 뭔가 달라질까 싶습니다.

혹시 뭔가 새로운걸 해보고 싶다면...

openMSX 소스에 가상의 주변기기를 추가하고 프로그램도 만들어서 돌려보시면 되겠습니다.


저의 희망사항은

'여러분들의 창고에 처박아둔 실기들이 책상위로 올라와서 전기를 먹는 모습'

정도로 많이(?) 소박합니다 ㅎ.ㅎ



프로젝트 소개는 요렇게 마무리합니다.

SLT-Turbo는 SLT-X에 터보가 추가된거라고 설명드렸는데요. 아래 PCB 사진을 보시면 납득이 되실겁니다요~

보드는 2층으로 합체합니다. PAC-V 구조를 생각하시면 비슷해요.





합체해서 케이스에 넣으면 이런모양입니다. 케이스는 오버리치 카트리지 1개가 필요합니다ㅋㅋ





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


궁금한 점 있으시면 댓글로 ㄱㄱㄱ