
|
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.
|