MSX MEMORY MAPPER

From 흡혈양파의 인터넷工房
Revision as of 09:37, 10 August 2023 by Onionmixer (talk | contribs) (MSX 의 메모리 매퍼 내용 추가)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
MSX Memory Mapper
원문
https://www.msx.org/wiki/Memory_Mapper

도입

메모리 매퍼는 메모리의 여러 세그먼트를 CPU가 주소 지정할 수 있는 메모리의 특정 페이지에 매핑하는 메커니즘을 설명하는 일반적인 용어입니다. RAM, ROM 또는 이들의 조합에 적용될 수 있습니다. 이러한 메커니즘은 CPU가 기본적으로 지원하는 것보다 더 많은 메모리를 주소 지정할 수 있도록 하는 데 자주 사용됩니다. 메모리 매퍼는 다양한 시스템에서 사용되며 다양한 형태와 크기로 제공됩니다.

MSX 맥락에서 메모리 매퍼는 일반적으로 MSX2 표준과 함께 선택적으로 도입된 RAM 메모리 매퍼를 의미합니다. 메모리 매퍼는 일부 ROM 카트리지에도 사용되며, 일반적으로 이를 "ROM 매퍼"라고 합니다. "ROM 매퍼"가 있는 1Mbit 이상의 ROM인 "메가롬"도 참조하세요.


MSX2 이상 기종의 메모리 매퍼

사용예

=내장

  • 대우 DW64MX1 MSX2 엔진은 슬롯 0-2에서 256kB 메모리 매퍼를 지원합니다.
  • Toshiba T9769 MSX2+ 엔진은 512kB 메모리 매퍼를 지원합니다.
  • Yamaha S1985 MSX2 엔진은 512kB 메모리 매퍼를 지원합니다. 공유 핀으로 인해 지원되는 최대 크기가 256KB인지 512KB인지는 키보드 유형에 따라 다릅니다.

일반적으로 완전히 지원되는 크기보다 작은 크기가 설치됩니다. 지원되는 크기까지 확장하는 것은 비교적 쉽고, 더 큰 크기로 확장하려면 로직을 더 추가해야 합니다.

Yamaha S3527 MSX 엔진은 메모리 매퍼를 지원하지 않습니다. 일부 MSX 모델에는 개별 로직 IC를 사용하여 구축된 메모리 매퍼가 포함되어 있으며, 대개 하나 이상의 74LS670 이 포함되어 있습니다.


외장

  • 8bits4ever MEGA-MAPPER
  • ASCII MEM-768
  • Bit^2 Mu-pack
  • Club Gouda Memory Mapper 1MB
  • Club Gouda Memory Mapper E.M.S. 2MB
  • MFP Extended Memory-2048K
  • Padial LPE-4FMB-V8SKP
  • Padial LPE-4MB-V4SKP
  • Padial LPE-512KBSRAM-V3
  • Popolon MSX Memory Mapper
  • Popolon Musical Memory Mapper
  • Sony HBM-512
  • Stichting CODE MultiCartridge MCR
  • T.N.S. Addram

예를 들어, 메모리 매퍼는 모든 인터페이스 또는 게임 카트리지에 통합할 수도 있지만, 이 경우 카트리지는 기본 카트리지 슬롯에서만 사용할 수 있습니다.


최대 크키

MSX 메모리 매퍼에는 각각 16KB(16384바이트)의 세그먼트가 최대 256개(2^8)까지 포함됩니다. 따라서 메모리 매퍼의 최대 크기는 4MB(4096바이트)입니다.


I/O ports

표준 메모리 매퍼에는 다음 I/O 포트를 통해 액세스할 수 있는 4개의 레지스터가 있습니다:

  • 포트 FCh(252)는 0페이지(0000-3FFFh)의 세그먼트를 선택합니다.
  • 포트 FDh(253)는 1페이지(4000-7FFFh)의 세그먼트를 선택합니다.
  • 포트 FEh(254)는 2페이지(8000-BFFFh)의 세그먼트를 선택합니다.
  • 포트 FFh(255)는 3페이지(C000-FFFFh)의 세그먼트를 선택합니다.

시스템에 여러 메모리 매퍼가 설치되어 있는 경우 레지스터는 모든 메모리 매퍼을 대상으로 동시에 작동합니다.

RAM 확장의 메모리 매퍼 레지스터는 표준에 따라 쓰기 전용으로 지정됩니다. 내부 MSX 매퍼 레지스터도 읽을 수 있지만 프로그램에서 읽는 것은 권장하지 않습니다. 자세한 내용은 다시 읽기 섹션을 참조하세요.


초기화

MSX2 이상 BIOS는 다음 구성을 설정하여 메모리 매퍼 세그먼트를 초기화합니다:

  • 세그먼트 3은 0페이지(0000-3FFFh)에 설정되어 있습니다.
  • 세그먼트 2는 1페이지(4000-7FFFh)에 설정됩니다.
  • 세그먼트 1은 2페이지(8000-BFFFh)에 설정됩니다.
  • 세그먼트 0은 3페이지(C000-FFFFh)에서 설정됩니다.


