sharksym's MSX World

sharksym.egloos.com

포토로그


구글 애드센스 (블로그 기본)


03. MSX의 메모리 매퍼 by sharksym

03. MSX의 메모리 매퍼

"어디선가 많이 듣던 말인데, 어떻게 동작하는건지 모르겠네~" 라고
생각하신 분을 위한 강좌입니다. ^^


일단 메모리 매퍼는,
MSX에서 쓰이는 메모리을 특정 크기로 분할해서,
HW/SW로 편리하게 쓸수 있도록 만든 기기라고 생각하시면 되겠네요.


근데, 여기서 중요한 사실 한가지가 있는데요.
일부 모델을 제외한 MSX2 이상의 본체에는 DRAM에 매퍼가 장착되어 있고,
코나미 메가롬팩 안에도 대용량 롬을 처리하기위한 매퍼가 들어가 있습니다.
둘다 메모리 매퍼라고 불러도 상관없지만,
일반적으로 MSX 에서 메인램에 연결된 것을 '메모리 매퍼'라고 부르고요,
메가롬팩이나 재미나 메가램팩 등에 들어 있는 건, '메가롬 매퍼'라고 합니다.
헷갈릴 수 있지만, 오래전(?)부터 그렇게 이름을 붙인거니 그냥 이해해주세요.
그럼, 이번 내용은 메인램에 관리하는 '메모리 매퍼'에 대한 것임을 알수 있겠죠? ^^
(메가롬 매퍼는 필요하시면, 따로 강좌를 만들겠습니다요~)


MSX의 슬롯 구조에서 64KB의 CPU 메모리 공간은 16KB 4조각으로 관리됩니다.
만약 슬롯에 메모리 최대 용량인 64KB를 모두 채우면,
기본적으로 MSX-DOS에서 모두 램으로 활용이 가능하고요. (물론, 시스템의 Work Area는 제외)
BASIC에서는 주소가 8000H~FFFFH인 Page2,3만 램으로,
Page0,1은 BIOS/BASIC인터프리터로 세팅이 되는데요.
CALL MEMINI 등의 램디스크 기능을 사용하면,
나머지 0000H~7FFFH의 32KB를 램 디스크로 모두 활용할 수 있습니다.


여기서 잠깐 Work Area의 대한 얘기도 해야겠군요.
MSX가 구동되는 동안에는, 각종 시스템 설정이 저장될 공간이 필요한데요.
이 영역을 Work Area라고 부릅니다.
주소는 FFFFH 에서부터 0000H 방향으로 내려오면서 메모리가 할당 되는데,
시스템의 중요 변수들은 미리 주소가 정해져서 할당되어 있습니다.
예를 들어, LINLEN 이라는 시스템 변수의 주소는 F3B0H 인데요,
현재 텍스트 모드의 WIDTH 값을 저장하고 있습니다.
BASIC에서 WIDTH 명령을 쓰거나, DOS에서 MODE 명령으로 수평 글자수를 바꿀수가 있는데,
이때 설정 값이 기록되어 있습니다.
만약 프로그램에서 텍스트 화면의 특정 영역을 복사 또는 스크롤 한다면,
이런 설정값을 참조해서 프로그래밍를 하면 되겠지요.


시스템 변수 이외에도, 각종 BIOS 점프 루틴(확장BIOS처리 또는 HOOK)이나
슬롯에 있는 롬SW가 사용하는 설정 값들도 Work Area에 저장됩니다.
특히 BASIC 인터프리터가 사용하는 영역도 꽤 됩니다.


그렇다면, MSX에서 메인램에 로딩할 수 있는 프로그램의 크기는,
DOS상에서 약 55KB 정도, BASIC라면 23KB 정도 되겠네요.
만약 MSX에 연결된 디스크 기기가 많거나, Work Area를 많이 쓰는 SW가 슬롯에 존재할 경우,
여유 메모리는 점점 줄어들게 됩니다.


