../../images/exit.gif Atomic Windows (c) Kees van Oss

Een uitbreidings ROM voor de Acorn Atom

Inleiding:

E i n d e l i j k ... na vele uren filosoferen, proberen, comprimeren, inhaleren, transpireren, afreageren en experimenteren i s het dan toch voor elkaar. De ATOMIC WINDOWS ROM is af!! Het resultaat is een ROM waarin een aantal commando's staan om in CLEAR4 een zogenaamd dialoog venster te creëren. Dit is een venster wat om interactie met de gebruiker vraagt. Het is nu zeer eenvoudig geworden om bv. een keuze tussen verschillende opties te maken, of een aan/uit keuze te maken, of text in te voeren, of een icoon te plaatsen. Je kunt ook pulldown menu's of icoonmenu's maken. Dit alles kan met of zonder muis, in een standaard Atom, software Atom emulator of Atom in PC kaart. De mogelijkheden zijn onbeperkt (nou ja, beperkt tot de gedachtekronkels van de programmeur wel te verstaan).

Wat is Atomic Windows:

Atomic Windows (AW) is een ROM waarin men met commando's een grafische interface op kan bouwen dmv objecten te plaatsen om interactie met de gebruiker te verkrijgen. Een interface is de koppeling tussen programma en gebruiker en interactie is het samenspel tussen gebruiker en programma. Zo kan men bv. gebruik maken van iconen of drukknoppen om stukken programma uit te voeren. Men kan gebruik maken van textinvoer velden. en kan een lijst op het scherm zetten waaruit een keuze gemaakt kan worden, enz.

De gehele schermopbouw (wat anders een groot gedeelte van een programma opeist) wordt een stuk eenvoudiger mbv AW-commando's. De meeste objecten komen ook in Microsoft Windows (of OS2, sorry Roland) voor, zodat de meeste mensen hiermee vertrouwt zijn.

Het idee is ontstaan door het programmeren in Visual Basic en het maken van macros in WP, waar het gebruik van dit soort objecten eenvoudig is.

Benodigde Hard- en Software:

Voor het werken met AW is de AW-ROM nodig op #A000. Er is geen extra hardware nodig om te kunnen draaien. In de ROM zit echter wel de benodigde software om een hardware muis, zoals eerder door mij beschreven in Atom News, aan een standaard Atom aan te sturen. Verder is er ook extra software ingebouwd voor het aansturen van een PC-muis op de Atom-in-PC kaart (bedankt Roland voor de Atom-in-PC software en het uittesten van de ROM).

De software is ook getest op de software emulator van Dick Bronsdijk en werkt hierop zonder problemen. Het nadeel is echter dat een aantal muis-specifieke AW-commando's (DLGHOTSPOT en DLGLISTBOX) hierop niet werken omdat hiervoor een muis vereist is. (Dick, misschien is het een idee om de PC-muis met de software emulator te kunnen gebruiken?)

Atomic Windows Commando's:

De commando's in de ROM zijn in drie groepen in te delen: Algemene Commando's, Actieve-Objecten en Passieve-Objecten. Actieve-Objecten zijn weer op te splitsen in 2 groepen, nl: Actieve- Exit- en Actieve-Loop-Objecten, deze worden hieronder beschreven.

Algemene Commando's:

Algemene commando's, zijn commando's ter initialisatie van de hard- en software. Dit zijn de commando's AW, DLGBASE, DLGCLS, DLGCREATE, DLGEND en DLGPOINTER

AW

Geeft het versienummer van Atomic Windows.

DLGBASE Adres

Hiermee wordt een blok vanaf Adres t/m Adres+#6FF gereserveerd voor een FontDataTabel en een IconDataTabel en vanaf Adres+#700 ruimte voor object parameters.

Adres+#000 t/m Adres+#2FF voor een FontDataTabel,
Adres+#300 t/m Adres+#6FF voor de IconDataTabel,
Adres+#700 t/m - voor de WindowsEventTabel.

DLGCLS

Vult het gehele scherm met een rasterpatroon.

DLGCREATE ExitVar,Text$,Style,X,Y,B,H

Definieer een Window op positie X,Y met breedte B en hoogte H met als titel Text$. Wanneer een keuze gemaakt is en de interactie-mode verlaten wordt komt de gemaakte keuze (ExitCode) in ExitVar te staan.

Met Style zijn de volgende opties voor Text$ mogelijk, dit geldt trouwens ook voor alle andere objecten :


