2010년 5월 4일 화요일

[강좌] 02. MSX의 주변기기 I/O

I/O라는 말을 처음 들어보셨나요?

I/O는 Input/Output의 준말로 CPU와 주변 기기와의 입출력의 의미합니다.

참고로, 자주 쓰는 말인 'BIOS'의 IO도 Input Output을 의미하고 있습니다.



만약 컴퓨터에 CPU와 ROM/RAM만 달려있으면, 별로 쓸만한 기기가 못되겠죠?

뭔가 사용자로 부터 입력(키보드/조이스틱 등)도 받고,

결과를 출력(모니터/프린터 등)도 하는 방법이 있어야겠습니다.

사운드를 듣고 싶다면 PSG 등의 사운드 칩을 제어할 수 있는 방법이 있어야하겠지요.



Z80 CPU와 주변 장치를 제어할 수 있는 방법은 크게 두가지가 있습니다.

Memory Mapped IO와 IO Mapped IO 인데요.



메모리맵 방식은 CPU가 보기엔 RAM 같은 메모리에 값을 읽기/쓰기를 하는 것 처럼 보이지만,

실제로는 주변 장치에 데이터를 입력/출력하는 방법입니다.



IO맵 방식은 CPU에서 주변기기 입출력을 위해 만들어진 별도의 명령으로,

데이터를 입력/출력하는 방법입니다.



MSX에서는 메모리를 슬롯이라는 것으로 여러개의 공간으로 관리한다고 그랬었죠?

메모리맵 방식의 IO를 쓸때는 특정 슬롯에 RAM 같은 메모리 아닌,

HW 기기를 연결하고 CPU의 /MERQ, /RD, /WR 신호에 맞춰 동작하게 구성합니다.

참고로 CPU의 /MERQ는 메모리 액세스 요청, /RD는 읽기 신호, /WR은 쓰기 신호입니다.



IO맵 방식의 IO를 쓸때는 슬롯의 메모리 공간과는 별도로,

특정 IO 주소에 HW 기기를 연결하고 CPU의 /IORQ, /RD, /WR 신호에 맞춰 동작하게 구성합니다.

참고로 CPU의 /IORQ는 IO 액세스 요청하는 신호입니다.



기억하실 부분은...

Z80 CPU에서 메모리 R/W와 IO R/W 관련된 명령이 따로 존재한다는 것.

MSX에서 메모리는 슬롯으로 관리되니까,

같은 주소에 메모리맵 IO를 만들더라도 선택된 슬롯에만 실제 IO가 이루어집니다.

IO맵 IO는 슬롯 상관없이 주소만 맞으면, IO가 이루어집니다.

만약 같은 주소의 IO맵 IO를 쓰는 기기를 2개가 연결되었다면 동시에 동작하게 됩니다.



그럼, 실제로 메모리맵 또는 IO맵 방식 사용시, 어떤 장단점이 있을까요?



장점을 먼저 생각해보면,



메모리맵 IO는 컨트롤 주소가 같은 기기를 여러개 쓰더라도,

슬롯 선택을 먼저 해야되니까 개별로 동작시키는 것이 가능합니다.

예)FDD 같은 디스크 장치는 기본적으로 메모리맵 IO방식입니다.

   여러개를 연결했을때 개별로 동작이 가능해야되니까요.

   코나미 메가롬팩 등의 카트리지 내에도 뱅킹을 위한 IO가 들어있습니다.

   그냥 롬 영역을 읽을 때는 롬의 코드가 읽혀지지만,

   IO 영역에 데이터를 쓰면 8KB 단위 등으로 페이지가 바뀌는 것이지요.

   물론, 해당 주소의 롬 데이터가 바뀌지는 않습니다.



IO맵 IO는 슬롯 선택에 관한 메모리 제한이 없으니, 쉽게 SW로 컨트롤이 가능합니다.

