Comfortabel ontluizen, deel 2
hoe Simon Voortman de bugs vindt

Na het vrij uitgebreide intro van de vorige keer, ga ik er vanuit dat het allemaal gelukt is, en dat u vol spanning zit te wachten op de versie met de blockdrivers, zodat u nu ook via een van de extra seriële poorten op dezelfde machine kunt debuggen!

Goed, om u niet langer in spanning te houden, ga ik meteen maar van start met de

programma's.

Er is maar weinig veranderd ten opzichte van de vorige keer. Om het gebruik van de library wat inzichtelijker te maken, heb ik bij de aanroep van de library namen voor de variabelen gekozen, die duidelijk aangeven waarvoor ze gebruikt worden. Aangezien het gebruik van de blockdrivers ook met zich meebrengt dat daarin fouten op kunnen treden, moest er een mechanisme komen om die fouten ook terug te kunnen melden. Dat doet de library door open% op 0 te zetten, en de melding in variabele 'programma$' te plaatsen. Daarom had ik ook variabelen nodig. De blockdrivers hebben ook een voorziening om ze weer af te sluiten als het programma stopt, daarvoor is regel 80 in het leven geroepen, waarna regel 90 het programma weer afsluit.

Dan nu de

Ik heb de opzet zoveel mogelijk gelijk gehouden aan die van de vorige keer.

Zoals te zien in regel 50: RETURN prg$, dat zorgt ervoor dat een evt. foutmelding terug gegeven kan worden aan het aanroepende programma. De DIM bdl_driver% 4096 op regel 60 reserveert ruimte voor de code van de blockdriver, bdl_q% 258 is een buffertje wat ik later in het programma nodig heb.

Regel 70 definieert codes die gebruikt worden om de functies in de blockdriver aan te roepen, waarna op de volgende regel geprobeerd wordt om de driver te laden. Als de driver niet te laden is, genereert het OS een foutmelding (die hier niet afgevangen wordt).

Regel 90 zorgt ervoor dat de driver initialisatie routine aangeroepen wordt; als dat een melding oplevert (omdat de hardware niet aanwezig is bv.) wordt dat netjes doorgegeven. Elke blockdriver bevat een tabel waarin alle ondersteunde snelheden staan, deze tabel begint op offset &100 (256 dus) in de blockdriver, en eindigt met waarde 0. Er wordt gecontroleerd (regel 120) of de opgegeven snelheid daar ook in staat, als dat niet het geval zou zijn, wordt dat ook weer doorgegeven. Als de snelheid klopt, wordt via regel 140 de seriële poort hierop ingesteld, waarna regel 150 het kopje produceert, en middels 160 gemeld wordt dat alles goed is ingesteld.

DEFPROCbdl_report is identiek aan de vorige keer.

DEFPROCline plaatst de regel die verzonden moet worden in een eigen buffertje (bdl_q%), samen met een CR en een LF. ptr% is een pointer in die buffer, en wijst naar de eerste byte die verzonden moet worden. De aanroep d%=FNdriver(PutBlock%,...) plaatst in d% het aantal bytes wat door de blockdriver in behandeling is genomen, waarna in de WHILE-lus samen met de lengte (len%) en het aantal verstuurde bytes (tx%) wordt bepaald of alles al verstuurd is.

DEFPROCbdl_close(port%) sluit de blockdriver na gebruik weer netjes af.

DEFFNdriver() tenslotte, geeft via A%-D% de registers R0-R3 de goede waarde en zorgt voor het aanroepen van de code van de driver, waarna R0 weer als waarde terug gegeven wordt.

De versie in C
Deze keer wat meer

dan de vorige keer, om de functies een beetje gescheiden te houden (blockdrivers apart in bdriver.c en bdriver.h).
Er zit nu ook een makefile bij, die tevens voor de programma's van de vorige keer gebruikt kan worden. Er zit ook nu weer aardig wat commentaar in de programma's, mocht u er desondanks niet uit kunnen komen, stuur gerust een mailtje!

Het bestand bdriver.c levert een errormelding van de compiler op, omdat de compiler verteld wordt dat er een functie gedefinieerd zal gaan worden, die vervolgens niet komt, maar er wordt wel geprobeerd om een adres voor die functie op te geven (dat is het adres van de blockdriver). Ondanks de foutmelding wordt er wel degelijk werkende code aangemaakt, dus nog maar een keer de makefile uit laten voeren, die dan de linker start, en alsnog het programma aan elkaar linkt.

Het is een linke boel, dat geef ik direct toe, maar deze manier gaf Hugo Fiennes (de auteur van de blockdrivers) als voorbeeld, en ik weet ook niet direct een betere manier te bedenken, dus als iemand daar nog een betere oplossing voor heeft, houd ik me aanbevolen!

Mocht u willen reageren, dan is het adres daarvoor:

Simon Voortman
Aconet#77:8500/100.1, of via email:
simon_voortman@aconet.org