만약 BASIC 상태에서 여러가지 커맨드 확장 루틴(기계어 코드)을 로딩했을때는,
이런 부족한 메모리로는 활용이 쉽지 않다는 상태에 직면하게 됩니다.
물론 롬으로 만들어서 슬롯에 주르륵 탑재한다면 편하겠지만,
매번 EPROM에 구워서 SW 교체하는 식은 별로 편하다고 볼수 없겠지요.


일단 메모리 매퍼가 없는 경우에도 메모리를 확보할수 있는 방법은,
BASIC 모드에서 사용하지 않는 0000H~7FFFH의 메모리를 슬롯 전환을 통해 쓰거나,
비디오 메모리의 일부를 데이터 저장으로 활용할수 있습니다.
MSX2의 경우는 0000H~7FFFH의 메모리를 램디스크로 사용하면
디스크에서 데이터/프로그램 읽고 쓰는 것보다 훨씬 빠르니 좋죠.


더 많은 메모리가 필요하다면... 메모리 매퍼를 사용해야합니다.
메모리 매퍼 레지스터 사용법은 슬롯 전환 방법과 매우 유사한데요.
메모리는 16KB로 분할되어 세그먼트 번호가 매겨집니다.
만약 128KB 램이 매퍼에 연결되어 있다면, 총 16KB x 8개의 세그먼트를 쓸수 있는것이죠.
근데 한가지 주의해야될 사항은,
MSX/MSX2의 메인 BIOS는 메모리 매퍼 구성에 관여를 하지 않습니다.
좀 애매한 설명이지만, ^^
메모리 매퍼를 활용하려면 BIOS와는 상관없이 메모리 관리하는 SW를 만들어야한다는 얘기입니다.
MSX2+/MSXturboR은 부팅시 모든 슬롯의 메모리 매퍼의 용량은 체크합니다만,
실제 관리는 DOS2의 메모리 매퍼용 확장 BIOS 루틴을 써야만 합니다.


일단 DOS2의 도움없이 사용하는 방법은 이렇습니다.
I/O 주소는 아래 네개가 사용됩니다.
FCH : Page0(0000H~3FFFH)의 세그먼트 전환
FDH : Page1(4000H~7FFFH)의 세그먼트 전환
FEH : Page2(8000H~BFFFH)의 세그먼트 전환
FFH : Page3(C000H~FFFFH)의 세그먼트 전환


만약 Page1의 메모리를 세그먼트 5로 바꾼다면,
LD A,5
OUT (0FDH),A
등의 명령으로 바꿀수 있습니다.
사실 바꾸는건 간단한데, 다시 이전 세그먼트로 복구하는건 쉽지 않습니다.
원래 Page1에 세팅된 세그먼트 번호를 알아야하는데요.
그걸 알아내려면,
다른 Page에 램 세그먼트를 하나씩 바꿔가면서 특정 값을 기록하고,
원래 Page의 값이 같이 바뀌는지를 체크하면 알수가 있습니다.
물론 체크후에는 원래 값으로 복구시켜야겠지요.
저도 이런건 생각만 했지 실제로 메모리 활용하기위해 이렇게 프로그래밍해본 적은 없습니다.
한때 매퍼 레지스터를 읽어서 세그먼트 번호로 쓴적은 있었어요.
나중에 알고보니 이렇게 하면 안되는거더군요.
상당수 프로그램(터보알용 게임 포함)이 이런 잘못된 램 테스트를 함으로써, 구동에 실패합니다.


SW 만드는 사람 마음이겠지만, 개조안된 특정 본체에서 구동되도록 만들었다면,
같은 모델 쓰든 다른 사람도 같은 결과물을 얻을수 있겠지요.
무슨 소리인지 대충 이해하셨으리라고 믿고, 간단하게 BASIC으로 테스트해보겠습니다.


