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같은 게임들ㅋ)





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


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