Workshop WIMP

waarbij Kees Grinwis zichzelf te buiten gaat

In een eerdere *Asterisk heeft er een bewerkte versie van het cursus materiaal gestaan dat gebruikt is/wordt bij de 'Workshop WIMP' die gehouden wordt in de regio Den Haag. Nu gaat dit materiaal uit van enige kennis van RISC OS en deze kennis is behandeld in de eerdere bijeenkomsten in Rijswijk.

Hoewel u het beste óók naar de 'Workshop WIMP' kunt komen heeft een lid van de regio Oost mij een tip gegeven. Er heeft namelijk al eens een WIMP cursus voor RISC OS 2 in de Asterisk gestaan - 1990 om precies te zijn, gemaakt door Walter Schoonenberg. Deze vertalen naar RISC OS 3 & 4 zou natuurlijk een ideale oplossing zijn. Dit artikel is de eerste in die reeks vertalingen en bewerkingen.

Niet alles zal geheel opnieuw behandeld worden, in het vorige deel van deze cursus is namelijk al het één en ander uitgelegd - kompleet met een lege voorbeeld applicatie.

BASIC's

In het vorige deel is er gesteld dan enige bekendheid met BBC-BASIC een voorwaarde was om de cursus goed te begrijpen, aan deze eis doe ik bijna niets af. Maar sommige punten moeten toch nog even duidelijk worden gemaakt, hierbij gaat het vooral om de manier waarop BBC-BASIC met geheugen-blokken en pointers omgaat.

Bij het maken van een WIMP programma is het noodzakelijk om van deze mogelijkheden gebruik te maken, kijk maar eens in het programma van de vorige keer.

In regel 60 zien we een wat vreemd gebruik van een DIM opdracht, onder normale omstandigheden wordt een DIM opdracht alleen gebruikt voor het maken van een array - maar dat is hier zo te zien niet het geval.

Wat er wel gebeurt is het reserveren van een blok geheugen dat 256 bytes groot is, waarbij de variabele buffer% en q% de start-adressen van die blokken geheugen bevatten. Zo'n start-adres wordt ook wel een pointer genoemd, mensen die werken met C/C++ zullen die term wel herkennen.

Peek & poke

Goed, we hebben nu een blok geheugen en een pointer dat naar dat blok geheugen wijst, maar hoe moeten we deze nu eigenlijk benaderen? Hiervoor zijn er in BBC-BASIC een aantal 'PEEK' en 'POKE' operatoren, de zogenaamde indirection-operatoren. BBC-BASIC kent er vier:

? Byte indirection operator

! Word*) indirection operator

| Float**) indirection operator

$ String indirection operator

*) Een Word is 4 bytes groot

**) Een Float is 5 bytes groot

De byte, word en string indirection operator zullen het meest gebruikt worden, eigenlijk ben ik nog geen programma tegengekomen dat gebruik maakt van de float indirection operator. Een klein voorbeeld-programmaatje, hierin zullen de aspecten van de byte, word en string indirection-operatoren ter sprake komen.

REM Claim een blok geheugen

DIM block% 64

REM Plaats de getallen 72,97,108,108

REM 111 en 0 in de buffer.

?(block%+0) = 72

?(block%+1) = 97

?(block%+2) = 108

?(block%+3) = 108

?(block%+4) = 111

?(block%+5) = 0

REM Geef de opgeslagen getallen weer

REM op het beeldscherm.

FOR i%=0 TO 5

PRINT block%?i%

NEXT i%

REM En nu... ;-)

PRINT $block%

Als u dit programma ingetikt hebt (in bijvoorbeeld !Zap, of !Edit) en het uitvoert dan vraagt u zich misschien af hoe de laatste uitkomst tot stand gekomen is, deze uitkomst was intentioneel. Ieder karakter in een string vertegenwoordigt namelijk een byte en in heb bij het maken van dit programma de bytes zo gekozen dat dit resultaat er uit zou gaan komen.

Bits & bytes

Met bovenstaande operaties kunnen we een aardig eind komen, maar dit is niet altijd voldoende. Soms is het namelijk noodzakelijk dat we de computer per bit nauwkeurig vertellen wat we bedoelen. Hierbij werken we met de kleinste eenheid die de computer kent, een bit. Een bit kan slechts 2 waarden bevatten 1 (waar) of 0 (onwaar), alle getallen worden intern tot een bit teruggebracht. Omdat deze presentatie voor ons mensen onhandig is (32 bit als een zogenaamd binair getal weergeven maakt het er niet duidelijker op) is er ook nog het hexadecimale stelsel bedacht, hierbij wordt er gebruik gemaakt van 16 mogelijkheden (van 0-9 en van A-F). Het hexadecimale stelsel heeft als voordeel dat het snel omgezet kan worden naar het binaire stelsel, zonder dat het voor ons mensen moeilijk of omslachtig wordt om de getallen te "begrijpen".

In de volgende voorbeelden zal de relatie tussen het hexadecimale en binaire talstelsel nog wat duidelijker worden, maar eerst wordt uitgelegd hoe het decimale talstelsel in elkaar zit en hoe dat dan zit in het binaire stelsel.