메모리 매퍼를 인식하지 못하는 소프트웨어의 경우 위의 기본 구성은 각각 자체 슬롯에 16KB RAM의 일반 페이지 4개처럼 표시됩니다.


RAM 선택

메모리 매퍼의 슬롯을 선택한 경우 Z80에서 메모리 매퍼 RAM은 16KB 페이지로만 액세스할 수 있습니다. 따라서 메모리 매퍼 메커니즘은 MSX (서브)슬롯 메커니즘 위에 계층화되어 있습니다.

가능한 경우 MSX-DOS2 확장 BIOS 매퍼 지원 루틴을 사용하는 것이 좋습니다. 이렇게 하면 MSX-DOS2 환경에서 소프트웨어의 호환성 및 상호 운용성이 향상됩니다. DOS2를 사용할 수 없는 경우 MU 또는 MemMan을 사용하는 것이 대안이 될 수 있습니다. 그렇지 않으면 매퍼 레지스터에 직접 액세스할 수 있지만 이는 소프트웨어가 매퍼를 독점적으로 사용하는 경우에만 적합합니다.

MSX-DOS2 매퍼 지원 루틴을 사용할 때는 모든 슬롯(B=20h)에서 할당하고, 세그먼트 번호와 함께 슬롯 ID를 저장하며, 매퍼 페이지를 선택할 때 해당 슬롯(변경된 경우)도 함께 선택하는 것이 좋습니다. 이렇게 하면 기본 매퍼만 사용하는 것이 아니라 사용 가능한 모든 메모리를 사용할 수 있습니다. 이는 특히 내부 메모리가 항상 기본 매퍼인 MSX 터보 R과 관련이 있으며, ST에서는 256K만 사용되며 MSX-DOS2 및 DRAM 모드에서 부분적으로 사용됩니다.

여러 메모리 페이지에서 동일한 RAM 세그먼트를 선택할 수 있으며,이 경우 이러한 페이지는 서로 미러링됩니다. 즉, 동일한 16KB RAM 세그먼트가 다른 메모리 페이지에 표시됩니다.


mapper 레지스터 다시 읽기

메모리 확장의 메모리 매퍼 레지스터는 표준에서 쓰기 전용으로 지정되어 있습니다. 즉, 이 경우 어떤 일이 발생할 수 있는지에 대한 자세한 내용은 다음과 같습니다.

일부 RAM 확장은 내부 매퍼를 모방하기 위해 읽기를 허용하지만 내부 매퍼 레지스터도 읽을 수 있기 때문에 내부 매퍼 또는 레지스터를 읽을 수 있는 다른 매퍼가 있는 MSX 컴퓨터에서 확장을 사용하면 기껏해야 더 큰 매퍼에서 값이 잘못 읽히거나 최악의 경우 구성 요소가 저하될 수 있습니다. 그 이유는 매퍼가 모든 비트를 처리하지 않기 때문입니다. 따라서 추가된 비트는 매퍼 회로에서 비트 판독을 처리하는 방식에 따라 단락을 일으킬 수 있습니다.

안타깝게도 매퍼 레지스터를 읽는 소프트웨어, 특히 특정 유럽 128K 소프트웨어 및 ROM 크랙이 존재합니다.

이러한 소프트웨어의 대부분은 처리되지 않은 비트가 일반적으로 모두 1 또는 0으로 설정되기 때문에 메모리 매퍼의 크기를 정의하기 위해 처리되지 않은 비트에 의존합니다. 따라서 이러한 비트가 예상되는 값을 갖지 않거나 가장 큰 매퍼가 기본 RAM으로 선택되지 않은 경우 이를 확인할 수 없습니다.

참고 : https://www.msx.org/wiki/List_of_software_reliant_on_mapper_read-back


다중 메모리 매퍼

이론적으로 최대 15개까지, 최대 60MB까지 MSX에 여러 메모리 매퍼를 사용할 수 있습니다! 모든 RAM 사용을 지원하는 일부 소프트웨어가 존재합니다. MSX2+ 및 MSX 터보 R 컴퓨터에서는 부팅 로고 아래에 총 RAM 용량(비디오 RAM 제외)이 표시됩니다.

각 메모리 매퍼에는 매퍼 레지스터의 자체 복사본이 있습니다. 매퍼 크기에 따라 각각 다른 수의 비트를 저장할 수 있습니다. 이러한 레지스터에 쓰면 존재하는 모든 메모리 매퍼가 동시에 복사본을 업데이트합니다. 예를 들어 3개의 메모리 매퍼가 있는 경우 매퍼 레지스터의 복사본이 3개가 동시에 업데이트됩니다.

참고: 읽기 가능한 레지스터가 있는 메모리 매퍼를 구입하는 것이 좋다는 일반적인 생각과는 달리, 문제를 방지하려면 쓰기 전용 레지스터가 있는 메모리 매퍼를 사용하는 것이 좋습니다. 예를 들어 내부 메모리 매퍼가 없는 MSX에서는 최대 하나만 사용할 수 있습니다.


MSX1의 메모리 매퍼

