terça-feira, 29 de maio de 2012

Ikari Warriors: UniLoader no Beta 48

Finalmente consegui adaptar o jogo Ikari Warriors para a interface de drive Beta 48. Este jogo possui som para a interface Explorer (ou qualquer uma com PSG AY-3-8912) e, por isso só, justificaria a adaptação. Porém um desafio adicional foi tentar reproduzir o esquema de carregamento/proteção UniLoader


Em postagem anterior apresentei o disassembly completo do UniLoader. Elaborei este material para poder adaptar este esquema de carregamento para interface de drive. Não foi muito fácil, pois eu teria que criar uma rotina modificada de leitura de arquivo de disco. O problema é que a rotina da ROM Beta faz a leitura de um setor de cada vez, isto é, em conjuntos de 256 bytes. Isto torna a intermitência da cor da borda impraticável, pois o intervalo de tempo se torna excessivamente longo. No UniLoader original, a cada bit recebido da fita cassete, ocorre alternância da cor de borda. Pensei em reescrever a rotina de forma a alternar a cor para cada byte recebido do FDC (Floppy Disk Control - Controlador do Acionador de Disco Flexível). Como eu venho elaborando um disassembly da ROM das interfaces CAS e CBI-95, já tinha algumas rotinas como ponto de partida.

Entretanto tive várias dificuldades no meio do caminho. Algumas eram originadas de erros relativamente simples, que foram sendo depurados através de exames mais minuciosos dos códigos. Mesmo assim, dois fatores foram bem difíceis de se diagnosticar. 

Um deles é que a rotina de leitura de dados do FDC não pode ficar na RAM baixa. Aparentemente a contenção da RAM baixa (mecanismo que faz com que o ULA tenha prioridade de acesso a esta RAM) interfere nesta operação. Não deixa de ser algo esperado, haja vista a leitura/gravação de disco ter temporização muito crítica. A solução que eu encontrei foi colocar a rotina de leitura na RAM alta, a partir do endereço 65195. 

Outro fator é que não é possível intercalar códigos que consumam muito tempo entre a leitura de um byte a outro. Pelo visto a transferência de dados do FDC para o Z80 possui temporização rígida. Eu resolvi o problema otimizando os códigos que proporcionam a alternância de cores da borda da tela. 

O resultado final não ficou perfeito, mas dá para ver a alternância de cores da borda de tela. O efeito é interrompido por algumas pausas impossíveis de se eliminar, sendo a principal causa a necessidade de aguardar quando se movimenta o cabeçote de drive, para posicioná-lo na trilha seguinte do disco. Também foi feita a simulação do tratamento de erro de leitura que, como na fita, faz a borda da tela piscar nas cores preta e vermelha. Espero que tal situação não ocorra de verdade, mas se quiser forçar seu aparecimento, basta apagar do disco um dos arquivos "IKARIcdC" ou "IKARIcd$".

O programa adaptado, em formato Hobeta, pode ser baixado do Google Drive ou 4 Shared. O código fonte segue junto no mesmo arquivo ZIP ou dentro deste subdiretório. A princípio, deve funcionar na interface CAS (Beta 48 original) ou na CBI-95 e derivados (IDS e Arcade). Eu só temo que, como não se conhece as temporizações do TK90X e do TK95, talvez não funcione para todos os equipamentos. Caso haja problemas, por favor, coloque-me a par.

2 comentários:

  1. Legal Flávio !!
    Eu tinha testado no emulador e a velocidade de carregamento tirou um pouco do efeito. Hoje com o TK+IDS+Drive e disquete, pude apreciar melhor, ainda que obviamente mais rápido que a fita, mas com melhor resultado.
    :)

    ResponderExcluir
    Respostas
    1. Valeu, José Roberto. Estive pensando e acho que tem um jeito de evitar as interrupções nas mudanças de trilha. Só que será necessário reescrever as sub-rotinas da ROM do Beta 48. Quem sabe um dia...

      Excluir

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.