2023년 2월 5일 일요일

SLT-X V2 제작 #5 - Boot-ROM 구동

구버전 V1에서는 SLT-X 설정을 위한 프로그램이 내장되어있었습니다.

Manager ROM이라 불렀죠 (추억의 관리자 ㅎ.ㅎ)


SLT-X V2(이하 SLT-X)에서는 Manager가 삭제되고,

최소한의 기능이 들어간 프로그램으로 대체됩니다.


이름이 Boot-ROM입니다. 왜 이름이 바꼈냐구요?

.

.

.

이 프로그램이 실행되지 않으면 SLT-X가 확장슬롯으로 동작하지 않습니다ㅋ

그냥 I/O SLOT이 잔뜩 달린 물건(?)으로 동작합니다요~

일단 설정이 안되면 정상적으로 사용이 불가능해요. 그래서 걍 Boot-ROM으로 이름을 바꿨습니다.


그럼, 긴 설명 나갑니다~~

이하 내용은 MSX를 잘 모르시면 읽기 힘들 수 있으니까,

내려가다가 분위기 다운되면 대충 Skip하면서 가셔요~ ㅎ.ㅎ/



1) Boot-ROM의 실행


Boot-ROM은 MSX BUS의 SLOT 0의 page 2가 액세스 될 때, 강제로 실행됩니다.

그러니까 본체 내부에서 생성되는 SLOT 0 용 /SLTSL 신호를 따로 연결하지 않습니다.

이것 때무에 본체를 개조하는 것도 이상하지만, 단순 개조로는 안되는 거라서 힘들어요.


SLT-X는 내부적으로 PPI A8H 포트의 PSLOT 레지스터를 갖고 있습니다.

따라서 MSX 슬롯의 BUS가 동작할 때 슬롯 영역에서 chip enable되는 메모리가 없다면,

SLT-X가 본체 외부에서 BUS에 DATA를 강제로 올려버립니다.

그러니까 /SLTSL 신호와 서브슬롯 레지스터의 존재를 모른 상태로 동작합니다. 좀 무섭죠?ㅋ


암튼 이건 모든 MSX에서 가능한 건 아니구요.

본체의 SLOT 0의 page 2 영역이 비어있어야 가능합니다.

MSX1처럼 SLOT 0의 page 2,3에 램이 들어간 기종(싸구려 기종)은 사용불가입니다.

근데 page 3에 16KB 램만 박혀있는 울트라 싸구려 기종에서는 동작합니다ㅋㅋ


만약 SLOT 0가 확장되어 있다면, SLOT 0-0의 page 2 영역에서 실행되겠네요.

SLT-X H/W 입장에서는 본체쪽 SLOT 0가 확장되어있는지, 아닌지 알 방법이 없습니다. 참고하시구요.


Main BIOS가 각 슬롯의 Extension 프로그램을 검색/실행하는 타이밍에 Boot-ROM을 강제로 켜줍니다.

세가지 케이스가 있는데요.


- 본체의 SLOT 0가 확장이 안된 경우


Page 2의 Extension 프로그램을 검색하는 순간이 딱 한번이니까 그냥 이때 Boot-ROM을 실행하면 됩니다.

단지 주소값만으로 조건이 충족되니까요.


- 본체의 SLOT 0가 확장된 경우

본체 외부(SLT-X)에서는 SLOT 0의 확장슬롯 레지스터를 H/W가 접근할 수 없기 때문에,

현재 동작하는 서브슬롯이 누군지 확인할 방법이 없습니다.

대신 코드가 실행되는 주소는 알 수 있습니다. (MSX를 많이 만지다보면 꼼수만 늘게 되는데...ㅋ)


타이밍을 잘 잡으면, 첫 Extension 프로그램인 SLOT 0-0의 page 2에서 Boot-ROM을 켤 수 있습니다.

재빨리 구동 후 Boot-ROM을 끄고 원래 기능인 확장슬롯 모드로 돌아갑니다.


- 본체에 SLOT BUS에 DATA 버퍼칩이 존재하는 경우


