2010년 4월 27일 화요일

[강좌] 01. MSX의 슬롯과 메모리 공간

슬롯이라고 얘기하면, 보통 롬팩 꽂는 부분을 떠올리는데요.

여기서는 좀 더 MSX적인 개념의 슬롯(SLOT)을 설명하려고 합니다.



먼저 슬롯을 설명하기 전에 Z80 CPU와 MSX 컴퓨터의 기본 구조를 아셔야하는데요.

(왠지 설명이 길어질듯 한 예감이... ㅎ.ㅎ;)



Z80 CPU는 어드레스 버스가 16BIT이고 데이터 버스는 8BIT로 이루어져있습니다.

결국 0000H~FFFFH 총 64KB 영역의 메모리 공간을 액세스할수 있고,

데이터는 1Byte씩 Read/Write 하도록 되어 있습니다.

(참고로 0000H는 16진수 0000을 의미합니다.)

하지만 마냥 빈 메모리와 CPU을 연결하는 것만으로는 컴퓨터로 사용할수가 없습니다.

SW가 있어야 하는 것이겠죠.



컴퓨터가 부팅되려면 부트로더 같은 프로그램이 필요합니다.

사용자의 프로그램을 외부 저장 장치(디스크, EPROM 등)에서 로딩할수 있는

기본 프로그램이 있어야하는 것이지요.



윈도 PC에서도 맨처음 전원을 켜면 롬바이오스가 구동되면서,

메모리, 그래픽 카드, HDD 등을 테스트하고,

최종적으로 HDD 부트 파티션의 부트 프로그램을 읽어서 실행하는 것을 볼수가 있죠.



이 역할을 MSX에서는 메인 BIOS가 해줍니다.

MSX를 맨 처음 켜면 CPU 어드레스 0000H~3FFFH에 매핑되도록 HW가 만들어져있습니다.

참고로 Z80은 리셋되면 어드레스 0000H부터 기계어 코드가 실행됩니다.

그 때문에 BIOS가 0000H~3FFFH로 매핑되는 것이죠.



자~ 이제 슬롯 설명 들어갑니다. 눈 크게 뜨세요. ㅋ

조금 전에 메인 BIOS가 0000H~3FFFH 주소에 매핑된다고 썼는데요.

이 '매핑'이라는게 뭘까요?



CPU의 주소공간 64KBytes에서 실시간으로 여러개의 프로그램을 전환하면서

구동할수 있도록 만든 규격이 슬롯(SLOT)이라는 것입니다.

보통 뱅킹(Banking)라고 부르는 것이 MSX의 슬롯과 비슷한 개념입니다.

(Banking이 생소하게 들린다면 그냥 Pass 하시고~)



MSX에서는 총 16개의 슬롯이 존재합니다.

각 슬롯은 CPU 주소 공간 0000H~FFFEH 까지 64KBytes를 쓸 수 있습니다.

(FFFFH의 1Byte 메모리는 나중에 설명 나올겁니다요~)

여기서 어떤 매핑이라는 과정을 통해, 16개의 서로 다른 프로그램으로 전환하는데,

이 매핑을 슬롯 전환이라고 합니다.

당연한 것이지만, 슬롯 전환하기 전에 각 슬롯에는 SW가 존재해야 되겠죠?



해당 슬롯이 DRAM 같은 쓰기 가능한 메모리가 있다면,

부팅후 외부 기기에서 SW를 로딩할수가 있습니다.

만약 ROM으로 된 SW(롬팩)라면 슬롯에 꽂는 것 만으로 로딩이 끝납니다.



MSX 전원이 켜진 직후에는 BIOS의 슬롯이 최초 선택되어 실행이 됩니다.

그러면, BIOS 프로그램이 각 슬롯에 프로그램이 있는지, 램이 있는지...

램이라면 크기는 얼마인지 주욱 체크를 하게 되지요.

그리고 프로그램이 있는 슬롯은 초기화 루틴이 각각 실행되게 됩니다.



총 16개의 슬롯이 있다고 했는데요.

각 슬롯의 이름은 0번 부터 15번으로 된게 아니라,

슬롯0-0, 0-1, 0-2, 0-3, 1-0, 1-1, ... , 3-2, 3-3 이런식으로 되어있습니다.

(슬롯0.0, 0.1, ... , 3.2, 3.3 또는 슬롯00, 01, ... , 32, 33 이렇게도 씁니다.)