예)키보드, VDP, PSG 등의 경우가 대표적이죠.

  SW 구동 환경이 DOS이거나 BASIC이거나 32KB롬팩이거나 FDD의 디스크롬 상관없이,

  쉽게 키보드의 눌러진 키를 확인하거나 화면의 글자색을 바꾸는 것들을 할 수 있습니다.



그럼, 단점은 뭘까요? 각각의 장점이 서로의 단점이 됩니다. ^^



메모리맵 IO의 경우는 해당 기기가 장착된 슬롯으로 먼저 전환해야만 액세스가 가능하니까,

SW를 만들때 좀 복잡해지는 경우가 많습니다.

같은 기기가 몇개나 장착되어 있는지, 해당 기기는 메모리의 어떤 PAGE에서만 구동이 되는지 등등

인터럽트 또는 BIOS 구동시 제약은 없는지 상당히 고려를 해야합니다.

예) 도스에서 DIR C: 라고 명령했을때,

    해당 드라이브는 누구의 디스크 인터페이스가 처리하는지,

    그 인터페이스는 어느 슬롯에 있는지 미리 다 알고 있어야 하겠죠?

    김준성님의 MPX 카트리지도 메모리맵 IO방식이라서,

    저의 MPXP 프로그램을 구동하면 먼저 MPX가 어느 슬롯에 존재하는지 검색하게됩니다.



IO맵 IO의 경우는 같은 IO 주소에 한개의 기기(물론 예외도 있습니다)만 존재해야합니다.

예) FM 사운드 칩의 경우, FM-PAC, MSX-AUDIO, MOON-SOUND, turboR PCM, PPI 1BIT Sound 등

    MSX에서 여러가지 사운드를 쓸수 있는데요. 모두 주소가 다릅니다.

    MOON-SOUND의 경우 비교적 레어 기기인 MSX-AUDIO를 대체하기 위해서 같은 주소를 쓰지만,

    이 경우엔 두개의 사운드 기기를 동시에 사용하는 것은 불가능합니다.


    

이런 각각의 장단점으로 있으니 대개 주변기기 구현시는 아래 사항이 고려되겠지요.

자주 액세스가 필요하고 슬롯같은 메모리 제한을 받지않고 쉽게 액세스 가능해야되지만,

시스템에는 하나만 있으면 충분한 기기의 경우는 IO맵 IO를 쓰게 됩니다.

예) 키보드, VDP의 경우 왠만한 SW는 자주 컨트롤할 필요성이 높죠?

    하지만 컴퓨터에는 하나만 있으면 충분한 경우입니다.

반대로 여러개의 기기를 동시에 사용가능해야 하는 경우는,

컨트롤시 메모리의 슬롯 제한이나 여러가지 불편하더라도 메모리맵 IO방식을 쓰게 됩니다.



그 외, 메모리맵 방식은 특성상 IO 메모리 영역을 비교적 넓게 쓸수 있지만,

이건 HW 만들기 나름이라 IO맵 IO방식도 가능합니다.

예) V9938 칩은 IO맵 IO방식으로 만들어져 있는데, (몇개의 Port로만 컨트롤합니다.)

   128KB의 VRAM을 R/W 가능하도록 되어있습니다.



그럼 실제로는 어떤 명령어를 써야 하는지 보겠습니다.



-메모리맵 방식으로 B000H 주소에 'K'를 출력하는 경우.

(참고로 'K'는 ASCII 코드로 문자 A의 값을 의미합니다.)



어셈블리의 경우,

LD A,'K' ; CPU 레지스터 A에 'K'문자 값을 넣음.

LD (0B000H),A ; 메모리 주소 B000H에 레지스터 A의 내용을 출력.



BASIC의 경우,

A = ASC("K") ; A 변수에 'K'문자 값을 넣음.

POKE &HB000,A ; 메모리 주소 B000H에 변수 A의 내용을 출력.



너무 간단한가요? ㅋ

물론, 주소에 데이터를 출력하기 전에 해당 슬롯이 전환되어 있어야합니다.