이 버퍼칩은 대게 74LS245 류의 IC를 사용합니다.

DATA BUS의 방향을 정해줄 수 있구요. enable 신호를 끊어서, BUS의 신호를 분리 할 수도 있습니다.


문제는 여기서 발생하는데요.

대우의 CPC-300(아이큐2000), CPC-400(X-II)은 모두 74LS245칩이 들어있습니다.

BUS의 ADDRESS는 단방향 출력이라서, 어떤 상황이 되든 본체의 ADDRESS(주로 Z80이 생성)를 알 수 있습니다.

근데 DATA는 이 버퍼칩이 disable되면 본체 외부와 연결이 끊어지기 때문에 R/W가 모두 불가능해요.


SLT-X V1 때에는 이 구조를 해결할 방법을 못 찾아서 대우 기종에서는 Manager ROM을 구동할 수 없었어요.

그냥 이걸 끄고 그냥 값비싼(?) 확장슬롯으로 썼습니다.

참고로 V1은 모듈식으로 합체하는 방식이라서, 보드 두개를 합체하면 4-SLOT으로 쓸 수 있어요.

궁금하시면 옛날 글을 찾아보시고~ㅎ


어느날 아이디어가 하나 떠올랐습니다.

Boot-ROM을 X-II의 메인램(SLOT 0-2)에 로딩하면 다른 외부슬롯(SLT-X)의 Extension 프로그램보다 먼저 실행할 수 있겠더라구요.

근데, 본체 내부의 램에 Boot-ROM을 로딩해주는 놈(!)은 어디서 구해야할까요? ㅎ.ㅎ


긴 설명 나갑니다 ㄷㄷㄷ

MSX1은 Main BIOS에서 램 슬롯 검색, WORKAREA 초기화 등 기본 설정이 완료되면,

각 슬롯의 Extention 프로그램을 찾아다니게 됩니다.

이 프로그램들은 INIT만으로 끝나는 경우도 있고, CALL 명령 확장으로 등록되거나, BASIC 프로그램으로 등록되거나 그렇죠.


근데 MSX2로 넘어오면서 한가지 문제가 발생합니다.

Main BIOS 용량이 32KB(page 0,1)에 가득차있으니, 늘어난 BIOS 코드를 어딘가에 넣어야하는데요.

이걸 Sub BIOS (SUB-ROM, EXT-ROM 등으로 불립니다) 16KB(page 1)으로 만들어서 어딘가 다른 슬롯에 넣기로 한거죠.

그러니까 SLOT 0 (또는 SLOT 0-0)가 아닌 다른 슬롯에 넣고, Main BIOS에서는 이걸 찾아서 시스템에 등록/실행하기로 한거죠.

검색할 때는 프로그램의 ID를 체크합니다. 일반 프로그램은 ID가 "AB"이지만, Sub BIOS는 ID가 "CD"로 되어있어요.


여기서 한가지 재밌는 부분이 있는데요.

Sub BIOS를 하나만 찾는게 아니라, 모든 슬롯을 다 찾아서 등록합니다.

그러니까 MSX2를 설계할 때 굉장히 멀리 내다본거죠.

코드 사이즈가 늘어나서 BIOS를 넣을 공간이 부족하면 여러개의 슬롯으로 나눠서 쓴다거나,

외부 슬롯에 Sub BIOS를 추가한다거나 이런 것들이 가능해집니다.


결국 Boot-ROM을 Sub BIOS처럼 구동하도록 만들면

부팅 초기에 외부 슬롯(SLOT 1,2,3)에서 Boot-ROM을 실행하도록 만들 수 있겠죠?

SLT-X를 어떤 슬롯에 꽂아놓든 Boot-ROM은 그 슬롯의 서브슬롯 0에서 구동된다는 얘기입니다.

X-II의 후면 슬롯에 꽂았다면, SLOT 3-0에서 Boot-ROM이 실행되는 것이죠.

물론 이 Boot-ROM이 진짜 Sub BIOS처럼 시스템에 뭔가 등록하진 않습니다 ㅎ.ㅎ


