MSXInício
Capítulo 25Disponível

Além dos 64KB: Memória Linear (LMM)

Você já sentiu que os 64KB do MSX são como um quarto pequeno demais? Vamos aprender a usar até 4MB de RAM de forma simples.

Antigamente, para usar as famosas Expansões de Memória (Mapper), você precisava ser um mestre dos segredos do hardware, enviando comandos para portas de saída e controlando páginas e slots manualmente.

O CrossScript MSX resolveu isso para você. Com o Gerenciador de Memória Linear (LMM), você enxerga toda a memória extra como se fosse uma única estrada longa e reta — sem precisar escrever uma linha de código de hardware.

O que é o XPTR

Imagine que uma variável comum é uma etiqueta numa caixa dentro do seu quarto. Já um XPTR (eXtended PoinTeR) é como um GPS: ele não diz apenas onde a caixa está no quarto, mas em qual andar do prédio ela se encontra.

Sintaxe — o mapa da estrada

  • DIM p AS XPTR — cria o ponteiro estendido.
  • p = XPTR(segmento, endereco) — aponta para o "andar" e o "local".
  • POKE p, valor — grava na memória estendida.
  • v = PEEK(p) — lê da memória estendida.

O segmento vai de 0 a 255 (cada um com 16KB). O endereço fica sempre dentro da janela $8000–$BFFF (Página 2).

DIGITE E VEJA

Programa 25.1 — Gravando no andar 10

Vamos apontar para o segmento 10 e gravar um valor lá.

USES SCREEN 1, MAPPER
SCREEN 1 : CLS

DIM p AS XPTR
DIM valor AS BYTE

p = XPTR(10, $8000)
POKE p, 123
valor = PEEK(p)
PRINT "VALOR NO SEG 10 = "; valor

DICA

Planeje visualmente com o Memory Layout Designer

A aba Memory Layout Designer da IDE mostra graficamente os segmentos da Mapper e onde cada bloco (variáveis, tiles, música, buffer LMM) foi alocado. Recomendado antes de escrever código LMM sério.

TELA ESPERADA

Resultado no console

VALOR NO SEG 10 = 123

Programa 18.2 — O faxineiro de memória

Este programa detecta o tamanho da Mapper, pergunta ao usuário quantos segmentos de 16 KB devem ser limpos e apaga todos os bancos escolhidos, exceto o segmento onde o sistema está rodando. Note o uso do ; no final do PRINT para manter o cursor na mesma linha (igual ao MSX BASIC) e do INPUT para receber a resposta do usuário.

USES SCREEN 1, MAPPER
SCREEN 1
CLS
DIM s AS BYTE
DIM a AS WORD
DIM p AS XPTR
DIM maxSeg AS BYTE
DIM total AS WORD
DIM sysSeg AS BYTE
DIM qtd AS BYTE
maxSeg = PEEK($C106)
sysSeg = PEEK($C108)
total = maxSeg
total = total + 1
PRINT "MAPPER: ";
PRINT total;
PRINT " SEGMENTOS (";
total = total * 16
PRINT total;
PRINT "KB)"
PRINT "QUANTOS SEGMENTOS LIMPAR? ";
INPUT qtd
IF qtd > maxSeg THEN qtd = maxSeg
PRINT "LIMPANDO DADOS..."
FOR s = 1 TO qtd
  IF s <> sysSeg THEN
    LOCATE 0,6: PRINT "LIMPANDO SEG ";
    PRINT s
    FOR a = $8000 TO $BFFF
      p = XPTR(s, a)
      POKE p, 0
    NEXT a
  ENDIF
NEXT s
PRINT "MAPPER LIMPA!"

Detecção do hardware

Você pode descobrir quanta memória o MSX possui lendo um endereço específico da BIOS:

DIM max AS BYTE
max = PEEK($C106)
PRINT "MAPPER POSSUI "; max + 1; " SEGMENTOS"

ATENÇÃO

Janela de Acesso

A janela de acesso é sempre $8000–$BFFF. Evite alocar variáveis grandes nessa faixa se pretende usar o LMM intensivamente, pois o CrossScript usa essa área para o "espelhamento" da memória extra. Os segmentos 0 a 3 formam a RAM convencional de 64KB do MSX; o faxineiro começa no segmento 4 para não apagar a área usada pelo sistema.

Resumo do capítulo

  • XPTR é um ponteiro de 24 bits para memória estendida (até 4 MB).
  • O CrossScript faz o swap de bancos automaticamente — você não precisa usar OUT.
  • Use XPTR(seg, addr) para definir o alvo; POKE e PEEK fazem o resto.
Comunidade

Discussão · Além dos 64KB: Memória Linear (LMM)

Curta, marque como lido e comente o que achou deste capítulo.

0 comentários
Entre para participar
Crie uma conta ou faça login para curtir, marcar como lido e comentar.

Carregando comentários…