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 코프로세서 모드를 구현'

으로 되겠습니다.



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


댓글 없음:

댓글 쓰기