요약하면,

대우 MSX2 기종에서는 Boot-ROM이 Sub BIOS처럼 실행이 됨.

Boot-ROM의 메인 코드는 메인램(SLOT 0-2 page 2)로 복사되어, 추후 Extension 프로그램으로 검색되어 실행됨.



2) Boot-ROM의 역할


구버전 V1에서는 SLT-X의 각 서브슬롯의 슬롯 번호 매핑, 예약핀(RSV_5/15)의 라우팅(본체쪽으로 신호를 역출력 가능)

등의 많은 기능이 들어있습니다.

그 때문에 가장 먼저(SLOT 0-0 page 2) 구동이 되어야하는 프로그램이었죠.

Boot-ROM도 비슷한 이유로 먼저 실행되서 설정을 해주는 기능을 갖고 있습니다.


하는 일은 대충 이렇습니다.

- 각 서브슬롯의 모드 설정 

  처음 전원이 켜지면 SLT-X는 본체에서 확장슬롯으로 인식이 되지않지만,

  Boot-ROM에서 설정이 완료되어야만, 확장슬롯으로 동작가능한 상태가 됩니다.


- 서브슬롯에 장착된 주변기기 목록 표시

  주변기기 중에서 부팅 시, 아무 정보를 표시하지않는 경우에 유용하게 쓸 수 있습니다.

  메인램의 슬롯도 확인가능합니다.


- 서브슬롯의 주변기기 중 초기 설정이 필요한 경우, 대신 설정함

  현재까지는 paraMSX-R의 메모리 전용모드(2048KB RAM mode)만 들어있습니다.

  커스텀 MusicROM과 FMPAC의 OPLL I/O를 조합하는 경우도 생각해봤는데, 실제 활용성이 없어서 이건 안넣었네요.

  XII-V(X-II 전용 LED 비주얼라이저)의 패턴 설정을 넣을까 고민중입니다. 아마 이건 들어갈 것 같아요 ㅎ.ㅎ


- CPC-400에서 MSX 부트로고 표시

  VDP 버전에 따른 MSX 로고를 표시합니다.

  순정본체의 V9938에서는 스크롤업 로고, 개조된 본체의 V9958에서는 좌우 스크롤합체 로고가 표시됩니다.



3) Boot-ROM의 종료


Boot-ROM의 실행도 복잡했지만, 종료도 만만하지 않습니다요.

Boot-ROM이 실행된 후 SLT-X를 바로 확장슬롯 모드로 전환하게 되면,

Main BIOS에서는 존재하지 않는 Boot-ROM의 CALL 엔트리, BASIC 엔트리를 읽어서 등록합니다 ㄷㄷㄷ

이 때문에 ADDRESS가 FFFFH로 등록되어서 부팅할 때 에러가 나면서 뻗습니다요 ㅎ.ㅎ


결국 Main BIOS에서 Page 2 프로그램의 BASIC 엔트리 8008H, 8009H를 읽을 때까지는,

Boot-ROM이 정상적으로 액세스 가능해야합니다.

해당 엔트리는 Boot-ROM에서 0000H으로 지정되어있습니다. 참고로 주소가 0이면 시스템에 등록안됩니다요.


암튼 Main BIOS의 이 지점을 통과하는 순간 재빨리 Boot-ROM을 끕니다.

그 후, Main BIOS는 다음 슬롯(예 SLOT 0-1 page1,2)를 검색하는데, 이 때 Boot-ROM으로 인한 BUS충돌을 막을 수 있어요.



.

.

.


Boot-ROM의 설명은 여기까지입니다.

아마 제대로 읽으셨다면 의문이 드실겁니다요 ㅎ.ㅎ


만약 내가 쓰는 본체는 SLOT 0가 DATA BUS 버퍼칩으로 분리되어있는데,

대우기종이 아니라서 SLOT 0-2에 램에 없다면 어떻게 되나요?

