domingo, 30 de novembro de 2008

Expansão de dispositivos

Eis o resultado de mais alguns estudos sobre a expansão de dispositivos no MSX.


O MSX tem alguns dispositivos padrão, a saber: LPT - impressora, CRT - Tela de texto, GRP - Tela gráfica, e CAS - fita cassete.

Mas além destes, outros dispotitivos podem existir, pois os dispositivos são previstos na Bios do MSX como um mecanismo padronizado de buffers para ser fazer operações de entrada/saída de dados.

Um comando típico, para "abrir" um dispositivo personalizado é:

OPEN "MEUDISP:" FOR OUTPUT AS #1,

Quando o Basic recebe um comando como o abaixo, os seguintes eventos acontecem:

- Toda vez que o MSX tenta abrir um dispositivo que não seja padrão, ele chama uma rotina de procura de dispositivos, que analisa a tabela SLTATR à procura de entradas cujo sétimo bit (máscara 0x40) sejam diferentes de zero (Durante o 'boot' a Bios varreu todos os slots e setou estes bits toda vez que encontrou as posições 06 e 07 sejam diferentes de zero)

- Ao encontrar uma ROM que contém uma entrada de dispositivo válida, a BIOS chama esta ROM com o registro A=FF e o nome do dispositivo (no caso MEUDISP) vai estar no buffer PROCNM, terminado em zero.

- O código escrito dentro da ROM do dispositivo tem que, em primeiro lugar, ver se o valor do registrador A é FF. Se for, deve analisar o nome em PROCNAM (da mesma maneira que se faz para criar comandos chamáveis via CALL). Caso o nome não bata, deve-se retornar a flag de Carry 'setada', e a Bios vai procurar pelo 'MEUDISP' em outro slot.

- Mas vamos supor que a ROM tenha o dispositivo MEUDISP e ele seja o terceiro dispositivo (pois uma ROM pode ter até 4 dispositivos expandidos). Daí a rotina deve retornar em A o número 2 e a flag Carry deve estar em zero 'resetada'

- Em seguida a Bios converte a posição do slot em que o dispositivo foi encontrado mais o número do dispositivo em um "código interno" de dispositivo. Este código é colocado no quinto byte do FCB atual. É utilizando este código que a Bios sabe como chamar o dispositivo associado ao FCB.

- Em seguida, a BIOS chama o dispositivo novamente, mas desta vez o registrador A contém o número do dispositivo chamado, o par HL contém o endereço do FCB, o registrador D contém o "código interno" do dispositivo, e o registrador E contém o modo de abertura. O modo pode ser:

"FOR INPUT" (01H)
"FOR OUTPUT" (02H)
"FOR APPEND" (08H)
"RANDOM MODE" (04H), se nenhum modo for especificado


Não vou entrar em detalhes de como abrir o dispositivo, mesmo porque não experimentei ainda o suficiente. Mas uma das coisas necessárias, é mudar o valor do primeiro byte do FCB para o modo correspondente.


Já com o dispositivo aberto, a BIOS passa dados para o dispositivo (que nada mais é do que o manipulador de um buffer) utilizando o registrador C para o dado, o registrador A para a operação desejada e o dispositivo é identificado pela variável DEVICE.

por exemplo, ao se digitar

PRINT #1, "A"

Temos 3 chamadas para o dispositivo. Em todas elas o registrador A tem o valor 6, que significa saída sequencial, e a variável DEVICE guarda o número do dispositivo identificado na hora do "open". Na primeira chamada, o valor de C era 65, que corresponde ao A maiúsculo. Na segunda e terceira, C assumiu, respectivamente, o valor 13 e 10, que correspondem a um CR-LF.

Caso houvéssemos colocado um ponto e vírgula ao final da expressão, apenas o A seria enviado e apenas uma chamada seria feita.