MSX2의 BASIC 모드에서 기본 메모리맵은 아래처럼 됩니다.
Page0/1 : 메인 BIOS 및 BASIC 인터프리터
Page2/3 : 메인 램 (Page3 끝에는 WorkArea 존재)


만약 BASIC 프로그램을 작성하게 되면 Page2 부터 저장이 되는데요.
그럼, Page2의 메모리 세그먼트(16KB)를 바꾸면 기존 프로그램을 지우지 않고
새로운 프로그램을 저장할 수 있게됩니다.
아래 BASIC 프로그램을 그대로 따라서 한번 해보세요.
실제 MSX 기종에서는 매퍼 상태에 따라 동작 안될수 있으니,
에뮬레이터에서 MSX2 기종으로 부팅해서 해보시기 바랍니다.
참고로 저는 paraMSX의 FS-A1WSX 설정으로 테스트했습니다.


부팅후, 프로그램 하나(한줄짜리 ^^)를 입력합니다.
10 PRINT "This is RAM segment 1"
run으로 실행시키면 아래처럼 되겠죠? (Ok는 BASIC 프롬프트입니다. 입력하지는 마세요. ㅋ)
This is RAM segment 1
Ok


그럼, 여기서 Page2의 세그먼트를 바꿔서 다른 프로그램을 입력해보겠습니다.
OUT (&HFE),2
Ok
new
Ok
새 프로그램을 입력합니다.
10 PRINT "New program in RAM segment 2"
20 PRINT "Hello MSX"
run으로 실행하면
New program in RAM segment 2
Hello MSX
Ok
라고 나오죠?


그럼, 다시 Page2를 원래 세그먼트로 복구해보겠습니다.
OUT (&HFE),1
Ok
list
10 PRINT "This is RAM segment 1"
Ok
처음에 입력한 프로그램이 나오나요?


매퍼의 상태를 설명드리면,
현재 동작중인 MSX 본체의 메모리 매퍼가 초기에 아래처럼 됩니다.
한번더 강조하지만, 매퍼 설정은 모든 MSX에서 동일한 것이 아닙니다.
제품 만드는 사람 마음이에요. ^^
Page0: RAM segment 3
Page1: RAM segment 2
Page2: RAM segment 1
Page3: RAM segment 0


뭔가 감이 오시죠?
처음 프로그램을 입력 후, Page2의 세그먼트를 2번으로 전환하고 다른 프로그램을 입력한 것입니다.
요건 간단한 메모리 세그먼트 전환이 어떻게 되는지 설명하기 위한것이었고요.
실제로 사용시, 여러개의 BASIC 프로그램을 빠르게 전환하려면
램디스크 기능을 쓰는게 훨 편합니다. ^^


만약 DOS1에서 프로그램을 만든다면,
기본 프로그램은 Page0,1을 쓰고 부가적인 루틴은 16KB씩 나눠서
Page2에 세그먼트 전환으로 사용하면 좋겠지요.


만약 DOS2에서 구동되는 프로그램이라면, 매퍼 레지스터를 직접 액세스하면 안됩니다.
DOS2의 확장 BIOS에서 제공하는 루틴을 쓰면 쉽게 세그먼트 관리를 할수가 있습니다.
자세한 설명은 아래 홈페이지를 참고하세요. "5. MAPPER SUPPORT ROUTINES"를 보시면 됩니다.
http://map.grauw.nl/resources/dos2_environment.php


실제 사용은 어셈블리로 해야되니,
이번 강의에 예제 코드를 올리는건 좀 무리겠네요. ^^
방법을 요약하면,
1. 먼저 확장 BIOS 루틴의 매퍼 엔트리(주소)를 얻어와야합니다.
2. 엔트리에서 필요한 루틴(세그먼트 할당/전환 등등)을 직접 CALL하면 됩니다.
3. 세그먼트 할당시 유저/시스템 두가지 영역을 지정할 수 있습니다.
4. 유저 영역은 프로그램이 종료되면 할당된 세그먼트가 자동으로 반환됩니다.
5. 시스템 영역은 프로그램이 종료하더라도 할당된 상태가 유지됩니다.
   시스템 영역은 서로 다른 프로그램이 데이터를 공유하거나,
   프로그램이 종료된 후 다시 실행해서 재사용 하는데 쓸수 있습니다.