-> Boot-ROM 구동이 불가능합니다.

   어떻게든 SLOT 0-x에서 먼저 실행이 되어야 SLT-X 설정을 할 수 있는데, 이게 불가능 하니까 사용불가에요.


사용불가라면 SLT-X를 못 쓰는건가요?

-> Boot-ROM을 해제하는 기능이 있습니다.

   SLT-X 보드 아랫쪽에 Boot-ROM ON/OFF 스위치를 OFF에 놓으면 일반 확장 8-SLOT으로 동작합니다.

   이 때는 SLTX.COM 프로그램의 기본슬롯 전환 기능만 쓸 수 있어요. (사실, 이것만 써도 충분히 훌륭합니다. 응?ㅋ)


Boot-ROM 해제 스위치는 아래 사진을 참고하세요.





아래는 저의 X-II에서 부팅중인 모습입니다.

위에서 설명드린 것처럼 Boot-ROM이 SLOT 0-2에서 실행되는 것을 볼 수 있죠?





MSX 로고가 나오는 모습은 짧게 영상으로 찍었습니다.

순정 X-II에서 구동 시, MSX2 로고~





V9958로 개조된 X-II에서 구동 시, MSX2+ 로고~

PDP를 폰으로 찍은거라서 좀 이상하게 보이는데, 실제로는 화면 잘 나와욤.





근데, 로고가 없는걸 선호하시는 분도 계시겠죠?

SLTX.COM 프로그램으로 로고를 끌 수 있습니다. 참고하세요!



그럼 다음편에서 뵙겠습니다요~ ㅎ.ㅎ/


PS. 글자가 많아서 오타도 꽤 있을 것 같은데 대충 보셔욤


SLT-X V2 제작 #4 - RSV_5 어댑터

먼저 저의 주변기기는 기본적으로 아래의 상태입니다.

- SLT-X는 GT의 후면슬롯(SLOT 2)에 연결

- GT의 SLOT 1 신호(/SLTSL)는 SLOT 2의 16번핀(RSV_16)으로 출력개조

- GT의 SLOT 2 신호(/SLTSL)는 SLOT 1의 16번핀(RSV_16)으로 출력개조

- GT의 SLOT 0-1 신호(/SLTSL)는 SLOT 1/2의 5번핀(RSV_5)로 출력개조


SLT-X에서 대부분 사용 시나리오는 SLOT A,B를 SLOT 1,2로 구동하는건데요.

그러면 남아있는 본체의 상단슬롯은 RSV_5핀에 연결된 SLOT 0-1 신호 하나가 남습니다.

이 슬롯에서 카트리지를 꽂으려면, 결국 5번핀을 4번핀(/SLTSL)으로 전달해주는 방법이 필요합니다.


예전에는 PAC-V Red의 PCB를 개조해서 사용했었는데요.

이런 개조가 늘 가능한 건 아니라는게 문제더라구요...ㅎ.ㅎ


슬롯의 예약핀 5번(RSV_5), 16번(RSV_16)은 쓰이지 않는 핀이기 때문에,

대부분의 카트리지에서는 에지커넥터에 해당 핀이 존재하지 않습니다ㅋ

에지커넥터를 금도금(Hard gold)하는데 비용이 많이 들어가기 때문에, 안쓰는 핀은 없애면 좋겠죠.

사실 PAC-V Blue 때에도 안쓰는 핀을 다 뺐습니다ㅋ


그래서, 어댑터 보드를 하나 만들어봤습니다.




높이가 15mm 정도인 작은 PCB입니다.

본체 슬롯에서 나오는 5번핀(RSV_5)을 4번핀(/SLTSL)으로 연결해주는 역할만 합니다.


GT의 상단슬롯에 꽂으면 이런 모습이 됩니다요.




손으로 집어서 빼는 모습은 이렇게~




그리고, 어댑터 보드를 일반 카트리지에 연결하면 이런 모습이 됩니다.

카트리지의 높이가 20mm 정도 커지네요 ㅎ.ㅎ




상단슬롯에 어댑터 보드를 이용해서 PAC-V Blue를 꽂아보면 이렇게 최종 환경이 완성!!