MSX1 컴퓨터의 BIOS는 세그먼트 매퍼를 초기화하지 않습니다. 전원을 켤 때 대부분의 메모리 매퍼는 4개의 메모리 페이지 각각에 대해 세그먼트 0이 선택되어 있으며, 이는 16KB의 단일 RAM 세그먼트가 모든 페이지에 미러링된다는 것을 의미합니다. 컴퓨터는 일반적으로 기본값으로 부팅되지만 약 3KB보다 큰 프로그램이 로드되는 즉시 시스템 변수와 작업 영역을 덮어쓰게 됩니다.

이를 방지하기 위한 몇 가지 솔루션이 있습니다:

  • 초기화는 수동 또는 autoexec.bas를 통해 수행한 다음 MSX 컴퓨터 재설정을 수행할 수 있습니다.
  • 일부 CPLD 또는 FPGA 기반 메모리 매퍼는 MSX 컴퓨터 시작/리셋 시 해당 세그먼트를 3-2-1-0 순서로 초기화합니다.
  • 야마하 CX5MII의 경우처럼 메인-ROM의 경로를 지정합니다. MSX2 이상에서와 같이 세그먼트를 초기화합니다. 메모리 매퍼가 있는 몇 안 되는 MSX1 컴퓨터 중 하나입니다.
  • MSX1에서 사용하도록 설계된 일부 카트리지에는 세그먼트를 ROM으로 초기화하는 코드가 포함되어 있을 수 있습니다.
  • Nextor DOS(또는 해당 디스크 BASIC)로 부팅하면 세그먼트가 초기화되고 더 큰 매퍼가 선택됩니다.


소프트웨어 지원

대부분의 경우 여러 소프트웨어가 MSX에서 RAM을 공유하는 것은 문제가 되거나 적어도 어렵습니다. 메모리 매퍼도 이 규칙에서 예외는 아닙니다. 이 문제를 보다 쉽게 해결하기 위해 다음과 같은 솔루션이 존재합니다:

  • MSX-DOS2: 여러 애플리케이션이 서로의 RAM을 덮어쓰지 않고 동일한 메모리 매퍼를 사용할 수 있도록 하는 확장 BIOS 매퍼 지원 루틴을 제공합니다.
  • MU: MSX-DOS1에서 MSX-DOS2 호환 확장 BIOS 매퍼 지원 루틴을 제공합니다. 단, 소프트웨어는 프로그램 종료 시 할당된 메모리를 명시적으로 해제해야 합니다. 또한 하나 또는 두 개의 RAM 디스크를 생성하고 MSX 터보 R에서 CPU 모드를 선택할 수 있습니다.
  • MemMan: MSX-DOS1과 MSX-DOS2 모두에서 소프트웨어를 위한 메모리 매퍼 및 TSR 지원 루틴을 제공합니다.

또한 일부 MSX1 머신과 모든 MSX2 이상 머신은 최대 ~216kB의 RAM 디스크에 대한 MSX-BASIC을 지원합니다(CALL MEMINI 참조). 이 기본 제공 RAM 디스크는 MSX-DOS2 또는 MemMan 매퍼 지원을 인식하지 못하므로 이 RAM 디스크를 MSX-DOS2 또는 MemMan과 함께 사용해서는 안 됩니다. 대신 MSX-DOS2 또는 MemMan RAM 디스크 기능을 사용하십시오.


메인 RAM이 메모리 매퍼에 있는지 확인하는 방법

기본 프로그램 DMM.BAS(아래 목록)를 사용합니다. 크기와 슬롯 번호가 표시됩니다. (디스크 시스템 필요)

5 'Display the main memory mapper size
10 S%=PEEK(&HF341) OR PEEK(&HF342) OR PEEK(&HF343) AND &H8F: IF S%<>PEEK(&HF344) AND &H8F THEN PRINT"Main-RAM is disposed in several slots!": BEEP: END
20 IF PEEK(&HF677)=&HC1 THEN 50
30 CLS: PRINT CHR$(13)+"DMMM v0.5 by GDX": PRINT "wait...";
40 POKE &HF676,1: POKE &HF677,&HC1: POKE &HC100,0: RUN"DMMM.BAS"
50 PRINT CHR$(13)+"wait...";STRING$(23,32);
60 FOR N=255 TO 0 STEP -1
70 OUT 254,N: POKE &H8000,N
80 NEXT N: SZ=0
90 FOR N=0 TO 255
100 OUT 254,N
110 OT=T: T=PEEK(&H8000)
120 IF N=255 AND OT=254 THEN SZ=255
130 IF T=N THEN IF N<128 THEN SZ=N
140 NEXT N
150 'OUT 254,1: POKE &HF676,1: POKE &HF677,&H80: POKE &H8000,0
160 IF SZ<4 THEN PRINT CHR$(13);"No mapper found!": BEEP: END
170 PRINT CHR$(13);"Main mapper size:"; SZ*16+16;"KB"
180 PRINT"Slot:"; S% AND 3;
190 IF S%>128 THEN PRINT"-";(S% AND 12)/4


참고문서