-IO맵 방식으로 20H 주소에 'K'를 출력하는 경우.

(참고로, 원래 Z80은 IO맵 IO 사용시 16비트 주소를 쓸 수 있지만, MSX는 하위 8비트만 사용합니다.)



어셈블리의 경우,

LD A,'K' ; CPU 레지스터 A에 'K'문자 값을 넣음.

OUT (020H),A ; IO 주소 20H에 레지스터 A의 내용을 출력.



BASIC의 경우,

A = ASC("K") ; A 변수에 'K'문자 값을 넣음.

OUT &H20,A ; IO 주소 B000H에 변수 A의 내용을 출력.



어셈블리/BASIC 명령어가 거의 똑같죠?

근데, 코드가 별로 가슴에 와닿지 않죠? ^^



자~ 그럼, 실제 MSX에 존재하는 하드웨어를 제어해봅시다.

키보드를 보면 대문자 선택을 나타내는 CAPS LED가 있죠?

MSX의 기본 인터럽트 서비스 루틴(보통 ISR이라고 합니다)이 동작하는 동안에는,

메인 BIOS가 키의 상태를 주기적으로 스캔해서 저장해놓는데요,

이 때 CAPS LOCK 키가 눌러지면 CAPS LED를 켜고 끄는 일도 합니다.

이걸 수동으로 한번 해보는거에요.



그냥 LED만 켜고 끄면 재미없으니, PPI의 1BIT 사운드를 같이 ON/OFF하면서 소리도 들어봅시다.

MSX의 키보드와 1BIT 사운드 하드웨어는 8255라는 병렬 포트 칩으로 컨트롤하게 되어있습니다.

회로도를 보면서 설명해도 좋겠습니다만, 일단 실습부터 해보죠.



여기서 8255는 IO맵 방식으로 컨트롤하는데 AAH 주소에 값을 쓰게 되면,

키보드 신호 셀렉트, CAPS LED, 1BIT SOUND, 카세트 출력을 한번에 조작할 수 있습니다.

데이터는 아래처럼 사용할 수 있는데요.

비트0-3: 키보드 매트릭스의 ROW 선택

비트4: 카세트 모터 0:ON, 1:OFF

비트5: 카세트 출력 0:LOW, 1:HIGH

비트6: CAPS LED 0:ON, 1:OFF

비트7: 1BIT 사운드 출력 0:LOW, 1:HIGH



여기서 비트7,6을 한번에 바꿔서, 사운드 출력 주파수에 맞춰 LED가 반짝이도록 합니다.

카세트 포트도 바꿔주면 카세트 출력도 함께되겠지만 일단 비트7,6만 바꿔봅니다.

BASIC에서 아래 프로그램을 실행해보세요.



10 FOR L=0 TO 20

20 OUT &HAA,&B00110000

30 FOR I=0 TO L:NEXT

40 OUT &HAA,&B11110000

50 FOR I=0 TO L:NEXT

60 NEXT:GOTO 10



터보알 고속모드에서는 10 FOR L=0 TO 70 으로 하고 실행해보세요.

쀼~웅~ 소리와 함께 CAPS LED가 반짝이는 것을 볼수 있습니다.


위의 예처럼 간단한 하드웨어는, IO맵 방식으로 만들면 쉽게 조작할수 있습니다.

하지만 주소 공간이 256개 뿐이라 MSX에서는 이미 많은 주소가 할당(예약)되어 있지요.

궁금하신 분은 아래 싸이트에서 IO맵을 확인할 수 있습니다.

http://map.grauw.nl/resources/msx_io_ports.php



메모리맵 IO는 선택된 슬롯에서만 동작하니까, 다른 기기의 IO 주소가 겹칠수가 없겠죠.

MPXP 같은 메모리맵 IO로 된 기기를 두개를 장착하면,

두개의 MP3 파일을 동시에 소리나게 할수도 있겠습니다.


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번이 연결되어있네요. ㅜ.ㅜ

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

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