그럼 다음편에서 뵙겠습니다요~ ㅎ.ㅎ/


2023년 2월 4일 토요일

SLT-X V2 제작 #3 - 다양한 사용 시나리오

확장슬롯을 쓰다보면 여러가지 구동환경을 맞추는 경우가 생기게 됩니다.

제는 주변기기를 만들면서 기본슬롯/확장슬롯에서 테스트하는 경우도 꽤 발생합니다.

주변기기가 많으면 슬롯에 꽂았다뺐다...작업이 많이 번거롭죠 ㅎ.ㅎ


이제, SLT-X V2를 S/W(software)만으로 설정할 수 있는 방법을 소개해봅니다.

SLT-X V2가 V1의 미니멀 버전이긴 하지만, 필수기능은 모두 들어있습니다. (저렴이 버전이 아님요ㅋ)


그리고, 앞으로 SLT-X V2는 그냥 SLT-X로 표기하겠습니다.



먼저 저의 주변기기는 기본적으로 아래의 상태입니다.

- SLT-X는 GT의 후면슬롯(SLOT 2)에 연결

- GT의 SLOT 1 신호(/SLTSL)는 SLOT 2의 16번핀(RSV_16)으로 출력개조

- GT의 SLOT 2 신호(/SLTSL)는 SLOT 1의 16번핀(RSV_16)으로 출력개조

- GT의 SLOT 0-1 신호(/SLTSL)는 SLOT 1/2의 5번핀(RSV_5)로 출력개조


GT 본체의 상단슬롯(SLOT 1)은 비워둔 상태이구요.

SLT-X의 각 서브슬롯에는 아래 사진의 기기들이 장착되어있습니다.





1) 기본모드 = 확장슬롯 x 2


SLT-X의 슬롯신호 스위치는 [상]에 놓았습니다.

[상] SLOT A:RSV_16핀 + SLOT B:/SLTSL


평상시에는 이렇게 확장슬롯 2개를 연결한 것처럼 사용합니다.


SLOT B-3 (SLOT 2-3) = RS-232C

SLOT B-2 (SLOT 2-2) = NeoTron

SLOT B-1 (SLOT 2-1) = MoonBase + MoonSound

SLOT B-0 (SLOT 2-0) = MMC/SD Drive V4


SLOT A-3 (SLOT 1-3) = paraMSX-R (2048KB RAM mode)

SLOT A-2 (SLOT 1-2) = FontPack V2

SLOT A-1 (SLOT 1-1) = MPX R1.1

SLOT A-0 (SLOT 1-0) = T-Wave


부팅하면 아래처럼 잡다 메시지를 볼 수 있네요.





이 상태에서 SLT-X의 슬롯신호 스위치를 [하]에 놓는다면?

[하] SLOT A:/SLTSL   + SLOT B:RSV_16핀

SLOT 1-x와 2-x가 서로 바뀌게 됩니다.


SCC-I 사운드는 SLOT A-0의 T-Wave, SLOT B-0의 MMC/SD V4 두 기기에 들어있습니다.

만약 슬롯 순서를 바꾸게 되면, SCC-I를 사용하는 프로그램에서 우선순위를 바꿀 수 있습니다.

보통 빠른 슬롯부터 검색하니까요.



2) 본체 상단슬롯(SLOT 1)을 사용 시


기본슬롯에서만 동작하는 카트리지의 경우는 본체의 상단슬롯을 써야하는데요.

이미 SLOT 1-x가 SLT-X에서 사용되고 있으니, 이 상태에서 본체 상단슬롯에 뭔가를 꽂으면 기기가 충돌하겠죠?


SLT-X 쪽의 슬롯신호 스위치를 [중]으로 변경합니다.

[중] SLOT A:/SLTSL   + SLOT B:RSV_5핀


그러면 각 서브슬롯은 아래처럼 되겠네요.


SLOT B-3 (I/O SLOT) = RS-232C

SLOT B-2 (I/O SLOT) = NeoTron