PS. 아래 스크린샷은 paraMSX에서 BASIC 프로그램 예제를 실행한 모습입니다.



핑백

  • sharksym's MSX World : 2016년 내 이글루 결산 2017-03-22 20:33:40 #

    ... C/SD Drive V1/V2 - BIOS v4.12 1 4 paraMSX-R 제작 #2 - 일단 달려보자! 1 5 03. MSX의 메모리 매퍼 1 2016년에 덧글을 받은 포스트가 없습니다. 내 이글루 활동 TOP5 1 복실이 3회 2 글로리ㅡ3ㅢv ... more

덧글

  • 틸더마크 2010/05/18 01:53 #

    >"어디선가 많이 듣던 말인데, 어떻게 동작하는건지 모르겠네~" 라고 생각하신 분
    ...저군요 ㅋㅋㅋㅋㅋㅋ 말은 많이 들어봤는데 실제로 동작원리를 보는 건 처음이네요. 아직 좀 어려워서 알듯말듯 합니다만...ㅎㅎ 베이직 프로그램 전환되는 거보니 오오오 싶네요. +_+

    강좌 읽다가 궁금증이 몇가지 생기는 게

    1. 기종마다 다르다고 한다면 MSX2 DRAM에 내장된 메모리 매퍼도 표준사양이라는게 딱히 없다는 뜻인가요? (그렇다고 한다면 소프트웨어에서 매퍼를 활용하기가 뷁스러울텐데...-ㅁ-ㅋ)
    2. 요컨대 흔히 말하는 확장램카드 같은 것도 이런 메모리매퍼를 이용한 제품인건가요?
    3. 그럼 강좌 1에서 말씀하신 슬롯과 이놈을 조합하면...-ㅁ-;;;

    메가롬 매퍼 강좌도 기대하겠습니다. 므흣 (압박넣기) 사실 직접 프로그래밍하지 않는 일반 사용자 입장에서는 이쪽이 더 궁금하기도 하고요 ㅎㅎ
  • sharksym 2010/05/18 10:38 #

    일단 답변 나갑니다요~

    1. 물론 매퍼 HW I/O는 표준 규격으로 정해져 있습니다.
    단지 DOS나 BASIC에서 어떻게 사용할건지에 대한 규정이 없다는 것이죠.
    사실 I/O 주소는 모든 슬롯에 같이 적용되기 때문에, 메모리 매퍼가 여러개 있거나,
    각 페이지 별로 세그먼트 할당을 해야하는 경우 상당히 사용이 어렵습니다.
    이 부분이 MSX 메인 BIOS에 들어있지 않아서, SW 개발자들이 독자적으로 루틴을 만들었는데요.
    이게 개발자가 쓰는 MSX에서만 동작보증되니, 다른 MSX 모델에서는 안될 확률이 높다는것입니다.

    2. 보통 우리나라에서 확장램카드라고 하면, 재미나 디럭스박스 류를 의미했었는데요.
    요거는, 램으로 만들어진 기기이긴 하지만, 램 매퍼와는 다르고요.
    실제로는 코나미 메가롬 매퍼로 구현되어있습니다.
    그러니깐 코나미 메가롬팩 에뮬레이터인 셈이죠.
    근데 아스키 매퍼용 게임들도 구동가능한데 이건 재미나에서 롬을 패치했기 때문에
    동작하는 것입니다. 당시 롬파일을 진짜 아스키매퍼 쓰는 롬팩에 넣으면 안돌아갑니다. ㅎ.ㅎ

    3. MSX에서 뭔가 복잡한걸 개발 해보려면,
    기본적으로 슬롯 구조/처리 방식은 알고 있어야됩니다.
    모르면, 그냥 BASIC 프로그램만 해도 상관없지만요.
  • 틸더마크 2010/05/18 18:05 #

    딜럭스박스 같은거 돌아가는 폼을 봐서 평소에 아마 그렇지 않을까 라고 생각했는데 역시 생각한대로였군요. -ㅅ-;; 분명히 아스키 메가롬 매퍼를 쓰는 게임인데 실행해보면 에뮬레이터에서 코나미 매퍼로 실행되는 롬 이미지를 본 적이 있는데 아마도 원 소스가 그렇게 패치된 물건이었던가봅니다.

    일단은 제가 여쭤본 의도도 아스키의 확장램이나 웃카리군 같은 것이었습니다. ^^ 의문 해결됐네요. 감사합니다. ㅎㅎㅎ
  • sharksym 2010/05/18 20:53 #

    아... 아스키 확장램카드, 웃카리군 카트리지를 물어보신거였군요. ㅎ.ㅎ
    둘다 메모리 매퍼에 램확장 기기가 맞습니다.
  • 진스맥 2010/05/18 11:51 # 삭제

    안녕하세요. 진스맥입니다..
    올라오는 강좌 너무 재미있게 잘보고 있습니다...
    파라동에 좀 하드웨어로 깊이 들어가면 싫어라 하는것 같아 여기에 덧글을 올릴까해요.. ^^;

    이번 매퍼램도 잘 보았구요.. 음.. 매퍼램이 많아 지게되면 작동을 보증을 못한다는것인가요?
    현재 A1에 128k의 내부매퍼램과 256k의 매퍼램을 확장슬롯에 꼽아 보면서 작동실험을 해보고
    있는데 슬롯의 위치에 따라 부팅이 안되거나 매퍼램이 작동을 안하는경우가 있어서요...

    매퍼램을 많이 확장시키면 좋을줄 알았는데 그게 아닌듯 싶으면 주로 사용하는 메모리부분을 최대한
    확장을 하는게 좋을까 싶기도 하구요. 막연히 용량만 크면 좋을줄 알았는데 그게 아닌듯 싶기도 하네요..
  • sharksym 2010/05/18 13:54 #

    MSX에서 메인 BIOS에는 매퍼 관련 루틴이 없는데요.
    먼저 부팅되면, BIOS는 현재 슬롯을 검사해서 메모리가 어디있는지 체크합니다.
    MSX2의 경우 기본 메모리가 64KB이니까 낮은 슬롯 번호부터 검사하다가 64KB 메모리가 발견되면,
    해당 슬롯을 메인 메모리 슬롯으로 선택하고 진행합니다.
    그러면 BASIC 모드로 가거나 디스크의 DOS로 부팅했을 때,
    메인 램 슬롯이 자동으로 선택되는데요.
    많은 MSX2 모델이 슬롯3번쪽에 램이 존재합니다.
    근데 보통 외부 슬롯(1번 또는 2번)에 매퍼램을 꽂으면, 부팅시 먼저 체크가 되니
    메인램이 바뀌게 되겠지요.

    여기까지는 괜찮습니다만, 매퍼 HW는 만든사람에 따라 리셋 초기 세그먼트 번호가 다를수 있는데요,
    왜냐면 MSX 부팅시는 전체 CPU 주소 영역 64KB를 채우기만 하면되니까
    그냥 16KB 세그먼트 4개만 선택해주면 동작하게 됩니다.
    이 번호가 달라서 SW호환에 문제가 생길수 있고요.
    SW는 DOS/BASIC 프로그램이든, 슬롯에 롬이든 다 상관이 있습니다.
    특히 매퍼가 여러개 있을때는 매퍼 레지스터를 읽으면 절대 안됩니다. (HW적으로 충돌하니까요)
    기본 메모리가 어떤 슬롯에 있던 매퍼가 몇개가 있던 제대로 동작하는 프로그램을 만드려면,
    사실 쉽지가 않습니다.
    MMC/SD BIOS도 초기에 확장슬롯이나 특정 매퍼에서 동작문제 있던것도 비슷한 이유이고요. ㅎ.ㅎ
  • sharksym 2010/05/18 14:00 #

    가장 좋은 방법은 DOS2 처럼 모든 슬롯의 매퍼를 인식하고 (각각의 용량도 체크 필수)
    메모리 할당/헤제 할때, 슬롯 별로 매퍼의 세그먼트 번호를 잘 관리하면 됩니다.

    근데 DOS1 에서는 이런 메모리 관리가 없으니 (MSX1 시절에 DOS1이 나왔으니 당연하겠지요.)
    SW 만든 사람이 그냥 적당히 만들어서 썼습니다.
    특히 두개 이상의 매퍼를 제대로 지원하는게 드물겁니다.
    심지어 DOS2 전용 프로그램도 매퍼가 여러개 있을때
    그냥 Primary 매퍼만 쓰는 프로그램도 있고요.

    솔직히 슬롯이나 메모리 규격을 간단하게 만들고,
    메모리맵도 하나로 고정하면 정말 SW만들기는 간단해집니다.
    이리저리 체크하고 전환하는 코드 만들 필요도 없고, 모든 HW가 동일하게 되어있으니까요.
    애플2가 대표적인 예라고 볼수있죠.

    개인적인 생각이지만, MSX의 각종 BIOS, SW 규격은 정말 다양하게 잘 만든것 같은데,
    3.58MHz CPU한테는 너무 과분했던거 같아요.
    그 때문에 많은 SW(특히 게임)에서 슬롯 처리를 고정하거나 BIOS를 우회하는 등의 꼼수를 써야했지요. 느려터진 속도때문에요 ㅎ.ㅎ
  • 진스맥 2010/05/18 15:01 # 삭제

    네.. 메모리 확인해서 메인램이 바뀌는건 '메가리포트'로 확인해 봤습니다.
    A1에서 슬롯을 바꿔가며 256k램을 꼽아 봤는데 작동램의 위치가 바뀌더라구요..
    그런 이유여서인지 슬롯 3을 확장했을까 하는 생각을 해봅니다.

    아이큐2000같은 경우 메인 메모리가 0번슬롯에 있어서 후반에 있는 더 큰램을 확인하지
    못하지 않을까 하는 생각도 해보구요. (아직 아이큐2000으로 확인하지 못했습니다.)

    터보알에서는 기본매퍼램, 256K팩매퍼램, 확장슬롯 1메가 매퍼램 확인이 잘 되었습니다.

    메모리구조 보통어려운게 아니네요...

  • sharksym 2010/05/18 15:26 #

    네, 맞습니다.
    IQ-2000의 경우 이미 슬롯0에서 램이 확인되기 때문에,
    외부 슬롯에 메모리 매퍼가 더 있더라도,
    BASIC이나 DOS1으로 부팅하는 경우, 메인램이 슬롯0로 됩니다.
    제가 예전에, 512KB/1024KB 매퍼 램으로 확인했었지요.

    만약 DOS2로 부팅되면, DOS2 커널이 메모리 체크해서
    가장 큰 메모리 매퍼를 메인 램으로 다시 설정합니다.
    이 상태에서는 오래된 대우 MSX2용 프로그램들은 안돌아갈 확률이 높겠지요.
  • 진스맥 2010/05/18 15:08 # 삭제

    자세한 답변 정말 감사합니다...

    저.. 한가지 더... 매퍼램을 만들기 위해 ma14부터 ma21 까지 매퍼어드레스를 만들어 주는데요.
    여기에 램을 사용하는데 보통 2개 구조를 사용하는이유는 (cas1 cas2등..) 일부러 그렇게 한것인가요?
    (단가등으로 ) 아니면 무슨 다른 이유가 있는것인가요? sram을 이용한 바리에이션을 만들어보고 있는데
    한개의 고용량 램을 사용하는게 맞는지 아니면 2개 램으로 나누어 구조를 만들어주는게 맞는지 알고 싶어서요. (요즘은 sram이 비교적 저렴한 편이니 이렇게 이런저런 작업이 가능하지만 당시는 꿈도 못꿀 구조겠죠? )
  • sharksym 2010/05/18 15:31 #

    헛... 실시간 답글이 달리고 있습니다~ ㅎ.ㅎ
    MSX에서 주로 쓰이는 DRAM의 데이터 버스가 4비트라서 일단 두개 병렬로 8비트를 쓰는데요.

    질문하신 CAS를 여러개 써서, 두개 DRAM을 한조로 여러개 병렬로 만들게 되는건...
    램 용량 때문에 그렇습니다.
    보통 DRAM은 어드레스 라인이 한개 늘어나면, COL/ROW 각각 생기니까 용량이 4배가 되는데요.
    그러면, 64KB(4비트 DRAM 2개)를 한조로 쓸때 램 용량은,
    64KB -> 256KB -> 1024KB 이렇게 되겠지요.

  • sharksym 2010/05/18 15:39 #

    예)
    128KB 모델 -> 64KB 2조
    256KB 모델 -> 64KB 4조 또는 256KB 1조
    512KB 모델 -> 256KB 2조
    768KB 모델 -> 256KB 3조 (근데 홀수로 만든건 못봤습니다.)
    1024KB 모델 -> 1024KB 1조
    2048KB 모델 -> 1024KB 2조
    등으로 만들수 있겠지요.
  • 진스맥 2010/05/19 17:41 # 삭제

    장문의 답변 감사합니다...
    점정 더 알아 가는 msx 세계..
    정말 재미있네요...

    매퍼램 하드웨어를 보면 670을 통해서 data선을 입력받던데.. 그게 13번까지 그대로.. 14번부터 매퍼가 되는게 16K 매퍼일까요? 코나미나 아스키 8K같으면 12번까지 해서 들어갈려나.. 의심을 해봅니다...
    이론을 먼저 알고 하드웨어를 알아가는게 아니라 하드웨어 회로를 비교 분석해가며 유추하는거라서 남들과는 다르게 거꾸로 진행되는것 같습니다.. ^^
  • sharksym 2010/05/19 22:17 #

    순수 매퍼램의 매퍼는 아마 74LS670등으로 16KB 뱅킹으로 구현되있을겁니다.
    혹시 해당기기가 매퍼램과 코나미 8KB 롬팩 에뮬 겸용이면 부가회로가 더 있겠지만요.

    요즘에는 MSX관련으로 HW 자체에 관심이 많은 분이 많이 없으신데,
    (물론 파라동 한참이던 시절의 고수님들이 이젠 다들 떠나셔서 그런거지만....)
    진스맥님이랑 이것저것 얘기도 하고 많이 재밌습니다. ㅎ.ㅎ
    예전엔 흥건남자님이랑 한호규님, 김준성님 정도만 가끔 HW 얘기하는 정도였지요~
  • 이안 2016/05/04 17:29 # 삭제

    안녕하세요
    예전 글인데, 궁금한 내용이 나와있어서 감사히 읽었습니다.
    한가지 의문점이 있는데 SLOT메모리와 메모리 맵퍼와의 관계는 어떻게 되는지요?
    예를 들면 처음시작에서 PAGE2의 메모리가 슬롯 예를 들어 '10' (2번)으로 설정되어 있다면,
    이것은 메모리 맵퍼와 어떤 관련이 있는지 잘 이해가 가지 않습니다.
    메모리 맵퍼의 값이 '00'이면 기존 SLOT에 설정된 메모리를 사용되는것인가요?
  • sharksym 2016/05/05 00:43 #

    안녕하세요, 이안님

    슬롯은 CPU의 주소 공간을 병렬로 여러개로 늘려서 매핑하는 것이구요.
    메모리 뱅킹을 64KB로 구현하는 것과 비슷한 방식입니다.
    단 뱅킹(슬롯) 영역이 0000H~3FFFH, 4000H~7FFFH, 8000H~BFFFH, C000H~FFFFH 네 부분(페이지)으로 설정되는 구조이구요.

    메모리 매퍼는 MMU와 유사한 역할을 하는 기기입니다. 슬롯과는 별개 H/W입니다.
    메모리 매퍼의 페이지 크기는 16KB로 되어있구요. (슬롯의 페이지 크기와 동일함)
    슬롯 영역 64KB 주소 공간을 페이지 단위로 메모리(램)에 매핑합니다.

    예를 들어,
    CPU 페이지2 (8000H~BFFFH)가 슬롯 2번으로 설정되어 있고,
    슬롯 2번에는 메모리 매퍼로 된 256KB 램이 존재한다고 가정합니다.

    메모리 매퍼 페이지2 레지스터(포트 FEH)를 이용하여, 페이지2번의 메모리 매퍼 영역을 선택하면...
    슬롯 2번의 램영역 어떤 곳이라도 매핑이 가능합니다.

    예를 들어 메모리 매퍼의 페이지2 레지스터 값이,
    0인 경우, 램의 00000H~03FFFH 영역이 매핑되겠구요,
    1인 경우, 램의 04000H~07FFFH 영역이 매핑되겠구요,
    4인 경우, 램의 10000H~13FFFH 영역이 매핑되겠습니다.
  • sharksym 2016/05/05 01:11 #

    그럼 프로그램이 동작하는 경우를 예를 들어보겠습니다.

    슬롯2의 페이지0,1 (0000H~7FFFH)에 내 프로그램이 존재합니다. (램의 0000H~7FFFH 영역)
    스택은 페이지3 (C000H~FFFFH) 영역을 쓴다고 가정합니다.

    DISK 루틴을 호출하여 슬롯2 페이지1 (4000H~7FFFH) 영역에 파일을 로딩하려고 합니다.
    이때 DISK 루틴은 슬롯1 페이지1 (4000H~7FFFH)에 존재한다고 하면 (DISK의 memory mapped IO 영역도 페이지1에 존재)
    어떻게 파일을 전송해야 할까까요?

    여러가지 경우가 있겠지만, 아래 방법이 가장빠른 정답입니다.
    CPU 페이지2 (8000H~BFFFH)에 메모리 매퍼로 타겟 램을 매핑합니다. (램 4000H~7FFFH를 CPU 8000H~BFFFH에 매핑)
    CPU 페이지1에 존재하는 DISK 루틴은 타겟 메모리를 페이지2로 설정하고 파일을 로딩합니다.
    파일의 데이터는 디스크 드라이브 IO (4000H~7FFFH) 에서 램 (8000H~BFFFH)으로 전송됩니다.
    로딩이 끝나면, CPU 페이지2를 원래 메모리 매퍼 페이지로 원복합니다.

    이해 되시죠?
    메모리 복사는 페이지1에서 페이지2로 되었지만,
    파일 데이터는 페이지1의 메모리에 로딩이 되었습니다.
    당연한 얘기지만, 메모리 매퍼로 CPU 페이지0,1,2,3 모두 같은 메모리를 매핑할 수도 있습니다.

    실제 기기들은 메모리 매퍼외에 일반 I/O 영역도 페이지 2개를 미러링하는 방법도 사용합니다. 참고하시구요.



Title MSXrating email rss

CCL

크리에이티브 커먼즈 라이선스
Yeongman Seo에 의해 작성된 저작물은, 별도의 라이선스 조건이 없는 경우 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

ClusterMaps

구글 애드센스 (세로 큰직사각형)

통계 위젯 (화이트)

221
85
159460

이 이글루를 링크한 사람 (화이트)

27