nes-pascal

Compilando e executando programas

English Português (Brasil)

Compilação

Compile o exemplo mínimo com:

python -m nes_pascal.cli examples/minimal.nsp -o build/minimal.nes

O repositório também contém exemplos focados para cada área implementada da linguagem:

python -m nes_pascal.cli examples/arithmetic.nsp -o build/arithmetic.nes
python -m nes_pascal.cli examples/boolean_expressions.nsp -o build/boolean_expressions.nes
python -m nes_pascal.cli examples/conditionals.nsp -o build/conditionals.nes
python -m nes_pascal.cli examples/loops.nsp -o build/loops.nes
python -m nes_pascal.cli examples/counting.nsp -o build/counting.nes
python -m nes_pascal.cli examples/arrays.nsp -o build/arrays.nes
python -m nes_pascal.cli examples/enumerations.nsp -o build/enumerations.nes
python -m nes_pascal.cli examples/records.nsp -o build/records.nes
python -m nes_pascal.cli examples/procedures.nsp -o build/procedures.nes
python -m nes_pascal.cli examples/procedure_parameters.nsp -o build/procedure_parameters.nes
python -m nes_pascal.cli examples/functions.nsp -o build/functions.nes
python -m nes_pascal.cli examples/memory_layout.nsp -o build/memory_layout.nes
python -m nes_pascal.cli examples/zero_page.nsp -o build/zero_page.nes
python -m nes_pascal.cli examples/frame_synchronization.nsp -o build/frame_synchronization.nes
python -m nes_pascal.cli examples/frame_callbacks.nsp -o build/frame_callbacks.nes
python -m nes_pascal.cli examples/slow_update_callback.nsp -o build/slow_update_callback.nes
python -m nes_pascal.cli examples/controller_input.nsp -o build/controller_input.nes
python -m nes_pascal.cli examples/sprite_support.nsp -o build/sprite_support.nes --chr assets/chr_asset.chr
python -m nes_pascal.cli examples/metasprite_player.nsp -o build/metasprite_player.nes --chr assets/game.chr --metasprite assets/player_idle.json
python -m nes_pascal.cli examples/metasprite_clipping.nsp -o build/metasprite_clipping.nes --chr assets/game.chr --metasprite assets/player_idle.json
python -m nes_pascal.cli examples/sprite_animation.nsp -o build/sprite_animation.nes --chr assets/game.chr --metasprite assets/player_consolidated.json
python -m nes_pascal.cli examples/chr_asset.nsp -o build/chr_asset.nes --chr assets/chr_asset.chr
python -m nes_pascal.cli examples/palette_support.nsp -o build/palette_support.nes --chr assets/chr_asset.chr
python -m nes_pascal.cli examples/nametable_loading.nsp -o build/nametable_loading.nes --chr assets/chr_asset.chr --nametable assets/nametable_loading.nam
python -m nes_pascal.cli examples/background_updates.nsp -o build/background_updates.nes --chr assets/chr_asset.chr --nametable assets/nametable_loading.nam
python -m nes_pascal.cli examples/scrolling_ppu_state.nsp -o build/scrolling_ppu_state.nes --mirroring horizontal
python -m nes_pascal.cli examples/collision_rectangles.nsp -o build/collision_rectangles.nes --chr assets/game.chr --metasprite assets/player_idle.json
python -m nes_pascal.cli examples/collision_background.nsp -o build/collision_background.nes --collision-map assets/collision_map.cmap
python -m nes_pascal.cli examples/collision_helpers.nsp -o build/collision_helpers.nes --chr assets/game.chr --metasprite assets/player_idle.json --collision-map assets/collision_map.cmap
python -m nes_pascal.cli examples/random_numbers.nsp -o build/random_numbers.nes
python -m nes_pascal.cli examples/game_state.nsp -o build/game_state.nes --chr assets/chr_asset.chr
python -m nes_pascal.cli examples/gameplay_full_stack.nsp -o build/gameplay_full_stack.nes --chr assets/game.chr --nametable assets/nametable_loading.nam --metasprite assets/player_consolidated.json

Os exemplos demonstram:

As constantes PlayerMinimumX, PlayerMaximumX, PlayerMinimumY e PlayerMaximumY do exemplo do jogador são específicas do asset incluído, e não limites do renderizador. Cada quadro importado tem deslocamentos superior-esquerdo de componentes de -12 a +4, para uma extensão visível completa de -12..+11 ao redor da âncora. O eixo X, portanto, usa $0C..$F4. Os topos dos componentes do metasprite usam Y lógico 1..232, portanto Y usa $0D..$E4. O exemplo de recorte intencionalmente não utiliza esses limites de jogabilidade.

