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:
- Varre o
MAINprocurando grupos de comandos com argumentos puramente literais — os candidatos naturais sãoTILECREATE,SPRITECREATE,TILEMAPLOAD,SCENERYRLEcom dados, e blocosASMde dados (imagens, músicas, tabelas). - Move esses grupos para procedimentos sintetizados (
__InitData0,__InitData1, …) e colocaCALL __InitDataNno lugar. OMAINfica 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
PAGELOADcontinua 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
| Sintoma | Provável causa | Solução |
|---|---|---|
Estouro de memória: MAIN | Fluxo do MAIN > 16 KB depois do split | Mover pedaços para PROCEDURE |
Tela azul após PAGELOAD | Asset cruzou $C000 sem PL_READ_BYTE (versão antiga do runtime) | Recompilar; runtime atual protege sozinho |
| ROM > 64 KB rejeitada | Runtime antigo, formato Normal | Recompilar; ASCII8 é automático |
| BOB gigante deixa tela azul | Estourou VRAM ou usou slot ímpar em BIG | Usar slots 0/2/4/6; conferir no Memory Layout |
| Música importada aparece truncada | Excedeu 9,8 KB de cartucho | Music 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, MAPPERorienta o compilador quando você quer LMM garantido.- Compile cedo, olhe o mapa, use
PAGELOADcompactado (capítulo 21) — e você programa sem se preocupar com páginas de 16 KB.