MSXInício
Capítulo 27Disponível

Lendo arquivos do disco

Músicas, imagens e mapas podem morar num disquete e ser carregados só quando o programa precisa.

Lendo arquivos do disco

Até aqui, tudo o que o programa usava (música, imagens, mapas) vinha embutido no próprio programa. Isso é cômodo, mas ocupa espaço: uma música de 12 KB dentro de uma ROM de 32 KB consome mais de um terço do cartucho.

Quando o programa roda a partir de um disquete (ou de um cartão SD, num Carnivore/SunriseIDE), dá para deixar esses dados em arquivos e carregá-los só na hora em que forem necessários. É isso que o comando LOADFILE faz.

1. O comando

LOADFILE "NOME.EXT", endereco [, variavelDeStatus]
  • "NOME.EXT" — nome do arquivo no disco, no formato 8+3 (como no MS-DOS).
  • endereco — onde o conteúdo será colocado na memória.
  • variavelDeStatus — opcional; recebe 0 quando deu certo e 1 quando o arquivo não foi encontrado.

O arquivo é lido inteiro, em blocos de 128 bytes, e o programa continua normalmente depois. Não há leitura "em pedaços" durante o jogo: a carga é feita de uma vez.

2. Requisitos

  • USES DISK no topo do programa.
  • O programa precisa rodar a partir de disco: use MEMORY DSK (a IDE gera o .DSK com o AUTOEXEC.BAS, e o menu Arquivo também grava .BIN e .COM).
  • Cabe ao programa reservar o espaço: escolha um endereço acima da área de código e de variáveis. O painel de compilação mostra onde termina cada área.

3. Exemplo: música vinda do disquete

MEMORY DSK LOAD $8500 NAME "SPECTRO"
USES SCREEN 5, MACHINE V9968, DISK, MUSIC

DIM ERRO AS BYTE

ERRO = 1
LOADFILE "MUSICA.MUS", $A000, ERRO
IF ERRO <> 0 THEN
  ' arquivo ausente — avise e pare
END IF

PLAYMUSIC $A000

WHILE 1 = 1
  TICKMUSIC
  WAIT
WEND

Repare em PLAYMUSIC $A000: além do nome de uma música embutida, o comando agora aceita um endereço. É assim que se toca uma música que acabou de ser lida do disco.

4. Gerando o arquivo .MUS

No Music Importer da IDE, importe o VGM exportado pelo Arkos Tracker 2 e clique em Gravar .MUS. O arquivo gerado tem um cabeçalho de 2 bytes com o ponto de repetição e, em seguida, o fluxo de dados do PSG — exatamente o que PLAYMUSIC endereco espera.

Copie MUSICA.MUS para o mesmo disquete do programa.

5. Listando o disco — DIRFIRST e DIRNEXT

DIRFIRST "*.MUS", NOME, STATUS
DIRNEXT NOME, STATUS
  • "*.MUS" — padrão de busca (* e ? funcionam como no MS-DOS).
  • NOME — variável de texto (DIM NOME AS STRING * 14) que recebe o nome encontrado, já no formato NOME.EXT.
  • STATUS — 0 quando achou um arquivo, 1 quando a lista acabou.

DIRFIRST começa a busca; cada DIRNEXT traz o próximo nome. Para carregar o arquivo escolhido, o LOADFILE também aceita a variável de texto:

LOADFILE NOME, $A000, ERRO

O exemplo "Gerenciador de arquivos", na lista da IDE, mostra a lista na tela, move a seleção com as setas e toca a música escolhida ao apertar o botão.

Lista em 80 colunas com seleção invertida

O gerenciador usa o modo texto de 80 colunas (TEXT2 do MSX2), que cabe muito mais nome por tela — 4 colunas de 16 caracteres:

POKE $F3AE, 80      ' 80 colunas
SCREEN 0

A seleção é mostrada em vídeo invertido, sem redesenhar nada: no TEXT2 cada posição de caractere tem um bit na tabela de blink (240 bytes a partir de $0800 na VRAM). Com R#12 guardando as cores invertidas e R#13 = $F0 (destaque fixo, sem piscar), basta ligar os bits da linha escolhida:

VPOKE $0800 + (LINHA * 10) + COLUNA * 2, 255

6. Custo

  • Código: cerca de 120 bytes de rotina, mais 48 bytes de área de trabalho.
  • Tempo: a leitura acontece uma vez, antes de tocar — em torno de 1 segundo por música num disquete real, quase instantâneo em cartão SD.
  • Durante a execução não há custo nenhum: os dados já estão na memória.