두자리 숫자 중 왼쪽은 '기본슬롯', 오른쪽은 '확장슬롯'을 나타내는데요.

일단은 그냥 외우세요. 확장슬롯은 조금 후에 설명드릴께요.

암튼 프로그램이 실행되는 슬롯은 총 16개라고만 이해하시면 됩니다. ^^



여기서 슬롯0(또는 슬롯0-0)에는 메인 BIOS가 들어가게 되고요.

나머지 슬롯은 순서 상관없이 프로그램이 들어가면 됩니다.

참고로, 디스크 드라이브의 롬은 초기화 순서에 따라 드라이브 명이 결정됩니다.



부팅 후, 메인 BIOS가 램 슬롯을 인식하고,

각 슬롯의 프로그램 초기화(INIT) 루틴을 실행한 후에는 BASIC 모드로 가게 됩니다.

이게 일반적인 경우이고요.



게임팩을 꽂을 경우는, 대게 초기화 루틴에서 바로 게임 SW가 실행되도록 되어있어서.

FDD같은 기기가 연결되어 있더라도 인식이 안되는 경우가 많습니다.



그럼 슬롯 전환 되면서 각 슬롯의 SW가 어떻게 구동이 될까요.

일단 간단하게 생각을 해보죠.

첫 부팅시, 슬롯 상태는 메인 BIOS가 차지하고 있습니다.

이 BIOS가 각 슬롯의 프로그램과 메모리를 확인한다고 했죠?



예를 들어 슬롯0의 BIOS 프로그램이 슬롯1을 확인하려면?

슬롯 전환을 해야하는데, 슬롯이라는게 CPU의 메모리 공간을 의미하니까...

64KBytes 전체 주소가 몽땅 다른 슬롯으로 바뀌면

현재 실행중인 프로그램은 어떻게 되는걸까요?

만약 CPU의 PC(Program Counter: 실행중인 CPU 주소)가 슬롯0의 2000H인데,

슬롯1의 2000H에는 어떤 코드가 들어있을지 모르겠죠?

당연히 슬롯이 0->1로 전환되면 프로그램이 제대로 실행이 안됩니다.



그래서, 뭔가 다른 구조가 더 필요한데요.

MSX에서는 CPU 메모리 공간(64KBytes)을 4조각(16KBytes)으로 나누어서,

슬롯 전환을 하도록 했습니다. 그러니까 16KBytes만큼만 슬롯 전환이 된다는 말이죠.

여기서 페이지(PAGE)라는 말을 쓰게 되는데요.

페이지는 16KBytes 크기의 영역을 의미하고, 각 페이지는 아래처럼 정의되어 있습니다.

 페이지0: 0000H~3FFFH

 페이지1: 4000H~7FFFH

 페이지2: 8000H~BFFFH

 페이지3: C000H~FFFFH



뭔가 감이 오시나요?

좀 전에 CPU 메모리 공간이 몽땅 슬롯 전환이 되면,

실행중인 프로그램은 처리가 곤란하지만, 메모리를 쪼개면 가능하게 됩니다.



MSX의 메인 BIOS는 슬롯0에 있는 16KBytes 프로그램인데요,

첫 부팅시는 페이지0,1,2,3이 모두 슬롯0이 됩니다.

하지만 BIOS 초기화 프로그램이 수행되면서,

먼저 페이지2,3을 RAM이 존재하는 슬롯으로 전환하고,

페이지1은 각 슬롯으로 전환되면서 해당 SW의 초기화 루틴이 실행됩니다. 

만약 슬롯1의 프로그램이 초기화 될때는 아래 처럼 슬롯 전환이 되겠지요.

램은 슬롯3에 있는 MSX라고 가정하면...

 페이지0: 슬롯0 메인 BIOS

 페이지1: 슬롯1 프로그램

 페이지2: 슬롯3 RAM

 페이지3: 슬롯3 RAM

(만약 16KB램만 내장된 저사양의 MSX1인 경우는 페이지2는 램으로 전환이 안되겠지요.)



참고로 일반적인 16KBytes(128Kb) 게임 롬팩을 슬롯1에 꽂았을 때에도,

위의 페이지의 슬롯 설정데로 똑같이 동작합니다.

대신 메인 BIOS는 슬롯1의 초기화 루틴 실행 후, 다시 복귀되지 않습니다.

롬팩게임은 프로그램 종료라는 개념이 없습니다.

