sexta-feira, 17 de junho de 2016

Incompatibilidade da CAS com ROM do TK90X (parte 1)

A interface de drive da Cheyenne Advanced Systems (CAS) vem com uma ROM do ZX Spectrum para contornar a incompatibilidade com a do TK90X. Depois do disassembly da ROM da CAS ter ficado completo, fica possível entender a causa.


Mas, antes, eu preciso ter um meio de emular a interface CAS, pois não a possuo. Para isso, utilizei o emulador SpecEmu rodando no Linux com a ajuda do Wine. Este emulador já possui suporte para a CBI-95, então o que fiz foi substituir o arquivo  'CBI-24.BIN' pelo arquivo da ROM da CAS (na verdade usei link simbólico para simplificar). Ao iniciar a emulação, aparece por um breve momento o logotipo acima. Logo na sequência a tela é corrompida e o teclado deixa de responder.


Depois de um longo tempo o TK emulado reseta e aparece o menu inicial, porém não há como entrar os comandos do BASIC.

Para descobrir a causa, lancei mão do debugger do SpecEmu e fui acompanhando a execução da inicialização do DOS até chegar na sub-rotina que trava a emulação. Acabei na sub-rotina da ROM do TK90X no endereço 24, normalmente acessada pela instrução RST 24 (ou RST #16). O fato de ser uma sub-rotina tipo restart (RST) significa que é bastante acessada e, de fato, é a GET-CHAR que é responsável por analisar os caracteres de uma linha BASIC. No ZX Spectrum esta rotina é:
24   LD HL,(23645)
27   LD A,(HL)
28   CALL 125            ; 125/#7D - SKIP_OVER
31   RET NC
A Microdigital modificou na sua ROM da seguinte forma:
24   LD HL,(23645)
27   LD A,(HL)
28   CALL 15611
31   RET NC
Pode-se notar que a sub-rotina em 125 foi substituída por uma em 15611, que contém:
15611   CP 2
15613   CCF
15614   JP 37
Foi inserido o par de instruções CP 2/CCF para que fosse possível introduzir mais duas novas palavras-chaves do BASIC (UDG e TRACE). Depois é dado um salto para o endereço 37 que, por fim, volta ao endereço da sub-rotina 125 e prossegue como no Spectrum:
37   RET NC
38   JR 125
Enfim, foi uma modificação meio feia em cima do código da Sinclair, fica muito difícil tentar convencer que o monitor BASIC não foi totalmente "chupado" do original britânico (mas havia a Reserva de Mercado e aí...).

Voltando à cauda da incompatibilidade, o problema foi a escolha dos endereços 15611 a 15614 para inserir uma modificação. Se esta faixa não é usada no Spectrum, as interfaces Beta 48 empregam a área de 15360 a 15615 para fazer a interface do DOS com o BASIC (por exemplo, no uso de USR 15360 e USR 15363). A interface de drive cuida para que a ROM da Beta seja visível nessa área, mesmo que não haja operações do DOS. Sendo assim, quando se acessa a RST 24, esta sub-rotina não encontra a ROM do TK90X em 15611, mas entra no meio de uma sub-rotina da DOS (INIVARS). Como a GET-CHAR é empregada para analisar os caracteres do BASIC, seu mal funcionamento impede que o computador opere.

Uma vez que foi desvendada a causa da incompatibilidade, resta apontar uma forma de a contornar. Deixarei isto para uma próxima postagem.

Nenhum comentário:

Postar um comentário

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