Bit 0; is Vetgedrukt (1),
Bit 1; is Schuinschrift (2),
Bit 2; is Onderlijnen (4),
Bit 3; is Inverteren (8),
Bit 4; is Grijs maken,selecteerbare objecten zijn dan niet meer selecteerbaar (16),
Bit 5; is Dubbele hoogte (32),
Bit 6; is het plaatsen van een Ok-Drukknop alleen bij DLGCREATE (64),
Bit 7; is het plaatsen van een Cancel-Drukknop alleen bij DLGCREATE (128),

Combinaties van de verschillende bits zijn ook mogelijk, je moet dan alle desbetreffende getallen tussen haakjes bij elkaar optellen. Wil je een vetgedrukte, geïnverteerde Text$ hebben, kies dan Style = 1 + 8 = 9.

DLGEND

Springt naar de interactie-mode. De Copy-toets selecteert het volgende object en de Delete-toets het vorige object. De Escape-toets verlaat de interactie-mode. De Spatiebalk wordt gebruikt om een actie uit te voeren. Voor gebruik met de muis is Knop1 = Spatiebalk.

DLGPOINTER Nr

Wijzigt de muispointer in PointerNr nr. Er is keuze uit PointerNr's 0 t/m 31.

PointerNr Bit 0-4 = SpriteNr
PointerNr Bit 7 = Pointer On (0) / Off (1).

Actieve-Exit-Objecten:

Actieve-Exit-Objecten, zijn selecteerbare objecten die de interactie-mode verlaten als ze geselecteerd worden. Wanneer de interactie-mode verlaten wordt dan wordt de ExitCode van het object in ExitVar gezet die bij DLGCREATE gedefinieerd is. De commando's om een dergelijk object te plaatsen zijn: DLGPUSHBUTTON, DLGOPTION, DLGICON, DLGHOTSPOT en DLGLISTBOX.

DLGPUSHBUTTON ExitCode,Text$,Style,X,Y

Plaatst een drukknop op positie X,Y met als opschrift Text$ en is selecteerbaar.

DLGOPTION ExitCode,Text$,Style,X,Y

Plaatst Text$ op positie X,Y en is selecteerbaar.

DLGICON ExitCode,IconNr,Text$,Style,X,Y

Plaatst een icoon (0<=IconNr<=31) op positie X,Y met als onderschrift Text$ en is selecteerbaar.

DLGHOTSPOT ExitCode,X,Y,B,H,VarX,VarY

Markeert een rechthoek op positie X,Y met breedte B en Hoogte H waarbinnen een punt aangeklikt kan worden. De X en Y waarde van dit punt worden, relatief gezien, opgeslagen in VarX en VarY.

DLGLISTBOX ExitCode,Var,X,Y,B,H,MaxRec,Pointer

Plaats een rechthoek op positie X,Y met als breedte B en Hoogte H en daaraan vast een vertikale schuifbalk. In deze rechthoek komen strings te staan die in array Var gedefinieerd zijn. De opbouw van de array is als volgt :

Geselecteerde-String + #0D
1 Byte met aantal strings in array,
1 Byte met stringnummer van eerste string in venster,
1 Byte met stringnummer geselecteerde string,
Eerste string in array +#0D
Tweede string in array +#0D
......
MaxRec string in Array +#0D

Wanneer in de schuifbalk op het pijltje omhoog gedrukt wordt, schuiven alle strings in de rechthoek 1 positie omlaag. Wanneer in de schuifbalk op het pijltje omlaag gedrukt wordt, schuiven alle strings in de rechthoek 1 positie omhoog. Als men op een string in de rechthoek klikt zal deze geselecteerd en naar Geselecteerde-String gekopieerd worden. $Var geeft dus altijd de laatst geselecteerde string.

Actieve-Loop-Objecten:
Actieve-Loop-Objecten wijzigen een variabele, maar blijven in de interactie-mode. De commando's om een dergelijk object te plaatsen zijn: DLGRADIOBUTTON, DLGCHECKBOX en DLGTEXT.

DLGRADIOBUTTON Var,Text$,Style,X,Y

Plaatst een RadioDrukknop op positie X,Y met daarachter Text$ welke selecteerbaar is. De eerste RadioDrukknop komt overeen met Bit 0 van Var, de tweede met Bit 1 van Var, enz. Er zijn dus maximaal 8 RadioDrukknoppen per Var mogelijk waarvan er altijd maar 1 selecteerbaar is.