SLOT B-1 (I/O SLOT) = MoonBase + MoonSound

SLOT B-0 (SLOT 0-1) = MMC/SD Drive V4


SLOT A-3 (SLOT 2-3) = paraMSX-R (2048KB RAM mode)

SLOT A-2 (SLOT 2-2) = FontPack V2

SLOT A-1 (SLOT 2-1) = MPX R1.1

SLOT A-0 (SLOT 2-0) = T-Wave





이젠 본체의 상단슬롯(SLOT 1)을 마음대로 사용할 수 있겠네요! ㅎ.ㅎ



3) 특정 서브슬롯을 기본슬롯으로 변경


가끔은 SLT-X에 꽂아둔 주변기기를 기본슬롯에서 써야하는 경우가 발생합니다.

제가 만든 기기 중에서는 paraMSX-R과 MMC/SD Drive V4가 해당되네요.


- paraMSX-R

  이 카트리지의 원래 목적인 머신 에뮬레이터로 사용하려면, 기본슬롯에 꽂아야합니다.

  현재는 서브슬롯(SLOT A-3)에 꽂혀있어서 서브기능인 2048KB 메모리 모드로 사용하고 있습니다.


SLT-X에서는 SLOT A-3을 기본슬롯으로 바꾸고 나머지 A-x를 I/O SLOT으로 변경할 수 있어요.

이 때 SLT-X 본체의 슬롯신호 스위치는 기본위치 [상]에 그대로 둡니다.

[상] SLOT A:RSV_16핀 + SLOT B:/SLTSL


SLTX.COM 프로그램으로 슬롯 설정을 바꿔보아요~




/A 및 /B 옵션으로 SLOT A,B의 설정을 바꿀 수 있는데요.

paraMSX-R이 꽂혀진 SLOT A-3을 기본슬롯으로 설정하려면, /A3 옵션을 쓰면 되겠습니다.

아래처럼 바뀐 설정이 표시되네요. 이 상태에서 본체의 RESET 버튼으로 재부팅합니다.




재부팅하면 아래처럼 나오게 됩니다.




SLTX.COM 프로그램으로 설정한 슬롯 상태는 전원이 꺼질 때까지 유효합니다.

본체의 RESET 버튼을 누르거나, 소프트 리셋(MainROM 재부팅)하더라도 유지됩니다.


원래의 확장슬롯 설정으로 되돌리기 위해서는...

본체의 전원을 껐다켜거나, SLTX.COM에서 /A+ /B+ 옵션을 사용하면 되겠습니다.

그리고, /A- /B- 옵션으로 모든 서브슬롯을 I/O SLOT으로 바꿀 수 있으니 참고하시구요~


- MMC/SD Drive V4

  주변기기가 별로 없는 환경에서 쓸 수 있도록, 기본슬롯에 꽂으면 내부 서브슬롯에 부가기능이 들어갑니다.

  SUB0 = MMC/SD Drive V4

  SUB1 = Kanji DRV

  SUB2 = BASIC'n v2.1

  SUB3 = 512KB RAM mapper

  V4의 기본기능은 SUB0로 들어있으니까, 확장슬롯에 꽂으면 보통 이 기능만 쓴다고 보시면 되겠습니다.


그럼, SLOT B-0를 기본슬롯으로 바꿔서 구동해보아요~

SLTX.COM에서 /B0 옵션을 쓰면 되겠네요.




재부팅하면 아래처럼 나오게 됩니다.

SLOT 2-2에서 MMC/SD V4에 내장된 BASIC'n이 나오는군요.




MMC/SD V4에 내장된 메모리매퍼 512KB는 SLOT 2-3에서 확인됩니다.





글로 적다보니 설명이 길었는데요, 실제로 해보시면 쉽습니다.

진짜 사용법을 간단하게 하려고 머리를 쥐어뜯으며 만들었어요. (안그러면 매뉴얼을 또 써야하니까...ㅋ)



그럼 다음편에서 뵙겠습니다요~ ㅎ.ㅎ/