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;POKEePEEKfazem o resto.