(나중에 BASIC에서 시작/종료가 가능한 게임롬을 하나 만들어봅시다. ^^)



슬롯에 SW가 들어갈때엔,

메모리 주소가 4000H부터 시작해야한다는 규격이 있습니다.

MSX는 기본적으로 페이지0을 메인 BIOS로, 페이지3을 램으로 세팅하게 되어있습니다.

이때 확장 SW는 기본적으로 페이지1을 쓰도록 되어있는데,

용량이 더 필요한 경우, 페이지2 또는 0도 쓸수가 있죠.



일반적인 게임 롬팩을 예로 들면,

16KB 롬팩은 페이지1만 쓰이고, 32KB 롬팩은 페이지1,2를 씁니다.

당연히 페이지0는 BIOS, 페이지3은 RAM이고요.



참고로 슬롯의 SW는 초기화 루틴, BASIC 명령어 해석 루틴 등 규격이 정해져있습니다.

아마도 다른 강좌(?)에서 설명이 되지 않을까요. ^^



이제 MSX 슬롯과 CPU 메모리 공간에 대한 개념이 잡히시나요?

그럼, 확장 슬롯에 대해 설명드릴께요.

처음에 MSX의 슬롯은 16개가 있다고 했죠?

근데 실제 HW 구조적으로는 4개의 기본 슬롯이 먼저 존재하고,

확장 슬롯이라는 기기를 기본 슬롯에 장착하도록 되어있습니다.

여기서 확장슬롯은 최대 4개의 슬롯을 가질수 있고,

확장슬롯이 장착되면 해당 기본슬롯은 약간 의미가 없어집니다.

예를 들어 기본슬롯1에 확장슬롯 기기가 연결된다면,

그 순간 슬롯1은 없어지고, 슬롯1-0, 슬롯1-1, 슬롯1-2, 슬롯1-3이 생기는 것이지요.



이렇게 기본/확장 슬롯으로 나누어 놓으면...

슬롯이 많이 필요없는 MSX 모델을 만들때, 슬롯 전환에 쓰이는 I/O 칩을 줄일수가 있으니까

MSX 본체 제작 단가를 좀 낮출수가 있겠지요.



슬롯 전환 방법은 기본/확장슬롯에 따라 I/O가 조금 다른데 요건 다음 기회에 알려드릴께요.

기억 하실 것은, 확장 슬롯은 기본 슬롯 커넥터에만 꽂을 수 있다는 것입니다.

보통 본체에서 외부로 노출되어 있는 슬롯은 기본슬롯이라고 보시면 무방하고요.



암튼 기본 슬롯만 장착하면(대부분 MSX1의 경우),

i8255 칩 하나 만으로 4개의 기본 슬롯 처리가 가능하기 때문에 쉽게 MSX1을 만들수 있습니다.



그럼, 대우 IQ-1000(MSX1)의 슬롯 맵을 보겠습니다.



슬롯0 : 0000H~7FFFH 메인 BIOS / BASIC (32KB)

        8000H~9FFFH 한글 SW (8KB)

슬롯1 : 본체 상단 커넥터

슬롯2 : 0000H~FFFFH RAM (64KB)

슬롯3 : 본체 후면 커넥터



여기서 보면 눈치채셨겠지만,

메인 BIOS와 BASIC 인터프리터가 합해쳐서 32KB를 차지하고 있다는 것을 알수 있습니다.

BASIC 롬은 MSX 기본 내장이니까 별도 슬롯을 이용하는게 아니라,

BIOS와 함께 슬롯0에 들어가있습니다.

특이한 것은 한글 SW가 별도 슬롯이 아닌 슬롯0의 8000H~9FFFH 영역에 있다는 것인데,

이건 SW 만드는 사람 마음이겠죠.

확장슬롯을 안쓰고 여러개의 SW 구겨넣는(?) 것도 기술이라고 해야될까요? ^^



이번엔 대우 IQ-2000(MSX2)의 슬롯 맵을 한번 보겠습니다.



슬롯0-0 : 0000H~7FFFH 메인 BIOS / BASIC (32KB)

슬롯0-1 : 4000H~BFFFH 한글 SW (32KB)

슬롯0-2 : 0000H~FFFFH RAM (128KB)

슬롯0-3 : 0000H~7FFFH 확장 BIOS / BASIC (32KB)

슬롯1   : 본체 상단 커넥터

슬롯2   : 커넥터 없음

슬롯3   : 본체 후면 커넥터