Het getal 175 bestaat uit de volgende elementen:

1×102 + 7×101 + 5×100 = 175

In het binaire stelsel is het equivalent 10101111, dit getal is namelijk opgebouwd uit:

1×27+0×26+1×25+0×24+1×23+1×22+1×21+1×20

Bovenstaande berekening levert namelijk 175 op, in het hexadecimale stelsel wordt dit getal weergegeven als AF, want:

10×161 + 15×160 = 175

Zoals beloofd zou de speciale relatie tussen het binaire stelsel en het hexadecimale stelsel nog toegelicht worden. Zoals al eerder is aangegeven bestaat een byte uit 8 bit, als we hier echter 2 blokken van 4 bit van maken dan is het mogelijk om heel snel hiervan het hexadecimale equivalent van te maken. Zo is de binaire notatie van ons voorbeeld 10101111, dit is dus op te delen in 1010 en 1111. Door bovenstaande berekening op deze 2 kleine binaire getallen los te laten is snel het decimale equivalent van de getallen te berekenen, dit wordt dan respectievelijk 10 en 15. In het hexadecimale stelsel is dit dan 'A' en 'F', en daar komt ons getal AF weer om de hoek kijken.

N.B. Een blokje van 4 bits wordt ook wel een "nibble" genoemd.

Getal notatie

Om aan BBC-BASIC duidelijk te maken om welk type getal het gaat zijn er een aantal prefixen gedefinieerd:

% Definieer een binair getal

& Definieer een hexadecimaal getal

~ Geef opgegeven getal in hex weer

De laatste mogelijkheid is heel handig, soms is het gemakkelijker om een getal in hexadecimale vorm te zien en de '~' prefix doet dan ook precies het omgekeerde van '&'. Dus voor BBC-BASIC geldt:

&AF = %10101111

Herhalen, herhalen, herhalen...

Inderdaad, als je meerdere WIMP programma's schrijft dan zul je veel zaken steeds weer opnieuw uitvinden. Is dat ook echt nodig? Nee integendeel, het is veel verstandiger om gebruik te maken van vooraf gedefinieerde functies of procedures. Waarbij alle constante items in de functie of procedure zijn ondergebracht en de dynamische items als parameters opgegeven worden.

90 REM WIMP initialisatie

100 SYS "Wimp_Initialise",

310,&4B534153,"Kapstok",0

TO wimpversion%,taskhandle%

Als we weer eens naar ons Kapstok programma gaan kijken dan blijkt dat er slechts 1 belangrijke variabele aan de SYS"Wimp_Initialise" instructie wordt meegegeven, de regels 90 en 100 kunnen dus beter in een aparte procedure worden geplaatst. Hetzelfde geldt voor regel 350.

350 SYS "Wimp_CloseDown",

taskhandle%,&4B534154

Op dit moment zijn er 3 libraries beschikbaar waarin functionaliteit van de WIMP via gewone BASIC functies en procedures beschikbaar gemaakt zijn.

Kapstok optuigen

In het voorgaande deel zijn er een aantal opdrachten gegeven, maar is er ook een leeg programma gegeven. Hoe zouden we deze opdrachten hebben kunnen uitwerken? Om dit te vergemakkelijken zijn er diverse zaken ondergebracht in libraries (http://www.dune.demon.nl/wimp) en kan er gebruik gemaakt worden van diverse hulpmiddelen (zoals !TemplED).

Uiteraard is iedereen vrij om zijn (of haar) eigen libraries te schrijven, maar zeker in het begin is het verstandiger om gebruik te maken van bestaande libraries om de WIMP-programma's te maken. (Hierbij kan gedacht worden aan de libraries van Walter Schoonenberg, te vinden op schijfje/groep A20 van de Big Ben Club software service, te samen met de voorbeelden van zijn WIMP cursus of van de door mij geschreven libraries. Let hierbij op dat de libraries van Walter Schoonenberg geschreven zijn voor RISS OS 2 en dus diverse mogelijkheden van RISC OS 3 niet bevatten)

Rijswijk

Hoewel het wel de bedoeling is om in deze reeks voldoende aandacht te schenken aan thuiswerken is het verstandig om ook eens op een van de WIMP avonden in de regio Den Haag te komen. De exacte datum voor de volgende WIMP workshop kunt u elders in deze *Asterisk vinden. Zo kunt u hier op weg geholpen worden als het niet mogelijk was om zelfstandig de opdrachten uit te werken. Of gewoon algemene vragen over de WIMP stellen.

Pak en kwak

Oftewel 'Drag & Drop', de volgende opdracht is het uitbreiden van het programma uit opdracht 3 zodat deze een tekstbestand accepteert als deze op het iconbar symbool gesleept wordt.

Contactgegevens

Zoals al is aangegeven zijn op http://www.dune.demon.nl/wimp/ de WIMP libraries te vinden en ik ben te bereiken via het e-mail adres mailto:dune@dune.demon.nl.

groeten, Kees Grinwis