DLGCHECKBOX Var,Text$,Style,X,Y

Plaatst een AfvinkBox op positie X,Y met daarachter Text$ welke selecteerbaar is. Een lege AfvinkBox komt overeen met Var=0 en een volle AfvinkBox komt overeen met Var<>0.

DLGTEXT StringVar,Text$,Style,X,Y,B

Plaats Text$ op positie X,Y met daarachter een Invoervak met breedte B. Als default wordt $StringVar in het invoervak geplaatst. Bij het verlaten van het Invoervak met de Return-toets, wordt $StringVar aangepast. Bij het verlaten van het Invoervak met de Escape-toets wordt $StringVar niet aangepast.

Passieve-Objecten:

Passieve-Objecten zijn objecten die niet selecteerbaar zijn. De commando's om een dergelijk object te plaatsen zijn DLGFRAME en DLGLABEL.

DLGFRAME Text$,Style,X,Y,B,H

Plaatst een rechthoek op positie X,Y met als breedte B en hoogte H welke niet selecteerbaar is. Text$ wordt midden boven de rechthoek geplaatst.

DLGLABEL Text$,Style,X,Y

Plaatst Text$ op positie X,Y en is niet selecteerbaar.

OPMERKING:

Alle X en Y coordinaten (behalve bij DLGCREATE) zijn relatief, dwz 0,0 is de linkerbovenhoek van het DLGCREATE Window onafhankelijk van de positie van het Window op het scherm.

Werkwijze:

1. Definieer de plaats van de DataOpslag in het geheugen (DLGBASE),
2. Creëer een Window waarin de objecten geplaatst gaan worden (DLGCREATE),
3. Plaats mbv de AW-commando's de verschillende objecten,
4. Ga naar de interactie-mode (DLGEND),
5. Wanneer de interactie-mode verlaten wordt, onderneem dan actie aan de hand van ExitVar,
6. Herhaal vanaf stap 2 totdat het programma beëindigd wordt.

Geheugengebruik:

Het geheugengebruik van AW is als volgt:

#0080 - #0090 : Werkruimte hardware afhankelijke routines,
#00C0 - #00D0 : Werkruimte commando routines,
#0140 - #017F : Bufferruimte + opslag globale variabelen,
#A000 - #AFFF : AW-ROM,
#BFE0 - #BFE2 : Hardware muis (standaard Atom).

ROM:

De ROM is verdeeld in 3 delen, nl.:

Interpreter,
Commando routines,
Dataopslag AW-karakters (ASCII 0-31),

Werkruimte:

De werkruimte voor de hardware afhankelijke routines (#80-#90) en voor de commando's (#C0-#D0) is tijdelijk. Het gebruik van de bufferruimte (#140-#17F) is ook tijdelijk op DlgBaseAdres (#16D en #16E) en de DlgBasePointer (#16F-#170) na.

DataOpslag:

Deze ruimte begint vanaf het adres welke met DLGBASE opgegeven wordt. Ook deze ruimte wordt in 3 delen opgesplitst, nl.:

#000 - #2FFFontDataTabel, opslag van de ASCII-karakters 32 t/m 127. Elk karakter is opgebouwd uit 8 x 8 pixels, oftewel 8 bytes, de eerste byte is de bovenste en de achtste byte is de onderste lijn.
#300 - #6FFIconenDataTabel, opslag van 32 stuks, 16 x 16 pixel iconen. Elk icoon bestaat dus uit 32 bytes. Een icoon wordt opgebouwd uit 2 rijen van 16 bytes. Het eerste byte is linksboven, het zestiende byte is linksonder, het zeventiende byte is rechtsboven en het twee en dertigste byte is rechtsonder.
#700 - ?WindowsEventTabel, elk selecteerbaar object is 12 bytes opslag. In deze tabel worden de parameters van de selecteerbare objecten tijdelijk opgeslagen. De opslag is als volgt :

Byte 0 = X focus min
Byte 1 = X focus max
Byte 2 = Y focus min
Byte 3 = Y focus max
Byte 4 = Mode
Byte 5 = Var of ExitCode of IconNr
Byte 6 = Lengte Text$ of ExitCode of VarX
Byte 7 = Style of VarY
Byte 8 = X
Byte 9 = Y
Byte A = B
Byte B = H of BitMasker

Schermafdruk:

Hieronder nog een schermafdruk van de mogelijkheden van de AW-ROM.