MSXInício
Capítulo 26Disponível

Gerenciador de memória: Auto-Split, Layout Designer e Mapper ASCII8

Você programa como se tivesse 512 KB. O CrossScript se vira nos bastidores para caber tudo — quebra o MAIN, escolhe o formato do cartucho e desenha o mapa da memória para você conferir.

1. O problema clássico do MSX: páginas de 16 KB

O Z80 enxerga a memória em quatro páginas de 16 KB (Page 0..3). Cada bloco compilado — código, dados, buffers de tela, música — precisa caber numa página, ou o programa trava. Escrever esse "quebra-cabeça" à mão é chato, e é o motivo pelo qual quase todo BASIC clássico caía em "Out of memory" com apenas 20 KB de código.

O CrossScript resolve isso com três ferramentas que trabalham juntas:

  • Auto-Split de MAIN — se o bloco principal cresce demais, o compilador o divide sozinho.
  • Memory Layout Designer — a aba visual que mostra onde cada coisa mora.
  • Cartucho ASCII8 automático — se passar de 64 KB, vira cartucho paginado.

Você só percebe que eles existem quando precisa depurar; no dia a dia, o programa "simplesmente cabe".

2. Auto-Split do MAIN

Toda vez que você compila, o compilador mede o tamanho do bloco MAIN. Se ele ultrapassa o limite de uma página (16 KB), o Auto-Split faz duas coisas:

  1. Varre o MAIN procurando grupos de comandos com argumentos puramente literais — os candidatos naturais são TILECREATE, SPRITECREATE, TILEMAPLOAD, SCENERYRLE com dados, e blocos ASM de dados (imagens, músicas, tabelas).
  2. Move esses grupos para procedimentos sintetizados (__InitData0, __InitData1, …) e coloca CALL __InitDataN no lugar. O MAIN fica com fluxo de controle apenas.

O resultado é invisível: seu código-fonte não muda, mas o cartucho ganha até 3 páginas de "respiro". Se ainda assim não couber, aparece a mensagem:

Estouro de memória: MAIN

…que significa: mesmo depois do split, sobrou fluxo demais no MAIN. A solução manual é mover partes do gameplay para PROCEDURE — o mesmo padrão do capítulo 18.

DICA

Blocos ASM de dados não são chamados

O Auto-Split marca cada ASM como "código" ou "dados" pela presença de instruções executáveis. Blocos puramente de dados (imagens, samples, tabelas) são movidos para procedures sem um CALL correspondente — a CPU nunca tenta executar seu bitmap.

3. Memory Layout Designer: o mapa da memória

Na barra lateral direita da IDE, a aba Memory Map abre o Memory Layout Designer. Ele mostra, em tempo real:

  • Barra de páginas do Z80 — Page 0 (BIOS), Page 1 (código do cartucho), Page 2 (dados), Page 3 (RAM, stack, buffers).
  • Barra do VDP — as 4 páginas de VRAM (128 KB no MSX 2), com destaque para o que cada uma guarda: tabela de nomes, padrões, sprites, tela em bitmap, cache de tiles, buffers de save de BOBs.
  • Cartucho — se o build ficou > 64 KB, aparecem os bancos ASCII8 (8 KB cada).
  • Indicador de fragmentação — mostra quanto sobra em cada bloco, para você planejar a próxima fase.

O mapa é atualizado a cada Compile. Se um bloco fica vermelho, você sabe que a próxima adição vai estourar antes mesmo de rodar.

4. Cartucho ASCII8 automático (> 64 KB)

O cartucho MSX "Normal" aceita no máximo 64 KB. Quando o build passa dessa marca, o CrossScript troca automaticamente para o formato ASCII8 (Konami/ASCII de 8 KB por banco), suportado nativamente pelo WebMSX e por quase todo cartucho flash comercial. Você não muda nada no código — a mudança é só no arquivo .rom final.

Efeitos práticos:

  • Passa a caber até 512 KB de conteúdo dentro do cartucho.
  • Assets grandes (várias telas SCREEN 5 + música) convivem sem estouro.
  • O comportamento em runtime é idêntico; o PAGELOAD continua descomprimindo do mesmo jeito.

5. MEMORY AUTO, MAPPER e o LMM

Você também pode pedir explicitamente por RAM Mapper (até 4 MB) para uso do LMM (capítulo 25). O snippet gerado pelo Music Importer e pelo Graphics Studio já traz a diretiva:

MEMORY AUTO, MAPPER

…que orienta o compilador a reservar espaço num cartucho paginado com Mapper, disponibilizando XPTR para o programa. Sem essa diretiva, XPTR continua funcionando na RAM Mapper detectada no boot — a diretiva só reforça o layout.

6. O faxineiro revisitado

O Programa 25.2 (faxineiro de memória) é o melhor termômetro do LMM: ele lista quantos segmentos a máquina tem e pergunta quantos limpar.

USES SCREEN 1, KEYBOARD, MAPPER
SCREEN 1 : CLS

DIM p AS XPTR
DIM maxSeg AS BYTE
DIM sysSeg AS BYTE
DIM qtd AS BYTE
DIM s AS BYTE
DIM a AS WORD

maxSeg = PEEK($C106)
sysSeg = PEEK($C108)

PRINT "MAPPER: "; maxSeg + 1; " SEGMENTOS ("; (maxSeg + 1) * 16; "KB)"
PRINT "QUANTOS LIMPAR? ";
INPUT qtd
IF qtd > maxSeg THEN qtd = maxSeg

FOR s = 1 TO qtd
  IF s <> sysSeg THEN
    LOCATE 0, 6 : PRINT "LIMPANDO SEG "; s; "   "
    FOR a = $8000 TO $BFFF
      p = XPTR(s, a)
      POKE p, 0
    NEXT a
  ENDIF
NEXT s

PRINT "MAPPER LIMPA!"

$C106 guarda o último segmento válido e $C108 guarda o segmento reservado pelo sistema — nunca sobrescreva esse.

7. Sinais de que a memória está apertando

SintomaProvável causaSolução
Estouro de memória: MAINFluxo do MAIN > 16 KB depois do splitMover pedaços para PROCEDURE
Tela azul após PAGELOADAsset cruzou $C000 sem PL_READ_BYTE (versão antiga do runtime)Recompilar; runtime atual protege sozinho
ROM > 64 KB rejeitadaRuntime antigo, formato NormalRecompilar; ASCII8 é automático
BOB gigante deixa tela azulEstourou VRAM ou usou slot ímpar em BIGUsar slots 0/2/4/6; conferir no Memory Layout
Música importada aparece truncadaExcedeu 9,8 KB de cartuchoMusic Importer oferece modo Mapper — aceite

8. Resumo do capítulo

  • Auto-Split move dados literais para procedures sintetizadas; o MAIN fica só com o fluxo.
  • Memory Layout Designer mostra o mapa vivo da RAM, VRAM e bancos de cartucho.
  • Passou de 64 KB? O cartucho vira ASCII8 automaticamente (até 512 KB).
  • MEMORY AUTO, MAPPER orienta o compilador quando você quer LMM garantido.
  • Compile cedo, olhe o mapa, use PAGELOAD compactado (capítulo 21) — e você programa sem se preocupar com páginas de 16 KB.
Comunidade

Discussão · Gerenciador de memória: Auto-Split, Layout Designer e Mapper ASCII8

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…