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처리가 거의 딜레이없이 구동되도록 구현




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


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