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
0quando deu certo e1quando 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 DISKno topo do programa.- O programa precisa rodar a partir de disco: use
MEMORY DSK(a IDE gera o.DSKcom oAUTOEXEC.BAS, e o menu Arquivo também grava.BINe.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 formatoNOME.EXT. - STATUS —
0quando achou um arquivo,1quando 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 enderecorecebe o endereco onde o arquivo.PT3inteiro foi carregado (o cabecalho nao precisa ser removido).TICKPT3deve 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 PT3esta 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
.PT3do 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
PLAYPROvalidaPT10, prepara padrões, instrumentos e bateria.TICKPROmantém a cadência independente da leitura dos controles.STOPPROdesliga 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
.PT3e.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,STICKe afins continuam funcionando normalmente. - O
LOADFILErespeita 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:
| Valor | Chip |
|---|---|
| 0 | TMS9918A / V9938 |
| 2 | V9958 (MSX2+) |
| 3 | V9968 (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.