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년 12월 11일 금요일

M File Manager - 내장 도움말을 바꿔보아요

M에서 #HELP 명령을 쓰면 내장 도움말이 화면에 표시됩니다.

아마 안해보신 분도 있으실거라 예상됩니다요~ ㅎ.ㅎ


단축키 설정을 안바꿨다면, F1 누르면 아래처럼 메뉴가 나올겁니다.

요기서 #HELP를 선택하시면 되겠어요.




도움말 자체는 M 프로그램 안에 내장된건 아니고, M.HLP 문서를 화면에 표시만 해줍니다.

44라인의 텍스트 문서를 두화면에 교대로 표시해주는거에요~


이미 M 사용법에 익숙하시다면, 이 파일을 본인이 원하는 방향(?)으로 편집해서 사용하셔도 됩니다.

MMCSD.COM에서 자주 쓰이는 기능을 도움말로 만들어보았습니다.


첨부된 텍스트 파일을 M.HLP로 이름을 바꿔서 쓰시면 되겠습니다요~ (기존 파일은 미리 백업을..)


아래처럼 M을 종료하지 않고 간단한 도움말을 볼 수 있습니다.

본인의 취향에 맞게 만들어 쓰시면 되겠죠? ㅎ.ㅎ





그럼, 이만~


2020년 12월 10일 목요일

M File Manager - %f를 써보아요

%f는 확장자 또는 펑션키 입력메뉴의 커맨드 문자열에서 사용되는 특수문자입니다.

M에서 현재 커서가 위치한 아이템(파일 또는 디렉토리)의 이름으로 치환되는 명령은 두가지 있습니다.

%s와 %f요~


만약 커서가 AUTOEXEC.BAT 파일에 위치한 상태라면,

%s는 AUTOEXEC.BAT 전체 파일명으로 치환되구요.

%f는 확장자를 제외한 AUTOEXEC으로 치환됩니다.


근데 %f를 쓸만한 경우가 잘 없을꺼에요.

요걸 아래처럼 한번 사용해봅시다요~


MMC/SD V3 또는 V4에서 YS2 HDD 이미지파일을 구동할 때, MMCSD.COM에서 /HD 옵션을 씁니다.

이 옵션을 M.INI의 DSK 확장자에 등록하지 않고, 별도의 HDD 확장자에 등록해서 실행해봅니다.

아래 사진처럼이요.






만약 YS2MMCSD.HDD 파일을 선택 후 실행하면,

M은 "MMCSD YS2MMCSD.DSK /HD"으로 실행하겠죠?



이렇게 YS2MMCSD.DSK를 간접실행(?)하려면 HDD 파일이 필요하겠네요.

그냥 이름만 YS2MMCSD.HDD가 되도록 파일을 하나 생성하면 됩니다.


아래처럼, 도스 프롬프트에서 COPY CON YS2MMCSD.HDD 명령으로 만들 수도 있어요.





꼼수지만... 이렇게 쓰는 방법이 있다는 것도 기억하시면 좋겠습니다 ㅎ.ㅎ


그럼, 이만~