Die form_do-Routine des AES ist beim Arbeiten mit Dialogboxen ein praktisches Hilfsmittel, um die Kommunikation des Atari ST mit dem Benutzer zu erleichtern. FORM_DO übernimmt die komplette Verwaltung der Objekte innerhalb einer Dialogbox. Was aber, wenn man während des Dialogs zusätzliche Aktionen (z.B. eine eigene Tastaturabfrage) durchführen will?
Oder wenn man das Aussehen von “Standardobjekten” verändern will? Hier kommt man mit der eingebauten form_do-Routine nicht weiter, sondern muß sich eine eigene Eingabe programmieren.
Bei der Programmierung von Dialogen nimmt uns das GEM mit seiner form_do-Routine einen Großteil der Arbeit ab. Ist die Dialogbox einmal per Resource Construction Set erstellt, wird nach dem Zeichnen dieses Objekts (mit Hilfe von objc_draw) einfach die form_do-Routine des AES aufgerufen, und der Dialog mit dem Benutzer läuft automatisch ab. Das Hauptprogramm erhält erst wieder die Kontrolle, wenn die Dialogbox über ein EXIT- oder TOUCHEXIT-Objekt verlassen worden ist.
Vielleicht haben Sie sich aber schon die Frage gestellt, wie es manche Programme (z.B. das DISKUS-Diskutility oder der TEMPUS-Text-Editor) realisieren, die Buttons innerhalb einer Dialogbox auch über die Tastatur zu erreichen. Dies ist nur über eine neue Eingaberoutine möglich, die die vorhandene form_do-Routine ersetzt und neue Funktionen ermöglicht.
Was muß eine solche Eingaberoutine leisten? Zunächst müssen Eingaben oder Änderungen, die über die Tastatur oder die Maus hervorgerufen werden, auf dem Bildschirm dargestellt werden. Wird also eine Taste gedrückt, muß das der Taste entsprechende alphanumerische Zeichen in das aktuelle Eingabefeld der Dialogbox übertragen werden. Anschließend muß der Eingabe-Cursor auf die nächste Zeichenposition gesetzt werden. Handelt es sich bei der gedrückten Taste um die Tabulator- oder eine Cursor-Taste, muß ein Wechsel der Eingabeposition oder des -feldes erfolgen. Weiterhin muß sich der Programmierer darum kümmern, daß der Cursor innerhalb von Eingabefeldern an der richtigen Stelle dargestellt wird.
Schließlich müssen auch Mausaktionen überwacht werden. Wird ein EXIT- oder TOUCHEXIT-Button angeklickt, muß der Dialog beendet werden. Handelt es sich um einen Radio-Button, muß dies insofern berücksichtigt werden, als nicht nur der Status des angeklickten Buttons geändert werden muß, sondern auch andere Radio-Buttons einen neuen Objektstatus erhalten müssen.
Sie sehen, es gibt viel zu beachten. Glücklicherweise besitzt das AES genügend Unterroutinen, um bei der Verwendung einer eigenen Dialogroutine die Überwachung der oben aufgeführten Eingaben zu erleichtern. Insbesondere spreche ich damit die Funktionen form_keybd, form_button und objc_edit an. In Verbindung mit diesen (leider häufig nur unzureichend dokumentierten) AES-Routinen läßt sich eine Eingaberoutine formulieren, die einige neue Möglichkeiten zur Verwaltung von Dialogen bietet und vom äußerem Erscheinungsbild her wie eine “normale” Dialogbox wirkt.
Damit die folgenden Ausführungen nicht graue Theorie bleiben, soll anhand des Beispielprogramms DIALOG aufgezeigt werden, wie die Programmierung einer eigenen form_do-Routine vonstatten gehen kann. DIALOG stellt eine Dialogbox auf dem Bildschirm dar, die aus zwei Eingabefeldern, zwei Radio-Buttons sowie einem “OK"- und einem "ABBRUCH"-Button besteht. Die Buttons können wie üblich über die Maus bedient werden, und auch sonst bestehen auf den ersten Blick keine Unterschiede zu anderen Dialogboxen.
Wie sieht es auf den zweiten Blick aus? Nun, Radio-Button 1 kann nicht nur über die Maus, sondern auch über die Tastenkombination [ALTERNATE] [1] betätigt werden, Radio-Button 2 ist über [ALTERNATE] [2] ansprechbar. Darüber hinaus kann der "ABBRUCH"-Button über die [Undo]-Taste erreicht werden.
Das ausführlich kommentierte Assembler-Listing zu DIALOG.PRG möchte ich nun als Grundlage nehmen, um die Programmierung einer eigenen Dialogroutine zu erläutern. Wie bereits erwähnt, bilden die AES-Routinen form_keybd und form_button das Kernstück des Programms. form_keybd ermöglicht es, in einer Dialogbox Tastatureingaben zu simulieren, mit form_button kann die Betätigung eines Mausknopfes simuliert werden. Damit man die Möglichkeit hat, während des eigentlichen Dialogs zusätzliche Aktionen vorzunehmen, geschieht die Abfrage von Tastatur und Maus nun nicht mehr über die eingebaute form_do-Routine des AES, die ja Manipulationen während des Dialogs nicht zuläßt, sondern über die evnt_multi-Routine. Allgemein können über evnt_multi diverse Benutzeraktionen überwacht werden. Um zu spezifizieren, worauf evnt_ multi konkret achten soll, wird ein Parameterwort übergeben, in dem je nach zu überwachender Aktion entsprechende Bits gesetzt sind. Nach diesem AES-Aufruf überwacht GEM für uns so lange Tastatur und Maus, bis eine Aktion (Tastendruck oder Betätigung der Maustaste) seitens des Benutzers erfolgt. Erst dann wird die Programmkontrolle wieder an das Hauptprogramm zurückgegeben. Ist dies geschehen, so finden sich in einem eigens für den evnt_multi-Aufruf errichteten Array (in unserem Fall ev_buff) Angaben über die Art der Aktion. Wie bereits beim Aufruf von evnt_multi werden diese Daten wieder durch einzelne Bits repräsentiert.
typedef struct
{
int ob_next; /* -> nächstes Objekt */
int ob_head; /* -> erstes Kind */
int ob_tail; /* -> letztes Kind */
unsigned int ob_type; /* Objekttyp */
unsigned int ob_flags; /* Objektflags */
unsigned int ob_state; /* Objektstatus */
char *ob_spec; /* Zeiger auf ergänzende Struktur */
int ob_x; /* x-Position (rel. zum Parent-Objekt) */
int ob_y; /* y-Position (rel. zum Parent-Objekt) */
int ob_width; /* Breite */
int ob_height; /* Höhe */
} OBJECT:
Tabelle 1: Organisation eines Objektes
DIALOG.PRG verzweigt nun, je nachdem, um welche Aktion es sich gehandelt hat, in eine Routine zur Behandlung von Mausaktionen oder kümmert sich um die Taste, die vom Anwender gedrückt wurde. Beschäftigen wir uns zunächst mit dem Fall, daß evnt_multi einen Tastendruck gemeldet hat. ASCII- und Scancode der gedrückten Taste werden uns im ev_buff-Array mitgeteilt. Liefert evnt_multi einen gültigen ASCII-Code zurück, handelt es sich um eine “normale” alphanumerische Eingabe, und das Zeichen kann direkt in die Dialogbox geschrieben werden. Ist der ASCII-Code jedoch Null, liegt also nur der Scancode der betätigten Taste vor, geht es nun darum, festzustellen, ob ein Button existiert, der durch diese Taste bedient werden kann.
Um Buttons über die Tastatur bedienen zu können, werden bei DIALOG.PRG Tastenkombinationen zusammen mit der [ALTERNATE]-Taste verwendet, da in diesem Fall von evnt_multi nur der Scancode der Taste, jedoch kein ASCII-Code zurückgeliefert wird. Natürlich muß man an geeigneter Stelle eine Information unterbringen, welcher Button durch welche Taste bedient werden kann. Es ist sehr praktisch, diese Zusatzinformation innerhalb der Objektdaten der Dialogbox unterzubringen. Wie ein Objekt organisiert ist, läßt sich in Tabelle 1 sehen [ 1 ].
Im Wort für den Objekttyp ist nur das Low-Byte belegt. Somit steht das High-Byte für eigene Anwendungen zur Verfügung. DIALOG.PRG macht sich dies zunutze, indem es bei Buttons, die über die Tastatur bedient werden können, im High-Byte des Objekttyps den Scancode der Taste erwartet, durch die der betroffene Button angesprochen werden kann. Das Programm durchsucht nun einfach den gesamten Objektbaum auf ein Objekt, bei dem als erweiterter Objekttyp der Scancode der Taste eingetragen ist, die gedrückt wurde. Findet sich ein solches Objekt nicht, wird zum Schleifenanfang zurückgekehrt und der Dialog fortgesetzt. Ist ein Objekt vorhanden, das über die gedrückte Taste angewählt werden kann, wird die Objektnummer berechnet und über evnt_button ein Mausklick auf dieses Objekt simuliert. Der Effekt eines Tastendrucks in Verbindung mit der [ALTERNATE]-Taste ist somit der gleiche wie beim Anklicken eines Buttons mit der Maus.
Wurde ein alphanumerisches Zeichen (also ein Tastendruck ohne Kombination mit der [ALTERNATE]-Taste) eingegeben. wird mit den ASCII-und Scancodes für dieses Zeichen zunächst die form_keybd-Routine aufgerufen, die in der Lage ist, diesen Tastendruck für unsere Dialogbox aufzuarbeiten. Handelte es sich bei der gedrückten Taste um eine Cursor- oder die Tabulatortaste, liefert uns form_keybd die Nummer des Eingabefeldes zurück, in der wir nun den Text-Cursor positionieren müssen. Zusätzlich bekommen wir in diesem Fall eine Null als Rückgabewert, was bedeutet, daß keine Taste betätigt wurde, um deren ASCII-Darstellung wir uns kümmern müßten.
Erhalten wir keine Null zurück, sondern einen positiver Wert, so ist das Eingabefeld zwar das gleiche geblieben, aber dafür müssen wir an der aktuellen Cursor-Position ein ASCII-Zeichen eintragen. Dies geschieht mit Hilfe von objc_edit. Diese Funktion erlaubt es, Texteingaben in einem Formular vorzunehmen. Nach Aufruf dieser Routine mit dem ASCII-Code der gedrückten Taste wird das Zeichen in der Dialogbox dargestellt. Anschließend liefert uns objc_edit die neue Position des Text-Cursors zurück, der ja jetzt um eine Stelle nach rechts gerückt ist.
Falls evnt_multi abgebrochen wurde, weil ein Maus-Button betätigt wurde, ist zunächst zu prüfen, ob sich der Maus-Cursor überhaupt innerhalb der Dialogbox befindet. Hierzu können wir die objc_find-Funktion heranziehen. Die Koordinaten des Mauszeigers, die objc_find übergeben werden müssen, werden uns von evnt_multi in ev_buff zur Verfügung gestellt. Liefert objc_find einen Wert größer als Null zurück, befand sich der Mauszeiger innerhalb der Dialogbox. Andernfalls wird als Fehlersignal ein Glockenton ausgegeben, so wie es auch die “normale” form_do-Routine macht.
typedef struct {
int (*ub_code) (); /* Zeiger auf die eigene Funktion */
long ub_parm; /* ein optionaler Parameter */
} USERBLK;
Tabelle 2: Die USERBLK-Struktur
Wurde ein Objekt innerhalb der Dialogbox angeklickt, wird AES dieser Umstand mittels form_button mitgeteilt. Das GEM übernimmt den Rest der Arbeit, kümmert sich also z.B. darum, ob es sich beim angeklickten Objekt um einen Radio-Button handelt. In diesem Fall wird nicht nur der selektierte Button invertiert, sondern die restlichen Radio-Buttons werden deselektiert. Handelte es sich beim selektierten Objekt um einen Exit-Button, liefert form button einen Wert von Null zurück. Ist dies der Fall, wird der Dialog beendet.
Wurde ein Objekt ausgewählt, das keinen Exit-Status besitzt, muß zunächst geprüft werden, ob es überhaupt selektiert werden darf und es sich nicht z.B. um einen String handelt. Stellt das angeklickte Objekt ein Eingabefeld dar, muß der Text-Cursor auf dieses Feld plaziert werden. Hier hilft die objc_edit-Routine weiter. Zunächst wird der Text-Cursor an der alten Stelle entfernt und anschließend an der neuen Eingabeposition dargestellt.
Nun noch zur Darstellung eigener Objekttypen, wie im Fall von DIALOG dem String, der von einer abgerundeten Box umgeben ist. Will man die Zeichenroutinen des AES umgehen und das Aussehen von Objekten weitgehend selber bestimmen, muß man mit benutzerdefinierten Objekten (G_USERDEF bzw. G_PROGDEF) arbeiten. Bei Objekten dieser Art zeigt ob_spec (s.o.) auf eine USER BLK-Struktur (s. Tabelle 2). Trifft das AES beim Erstellen eines Dialogs auf diesen Objekttyp, wird die Objektdarstellung nicht vom AES übernommen, sondern stattdessen eine Routine aufgerufen, deren Adresse vom Programmierer in der obigen Objektstruktur festgelegt werden kann. DIALOG.PRG nutzt nun VDI-Routinen (nur solche dürfen beim Zeichnen eigener Objekte aufgerufen werden!) dazu, Text und Rahmen des ersten Strings der Dialogbox in einem eigenen Format, also mit abgerundeten Ecken, darzustellen. Natürlich sind an dieser Stelle die verschiedensten Manipulationen denkbar.
Eine Frage ist jedoch noch offen geblieben: Wie bringe ich im High-Byte des Objekttyps eigene Informationen unter? Hier kommt es auf das verwendete Resource Construction Set an. Die Methode, den Objekttyp für eigene Daten zu nutzen, wird z.B. durch das Resource Construction Set von Kuma unterstützt. Hier hat der Anwender die Möglichkeit, für jedes Objekt einen sogenannten “erweiterten Objekttyp” (extended object type) anzugeben. Die Zahl, die man an dieser Stelle einträgt, findet sich im High-Byte des Objekttyps wieder.
Soweit meine Erläuterungen zur Programmierung einer eigenen form_do-Routine. Weitere Informationen können dem kommentierten Programm-Listing entnommen werden. Auf die GEM-Routinen. die zur Darstellung einer Dialogbox benötigt werden, bin ich nicht näher eingegangen, da diese Problematik bereits des öfteren in zurückliegenden Ausgaben des ST-Magazins angesprochen wurde. Der Einbau der vorgestellten Routine in eigene Programme gestaltet sich recht einfach, da im Grunde genommen nur der Aufruf der form_do-Routine des AES durch die neue Routine ersetzt werden muß.
Es dürfte keine große Schwierigkeit darstellen, die Grundidee der vorgestellten Dialogverwaltung in andere Programmiersprachen zu übertragen, da DIALOG.PRG in der Hauptsache Gebrauch von Systemroutinen macht, die ja in Hochsprachen ähnlich wie in Assembler angesprochen werden.
[1]: Jankowski, Reschke, Rabich: Atari ST Profibuch (Sybex-Verlag)
******************************
* neue form_do-Routine *
* mit erweiterten Funktionen *
* 1989 by Uwe Seimet *
* (c) MAXON Computer GmbH *
******************************
*für die wenigen Systemaufrufe
GEMDOS = 1
MSHRINK = 74
BIOS = 13
BCONOUT = 3
move.l sp,a0
lea stack+400,sp ;Stackpointer initiali.
move.l 4(a0),a0 ;Pointer auf Basepage
move.l 12(a0),a1 ;Länge des TEXT-Segments
add.l 20(a0),a1 ;Länge des DATA-Segments
add.l 28(a0),a1 ;Länge des 'BSS-Segments
lea $100(a1),a1 ;256 Bytes für Basepage
move.l a1,-(sp)
move.l a0,-(sp)
clr -(sp)
move #MSHRINK,-(sp)
trap #GEMDOS ;nicht benötigten Speicher rück
lea 12(sp),sp
tst.l d0 ;Fehler?
bne error ;ja-
lea intin,a5 ;Pointer auf INTIN-Array
lea intout,a6 ;Pointer auf INTOUT-Array
moveq #10,d0 ;appl_init
move.l #$00010000,d1
bsr aes
bmi.s error ;Fehler-
moveq #7 7,d0 ;graf_handle
move.l #$00050000,d1
bsr aes
move.l a5,a0
moveq #9,d0
.opn: move #1,(a0)+
dbra d0,.opn
move #2,(a0)
moveq #100,d0 ;v_opnvwk
lea contrl+2,a3
clr.l (a3)+
move #11,(a3)
move (a6),6(a3) ;graf_handle
bsr vdiinit
move 6(a3),vdi_h ;vdi_handle merken
move #7,(a5) ;Objektzahl eintragen
fix: moveq #114,d0 ;rsrc_obfix
move.l #$01010100,d1
lea objc000(pc),a0 ;Adresse der Objektdaten
bsr aesobj ;Koordinaten umrechnen
subq #1,(a5)
bpl fix ;nächstes Objekt,wenn vorhanden
clr (a5) ;Pfeil als Mauscursor
moveq #78,d0 ;graf_mouse
move.l #$01010100,d1
bsr aes
lea objc000(pc),a4 ;Adresse der Dialogbox
moveq #2,d4 ;Nummer des ersten Eingabefeldes
bsr.s form_do ;Dialog ausführen
moveq #19,d0 ;appl_exit
move.l #$00010000,d1
bsr aes
error: clr -(sp) ;das war's
trap #GEMDOS
form_do:
moveq #54,d0 ;form_center
move.l #$00050100,d1
move.l a4,a0
bsr aesobj
movem.l 2(a6),d5/d6 ;form_xy und form_wh
clr d2 ;FMD_START
movem.l d5/d6,2(a5)
movem.l d5/d6,10(a5)
bsr.s form_dial
moveq #1,d0 ;bis zu Ebene 1 zeichnen
move.l d0,(a5)
movem.l d5/d6,4(a5)
moveq #42,d0 ;objc_draw
move.l #$06010100,d1
move.l a4,a0
bsr aesobj ;Dialogbox darstellen
bsr.s _form_do ;zur neuen Dialogroutine
moveq #3,d2 ;FMD_FINISH
movem.l d5/d6,2(a5)
movem.l d5/d6,10(a5)
form_dial:
moveq #51,d0 ;form_dial
move.l #$09010100,d1
move d2,(a5)
bra aes
*neue form_do-Routine, Exit-Button wird in D7 zurückgeliefert
_form_do:
moveq #1,d0 ;Cursor einschalten
bsr objcedit
move 2(a6),d3 ;Position des Cursors
dloop: move #1,2(a5) ;warten auf Mausklick
move #1,4(a5) ;auf linken Button warten
move #1,6(a5) ;gedrückter Mausbutton
moveq #25,d0 ;evnt_multi
move.l #$10070100,d1
move #3,(a5) ;MU_KEYBD |MU_BUTTON
lea ev_buff,a0
bsr aesobj ;Benutzeraktion abwarten
btst #1,1(a6) ;MU_BUTTON?
bne.s button ;ja-
move 10(a6),d0 ;Scan- und ASCII-Code der Taste
tst.b d0 ;ASCII-Zeichen?
bne.s noalt ;ja-
lsr #8,d0 ;Scancode ins low Byte
move.l a4,a0
uloop: cmp.b 6(a0),d0 ;Button für Taste gefunden?
beq.s default ;ja-
tst (a0) ;letztes Objekt erreicht
beq.s noalt ;ja-
lea 24(a0),a0 ;nächstes Objekt prüfen
bra uloop
default: sub.l a4,a0
move.l a0,d7
divu #24,d7 ;ergibt Objektnummer
move #1,12(a6) ;für Simulation Mausklick
bra.s obj
noalt: move 10(a6),2(a5) ;eingegebenes Zeichen
move d4,(a5) ;aktuelles Eingabefeld
clr 4(a5)
moveq #55,d0 ;form_keybd
move.l #$03030100,d1
move.l a4,a0
bsr aesobj
move 2(a6),d7 ;neues Eingabefeld
tst (a6) ;Exit-Objekt betätigt?
beq exit ;ja-
tst 4(a6) ;Wechsel des Eingabefeldes
beq.s newinput ;ja-
move 10(a6),2(a5) ;eingegebenes Zeichen
move d3,4(a5) ;aktuelle Cursorposition
moveq #2,d0 ;Zeichen ausgeben
bsr.s objcedit
move 2(a6),d3 ;neue Cursorposition
bra dloop
button: clr (a5)
move #1,2(a5) ;bis Ebene 1 suchen
move.l 2(a6),4(a5) ;aktuelle Mausposition
moveq #43,d0 ;objc_find
move.l #$04010100,d1
move.l a4,a0
bsr.s aesobj
move (a6),d7 ;Objektnummer
bpi.s obj ;Objekt wurde gefunden-
move #$07,-(sp) ;BEL
move #2,-(sp)
move #BCONOUT,-(sp)
trap #BIOS ;Glockenton als Fehlermeldung
addq.l #6,sp
bra dloop
obj: moveq #56,d0 ;form_button
move.l #$02020100,d1
move d7,(a5) ;angeklicktes Objekt
move 12(a6),2(a5) ;Anzahl der Mausklicks
move.l a4,a0
bsr.s aesobj
tst (a6) ;wurde Exit-Objekt klickt
beq.s exit ;ja-
move d7,d0
mulu #24,d0
btst #3,9(a4,d0) ;Objekt editierbar?
beq dloop ;nein-
cmp d7,d4 ;Wechsel des Eingabefeldes
beq dloop ;nein-
newinput:bsr.s exit ;Cursor abschalten
move d7,d4 ;neues Eingabefeld
bra _form_do ;Dialog fortführen
exit: move d3,4(a5) ;Cursorpos.
moveq #3,d0
objcedit:move d4,(a5) ;Nummer des Eingabefeldes
move d0,6(a5)
moveq #46,d0 ;objc_edit
move.l #$04020100,d1
move.l a4,a0
aesobj: move.l a0,addrin
aes: lea contrl,a0
move d0,(a0)
movep.l d1,3(a0)
move.l #aespb,d1
move #$c8,d0
trap #2 ;AES-Aufruf
rts
vdi: move vdi_h,contrl+12
vdiinit:move d0,contrl
move.l #vdipb,d1
moveq #$73,d0
trap #2 ;VDI-Aufruf
rts
*Benutzerdefiniertes Objekt zeichnen
draw:
move.l 4(sp),a0
move.l 10(a0),d0 ;x/y-Koordinaten
sub.l #$00030000,d0
move.l d0,ptsin
add.l #$00060000,d0
add.l 14(a0),d0
move.l d0,ptsin+4
lea contrl,a0
move.l #$02000000,d0
movep.l d0,3(a0)
move #8,contrl+10
moveq #11, d0 ;v_rbox
bsr vdi ;abgerundete Box zeichnen
move.l 4 (sp),a0
move.l 26(a0),a1 ;Pointer auf Textstring
lea intin,a2
clr d0
clr d1
.loop: move.b (a1)+,d0
beq.s .end
move d0,(a2)+
addq #1,d1
bra .loop
.end: move.l #$01000000,d0
lea contrl,a1
movep.l d0,3(a1)
move d1,contrl+6
move.l 10(a0),ptsin
add #17,ptsin+2
moveq #8,d0 ;v_gtext
bra vdi
user: dc.l draw
dc.l spec000
*Daten für die Dialogbox
*-----------------------------------------
*verwendete Objekttypen
BOX = 20
BUTTON = 26
STRING = 24
FTEXT = 29
objc000:.dc.w $ffff
.dc.w $0001,$0007
.dc.w BOX
.dc.w $0000,$0010
.dc.l $00021100
.dc.w $0007,$0004
.dc.w $002b,$000f
.dc.w $0002
.dc.w $ffff,$ffff
.dc.w STRING
.dc.w $0000,$0011
.dc.l user ;" Testdialog für neue form_do-Routine"
.dc.w $0003,$0001
.dc.w $0025,$0801
.dc.w $0003
.dc.w $ffff,$ffff
.dc.w FTEXT
.dc.w $0008,$0000
.dc.l spec001 ;"Eingabefeld 1:
_____________"
.dc.w $0009,$0005
.dc.w $0019,$0001
.dc.w $0004
.dc.w $ffff,$ffff
.dc.w FTEXT
.dc.w $0008,$0000
.dc.l spec002 ;"Eingabefeld 2:
_____________"
.dc.w $0009,$0007
.dc.w $0019,$0001
.dc.w $0005
.dc.w $ffff,$ffff
.dc.w $781a
.dc.w $0011,$0001
.dc.l spec003 ;"Radiobutton 1"
.dc.w $0007,$000a
.dc.w $000e,$0001
.dc.w $0006
.dc.w $ffff,$ffff
.dc.w $791a
.dc.w $0011,$0000
.dc.l spec004 ;"Radiobutton 2"
.dc.w $0016,$000a
.dc.w $000e,$0001
.dc.w $0007
.dc.w $ffff,$ffff
.dc.w BUTTON
.dc.w $0007,$0000
.dc.l spec005 ;"OK"
.dc.w $000c,$000d
.dc.w $0009,$0001
.dc.w $0000
.dc.w $ffff,$ffff
.dc.w $611a
.dc.w $0025,$0000
.dc.l spec006 ;"ABBRUCH"
.dc.w $0016,$000d
.dc.w $0009,$0001
spec000:.dc.b " Testdialog für neue form_do-Routine",0
spec001:.dc.l txt001,plt001,val001
.dc.w $0003
.dc.w $0006
.dc.w $0000
.dc.w $1180
.dc.w $0000
.dc.w $ffff
.dc.w $000b,$001a
txt001: .dc.b "@ ",0
plt001: .dc.b "Eingabefeld 1: _____________",0
val001: .dc.b "XXXXXXXXXX",0
spec002:.dc.l txt002,plt002,val002
.dc.w $0003
.dc.w $0006
.dc.w $0000
.dc.w $1180
.dc.w $0000
.dc.w $ffff
.dc.w $000b,$001a
txt002: .dc.b "@ ",0
plt002: .dc.b "Eingabefeld 2: _____________",0
val002: .dc.b "XXXXXXXXXX",0
spec003:.dc.b "Radiobutton 1",0
spec004:.dc.b "Radiobutton 2",0
spec005:.dc.b "OK",0
spec006:.dc.b "ABBRUCH",0
*****************************
* Konvertiert durch RSCCONV *
* Autor: Uwe Seimet *
* (C) 1989 by CCD *
*****************************
* ------------------------------------------------
data
aespb: dc.l contrl,global,intin,intout,addrin, addrout
vdipb: dc.l contrl,intin,ptsin,intout,ptsout
bss
*diverse AES- und VDI-Arrays
contrl: ds.w 11
global: ds.w 15
intin: ds.w 64
intout: ds.w 64
addrin: ds.w 64
addrout:ds.w 64
ptsin: ds.w 64
ptsout: ds.w 64
ev_kuff:ds.w 8 ;Puffer für evnt_multi
vdi_h: ds.w 1 ;VDI-Handle
even
stack: ds.l 100 ;eigener Stackbereich