Os exemplos de laço, contagem e parâmetros de procedimento selecionam a cor de fundo $21 apenas quando seus estados finais esperados são alcançados.

O atalho do Makefile compila o programa mínimo:

make rom

As ROMs geradas utilizam o formato descrito em Plataforma-alvo.

Cada comando também grava uma configuração gerada do ld65 ao lado da ROM usando o sufixo .cfg e um relatório legível da RAM da CPU usando .map. O mapa lista regiões reservadas, de runtime, do compilador, do usuário e livres, além do endereço de cada variável e parâmetro de valor do código-fonte. Consulte Memória da CPU.

Assets de CHR-ROM

Configure um arquivo CHR-ROM bruto com --chr:

python -m nes_pascal.cli examples/chr_asset.nsp -o build/chr_asset.nes --chr assets/chr_asset.chr

Caminhos relativos são resolvidos a partir do diretório que contém o código-fonte .nsp, e não a partir do diretório de trabalho do processo do compilador. Os componentes . e .. e os separadores nativos da plataforma são suportados; caminhos absolutos permanecem válidos. NROM atualmente requer exatamente 8192 bytes (8 KiB). Um arquivo configurado ausente, ilegível ou com tamanho incorreto interrompe a compilação com um diagnóstico. Quando --chr é omitido, o compilador gera uma CHR-ROM vazia de 8 KiB (exceto para a demonstração fixa existente do sprite 0, que mantém seus tiles internos).

Programas com metasprites adicionam um ou mais caminhos JSON repetíveis com --metasprite e também devem configurar o banco correspondente de 8 KiB de CHR. Ambos os tipos de caminho são resolvidos a partir do diretório do .nsp. Consulte Metasprites para ver o contrato de metadados, nomes simbólicos de quadros e custo de OAM, e Animação de sprites para símbolos de sequência, temporização, política de repetição e custo de RAM/ROM de animação.

Assets de nametable

Programas que utilizam nes.load_background(); configuram um único arquivo bruto de 1024 bytes ou um mapa de tiles de 960 bytes acompanhado por uma tabela de atributos de 64 bytes:

python -m nes_pascal.cli examples/nametable_loading.nsp -o build/nametable_loading.nes --chr assets/chr_asset.chr --nametable assets/nametable_loading.nam
# Forma dividida ilustrativa: substitua os caminhos de espaço reservado pelos
# seus próprios arquivos de mapa de tiles de 960 bytes e tabela de atributos de 64 bytes.
python -m nes_pascal.cli <seu-programa>.nsp -o build/<seu-programa>.nes --nametable-tiles <seu-mapa-de-tiles>.tiles --nametable-attributes <sua-tabela-de-atributos>.attributes

As opções são formatos mutuamente exclusivos. As opções divididas devem aparecer juntas. Os caminhos seguem as mesmas regras de normalização e resolução relativa ao fonte que --chr. Consulte Carregamento de fundo para ver o layout bruto, comportamento de inicialização e os limites atuais de tela única.

Após nes.run, use nes.set_tile, nes.get_tile, nes.set_attribute, nes.clear_background_updates, nes.background_updates_overflowed e nes.clear_background_update_overflow conforme descrito em Atualizações de fundo em runtime. No máximo quatro bytes de tiles ou atributos são transferidos durante cada VBlank.

Assets de mapa de colisão

Programas que chamam nes.background_collision devem configurar um mapa texto com --collision-map:

python -m nes_pascal.cli examples/collision_background.nsp -o build/collision_background.nes --collision-map assets/collision_map.cmap

O arquivo UTF-8 contém exatamente 30 linhas de 32 caracteres 0/1. O compilador compacta as 960 flags em 120 bytes imutáveis de PRG-ROM. Um mapa ausente, ilegível, malformado ou configurado sem uso é rejeitado por um diagnóstico estável. Os caminhos seguem as mesmas regras relativas ao fonte dos outros assets. Consulte Helpers de colisão para coordenadas, ordem de bits, bordas e interação com atualizações de fundo.

Executando no Mesen

  1. Gere build/minimal.nes.
  2. Abra o Mesen.
  3. Selecione File > Open e escolha build/minimal.nes.
  4. A tela deve permanecer estável com a cor de fundo universal $21.

Limpando arquivos gerados

Remova os artefatos de build com:

make clean