Oficina
12. O loader Numaboa II
Dom 27 Mai 2007 07:24 |
- Detalhes
- Categoria: Sistemas Operacionais
- Atualização: Quinta, 03 Abril 2008 14:51
- Autor: vovó Vicki
- Acessos: 12304
Fazendo a leitura de setores
Está na hora de fazer a leitura de alguns setores do disco. Como não temos um sistema operacional ativado (o nosso é que está sendo), precisamos usar interrupções da BIOS. Dê uma olhada no helpPC: escolha "BIOS disk services" e garanto que você há de concordar: a INT 13 é perfeita.
Ressetando o sistema de disco
É interessante referir que, antes de começar a fazer uma leitura de dados, convém ressetar a controladora de disco. Ainda no helpPC, escolha o serviço 0 da INT 13, "Reset disk system". Esta interrupção precisa dos parâmetros AH=0 e DL com o número identificador do disco: 0=drive A; 1=segundo drive de disquete; 80h=drive 0 e 81h=drive 1. Como já armazenamos o número do drive na variável bootdrv, basta referenciá-la. Além disto, esta interrupção tem valores de retorno: AH=status da operação do disco e a flag de carry CF=0 (zero indica sucesso) ou 1 (1 indica erro).
A rotina que teremos pela frente será um tanto longa. Para manter o código legível, é aconselhável criar uma função, que chamaremos de carregar. A primeira rotina desta função será ressetar a controladora de disco:
Observe que, se o sistema não puder ser ressetado devido a uma falha física do disco ou outra razão qualquer, nosso loader vai pendurar no loop .reset <-> jc .reset. Futuramente poderemos corrigir esta falha potencial. Outra novidade é o marcador precedido por um ponto (.reset:). Este ponto indica que o marcador é local e pertence à área do marcador carregar, ou seja, fora desta área ele não pode ser referenciado (mesmo porque não funcionará).
Fazendo a leitura de setores
Se tudo correr bem, está na hora de fazer a leitura dos setores. Faremos a leitura de 5 setores usando outro serviço da INT 13. O serviço 2 desta interrupção é o "Read Disk Sectors" e precisa dos seguintes parâmetros: AH=2 para indicar o serviço, AL=número de setores a serem lidos, CH=trilha/cilindro do disco, CL=número do setor, DH=número da cabeça, DL=número do drive e ES:BX como ponteiro para um buffer. Os valores de retorno da INT 13,2 são: AH=status da operação do disco, AL=número de setores lidos e a flag de carry CF=0 (zero indica sucesso) ou 1 (1 indica erro).
Até já sei... você se embananou com cilindro, setor e cabeça. Por enquanto, deixa quieto. O importante é que tenha compreendido o restante do código.