슬롯0이 없고 확장된 슬롯 4개가 보이는군요.

MSX2는 MSX1에 비해 BIOS 루틴과 BASIC 명령어들이 추가되어 있습니다.

IQ-2000의 한글 루틴도 IQ-1000에 비해 많이 늘어나있는걸 볼수 있고요.

슬롯0-2에 메인 RAM 128KB가 64KB 주소 공간에 매핑되어있는데,

이건 메모리 매퍼라는 것으로 다음 강좌에서 설명드리겠습니다.


2010년 4월 11일 일요일

파라동-4SLOT #2 보드 수정

얼마전 흥건남자님이 확장슬롯 보드를 만드셨는데요.

이게 PCB 그대로는 동작이 안되서 이리저리 에러난 곳을 찾아봤습니다.

 

몇군데 회로에서 빠진 부분을 래핑선으로 때우니 제대로 동작하네요. ㅎ.ㅎ

 

아래는 동작 모습과 보드 확대 사진입니다.

 테스트로 서브슬롯2에 MMC/SD V1, 서브슬롯3에 MMC/SD V2

매퍼램 1024KB는 서브슬롯0으로 선택해보았습니다.




아래는 보드 전면 사진입니다.

왼쪽 CPLD가 확장슬롯을 처리하고, 오른쪽 CPLD는 매퍼램을 처리합니다.

오른쪽 끝의 50핀 커넥터로 MSX의 슬롯으로 연결됩니다.




회로에서 누락된 부분을 수정한 곳입니다.

(SRAM의 5V 전원, /RD, /WR 세곳입니다.)




/RD, /WR은 74LS244 입력핀으로 끌어썼고,

4.7K 풀업 저항 빠진 부분은 74HC32에 연결했습니다.




보드 후면 사진입니다.




CPLD의 누락된 /WR, /RESET을 50핀 슬롯 커넥터에서 바로 연결하고,

매퍼램용 CPLD의 D5라인을 추가로 연결했습니다.

(요게 안되서 첨에 메모리가 512KB로 나오더군요. ㅋ)




제 터보알(내장램 1024KB)에서 구동해봤습니다. (후면 슬롯에 연결)

확장슬롯2-0에 램1024KB가 인식되어 총 2048KB 램으로 표시되는군요.




MMC/SD 부팅화면에서 인식된 슬롯번호를 볼수 있습니다.




DOS2로 부팅후 CHKMEM 프로그램을 실행해봤습니다.

슬롯 3-0과 슬롯 2-0에 램이 각각 1024KB로 인식되었습니다.




주말숙제(!)는 마쳤으니, 이제 바통을 흥건남자님께 넘깁니다. ㅎ.ㅎㅋ


PS. 사진 한장 더 추가합니다.

      보드와 MSX연결에 쓰이는 50핀 커넥터(카트리지)를 기존 제가 쓰던걸로 테스트했었는데...

      흥건남자님 주신걸로는 해보니 안되더군요.

      아침에 잠깐 확인해보니, 핀13과 핀14번이 연결되어있네요. ㅜ.ㅜ

      패턴 끊고 제대로 이으니깐 잘 됩니다요.

      이제 씻고 놀러갑니다~ ㅎ.ㅎ



2010년 3월 21일 일요일

paraMSX_Linux & RS-232C - 키보드 사운드

지난번 보여드린 TV 내장의 리눅스용으로 포팅된 paraMSX 활용을 위한,

터보알의 키보드 및 사운드(PSG)를 연결해보았습니다.

 

에뮬레이터와 터보알 실기 간의 연결은 RS-232C 카트리지를 썼습니다.

속도는 115200BPS 상태이고요.

 

에뮬레이터에서 PSG Port 출력은 터보알에서 시리얼로 받아 실제 PSG을 구동하고,

반대로 터보알의 키보드 포트 입력은 시리얼로 전달해서 에뮬레이터가 동작하는 형태입니다.

 

결국 키보드와 PSG 사운드 IO만 서로간의 전송이 되고,

나머지 VDP, CPU등 대부분 기능은 에뮬레이터에서 구현됩니다.

 

아래 동작하는 영상을 한번 보세요.

사운드랑 키보드 IO를 넣으니까 에뮬 구동 속도가 좀 떨어지는군요.

 

사운드를 안쓴다면 에뮬의 CPU클럭을 높여서 고속 MSX 에뮬하는 것도 재밌을것 같네요.