MILC logo

IndexVorigeVolgendeLeeg

Disk I/O fouten afvanging onder MSX-DOS 1
R.vd Winkel, 22-02-92


    
     Disk I/O fouten afvanging onder MSX-DOS 1

     door Ramon van der Winkel, 22/02/1992
     op verzoek van Matthijs Corpeleijn


     Als er tijdens de I/O naar een floppy disk een fout optreed, 
     bijvoorbeeld omdat er geen disco in de drive aanwezig is, dan is het 
     natuurlijk niet netjes als er een foutmelding van DOS dwars door de 
     uitvoer van het programma heen komt. Helemaal niet als het programma 
     nederlandstalig is en de foutmelding natuurlijk in het engels komt.

     De foutmelding kunnen worden afgevangen en naar een eigen routine in 
     het programma geleid worden. In deze routine kan dan `netjes' aan de 
     gebruiker worden gevraagd wat er gedaan moet worden met de fout. Of dit 
     nu met een een-regelige melding of met een grafisch window gedaan 
     wordt, dat maakt niet uit.

     Onder MSX-DOS 1 moet het programma alles zelf nog doen. Er moeten een 
     tweetal adressen zelf afgebogen worden en eventuele stack problemen 
     moeten ook door het programma zelf in de gaten worden gehouden. Onder 
     MSX-DOS 2 is het gelukkig allemaal veel beter geregeld; een aantal kant 
     en klare routines doen het werk.


     DOS 1

     Er zijn een tweetal adressen die van belang zijn voor de 
     foutafhandeling onder MSX-DOS 1. Ten eerste is er het adres die naar de 
     foutafvangings routine wijst, daarnaast is er nog een adres dat 
     aangeroepen wordt als de optie "Abort" gekozen wordt.

     Voor de foutafhandelings routine is er het adres F323 in het systeem 
     geheugen. Deze wijst naar het adres waar het op zijn beurt weer het 
     adres van de routine staat. Bijvoorbeeld zo:

     F323 -> D000
     D000 -> D002
     D002 Begin routine     

     Als er in de routine voor Abort gekozen wordt, dan springt MSX-DOS naar 
     een routine welke eindigd in een sprong instructie om terug naar de 
     prompt te springen. Hier maken wij een sprong naar ons programma van en 
     vullen daarvoor het adres van onze routine in op adres F1E6.

     F1E6 -> Abort handler

     De Abort handler is er om stack fouten te kunnen ondervangen. Bij 
     Ignore en Retry wordt er bij een geslaagde poging teruggekeerd naar de 
     aanroep van de bdos functie, in het geval van een foutmelding weer naar 
     de foutafvangings routine.

     Nu moet dus alleen nog de stack bewaard worden. Dit kan op de volgende 
     manier waarbij er een universele routine in het programma komt om bdos 
     aan te roepen:

     bdos:   ld (errStack),sp
             call 5
             ret

     De foutafvangings routines zijn op dat moment al geinstalleerd en bij 
     een abort wordt naar de volgende routine gesprongen:

     bdosAbort: ld sp,(errStack)
                ret

     Waarmee er terug wordt gesprongen naar de aanroepende routine. Er moet 
     nu alleen nog een mechanisme worden geschreven waardoor er 
     gecontroleerd kan worden op een fout. Dit kan door middel van een 
     variabele die gezet wordt of op welke manier dan ook, het bovenstaande 
     is slechts een voorbeeld.

     Het is belangrijk dat de applicatie die deze twee adressen afbuigt de 
     originele waarden bewaard en bij het verlaten weer hersteld.

     Nu rest alleen nog het beschrijven van de foutcodes die door MSX-DOS 1 
     aan de foutafvangingsroutine wordt gestuurd. Ten eerste komt in 
     register A het drivenummer binnen. Tijdens een actie met deze drive 
     ontstond de fout. Verder komt in register C een aanduiding van de fout 
     binnen, de volgende tabel geeft een overzicht:

     b7=1 : Bad FAT
     b0=0 : Read aktie
     b0=1 : Write aktie
     b3 b2 b1
     0  0  0: Write Protected
     0  0  1: Not Read (disk offline)
     0  1  0: CRC error
     0  1  1: Seek error
     1  0  0: Record not found (sector not found)
     1  0  1: Write error
     1  1  0: Other

     Bij het verlaten van de foutafvangings routine moet in register C de te 
     ondernemen actie worden gespecificeerd:

     0 = Ignore
     1 = Retry
     2 = Abort

     Bij de optie 2 (abort) wordt dus naar de abort routine gesprongen die 
     we zelf afgebogen kunnen hebben.

     Meer valt er niet over te zeggen. Een ding misschien nog: Wees 
     voorzichting met de plaats waar de foutafhandelings routine komt te 
     staan. Het aanroepen van deze routine gebeurt vanuit de diskrom en dan 
     is het niet te verzekeren dat een routine die in pagina 1 staat 
     (4000..7FFF) ook goed bereikt kan worden. Voor de abort routine is het 
     wel zeker, want dan is het volledige TPA geheugen al weer ingeschakeld.


     Voor de foutafvanging onder MSX-DOS 2 verwijs ik naar de handleiding 
     van MSX-DOS 2.


    

Index

Vorige

Volgende