O exemplo pronto está na lista da IDE como "Espectro com musica lida do disco".

6. Tocando modulos PT3 (Vortex Tracker II)

Alem do formato .MUS proprio da IDE, o CrossScript toca modulos .PT3 do Vortex Tracker II exatamente como vieram — sem conversao.

Declare o recurso e use tres comandos:

USES DISK, PT3

LOADFILE "MUSICA.PT3", $B000, ST
PLAYPT3 $B000          ' inicia o modulo carregado
...
WHILE 1 = 1
  TICKPT3              ' uma vez por quadro
  WAIT
WEND
STOPPT3                ' silencia

Observacoes:

  • PLAYPT3 endereco recebe o endereco onde o arquivo .PT3 inteiro foi carregado (o cabecalho nao precisa ser removido).
  • TICKPT3 deve ser chamado uma vez por quadro (50/60 Hz). Ele calcula o quadro e escreve nos registradores do PSG.
  • O tocador ocupa cerca de 1,5 KB de programa e 382 bytes de memoria de trabalho, reservados automaticamente quando USES PT3 esta presente.
  • Reserve a area do modulo fora das variaveis do programa (por exemplo $B000); um modulo tipico ocupa de 4 KB a 16 KB.
  • O exemplo Tocador PT3 na lista da IDE lista os .PT3 do disquete e toca o escolhido.

Creditos do tocador: replayer PT3 para MSX de Dioniso, versao ROM de MSX-KUN e SapphiRe (projeto msx-msxlib, licenca BSD-3-Clause), baseado no player original de S.V. Bulba.

7. Tocando Tyfoon Pro-Tracker .PRO

Os arquivos Tyfoon Pro-Tracker começam com a assinatura PT10 e usam o chip MSX-MUSIC/FM. Eles não são módulos PT2 do PSG. O CrossScript seleciona um reprodutor dedicado, baseado no modelo do RoboPlay:

USES DISK, PRO

LOADFILE "MUSICA.PRO", $9000, ST
PLAYPRO $9000
WHILE 1 = 1
  TICKPRO             ' uma vez por quadro
  WAIT
WEND
STOPPRO
  • PLAYPRO valida PT10, prepara padrões, instrumentos e bateria.
  • TICKPRO mantém a cadência independente da leitura dos controles.
  • STOPPRO desliga os seis canais FM e a bateria.
  • É necessário executar em uma máquina com MSX-MUSIC/FM-PAC ativo.
  • O exemplo Tocador PT3 lista .PT3 e .PRO, identifica o formato e chama automaticamente o reprodutor correto.

Créditos do modelo .PRO: RoboPlay, RoboSoft Inc., licença Simplified BSD.

6. Gerando um programa .COM (MSX-DOS)

Programas grandes — como o tocador de PT3 — ficam apertados quando carregados pelo Disk BASIC, porque a BASIC ocupa a parte alta da memória. A diretiva

MEMORY COM NAME "PT3PLAY"

monta o programa em $0100, no formato executável do MSX-DOS. Assim quase toda a RAM fica livre para os dados (no tocador, o módulo é carregado em $4000, com espaço até cerca de $E000).

Detalhes importantes:

  • No MSX-DOS a BIOS não está visível na página 0; o compilador gera automaticamente chamadas entre slots (CALSLT), então SCREEN, PRINT, STICK e afins continuam funcionando normalmente.
  • O LOADFILE respeita um teto de memória calculado a partir do início do BDOS. Se o arquivo não couber, ele devolve status 2 em vez de invadir a área do sistema — foi essa invasão que antes reiniciava a máquina no fim da música.
  • Grave o executável pelo menu Arquivo → Gravar → .COM (MSX-DOS) e copie-o para um disquete junto com as músicas.

7. Detectando o chip de video: VDPID()

VDPID() devolve a identificacao do VDP lida em S#1:

ValorChip
0TMS9918A / V9938
2V9958 (MSX2+)
3V9968 (MSX 2++)

Com ela o mesmo programa escolhe o caminho grafico em tempo de execucao:

VID = VDPID()
IF VID = 3 THEN
  SCREEN 5
  V9968 INIT          ' paleta estendida e blitter novo
ELSE
  SCREEN 4            ' caminho MSX2, barras por tiles
END IF

Exemplo completo na IDE: Tocador PT3 + analisador de espectro. Ele lista os modulos .PT3 na tela de texto de 80 colunas, toca o escolhido e abre o analisador de espectro na tela grafica adequada ao chip encontrado.

Comunidade

Discussão · Lendo arquivos do disco

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…