`8BM /$p@ NuIMMUNIZED WITH UVK 5.6; NO VIRUS!!puke'(*** Y  @o!#@o'/O59/EGIOQOacegimq/`/ @ O / o @/oOo  !a!%a)/1!3A5a79;=?A!CAEaGIMOQOUW_a!cAegkoq!Ouay{!a!Oa!o/A!/Oo/O !o!!!O"""/#35b##AO$o$I$KOQUb%%%o''/)B)b)))))*"*B*b*****+"+B+b+++++,",O,b,ǂ,ɢ,,,-"-B-b-ׂ-٢---.".B.b...///B/o/  @o!#@o'/O59/EGIOQOacegimq/`/ @ O / o @/oOo  !a!%a)/1!3A5a79;=?A!CAEaGIMOQOUW_a!cAegkoq!Ouay{!a!Oa!o/A!/Oo/O !o!!!O"""/#35b##AO$o$I$KOQUb%%%o''/)B)b)))))*"*B*b*****+"+B+b+++++,",O,b,ǂ,ɢ,,,-"-B-b-ׂ-٢---.".B.b...///B/o/OK_CREW1993CREAD_ME TXT!#AES DBIOS DGEMDOS DLINEA D'UTIL D*VDI (EXBIOS E;1STGUIDEACC t41STGUIDEHLP d1STGUIDEIDX ͅ{1GEM tREADME ȈTASTATUR ц TOS K^> *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### | * * | | | \ | | \ | \ /\ / * * \_____/ | \ \______ | \ \______ \/ \/ * * * * If you want to order the latest GAME- PROFESSIONAL- or * * MIDI software, or the latest SUPER NINTENDO games, or a * * Copier for the SNES then just do the following thing... * * * * Send a 3" disk to the following address, and write * * down your name and address, you will get the latest * * lists and i *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### The Netherlands * * * ************************************************************** . D.. APPL DEVNT DFORM D*FSEL 'D:GRAF ,D>MENU =DROBJC ID^RSRC SDkSCRP \DuSHEL dDzWIND mDAES HLP w]READ_ME TXT!j. D.. DAPPL HLP .AAPPL_EXIC APPL_FINC 苇 APPL_INIC  APPL_REAC  XAPPL_WRIC  AVerwaltung von Applikationen Die Applikationsfunktionen auf einen Blick: appl_exitAPPL_EXI.C AES-Anwenderprogramm abmelden und Kennung freigeben. appl_findAPPL_FIN.C AES-Kennung einer anderen AES-Applikation ermitteln. appl_initAPPL_INI.C AES-Anwendung anmelden. appl_readAPPL_REA.C AES-Mitteilungen lesen. appl_tplayAPPL_TPL.C Ereignisse abspielen. appl_trecordAPPL_TRE.C Ereignisse aufzeichnen. appl_writeAPPL_WRI.C AES-Mitteilungen schreiben. Jede Applikation unter GEM hat ein Anfang und ein Ende: Mit appl_initAPPL_INI.C meldet man sie ordnungsgem unter GEM an. Am Ende eines Programms verlt man das AES-System mit appl_exitAPPL_EXI.C. Um mit anderen Applika- tionen kommunizieren zu knnen, mu man zuerst mit appl_findAPPL_FIN.C deren Kennung ermitteln. Anschlieend kann man mit appl_writeAPPL_WRI.C Mitteilungen an andere Programme weitergeben. Mit appl_readAPPL_REA.C kann man dann lngere Mitteilungen empfangen, fr krzere (bis zu 16 Bytes) empfiehlt sich jedoch der Gebrauch der Funktion evnt_mesag..\EVNT\EVNT_MES.C. Insbesondere fr De- monstrationen und die Implementation von Makro-Recordern eignen sich die Funktionen appl_trecordAPPL_TRE.C und appl_tplayAPPL_TPL.C. Damit lassen sich GEM- Ereignisse aufzeichnen und wieder abspielen. /* * APPL_EXIT (C) Digital Design 1990 * * Dieser Befehl ist am Ende jeder erfolgreich initialisierten Applikation * aufzurufen. * Damit wird die bei APPL_INITAPPL_INI.C erhaltene Identifikationsnummer wieder * freigegeben und dem AES fr weitere Applikationen zur Verfgung gestellt. */ #include int appl_exit( void ) { AES( 19, 0, 1, 0, 0 ); return intout[0]; } /* * APPL_FIND (C) Digital Design 1990 */ #include int appl_find( char *ap_fpname ) { addrin[0] = ap_fpname; AES( 13, 0, 1, 1, 0 ); return intout[0]; } /* * APPL_INIT (C) Digital Design 1990 * * Dieser Befehl dient zur Anmeldung der Applikation bei GEM-AES und mu * auf jeden Fall vor jedem anderen AES-Aufruf abgesetzt werden. * Das ist ntig, weil AES mehrere Applikationen bzw. Accessories gleich- * zeitig verwalten knnen und daher wissen mu, da sich die Applikation * bzw. das Accessory im Speicher befindet. * Als Ergebnis erhlt man die sogenannte Idendifikationsnummer der Appli- * kation zurck. Diese wird zum Datenaustausch zwischen AES und der Appli- * kation sowie zwischen verschiedenen Applikationen bentigt. * Wenn sich zu viele Applikationen gleichzeitig im Speicher befinden, er- * hlt man die Nummer -1 (0xFFFF) zurck. In diesem Fall sollte das Pro- * gramm sofort beendet werden. * War die Initialisierung erfolgreich, so ist am Ende des Programms der * Aufruf von APPL_EXITAPPL_EXI.C erforderlich, um die benutzte Identifikationsnummer * wieder freizugeben. */ #include int appl_init( void ) { AES( 10, 0, 1, 0, 0 ); return intout[0]; /* = appl_id, die Identifikationsnummer der Appli- * * kation, oder -1 (0xFFFF) im Fehlerfalle. */ } /* * APPL_READ (C) Digital Design 1990 * * Aus einem Ereignispuffer wird eine bestimmte Anzahl von Bytes gelesen. */ #include int appl_read( int ap_rid, int ap_rlength, void *ap_rpbuff ) { intin[0] = ap_rid; /* Identifikationsnummer der Applikation, fr die * * der Ereignispuffer gelesen werden soll. */ intin[1] = ap_rlength; /* Die Anzahl der Bytes, die gelesen werden * * sollen. */ addrin[0] = ap_rpbuff; /* Adresse des Puffers, der die zu lesenden * * Bytes enthlt. */ AES( 11, 2, 1, 1, 0 ); return intout[0]; /* = ap_rreturn, positiv bei Erfolg, 0 bei Fehler. */ } /* siehe auch: APPL_WRITEAPPL_WRI.C */ /* * APPL_WRITE (C) Digital Design 1990 * * In einen Ereignispuffer wird eine bestimmte Anzahl von Bytes * geschrieben. */ #include int appl_write( int ap_wid, int ap_wlength, void *ap_wpbuff ) { intin[0] = ap_wid; /* Identifikationsnummer der Applikation, fr die * * der Ereignispuffer beschrieben wird (im allge- * * meinen eine andere, parallel arbeitende Appli- * * kation, die durch diesen Befehl eine * * Information erhalten soll). */ intin[1] = ap_wlength; /* Die Anzahl der Bytes, die geschrieben * * werden sollen. */ addrin[0] = ap_wpbuff; /* Adresse des Puffers, der die zu * * schreibenden Bytes enthlt. */ AES( 12, 2, 1, 1, 0 ); return intout[0]; /* = ap_wreturn, positiv bei Erfolg, 0 bei Fehler. */ } /* siehe auch: APPL_READAPPL_REA.C */ . D.. DEVNT HLP LJEVNT_BUTC  EVNT_KEYC  EVNT_MESC ܜ7SEVNT_MOUC " EVNT_MULC %EVNT_TIMC )Ereignisse im Multi-Tasking-Betrieb Die Ereignisfunktionen auf einen Blick: evnt_buttonEVNT_BUT.C Auf Maustastendruck warten. evnt_dclickEVNT_DCL.C Doppelklickintervall ermitteln oder ndern. evnt_keybdEVNT_KEY.C Auf Tastendruck warten. evnt_mesagEVNT_MES.C Auf Mitteilung warten. evnt_mouseEVNT_MOU.C Auf Mausbewegungen in ein Rechteck hinein (oder auch heraus) warten. evnt_multiEVNT_MUL.C Auf mehrere Ereignisse wie Maustastendruck, Mausbewegungen usw. gleichzeitig warten. evnt_timerEVNT_TIM.C Eine bestimmte Zeitspanne lang warten. Alle Benutzereingaben werden unter GEM als Ereignisse aufgefat. Folgende Ereignisse knnen nun auftreten: Tastatureingaben Mausbewegungen Maustastendruck Zeitgeber Timeout Mitteilungen Alle diese Ereignisse haben eine Gemeinsamkeit: Sie werden auerhalb des betrachteten Programms erzeugt. Sie knnen deshalb nur durch spezielle Vorkehrungen abgefangen werden. Um Benutzeraktionen in einem Programm entgegenzunehmen, gibt es zwei grundstzliche Strategien: Polling und Interruptsteuerung. Polling be- deutet, da der Anwender von Zeit zu Zeit selbst nachfragen mu, ob gerade ein bestimmtes Ereignis eingetreten ist. Mehrere Eingabegerte gleichzeitig per Polling abzufragen, ohne da Benutzerereignisse ver- loren gehen, ist eine sehr aufwendige Angelegenheit, die die meisten Anwenderprogramme um ein Vielfaches komplizierter machen wrde. GEM bietet deshalb in Form von evnt_multiEVNT_MUL.C eine Funktion an, die im Stande ist, mehrere Benutzerereignisse gleichzeitig abzufangen und zu verwal- ten. Die interne Organisation dieser Funktion beruht natrlich auf einem Interuptmechanismus, so da Ereignisse nicht verloren gehen knnen. Die Funktion evnt_multiEVNT_MUL.C kann ganz spezifisch je nach den Anforderungen des Anwenderprogramms auf bestimmte Ereignisse angesetzt werden. Wh- rend der Zeit, in der evnt_multiEVNT_MUL.C auf Ereignisse wartet, knnen andere GEM-Programme im Hintergrund abgearbeitet werden. Die Ereignisverwal- tung ist demnach sehr eng mit dem Multi-Tasking-Kernel verknpft. Das Multi-Tasking-Schema ist jedoch sehr einfach ausgelegt. Es knnen lediglich bis zu fnf Tasks (sprich Aufgaben) gleichzeitig ablaufen: Drei Accessory-Programme, eine Applikation und der Bildschirmmanager. Die einzelnen Tasks werden der Reihe nach mit Hilfe eines Dispatchers abgearbeitet. Ein Dispatcher ist ein Programm im Betriebssystem, das vergleichbar ist mit einem Dirigenten in einem Orchester. Seine Auf- gabe ist es den Mitspielern im richtigen Moment den Einsatz zu geben. Jeder AES-Proze luft nun dauernd durch die Schleife des Dispatchers. Wenn die Applikation noch auf ein Ereignis wartet, wird sie in die Reihe der noch nicht fertigen Prozesse gelegt. Tritt das Ereignis ein, dann kommt der Proze in die Warteschlange der fertigen Prozesse und mu dort solange auf die Weiterverarbeitung warten, bis die bereits wartenden Prozesse vor ihm abgearbeitet wurden. Schlielich wird das Programm abgearbeitet und nach einem Aufruf einer evnt-Funktion wieder in die Reihe der noch nicht fertigen Prozesse eingereiht. Falls das Programm jedoch auf kein Ereignis warten mu, kann es sich direkt an der Schlange der fertigen Prozesse anstellen. Die Umschaltung von einer Task auf die andere kann nur whrend des Aufrufs von AES-Funktionen erfolgen. Ein Programm, das ber weite Strecken lediglich VDI-Fumktionen oder Betriebssystem-Funktionen verwendet, luft demnach Gefahr, andere Applikationen vllig abzu- hngen. Dem Bildschirmmanager kommt als eigenstndige Task eine sehr wichtige Aufgabe zu: Er verwaltet alle Mausbewegungen im Zusammenhang mit selektierbaren Bildschirmbereichen, wie zum Beispiel den Mens. Wird zum Beispiel ein Menpunkt ausgewhlt, dann sendet der Bildschirmmana- ger eine Mitteilung ber dieses Ereignis an das Anwenderprogramm. Alle Ereignisse, die von evnt_multiEVNT_MUL.C auf einmal abgefangen werden knnen, lassen sich auch einzeln ermitteln. evnt_keybdEVNT_KEY.C nimmt alle Tastatur-Eingaben entgegen. evnt_buttonEVNT_BUT.C ist fr die Maustasten zu- stndig. Die Geschwindigkeit bei Doppelklicks kann mit evnt_dclickEVNT_DCL.C anwendungsspezifisch eingestellt werden. Mit evnt_mouseEVNT_MOU.C werden die Bewegungen der Maus berwacht. Mitteilungen werden ber die Funktion evnt_mesagEVNT_MES.C analysiert. Die Funktion evnt_timerEVNT_TIM.C legt eine Time- out-Periode fest. Whrend die letztgenannten Einzelfunktionen nur in Spezialsituationen zum Einsatz kommen, stellt evnt_multiEVNT_MUL.C das Kern- stck eines jeden GEM-Programms dar. Nach den Initialisierungen von Bildschirm, Mens und Resource-Set bewegt man sich normalerweise in einer Endlosschleife, die nur bei schweren Fehlern oder der Option Quit verlassen wird. /* * EVNT_BUTTON (C) Digital Design 1990 * * AES wartet, bis einer (oder mehrere) Mausknpfe bettigt werden. */ #include int evnt_button( int ev_bclicks, int ev_bmask, int ev_bstate, int *ev_bmx, int *ev_bmy, int *ev_bbutton, int *ev_bkstate ) { intin[0] = ev_bclicks; /* Die Anzahl der "Mausklicks", die zu einer * * Reaktion der Applikation fhren sollen. * * Gewhnlich wird der Wert 1 fr einfachen * * Tastendruck oder 2 fr einen Doppelklick * * verwendet. Grere Werte sollten Sie nicht * * angeben, denn nicht jeder Benutzer besitzt * * die Fhigkeit, den Mausknopf in Sekunden- * * bruchteilen mehrmals zu bettigen. */ intin[1] = ev_bmask; /* Jeder Mausknopf, der bei der Abfrage der * * Maustasten bercksichtigt werden soll, wird * * durch ein gesetztes Bit reprsentiert: * * 01 = linker Knopf * * 02 = rechter Knopf * * 03 = beide Knpfe */ intin[2] = ev_bstate; /* Hier wird festgelegt, welcher Zustand der in * * ev_bmask spezifizierten Maustasten bei der * * Auslsung des Ereignisses relevant sein * * soll. Dabei gilt die gleiche Bitbelegung wie * * oben, die Bitwerte haben folgende Bedeutung: * * 0 = Knopf nicht bettigt * * 1 = Knopf bettigt */ AES( 21, 3, 5, 0, 0 ); *ev_bmx = intout[1]; /* X-Koordinate des Mauszeigers zum Zeitpunkt * * der Tastenbettigung */ *ev_bmy = intout[2]; /* Y-Koordinate des Mauszeigers zum Zeitpunkt * * der Tastenbettigung */ *ev_bbutton = intout[3]; /* Bettigte Mausknpfe; Werte wie bei * * ev_bmask und ev_bstate */ *ev_bkstate = intout[4]; /* Status der Tasten der Tastatur, die * * keinen ASCII-Kode senden. Folgende * * Bit-Werte gelten: * * 1 = rechte Shift-Taste * * 2 = linke Shift-Taste * * 4 = Control-Taste * * 8 = Alternate-Taste * * Bit = 0: Taste nicht bettigt * * Bit = 1: Taste bettigt */ return intout[0]; /* = ev_breturn: Gibt an, wie oft der Mausknopf * * bettigt wurde, diese Zahl liegt zwischen 1 und * * ev_bclicks. */ } /* siehe auch: EVNT_MULTIEVNT_MUL.C */ /* * EVNT_KEYBD (C) Digital Design 1990 * * AES wartet auf einen Tastendruck und gibt den Kode der bettigten * Taste aus. */ #include int evnt_keybd( void ) { AES( 20, 0, 1, 0, 0 ); return intout[0]; /* = ev_kreturn, der Scancode der bettigten Taste. * * Bei den Standardzeichen enthlt das Low-Byte den * * ASCII-Kode des Zeichens. */ } /* siehe auch: EVNT_MULTIEVNT_MUL.C */ /* * EVNT_MESAG (C) Digital Design 1990 * * AES wartet, bis eine Nachricht im Ereignispuffer vorliegt. * Mit Hilfe dieses Befehles werden Fenstermanipulationen sowie die * Interaktion des Benutzers mit der Menleiste berwacht. */ #include int evnt_mesag( int *ev_mgpbuff ) { addrin[0] = ev_mgpbuff; /* Adresse des 16 Bytes groen Speicherbe- * * reichs, in dem die Nachricht abgelegt wer- * * den soll (message pipe). * * Die ersten 3 Wrter des Puffers werden von * * AES unabhngig vom Typ des aufgetretenen * * Ereignisses belegt: * * * * Wort 0: Eine Nummer zur Erkennung des * * Ereignisses. * * Wort 1: apid (Applikationskennziffer) der * * Applikation, die fr das Auftreten * * des Ereignisses verantwortlich ist.* * Wort 2: Die Lnge der Nachricht ohne Be- * * rcksichtigung der 16-Byte-Grenze. * * Falls Wort 2 gleich Null ist, ist * * die Nachricht krzer als 16 Bytes, * * ansonsten gibt Wort 2 die Lnge * * minus 16 Bytes an. In diesem Fall * * sollten Sie unbedingt von der * * Funktion APPL_READ..\APPL\APPL_REA.C Gebrauch machen.* * * * Folgende Ereignisse werden im Pipeline- * * Puffer festgehalten: * * * * MN_SELECTED: * * * * Dieses Ereignis signalisiert, da der Be- * * nutzer einen Punkt aus dem Drop-Down-Men * * gewhlt hat. * * Wort 0 = 10 * * Wort 3 = Object-Index des Men-Titels * * Wort 4 = Object-Index des Men-Eintrags * * * * WM_REDRAW: * * * * Der Benutzer hat einen Schritt durchge- * * fhrt, der das Neuzeichnen eines bestimm- * * ten Bildschirmbereichs erforderlich macht, * * wenn beispielsweise ein Bearbeitungsformu- * * lar wieder vom Bildschirm gelscht werden * * soll. * * Wort 0 = 20 * * Wort 3 = Window Handle (Fensterkennziffer)* * Wort 4 = X-Koordinate des neu zu zeich- * * nenden Bereichs * * Wort 5 = Y-Koordinate des neu zu zeich- * * nenden Bereichs * * Wort 6 = Breite des neu zu zeichnenden * * Bereichs * * Wort 7 = Hhe des neu zu zeichnenden * * Bereichs * * * * WM_TOPPED: * * * * Der Benutzer mchte ein Fenster aktivieren.* * Nur ein aktives Fenster gleichzeitig ist * * mglich. Dieses kann in Gre und Position * * verndert werden. * * Wort 0 = 21 * * Wort 3 = Window Handle * * * * WM_CLOSED: * * * * Der Benutzer hat das Lschfeld (= Schlie- * * feld, engl. close box) des aktiven * * Fensters angeklickt, um es zu lschen. * * Wort 0 = 22 * * Wort 3 = Window Handle * * * * WM_FULLED: * * * * Der Benutzer hat das Bildschirmformatfeld * * (Vollfeld, engl. full box) angeklickt, um * * das aktive Fenster auf Bildschirmformat zu * * vergrern oder wieder zu verkleinern. * * * * WM_ARROWED: * * * * Der Benutzer hat einen der vier Pfeile * * oder eines der beiden Scrollfelder ange- * * klickt, um eine Bewegung um eine Zeile * * (bzw. Spalte) oder um eine Seite durchzu- * * fhren. * * Wort 0 = 24 * * Wort 3 = Window Handle * * Wort 4 = Feld des Randbereichs, das ange- * * klickt wurde: * * 0 = Seite nach oben * * 1 = Seite nach unten * * 2 = Zeile nach oben * * 3 = Zeile nach unten * * 4 = Seite nach links * * 5 = Seite nach rechts * * 6 = Spalte nach links * * 7 = Spalte nach rechts * * * * WM_HSLID: * * * * Der Benutzer hat den horizontalen Schieber * * auf eine neue Position geschoben. * * Wort 0 = 25 * * Wort 3 = Window Handle * * Wort 4 = relative Position des Schiebers * * von 0-1000. * * 0 = Position ganz links * * 1000 = Position ganz rechts * * * * WM_VSLID: * * * * Der Benutzer hat den vertikalen Schieber * * auf eine neue Position geschoben. * * Wort 0 = 26 * * Wort 3 = Window Handle * * Wort 4 = relative Position des Schiebers * * von 0-1000 * * 0 = Position ganz oben * * 1000 = Position ganz unten * * * * WM_SIZED: * * * * Der Benutzer hat das Grenfeld (engl. * * size box) mit der Maus angewhlt und * * mchte die Gre des Fensters ndern. Die * * neue Gre wird einschlielich Randelemen- * * te angegeben. * * Wort 0 = 27 * * Wort 3 = Window Handle * * Wort 4 = gewnschte X-Koordinate des Fen- * * sters (stimmt mit der momentanen * * X-Koordinate berein) * * Wort 5 = gewnschte Y-Koordinate des Fen- * * sters (stimmt mit der momentanen * * Y-Koordinate berein) * * Wort 6 = gewnschte (neue) Breite des * * Fensters * * Wort 7 = gewnschte (neue) Hhe des * * Fensters * * * * WM_MOVED: * * * * Der Benutzer hat das Positionsfeld mit der * * Maus angewhlt und mchte die Position des * * Fensters ndern. Die neue Position wird * * einschlielich Randelemente angegeben. * * Wort 0 = 28 * * Wort 3 = Window Handle * * Wort 4 = gewnschte (neue) X-Koordinate * * des Fensters * * Wort 5 = gewnschte (neue) Y-Koordinate * * Wort 6 = gewnschte Breite des Fensters * * (stimmt mit der momentanen * * Breite berein) * * Wort 7 = gewnschte Hhe des Fensters * * (stimmt mit der momentanen * * Hhe berein) * * * * WM_NEWTOP: * * * * Der Applikation wird mitgeteilt, da ein * * Fenster aktiviert wurde. * * Wort 0 = 30 * * Wort 3 = Window Handle * * * * AC_OPEN: * * * * Der Benutzer hat eines der sechs mglichen * * Schreibtischzubehre ausgewhlt. * * Wort 0 = 30 * * Wort 3 = die Menidentifikationsnummer, * * die durch die Funktion * * MENU_REGISTER..\MENU\MENU_REG.C erfragt werden kann* * * * AC_CLOSE: * * * * Dieses Ereignis tritt bei folgenden Bedin- * * gungen ein: * * - Der Bildschirm wird gelscht. * * - Die Fensterdaten haben sich gendert. * * - Die laufende Applikation ist abgebrochen * * worden. * * Wort 0 = 31 * * Wort 3 = Menidentifikationsnummer * * (siehe auch AC_OPEN) */ AES( 23, 0, 1, 1, 0 ); return intout[0]; /* reserviert fr zuknftige Anwendungen. Der Wert * * wird immer auf 1 gesetzt. */ } /* siehe auch: EVNT_MULTIEVNT_MUL.C */ /* * EVNT_MOUSE (C) Digital Design 1990 * * AES wartet, bis der Mauszeiger ein bestimmtes rechteckig umgrenztes * Feld betritt oder verlt. */ #include int evnt_mouse( int ev_moflags, int ev_mox, int ev_moy, int ev_mowidth, int ev_moheight, int *ev_momx, int *ev_momy, int *ev_mobutton, int *ev_mokstate ) { intin[0] = ev_moflags; /* Gibt an, welche der beiden Teilfunktionen * * aktiviert werden soll: * * 0 = Funktion bei Eintritt in das * * Rechteck beenden * * 1 = Funktion bei Austritt aus dem * * Rechteck beenden */ intin[1] = ev_mox; /* X-Koordinate des Rechtecks */ intin[2] = ev_moy; /* Y-Koordinate des Rechtecks */ intin[3] = ev_mowidth; /* Breite des Rechtecks */ intin[4] = ev_moheight; /* Hhe des Rechtecks */ AES( 22, 5, 5, 0, 0 ); *ev_momx = intout[0]; /* X-Position des Mauszeigers beim Auslsen des * * Ereignisses */ *ev_momy = intout[2]; /* Y-Position des Mauszeigers beim Auslsen des * * Ereignisses */ *ev_mobutton = intout[3]; /* Status der Maustasten beim Auslsen des * * Ereignisses. Es gilt folgende Tastenbe- * * legung: * * 1 = linker Knopf * * 2 = rechter Knopf * * Bit = 0: Taste nicht bettigt * * Bit = 1: Taste bettigt */ *ev_mokstate = intout[4]; /* Status der Tastatur beim Auslsen des * * Ereignisses: * * 1 = rechte Shift-Taste * * 2 = linke Shift-Taste * * 4 = Contrl-Taste * * 8 = Alternate-Taste * * Bit = 0: Taste nicht bettigt * * Bit = 1: Taste bettigt */ return intout[0]; /* = ev_moresvd: reserviert fr zuknftige Anwen- * * dungen; wird immer auf 1 gesetzt. */ } /* siehe auch: EVNT_MULTIEVNT_MUL.C */ /* * EVNT_MULTI (C) Digital Design 1990 * * AES wartet auf das Eintreten eines oder mehrerer Ereignisse. * Die Funktion kann auf zwei Maus-Ereignisse reagieren, die Parameter * fr das erste Rechteck haben die Bezeichnung ev_mm1..., die fr das * zweite ev_mm2... */ #include int evnt_multi( int ev_mflags, int ev_mbclicks, int ev_mbmask, int ev_mbstate, int ev_mm1flags, int ev_mm1x, int ev_mm1y, int ev_mm1width, int ev_mm1height, int ev_mm2flags, int ev_mm2x, int ev_mm2y, int ev_mm2width, int ev_mm2height, int *ev_mmgpbuff, int ev_mtlocount, int ev_mthicount, int *ev_mmox, int *ev_mmoy, int *ev_mmobutton, int *ev_mmokstate, int *ev_mkreturn, int *ev_mbreturn ) { intin[0] = ev_mflags; /* Die Art des kombinierten Ereignisses, auf * * dessen Eintreten (eines der Unterereignisse) * * gewartet werden soll. Jedes aktive Ereignis * * ist durch ein gesetztes Bit reprsentiert. * * Dabei gilt folgende Bit-Belegung: * * Bit 0: MU_KEYBD (Tastaturereignis) * * Bit 1: MU_BUTTON (Mausknopf-Ereignis) * * Bit 2: MU_M1 (Maus-Ereignis, 1. Rechteck) * * Bit 3: MU_M2 (Maus-Ereignis, 2. Rechteck) * * Bit 4: MU_MESAG (Nachricht aufgetreten) * * Bit 5: MU_TIMER (Zeitgeber-Ereignis) */ intin[1] = ev_mbclicks; /* siehe EVNT_BUTTONEVNT_BUT.C */ intin[2] = ev_mbmask; /* siehe EVNT_BUTTONEVNT_BUT.C */ intin[3] = ev_mbstate; /* siehe EVNT_BUTTONEVNT_BUT.C */ intin[4] = ev_mm1flags; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[5] = ev_mm1x; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[6] = ev_mm1y; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[7] = ev_mm1width; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[8] = ev_mm1height; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[9] = ev_mm2flags; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[10] = ev_mm2x; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[11] = ev_mm2y; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[12] = ev_mm2width; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[13] = ev_mm2height; /* siehe EVNT_MOUSEEVNT_MOU.C */ intin[14] = ev_mtlocount; /* siehe EVNT_TIMEREVNT_TIM.C */ intin[15] = ev_mthicount; /* siehe EVNT_TIMEREVNT_TIM.C */ addrin[0] = ev_mmgpbuff; /* siehe EVNT_MESAGEVNT_MES.C */ AES( 25, 16, 7, 1, 0 ); *ev_mmox = intout[1]; /* siehe EVNT_MOUSEEVNT_MOU.C */ *ev_mmoy = intout[2]; /* siehe EVNT_MOUSEEVNT_MOU.C */ *ev_mmobutton = intout[3]; /* siehe EVNT_MOUSEEVNT_MOU.C */ *ev_mmokstate = intout[4]; /* siehe EVNT_MOUSEEVNT_MOU.C */ *ev_mkreturn = intout[5]; /* siehe EVNT_KEYBDEVNT_KEY.C */ *ev_mbreturn = intout[6]; /* siehe EVNT_BUTTONEVNT_BUT.C */ return intout[0]; /* = ev_mwhich: Das Ereignis bzw. die Ereignisse, * * das/die aufgetreten ist/sind. Die Bit-Belegung * * ist die gleiche wie bei ev_mflags. */ } /* * EVNT_TIMER (C) Digital Design 1990 * * AES wartet, bis eine bestimmte Zeit verstrichen ist. */ #include int evnt_timer( int ev_tlocount, int ev_thicount ) { intin[0] = ev_tlocount; /* Low-Word und */ intin[1] = ev_thicount; /* High-Word eines 64-Bit-Wertes, der die * * Anzahl von Millisekunden angibt, die AES * * warten soll. */ AES( 24, 2, 1, 0, 0 ); return intout[0]; /* = ev_tresvd: reserviert fr zuknftige Anwendun- * * gen; der Wert wird immer auf 1 gesetzt. */ } /* siehe auch: EVNT_MULTIEVNT_MUL.C */ . D*.. DFORM HLP ]+FORM_ALEC 7- FORM_BUTC 1FORM_CENC 2FORM_DIAC )73 FORM_DO C 6XFORM_ERRC zr7FORM_KEYC 8READ_ME TXT!ZFormulare Die Formularfunktionen auf einen Blick: form_alertFORM_ALE.C Alarmbox darstellen. form_buttonFORM_BUT.C Auswerten eines Mausklicks ber einem Formular. form_centerFORM_CEN.C Koordinaten fr eine zentrierte Objektausgabe berechnen. form_dialFORM_DIA.C Bildschirmspeicher reservieren und freigeben. form_doFORM_DO.C Eingaben in einem Formular aufnehmen. form_errorFORM_ERR.C Betriebssystemfehlermeldung ausgeben. form_keybdFORM_KEY.C Auswerten einer Tastatureingabe. Mit den Formularfunktionen kann man bestimmte, hufig bentigte Ele- mente fr die Benutzerfhrung sehr schnell aktivieren. Insbesondere fr Fehlermeldungen und Ja/Nein-Entscheidungen eignen sich die beiden Funktionen form_errorFORM_ERR.C und form_alertFORM_ALE.C hervorragend. Daneben sind in dieser Funktionsreihe einige Funktionen zur Manipulation und Darstel- lung von Objekten integriert: form_centerFORM_CEN.C, form_dialFORM_DIA.C und form_doFORM_DO.C. Die beiden Funktionen form_buttonFORM_BUT.C und form_keybdFORM_KEY.C sind nicht offiziell dokumentiert, funktionieren aber in der angegebenen Weise. /* * FORM_ALERT (C) Digital Design 1990 * * Darstellen einer Warnmeldung. * Es handelt sich hierbei um eine besondere Form von Formularen. * Neben einem Piktogramm (optional) wird ein zu programmierender * Begleittext ausgegeben. Der Benutzer kann die Meldung quittieren, * indem er eins von hchstens 3 Quittierungsfeldern anklickt bzw. * Return bettigt (optional). Die Gre des Feldes fr die Warn- * meldung sowie die Position (Zentrum des Bildschirms) wird von AES..\AES.HLP * bestimmt und kann nicht verndert werden. Die Informationen ber die * 3 Komponenten werden in einem String gespeichert, wobei um jede Kom- * ponente ein Paar eckige Klammern gesetzt werden mu. * Beim Aufruf dieser Funktion werden folgende Schritte automatisch von * AES..\AES.HLP durchgefhrt: * * 1. Anhand des oben beschriebenen Strings wird ein passender Objekt- * baum definiert. * * 2. Der Bildschirmspeicher wird teilweise in einen Puffer gerettet. * * 3. OBJC_DRAW..\OBJC\OBJC_DRA.C wird aufgerufen, um die Warnmeldung darzustellen. * * 4. FORM_DOFORM_DO.C wird aufgerufen, um auf die Benutzereingabe zu warten. * * 5. Wenn der Benutzer die Warnmeldung quittiert hat, wird der zer- * strte Bildschirmbereich restauriert. * * 6. Der Applikation wird mitgeteilt, welcher Knopf angeklickt worden * ist. */ #include int form_alert( int fo_adefbttn, const char *fo_astring ) { intin[0] = fo_adefbttn; /* Nummer des Knopfes, dessen Auslsen durch * * Bettigen von Return simuliert werden kann:* * 0 = kein Knopf * * 1 = erster Knopf * * 2 = zweiter Knopf * * 3 = dritter Knopf */ addrin[0] = fo_astring; /* Adresse des Strings, der das Aussehen der * * Warnmeldung bestimmt. * * Aufbau des Strings: * * [Piktogrammnummer][Text][Text der * * Quittierungsknpfe] * * Folgende Syntax ist der Darstellung der * * Komponenten zugeordnet: * * * * 1. Piktogramm: * * Eine Ziffer gibt an, ob ein bzw. welches * * Piktogramm links vom Text dargestellt * * werden soll. Drei Piktogramme stehen zur * * Auswahl: * * 0 = kein Piktogramm * * 1 = NOTE-Piktogramm * * 2 = WAIT-Piktogramm * * 3 = STOP-Piktogramm * * * * 2. Text: * * Der Text darf aus maximal 5 Zeilen mit * * maximal 40 Zeichen pro Zeile bestehen. Das * * Zeichen "|" (logisches Oder) trennt Zeilen * * voneinander. * * * * 3. Text der Quittierungsknpfe: * * Die Zahl der Quittierungsknpfe mu zwi- * * schen 1 und 3 liegen. Der Text auf jedem * * Knopf darf maximal 20 Zeichen lang sein. * * Beim Funktionsaufruf kann ein Knopf als * * Ausgangsknopf definiert werden, d.h. da * * das Anklicken dieses Knopfes durch das Be- * * ttigen der Return-Taste simuliert werden * * kann. Dieser Knopf wird strker umrandet * * gezeichnet. Der Text fr die Knpfe wird * * durch den gleichen Zeilentrenner wie beim * * Text (s.o.) getrennt. */ AES( 52, 1, 1, 1, 0 ); return intout[0]; /* = fo_aexbttn: Nummer des Knopfes, der vom * * Benutzer zur Quittierung bettigt wurde: * * 1 = erster Knopf * * 2 = zweiter Knopf * * 3 = dritter Knopf */ } /* siehe auch: form_errorFORM_ERR.C */ /* * FORM_BUTTON (C) Digital Design 1992 * * Nimmt Mausknopfeingaben in ein Formular vor * (simuliert das Anklicken eines Objekts). */ #include int form_button( OBJECT *fo_btree, int fo_bobject, int fo_bclicks, int *fo_bnxtobj ) { addrin[0] = fo_btree; /* Anfangsadresse des Objektbaumes */ intin[0] = fo_bobject; /* Objekt, das bearbeitet werden soll */ intin[1] = fo_bclicks; /* Anzahl der zu simulierenden * * Mausklicks */ AES( 56, 2, 2, 1, 0 ); *fo_bnxtobj = intout[1]; /* neues aktuelles Objekt (bei Doppelklick * * auf ein TOUCHEXIT-Objekt wird Bit 15 * * gesetzt) oder * * 0 : Das nchste Objekt hat HIDDEN- oder * * DISABLED-Status oder ist nicht * * EDITABLE */ return intout[0]; /* = 0 : Es wurde zuletzt ein EXIT- oder * * TOUCHEXIT-Objekt angeklickt * * > 0 : Dialog noch nicht abgeschlossen */ } /* siehe auch: form_keybdFORM_KEY.C */ /* * FORM_CENTER (C) Digital Design 1990 * * Es werden die Koordinaten eines bestimmten Objektbaumes berechnet, so * da dieser im Fall einer Darstellung mit diesen Koordinaten in der * Mitte des Bildschirms erscheinen wrde. */ #include int form_center( OBJECT *fo_ctree, int *fo_cx, int *fo_cy, int *fo_cw, int *fo_ch ) { addrin[0] = fo_ctree; /* Adresse der Baumstruktur, deren zentrierte * * Koordinaten berechnet werden sollen */ AES( 54, 0, 5, 1, 0 ); *fo_cx = intout[1]; /* X-Koordinate des Objektbaumes (zentriert) */ *fo_cy = intout[2]; /* Y-Koordinate des Objektbaumes (zentriert) */ *fo_cw = intout[3]; /* Breite des Objektbaumes */ *fo_ch = intout[4]; /* Hhe des Objektbaumes */ return intout[0]; /* = fo_cresvd: reserviert fr zuknftige Anwendun- * * gen. Der Wert ist immer 1. */ } /* siehe auch: objc_draw..\OBJC\OBJC_DRA.C, form_doFORM_DO.C */ /* * FORM_DIAL (C) Digital Design 1990 * * Diese Funktion beinhaltet eigentlich vier Funktionen, die mit 0 bis * 3 numeriert sind und die bei der Formularverwaltung in der vorge- * stellten Reihenfolge bentigt werden (Funktion 1 und 2 sind optional): * - Reservierung eines Bildschirmspeicherbereichs * - Zeichnen eines sich ausdehnenden Rechtecks * - Zeichnen eines schrumpfenden Rechtecks * - Freigeben des reservierten Bildschirmspeicherbereichs */ #include int form_dial( int fo_diflag, int fo_dilittlx, int fo_dilittly, int fo_dilittlw, int fo_dilittlh, int fo_dibigx, int fo_dibigy, int fo_dibigw, int fo_dibigh ) { intin[0] = fo_diflag; /* Nummer der Funktion, die ausgefhrt werden * * soll: * * 0: Reservierung eines Bildschirmspei- * * cherbereichs (dient dem spteren Wiederher- * * stellen der Fensterrandkomponenten) * * 1: Zeichnen eines sich ausdehnenden * * Kastens. Dieser wird in mehreren Stufen von * * dilittl... bis zur Gre dibig... gezeichnet * * (optional). * * 2: Zeichnen eines schrumpfenden Kastens.* * Dieser wird in mehreren Stufen von dibig... * * bis dilittl... gezeichnet (optional). * * 3: Freigeben des reservierten Bild- * * schirmspeichers. Die zerstrten Randelemente * * des Fensters werden wiederhergestellt. */ intin[1] = fo_dilittlx; /* X-Koordinate des Rechtecks in seiner * * kleinsten Gre */ intin[2] = fo_dilittly; /* Y-Koordinate des Rechtecks in seiner * * kleinsten Gre */ intin[3] = fo_dilittlw; /* Breite des Rechtecks in seiner kleinsten * * Gre */ intin[4] = fo_dilittlh; /* Hhe des Rechtecks in seiner kleinsten * * Gre */ intin[5] = fo_dibigx; /* X-Koordinate des Rechtecks in seiner grten * * Gre */ intin[6] = fo_dibigy; /* Y-Koordinate des Rechtecks in seiner grten * * Gre */ intin[7] = fo_dibigw; /* Breite des Rechtecks in seiner grten Gre */ intin[8] = fo_dibigh; /* Hhe des Rechtecks in seiner grten Gre */ AES( 51, 9, 1, 1, 0 ); return intout[0]; /* = fo_direturn: positiv bei Erfolg, 0 bei Fehler. */ } /* siehe auch: objc_draw..\OBJC\OBJC_DRA.C, form_doFORM_DO.C */ /* * FORM_DO (C) Digital Design 1990 * * Die Programmkontrolle wird an AES..\AES.HLP bergeben, welches daraufhin die * Benutzereingaben im Formular berwacht. */ #include int form_do( OBJECT *fo_dotree, int fo_dostartob ) { intin[0] = fo_dostartob; /* Wenn das Formular Textfelder enthlt, ist * * dies der Index des ersten zu editierenden * * Textfeldes. Wenn es keine Textfelder gibt,* * mu dieser Wert auf Null gesetzt werden. */ addrin[0] = fo_dotree; /* Die Adresse des Objektbaumes, der das * * Formular beschreibt. */ AES( 50, 1, 1, 1, 0 ); return intout[0]; /* = fo_doreturn: der Index des Objektes, das der * * Benutzer anwhlte und das einen Abbruch der * * Formulareingabe bewirkte. */ } /* siehe auch: objc_draw..\OBJC\OBJC_DRA.C */ /* * FORM_ERROR (C) Digital Design 1990 * * Eine Fehlermeldung wird dargestellt. * Fehlermeldungen sind vereinfachte Warnmeldungen, die nur einen * Quittierungsknopf mit dem Aufdruck "Cancel" haben sowie eine Textzeile * mit dem Text "TOS error #"+Fehlernummer. Als Piktogramm wird das * STOP-Piktogramm verwendet. Ein Definitionsstring fllt damit weg, die * Fehlermeldung lt sich aber nur fr Betriebssystemfehlermeldungen * verwenden. Bei Aufruf dieser Funktion wird der bei der Funktion * FORM_ALERTFORM_ALE.C beschriebene Ablauf innerhalb des AES..\AES.HLP durchgefhrt. */ #include int form_error( int fo_enum ) { intin[0] = fo_enum; /* TOS-Fehlernummer */ AES( 53, 1, 1, 0, 0 ); return intout[0]; /* = fo_eexbttn */ } /* * FORM_KEYBD (C) Digital Design 1992 * * Nimmt Tastatureingaben in ein Formular vor (siehe auch objc_edit..\OBJC\OBJC_EDI.C). * Dabei wird unter Umstnden das Eingabefeld gendert (Cursor-Tasten * und "TAB") oder das Default-Objekt selektiert ("RETURN"). */ #include int form_keybd( OBJECT *fo_ktree, int fo_kobject, int fo_kobnext, int fo_kchar, int *fo_knxtobject, int *fo_knxtchar ) { addrin[0] = fo_ktree; /* Anfangsadresse des Objektbaumes */ intin[0] = fo_kobject; /* Objektnummer des aktuellen EDIT-Objektes */ intin[1] = fo_kobnext; /* unbenutzt - auf 0 setzen */ intin[2] = fo_kchar; /* Eingegebenes Zeichen, das eingetragen * * werden soll */ AES( 55, 3, 3, 1, 0 ); *fo_knxtobject = intout[1]; /* aktuelles EDIT-Objekt fr den nchsten * * Aufruf (verndert sich, wenn "TAB", * * Cursor-Tasten oder "RETURN" bergeben * * wurde) */ *fo_knxtchar = intout[2]; /* = 0 : Zeichen war "TAB", Cursor-Taste * * oder "RETURN" * * > 0 : bergebenes Zeichen */ return intout[0]; /* = 0 : Exit-Objekt gedrckt * * > 0 : Dialog noch nicht beendet */ } /* siehe auch: form_buttonFORM_BUT.C */ . (D:.. DFSEL HLP N;FSEL_EXIC y]<FSEL_INPC r=Dateiauswahl Zur Auswahl eines Dateinamens mit Hilfe einer Dialogbox dienen die Funktionen: fsel_inputFSEL_INP.C Dateinamen auswhlen. fsel_exinputFSEL_EXI.C Dateinamen auswhlen mit berschrift (erst ab AES Version 1.3 verfgbar). /* * FSEL_EXINPUT (C) Digital Design 1991 * * Eine Datei-Auswahl-Box wird dargestellt, woraufhin der Nutzer mit * der Maus oder der Tastatur eine Datei spezifizieren kann. * Zustzlich kann eine Zeichenkette als Titel bergeben werden. * Hinweis: Diese Funktion ist erst ab AES-Version 1.3 (TOS 1.04) * verfgbar! */ #include int fsel_exinput( char *fs_einpath, char *fs_einsel, int *fs_eexbutton, char *fs_elabel ) { addrin[0] = fs_einpath; /* Die vollstndige Pfad-Bezeichnung * * (einschlielich Laufwerk) fr das darzu- * * stellende Inhaltsverzeichnis. */ addrin[1] = fs_einsel; /* Ein initialisierender Dateiname, der im * * Dateinamen-Eingabefeld erscheint. */ addrin[2] = fs_elabel; /* Titelzeile, wird zentriert anstelle von * * "OBJEKT AUSWAHL" ausgegeben. */ AES( 91, 0, 2, 3, 0 ); *fs_iexbutton = intout[1]; /* 0: Es wurde "Abbruch" gedrckt. * * 1: Es wurde "OK" gedrckt. */ return intout[0]; } /* * FSEL_INPUT (C) Digital Design 1990 * * Eine Datei-Auswahl-Box wird dargestellt, woraufhin der Nutzer mit * der Maus oder der Tastatur eine Datei spezifizieren kann. */ #include int fsel_input( char *fs_iinpath, char *fs_iinsel, int *fs_iexbutton ) { addrin[0] = fs_iinpath; /* Die vollstndige Pfad-Bezeichnung * * (einschlielich Laufwerk) fr das darzu- * * stellende Inhaltsverzeichnis. */ addrin[1] = fs_iinsel; /* Ein initialisierender Dateiname, der im * * Dateinamen-Eingabefeld erscheint. */ AES( 90, 0, 2, 2, 0 ); *fs_iexbutton = intout[1]; /* Enthlt den Wert 0, wenn der "Abbruch"- * * Button angeklickt wurde, und sonst 1. */ return intout[0]; } . ,D>.. DGRAF HLP ?'GRAF_DRAC rAGRAF_GROC 6CGRAF_HANC rD,GRAF_MKSC rFGRAF_MOUC HGRAF_MOVC rJGRAF_RUBC rKrGRAF_SHRC =MGRAF_SLIC N GRAF_WATC rPVerschiedene Grafikfunktionen Die Grafik-Funktionen auf einen Blick: graf_dragboxGRAF_DRA.C Verschieben eines Rechtecks graf_growboxGRAF_GRO.C Animation eines sich vergrernden Rechtecks. graf_handleGRAF_HAN.C Kennung der Bildschirm-Arbeitsstation ermitteln. graf_mkstateGRAF_MKS.C Status der Maustasten ermitteln. graf_mouseGRAF_MOU.C Mausdarstellung verndern. graf_moveboxGRAF_MOV.C Rechteckverschiebung darstellen. graf_rubberboxGRAF_RUB.C Rechteckhlle (Gummiband) darstellen. graf_shrinkboxGRAF_SHR.C Animation eines sich verkleinernden Rechtecks. graf_slideboxGRAF_SLI.C Vertikale oder horizontale Verschiebung eines Rechtecks. graf_watchboxGRAF_WAT.C Objektstatus an Position des Mauszeigers koppeln. In dieser Funktionsgruppe befinden sich einige Funktionen zur allge- meinen Programmierung unter AES..\AES.HLP, wie graf_handleGRAF_HAN.C und graf_mouseGRAF_MOU.C, in erster Linie aber Funktionen, die vor allem zur grafischen Animation verwendet werden, wie graf_shrinkboxGRAF_SHR.C und graf_growboxGRAF_GRO.C, die jedoch beide aus urheberrechtlichen Grnden in neueren GEM..\..\GEM-Implementationen nicht mehr vorhanden sein werden. Bisher sind jedoch noch alle Atari- STs mit diesen Funktionen ausgeliefert worden. /* * GRAF_DRAGBOX (C) Digital Design 1990 * * Der Benutzer kann mit dem Mauszeiger ein Rechteck innerhalb eines * anderen Rechtecks verschieben. */ #include int graf_dragbox( int gr_dwidth, int gr_dheight, int gr_dstartx, int gr_dstarty, int gr_dboundx, int gr_dboundy, int gr_dboundw, int gr_dboundh, int *gr_dfinishx, int *gr_dfinishy ) { intin[0] = gr_dwidth; /* die Breite des verschiebbaren Rechtecks */ intin[1] = gr_dheight; /* die Hhe des verschiebbaren Rechtecks */ intin[2] = gr_dstartx; /* die Anfangs-X-Koordinate des verschiebbaren * * Rechtecks */ intin[3] = gr_dstarty; /* die Anfangs-Y-Koordinate des verschiebbaren * * Rechtecks */ intin[4] = gr_dboundx; /* die X-Koordinate des Begrenzungsrechtecks */ intin[5] = gr_dboundy; /* die Y-Koordinate des Begrenzungsrechtecks */ intin[6] = gr_dboundw; /* die Breite des Begrenzungsrechtecks */ intin[7] = gr_dboundh; /* die Hhe des Begrenzungsrechtecks */ AES( 71, 8, 3, 0, 0 ); *gr_dfinishx = intout[1]; /* die X-Koordinate des verschiebbaren * * Rechtecks zum Zeitpunkt des Loslassens */ *gr_dfinishy = intout[2]; /* die Y-Koordinate des verschiebbaren * * Rechtecks zum Zeitpunkt des Loslassens */ return intout[0]; /* = gr_dreturn: positiv bei Erfolg, 0 bei Fehler. */ } /* siehe auch: graf_moveboxGRAF_MOV.C, graf_rubberboxGRAF_RUB.C, graf_slideboxGRAF_SLI.C */ /* * GRAF_GROWBOX (C) Digital Design 1990 * * Es wird ein sich ausdehnendes Rechteck gezeichnet. */ #include int graf_growbox( int gr_gstx, int gr_gsty, int gr_gstwidth, int gr_gstheight, int gr_gfinx, int gr_gfiny, int gr_gfinwidth, int gr_gfinheight ) { intin[0] = gr_gstx; /* die X-Koordinate des Anfangsrechtecks */ intin[1] = gr_gsty; /* die Y-Koordinate des Anfangsrechtecks */ intin[2] = gr_gstwidth; /* die Breite des Anfangsrechtecks */ intin[3] = gr_gstheight; /* die Hhe des Anfangsrechtecks */ intin[4] = gr_gfinx; /* die X-Koordinate des Endrechtecks */ intin[5] = gr_gfiny; /* die Y-Koordinate des Endrechtecks */ intin[6] = gr_gfinwidth; /* die Breite des Endrechtecks */ intin[7] = gr_gfinheight; /* die Hhe des Endrechtecks */ AES( 73, 8, 1, 0, 0 ); return intout[0]; /* = gr_sreturn: positiv bei Erfolg, 0 bei Fehler. */ } /* siehe auch: graf_shrinkboxGRAF_SHR.C */ /* * GRAF_HANDLE (C) Digital Design 1990 * * Diese Funktion liefert die Handle fr die von AES..\AES.HLP erffnete physische * Workstation (siehe VDI - V_OPNWK..\..\VDI\CONTROL\V_OPNWK.C) zurck. Mit Hilfe dieser Handle * ist vor dem ersten VDI..\..\VDI\VDI.HLP-Zugriff durch die Applikation eine entsprechen- * de virtuelle Workstation (siehe VDI - V_OPNVWK..\..\VDI\CONTROL\V_OPNVWK.C) zu erffnen. Mit der * dadurch erhaltenen Handle fr die virtuelle Workstation sind dann die * VDI..\..\VDI\VDI.HLP-Aufrufe durchzufhren. * Auerdem werden durch diese Funktion noch einige spezifische Zeichen- * Parameter zurckgeliefert. */ #include int graf_handle( int *gr_hwchar, int *gr_hhchar, int *gr_hwbox, int *gr_hhbox ) { AES( 77, 0, 5, 0, 0 ); *gr_hwchar = intout[1]; /* Breite der Matrix fr ein Zeichen */ *gr_hhchar = intout[2]; /* Hhe der Matrix fr ein Zeichen */ *gr_hwbox = intout[3]; /* Breite einer Box, die ein Zeichen enthlt */ *gr_hhbox = intout[4]; /* Hhe einer Box, die ein Zeichen enthlt */ return intout[0]; /* = gr_handle: Handle der von AES benutzten physi- * * schen Workstation. */ } /* * GRAF_MKSTATE (C) Digital Design 1990 * * Die Position des Mauszeigers, der Status der Maustasten und der * Status der Tastatur werden ermittelt. */ #include int graf_mkstate( int *gr_mkmx, int *gr_mkmy, int *gr_mkmstate, int *gr_mkkstate ) { AES( 79, 0, 5, 0, 0 ); *gr_mkmx = intout[1]; /* X-Position des Mauszeigers */ *gr_mkmy = intout[2]; /* Y-Position des Mauszeigers */ *gr_mkmstate = intout[3]; /* Status der Maustasten: * * Bit 0 = linke Taste * * Bit 1 = rechte Taste * * Bit gesetzt: Taste gedrckt * * Bit gelscht: Taste nicht gedrckt */ *gr_mkkstate = intout[4]; /* Status folgender Tasten: * * Bit 0 = Shift rechts * * Bit 1 = Shift links * * Bit 2 = Control * * Bit 3 = Alternate * * Bit gesetzt: Taste gedrckt * * Bit gelscht: Taste nicht gedrckt */ return intout[0]; /* = gr_mkresvd: reserviert, dieser Wert wird immer * * auf 1 gesetzt. */ } /* * GRAF_MOUSE (C) Digital Design 1990 * * Die Form des Mauszeigers kann gendert werden. Es stehen verschiedene * Symbole zur Auswahl, falls diese nicht ausreichend sind, kann der * Programmierer eigene Formen definieren (Bit-Belegung siehe VDI- * Funktion SET MOUSE FORM..\..\VDI\INPUT\VSC_FORM.C). * Die Mausform sollte nur innerhalb der vom Programm kontrollierten * Bereiche von der Pfeilform abweichen. Sobald der Mauszeiger einen * solchen Bereich verlt (z.B. durch Betreten der Menleiste), mu * wieder die Pfeilform aktiviert werden. */ #include int graf_mouse( int gr_monumber, MFORM *gr_mofaddr ) { intin[0] = gr_monumber; /* gibt an, welche Mausform gewnscht wird: * * 0 = Pfeil * * 1 = Cursor * * 2 = Biene * * 3 = Hand mit Zeigefinger * * 4 = flache Hand * * 5 = dnnes Fadenkreuz * * 6 = dickes Fadenkreuz * * 7 = Fadenkreuz als Umri * * 255 = frei definierbare Mausform, Adresse * * des Definitionsblocks in gr_mofaddr * * 256 = Mausform abschalten * * 257 = Mausform anschalten */ addrin[0] = gr_mofaddr; /* Adresse des Mausform-Definitionsblocks, * * nur bei gr_monumber = 255 bedeutsam. */ AES( 78, 1, 1, 1, 0 ); return intout[0]; /* = gr_moreturn: positiv bei Erfolg, 0 bei Fehler */ } /* * GRAF_MOVEBOX (C) Digital Design 1990 * * Es wird ein Rechteck (mit konstanter Gre) gezeichnet, das sich von * einer Bildschirmposition zu einer anderen bewegt. */ #include int graf_movebox( int gr_mwidth, int gr_mheight, int gr_msourcex, int gr_msourcey, int gr_mdestx, int gr_mdesty ) { intin[0] = gr_mwidth; /* die Breite des Rechtecks */ intin[1] = gr_mheight; /* die Hhe des Rechtecks */ intin[2] = gr_msourcex; /* die X-Koordinate der Anfangsposition */ intin[3] = gr_msourcey; /* die Y-Koordinate der Anfangsposition */ intin[4] = gr_mdestx; /* die X-Koordinate der Zielposition */ intin[5] = gr_mdesty; /* die Y-Koordinate der Zielposition */ AES( 72, 6, 1, 0, 0 ); return intout[0]; /* = gr_mreturn: positiv bei Erfolg, 0 bei Fehler */ } /* siehe auch: graf_dragboxGRAF_DRA.C, graf_rubberboxGRAF_RUB.C */ /* * GRAF_RUBBERBOX (C) Digital Design 1990 * * Es wird ein Kasten gezeichnet, dessen linke obere Ecke fest steht. * Die rechte untere Ecke folgt den Mausbewegungen des Benutzers. * Sobald dieser den Mausknopf (links) loslt, ist die Funktion beendet * (sie sollte deshalb nur bei gedrcktem Mausknopf ausgelst werden). * Als Ausgabeparameter liefert sie die Gre des Rechtecks. */ #include int graf_rubberbox( int gr_rx, int gr_ry, int gr_minwidth, int gr_minheight, int *gr_rlastwidth, int *gr_rlastheight ) { intin[0] = gr_rx; /* X-Koordinate des Rechtecks */ intin[1] = gr_ry; /* Y-Koordinate des Rechtecks */ intin[2] = gr_minwidth; /* kleinstmgliche Breite des Rechtecks */ intin[3] = gr_minheight; /* kleinstmgliche Hhe des Rechtecks */ AES( 70, 4, 3, 0, 0 ); *gr_rlastwidth = intout[1]; /* Breite des Rechtecks bei Loslassen * * des Mausknopfes */ *gr_rlastheight = intout[2]; /* Hhe des Rechtecks bei Loslassen * * des Mausknopfes */ return intout[0]; /* = gr_rreturn: positiv bei Erfolg, 0 bei Fehler */ } /* siehe auch: graf_dragboxGRAF_DRA.C, graf_moveboxGRAF_MOV.C */ /* * GRAF_SHRINKBOX (C) Digital Design 1990 * * Es wird ein schrumpfendes Rechteck gezeichnet. */ #include int graf_shrinkbox( int gr_sfinx, int gr_sfiny, int gr_sfinwidth, int gr_sfinheight, int gr_sstx, int gr_ssty, int gr_sstwidth, int gr_sstheight ) { intin[0] = gr_sfinx; /* die X-Koordinate des Endrechtecks */ intin[1] = gr_sfiny; /* die Y-Koordinate des Endrechtecks */ intin[2] = gr_sfinwidth; /* die Breite des Endrechtecks */ intin[3] = gr_sfinheight; /* die Hhe des Endrechtecks */ intin[4] = gr_sstx; /* die X-Koordinate des Anfangsrechtecks */ intin[5] = gr_ssty; /* die Y-Koordinate des Anfangsrechtecks */ intin[6] = gr_sstwidth; /* die Breite des Anfangsrechtecks */ intin[7] = gr_sstheight; /* die Hhe des Anfangsrechtecks */ AES( 74, 8, 1, 0, 0 ); return intout[0]; /* = gr_sreturn: positiv bei Erfolg, 0 bei Fehler */ } /* siehe auch: graf_growboxGRAF_GRO.C */ /* * GRAF_SLIDEBOX (C) Digital Design 1990 * * Der Benutzer kann mit Hilfe des Mauszeigers ein Rechteck innerhalb * eines anderen Rechtecks verschieben, wobei die Richtung entweder * nur horizontal oder nur vertikal sein darf. Das umfassende Rechteck * mu das bergeordnete Objekt des verschiebbaren Rechtecks in einem * Objektbaum sein. Die Funktion sollte nur bei bettigtem Mausknopf * ausgelst werden, sie ist beendet, wenn der Benutzer den Mausknopf * wieder loslt. */ #include int graf_slidebox( OBJECT *gr_slptree, int gr_slparent, int gr_slobject, int gr_slvh ) { intin[0] = gr_slparent; /* der Index des umfassenden Rechtecks im * * Objektbaum */ intin[1] = gr_slobject; /* der Index des verschiebbaren Objektes im * * Objektbaum */ intin[2] = gr_slvh; /* Flag zur Bestimmung der mglichen Bewegungs- * * richtung: * * 0 = horizontal * * 1 = vertikal */ addrin[0] = gr_slptree; /* die Adresse des Objektbaums */ AES( 76, 3, 1, 1, 0 ); return intout[0]; /* = gr_slreturn: die Position des Mittelpunktes * * des verschiebbaren Rechtecks relativ in Bezug * * auf das umfassende Rechteck: * * wenn gr_slv = 0 (horizontal): * * 0 = Position ganz links * * 1000 = Position ganz rechts * * wenn gr_slv = 1 (vertikal): * * 0 = Position ganz oben * * 1000 = Position ganz unten */ } /* siehe auch: graf_dragboxGRAF_DRA.C */ /* * GRAF_WATCHBOX (C) Digital Design 1990 * * Der Mauszeiger wird daraufhin berwacht, ob er ein rechteckiges Feld * betritt oder verlt. Dieses Feld ndert dann in Abhngigkeit von der * Mausposition seinen Zustand. Die Funktion ist beendet, sobald der * Benutzer den Mausknopf loslt. Das Rechteck mu Teil eines Objekt- * baums sein. */ #include int graf_watchbox( OBJECT *gr_wptree, int gr_wobject, int gr_winstate, int gr_woutstate ) { /* intin[0] = reserviert; */ intin[1] = gr_wobject; /* der Index des Objektes */ intin[2] = gr_winstate; /* der Status des Objektes beim Betreten mit * * dem Mauszeiger (bei gedrcktem Knopf): * * 0 = NORMAL * * 1 = SELECTED * * 2 = CROSSED * * 4 = CHECKED * * 8 = DISABLED * * 16 = OUTLINED * * 32 = SHADOWED */ intin[3] = gr_woutstate; /* der Status des Objektes beim Verlassen * * mit dem Mauszeiger (bei gedrcktem Knopf),* * siehe gr_winstate */ addrin[0] = gr_wptree; /* die Adresse des Objektbaumes */ AES( 75, 4, 1, 1, 0 ); return intout[0]; /* = gr_wreturn: Position des Mauszeigers beim * * Loslassen des Knopfes: * * 0 = auerhalb des Rechtecks * * 1 = innerhalb des Rechtecks */ } . =DR.. DMENU HLP S4MENU_BARC rU6MENU_ICHC rVMENU_IENC q WMENU_REGC rYbMENU_TEXC r[=MENU_TNOC r]READ_ME TXT!`Mens Die Menfunktionen im berblick: menu_barMENU_BAR.C Menleiste darstellen oder entfernen. menu_icheckMENU_ICH.C Hkchen bei Menoptionen setzen oder lschen. menu_ienableMENU_IEN.C Menoptionen setzen oder lschen. menu_registerMENU_REG.C Menoptionen einfgen. menu_textMENU_TEX.C Text von Meneintrgen ndern. menu_tnormalMENU_TNO.C Mentitel invertieren. Die wichtigste Funktion unter den Menfunktionen ist zweifellos die Funktion menu_barMENU_BAR.C. Damit wird ein kompletter Menbaum dargestellt, dessen Adresse man sich vorzugsweise aus einer Resourcedatei holt. Um einzelne Menfunktionen whrend des Programmablaufs flexibel ein- und auszuschalten, verwendet man die Funktion menu_ienableMENU_IEN.C. Schalter lassen sich sehr gut mit menu_icheckMENU_ICH.C verwalten. Mit menu_registerMENU_REG.C kann man zustzliche Menoptionen whrend des Programmlaufs bequem einfgen. Wenn das Men nicht mehr gebraucht wird kann es mit menu_barMENU_BAR.C wieder vollstndig entfernt werden. /* * MENU_BAR (C) Digital Design 1990 * * Die Menleiste eines Menobjektbaumes wird dargestellt bzw. gelscht. */ #include int menu_bar( OBJECT *me_btree, int me_bshow ) { intin[0] = me_bshow; /* gibt an, ob die Menleiste gezeichnet oder * * gelscht werden soll: * * 0 = Menleiste wird gelscht * * 1 = Menleiste wird gezeichnet */ addrin[0] = me_btree; /* Adresse des Menobjektbaumes */ AES( 30, 1, 1, 1, 0 ); return intout[0]; /* = me_breturn: positiv bei Erfolg, 0 bei Fehler */ } /* siehe auch: menu_tnormalMENU_TNO.C, menu_icheckMENU_ICH.C, menu_ienableMENU_IEN.C */ /* * MENU_ICHECK (C) Digital Design 1990 * * Lschen oder Darstellen eines Prfsymbols (check mark). */ #include int menu_icheck( OBJECT *me_ctree, int me_citem, int me_ccheck ) { intin[0] = me_citem; /* Nummer des Meneintrags */ intin[1] = me_ccheck; /* gibt an, ob das Prfsymbol links neben dem * * Meneintrag erscheinen soll oder nicht: * * 0 = check mark lschen * * 1 = check mark setzen */ addrin[0] = me_ctree; /* Adresse des Menobjektbaums */ AES( 31, 2, 1, 1, 0 ); return intout[0]; /* = me_creturn: positiv bei Erfolg, 0 bei Fehler. */ } /* siehe auch: menu_tnormalMENU_TNO.C, menu_ienableMENU_IEN.C, menu_textMENU_TEX.C */ /* * MENU_IENABLE (C) Digital Design 1990 * * Aktiviert bzw. deaktiviert einen Meneintrag. */ #include int menu_ienable( OBJECT *me_etree, int me_eitem, int me_eenable ) { intin[0] = me_eitem; /* Nummer des Meneintrags */ intin[1] = me_eenable; /* gibt an, ob der Meneintrag aktiviert oder * * deaktiviert werden soll: * * 0 = deaktiviert * * (Meneintrag in schwacher Schrift)* * 1 = aktiviert * * (Meneintrag in normaler Schrift) */ addrin[0] = me_etree; /* Adresse des Menobjektbaums */ AES( 32, 2, 1, 1, 0 ); return intout[0]; /* = me_ereturn: positiv bei Erfolg, 0 bei Fehler */ } /* siehe auch: menu_tnormalMENU_TNO.C, menu_icheckMENU_ICH.C, menu_textMENU_TEX.C */ /* * MENU_REGISTER (C) Digital Design 1990 * * Der Name eines Desk Accessory wird im ersten Menkasten aktiviert. * Es knnen maximal sechs Desk Accessories aktiviert sein. * Ein Desk Accessory ist ein Hilfsprogramm, das in allen Applikationen, * die eine AES-Menleiste verwenden, zur Verfgung steht. */ #include int menu_register( int me_rapid, const char *me_rpstring ) { intin[0] = me_rapid; /* Die Identifikationsnummer des Prozesses, den * * das Desk Accessory darstellt. Es handelt sich * * hierbei um den Wert apid, der durch die Funk- * * tion APPL_INIT..\APPL\APPL_INI.C ausgegeben wird. */ addrin[0] = me_rpstring; /* Zeiger auf den Namen des Desk Accessory * * (mu mit einem Nullbyte abgeschlossen * * sein) */ AES( 35, 1, 1, 1, 0 ); return intout[0]; /* = me_rmenuid: Nummer des Desk Accessory (reicht * * von 0 bis 5); -1 (0xFFFF) bedeutet, da kein * * Platz mehr fr ein weiteres Desk Accessory vor- * * handen ist. */ } /* siehe auch: evnt_mesag..\EVNT\EVNT_MES.C */ /* * MENU_TEXT (C) Digital Design 1990 * * Der Text eines Meneintrags kann gendert werden. So kann die * Applikation auf verschiedene Systemzustnde reagieren, die einen * bestimmten Menpunkt betreffen. Der Meneintrag knnte beispiels- * weise einen der Texte "Seite vor" oder "Seite zurck" annehmen. Der * neue Text darf keinesfalls lnger als der alte sein, weil sonst die * Menbaumstruktur zerstrt wird. */ #include int menu_text( OBJECT *me_ttree, int me_titem, const char *me_ttext ) { intin[0] = me_titem; /* Nummer des Meneintrags */ addrin[0] = me_ttree; /* Adresse des Menobjektbaums */ addrin[1] = me_ttext; /* Adresse des neuen Mentextes. Der String mu * * mit einem Nullbyte abgeschlossen sein */ AES( 34, 1, 1, 2, 0 ); return intout[0]; /* = me_treturn: positiv bei Erfolg, 0 bei Fehler */ } /* siehe auch: menu_icheckMENU_ICH.C, menu_ienableMENU_IEN.C, menu_tnormalMENU_TNO.C */ /* * MENU_TNORMAL (C) Digital Design 1990 * * Ein Mentitel in der Menleiste wird revers oder normal dargestellt. */ #include int menu_tnormal( OBJECT *me_ntree, int me_ntitle, int me_nnormal ) { intin[0] = me_ntitle; /* Nummer des Mentitels */ intin[1] = me_nnormal; /* gibt an, ob der Mentitel revers oder * * normal dargestellt werden soll: * * 0 = reverse Darstellung * * 1 = normale Darstellung */ addrin[0] = me_ntree; /* Adresse des Menobjektbaums */ AES( 33, 2, 1, 1, 0 ); return intout[0]; /* = me_nreturn: positiv bei Erfolg, 0 bei Fehler */ } /* siehe auch: menu_icheckMENU_ICH.C, menu_ienableMENU_IEN.C, menu_textMENU_TEX.C */ . ID^.. DOBJC HLP _OBJC_CHAC rbOBJC_DRAC rdOBJC_EDIC rfOBJC_FINC rhGOBJC_OFFC rjDie Basis des AES-Systems: Objekte Die Objektfunktionen auf einen Blick: objc_addOBJC_ADD.C Objekt im Objektbaum einfgen. objc_changeOBJC_CHA.C Status eine Objekts ndern. objc_deleteOBJC_DEL.C Objekt aus dem Objektbaum entfernen. objc_drawOBJC_DRA.C Objekt (mit Unterobjekten) darstellen. objc_editOBJC_EDI.C Texte eines Objekts verndern. objc_findOBJC_FIN.C Objektindex ber Position ermitteln. objc_offsetOBJC_OFF.C Bildschirmkoordinaten eines Objekts ermitteln. objc_orderOBJC_ORD.C Reihenfolge im Objektbaum umstellen. Objekte sind die Basiselemente des AES-Systems. Sie sind nichts an- deres als Datenstrukturen namens OBJECT, mit deren Hilfe Grafikele- mente, wie Alarmboxen, Fenster, Mens und Symbole beschrieben werden. Alle Objekte werden in einem einheitlichen Objektbaum zusammengefat. Mit der Datenstruktur OBJECT hat man ein sehr flexibles Werkzeug zur Verfgung, das gegenber einem Binrbaum den Vorteil hat, da man auf die einzelnen Objekte sowohl ber eine vertikale Hierarchie als auch ber eine horizontale Anordnung zugreifen kann. Mit OBJECT findet man nmlich die hufig bentigten Elemente auf gleicher Hierarchiestufe sehr leicht. Die Programmierung eines Objektbaums kann zwar im Grunde mit Hilfe der Definition eines Objektbaums durchgefhrt werden, doch schon bei klei- neren Aufgaben erweist sich dieses Unterfangen aufgrund der enormen Datenflle als ziemlich aussichtslos. Aus diesem Grunde gibt es Resource Construction Sets. Dies sind GEM-Programme, mit deren Hilfe man die Objekte grafisch definieren kann. Die einzelnen Objekte eines Programms werden dann in einer Resourcedatei gespeichert, aus der sie bequem geladen werden knnen. Die wichtigste Funktion in der Objektbibliothek ist sicherlich objc_drawOBJC_DRA.C, die fr das Zeichnen eines Objekts bzw. eines Objektbaumes verantwortlich ist. Sehr ntzlich ist auch objc_changeOBJC_CHA.C, da mit ihr gleichzeitig der Objektstatus gendert und das betreffende Objekt seinem neuen Status entsprechend neu gezeichnet werden kann. Wichtig ist auch noch die Funktion objc_findOBJC_FIN.C, mit deren Hilfe man, ausgehend von den Koordinaten einer Position, das darunter liegende Objekt er- mitteln kann. /* * OBJC_CHANGE (C) Digital Design 1990 * * Der Wert der Variable ob_state wird gendert. Es werden nur * diejenigen Objektteile in ihrem Aussehen verndert, die sich * innerhalb eines angegebenen Begrenzungsrechtecks befinden. */ #include int objc_change( OBJECT *ob_ctree, int ob_cobject, int ob_cresvd, int ob_cxclip, int ob_cyclip, int ob_cwclip, int ob_chclip, int ob_cnewstate, int ob_credraw ) { intin[0] = ob_cobject; /* der Index des Objektes, dessen Status * * gendert werden soll. */ intin[1] = ob_cresvd; /* reserviert fr zuknftige Anwendungen, mu * * auf Null gesetzt werden. */ intin[2] = ob_cxclip; /* X-Koordinate des Begrenzungsrechtecks */ intin[3] = ob_cyclip; /* Y-Koordinate des Begrenzungsrechtecks */ intin[4] = ob_cwclip; /* Breite des Begrenzungsrechtecks */ intin[5] = ob_chclip; /* Hhe des Begrenzungsrechtecks */ intin[6] = ob_cnewstate; /* neuer Objektstatus des Objekts */ intin[7] = ob_credraw; /* 0 = Objekt soll nicht neu gezeichnet werden * * 1 = Objekt soll neu gezeichnet werden */ addrin[0] = ob_ctree; /* Adresse des Objektbaumes */ AES( 47, 8, 1, 1, 0 ); return intout[0]; /* = ob_creturn: positiv bei Erfolg, 0 bei Fehler. */ } /* * OBJC_DRAW (C) Digital Design 1990 * * Zeichnen eines Objektbaumes, wobei ein Rechteck gewhlt werden kann, * das die Zeichengrenzen festlegt. * Weiterhin kann festgelegt werden, bis zu welcher Ebene der Baum * gezeichnet werden soll. */ #include int objc_draw( OBJECT *ob_drtree, int ob_drstartob, int ob_drdepth, int ob_drxclip, int ob_dryclip, int ob_drwclip, int ob_drhclip ) { intin[0] = ob_drstartob; /* der Index des Objektes, das als erstes * * gezeichnet werden soll. */ intin[1] = ob_drdepth; /* Die Anzahl der Ebenen, die gezeichnet * * werden sollen. Objekte mit einer hheren * * Ebenennummer als die angegebene werden beim * * Zeichnen ignoriert. Es gilt folgende * * Ebenenvereinbarung: * * 0 = Wurzelobjekt * * 1 = Wurzelobjekt und untergeordnete * * Objekte * * 2 = Wurzelobjekt, untergeordnete Objekte * * und diesen Objekten untergeordnete * * Objekte * * 3-n = usw. */ intin[2] = ob_drxclip; /* X-Koordinate des Begrenzungsrechtecks */ intin[3] = ob_dryclip; /* Y-Koordinate des Begrenzungsrechtecks */ intin[4] = ob_drwclip; /* Breite des Begrenzungsrechtecks */ intin[5] = ob_drhclip; /* Hhe des Begrenzungsrechtecks */ addrin[0] = ob_drtree; /* Adresse des Objektbaumes */ AES( 42, 6, 1, 1, 0 ); return intout[0]; /* = ob_drreturn: positiv bei Erfolg, 0 bei Fehler */ } /* * OBJC_EDIT (C) Digital Design 1990 * * Der Benutzer kann Text im Objekt eingeben, sofern dieses den * Objekttyp G_TEXT oder G_BOXTEXT hat. */ #include int objc_edit( OBJECT *ob_edtree, int ob_edobject, int ob_edchar, int *ob_edidx, int ob_edkind ) { intin[0] = ob_edobject; /* der Index des Objektes, das den einzuge- * * benden Text enthlt */ intin[1] = ob_edchar; /* die Zeicheneingabe des Benutzers */ intin[2] = *ob_edidx; /* die Nummer der nchsten Zeichenposition in * * teptext */ intin[3] = ob_edkind; /* gewnschte Editierfunktionen: * * 0 = reserviert fr zuknftige Anwendungen * * (ED_START) * * 1 = teptext und teptmplt mischen, Cursor an * * (ED_INIT) * * 2 = tepvalid verwenden, teptext eingeben * * und anzeigen (ED_CHAR) * * 3 = Cursor abschalten (ED_END) * * (Funktion dreimal mit ob_edkind von 1 bis 3 * * aufrufen) */ addrin[0] = ob_edtree; /* Adresse des Objektbaumes */ AES( 46, 4, 2, 1, 0 ); *ob_edidx = intout[1]; /* Nummer der nchsten Zeichenposition */ return intout[0]; /* = ob_edreturn: positiv bei Erfolg, 0 bei Fehler. */ } /* * OBJC_FIND (C) Digital Design 1990 * * Ermitteln eines Objektes, das sich unter dem Mauszeiger befindet. */ #include int objc_find( OBJECT *ob_ftree, int ob_fstartob, int ob_fdepth, int ob_fmx, int ob_fmy ) { intin[0] = ob_fstartob; /* der Index des Objektes, bei dem die Suche * * beginnen soll */ intin[1] = ob_fdepth; /* die Anzahl der Ebenen, die abgesucht werden * * sollen (Vereinbarung wie bei OBJC_DRAWOBJC_DRA.C) */ intin[2] = ob_fmx; /* X-Position des Mauszeigers */ intin[3] = ob_fmy; /* Y-Position des Mauszeigers */ addrin[0] = ob_ftree; /* Adresse des abzusuchenden Objektbaumes */ AES( 43, 4, 1, 1, 0 ); return intout[0]; /* = ob_fobnum: Index des Objektes, auf dem sich * * der Mauszeiger befindet (-1 = kein Objekt * * befindet sich unter dem Mauszeiger). */ } /* * OBJC_OFFSET (C) Digital Design 1990 * * Berechnung der Koordinaten eines Objektes relativ zum * Bildschirmnullpunkt. */ #include int objc_offset( OBJECT *ob_oftree, int ob_ofobject, int *ob_ofxoff, int *ob_ofyoff ) { intin[0] = ob_ofobject; /* der Index des Objektes, dessen Position * * ermittelt werden soll. */ addrin[0] = ob_oftree; /* Adresse des Objektbaumes */ AES( 44, 1, 3, 1, 0 ); *ob_ofxoff = intout[1]; /* X-Koordinate des Objektes in Bezug auf den * * Bildschirm */ *ob_ofyoff = intout[2]; /* Y-Koordinate des Objektes in Bezug auf den * * Bildschirm */ return intout[0]; /* = ob_ofreturn: positiv bei Erfolg, 0 bei Fehler */ } . SDk.. DRSRC HLP lRSRC_FREC rnRSRC_GADC ro* RSRC_LOAC rrRSRC_OBFC rsRSRC_SADC rtUREAD_ME TXT!dResourcen - Grundlage der flexiblen Programmierung Die Resourcefunktionen auf einen Blick: rsrc_freeRSRC_FRE.C Resourcespeicher freigeben. rsrc_gaddrRSRC_GAD.C Adresse einer Datenstruktur ermitteln. rsrc_loadRSRC_LOA.C Resourcedatei laden. rsrc_obfixRSRC_OBF.C Zeichenkoordinaten eines Objekts in Pixelkoordinaten umwandeln. rsrc_saddrRSRC_SAD.C Adresse fr eine Datenstruktur zuordnen. ber Resourcedateien kann man nahezu alle Daten fr die Programmierung einer Benutzeroberflche, wie zum Beispiel Mentexte und Formularber- schriften, auerhalb eines C-Programms bequem mit einem Resource- Editor verwalten. Die Daten werden lediglich beim Programmstart mit rsrc_loadRSRC_LOA.C geladen. Anschlieend kann man mit rsrc_gaddrRSRC_GAD.C auf die einzelnen Objekte..\OBJC\OBJC.HLP, Mens..\MENU\MENU.HLP oder Formulare..\FORM\FORM.HLP direkt zugreifen. Mit Hilfe von rsrc_obfixRSRC_OBF.C kann man die Koordinaten eines Objekts auf die gerte- spezifische Umgebung umrechnen. /* * RSRC_FREE (C) Digital Design 1990 * * Der durch den Befehl RSRC_LOADRSRC_LOA.C belegte Speicherplatz wird wieder * freigegeben. Danach ist das im Speicher befindliche Resource-File * nicht mehr zugnglich. */ #include int rsrc_free( void ) { AES( 111, 0, 1, 0, 0 ); return intout[0]; /* = re_freturn: positiv bei Erfolg, 0 bei Fehler */ } /* * RSRC_GADDR (C) Digital Design 1990 * * Die Adresse einer Datenstruktur im Speicher wird ermittelt. * Dabei kann es sich um Objektbume oder objektspezifische * Informationen handeln. */ #include int rsrc_gaddr( int re_gtype, int re_gindex, OBJECT **gaddr ) { intin[0] = re_gtype; /* dieser Wert legt fest. von welcher Art die * * Datenstruktur ist, deren Adresse gesucht * * werden soll: * * 0 = Baumstruktur (des mit RSRC_LOADRSRC_LOA.C zuletzt * * geladenen Baumes) * * 1 = Objekt * * 2 = TEDINFO (Textinformation) * * 3 = ICONBLK (Piktogramminformation) * * 4 = BITBLK (Bitmustergrafikinformation) * * 5 = string (Text) * * 6 = imagedata (Zeiger auf eine Bitmuster- * * grafik * * 7 = obspec (Objektspezifikation) * * 8 = te_ptext (Zeiger auf einen Text) * * 9 = te_ptmplt (Zeiger auf eine Textschablone)* * 10 = te_pvalid (Zeiger auf einen Texteingabe- * * begrenzungsstring) * * 11 = ib_pmask (Piktogramm-Darstellungsmaske) * * 12 = ib_pdata (Piktogramm-Bitmuster) * * 13 = ib_ptext (Piktogrammtext) * * 14 = bi_pdata (Zeiger auf Bitmustergrafik) * * 15 = ad_frstr (Adresse eines Zeigers auf * * einen freien String) * * 16 = ad_frimg (Adresse eines Zeigers auf * * eine freie Bitmustergrafik) */ intin[1] = re_gindex; /* Index des betreffenden Objektes */ AES( 112, 2, 1, 0, 1 ); *gaddr = (OBJECT *)(addrout[0]); /* die gesuchte Adresse der Daten- * * strukutr */ return intout[0]; /* = re_greturn: positiv bei Erfolg, 0 bei Fehler */ } /* siehe auch: rsrc_saddrRSRC_SAD.C */ /* * RSRC_LOAD (C) Digital Design 1990 * * Speicherplatz wird reserviert und eine Objektbaumstruktur in den * Speicher geladen (Resource-File). */ #include int rsrc_load( const char *re_lpfname ) { addrin[0] = re_lpfname; /* Zeiger auf einen String, der den Filenamen * * enthlt. Der String mu mit einem Nullbyte * * abgeschlossen sein. */ AES( 110, 0, 1, 1, 0 ); return intout[0]; /* = re_lreturn: positiv bei Erfolg, 0 bei Fehler */ } /* siehe auch: rsrc_freeRSRC_FRE.C */ /* * RSRC_OBFIX (C) Digital Design 1990 * * Umrechnen von Zeichenkoordinaten in Pixelkoordinaten */ #include int rsrc_obfix( OBJECT *re_otree, int re_oobject ) { addrin[0] = re_otree; /* Adresse des Objektbaumes */ intin[0] = re_oobject; /* Index des Obektes im Objektbaum */ AES( 114, 1, 1, 1, 0 ); return intout[0]; /* = re_oreturn: positiv bei Erfolg, 0 bei Fehler */ } /* * RSRC_SADDR (C) Digital Design 1990 * * Die Adresse einer Datenstruktur wird in einer objektspezifischen * Datenstruktur gespeichert. */ #include int rsrc_saddr( int re_stype, int re_sindex, void *saddr ) { intin[0] = re_stype; /* Art der Datenstruktur, deren Adresse gespei- * * chert werden soll. Die Werte sind die * * gleichen wie bei RSRC_GADDRRSRC_GAD.C. */ intin[1] = re_sindex; /* der Index des Objektes mit der zu verndern- * * den Datenstruktur. */ addrin[0] = saddr; /* Adresse der Datenstruktur */ AES( 113, 2, 1, 1, 0 ); return intout[0]; /* = re_sreturn: positiv bei Erfolg, 0 bei Fehler */ } . \Du.. DSCRP HLP ,8vSCRP_CLEC Q{]w3SCRP_REAC z]xdSCRP_WRIC z]yHClipboardfunktionen Die Clipboardfunktionen auf einen Blick: scrp_readSCRP_REA.C Aus dem Clipboard lesen. scrp_writeSCRP_WRI.C Ins Clipboard schreiben. scrp_clearSCRP_CLE.C Alle Dateien im Clipboard lschen (ab GEM 2.0). Unter GEM..\..\GEM gibt es die Mglichkeit, Informationen in einem Zwischen- speicher, dem Clipboard, abzulegen. Das Clipboard ist als Ordner realisiert. Man kann Dateien hineinschreiben und wieder auslesen./* * SCRP_CLEAR (C) Digital Design 1991 * * Lscht alle Dateien im aktuellen Scrap-Directory. * Hinweis: Diese Funktion ist erst ab GEM 2.0 verfgbar! */ #include int scrp_clear( void ) { AES( 82, 0, 1, 0, 0 ); return intout[0]; /* = sc_creturn: 0 = Fehler. */ } /* * SCRP_READ (C) Digital Design 1991 * * Liest den Pfadnamen fr das Directory (scrap directory), in dem * Daten fr die Zwischenablage (clipboard) abgespeichert werden. */ #include int scrp_read( char *sc_rpscrap ) { addrin[0] = sc_rpscrap; /* Buffer fr den Pfadnamen. */ AES( 80, 0, 1, 1, 0 ); return intout[0]; /* = sc_rreturn: * * GEM 1.x: 0 = Fehler. * * GEM 2.0: -1 = kein Pfad vorhanden. * * >= 0 = Bitvektor, der darber Auskunft * * gibt, ob Dateien mit gewissen * * Extensions gefunden worden sind. * * Bitbelegung dabei: * * Bit 0 = SCRAP.CSV * * Bit 1 = SCRAP.TXT * * Bit 2 = SCRAP.GEM * * Bit 3 = SCRAP.IMG * * Bit 4 = SCRAP.DCA * * Bit 5 = SCRAP.USR */ }/* * SCRP_WRITE (C) Digital Design 1991 * * Legt den Zugriffspfad fr das aktuelle Scrap-Directory fest. */ #include int scrp_write( char *sc_wpscrap ) { addrin[0] = sc_wpscrap; /* Name des neuen Pfades. */ AES( 81, 0, 1, 1, 0 ); return intout[0]; /* = sc_wreturn: 0 = Fehler. */ } . dDz.. DSHEL HLP F{.SHEL_ENVC ]|SHEL_FINC j]}gSHEL_GETC L]~SHEL_PUTC ]SHEL_REAC |]SHEL_WRIC ~]eShellfunktionen Die Shellfunktionen auf einen Blick: shel_envrnSHEL_ENV.C Environment-Variable abfragen. shel_findSHEL_FIN.C Datei suchen. shel_getSHEL_GET.C Environment-Puffer lesen. shel_putSHEL_PUT.C Environment-Puffer schreiben. shel_readSHEL_REA.C Kommandozeilenparameter lesen. shel_writeSHEL_WRI.C Applikation starten. Fr den Aufruf anderer Applikationen und der Kommunikation mit diesen Programmen sind die Shellfunktionen zustndig. Sie stellen auch weitere Betriebssysteminformationen zur Verfgung. /* * SHEL_ENVRN (C) Digital Design 1991 * * Bestimmt den Wert einer AES-Environment-Variablen. * Die Arbeitsumgebung (Environment) des AES wird beim Start * von GEM festgelegt. * Das AES selbst benutzt nur "PATH=" - und zwar fr rsrc_load..\RSRC\RSRC_LOA.C und * shel_findSHEL_FIN.C. */ #include int shel_envrn( char *sh_epvalue, char *sh_eparm ) { addrin[0] = sh_epvalue; /* Zeiger auf den gewnschten Wert der * * Variablen, z.B. ";C:\". */ addrin[1] = sh_eparm; /* Zeiger auf den Namen der Variablen, deren * * Wert zurckgeliefert werden soll, z.B. * * "PATH=" fr den Default-Search-Path. */ AES( 125, 0, 1, 2, 0 ); return intout[0]; /* = sh_eresvd: reserviert, immer 1. */ } /* * SHEL_FIND (C) Digital Design 1991 * * Sucht eine Datei im aktuellen Directory und im Wurzelverzeichnis. * Zustzlich werden alle Directories durchsucht, die in der AES- * Environment-Variablen "PATH=" angegeben sind. Im Normalfall handelt * es sich dabei um das Wurzelverzeichnis des Bootlaufwerks. Diese * Funktion wird brigens auch von der AES-Funktion rsrc_load..\RSRC\RSRC_LOA.C verwendet, * um die Resource-Datei zu finden. */ #include int shel_find( char *sh_fpbuff ) { addrin[0] = sh_fpbuff; /* Zeiger auf den String mit dem Namen der * * gesuchten Datei. Nach Aufruf enthlt er den * * vollstndigen Zugriffspfad auf die Datei; * * daher mu eine ausreichende Lnge gewhlt * * werden. */ AES( 124, 0, 1, 1, 0 ); return intout[0]; /* = sh_freturn: 0 = Fehler. */ } /* * SHEL_GET (C) Digital Design 1991 * * Dient zum Lesen von Zeichen (max. 1024) aus dem GEM-internen * Environment-Speicher. */ #include int shel_get( char *sh_gaddr, int sh_glen ) { addrin[0] = sh_gaddr; /* Anfangsadresse des Zielspeichers. */ intin[0] = sh_glen; /* Anzahl der zu lesenden Bytes. */ AES( 122, 1, 1, 1, 0 ); return intout[0]; /* = sh_greturn: 0 = Fehler. */ } /* * SHEL_PUT (C) Digital Design 1991 * * Schreibt eine gegebene Anzahl von Zeichen (max. 1024) * in den GEM-internen Environment-Speicher. */ #include int shel_put( char *sh_paddr, int sh_plen ) { addrin[0] = sh_paddr; /* Anfangsadresse des Buffers mit den Zeichen. */ intin[0] = sh_plen; /* Anzahl der zu schreibenden Bytes. */ AES( 123, 1, 1, 1, 0 ); return intout[0]; /* = sh_preturn: 0 = Fehler. */ } /* * SHEL_READ (C) Digital Design 1991 * * Durch einen Aufruf von SHEL_READ bekommt man den Pfad und den * Dateinamen der eigenen Applikation zurck. Auerdem bekommt man * die Kommandozeile geliefert, die beim Aufruf eventuell bergeben * wurde (z.B. einen Dateinamen, wenn die Applikation im GEM-Desktop * installiert und das entsprechende Dokument angeklickt wurde). */ #include int shel_read( char *sh_rpcmd, char *sh_rptail ) { addrin[0] = sh_rpcmd; /* Zeiger auf den Pfad und Dateinamen der * * Applikation. */ addrin[1] = sh_rptail; /* Zeiger auf die Kommandozeile. * * Der zurckgegeben String hat Pascal-Format, * * d.h. ohne abschlieende Null! Das erste * * Byte enthlt die Lnge des Strings, darauf * * folgen die eigentlichen Zeichen. */ AES( 120, 0, 1, 2, 0 ); return intout[0]; /* = sh_rreturn: 0 = Fehler. */ } /* * SHEL_WRITE (C) Digital Design 1991 * * Informiert das AES, da eine andere Applikation gestartet werden soll. * * Im Gegensatz zum GEMDOS-Befehl Pexec..\..\GEMDOS\PEXEC\PEXEC bleibt dabei * das laufende Programm nicht resident. */ #include int shel_write( int sh_wdoex, int sh_wisgr, int sh_wisover, char *sh_wpcmd, char *sh_wptail ) { intin[0] = sh_wdoex; /* 0 = Keine weitere Applikation starten. Dabei * * wird das AES neu initialisiert - also eine* * gute Methode, Accessories neu zu laden! * * 1 = Neues Programm laden. */ intin[1] = sh_wisgr; /* 0 = Keine Graphik-Applikation (Cursor wird * * ein-, Maus ausgeschaltet; Bildschirm wird * * gelscht). * * 1 = Graphik-Applikation. */ intin[2] = sh_wisover; /* 0 = Angegebenes Programm sofort starten. * * 1 = Programm erst nach Beendigung des * * aktuellen starten (funktioniert erst ab * * GEM 2.0). */ addrin[0] = sh_wpcmd; /* Zeiger auf den Pfad und Dateinamen des * * zu startenden Programms. */ addrin[1] = sh_wptail; /* Zeiger auf die Kommandozeile im Pascal- * * Format: Das erste Byte enthlt die Lnge * * des Strings, darauf folgen die eigentlichen * * Zeichen. */ AES( 121, 3, 1, 2, 0 ); return intout[0]; /* = sh_wreturn: 0 = Fehler. */ } . nD.. DWIND HLP XWIND_CALC rWIND_CLOC rWIND_CREC r WIND_DELC rWIND_FINC ruWIND_GETC 7WIND_OPEC rWIND_SETC W7TWIND_UPDC rTREAD_ME TXT!hFenster als Benutzerumgebung Die Fensterfunktionen auf einen Blick: wind_calcWIND_CAL.C Fensterdimensionen berechnen. wind_closeWIND_CLO.C Fenster schlieen. wind_createWIND_CRE.C Fenster erzeugen. wind_deleteWIND_DEL.C Fenster lschen. wind_findWIND_FIN.C Fensterhandle anhand einer Positionsangabe ermitteln. wind_getWIND_GET.C Eigenschaften eines Fensters ermitteln. wind_openWIND_OPE.C Fenster ffnen. wind_setWIND_SET.C Eigenschaften eines Fensters verndern. wind_updateWIND_UPD.C Bildschirmoperationen sperren oder freigeben. Aus der Sicht des Anwenders ist die Integration von Fenstern die wohl herausragendste Eigenschaft des GEM..\..\GEM-Betriebssystems. Die Maus ist dabei die ideale Ergnzung fr den Umgang mit Fenstern. Ein Fenster besteht aus einer Reihe von bestimmten Einheiten, die entsprechend den Anforderungen der Applikation..\APPL\APPL.HLP gesetzt werden knnen. Im Mittelpunkt eines Fensters steht immer die Arbeitsflche, auf der ein bestimmtes Objekt, wie zum Beispiel ein Text oder eine Grafik, ganz oder in Ausschnitten dargestellt wird. Die Titelleiste gibt dem Fenster einen Namen, dient aber gleichzeitig auch zum Verschieben des Fensters auf dem Bildschirm. Mit der Schliebox (links oben) kann das Fenster geschlossen werden. Klickt man die Full-Box (rechts oben) an, wird das eventuell verkleinerte Fenster auf seine volle Gre ge- bracht. Die Informationszeile ist fr kurze Mitteilungen an den Be- nutzer gedacht. Mit den Pfeilen (auf und ab, links und rechts) erhlt ein Programm die Mitteilung, da der Inhalt des Fensters in die ent- sprechende Richtung verschoben werden soll. Die horizontalen und ver- tikalen Schieber ermglichen die absolute Positionierung der Arbeits- flche eines Fensters. Mit der Greneinstellungsbox (rechts unten) knnen Sie ein Fenster zumeist stufenlos vergrern bzw. verkleinern. Um ein Fenster anzulegen, mu es zuerst mit der Funktion wind_createWIND_CRE.C erzeugt werden. Beim Anlegen wird das Fenster im Speicher initiali- siert. Es wird gleichzeitig festgelegt, aus welchen Bestandteilen sich das Fenster zusammensetzen soll und welche maximale Gre das Fenster einnehmen darf. Man kann zwar die Gre eines Fenster beim ffnen mit wind_openWIND_OPE.C in beliebigen Schritten kleiner einstellen als beim Anlegen mit wind_createWIND_CRE.C, aber GEM..\..\GEM mu fr seine Speicherbereichsverwaltung genau wissen, wie gro das Fenster maximal werden kann. Geffnete Fen- ster knnen mit wind_closeWIND_CLO.C wieder geschlossen werden. Sie sind damit jedoch noch nicht aus dem Speicher entfernt worden und knnen mit wind_open erneut aktiviert werden. Soll ein geschlossenes Fenster auch aus dem Speicher entfernt werden, so geschieht dies mit der Funktion wind_deleteWIND_DEL.C. Mit Hilfe der Funktion wind_getWIND_GET.C lassen sich aktuelle Einstellungen eines Fensters jederzeit abfragen. So erhlt man Infor- mationen ber die Position, die Gre, die verwendeten Fensterbestand- teile, usw. Besonders wichtig ist meist die Stellung der horizontalen und vertikalen Schieber. In umgekehrter Weise, kann man einzelne Parameter eines Fensters mit Hilfe der Funktion wind_setWIND_SET.C auch direkt vom Programm aus festlegen. Die meisten Vernderungen in den Fenstern werden jedoch automatisch vom Bildschirmmanager berwacht. Wenn der Anwender bestimmte Schlsselbereiche anklickt, sendet der Bildschirm- manager sofort eine Mitteilung an das Programm, das mit Hilfe der Ereignisverwaltung sofort die richtigen Aktionen in die Wege leiten kann. Im Endeffekt liegt die gesamte Verantwortung fr die Verwaltung der Fenster beim Anwenderprogramm. Wenn man den Fensterinhalt verndern will, sollte man zuvor mit der Funktion wind_updateWIND_UPD.C alle anderen Bildschirmoperationen verbieten. Ansonsten knnte es passieren, da eine andere Applikation zur selben Zeit wie Sie den Bildschirm restaurieren will, und es entsteht Bild- schirmsalat. Man darf aber nicht vergessen, den Bildschirm anschlie- end erneut mit der Funktion wind_updateWIND_UPD.C fr weitere Bildschirm- operationen wieder frei zugeben, da ansonsten auch alle Mens und Accessories ausgeschaltet blieben. /* * WIND_CALC (C) Digital Design 1990 * * Bei bekannten Ausmaen des Arbeitsbereichs eines Fensters werden die * Umriausmae des Fensters berechnet. Falls die Umriausmae des * Fensters bekannt sind, werden die Ausmae des Arbeitsbereichs * berechnet. */ #include int wind_calc( int wi_ctype, int wi_ckind, int wi_cinx, int wi_ciny, int wi_cinw, int wi_cinh, int *coutx, int *couty, int *coutw, int *couth ) { intin[0] = wi_ctype; /* entscheidet, welche der beiden mglichen * * Funktionen ausgefhrt werden soll: * * 0 = Ausgabe der Gesamtausmae * * 1 = Ausgabe der Ausmae des Arbeitsbereichs */ intin[1] = wi_ckind; /* ein Bit-Feld, das die sichtbaren Komponenten * * des Randbereichs des Fensters angibt. Diese * * werden zur Berechnung der Fenstergre heran- * * gezogen. Die Bedeutung der Bits ist die * * gleiche wie beim Befehl WIND_CREATEWIND_CRE.C. */ intin[2] = wi_cinx; /* X-Koordinate des Eingabebereichs */ intin[3] = wi_ciny; /* Y-Koordinate des Eingabebereichs */ intin[4] = wi_cinw; /* Breite des Eingabebereichs */ intin[5] = wi_cinh; /* Hhe des Eingabebereichs */ AES( 108, 6, 5, 0, 0 ); *coutx = intout[1]; /* X-Koordinate des Ausgabebereichs */ *couty = intout[2]; /* Y-Koordinate des Ausgabebereichs */ *coutw = intout[3]; /* Breite des Ausgabebereichs */ *couth = intout[4]; /* Hhe des Ausgabebereichs */ return intout[0]; /* = wi_creturn: positiv bei Erfolg, 0 bei Fehler */ } /* * WIND_CLOSE (C) Digital Design 1990 * * Lschen eines Fensters. * Das Fenster kann mit WIND_OPENWIND_OPE.C wieder dargestellt werden. */ #include int wind_close( int wi_clhandle ) { intin[0] = wi_clhandle; /* Window Handle */ AES( 102, 1, 1, 0, 0 ); return intout[0]; /* = wi_clreturn: positiv bei Erfolg, 0 bei Fehler */ } /* * WIND_CREATE (C) Digital Design 1990 * * Ein Fenster wird erzeugt, aber noch nicht dargestellt. * Die Darstellung erfolgt erst mit der Funktion WIND_OPENWIND_OPE.C. */ #include int wind_create( int wi_crkind, int wi_crwx, int wi_crwy, int wi_crww, int wi_crwh ) { intin[0] = wi_crkind; /* legt fest, welche Komponenten des Rand- * * bereichs des Fensters sichtbar und aktiv * * sein sollen. Es handelt sich hierbei um ein * * Bit-Feld, ein gesetztes Bit steht fr eine * * aktive Komponente, ein gelschtes fr eine * * inaktive. Die Bits haben folgende Bedeutung: * * 0 = NAME (Titelzeile mit Namen des Fensters)* * 1 = CLOSE (Lschfeld) * * 2 = FULL (Bildschirmformatfeld) * * 3 = MOVE (Bewegungsfeld) * * 4 = INFO (Informationszeile) * * 5 = SIZE (Formatfeld) * * 6 = UPARROW (Pfeil nach oben) * * 7 = DNARROW (Pfeil nach unten) * * 8 = VSLIDE (vertikaler Schieber) * * 9 = LFARROW (Pfeil nach links) * * 10 = RTARROW (Pfeil nach rechts) * * 11 = HSLIDE (horizontaler Schieber) */ intin[1] = wi_crwx; /* X-Koordinate des grtmglichen Fensteraus- * * maes */ intin[2] = wi_crwy, /* Y-Koordinate des grtmglichen Fensteraus- * * maes */ intin[3] = wi_crww; /* Breite des grtmglichen Fensterausmaes */ intin[4] = wi_crwh; /* Hhe des grtmglichen Fensterausmaes */ AES( 100, 5, 1, 0, 0 ); return intout[0]; /* = wi_crreturn: Window Handle (Fensterkennziffer) * * des Fensters. Eine negative Zahl zeigt an, da * * AES keine Fenster mehr zur Verfgung hat, weil * * die Kapazitt erschpft ist. */ } /* siehe auch: wind_deleteWIND_DEL.C */ /* * WIND_DELETE (C) Digital Design 1990 * * Der durch das mit der Funktion WIND_CREATEWIND_CRE.C erzeugte Fenster belegte * Speicherraum sowie das Window Handle werden wieder freigegeben. * Vor dem Aufruf dieser Funktion sollte das Fenster mit WIND_CLOSEWIND_CLO.C * gelscht werden, denn danach ist dies nicht mehr mglich (das zum * Lschen notwendige Window Handle existiert ja dann nicht mehr). */ #include int wind_delete( int wi_dhandle ) { intin[0] = wi_dhandle; /* Window Handle */ AES( 103, 1, 1, 0, 0 ); return intout[0]; /* = wi_dreturn: positiv bei Erfolg, 0 bei Fehler */ } /* * WIND_FIND (C) Digital Design 1990 * * Das Window Handle des Fensters, das sich unter dem Zeiger der Maus * befindet, wird ausgegeben. Eine 0 bedeutet, da sich unter der Maus * kein Fenster, sondern ein leerer Bildschirmbereich befindet. */ #include int wind_find( int wi_fmx, int wi_fmy ) { intin[0] = wi_fmx; /* X-Koordinate der Mausposition */ intin[1] = wi_fmy; /* Y-Koordinate der Mausposition */ AES( 106, 2, 1, 0, 0 ); return intout[0]; /* = wi_freturn: Window Handle */ } /* * WIND_GET (C) Digital Design 1990 * * Erfragen von Fensterparametern. * Fr jedes Fenster knnen die Elemente der Rechteckliste, die Gre * des Fensters sowie die Gre und Position des horizontalen und * vertikalen Schiebers erfragt werden. */ #include #include typedef int *INTP; int wind_get( int wi_ghandle, int wi_gfield, ... /* int *wi_gw1, int *wi_gw2, int *wi_gw3, int *wi_gw4 */ ) { va_list ap; intin[0] = wi_ghandle; /* Window Handle des Fensters, dessen * * Parameter erfragt werden sollen. */ intin[1] = wi_gfield; /* gibt an, welche Informationen erfragt werden * * sollen: * * * * 4: Die Koordinaten des Arbeitsbereichs eines * * Fensters werden ausgegeben: * * *wi_gw1 = X-Koordinate * * *wi_gw2 = Y-Koordinate * * *wi_gw3 = Breite * * *wi_gw4 = Hhe * * * * 5: Die Koordinaten der Gesamtgre des * * Fensters einschlielich Rnder, Titelzeile * * und Informationszeile werden ausgegeben: * * *wi_gw1 = X-Koordinate * * *wi_gw2 = Y-Koordinate * * *wi_gw3 = Breite * * *wi_gw4 = Hhe * * * * 6: Die Koordinaten der Gesamtgre des vor- * * hergehenden Fensters werden ausgegeben: * * *wi_gw1 = X-Koordinate * * *wi_gw2 = Y-Koordinate * * *wi_gw3 = Breite * * *wi_gw4 = Hhe * * * * 7: Die Koordinaten der Gesamtgre des * * Fensters in seiner grtmglichen Gre * * (durch WIND_CREATEWIND_CRE.C festgelegt) werden * * ausgegeben: * * *wi_gw1 = X-Koordinate * * *wi_gw2 = Y-Koordinate * * *wi_gw3 = Breite * * *wi_gw4 = Hhe * * * * 8: Die relative Position des horizontalen * * Schiebers wird ausgegeben (zwischen 1 und * * 1000): * * *wi_gw1: 1 = Position ganz links * * 1000 = Position ganz rechts * * * * 9: Die relative Position des vertikalen * * Schiebers wird ausgegeben (zwischen 1 und * * 1000): * * *wi_gw1: 1 = Position ganz oben * * 1000 = Position ganz unten * * * * 10: Das Window Handle des obersten * * (= aktiven) Fensters wird ausgegeben: * * *wi_gw1 = Window Handle * * * * 11: Die Koordinaten des ersten Rechtecks in * * der Rechteckliste des Fensters werden ausge- * * geben: * * *wi_gw1 = X-Koordinate * * *wi_gw2 = Y-Koordinate * * *wi_gw3 = Breite * * *wi_gw4 = Hhe * * * * 12: Die Koordinaten des nchsten Rechtecks * * in der Rechteckliste des Fensters werden * * ausgegeben: * * *wi_gw1 = X-Koordinate * * *wi_gw2 = Y-Koordinate * * *wi_gw3 = Breite * * *wi_gw4 = Hhe * * * * 13: Reserviert, keine Bedeutung. * * * * 15: Die Gre des horizontalen Schiebers * * relativ zur Gre des umrandenden Kastens * * wird ausgegeben: * * *wi_gw1: -1 = Minimalgre * * (quadratischer Kasten) * * 1-1000 = relative Gre im Ver- * * gleich zum Scrollbalken * * * * 16: Die Gre des vertikalen Schiebers * * relativ zur Gre des umrandenden Kastens * * wird ausgegeben: * * *wi_gw1: -1 = Minimalgre * * (quadratischer Kasten) * * 1-1000 = relative Gre im Ver- * * gleich zum Scrollbalken * * * * 17: Adresse und Lnge des internen Buffers * * fr Drop-Down-Mens und Alertboxen werden * * ausgegeben: * * *wi_gw1 = 'Erster Teil' der Adresse * * *wi_gw2 = 'Zweiter Teil' der Adresse * * *wi_gw3 = 'Erster Teil' der Lnge * * *wi_gw4 = 'Zweiter Teil' der Lnge */ AES( 104, 2, 5, 0, 0 ); va_start( ap, wi_gfield ); *(va_arg( ap, INTP )) = intout[1]; switch (wi_gfield) { case 4: case 5: case 6: case 7: case 11: case 12: case 17: *(va_arg( ap, INTP )) = intout[2]; *(va_arg( ap, INTP )) = intout[3]; *(va_arg( ap, INTP )) = intout[4]; } va_end( ap ); return intout[0]; /* = wi_greturn: positiv bei Erfolg, 0 bei Fehler * * (z.B. nicht existierendes Window Handle) */ } /* siehe auch: wind_setWIND_SET.C *//* * WIND_OPEN (C) Digital Design 1990 * * Ein Fenster wird dargestellt. * Das Fenster mu zuvor mit WIND_CREATEWIND_CRE.C erzeugt worden sein. */ #include int wind_open( int wi_ohandle, int wi_owx, int wi_owy, int wi_oww, int wi_owh ) { intin[0] = wi_ohandle; /* Window Handle des Fensters, das dargestellt * * werden soll */ intin[1] = wi_owx; /* X-Koordinate des Fensters */ intin[2] = wi_owy; /* Y-Koordinate des Fensters */ intin[3] = wi_oww; /* Breite des Fensters */ intin[4] = wi_owh; /* Hhe des Fensters */ AES( 101, 5, 1, 0, 0 ); return intout[0]; /* = wi_oreturn: positiv bei Erfolg, 0 bei Fehler. */ } /* siehe auch: wind_closeWIND_CLO.C */ /* * WIND_SET (C) Digital Design 1990 * * ndert das Aussehen des Randbereichs oder der Titelzeile * eines Fensters. */ #include #include typedef char *STRINGP; int wind_set( int wi_shandle, int wi_sfield, ... /* int wi_sw1, int wi_sw2, int wi_sw3, int wi_sw4 */ ) { va_list ap; intin[0] = wi_shandle; /* Window Handle des zu ndernden Fensters */ intin[1] = wi_sfield; /* gibt die Art der nderung an: * * * * 1: In wi_sw1 wird das Bit-Feld gespeichert, * * das festlegt, welche Komponenten des Randbe- * * reichs des Fensters sichtbar sein sollen. * * Die Bedeutung der Bits im Bit-Feld ist die * * gleiche wie bei WIND_CREATEWIND_CRE.C. * * * * 2: wi_sw1 und wi_sw2 stellen einen Zeiger * * dar, der auf einen String im Speicher zeigt. * * Dieser String ist der Titel des Fensters. * * Er mu folgendermaen im Speicher * * organisiert sein: * * 1.Byte = 1.Zeichen * * 2.Byte = 2.Zeichen * * ... * * n.Byte = letztes Zeichen * * n+1.Byte = Null * * n+2.Byte = Null * * Der Text wird automatisch zentriert. * * * * 3: wi_sw1 und wi_sw2 sind ein Zeiger auf * * einen String, der die Informationszeile des * * Fensters darstellt. Es gilt sinngem das * * gleiche wie bei 2. * * * * 5: Das laufende Fenster wird festgelegt. * * Diese Option korrespondiert mit dem Befehl * * WIND_GETWIND_GET.C, Option 5 und 6. * * * * 8: Die relative Position des horizontalen * * Schiebers wird verndert. Die Parameter sind * * die gleichen wie diejenigen von WIND_GETWIND_GET.C, * * Option 8. * * * * 9: Die relative Position des vertikalen * * Schiebers wird verndert. Die Parameter sind * * die gleichen wie diejenigen von WIND_GETWIND_GET.C, * * Option 9. * * * * 10: Das momentan aktive Fenster wird festge- * * legt. Es kann nur ein Fenster gleichzeitig * * aktiv, d.h. vom Benutzer vernderbar sein. * * Diese Option korrespondiert mit dem Befehl * * WIND_GETWIND_GET.C, Option 10. * * * * 14: Die Adresse einer neuen GEM DESKTOP- * * Zeichnung fr den Grundzustand wird * * bergeben: * * wi_sw1 * * und wi_sw2 = Adresse der Objektbaumstruktur * * wi_sw3 = Index des zuerst zu zeich- * * nenden Objekts * * * * 15: Die relative Gre des horizontalen * * Schiebers wird verndert. Die Parameter sind * * die gleichen wie diejenigen von WIND_GETWIND_GET.C, * * Option 15. * * * * 16: Die relative Gre des vertikalen * * Schiebers wird verndert. Die Parameter sind * * die gleichen wie diejenigen von WIND_GETWIND_GET.C, * * Option 16. */ va_start( ap, wi_sfield ); switch (wi_sfield) { case 1: case 8: case 9: case 10: case 15: case 16: intin[2] = va_arg( ap, int ); break; case 2: case 3: *(char far **)(intin + 2) = va_arg( ap, STRINGP ); break; case 5: intin[2] = va_arg( ap, int ); intin[3] = va_arg( ap, int ); intin[4] = va_arg( ap, int ); intin[5] = va_arg( ap, int ); break; case 14: *(char far **)(intin + 2) = va_arg( ap, STRINGP ); intin[4] = va_arg( ap, int ); } va_end( ap ); AES( 105, 6, 1, 0, 0 ); return intout[0]; /* = wi_sreturn: positiv bei Erfolg, 0 bei Fehler */ } /* * WIND_UPDATE (C) Digital Design 1990 * * Der Befehl kann zwei verschiedene Funktionen ausfhren: * 1. AES wird meitgeteilt, da die Applikation einen Bildschirmbereich * neu aufbaut bzw. da der Neuaufbau beendet ist. Whrend dieser * Zeit lt GEM keine Benutzeraktivitten zu. * 2. AES wird mitgeteilt, da die Applikation die berwachung * smtlicher Mausfunktionen bernimmt bzw. GEM wieder bergibt. * Im ersten Fall meldet AES der Applikation nicht mehr, wenn der * Benutzer Position und Gre eines Fensters ndern will. Auerdem * sind die Drop-Down-Mens inaktiv. */ #include int wind_update( int wi_ubegend ) { intin[0] = wi_ubegend; /* Art der Funktion: * * 0 = Ende des Bildaufbaus (END_UPDATE) * * 1 = Beginn des Bildaufbaus (BEG_UPDATE) * * 2 = Ende der Mauskontrolle durch den * * Benutzer (END_MCTRL) * * 3 = Beginn der Mauskontrolle durch den * * Benutzer (BEG_MCTRL) */ AES( 107, 1, 1, 0, 0 ); return intout[0]; /* = wi_ureturn: positiv bei Erfolg, 0 bei Fehler */ } AES Das AES-System (Application Environment Services) besteht aus einem vereinfachten Multi-Tasking-Kernel (das ist jener Teil eines Betriebs- systems, der sich darum kmmert, da scheinbar mehrere Aufgaben gleichzeitig erledigt werden), einem Bildschirmmanager und elf Funk- tionsbibliotheken fr folgende Aufgabenbereiche: ApplikationsAPPL\APPL.HLPverwaltung (appl_...) EreignisEVNT\EVNT.HLPverwaltung (evnt_...) MensMENU\MENU.HLP (menu_...) ObjekteOBJC\OBJC.HLP (objc_...) FormulareFORM\FORM.HLP (form_...) GrafikGRAF\GRAF.HLPfunktionen (graf_...) ZwischenspeicherSCRP\SCRP.HLP (scrp_...) DateiauswahlFSEL\FSEL.HLP (fsel_...) FensterWIND\WIND.HLPverwaltung (wind_...) ResourceRSRC\RSRC.HLPorganisation (rsrc_...) ShellSHEL\SHEL.HLP-Kommunikation (shel_...) Um AES-Funktionen in einem Programm verwenden zu knnen, mssen die Prototypen in der Deklarationsdatei AES.H mittels #include-Anweisung verfgbar sein. . D.. BCONIN vABCONOUT #wBCONSTAT uBCOSTAT ~BIOS HLP H PDRVMAP (ERROR ejC GETBPB GETMPB ;tKBSHIFT jMEDIACH RWABS yYSETEXC zTICKCAL {READ_ME TXT!o 2 Bconin long Bconin( int dev ); Diese Funktion holt ein Zeichen von einem Eingabegert ab. Der Parameter 'dev' hat dabei die gleiche Bedeutung wie bei der Funktion BconstatBCONSTAT. Die Funktion kehrt erst dann zurck, wenn ein Zeichen bereitsteht. Das erhaltene Zeichen steht im untersten Byte des Ergebnisses. War das Eingabegert die Tastatur ('con', 2), so wird zustzlich noch der Tasten-Scancode im unteren Byte des oberen Wortes des Ergebnisses geliefert. Beispiel: move.w #2,-(sp) * con move.w #2,-(sp) * bconin trap #13 addq.l #4,sp 3 Bconout void Bconout( int dev, int c ); Diese Funktion dient zur Ausgabe eines Zeichens 'c' an das Gert 'dev' (Bedeutung wie bei BconstatBCONSTAT). Die Funktion kehrt erst dann zurck, wenn das Zeichen ausgegeben wurde. Beispiel: move.w #'A',-(sp) move.w #0,-(sp) * PRT: move.w #3,-(sp) * bconout trap #13 addq.l #6,sp Das Beispiel gibt den Buchstaben 'A' an den Drucker aus. 1 Bconstat int Bconstat( int dev ); Diese Funktion liefert den Status eines Eingabegertes, der folgendermaen definiert ist: Status 0 kein Zeichen bereit Status -1 (mindestens) ein Zeichen bereit Der Parameter 'dev' gibt das Eingabegert an: dev Eingabegert 0 PRT:, Centronics-Schnittstelle 1 AUX:, RS232-Schnittstelle 2 CON:, Tastatur und Bildschirm 3 MIDI, MIDI-Schnittstelle 4 IKBD, Tastatur-Port Die folgende Tabelle gibt die erlaubten Zugriffe auf diese Gerte an: Operation PRT: AUX: CON: MIDI IKBD Eingabe-Status nein ja ja ja nein Eingabe ja ja ja ja nein Ausgabe-Status ja ja ja ja ja Ausgabe ja ja ja ja ja Beispiel: wait: move.w #1,-(sp) * RS232 move.w #1,-(sp) * bconstat trap #13 addq.l #4,sp tst d0 * Zeichen vorhanden ? beq wait * nein, warten Das Beispielprogramm wartet solange, bis ein Zeichen von der RS232-Schnittstelle bereitsteht. 8 Bcostat long Bcostat( int dev ); Diese Funktion prft, ob das mit 'dev' angegebene Ausgabegert bereit ist, das nchste Zeichen auszugeben. 'dev' kann die in der Funktion BconstatBCONSTAT beschriebenen Werte annehmen. Das Ergebnis dieser Funktion lautet entweder -1, falls das Ausgabegert bereit ist, oder Null, falls gewartet werden mu. Beispiel: move.w #0,-(sp) * Drucker bereit ? move.w #8,-(sp) * bcostat trap #13 addq.l #4,sp BIOS 0 GetmpbGETMPB Speicherparameterblock ermitteln. 1 BconstatBCONSTAT Status eines Eingabegerts ermitteln. 2 BconinBCONIN Zeichen von Eingabegert einlesen. 3 BconoutBCONOUT Zeichen auf Ausgabegert ausgeben. 4 RwabsRWABS Sektoren auf Laufwerken lesen und schreiben. 5 SetexcSETEXC Exceptionvektoren ermitteln und festlegen. 6 TickcalTICKCAL Timer-Konstante ermitteln. 7 GetbpbGETBPB BIOS-Parameterblock eines Gerts ermitteln. 8 BcostatBCOSTAT Status eines Ausgabegerts ermitteln. 9 MediachMEDIACH Ermitteln, ob die Diskette gewechselt wurde. 10 DrvmapDRVMAP Angeschlossene Laufwerke ermitteln. 11 KbshiftKBSHIFT Tastaturstatus ermitteln. Die BIOS-Funktionen stellen die unterste Schnittstelle des Betriebssystem..\TOSs zur Hardware des Atari ST dar. Diese Funktionen werden in Assembler alle ber den 680X0-Trap #13 angesprochen, wobei die Funktionsnummer sowie evt. Daten dabei auf dem Stack bergeben werden. Ergebnisse werden im Register D0 zurckgeliefert. Fr den Maschinen- programmierer ist noch interessant, da bei einem BIOS-Aufruf die Registerinhalte D0-D2 sowie A0-A2 benutzt werden; die brigen Registerinhalte bleiben erhalten. Die BIOS-Funktionen erscheinen etwas zusammengewrfelt. Nur wenige dieser Funktionen sollten in Applikationsprogrammen verwendet werden, da wesentlich leistungsfhigere Funktionen auf hherer Ebene als bessere Alternative verfgbar sind. In der obenstehenden bersicht finden Sie alle BIOS-Funktionen des Atari ST. Die erste Zahl gibt die Funktionsnummer des Traps an. 10 Drvmap long Drvmap( void ); Diese Funktion liefert einen Bitvektor, der die angeschlossenen Laufwerke enthlt. Die Bit-Nummer n ist dabei gesetzt, wenn Laufwerk n verfgbar ist (0 bedeutet wieder A usw.). Auch wenn nur ein Laufwerk angeschlossen ist, wird %11 geliefert, da von zwei logischen Laufwerken ausgegangen wird. Beispiel: move.w #10,-(sp) * drvmap trap #13 addq.l #2,sp 0 Ok, kein Fehler -1 allgemeiner Fehler -2 Drive not ready -3 unbekannter Befehl -4 CRC Error -5 Bad Request, ungltiger Befehl -6 Seek Error, Track nicht gefunden -7 Unknown media (ungltiger Bootsektor) -8 Sektor nicht gefunden -9 (Kein Papier) -10 Schreibfehler -11 Lesefehler -12 allgemeiner Fehler -13 Diskette schreibgeschtzt -14 Diskette wurde gewechselt -15 Unbekanntes Gert -16 Bad Sectors (beim Verifizieren) -17 Diskette einlegen (bei angeschlossenem Laufwerk) 7 Getbpb BPB *Getbpb( int dev ); Diese Funktion liefert einen Zeiger auf den BIOS-Parameter-Block des Drives 'dev' (0 = Laufwerk A, 1 = Laufwerk B). Der BPB ist folgendermaen aufgebaut: typedef struct { int recsiz; /* Sektorgre in Bytes */ int clsiz; /* Clustergre in Sektoren */ int clsizb; /* Clustergre in Bytes */ int rdlen; /* Directorylnge in Sektoren */ int fsiz; /* FAT-Gre in Sektoren */ int fatrec; /* Sektornummer der zweiten FAT */ int datrec; /* Sektornummer des ersten Daten-Clusters */ int numcl; /* Anzahl der Daten-Cluster auf der Diskette */ int bflags; /* Bitvektor, zur Zeit nur Bit 0 belegt: * * 0 = 12-Bit-FAT, 1 = 16-Bit-FAT */ } BPB; Die Funktion liefert fr Laufwerk A die Adresse $4DCE, fr Laufwerk B die Adresse $4DEE. Eine Adresse von Null kennzeichnet einen Fehler. Beispiel: move.w #0,-(sp) * Laufwerk A move.w #7,-(sp) * getbpb trap #13 addq.l #4,sp Hier die Daten des BPB fr 80 Track single sided und double sided Laufwerke: Parameter 80 Track SS 80 Track DS recsiz 512 512 clsiz 2 2 clsizeb 1024 1024 rdlen 7 7 fsiz 5 5 fatrec 6 6 datrec 18 18 numcl 351 711 0 Getmpb void Getmpb( void *ptr ); Diese Funktion fllt einen Block von 12 Bytes Lnge, dessen Adresse in 'ptr' enthalten ist, mit dem sogenannten Memory Parameter Block. Dieser Block enthlt selbst wieder drei Zeiger: long md_mfl Memory free list long md_mal Memory allocated list long md_rover roving pointer Die Strukturen, auf die jeder Zeiger zeigt, sind folgendermaen aufgebaut: long m_link Zeiger auf nchsten Block long m_start Startadresse des Blocks long m_length Lnge des Blocks in Bytes long m_own Process Descriptor Beispiel: move.l #puffer,-(sp) * Puffer fr MPB move.w #0,-(sp) * getmpb trap #13 addq.l #6,sp Wir erhalten die Werte $48E, 0 und $48E. Ab Adresse $48E stehen folgende Daten (bei 1 MB RAM): m_link 0 kein weiterer Block m_start $A100/$EDF00 Startadresse des freien Speichers m_length $39FF0/$BE010 Lnge des freien Speichers m_own 0 kein Process Descriptor 11 Kbshift long Kbshift( int mode ); Mit dieser Funktion knnen Sie den Status der Sondertasten der Tastatur erfahren oder verndern. Ist 'mode' gleich -1, so erhalten Sie den Status, ein positiver Wert wird als Status bernommen. Der Status ist ein Bitvektor, der folgendermaen aufgebaut ist: Bit Bedeutung 0 rechte Shift-Taste 1 linke Shift-Taste 2 Control-Taste 3 ALT-Taste 4 Caps Lock eingeschaltet 5 rechte Maus-Taste (CLR/HOME) 6 linke Maus-Taste (INSERT) 7 unbenutzt Beispiel: move.w #-1,-(sp) * Shift-Status lesen move.w #11,-(sp) * kbshift trap #13 addq.l #4,sp 8 Mediach long Mediach( int dev ); Mit dieser Funktion lt sich ermitteln, ob zwischenzeitlich eine Diskette gewechselt wurde. Dazu mu im Parameter 'dev' die Laufwerksnummer bergeben werden (0 = Laufwerk A, 1 = Laufwerk B). Als Ergebnis knnen drei Werte auftreten: 0 Diskette wurde definitiv nicht gewechselt 1 Diskette kann gewechselt worden sein 2 Diskette wurde definitiv gewechselt Beispiel: move.w #1,-(sp) * Laufwerk B move.w #9,-(sp) * mediach trap #13 addq.l #4,sp 4 Rwabs long Rwabs( int rwflag, void *buf, int cnt, int recnr, int dev ); Diese Funktion dient zum Schreiben und Lesen von Sektoren auf Diskette. Die Parameter haben dabei folgende Bedeutung: rwflag Bedeutung 0 Sektoren lesen 1 Sektoren schreiben 2 Sektoren lesen, Diskettenwechsel ignorieren 3 Sektoren schreiben, Diskettenwechsel ignorieren 'buf' ist dabei die Adresse eines Puffers, in den die Daten von Diskette gelesen bzw. von dem die Daten auf Diskette geschrieben werden. Der Puffer sollte an einer geraden Adresse beginnen, da sonst die bertragung sehr langsam verluft. 'cnt' gibt an, wieviele Sektoren bei einem Aufruf gelesen oder geschrieben werden sollen. 'recno' gibt an, bei welchem logischen Sektor dabei begonnen wird. 'dev' schlielich bestimmt, welches Floppylaufwerk benutzt wird: dev Laufwerk 0 Drive A 1 Drive B 2+ Harddisk, RAM-Disk, Netzwerk Die Funktion liefert als Ergebnis einen Fehlercode. Lautet dieser Wert Null, so ist die Operation fehlerfrei verlaufen. Bei einem Fehler steht hier der negative FehlerERRORcode. Beispiel: move.w #0,-(sp) Laufwerk A move.w #10,-(sp) Beginn bei logischem Sektor 10 move.w #2,-(sp) 2 Sektoren lesen move.l #puffer,-(sp) Pufferadresse move.w #0,-(sp) Sektoren lesen move.w #4,-(sp) rwabs trap #13 add.l #14,sp ... puffer: ds.w 512 5 Setexec void (*Setexc( int number, void (*exchdlr)() ))(); Diese Funktion erlaubt es, einen Exception-Vektor des 68000-Prozessors zu verndern. Dazu mssen die Nummer des Vektors in 'number' und die Adresse der zugehrigen Routine in 'exchdlr' enthalten sein. Die Funktion liefert als Ergebnis den alten Vektor zurck. Will man den Vektor nur lesen, so bergibt man als neuen Wert -1. Mit dieser Funktion lassen sich die 256 Vektoren des Prozessors sowie 8 Vektoren fr GEM setzen, die die Nummern $100 bis $107 haben (Adressen $400 bis $41C). Beispiel: move.l #buserror,-(sp) move.w #2,-(sp) move.w #5,-(sp) trap #13 addq.l #8,sp ... buserror: 6 Tickcal long Tickcal( void ); Diese Funktion liefert als Ergebnis die Anzahl der Millisekunden zwischen zwei System-Timer-Aufrufen. Beispiel: move.w #6,-(sp) trap #13 addq.l #2,sp Ergebnis: 20 ms. . D.. CINCOUT DDIR DFILE DMEM DPEXEC DSYS DTIME DERROR #GEMDOS HLP $m READ_ME TXT!. D.. DCAUXIN j CAUXIS  CAUXOS CAUXOUT k CCONIN i CCONIS CCONOS ۝ CCONOUT i CCONRS P CCONWS 4 RCINCOUT HLP PCNECIN  `CPRNOS Ȟ CPRNOUT l CRAWCIN 3 CRAWIO ro 8READ_ME TXT!z $03 AUXILIARY INPUT int Cauxin( void ); Unter der Bezeichnung Auxiliary Port verbirgt sich die RS232-Schnittstelle des ATARI ST. Mit der Funktion Cauxin kann von der Schnittstelle ein Zeichen geholt werden. Die Funktion kehrt zurck, wenn ein Zeichen vollstndig empfangen wurde. Das Zeichen befindet sich nach der Rckkehr in den unteren acht Bit des Registers D0. ---------------------------------------------------------------------- MOVE.W #3,-(SP) * Cauxin TRAP #1 * GEMDOS aufrufen, Zeichen ausgeben ADDQ.L #2,SP * Stack korrigieren ... * Zeichen in D0. ---------------------------------------------------------------------- $12 AUXIN STAT int Cauxis( void ); Durch den Aufruf von AUXIN STAT erfhrt man, ob ein Zeichen vom Empfnger der seriellen Schnittstelle verfgbar ist ($FFFF) oder nicht (Null). Wie bei allen anderen Funktionen wird der Wert in D0 zurckgegeben. ---------------------------------------------------------------------- warteloop: MOVE #$12,-(SP) * wir warten auf ein Zeichen von der RS232 TRAP #1 * GEMDOS aufrufen ADDQ.L #2,SP * Stack aufrumen TST D0 * ist ein Zeichen da? BNE warteloop * nein, leider noch nicht ---------------------------------------------------------------------- $13 AUXOUT STAT int Cauxos( void ); AUXOUT STAT gibt Auskunft ber den Zustand des Senders der seriellen Schnittstelle. Ein Wert von $FFFF signalisiert, da die serielle Schnittstelle ein Zeichen senden kann, Null dagegen signalisiert, da derzeit kein Zeichen zum Transmitter geschickt werden sollte. ---------------------------------------------------------------------- warteloop: MOVE #$13,-(SP) * wir warten, bis wir ein Zeichen TRAP #1 * ber die RS232 senden drfen ADDQ.L #2,SP * Stack aufrumen TST D0 * drfen wir jetzt? BNE warteloop * nein, leider noch nicht ---------------------------------------------------------------------- $04 AUXILIARY OUTPUT void Cauxout( int c ); Analog der Eingabe von Zeichen ber die serielle Schnittstelle kann mit dieser Funktion ein Zeichen gesendet werden. Auch bei dieser Funktion sollte der Programmierer die oberen acht Bit des Wortes lschen und den Code des zu sendenden Zeichens in den unteren acht Bit bergeben. ---------------------------------------------------------------------- MOVE.W #$41,-(SP) * Ein A soll ausgegeben werden MOVE.W #4,-(SP) * Cauxout TRAP #1 * GEMDOS aufrufen, Zeichen ausgeben ADDQ.L #4,SP * Stack korrigieren ---------------------------------------------------------------------- $01 CONIN long Cconin( void ); Mit CONIN, auch Cconin genannt, kann ein einzelnes Zeichen von der Tastatur geholt werden. Dabei wird solange gewartet, bis ein Zeichen verfgbar ist. Das Ergebnis, also das von der Tastatur gelesene Zeichen, wird im Register D0 bergeben. Im Low Byte des Low Word steht der ASCII-Code der gedrckten Taste, im Low Byte des High Word des Registers wird der von der Tastatur gelieferte Scan-Code bergeben. Das ist wichtig bei der Abfrage der Tasten, denen kein ASCII-Code zugeordnet ist. Das trifft z.B. auf die 10 Funktionstasten oder die Tasten des Cursorblocks zu. Diese Tasten liefern bei Bettigung den ASCII-Wert Null. Auch kann bei Bedarf an Hand des Scan-Codes unterschieden werden, ob Tasten des Ziffernblocks oder der Haupttastatur gedrckt wurden, da diese Tasten zwar identische ASCII-Codes, jedoch unterschiedliche Scan-Codes liefern. Zustzlich kann in den obersten 8 Bits (Bit 24 bis 31) der Shift-Status beim Cconin-Aufruf mitgeliefert werden. In diesem Fall entsprechen die Bits 24 bis 31 den Bits 0 bis 7 der BIOS-Funktion 11 kbshift..\..\BIOS\KBSHIFT. Die Information wird allerdings nur dann beim Cconin-Aufruf geliefert, wenn zuvor das Bit 3 in der Speicherzelle 'conterm' an der Adresse $484 gesetzt wurde. Ist das Bit gelscht, so sind die Shift-Bits nach dem Cconin gelscht. Cconin erkennt kein Control-C. ---------------------------------------------------------------------- ... MOVE.W #1, -(SP) * Funktionsnummer auf den Stack TRAP #1 * GEMDOS aufrufen ADDQ.L #2,SP * Stack korrigieren ... * Ergebnis in D0 ---------------------------------------------------------------------- $0B CONSTAT int Cconis( void ); Alle Tastenbettigungen werden zunchst in einem Buffer des Betriebssystems zwischengespeichert. Dieser Speicher ist insgesamt 256 Bytes gro. Die zwischengespeicherten Tastenwerte werden erst beim Aufruf einer GEMDOS-Eingaberoutine aus dem Buffer an die Routine bergeben. Mit CONSTAT oder Cconis kann geprft werden, ob im Tastatur-Buffer Zeichen gespeichert sind. Nach dem Aufruf erhlt man in D0 den Wert Null oder $FFFF. Eine Null in D0 signalisiert, da keine Zeichen verfgbar sind. ---------------------------------------------------------------------- testloop: MOVE #$0b,-(SP) * Funktionsnummer TRAP #1 * GEMDOS aufrufen ADDQ.L #2,(SP) * Stack aufrumen TST.W D0 * Zeichen verfgbar? BEQ testloop * nein, noch mal nachsehen ---------------------------------------------------------------------- $10 CONOUT STAT int Cconos( void ); CONOUT STAT liefert nach dem Aufruf in D0 den Status der Console. Bei Rckgabe des Wertes $FFFF kann ein Zeichen auf dem Bildschirm dargestellt werden. Ist jedoch der Rckgabewert Null, so ist derzeit keine Zeichenausgabe auf dem Bildschirm mglich. Wer jedoch hofft, einmal den 'not ready' Status zu erzielen, der wird durch einen Blick in das BIOS-Listing eines besseren belehrt. Die Funktion liefert immer den Wert $FFFF gleich -1 zurck. Die Funktion ist somit zumindest bei den gegenwrtig verfgbaren TOS-Versionen uerst berflssig. ---------------------------------------------------------------------- MOVE #$10,-(SP) * Funktionsnummer TRAP #1 * GEMDOS aufrufen ADDQ.L #2,SP * Stack aufrumen ... * immer $FFFF in D0 ---------------------------------------------------------------------- $02 CONOUT void Cconout( int c ); CONOUT, auch Cconout genannt, stellt die einfachste (primitivste) Zeichenausgabe des GEMDOS dar. Mit dieser Funktion kann nur ein Zeichen auf dem Bildschirm ausgegeben werden. Dazu wird das Zeichen als erstes Wort auf den Stack gelegt. Der ASCII-Wert des auszugebenden Zeichens mu im Low Byte des Wortes stehen, das High Byte sollte Null sein. ---------------------------------------------------------------------- MOVE.W #65,-(SP) * Ein A soll ausgegeben werden MOVE.W #2,-(SP) * Cconout TRAP #1 * GEMDOS aufrufen, Zeichen ausgeben ADDQ.L #4,SP * Stack korrigieren ... ---------------------------------------------------------------------- $0A READLINE void Cconrs( char *buf ); READLINE stellt eine recht komfortable Funktion zur Eingabe von Zeichen ber die Tastatur dar. Im Gegensatz zu den 'einfacheren' zeichenorientierten Eingabefunktionen kann mit READLINE eine ganze Eingabezeile von der Tastatur geholt werden. Die eingegebenen Zeichen werden gleichzeitig auf dem Bildschirm dargestellt. Als Parameter wird der Funktion die Adresse eines Eingabe-Buffers bergeben. Der Wert des ersten Bytes des Eingabe-Buffers bestimmt die maximale Lnge der Eingabezeile, mu also vor dem Aufruf initialisiert werden. Das zweite Byte des Buffers enthlt nach dem Beenden der Eingabe die Anzahl der tatschlich eingegebenen Zeichen. Die Zeichen selbst stehen im Buffer ab dem dritten Byte. Die von READLINE benutzte Routine zur Tastatureingabe ist von den zeichenorientierten Console-Eingaben gnzlich unterschiedlich. Escape-Sequenzen werden bei der Ausgabe unterdrckt und nicht an den VT52-Emulator durchgereicht. Nur Control-Zeichen wie Control-H (Backspace) und Control-I (TAB) werden erkannt und entsprechend behandelt. Insgesamt sind die folgenden, teilweise sonst nicht wirksamen Control-Zeichen mglich: ^C beendet Eingabe UND Programm (!) ^H Backspace ein Zeichen ^I TAB, Tabulatorsprung ^J Line Feed, Eingabe beenden ^M Carriage Return, Eingabe beenden ^R eingegebene Zeile wird in neuer Zeile ausgegeben ^U Zeile nicht werten, in neuer Zeile beginnen ^X Zeile lschen, Cursor an Zeilenanfang. Wenn man sicher ist, nicht die Control-Funktionen zu verwenden, so kann man READLINE recht einfach handhaben. Besonders ^H, das Lschen zuletzt eingegebener Zeichen, ist ntzlich. Trotzdem sollte man bei umfangreicheren Programmen eine eigene Eingaberoutine schreiben, da ^C sehr 'gefhrlich' ist. Nicht nur am unmittelbaren Zeilenanfang (wie bei CP/M), sondern immer whrend der Eingabe wird mit ^C das Programm sofort beendet. Diese Mglichkeit ist nicht abschaltbar. Werden mehr Zeichen eingegeben, als bei der Initialisierung im ersten Byte des Buffers angegeben wurden, so wird automatisch die Eingabe abgebrochen. Wird die Eingabe mit ENTER, ^J oder ^M abgeschlossen, so steht das Abschluzeichen nicht im Buffer (im Gegensatz zur offiziellen ATARI-Dokumentation). Nach der Eingabe enthlt D0 die Anzahl der eingegebenen Zeichen ohne ENTER, die ja auch in buf[1] gefunden werden kann. Der eingegebene String wird nicht unbedingt von einer Null abgeschlossen! ---------------------------------------------------------------------- PEA buffer * Adresse des Eingabebuffers MOVE #$0a,-(SP) * Funktionsnummer TRAP #1 * GEMDOS aufrufen ADDQ.L #6,(SP) * Stack aufrumen ... buffer: dc.b 20 * wir wollen maximal 20 Zeichen haben dc.b 0 * Anzahl der eingegebenen Zeichen nach Aufruf ds.b 20 * der eigentliche Eingabebuffer ---------------------------------------------------------------------- $09 PRINT LINE void Cconws( char *s ); Mit PRINT LINE kann eine ganze Zeichenkette an der momentanen Cursorposition ausgegeben werden. Dazu wird die Adresse der Zeichenkette als Parameter auf dem Stack bergeben. Die Zeichenkette selbst wird, wie in C blich, durch ein Null-Byte begrenzt. Nach dem Aufruf erhalten Sie in D0 die Anzahl der Zeichen, die ausgegeben wurden. ---------------------------------------------------------------------- PEA text,-(SP) * Adresse der Zeichenkette auf den Stack MOVE #9,-(SP) * Funktionsnummer Cconws TRAP #1 * GEMDOS aufrufen ADDQ.L #6,SP * Stack wieder 'aufrumen' ... text: dc.b 'dies ist der auszugebende Text',$0d,$0a,0 ---------------------------------------------------------------------- Zeichenweise Ein-/Ausgabe Zu allen Ein-/Ausgabe-Funktionen auf die Standardgerte CON: (Tastatur und Bildschirm), PRN: (Drucker an der parallelen Schnittstelle) und AUX: (Gerte an der seriellen Schnittstelle) stehen auch die ent- sprechenden Statusfunktionen zur Verfgung. 1 CconinCCONIN Zeichen von Standardeingabegert einlesen. 2 CconoutCCONOUT Zeichen auf Standardausgabegert schreiben. 3 CauxinCAUXIN Zeichen von serieller Schnittstelle lesen. 4 CauxoutCAUXOUT Zeichen auf serielle Schnittstelle schreiben. 5 CprnoutCPRNOUT Zeichen auf Drucker ausgeben. 6 CrawioCRAWIO Zeichen direkt von Tastatur lesen oder auf Bildschirm ausgeben. 7 CrawcinCRAWCIN Zeichen ohne Darstellung am Bildschirm und ohne Interpretation von Steuerzeichen einlesen. 8 CnecinCNECIN Zeichen ohne Darstellung am Bildschirm einlesen. 9 CconwsCCONWS String auf Standardausgabegert ausgeben. 10 CconrsCCONRS String von Standardeingabegert einlesen. 11 CconisCCONIS Tastatur-Puffer nach anliegenden Zeichen abfragen. 16 CconosCCONOS Ausgabe-Status des Standardausgabegerts berprfen. 17 CprnosCPRNOS Drucker-Status ermitteln. 18 CauxisCAUXIS Eingabe-Status der seriellen Schnittstelle ermitteln. 19 CauxosCAUXOS Ausgabe-Status der seriellen Schnittstelle ermitteln. $08 CON IN WITHOUT ECHO long Cnecin( void ); Die Funktion $08 unterscheidet sich nicht von der Funktion CrawcinCRAWCIN $07. Beide Funktionsaufrufe bewirken exakt dasselbe. Die Ursache fr dieses scheinbar unsinnige Verfahren liegt in der 'Kompatibilitt' mit MS-DOS begrndet. Unter MS-DOS unterscheiden sich die beiden Funktionen dadurch, da mit $08 bestimmte, beim ATARI ST nicht vorhandene Tasten richtig ausgewertet werden, whrend diese Auswertung bei der Funktion $07 unterbleibt. ---------------------------------------------------------------------- MOVE.W #8,-(SP) * Cnecin TRAP #1 * GEMDOS aufrufen, Zeichen empfangen ADDQ.L #2,SP * Stack korrigieren ... * Zeichen in D0 ---------------------------------------------------------------------- $11 PRTOUT STAT int Cprnos( void ); Diese Funktion liefert den Status, also den Zustand der Centronics- Schnittstelle. Ist kein Drucker angeschlossen (nicht eingeschaltet, OFF LINE usw.), so erhlt man nach dem Aufruf in D0 den Wert Null als Kennzeichen 'Drucker nicht verfgbar'. Ist der Drucker jedoch empfangsbereit, so erhlt man in D0 den Wert $FFFF zurck. ---------------------------------------------------------------------- MOVE #$11,-(SP) * wie geht's dem Drucker? TRAP #1 * GEMDOS aufrufen ADDQ.L #2,SP * Stack aufrumen TST D0 BEQ printererror * da stimmt was nicht! ---------------------------------------------------------------------- $05 PRINTER OUTPUT void Cprnout( int c ); Printer Output ist die einfachste Methode, einen an der Centronics- Schnittstelle angeschlossenen Drucker zu betreiben. Mit jedem Aufruf wird dem Drucker ein Zeichen bergeben. Wurde das Zeichen an den Drucker gesendet, so erhlt man den Wert -1 ($FFFFFFFF) in D0 zurck. Ist jedoch der Drucker innerhalb von ca. 30 Sekunden nicht in der Lage, das Zeichen anzunehmen (nicht eingeschaltet, OFF LINE, kein Papier usw.), so ist in D0 eine Null enthalten. ---------------------------------------------------------------------- MOVE.W #65,-(SP) * Ein A soll ausgegeben werden MOVE.W #5,-(SP) * Funktionsnummer TRAP #1 * GEMDOS aufrufen, Zeichen ausgeben ADDQ.L #4,SP * Stack korrigieren TST.W D0 * Flags beinflussen BEQ printerfehler ---------------------------------------------------------------------- $07 DIRECT CON IN WITHOUT ECHO long Crawcin( void ); Die Funktion $07 unterscheidet sich von CconinCCONIN $01 nur dadurch, da das von der Tastatur erhaltene Zeichen nicht auf dem Bildschirm ausgegeben wird. Es wird also genau wie bei CconinCCONIN auf einen Tastendruck gewartet. Allerdings darf man dieses Warten nicht zu wrtlich nehmen. Durch den Tastaturpuffer des ST kann es natrlich passieren, da die ensprechenden Routinen wie CconinCCONIN oder CrawcinCRAWCIN mit einem Zeichen zurckkommen, auch wenn Sie zum Zeitpunkt des Aufrufes gar keine Taste gedrckt haben. ---------------------------------------------------------------------- MOVE.W #7,-(SP) * Funktionsnummer von Crawcin TRAP #1 * GEMDOS aufrufen, Zeichen empfangen ADDQ.L #2,SP * Stack korrigieren ... * Zeichen in D0 ---------------------------------------------------------------------- $06 RAWCONIO long Crawio( int c ); RAWCONIO ist eine etwas ungewhnliche Mischung aus Tastatureingabe und Bildschirmausgabe und erhlt einen Parameter auf dem Stack. Bei einem Funktionswert $FF wird die Tastatur berprft. Wenn ein Zeichen vorhanden ist, so wird es wie schon bei CONINCCONIN besprochen mit ASCII- und SCAN-Code in D0 bergeben. Ist jedoch kein Tastenwert vorhanden, so wird der Wert Null sowohl als ASCII- wie auch als SCAN-Code in D0 bergeben. Wird ein von $FF unterschiedlicher Wert an die Funktion bergeben, so wird der Wert als auszugebendes Zeichen interpretiert und an der momentanen Cursor-Position ausgegeben. ---------------------------------------------------------------------- ANFANG: MOVE.W #$FF,-(SP) * Funktionswert Tastatur prfen MOVE.W #6,-(SP) * Funktionsnummer TRAP #1 * GEMDOS aufrufen, Tastatur prfen ADDQ.L #4,(SP) * Stack korrigieren TST.W D0 * Zeichen angekommen ? BEQ ANFANG * noch nicht ! CMP.B #3,D0 * ^C frei gewhltes Ende-Kennzeichen BEQ ENDE MOVE D0,-(SP) * Zeichen fr die Ausgabe auf den Stack MOVE #6,-(SP) * Funktionsnummer TRAP #1 * GEMDOS aufufen, Tastatur prfen ADDQ.L #4,SP * Stack korrigieren BRA ANFANG * neues Zeichen holen ENDE: ---------------------------------------------------------------------- . D.. DDCREATE <0DDELETE k0DFREE  DGETDRV 2}0DGETPATH L0DIR HLP ۳DSETDRV DSETPATH M0 READ_ME TXT!v $39 MKDIR int Dcreate( char *path ); Vom Desktop aus kann ein Unterdirectory mit dem Punkt 'NEUER ORDNER' angelegt werden. Mit dem Aufruf Dcreate $39 kann ein solches Unterdirectory auch von Anwenderprogrammen heraus angelegt werden. Mit Hilfe solcher Unterdirectories oder Ordner kann man bei ein wenig Planung den Datentrger recht bersichtlich organisieren. Um einen neuen Ordner zu schaffen, wird der Funktion $39 die Adresse des Ordner-Namens, auch als Pfadname (engl. Pathname) bezeichnet, bergeben. Dieser Name darf aus 8 Zeichen und drei Zeichen Extension bestehen. Damit gilt fr den Pfadnamen die gleiche Einschrnkung wie fr Filenamen. Er mu beim Aufruf von MKDIR mit einem Null-Byte abgeschlossen sein. Nach dem Aufruf wird in D0 mitgeteilt, ob die Operation erfolgreich abgeschlossen wurde. Ist in D0 eine Nullenthalten, so war der Aufruf erfolgreich. Fehler..\ERROR werden durch eine negative Nummer in D0 gekennzeichnet. ---------------------------------------------------------------------- PEA pathname * Adresse des Pfadnamens MOVE #$39,-(SP) * Funktionsnummer TRAP #1 ADDQ.L #6,SP * Stack reparieren TST.W D0 * Fehler aufgetreten ? BNE fehler * es scheint so ... pathname: DC.B 'privat.dat',0 ---------------------------------------------------------------------- $3A RMDIR int Ddelete( char *path ); Ein mit MKDIR erzeugtes Subdirectory kann mit $3A auch wieder gelscht werden. Dazu wird der mit Null abgeschlossene Pfadname an RMDIR bergeben. Die Fehlermeldungen sind entsprechend MKDIRDCREATE Null bei Erfolg oder ein negativer Wert bei Fehler..\ERRORn. Eine wichtige Fehlermeldung in diesem Zusammenhang ist die Meldung -36 ($FFFFFFCA). Diese Fehlermeldung erhalten Sie, wenn das zu lschende Subdirectory Files enthlt. Man kann mit RMDIR also nur leere Subdirectories lschen. Im Falle der beschriebenen Fehlermeldung mu man dann zunchst mit UNLINK..\FILE\FDELETE ($41) alle Files im Subdirectory lschen und danach einen neuen Anlauf nehmen. ---------------------------------------------------------------------- PEA pathname * Adresse des Pfadnamens MOVE #$3A,-(SP) * Funktionsnummer TRAP #1 ADDQ.L #6,SP * Stack reparieren TST.W D0 * Fehler aufgetreten ? BNE era_sub_dir * wahrscheinlich erst mal putzen ... pathname: DC.B 'tmpfiles.a_z',0 ---------------------------------------------------------------------- $36 GET DISK FREE SPACE int Dfree( DISKINFO *buf, int driveno ); typedef struct { unsigned long b_free; /* Anzahl freier Cluster */ unsigned long b_total; /* Gesamtanzahl an Clustern */ unsigned long b_secsiz; /* Gre eines Sektors in Bytes */ unsigned long b_clsiz; /* Sektoren pro Cluster */ } DISKINFO; Fr massenspeicherorientierte Programme kann es sehr wichtig sein, die Gre des freien Platzes auf dem Datentrger zu ermitteln. Damit hat man z. B. die Mglichkeit, den Anwender zum rechtzeitigen Diskettenwechsel aufzufordern. 'Disk Full' Fehlermeldungen oder gar Datenverluste knnen dann sicher verhindert werden. Genau diese Information liefert die Funktion $36 Dfree(). Dazu mu die Nummer des gewnschten Laufwerks und die Adresse eines 16 Byte groen Buffers an die Funktion bergeben werden. Wird als Laufwerksnummer der Wert 0 bergeben, so wird die Information vom aktiven Laufwerk geholt, bei einer 1 von Drive A, bei 2 von Drive B. Die im Buffer bergebene Information teilt sich in 4 Langworte auf. Das erste Langwort enthlt die Anzahl noch freier sogenannter Allocation Units oder Cluster. Jede Datei, und sei sie auch nur acht Bytes gro, bentigt mindestens eine solche Allocation Unit. Das zweite Langwort gibt Aufschlu ber die Anzahl der auf der Diskette vorhandenen Cluster, unabhngig, ob sie bereits belegt oder noch frei sind. Bei der 'kleinen' einseitigen Diskette betrgt dieser Wert $15C oder 351, die doppelseitigen Disketten haben $2C7 = 711 Cluster. Das dritte Langwort enthlt die Gre eines Diskettensektors in Byte. Dieser Wert betrgt im Normalfall 512 ($200) Bytes oder ein Vielfaches davon. Im letzten Langwort schlielich wird die Anzahl der zu einem Cluster gehrenden physikalischen Sektoren vermerkt. Hier ist normalerweise eine 2 eingetragen. Zwei Sektoren mit je 512 Bytes bilden also einen Cluster (Allocation Unit) von insgesamt 1024 Bytes. Aus den so gewonnenen Informationen kann nun ohne Schwierigkeiten die Anzahl der noch verfgbaren Bytes berechnet werden. In TOS-Versionen vor Rainbow-TOS 1.4 ist diese Funktion unglaublich langsam, auch wenn das bei Benutzung eines Diskettenlaufwerkes nicht so ins Auge fllt. Auf einer 20 MB Harddisk aber kann man bis zu 20 Sekunden warten, bis das Ergebnis geliefert wird. Die Funktion liefert bei korrekter Ausfhrung eine 0 und bei einem aufgetretenen Fehler eine negative Zahl. ---------------------------------------------------------------------- MOVE.W #0,-(SP) * Information vom aktiven Drive PEA BUFFER * Adresse des 16-Byte Buffers MOVE #$36,-(SP) * Funktionsnummer TRAP #1 ADDQ.L #6,SP * Stack aufrumen TST D0 * Fehler aufgetreten ? BNE ERROR * das ging schief ... BUFFER: freal: DS.L 1 * Free Clusters total: DS.L 1 * Total Clusters bps: DS.L 1 * Bytes/physical Sector pspal: DS.L 1 * phys. Sectors/Cluster ---------------------------------------------------------------------- $19 CURRENT DISK int Dgetdrv( void ); Fr manche Anwendungen ist es erforderlich zu wissen, welches Laufwerk derzeit angemeldet ist. Mit der Funktion $19 kann das aktuelle Laufwerk einfach ermittelt werden. Nach dem Aufruf erhlt man die Nummer des Laufwerks in D0 zurck. Die Bedeutung der Nummern ist identisch mit den Laufwerksnummern bei $0E, Set DriveDSETDRV, also 0 = A, 1 = B usw. ---------------------------------------------------------------------- MOVE #$19,-(SP) * welches Drive ist wohl aktiv ? TRAP #1 ADDQ.L #2,SP * Stack aufrumen ADD D0,'A' * jetzt steht in D0 ein Zeichen * zwischen 'A' und 'P' ---------------------------------------------------------------------- $47 GETDIR void Dgetpath( char *buf, int drive ); Mit der Funktion $3B kann ein beliebiges Subdirectory zum aktuellen Directory ernannt werden. Alle Dateizugriffe ohne Pfadnamen laufen dann nur im eingestellten Subdirectory ab. Allerdings kann es unter bestimmten Voraussetzungen wesentlich sein, den derzeitigen Pfadnamen zum aktuellen Subdirectory zu ermitteln. Diese Arbeit erledigt der Funktionsaufruf GETDIR, $47. Als Parameter bentigt dieser Aufruf die Bezeichnung des gewnschten Laufwerks (0=aktuelles Drive, 1=Drive A, 2=Drive B u.s.w.) und einen Pointer auf einen Buffer, der mindestens 64 Bytes gro sein mu. In diesem Buffer wird der komplette Pfadname zum aktuellen Directory abgelegt. Der Pfadname wird durch ein Null-Byte abgeschlossen. Wird die Funktion aufgerufen, wenn das Haupt-Directory aktiv ist, so wird kein Pfadname bergeben. In diesem Fall enthlt gleich das erste Byte des Buffers Null. Nach dem Aufruf mu D0 den Wert Null enthalten. Bei negativen Werten ist ein Fehler aufgetreten, z.B. dann, wenn eine falsche Laufwerksnummer angegeben wurde. ---------------------------------------------------------------------- MOVE.W #0,-(SP) * Pfadname vom aktuellen Drive holen PEA buffer * Adresse des 64-Byte-Buffers MOVE.W #$47,-(SP) * Funktionsnummer TRAP #1 ADDQ.L #8,SP ... buffer: DS.B 128 * sicher ist sicher ---------------------------------------------------------------------- Verzeichnisfunktionen Dateiverzeichnisse und Laufwerke verwalten. 14 DsetdrvDSETDRV Aktuelles Laufwerk ndern. 25 DgetdrvDGETDRV Aktuelles Laufwerk ermitteln. 54 DfreeDFREE Freie und Gesamtkapazitt eines Laufwerks ermitteln. 57 DcreateDCREATE Verzeichnis anlegen. 58 DdeleteDDELETE Verzeichnis lschen. 59 DsetpathDSETPATH Aktuelles Verzeichnis ndern. 71 DgetpathDGETPATH Aktuelles Verzeichnis ermitteln. $0E SETDRV long Dsetdrv( int drv ); Mit der Funktion SETDRV kann das aktuelle Laufwerk bestimmt werden. Dazu wird dem Aufruf ein Parameter (16 Bit) bergeben, in dem die Laufwerksbezeichnung enthalten ist. Das Laufwerk A wird mit der Nummer 0, das Laufwerk B mit der Nummer 1 angesprochen usw. Nach dem Aufruf erhlt man in D0 einen Bitvektor mit den vorhandenen Laufwerken (Bit 0: A:, ...). Einen Bitvektor mit den von GEMDOS untersttzten Laufwerken beschafft man sich am besten mit Dsetdrv( Dgetdrv() ); Zur Zeit ist der zurckgelieferte Bitvektor das Resultat des BIOS- Aufrufs "Drvmap..\..\BIOS\DRVMAP()". Dies ist jedoch nicht doku- mentiert und knnte sich ohne weiteres eines Tages ndern. ---------------------------------------------------------------------- MOVE #2,-(SP) * Drive C, z.B. Ramdisk MOVE #$0e,-(SP) * Funktionsnummer TRAP #1 ADDQ.L #4,SP * Stack aufrumen ---------------------------------------------------------------------- $3B CHDIR int Dsetpath( char *path ); Das unter GEMDOS verfgbare System der Subdirectories ist in genau derselben Form auch unter UNIX verfgbar. Nun ist dieses System zwar auch auf Rechnern mit Diskettenstationen gewinnbringend einzusetzen, seinen Vorteil spielt es jedoch erst dann aus, wenn im System ein groer Massenspeicher wie z.B. eine Harddisk mit mehreren Megabyte Speicherkapazitt vorhanden ist. Wenn so eine Harddisk erstmal mit 100 oder mehr Dateien beschrieben ist, dann geht ohne Subdirectories (auch als Folder bezeichnet) so schnell nichts mehr. Man hockt dann wahrscheinlich die meiste Zeit vor dem Monitor und sucht das gerade gewnschte Programm. Zur besseren Organisation der Daten knnen in Subdirectories weitere Subdirectories untergebracht werden. Dadurch kann es ntig werden, mehrere Subdirectories anzugeben, bis man das Directory hat, in dem das gewnschte File gespeichert ist. Ein Beispiel knnte lauten: B:\HUGOS.DAT\CFILES\CSORTS\CQSORT.S bersetzt wrde das etwa lauten: Lade die Datei CQSORT.S aus dem Subdirectory CSORTS. Dieses Subdirectory CSORTS befindet sich im Subdirectory CFILES, welches seinerseits im Subdirectory HUGOS.DAT zu finden ist. Das alles soll sich zudem noch auf Drive B abspielen. Wrde man den ganzen Ausdruck als Filenamen angeben, so knnte tatschlich das gewnschte File geladen werden (vorausgesetzt das File und alle Subdirectories sind vorhanden). Will man jedoch auf das ber denselben Pfad (verstehen Sie jetzt den Begriff Pfadname?) zugngliche File CQSORT1.S zugreifen, so mte der komplette Pfad neu eingegeben werden. Man kann aber auch das durch den Pfad spezifizierte Subdirectory zum aktuellen Directory machen, indem die Funktion CHDIR mit Angabe des gewnschten Pfads aufruft. Danach kann auf alle Files im ausgewhlten Subdirectory nur ber den Filenamen zugegriffen werden. Der Pfad ist durch die Funktion festgelegt. ---------------------------------------------------------------------- PEA path * Adresse des Pfads MOVE.W #$3B,-(SP) * Funktionsnummer TRAP #1 ADDQ.L #6,SP * wie immer Stack reparieren TST.W D0 * Fehler aufgetreten ? BNE fehler * es scheint so ... path: DC.B 'b:\hugos.dat\cfiles\csorts\cqsort.s',0 ---------------------------------------------------------------------- . D.. DFATTRIB T[ FCLOSE )(FCREATE k FDATIME tx0FDELETE ^FDUP FFORCE 1FGETDTA haFILE HLP (FOPEN FREAD FRENAME Gs0FSEEK JJ FSETDTA f FSFIRST m0i FSNEXT wo0 FWRITE e $43 CHANGE MODE int Fattrib( char *fname, int flag, int attrib ); Mit der Funktion CREATEFCREATE kann man einer Datei ein bestimmtes Attribut zuordnen. Dieses Attribut kann mit der Funktion CHANGE MODE ermittelt und gegebenenfalls gendert werden. Dazu mu der Name oder ggf. der Pfadname der Datei als Parameter an CHMOD bergeben werden. Ein weiteres Parameter-Wort gibt an, ob die Datei-Attribute ermittelt oder gesetzt werden sollen. Auerdem mu ein Wort bergeben werden, in dem die neu zu setzenden Attribute enthalten sind. Beim Ermitteln der Attribute wird dieses Wort zwar nicht bentigt, sollte aber trotzdem bergeben werden. Die mglichen Datei-Attribute haben wir zum Teil bereits bei der Funktion CREATEFCREATE gezeigt, sie sollen trotzdem noch einmal in tabellarischer Form aufgefhrt werden. $00 = normaler Datei-Status, lesen/schreiben mglich $01 = File ist READ-ONLY. $02 = 'verborgenes' File $04 = System-File $08 = File ist Volume-Label, enthlt den Diskettennamen $10 = File ist ein Subdirectory $20 = Datei wurde beschrieben und korrekt geschlossen. Die Attribute $10 und $20 knnen beim Kreieren einer Datei nicht angegeben werden. Das Attribut $20 wird vom Betriebssystem vergeben, whrend fr das Erstellen von Subdirectories vorteilhaft die GEMDOS-Funktion MKDIR..\DIR\DCREATE verwendet wird. Die MKDIR-Funktion erzeugt nicht nur den Directory-Eintrag mit dem entsprechenden Attribut, sondern richtet das Subdirectory physikalisch auf der Diskette ein. Grundstzlich erhlt man nach dem Aufruf in D0 den aktuellen Attributwert zurck, nach dem Setzen des Attributs also auch den neuen Wert, oder aber wie bei allen anderen Funktionsaufrufen eine negative Fehlermeldung. ---------------------------------------------------------------------- 1. Beispiel MOVE.W #1,-(SP) * Datei soll READ-ONLY-Attribut erhalten MOVE.W #1,-(SP) * Kennzeichen Attribut setzen. PEA pathname * den Pfadnamen bentigen wir auch MOVE.W #$43,-(SP) * Funktionsnummer TRAP #1 ADD.L #10,SP TST.W D0 * ist ein Fehler aufgetreten? BMI error * scheint so ... pathname: * Null-Byte am Ende nicht vergessen! dc.b 'killme.not',0 2. Beispiel MOVE.W #0,-(SP) * Dummy-Wert, wird nicht zwingend bentigt MOVE.W #0,-(SP) * Kennzeichen Attribut ermitteln PEA pathname * und den Pfadnamen MOVE.W #43,-(SP) * Funktionsnummer TRAP #1 ADD.L #10,SP TST.W D0 * ist ein Fehler aufgetreten? BMI error * scheint so ... pathname: * Null-Byte am Ende nicht vergessen! dc.b 'was_bin.ich',0 ---------------------------------------------------------------------- $3E CLOSE int Fclose( int handle ); Jede erffnete Datei sollte geschlossen werden, wenn innerhalb des Programms nicht mehr auf die Datei zugegriffen werden mu, oder wenn das Programm selbst beendet wird. Besonders zum Schreiben erffnete Dateien mssen unbedingt vor Programmende geschlossen werden, da es sonst zu einem unbersehbaren Datenverlust kommen kann. Geschlossen werden Dateien mit dem Aufruf CLOSE, dem die Handle- Nummer als Parameter bergeben wird. Als Return-Wert erhlt man den Wert Null, wenn die Datei korrekt geschlossen worden ist. ---------------------------------------------------------------------- MOVE.W handle,-(SP) * hier haben wir die Handle-Nummer abgelegt MOVE.W #$3E,-(SP) * Funktionsnummer TRAP #1 * GEMDOS aufrufen ADDQ.L #4,SP * Stack aufrumen TST.W D0 * Fehler aufgetreten? BMI error * scheint so ... handle: ds.w 1 ---------------------------------------------------------------------- $3C CREATE int Fcreate( char *fname, int attr ); In allen Betriebssystemen luft der Zugriff auf Dateien ber die Sequenz Erffnen der Datei, Zugriff auf die Daten, also Lesen oder Schreiben von Daten und abschlieendem Schlieen der Datei. Diese 'Dreieinigkeit' existiert auch unter GEMDOS, allerdings gibt es eine Ausnahme. Unter CP/M z.B. kann auch eine nicht vorhandene Datei erffnet werden. Mit dem Erffnen wird dann die bisher nicht vorhandene Datei eingerichtet. Unter GEMDOS erhalten Sie in diesem Fall eine Fehlermeldung, da eine Datei grundstzlich erst einmal kreiert, also geschaffen werden mu. Dazu dient der Aufruf $3C, Fcreate(). Diesem GEMDOS-Aufruf werden zwei Parameter bergeben, die Adresse des gewnschten Filenamens und ein Attribut-Wort. Wird als Attribut-Wort Null bergeben, so wird eine ganz normale Datei eingerichtet, die sowohl beschrieben wie auch gelesen werden kann. Wird als Attribut der Wert 1 bergeben, so kann die Datei nach dem Schlieen nur noch gelesen werden. Sie ist softwaremig schreibgeschtzt (was natrlich nicht verhindern kann, da die Datei nach einem Formatieren der Diskette verschwunden ist). Weitere mgliche Attribute sind $02, $04 und $08. Das Attribut $02 erzeugt eine 'versteckte' Datei und das Attribut $04 eine 'versteckte' Systemdatei. Das Attribut $08 schlielich erzeugt ein 'Volume-Label'. Das (optionale) Volume-Label ist der Name, der einer Diskette beim Formatieren gegeben werden kann. Aus den maximal 11 Bytes des Namens und der Extension wird dann der Diskettenname erzeugt. Dateien mit einem der letzten drei Attribute sind von der normalen Directory-Suche im DESKTOP ausgenommen. Sie erscheinen jedoch im Directory z.B. des Programms COMMAND.TOS. Wenn die Funktion CREATE beendet ist, so wird im Register D0 ein File-Descriptor, auch File-Handle genannt, zurckgegeben. ber diese File-Handle (ein numerischer Wert zwischen 6 und 45) gehen alle weiteren Zugriffe auf die Datei. Beim Schreiben, Lesen und Schlieen von Dateien mu die Handle angegeben werden. Insgesamt knnen also maximal $28 = 40 Dateien gleichzeitig geffnet werden. Wenn beim CREATE-Aufruf bereits eine Datei mit diesem Namen existiert, so wird diese auf Null-Lnge abgeschnitten. Das ist gleichbedeutend mit der Sequenz Lschen der alten Datei und Erstellen einer neuen, gleichnamigen Datei, geht aber sehr viel schneller. Erhalten Sie nach dem CREATE-Aufruf eine gltige Handle-Nummer in D0 zurck, so mu die Datei nicht noch zustzlich mit $3D OPEN erffnet werden. ---------------------------------------------------------------------- MOVE.W #$0,-(SP) * Datei soll R/W-Status erhalten PEA filename * Adresse des Filenamens auf den Stack MOVE.W #$3C,-(SP) * Fcreate-Funktionsnummer TRAP #1 * GEMDOS aufrufen ADDQ.L #8,SP * das bliche TST D0 * Fehler aufgetreten? BMI error * scheint so MOVE D0,handle * File-Handle fr sptere Zugriffe merken. ... filename: dc.b 'myfile.dat',0 * Null-Byte nicht vergessen ! handle: ds.w 1 ---------------------------------------------------------------------- $57 GSDTOF void Fdatime( char *timeptr, int handle, int flag ); Wenn im Desktop das Directory nicht als Icons sondern als Text dargestellt wird, so sieht man neben der Dateigre in Bytes auch das Datum der Dateierstellung und die Uhrzeit. Diese beiden letzten Angaben knnen mit der Funktion $57 wahlweise gesetzt oder ermittelt werden. Dazu ist es allerdings erforderlich, da die Datei bereits mit OPENFOPEN oder CREATEFCREATE erffnet wurde. Die bei der Erffnung erhaltene Handle-Nummer mu als Parameter bergeben werden. Weitere Parameter sind ein Wort, das als Flag signalisiert, ob Datum und Zeit gesetzt (Null) oder ermittelt (Eins) werden sollen sowie ein Pointer auf einen 4 Byte groen Buffer, der entweder die Ergebnis-Daten erhlt, oder der vor dem Aufruf mit den bentigten Daten versorgt wird. Dieser Datum-Buffer enthlt in den beiden ersten Bytes die Zeit, das Datum steht in den letzten Bytes. Das Format der Daten ist identisch mit denen der Funktionen zum Setzen/Ermitteln von Datum und Zeit. Ein Wort zur Warnung an dieser Stelle. Programmierer, die diese Funktion sowohl in C als auch in Assembler aufrufen, mssen genau aufpassen. In der Include-Datei OSBIND.H sind die Parameter 'timeptr' und 'handle' vertauscht. Ein C-Aufruf mu bei Benutzung der genannten Include-Datei nach obigem Schema erfolgen. In Assembler-Programmen jedoch mu die untenstehende Reihenfolge der Parameter eingehalten werden. ---------------------------------------------------------------------- Beispiel 1: MOVE.W #1,-(SP) * Datum und Zeit ermitteln PEA buff * 4 Bytes zum Speichern MOVE.W handle,-(SP) * Datei mu geffnet sein MOVE.W #$57,-(SP) * Funktionsnummer TRAP #1 ADD.L #10,SP ... handle: DS.B 2 buff: DS.B 4 Beispiel 2: MOVE.W #0,-(SP) * Datum und Zeit setzen PEA buff * 4 Bytes zum Speichern MOVE.W handle,-(SP) * Datei mu geffnet sein MOVE.W #$57,-(SP) * Funktionsnummer TRAP #1 ADD.L #10,SP ... handle: DS.B 2 buff: DS.B 4 ---------------------------------------------------------------------- $41 UNLINK int Fdelete( char *fname ); Mit UNLINK knnen nicht mehr bentigte Dateien gelscht werden. Dazu mu dem Aufruf die Adresse des Filenamens oder bei Bedarf auch des vollstndigen Pfadnamens bergeben werden. Enthlt das Register D0 nach dem Aufruf eine Null, so ist die Datei gelscht worden. Sonst erhlt man eine Fehlernummer in D0 zurck. ---------------------------------------------------------------------- PEA fname * Name des zu lschenden Files MOVE.W #$41,-(SP) * Funktionsnummer Fdelete() TRAP #1 ADD.L #6,SP TST.L D0 * ist ein Fehler aufgetreten? BMI error * das File gibt's nicht oder schlimmeres ... fname: dc.b 'b:\hugos.dat\cfiles\csorts\cqsort.s',0 ---------------------------------------------------------------------- $45 DUP int Fdup( int handle ); Wie bei den Funktionen READFREAD und WRITEFWRITE erwhnt, stehen dem Programmierer auch die Devices Console, Lineprinter und RS232 wie Dateien zur Verfgung. Dadurch lassen sich Ein- und Ausgaben von Dateien auch auf diese Devices umleiten. Mit der DUP-Funktion kann einer der Standard-Handles eine File-Handlenummer zugewiesen werden. Nach dem Aufruf erhlt man die nchste freie Handlenummer zurck. ---------------------------------------------------------------------- MOVE.W STDH,-(SP) * STDH ist eine Standard-Handle 0 - 5 MOVE.W #$45,-(SP) * DUP ausfhren TRAP #1 ADDQ.L #4,SP TST.L D0 * mglich sind -37, -35 (siehe ERROR..\ERROR) oder 0 BMI DUPERR MOVE D0,NSTDH * Ergebnis ist Non Standard-Handle 6 - 45 ... ---------------------------------------------------------------------- $46 FORCE int Fforce( int stdh, int nonstdh ); Die FORCE-Funktion erlaubt ein noch weitergehende Beeinflussung der Handle-Nummern. Wird in einem Programm die Console-Ein/Ausgabe ausschlielich ber die READFREAD- und WRITEFWRITE-Funktionen mit den Handle- Nummern 0 und 1 vorgenommen, so kann mit diesem Aufruf die Ein- bzw. Ausgabe umgeleitet werden. Bildschirmausgaben werden in eine Datei geschrieben, Eingaben werden nicht von der Tastatur, sondern aus einer zuvor erffneten Datei geholt. ---------------------------------------------------------------------- MOVE.W NSTDH,-(SP) * Parameter ist Non Standard Handle MOVE.W STDH,-(SP) * Standard Handle (0 - 5) MOVE.W #$46,-(SP) * FORCE ausfhren TRAP #1 ADDQ.L #6,SP TST.L D0 * mglich sind -37 (siehe ERROR..\ERROR) oder 0 BNE FORCE_ERR ... ---------------------------------------------------------------------- $2F GET DTA long Fgetdta( void ); Ein Aufruf dieser Funktion ergibt die Adresse des derzeitigen DTA Buffers in D0. Eine genauere Erluterung dieses Buffers finden Sie bei den Funktionen SEARCH FIRSTFSFIRST und SEARCH NEXTFSNEXT. ---------------------------------------------------------------------- MOVE #$2F,-(SP) * Funktionsnummer Fgetdta TRAP #1 * DTA holen ADDQ.L #2,SP * Stack aufrumen MOVE.L D0,DTAPOINTER * und evt. fr spter merken ... ---------------------------------------------------------------------- Ein-/Ausgabefunktionen fr Dateien, Zugriff auf Dateien 26 FsetdtaFSETDTA Diskettenbertragungsadresse ndern. 47 FgetdtaFGETDTA Diskettenbertragungsadresse ermitteln. 60 FcreateFCREATE Datei anlegen. 61 FopenFOPEN Datei ffnen. 62 FcloseFCLOSE Datei schlieen. 63 FreadFREAD Aus Datei lesen. 64 FwriteFWRITE In Datei schreiben. 65 FdeleteFDELETE Datei lschen. 66 FseekFSEEK Zeiger auf bestimmte Position innerhalb einer Datei setzen. 67 FattribFATTRIB Dateiattribute ndern oder ermitteln. 69 FdupFDUP Dateihandle duplizieren. 70 FforceFFORCE Umlenken von Ein-/Ausgaben von Standardkanlen auf belie- bige andere. 78 FsfirstFSFIRST Ersten Eintrag in Verzeichnis suchen. 79 FsnextFSNEXT Nchsten Eintrag in Verzeichnis suchen. 86 FrenameFRENAME Datei umbenennen. 87 FdatimeFDATIME nderungsdatum einer Datei ermitteln oder ndern. $3D OPEN int Fopen( char *fname, int mode ); Mit CREATE kann man nur neue Dateien erstellen oder bestehende auf Null-Lnge krzen. Bestehende Dateien mssen aber auch weiter verarbeitet werden knnen. Dazu mssen solche Dateien mit der OPEN-Funktion erffnet werden. Der erste Parameter der OPEN-Funktion ist das Modus-Wort. Bei einer Null im Modus-Wort kann die erffnete Datei nur gelesen, bei einer 1 nur beschrieben werden. Mit einem Wert von 2 kann die Datei gleichermaen gelesen wie beschrieben werden. Als zweiter Parameter wird in der schon bekannten Weise die Adresse des durch ein Null-Byte abgeschlossenen Dateinamens bergeben. Als Ergebnis der OPEN-Funktion wird in D0 die Handle-Nummer bergeben, wenn die Datei vorhanden und die gewnschte Zugriffsart mglich ist. Sonst erhlt man in D0 eine Fehlernummer..\ERROR. Neben den eigentlichen Dateien knnen auch noch drei sogenannte Devices erffnet werden. Diese Devices oder Gerte sind die Console, also Tastatur und Monitor, die serielle Schnittstelle und der Druckeranschlu. Um ein Device zu erffnen, wird der entsprechende Device-Name als Filename angegeben. Die Device-Namen lauten 'CON:' fr die Console, 'AUX:' fr die serielle Schnittstelle und 'PRN:' fr die Druckerschnittstelle. Nach einem OPEN mit einem der angegebenen Namen erhalten Sie eine Word-negative Handle zurck. $FFFF (-1) wird zurckgegeben fr 'CON:', $FFFE (-2) erhalten Sie bei Angabe von AUX: und $FFFD (-3) ist die Handle fr den Printerport. ---------------------------------------------------------------------- MOVE.W #2,-(SP) * Datei soll gelesen und beschrieben werden PEA filename * Adresse des Filenamens auf den Stack MOVE.W #$3D,-(SP) * Funktionsnummer TRAP #1 * GEMDOS aufrufen ADDQ.L #8,SP * Stack aufrumen TST.L D0 * Fehler aufgetreten? BMI fopnerr * scheint so MOVE D0,fhandle * File-Handle fr sptere Zugriffe merken. ... filename: dc.b 'myfile.dat',0 * Null-Byte nicht vergessen ! fhandle: ds.w 1 ---------------------------------------------------------------------- $3F READ long Fread( int handle, long count, char *buf ); Das ffnen und Schlieen von Dateien ist nur die halbe Miete, es soll ja auch mit Daten gearbeitet werden. So mssen z.B. Briefe, Lohn- und Gehaltslisten, Mewerte und Artikelnummern gespeichert und spter wieder gelesen werden knnen. Das Lesen solcher Daten kann in sehr eleganter Weise mit der Funktion READ geschehen. READ bekommt drei Parameter bermittelt: zuerst die Adresse eines Buffers, in den die Daten gelesen werden sollen, dann die Anzahl der aus der Datei zu lesenden Bytes und zum Schlu die Handle-Nummer der Datei. Diese Nummer haben Sie (hoffentlich) beim zuvor erfolgten OPENFOPEN erhalten. Als Rckgabewert erhalten Sie in D0 entweder eine Fehlernummer (hoffentlich nicht) oder die Anzahl der fehlerfrei gelesenen Bytes. Wird versucht, ber das Dateiende hinaus zu lesen, so ist der Wert in D0, die tatschlich gelesene Anzahl Bytes, von der gewnschten Anzahl unterschiedlich.. Danach erfolgende Lesezugriffe liefern als Rckgabewert eine Null. Dann ist das Ende der Datei erreicht. Eine weitere Mglichkeit wre es, sich vor dem Lesen die Gre der Datei in Bytes mittels SEARCH FIRSTFSFIRST/SEARCH NEXTFSNEXT zu holen und den angegebenen Betrag zu lesen. ---------------------------------------------------------------------- PEA buffer * Adresse des Datenbuffers MOVE.L #256,-(SP) * 256 Bytes lesen MOVE.W handle,-(SP) * Platz fr die Handle-Nummer MOVE.W #$3F,-(SP) * Funktionsnummer TRAP #1 ADD.L #12,SP TST.L D0 * ist ein Fehler aufgetreten? BMI error * scheint so CMP.L #256,D0 * tatschlich 256 Bytes gelesen? BNE end_of_file * waren nicht mehr genug Daten im File ... handle: ds.w 1 * Platz fr Handle-Nummer buffer: ds.b 256 * reicht in unserem Beispiel ---------------------------------------------------------------------- $56 RENAME int Frename( int dummy, char *oldname, char *newname ); Unter GEMDOS reicht zum Umbenennen einer Datei der Aufruf der Funktion RENAME, der zwei Pointer auf File- oder Pfadnamen bergeben werden. Der erste Pointer zeigt auf den neuen Namen, bei Bedarf auch mit Angabe eines Pfadnamens der Datei, der zweite Ponter zeigt auf den bisherigen Namen. Neben den zwei Pointern wird noch ein 2-Byte-Parameter bentigt. Dieser Parameter enthlt zwar keine zustzliche Information, ist jedoch zwingend erforderlich. Als Rckgabewert erhlt man in D0 entweder Null, dann ist der Name korrekt gendert worden, oder man erhlt einen Fehlercode zurck. ---------------------------------------------------------------------- PEA newnam * neuer Dateiname PEA oldnam * umzubenennende Datei MOVE.W #0,-(SP) * Dummy MOVE.W #$56,-(SP) * Funktionsnummer TRAP #1 ADD.L #12,SP TST.L D0 * auf Fehler prfen ... oldnam: DC.B 'oldfile.dat',0 * Nullbyte am Ende nicht vergessen! newnam: DC.B 'newname.dat',0 ---------------------------------------------------------------------- $42 LSEEK long Fseek( long offset, int handle, int seekmode ); Bisher haben wir nur rein sequentielle Datenzugriffe kennengelernt. Wir knnen eine beliebige Datei von Anfang an durchlesen, bis eine gewnschte Information erreicht ist. Mit jedem Lesen wird ein interner Dateipointer mitgefhrt, der jeweils auf das nchste zu lesende Byte zeigt. Diesen Pointer knnen wir durch Lesen aus der Datei kontinuierlich in Richtung Dateiende bewegen. Ein paar Bytes zurck oder vorwrts, also richtig wahlfrei knnen wir den Zeiger so nicht verstellen. Das ist jedoch fr viele Anwendungen erforderlich. LSEEK bietet nun eine auerordentlich komfortable Mglichkeit, den Dateipointer auf jedes beliebige Byte innerhalb der Datei zu stellen und ab dieser Stelle zu lesen oder zu schreiben. Diese UNIX- kompatible Mglichkeit des GEMDOS ist um vieles komfortabler als die z.B. von CP/M bekannten Mglichkeiten zur relativen Dateiverwaltung. Insgesamt werden der LSEEK-Funktion drei Parameter bergeben. Der ertse Parameter gibt die Anzahl der Bytes an, um die der Pointer bewegt werden soll. Ein weiterer Parameter ist die Handle-Nummer der Datei. Der letzte Parameter ist ein Modus-Wort, welches beschreibt, wie der Dateipointer zu bewegen ist. Eine Null als Modus bewegt den Zeiger an den Anfang und von da die angegebene Zahl Bytes zum Ende der Datei. Als Anzahl drfen nur positive Werte gewhlt werden. Bei einem Modus-Wort von 1 wird der Zeiger um den gewnschten positiven oder auch negativen Betrag ab der aktuellen Position bewegt und bei einer 2 gilt die Entfernungsangabe ab dem Ende der Datei. Bei einer 2 als Moduswert sind nur negative Werte zugelassen. Nach dem Aufruf erhlt man in D0 die absolute Position des Zeigers ab Dateianfang oder eine Fehlermeldung. ---------------------------------------------------------------------- MOVE.W #1,-(SP) * relativ vom derzeitigen Filepointer MOVE.W handle,-(SP) * File-Handle MOVE.L #-32,-(SP) * 32 Bytes zurck MOVE.W #$42,-(SP) * Funktionsnummer TRAP #1 ADD.L #10,SP TST.W D0 * ist ein Fehler aufgetreten? BMI error * scheint so ... handle: ds.w 1 * Platz fr die Handle-Nummer ---------------------------------------------------------------------- $1A SET DISK TRANSFER ADRESS void Fsetdta( char *buf ); Die Disk Transfer Adresse ist die Adresse eines 44-Byte-Buffers, der fr verschiedene Diskettenoperationen (besonders Directory- Operationen) bentigt wird. Beispiele fr die Verwendung der DTA finden Sie bei den GEMDOS-Funktionen SEARCH FIRSTFSFIRST und SEARCH NEXTFSNEXT. ---------------------------------------------------------------------- PEA dtabuf,-(SP) * Adresse des 44-Byte DTA-Buffers MOVE.W #$1A,-(SP) * Funktionsnummer SET DTA TRAP #1 * DTA setzen ADDQ.L #6,SP * Stack aufrumen ... dtabuf: ds.b 44 * Platz fr DTA-Buffer ---------------------------------------------------------------------- $4E SFIRST int Fsfirst( char *fnam, int attr ); Mit der SFIRST-Funktion kann berprft werden, ob eine Datei mit dem angegebenen Namen im Directory vorhanden ist. Wird eine gleichnamige Datei gefunden, so erhlt man den Filenamen, das File-Attribut, Datum und Uhrzeit der Dateierstellung und die Gre der Datei in Bytes zurck. Die gelieferte Information wird von GEMDOS im DTA-Buffer abgelegt, dessen Adresse ja mit der SETDTAFSETDTA-Funktion bestimmt werden kann. Besonders angenehm ist die Tatsache, da der Filename nicht vollstndig eingegeben werden mu. Einzelne Zeichen im Filenamen knnen gegen ein Fragezeichen '?' ausgetauscht werden, aber auch ganze Buchstabengruppen knnen durch einen '*' ersetzt werden. In der extremen Form wrde ein Filename auf die Zeichenkette '*.*' reduziert. In diesem Fall wrde die erste Datei im Directory den Anforderungen gengen und der Filename mit den weiteren Informationen im DTA-Buffer erscheinen. Auer dem Filenamen mu dem SFIRST-Aufruf noch ein Such-Attribut mitgegeben werden. Die mglichen Parameter des Attributs entsprechen denen, die bei der CHMODFATTRIB-Funktion einer Datei gegeben werden knnen: $00 = Normaler Zugriff, lesen/schreiben $01 = Normaler Zugriff, schreibgeschtzt $02 = Verborgener Eintrag (wird im ST-Desktop ignoriert) $04 = Verborgener System-Eintrag (wie $02 ignoriert) $08 = Volume Label, Disketten-Name $10 = Subdirectory $20 = Datei wurde beschrieben und geschlossen Beim Suchen nach Dateien gelten die folgenden Regeln: Ist Attribut-Wort Null, so werden nur normale Dateien erkannt. System-Dateien oder Subdirectorys werden nicht erkannt. System-Files, verborgene Dateien und Subdirectorys werden gefunden, wenn die entsprechenden Attribut-Bits gesetzt sind. Volume-Labels werden aber dann weiterhin nicht erkannt. Um das Volume-Label zu erhalten, mu diese Option ausrcklich im Attribut gesetzt werden. Alle anderen Dateien werden dann nicht durchsucht. Nach dem Aufruf erhlt man in D0 den Wert Null, wenn ein entsprechendes File gefunden wurde. In diesem Fall wird der 44 Bytes groe DTA-Buffer wie folgt aufgebaut: Byte 0 - 20 fr GEMDOS reserviert. Byte 21 File Attribut Byte 22 - 23 Uhrzeit der Dateierstellung Byte 24 - 25 Datum der Dateierstellung Byte 26 - 29 Dateigre in Bytes Byte 30 - 43 Name und Extension der gefundenen Datei Wurde jedoch keine dem angegebenen Suchstring entsprechende Datei gefunden, so erhlt man die Fehlermeldung -33, File Not Found. ---------------------------------------------------------------------- PEA dta * DTA-Buffer einrichten MOVE.W #1A,-(SP) * Funktionsnummer SETDTA TRAP #1 ADDQ.L #6,SP MOVE.W #attrib,-(SP) * Attribut-Wert MOVE.L #filnam,-(SP) * Filename, nach dem gesucht wird MOVE.W #$4E,-(SP) * Funktionsnummer Fsfirst TRAP #1 ADDQ.L #8,SP TST D0 * Datei gefunden ? BNE notfound * scheinbar nicht ---------------------------------------------------------------------- $4F SNEXT int Fsnext( void ); Mit der SNEXT-Funktion (Search Next) kann geprft werden, ob sich mglicherweise andere Dateien auf dem Datentrger befinden, die mit dem angegebenen Filenamen bereinstimmen. Dazu mu nur die Funktionsnummer bergeben werden, Parameter werden von SNEXT nicht bentigt. Allerdings sind alle Parameter bereits vom SFIRSTFSFIRST-Aufruf richtig gesetzt. Wird der Suchstring wie im vorigen Beispiel sehr global gehalten, so knnen mit SFIRSTFSFIRST und SNEXT alle Dateien eines Datentrgers nacheinander bestimmt und gegebenenfalls angezeigt werden. Damit hat man in Programmen die Mglichkeit, mit nur wenig Aufwand ein Directory anzuzeigen. ---------------------------------------------------------------------- MOVE.W #$4F,-(SP) * Search next TRAP #1 * ist noch was da ? ADDQ.L #2,SP TST.L D0 * bei negativen Werten nichts mehr ---------------------------------------------------------------------- $40 WRITE long Fwrite( int handle, long count, char *buff ); Genauso einfach wie das Lesen von Dateien ist das Schreiben. Auch die bergebenen Parameter sind mit den beim LesenFREAD bentigten Parametern identisch. Als Handle mssen von OPENFOPEN- bzw. CREATEFCREATE-Aufrufen gelieferte Handle-Nummern benutzt werden. ---------------------------------------------------------------------- PEA buffer * Adresse des Datenbuffers MOVE.L #256,-(SP) * jetzt schreiben wir einmal 256 Bytes MOVE.W handle,-(SP) * Platz fr die Handle-Nummer MOVE.W #$40,-(SP) * jetzt ist WRITE gefragt TRAP #1 ADD.L #12,SP TST.L D0 * ist ein Fehler aufgetreten? BMI error * ja, das ist rgerlich ... handle: ds.w 1 * Platz fr die Handle-Nummer buffer: ds.b 256 * reicht in unserem Beispiel ---------------------------------------------------------------------- . D.. DMADDALT R{MALLOC s2 MEM HLP wMFREE u2dMSHRINK {MXALLOC }READ_ME TXT! 20 MADDALT long Maddalt( void *start, long size ); Mit Maddalt kann man Speicher beim GEMDOS anmelden, der durch das BIOS nicht erkannt wird. start beschreibt die Startadresse des Speichers und size seine Lnge. Der Speicher mu aus einem zusammenhngenden Block bestehen. Wurde Speicher einmal mit Maddalt angemeldet, so gehrt er dem GEMDOS und kann diesem nicht mehr weggenommen werden. Reservierungen des Speichers sollten ausschlielich ber MallocMALLOC bzw. MxallocMXALLOC oder Pexec..\PEXEC\PEXEC geschehen. Im Erfolgsfall wird 0 zurckgegeben, ansonsten ein Fehlercode. Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. Mgliche Anwendung: VME-Bus-Karten fr den TT/MEGA STE, deren Speicher fr GEMDOS zugnglich gemacht werden soll (das kann, aber mu nicht eine Speichererweiterungskarte sein: auch fr berflssiges RAM auf einer Grafikkarte kann das sinnvoll sein). Logischerweise darf der Aufruf nur einmal pro Block stattfinden (am besten also im AUTO-Ordner). $48 MALLOC void *Malloc( long anzahl ); Die MALLOC-Funktion und die zwei Aufrufe MFREEMFREE und SETBLOCKMSHRINK befassen sich mit der Speicherorganisation des GEMDOS. Wie bei der Funktion $31, KEEP PROCESS..\PEXEC\PTERMRES erwhnt, wird einem Programm nach dem Laden der gesamte Speicherbereich zugeordnet. Das ist in vielen Fllen unkritisch, da nur ein einziges Programm laufen soll. Es ist aber gerade unter GEM wesentlich, zumindest einen Teil des Speichers nach dem Start des Programms wieder freizugeben, da verschiedene GEM-Funktionen Speicher mit der MALLOC-Funktion anfordern. Ein gutes Beispiel ist der Fileselector, der auch bei korrekter Programmierung nicht erscheint, wenn kein freier Speicher mehr zur Verfgung steht. Andere Anwendungen sind z.B. Programme, die mit Overlays arbeiten. Um ein Overlay von der Diskette laden zu knnen, mu dem GEMDOS freier Speicher zur Verfgung stehen. Aus diesem Grunde sollte jedes Programm immer nur den Platz reservieren, den es tatschlich als Programm- und Datenbereich bentigt. Der nicht bentigte Speicher kann dann an GEMDOS mittels SETBLOCKMSHRINK zurckgegeben werden. Sollte ein Programm jedoch nach der Freigabe des nicht bentigten Speichers doch weiteren Speicher bentigen, so kann es den Speicher vom GEMDOS ber die Funktion MALLOC (Memory Allocate) anfordern. Dazu wird mit der Funktion MALLOC die Anzahl der bentigten Bytes mitgeteilt. Als Return-Wert in D0 erhlt man die Startadresse des durch den Aufruf reservierten Speicherbereichs oder eine Fehlermeldung, wenn versucht wird, mehr Speicher zu reservieren als berhaupt noch frei ist. Wird als Anzahl der zu allocierenden Bytes -1L bergeben, so erhlt man die Gre des grten zusammenhngenden freien Speicherbereiches in Bytes in D0 zurck. ---------------------------------------------------------------------- 1. Beispiel MOVE.L #-1,-(SP) * Anzahl freier Bytes ermitteln MOVE.W #$48,-(SP) * Funktionsnummer TRAP #1 ADDQ.L #6,SP * Anzahl freier Bytes in D0 2. Beispiel MOVE.L #$1000,-(SP) * Hex 1000 Bytes dem Programm zuteilen MOVE.W #$48,-(SP) * Funktionsnummer TRAP #1 ADDQ.L #6,SP TST.L D0 * Fehler oder Adresse des Speichers ? BMI error * negative Long-Werte = Fehler! MOVE.L D0,mstart * sonst Start-Adresse des reservierten ... * Bereichs mstart: DS.L 1 ---------------------------------------------------------------------- Speicherbereichsverwaltung Speicherbereiche reservieren, anpassen und freigeben. 72 MallocMALLOC Speicherbereich reservieren bzw. freien Speicherplatz erfragen. 73 MfreeMFREE Speicherbereich freigeben. 74 MshrinkMSHRINK Reservierten Speicherbereich verkleinern. Ab TOS030 (Atari TT) verfgbar: 20 MaddaltMADDALT Alternativen Speicher anmelden. 68 MxallocMXALLOC Speicherbereich reservieren. $49 MFREE long Mfree( void *addr ); Ein mit MALLOCMALLOC reservierter Speicher kann jederzeit mit MFREE wieder freigegeben werden. Dazu wird dem GEMDOS die Adresse bermittelt, ab der der Speicher freigegeben werden soll. Der Wert wird blicherweise die von MALLOCMALLOC gelieferte Adresse sein. Bei einem Rckgabewert von Null in D0 wurde der Speicher ohne Fehler vom GEMDOS freigegeben, negative Werte signalisieren in der blichen Weise Fehler. ---------------------------------------------------------------------- MOVE.L mstart,-(SP) * Adresse eines zuvor allocierten Bereichs MOVE.W #$49,-(SP) * Funktionsnummer TRAP #1 ADDQ.L #6,SP * Anzahl freier Bytes in D0 TST.L D0 * Fehler ? BNE error * D0 <> 0 ist Fehler! ... mstart: DS.L 1 ---------------------------------------------------------------------- $4A SETBLOCK int Mshrink( int dummy, void *block, long newsize ); Mit der SETBLOCK-Funktion kann im Gegensatz zur MALLOCMALLOC-Funktion ein genau bestimmter Speicherbereich reserviert werden. Der darber liegende Speicher wird an GEMDOS zurckgegeben, auch wenn er zuvor reserviert war. Mit dieser Funktion kann z.B. ein Programm seinen tatschlichen Speicherbedarf reservieren und den verbleibenden Bereich freistellen. Als Parameter werden der Funktion die Anfangsadresse und die Lnge des zu reservierenden Bereichs bergeben. Der mit diesen Parametern spezifizierte Bereich wird dann vom GEMDOS reserviert und erst mit Beenden des Programms oder nach Aufruf der MFREEMFREE-Funktion wieder freigegeben. Der zustzliche Dummy-Parameter mu immer Null sein. blicherweise beginnen Programme mit der folgenden oder einer hnlichen Befehlssequenz. Nach dem Aufruf mu in D0 eine Null stehen, sonst ist ein Fehler aufgetreten. ---------------------------------------------------------------------- MOVE.L A7,A5 * Stackpointer nach A5 retten MOVE.L #USTCK,A7 * Stack fr das Programm einrichten MOVE.L 4(A5),A5 * A5 zeigt jetzt auf den Base-Page-Anfang, * genau $100 Bytes unter dem Programmanfang MOVE.L $C(A5),D0 * $C(A5) enthlt Lnge des Programm-Bereichs ADD.L $14(A5),D0 * $14(A5) enthlt Lnge des * initialisierten Datenbereichs ADD.L $1C(A5),D0 * $1C(A5) enthlt Lnge des * uninitialisierten Datenbereichs ADD.L #$100,D0 * $100 Bytes Base-Page reservieren MOVE.L D0,-(SP) * D0 enthlt die Lnge d. zu reserv. Bereichs MOVE.L A5,-(SP) * A5 enthlt Beginn des zu reserv. Speichers MOVE.W #0,-(SP) * ein Wort ohne Bedeutung, trotzdem ntig! MOVE.W #$4A,-(SP) * Funktionsnummer TRAP #1 ADD.L #12,SP * die bliche Aufrumarbeit auf dem Stack TST.L D0 * Fehler aufgetreten ? BNE error * besser abbrechen, das ging schief ... * hier geht's weiter, wenn alles geklappt hat ---------------------------------------------------------------------- 68 MXALLOC void *Mxalloc( long amount, int mode ); Die GEMDOS-Routine Mxalloc reserviert einen Speicherbereich der Gre amount. Der Parameter mode gibt an, welche Speicherart angefordert werden soll: 0 nur ST-RAM 1 nur Alternatives RAM 2 egal, ST RAM bevorzugt 3 egal, alternatives RAM bevorzugt Mit dem Wert -1 fr amount kann man die Lnge des grten zusammenhngend verfgbaren Speicherblocks erfragen. Die Funktion liefert als Ergebnis die Anfangsadresse des reservierten Bereichs als typenlosen Zeiger. Mxalloc liefert als Ergebnis eine 0, wenn nicht mehr gengend Speicher vorhanden ist. Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. In Modus 0 und 1 wird versucht, einen Block des verlangten Speichertyps zu allozieren. Wenn dazu nicht genug Speicher da ist, geht die Anforderung schief. In Modus 2 und 3 wird erst unter den freien Blcken des angegebenen Typs gesucht, anson- sten aber auf die andere Speicherart ausgewichen. Je nach Einstellung im Programmkopf werden MallocMALLOC-Anforderungen als "Mxalloc(0,...)" (wenn kein Alternate RAM angefordert werden darf) oder "Mxalloc(3,...)" (sonst) ausgefhrt. Auch die Speicherplatzabfrage (mit -1L als "Lnge") erlangt dadurch eine neue Bedeutung: in den Modi 0 und 1 wird der grte Block der entsprechenden RAM-Art zurckgeliefert. Die beiden anderen Modi sind logischerweise in diesem Zusammenhang identisch und liefern den grten Block ungeachtet des Typs zurck.. D.. DPEXEC !p PEXEC HLP n pPTERM   PTERM0 PTERMRES #  READ_ME TXT! $4B EXEC long Pexec( int mode, char *ptr1, char *ptr2, char *ptr3 ); Die Pexec()-Funktion erlaubt das Laden und Nachladen von Programmen. Wahlweise kann das geladene Programm automatisch gestartet werden. Auf dem Stack werden neben der Funktionsnummer die Adressen von drei Strings und ein Moduswort erwartet. Betrachten wir zunchst das Modus-Wort. Dieses Wort darf die Werte 0, 3, 4 oder 5 enthalten. Mode = 0 stellt die sogenannte LOAD'N GO-Option dar. In diesem Fall wird die Datei von Diskette geladen, deren File- und Pathname in PTR1 enthalten ist. PRT2 enthlt bei dieser Option den Command Tail, vergleichbar den Angaben, die Sie einem .TTP-Programm per Dialogbox bergeben knnen. Dabei ist zu beachten, da Command Tail eine Zeichenkette im Pascal-Format ist, d.h. im ersten Byte wird die Lnge der Zeichenkette angegeben, die Daten fr die Zeichen folgen und mssen nicht nullterminiert sein. PTR3 schlielich zeigt auf den sogenannten Environment String, der jedoch unter GEMDOS (wahrscheinlich) keine Bedeutung besitzt. Sollen die Mglichkeiten von Command Tail oder Environment String nicht genutzt werden, so sollten beide Zeiger auf ein Null-Byte zeigen. Nach dem Laden des auf diese Weise angegebenen Programms wird das Programm automatisch gestartet. Das aufrufende Programm, also das, welches den Pexec-Aufruf gestartet hat, bleibt im Speicher. Eventuell geffnete Dateien werden an das neu gestartete Programm (den neu gestarteten Proze) weitergereicht. Dieses neue Programm wird auch als 'Child Process' bezeichnet. Nach der Beendigung des Child Process mittels Pterm0 o.. wird die Kontrolle an das aufrufende Programm, den 'Parent Process' zurckgegeben. Ist das Modus-Wort eine Drei, so werden die Parameter in PTR1 bis PTR3 in derselben Form wie auch beim Mode = 0 behandelt. Allerdings wird das spezifizierte File nur in den Speicher geladen, es wird nicht ausgefhrt. Nach dem Aufruf von Pexec mit Mode = 3 erhlt man die Adresse der Base Page des nachgeladenen Programms in D0 zurck. Das ergibt vielleicht auf den ersten Blick keinen besonderen Sinn. Brauchbar ist diese Funktion jedoch zumindest in einem guten Debugger. Will man mit Hilfe des Debuggers ein fehlerhaftes Programm untersuchen, so darf es ja nicht unmittelbar nach dem Laden ausgefhrt werden, da sonst dem Debugger die Kontrolle entzogen wrde. Das fehlerhafte Programm wrde statt dessen die Kontrolle erhalten und genauso abstrzen wie ohne Debugger. Die LOAD-Option des Pexec schafft hier Abhilfe. Ist das Mode-Wort = 4, so wird ein im Speicher befindliches Programm gestartet, als sei es soeben geladen worden. Dazu wird in PTR1 die Adresse der bentigten Base Page erwartet. PR2 und PTR3 werden nicht genutzt. Auf diese Weise kann ein Programm gestartet werden, welches zuvor mit Pexec, Mode = 3, geladen wurde. Als letzte Mglichkeit gibt es fr das Mode-Wort den Wert Fnf. Mit dieser Option wird eine Base Page im Speicher angelegt. Auerdem wird der grte freie Speicherblock alloziert. Natrlich sind wesentliche Daten der Base Page nach diesem Aufruf nicht ausgefllt. Insbesondere sind das die Angaben ber Text-, Data- und BSS-Bereiche. Diese Angaben mu der Programmierer selbst eintragen. ---------------------------------------------------------------------- PEA env * Environment PEA com * Kommandozeile PEA fil * Filename MOVE.W #0,-(SP) * Laden und Starten bitte MOVE.W #$4B,-(SP) * Funktionsnummer TRAP #1 ADD.L #16,SP * hier kommen wir erst nach Ende ... * des nachgeladenen Programms an ---------------------------------------------------------------------- Programmausfhrung Programme laden und ausfhren oder beenden. 0 Pterm0PTERM0 Programm beenden und 0 an Aufrufer zurckgeben. 49 PtermresPTERMRES Programm beenden, aber im Speicher behalten. 75 PexecPEXEC Weiteres Programm laden und ausfhren. 76 PtermPTERM Programm beenden und frei whlbaren Wert an Aufrufer zurckgeben. $4C TERM void Pterm( int retcode ); TERM $4C stellt neben Pterm0PTERM0(), Funktionsnummer $00, und PtermresPTERMRES(), Nummer $31, eine von drei Methoden dar, ein Programm zu beenden. Pterm() stellt den vom Programm belegten und auch evtl. zustzlich allozierten Speicher automatisch wieder GEMDOS zur Verfgung. Anders aber als Pterm0() kann mit dieser Funktion dem Aufrufer ein von Null unterschiedlicher und selbst definierbarer Rckgabewert bermittelt werden. Damit hat man die Mglichkeit, dem aufrufenden Programm eine wenn auch kurze Nachricht mitzuteilen. Alle in diesem Proze erffneten Dateien werden von PTERM automatisch geschlossen. ---------------------------------------------------------------------- MOVE.W #37,-(SP) * nach Bedarf jeder 2-Byte-Wert MOVE.W #$4C,-(SP) * Programm jetzt TRAP #1 * beenden ... * hier kommen wir nie hin ---------------------------------------------------------------------- $00 TERM void Pterm0( void ); Ein Aufruf des GEMDOS mit der Funktionsnummer 0 beendet das laufende Programm und kehrt in das Programm zurck, von dem es gestartet wurde. Bei Applikationen, also Programmen, die vom Desktop aus gestartet wurden, wird die Programmkontrolle wieder dem Desktop bergeben. Wurde das Programm von einem anderen Programm aus aufgerufen, so wird in das aufrufende Programm zurckgesprungen. Dieser Punkt ist vor allem fr das Nachladen von Programmteilen wichtig. ---------------------------------------------------------------------- CLR.W -(SP) TRAP #1 ---------------------------------------------------------------------- $31 KEEP PROCESS void Ptermres( long keepcnt, int retcode ); Diese Funktion ist vergleichbar mit der GEMDOS-Funktion TERMPTERM0 $00. Auch nach Aufruf dieser Funktion wird das Programm beendet. Allerdings unterscheidet sich $31 Ptermres() in einigen wesentlichen Punkten von $00. Nach Abarbeiten des TRAP #1 wird wie bei TERM die Kontrolle an das Programm zurckgegeben, welches das soeben beendete Programm gestartet hat. Im Unterschied zu TERM jedoch kann dem Aufrufer eine Abschlu-Bedingung mitgeteilt werden. Liefert TERM grundstzlich den Abschluwert Null (kein Fehler), so kann bei $31 ein beliebiger Wert zwischen Null und $FFFF als Abschluwert gewhlt werden. Ein von Null unterschiedlicher Wert signalisiert blicherweise 'Fehler bei der Programmabarbeitung'. Ein weiterer wesentlicher Punkt liegt in der Speicherverwaltung des GEMDOS begrndet. Wird ein Programm gestartet, so wird ihm der gesamte verfgbare Speicherplatz zur Verfgung gestellt. Wird das Programm mit TERM beendet, so wird der Speicherplatz wieder freigegeben und GEMDOS zur Verfgung gestellt. Der gesamte freigegebene wird zudem gelscht, sprich mit Nullen gefllt. Das Programm ist tatschlich physikalisch aus dem Speicher verschwunden. Mit der Funktion $31 jedoch kann ein beliebiger Speicherbereich ab der Start-Adresse des Programms (inclusive Basepage) geschtzt werden. Dieser Speicherbereich wird nach dem Beenden des Programms nicht freigegeben und auch nicht gelscht. Das Programm knnte wieder gestartet werden, ohne es neu zu laden. Wesentliche Anwendungen fr Ptermres() sind z.B. Spooler, RAM-Disk und andere Hilfen, die, einmal installiert, immer im Speicher verfgbar sein mssen, um die Daten in der entsprechenden Weise zu speichern oder zu verarbeiten. Gleichzeitig mssen aber solche Programme nach der Installation korrekt beendet werden, um andere Programme laden und starten zu knnen. KEEP PROCESS wird mit zwei Parametern aufgerufen. Das Beispielprogramm zeigt die Parameterbergabe. Wichtig ist auch, da zustzlich vom Programm per Malloc..\MEM\MALLOC reservierter Speicher nicht freigegeben wird. Sollten jedoch zum Zeitpunkt des Ptermres() Dateien geffnet sein, so werden diese vom GEMDOS geschlossen. ----------------------------------------------------------------------- MOVE.W #0,-(SP) * Fehlercode kein Fehler, sonst 1 MOVE.L #$1000,-(SP) * $1000 Bytes ab Base Page Anfang schtzen MOVE.W #$31,-(SP) * Programm endet ... TRAP #1 * ... jetzt! ... * und wir mssen nicht mal den Stack aufrumen! ----------------------------------------------------------------------- . D.. DSUPER 2d SVERSION ɹ2lSYS HLP AREAD_ME TXT! $20 SUPER long Super( void *stack ); Diese Funktion ist besonders fr die Programmierer interessant, die whrend eines im User-Modus laufenden Programms auf die nur im Supervisor-Modus zugnglichen Peripherie-Bausteine oder die Systemvariablen zugreifen wollen. Nach Aufruf dieser Funktion aus dem User-Modus heraus befindet sich der MC68000 im Supervisor-Mode. Im Gegensatz zur XBIOS-Routine zum Einschalten des Supervisor-Modus knnen nach erfolgtem SUPER-Aufruf weitere GEMDOS-, BIOS- und XBIOS-Aufrufe erfolgen. Wird die Super-Funktion mit einem Wert von -1L ($FFFFFFFF) aufgerufen, dann wird uns mitgeteilt, in welcher Betriebsart sich der Prozessor befindet. Ist das Ergebnis in D0 nach dem Aufruf eine 0, so luft der Prozessor im User-Mode. Ein Wert von $0001 dagegen zeigt an, da der Prozessor im Supervisor-Mode luft. Eine Umschaltung wird mit diesem Parameter jedoch nicht vorgenommen. Darum wollen wir jetzt den Fall betrachten, da sich ein Programm im User-Mode befindet und die SUPER-Funktion mit einem Wert von Null auf dem Stack aufruft. In diesem Fall wird durch den Aufruf der Supervisor-Mode eingeschaltet. Der Supervisor-Stackpointer wird auf den derzeitigen Wert des User-Stacks gebracht und in D0 erhlt man den ursprnglichen Wert des Supervisor-Stacks zurck. Diesen Wert mu man sich im Programm unbedingt merken, um spter wieder in den User-Modus zu gelangen. Unterlt man dies vor dem Beenden des Programms, so stehen die Chancen fr einen Systemabsturz sehr gut. Wird jedoch als Parameter beim erstmaligen Aufruf ein von Null unterschiedlicher Wert der SUPER-Funktion bergeben, so wird dieser Wert als gewnschter neuer Supervisor-Stack interpretiert. Auch in diesem Fall erhalten Sie in D0 den alten Supervisor-Stackpointer zurck, dessen Wert das Programm auf jeden Fall speichern sollte. Wie bereits erwhnt, mu sptestens vor der Beendigung des Programms der User-Mode wieder eingeschaltet werden. Dieser erneute Wechsel der Betriebsart bentigt die beim ersten Aufruf erhaltene Adresse, um den Supervisor-Stack auf seinen ursprnglichen Wert zu setzen. Die Superfunktion unterscheidet sich in einem ganz wesentlichen Punkt von den bisherigen und allen anderen GEMDOS-Funktionen. Dieser Aufruf kann unter Umstnden auch die Inhalte von A1 und D1 verndern. Wenn Sie also wichtige Werte in diesen Registern halten, so mssen Sie die Werte vor einem Aufruf der SUPER-Funktion irgendwo ablegen. ---------------------------------------------------------------------- * der 68000 Befindet sich im User-Modus CLR.L -(SP) * User-Stack soll Supervisor-Stack werden MOVE.W #$20,-(SP) * SUPER aufrufen TRAP #1 * nach dem Trap ist Supervisor-Modus aktiv ADD.L #6,SP * D0 = alter Supervisor-Stack MOVE.L D0,_SAVE_SSP * Wert merken ... ... hier kann im Supervisor-Mode gearbeitet werden ... MOVE.L _SAVE_SSP,-(SP) * alten Supervisor-Stackpointer MOVE.W #$20,-(SP) * SUPER aufrufen TRAP #1 * jetzt sind wir wieder im User-Mode ADD.L #6,SP ---------------------------------------------------------------------- $30 GET VERSION NUMBER int Sversion( void ); Ein Aufruf dieser Funktion bergibt in D0 die Versionsnummer des GEMDOS. Sowohl die auf Diskette als auch die im ROM gelieferten Versionen des ATARI-Betriebssystems geben den Wert $1300 entsprechend Version 0.13 zurck. ---------------------------------------------------------------------- MOVE #$30,-(SP) * Mal sehen, welche Version wir haben TRAP #1 ADDQ.L #2,SP CMP #$1300,D0 * die allseits bekannte Version ? BNE not_tos * das kann's eigentlich nicht geben ... ---------------------------------------------------------------------- Systemfunktionen Die Supervisor-Funktion ist eine der wichtigsten Funktionen fr die direkte Programmierung der Hardware. Nur mit ihrer Hilfe ist es mglich, auf die Systemvariablen zuzugreifen. 32 SuperSUPER Supervisormodus ermitteln oder ndern. 48 SversionSVERSION Versionsnummer von GEM ermitteln. . D.. DTGETDATE Ť2)TGETTIME Z2TIME HLP TSETDATE L2 TSETTIME l2"READ_ME TXT! $2A GET DATE int Tgetdate( void ); Sicher haben Sie bereits einmal mit dem Kontrollfeld experimentiert. Neben verschiedenen anderen Funktionen ist im Kontrollfeld eine Uhr mit Uhrzeit und Datum enthalten. Fr verschiedene Anwendungen kann es recht ntzlich sein, das eingestellte Datum zur Verfgung zu haben. Das Datum lt sich problemlos mit der Funktion GET DATE ermitteln. Dieser Funktionsaufruf bentigt keine Parameter und stellt nach dem Aufruf das Datum im Low-Word des Registers D0 zur Verfgung. Allerdings ist es recht aufwendig kodiert, so da das Ergebnis in D0 noch aufbereitet werden mu, um das richtige Datum zu erhalten. In den unteren 5 Bits wird der Tag im Bereich von 1 bis 31 codiert. Die Bits 5 bis 8 enthalten den Monat im Wertebereich von 1 bis 12, und das Jahr ist in den Bits 9 bis 15 enthalten. Der Wertebereich in diesen 'Jahresbits' geht von 0 bis 119. Der Wert dieser Bits mu zum Wert 1980 addiert werden, um die tatschlich eingestellte Jahreszahl zu bekommen. Das Datum 12.12.1992 z.B. ergbe $198C in D0. Binr lt sich das als %0001100.1100.01100 darstellen. Der Punkt markiert jeweils die Lngen der drei Felder. ---------------------------------------------------------------------- MOVE #$2A,-(SP) * wir wollen uns das Datum holen TRAP #1 ADDQ.L #2,SP MOVE D0,D1 * Ergebnis in D1 zwischenspeichern AND #%11111,D0 * die Tagesbits ausmaskieren MOVE D0,TAG * und abspeichern LSR #5,D1 * die 5 Tagesbits rausschieben MOVE D1,D0 AND #%1111,D0 * und die Monatsbits maskieren MOVE D0,MONAT * die Monatsnummer speichern LSR #4,D1 * und nochmal schieben MOVE D1,JAHR * das Jahr steht jetzt in D1 ... TAG: DS.W 1 MONAT: DS.W 1 JAHR: DS.W 1 ---------------------------------------------------------------------- $2C GET TIME int Tgettime( void ); Die Funktion GET TIME liefert die Zeit der vom GEMDOS mitgefhrten Uhr. hnlich wie beim Datum wird die Uhrzeit, die in D0 nach dem Aufruf zur Verfgung steht, in einzelnen Bits des Registers nach einem bestimmten Muster codiert. In den Bits 0 bis 4 werden die Sekunden dargestellt. Da aber mit 5 Bit nur der Bereich von 0 bis 31 dargestellt werden kann, luft die interne Uhr in 2-Sekunden-Schritten. Um das richtige Sekunden-Ergebnis zu erhalten, mu also der Inhalt dieser untersten 5 Bits mit zwei multipliziert werden. In den Bits 5 bis 10 wird die Anzahl der Minuten festgehalten, whrend die restlichen Bits 11 bis 15 Auskunft darber geben, welche Stunde (im 24-Stunden-Format) dem GEMDOS geschlagen hat. ---------------------------------------------------------------------- MOVE #$2C,-(SP) * Ob wohl schon Mittag ist ? TRAP #1 * dazu holen wir die Uhrzeit vom GEMDOS ADDQ.L #2,SP MOVE D0,D1 * Ergebnis in D1 zwischenspeichern AND #%1111,D0 * die Sekunden in Zweier Schritten MOVE D0,SEK * und abspeichern LSR #4,D1 * die 4 Sekundenbits rausschieben MOVE D1,D0 AND #%111111,D0 * und die Minutenbits maskieren MOVE D0,MIN * die Minuten speichern LSR #6,D1 * und noch mal schieben MOVE D1,STD * die Stunde steht jetzt in D1 ... SEK: DS.W 1 MIN: DS.W 1 STD: DS.W 1 ---------------------------------------------------------------------- Datum und Uhrzeit im GEMDOS Datum und Uhrzeit einstellen oder ermitteln. 42 TgetdateTGETDATE Datum ermitteln 43 TsetdateTSETDATE Datum einstellen. 44 TgettimeTGETTIME Uhrzeit ermitteln. 45 TsettimeTSETTIME Uhrzeit einstellen. $2B SET DATE int Tsetdate( int date ); Auch aus Anwendungsprogrammen knnen Uhrzeit und Datum gestellt werden. Das ist besonders fr solche Programme interessant, die Datum und/oder Uhrzeit verwenden. Ein Beispiel wre die Rechnungsbearbeitung, in der das aktuelle Datum in den Rechnungsausdruck eingefgt wird. Solche Programme knnen dann selbstttig den Benutzer zur Eingabe des Datums auffordern. Damit kann vermieden werden, da der Anwender zu Beginn der Arbeit das Setzen von Datum und Uhrzeit im Kontrollfeld vergit und mit dem nach dem Einschalten vorhandenen Wert arbeitet. Das Datum mu der Funktion SET DATE in demselben Format bergeben werden, wie es von GET DATETGETDATE geliefert wird, also Bit 0-4 = Tag, Bit 5-8 = Monat, Bit 9-15 = Jahr - 1980. Wenn Sie in Ihren Programmen von der GEMDOS-Funktion zum Setzen des Datums Gebrauch machen, so sollten Sie anschlieend nur mit der GEMDOS-Funktion Tgetdate das Datum ermitteln, da der Aufruf von Tsetdate NICHT die von der BIOS-Funktion zum Ermitteln von Uhrzeit und Datum gelieferten Werte beeinflut. brigens nimmt es das GEMDOS mit unserer Vorstellung von korrekten Daten nicht so genau. Der 31. April ist ihm ganz recht. Nur wirklich bertriebene Werte wie 32. 15. werden durch einen Fehlercode $FFFFFFFF in D0 angemeckert. Sonst ist D0 normalerweise 0. ---------------------------------------------------------------------- MOVE.W #%101101011001,-(SP) * Datum soll 25.10.1985 sein MOVE.W #$28,-(SP) * Funktionsnummer von SET DATE TRAP #1 * Datum setzen ADDQ.L #4,SP * Stack reparieren ---------------------------------------------------------------------- $2D SET TIME int Tsettime( int time ); Die Funktion SET TIME erwartet auf dem Stack einen 16-Bit-Wert (Wort), in dem die Zeit in derselben Form codiert ist, wie auch GET TIMETGETTIME die Uhrzeit liefert. Wenn GEMDOS die bergebene Zeit mag, so erhlt man in D0 den Wert 0, sonst den Wert $FFFFFFFF zurck. Im brigen verhlt es sich mit der GEMDOS-Zeit wie mit dem Datum. nderungen der Zeit mittels GEMDOS werden dem XBIOS nicht mitgeteilt. Aus diesem Grund sollte man der einmal gewhlten Methode XBIOS oder GEMDOS treu bleiben. Sonst erhlt man leicht unschne Komplikationen. ---------------------------------------------------------------------- MOVE.W #%1000101010111101,-(SP) * Uhrzeit 17:21:58 MOVE.W #$2D,-(SP) * Funktionsnummer von SET TIME TRAP #1 * Datum setzen ADDQ.L #4,SP * Stack reparieren ---------------------------------------------------------------------- Die Fehlerkodes des GEMDOS und ihre Bedeutung Die GEMDOS-Funktionen liefern als Ergebnis einen Wert, der Aufschlu darber gibt, ob whrend der Ausfhrung der Funktion ein Fehler aufgetreten ist. Ein Wert von Null bedeutet kein Fehler, negative Werte haben folgende Bedeutung: -32 ungltige Funktionsnummer -33 Datei nicht gefunden -34 Pfadname nicht gefunden -35 zuviele offene Dateien (keine Handles mehr brig) -36 Zugriff nicht mglich -37 ungltige Handle-Nummer -39 nicht gengend Speicher -40 ungltige Speicherblockadresse -46 ungltige Laufwerkbezeichnung -49 keine weiteren Dateien Zustzlich zu diesen Fehlermeldungen knnen noch BIOS-Fehler..\BIOS\ERRORmeldungen auftreten, die Nummern von -1 bis -31 haben. GEMDOS Das GEMDOS ist, abgesehen von den hardware-abhngigen BIOS..\BIOS\BIOS.HLP und XBIOS..\XBIOS\XBIOS.HLP, das eigentliche Betriebssystem..\TOS des Atari. Seine Funktionen werden ber den 680X0-Trap #1 aufgerufen. Die Betriebssystemfunktionen lassen sich sehr leicht aufgrund des ersten Buchstabens des Funktionsnamen in die Kategorien Zeichenweise Ein-/AusgabeCINCOUT\CINCOUT.HLP (C...), ProgrammausfhrungPEXEC\PEXEC.HLP (P...), DateifunktionenFILE\FILE.HLP (F...), VerzeichnisfunktionenDIR\DIR.HLP (D...), SpeicherbereichsverwaltungMEM\MEM.HLP (M...), Datum und UhrzeitTIME\TIME.HLP (T...), und SystemfunktionenSYS\SYS.HLP (S...) einteilen. Wenn man einmal die unter GEMDOS vorhandenen Funktionen betrachtet, so wird man eventuell feststellen, da das Ganze gar nicht einmal so neu ist. Alle Funktionen des GEMDOS sind Funktionen des Betriebssystems MS-DOS sehr hnlich. Auch und gerade die verwende- ten Funktionsnummern entsprechen denen des MS-DOS. Allerdings sind nicht alle MS-DOS-Funktionen im GEMDOS implementiert. Besonders im Bereich der Dateiverwaltung wurden im GEMDOS nur die UNIX-kompati- blen Funktionen eingebaut. Die 'alten' blockorientierten Zugriffs- mglichkeiten, die im MS-DOS wohl aus Kompatibilittsgrnden zu CP/M vorhanden waren, fehlen unter GEMDOS. Aber auch spezielle, in der Hardware der MS-DOS-Rechner (Intel-80x86 Prozessoren) begrn- dete Funktionen fehlen hier natrlich. Ein weiterer wesentlicher Unterschied zu MS-DOS ist die Tatsache, da bei GEMDOS-Aufrufen wie auch bei BIOS und XBIOS die Funktions- nummer, also die Nummer der gewnschten GEMDOS-Routine und eventu- elle Parameter auf dem Stack und nicht in Registern bergeben wer- den. Fr diese Art der Parameterbergabe bietet sich der 68000 ge- radezu an. Nach dem Aufbau der Parameterliste wird mittels Trap #1 das GEMDOS aufgerufen und die Funktion ausgefhrt. Nach dem Aufruf mu der Programmierer den Stack selber wieder in Ordnung bringen, also den durch die Parameter belegten Speicher rumen. Der grundstzliche Aufruf der GEMDOS-Funktionen unterscheidet sich von den Aufrufen des BIOS und XBIOS also nur durch die Trapnummer. Zu allen GEMDOS-Aufrufen mu beachtet werden, da die Register D0 und A0 in allen Fllen verndert sind. Im Register D0 wird ein eventueller Rckgabewert oder eine Fehlernummer bergeben, A0 zeigt nach dem Aufruf (meistens) auf die Stack-Adresse, in der die Funktionsnummer steht. Eventuell noch bentigte Registerwerte in D0 oder A0 mssen Sie also vor einem Aufruf des GEMDOS in Deckung bringen. . D'.. LINEA HLP KC(READ_ME TXT!Line-A-Funktionen Diese Grafik-Routinen werden in sehr eleganter Weise aufgerufen. Die Software-Entwickler haben sich die Tatsache zunutze gemacht, da es im 68000 zwei Gruppen von Opcodes gibt, die vom 68000 nicht 'verstanden' werden und einen Trap, also einen Software- Interrupt auslsen, wenn sie in einem Programm auftreten. Es sind dies die beiden Gruppen von Opcodes, die mit $Axxx und $Fxxx beginnen. Im ATARI ST wird der Trap der $Axxx-Opcodes genutzt, um die Grafik-Routinen anzusprechen. Dazu berprft der Trap- Handler, also das durch den Trap aufgerufene Programm, welchen Wert das unterste Byte des 'Befehls' hat. Hier sind Werte zwi- schen Null und $F zugelassen. Damit ergeben sich insgesamt 16 Grafikroutinen: $A000 Adressen der bentigten Variablenbereiche ermitteln $A001 Punkt auf dem Bildschirm setzen $A002 Farbe eines Bildschirmpunktes ermitteln $A003 Linie auf dem Bildschirm ziehen $A004 horizontale Linie ziehen (sehr schnell!) $A005 Rechteck mit Farbe fllen $A006 Vieleck Zeile nach Zeile fllen $A007 Bit Block Transfer $A008 Text Block Transfer $A009 Maus-Cursor einschalten $A00A Maus-Cursor ausschalten $A00B Maus-Cursor-Form ndern $A00C Sprite lschen $A00D Sprite einschalten $A00E Raster Form kopieren $A00F Contour Fill (Flood Fill) Diese Routinen stellen quasi das Grundgerst, den hardware- abhngigen Teil des GEM..\GEM dar. Alle Grafik- und Textausgaben des GEM..\GEM werden ber die Routinen der $Axxx-Opcodes ausgefhrt. Besonders fr Spiele lassen sich die Line-A-Opcodes vorteil- haft einsetzen. Hier werden Windows ja nur in den seltensten Fllen bentigt. Ein weiterer wesentlicher Punkt ist die Ge- schwindigkeit der Line-A-Befehle. Die direkte Nutzung der Grafikroutinen ist deutlich schneller, als wenn die Ausgaben ber das GEM..\GEM vorgenommen wrden. Hinweis: Die Line-A-Funktionen werden nur in den ST-Standard- Auflsungen voll untersttzt. . D*.. 1STINDEX |+\AAFALL IMG e-4wAUGEN_2 IFF v^FKCOLORS GEM &R`COLORS IMG &S DUMP $}VP GEMDEFS C YrGEMDEFS H [GEMDEFS S r]<IMAGE ^META \fS REBUILD miqRESOURCE mSOUND sTEXT cwTIGER GEM D|^TIGER IMG Z}TOOLS GEM JTOS DFN ŜVTOS RSC ŜV VERSION WELCOME SAM PBREAD_ME TXT!9. 1st Index ----------------- 1STINDEX.TTP ist ein kleines, aber feines Hilfsprogramm zur automatischen Generierung von Indexdateien aus umfangreichen Informationssystemen (z.B. dem beiliegenden). Der Aufruf ist wie folgt: 1stindex [Pfadname] [>output] Wird 1stIndex ohne Parameter aufgerufen, so erhlt man diesen Hinweis. Als Pfadname ist dabei die Wurzeldatei eines Informationssystems anzugeben, d.h. eine Datei, die zu allen weiteren Dateien des Systems (auch indirekt) verzweigt. Bei dem hier vorliegenden Infosystem wre das etwa die Datei 1STGUIDE.HLP (mglich wren auch GEM oder TOS). Wird nichts weiter angegeben, so wird die Index-Liste auf den Bildschirm (Standardausgabe) ausgegeben. Die Erstellung dieser Indexliste ist nicht ganz trivial, da zirkulre Bezge auftreten knnen, die entsprechend erkannt werden mssen. Wollen Sie nun eine Indexdatei erstellen, so brauchen Sie nur die Standardausgabe in eine entsprechende Datei umzuleiten durch Angabe des ">" gefolgt vom entsprechenden Dateinamen (z.B. unter GEMINI/MUPFEL). Da 1stIndex mit PCXSTART gelinkt wurde, funktioniert dies sogar im normalen Desktop (abgesehen von der doch sehr beschrnkten Kommandozeile im Dialog). Zur Verwendung in 1st Guide mu die Indexdatei in demselben Verzeichnis liegen wie die angegebene Wurzeldatei. Mchte man Schlsselwrter ber die AC_HELP-Message von 1st Guide suchen lassen, so mu der Pfad dieser Indexdatei in 1st Guide konfiguriert werden (siehe Kapitel 7). ;tt@XIMGVV8V8(!3G!Cá!񡄀 @ ?à;o ?@݃ܠ ࠁ&@s_=?|_@ 0W@?0a `</9ِe0?p?Ո~\*@?{??@ ?@Ո >ݐ_?눆_눀@d 玀+ǃ>@玀烀ꈀ $F=_߄W OW߄ ,( o ͧ׃? ߿x`0w <J0UWp?y ˯񪃀_˯{0~d?tR˙ÜM`߻Wx ?܀߻"."ÿ=ڀQ߄/7ۃ.@ <7=ȃ@ E(@Io}a@ǂ߹.W ?@K2dž #5  wh+넀 ߀gpDW?n?샂*??N)e|i F`D[~ q_)W 3?  ^ W[1~'h 99< {>2'Oy?k_ =DD_f?x~>n_킿k>Äダ' *V_OHd"P0@{ځxo@ /8߁ROU /UH p@oځ|!W;1x@@zx@?'(HdHW3T"24qП0t?'_O?4͈||'TDJfD/24͘TN@0pP0?$( aҫf@T!6HOx`{?U6I m'U"61Ix}1/68`'h04zNU (A4+5'pct̛+% 'cGTDCfD\+%.TF!? $X}$LJ{Lyf*vTZDkF a:syUѤo>"߃遀u"դo>"@^߄ @AFH'"NZ~3b]G*$/9 yP '{Y: ޽_Șa3 '#x ~g?_  @9LPoK( ڌ779)gy ^9@_$@'I;?K_6&t _߿~fipWDC)}Gb bb@ق'/za\'(5@Y+ϝW@ Pԓ=@D 95߅p>'̀ _7}ߞȷ"UQyoB{ @g?' V%I{(P yx*B+Rx P)G\UnVa4A=w DAPwV /ff oC(Lw4I,1'脀(&UF{ĎjnWP8!c/hc@yh &(-Ygwa$ND_sـ Pwߜ8 w1;57A8X *%!PD UXcsp+w60(_6fo'34cc#Dowo~ P]a=w?8* Ff  Ou(fU'_j@CL$⺼k1cs?Uhuۂ: P_iw߸`~x{q| _  _X{(D1~{J["q60HOT3'_ܛʶnAe=$?WOL>_ߐzTP@TDD`>B [H?% .0DQ(~̦ >{vA!/sפ EsxDo?gߘ%"A3_(@ĨFOw M2& ubDS!6kw-߃@w3׀huĀ32@ w??D@TFDۑ`~ !@(E߃Fɗ~&1اA=N >m~ {/}?ׄ53װ?ߏ^Ղv 7_ di;A@((bQߘ xAO@`^Ů7N\޿m%=ǰ/2@*72B@1P 80 ]{ (ϳq.06/{ّwtA~7ʯ ~ff%(oa01Pe/J( 6pnv+n@I Wt&6} 'Y<{.p6>;uvrk_ȁ@@~N;Z "? OaH d_@o(L0;>W`@$a %?̮Wt׃N 42WY;~@ __o&fA`)iHQo(`o`7gwC@4`$sEDst&᳿2N Ua @;_yߴ*  #3rp`-΀?A'ds9 ǰW៑¶fd@ gۦ'wSwww>bcWwuB,@  k5݇[Yqb"f$Ȁ1d- fY' vf#&`foo߸4G@Lu{j(3ٽ߿8ߋ$ ]vۜ? K5yXsjD#7r awA14P?(b?9<<[.7@%(3 'g,$  5!>wG0f0Diuxu( FvȀ˿A1Ć>߀(0v!&offTP.5&@}j1owL@!T%|U} mDyToP@ ߷wr@ A1@1'Gx=}0/޻(w?`@!Y ^}W:~Ā0 D@lINqYݐ^) Q41p( \@C$nf7}.Du(|1?7o. !3W\ ~oJ1  ߄BP44V4}(A3@؉ǝ~#OU,܀ ?XVC!;&+  !wy_ދ < TT~g=P ! ~^!T:￀( “z aT3mE @*]{(Q+p;NH J]k PSp S 74@0" F |T!A'(8@tܪ15Rwa7(T;M ҥ~ %E7}烈$@Q A^Fπ(jB2:"0wB0 @0$A^َ(`n?E@(5O^_s sp D@3_uNU& B@ @ %@`( 4jC ت_ @@P*2@fxa&믻y?E@(?~үoah aE~ulU  @Bm(@lG %_諭$ )LPP4 籂&mίUߪ?EIP(n~6_; w4D@~uu~b"b?$@@B){~(X"""=*$/`s} Al(_wg3(Ĉ j]g؀ ^AEhM,,k@b>|(`Vꪊ+Aas@* hˁ'c֢_@ unJH v@ @@XuJ-@ ^ s9``"ݔ<(aϿH"&WV*kAAaX}$ w'#wg5U:V*kY(fc; DKA*<_8AMUk{"`"AQ׺߀( pE3ZACP @ꯏ :'pձ7YQvگUވP0 <PT"**p /( ΰ$O aCB TPp bZ'￳3UGոu JyAb_ogj *@+w EB  p0@~(e? D !CB m #@(}Qfzoy@fοWu_[? A*w@@ ڿm4x00Ȣo?({0w(;TP, fL%'(qu_T @)@lnw lDa"K?@Uߣ24800W?؀(>( OuD`D̦"' b9(Q~fGwu @ M@D[TU & K{]( w%8J(r w8| e4,Ҋ$(iunI~@Q @]Dw~ RB  dF{_= TUR"̓v} ':%5Woހ(;'@*w@t!B$$z6(U~MEwA@Q΁@ހAeLTLM" Fx@ׅo߃  6% c?(aUL? Ba݃{* o(w7th`H*0tqT H\J}> Pu BM$&!_Ԁ% ɫ#𪪰(w;/ 5(n[wl` [y)?NJ TdD& O}p}P υ߄ RHf p ʀ(Su=x??ߩ C+;J$I  x(׭w?v05܀` X_ T@TM _}_A!F Xm mu}(R:3,~bO30 f0C(_C6uD- #ˠdd@Ώ @U @K׾꿿"U(}w A X"(ɢp^* JN1cH4(\=v9p! aHrc; U@ @P0Dswn8E]{A ]aE]x;(WJ2"oYuJ ODL](j{wu,n+ .0ڀ;s$'5@, ETm=Tj ;^wAW"( &huۮRXbItXpt@p>(odFu"),hpۀ-@pTgP- JMDDـ`@TD-߽s=PO  EA{(5JF* lLVpt/࠯!T({{9h%u *F( H1[+{oUP B31Pu-OyTZ {Pgk`%&*%(b!/+!H ('＀(Up*AfPo ]f/\(cw@V7vxR;T2#"3c0s /܏_T 2TXcWIF!h z(3*>EJڀ1"f@±F 8WH+8(Yzn†vh?os _X@L"뼋{ "&@ {ߵuH@c @wOڀ(,at I㽛Ha"1Ez u 0(uW@ v~d߻C"ocu2$ sd {}Uf<@B&$ȁ @* '9"zw&LC6(Uْ*lI NێG$/r<Ów1@D"ۛ<"&l _ꣿ'H@J@__w(oB>yw-XIA_ t(_zE!rW ㇏נ(B#[W f(^e @D@@o }(9UzqQ{9HBd^($H'W""38xbmk]U fBI;H ㇏W### A"BI{Hdـ ]k(0@@']DOw( yϫ)UyB]DU$?QO(nv?y߫9G&?BH{̴O4~f$" BH{ܴ{ ۀڿn_\ـIZy('͈#z*P3{/mf>_7w”z%(7/PG$o.(/w* X12qoo7os 7?۠@ IAF(CV5*dW'=o\Y19az(}?; '`0.´o4""0n7Q _3נHτ} _(gr%j@#L!W,d[?{*>D(s9د@!'@@<yFက#EީOwN( 7ְ*@$?A( _VTAߠ$C@_!5$`n9؀_@8ۃLDTY"_O_VDl~  Ϳs0@B@ '( Lp) &B#ԑXDE~6NCގH({BMXop.3dP@ ODU _3DA@ThD(.P@_ AR@+Rc_Bb1Wxγ VT X'8&MP"0" D>?dQ D(@&o"3(T+'1Ji fs0~@(poTꋚ'&kX'>S@#e|Ax  .f^o_UX@e~o j O("J#a)s VuwB>}7!8cGԀ%b!a;RHF̟|k6؀(*@@ @WJDj4@@(ߵ`@$Pdn\RD#kπ(Dl;{{tǑ9<ar2&_{TOЉ^x }8 W |TgqA/Ћx_߿`  }P (X|s,yWh b ^^}ŀ(3(PɥpE*>N "7S^s|&R2WiT!?wl&ȫOv{]fa(f06ZK@ 0(Rw(L >O⏆V'> L(H Z &_J0 {m@/G+cw [@0@A/ܧoR35(]G8Apy_@@!-{(3 K*V=G:n`:#3uLC[&{)=v-@˩ w(@ &}}D({܉ &_ @$@e_("&?a-AU\Pc?$};"[B%DˠLO \  DhV "@( "H~ 9vp(3dxL骺gI1i"oqLbcu`o(Uv_{*:uvA {π(m"q{+5~QG\Laʫ}$=/:wk<DA#?^_(DJ01@ʀE*Fk[&T0w@Xdj_^(|j4ϓ2( `ʃ@h#:E0b#}$g{N뤺H>!D /;;(C0@ 㠺I>EΔ H@(K0 g{"PdK()y߻3=|l@H܇FP!( ί7x(}>wkz2& {(TdCB @D@ s2j41'bA D@3C?;빀(,`|U7'̕ *EF_$?]B7+(}oο_~WR@f{_{(Q" RZo@T;HȀ'f}NLDJ@{_{()\l11UwEBx†VPLͮ(y^}Wwǽڿ'0_ PD'X  HZ9{wUN!2 |11:0@H_(*l~| jCj EB`—@;pH3({s}W5z&QP RoWW[vDQ H"q_H`A@@ݷ]s&* |P }TS9}@kDH$ξDQ\삀!{]U_S3'2{߀&Qdg~7oKw1Aw1.Eo~H E `?{݀(u@^%(Rbo] 1I@pw7?(}zsF'2"_ PHUUF[ ^?oL ?@UWă[ ͈`?(GTSUWQBa(= DR}݀UWy%"`f݃߾(QD@j@{/}C  H꫿{e 9݃߿(UTL* T+נ$d (>f7sw(uo}0 &`f?`5UH (O;k}DgȌ@$R5~U|4 9?(+Q1aQAwUU( Eb,D]'w^kUopQ*E[݀(U f =O| o{?S"&D`"2$w~;8.P?j߀(QULo_ةU}A'R4#wf *!Ws(׵}DB A*O*W(BbGUp ܈N@U$s,o߽w(*#qQ3jUT070(,ׁwN냀UUE!!F A85(T*Nu@)?k"&@@6: n?؉T.P櫿(Q\uI@ " w5u(]@?}(r"!U_ ֿH4 +w߃Jb}(*3TUsC=PT ?-T@Ik@yț݁'w?gT! D* (]"DfJ $?noܠNA 0>z TDȊU Muw"bvb&v(wu3!!-W(r#3#UX-W`ǟu$UWχw"iTE w(*1Uw1P"7uLo=a 2-eܪuowT. $ݿ߀(D*F¯F"O@ ǃp Aa w߀(ED*N5 &fcfwW~2p bဘEy~j*3"UnUva9 Kh~~UჀAD`6[(]3$"J_!7(H8*7oMlٺ Q@U",σՀ(WD""(@zwvo3&@@#{@@@B$Ӏ(UDDvS:;* ZϠ¼0:^&k#vn~Uگ} G{]} UUuX @D>ڟo p\U0r\P'Y}(YP+eBTH4 $Dՙߪ{W_v&;&?>̀%TD E ;2<T2o f@%WY@Xɀ(UUF&n:xC FhP5H @##pqn뮀./X Ǯ9w(U~,EU:!P߿__PEү `(h_ws(Ȋ*D J.aÑ@@OT]}. /%Tn7p@U[ .Ǣ@Ӄ(/׊(UFg:PKY(K#7ug݃~/$  B$8j3? r$QTy~߀W?WH҃ C*(2dȈj*k!9Q0*L=WW H {>߾Fjaś3r8u@Ԡ}~}>€]c@ k߾'EF{Y**EU,B̀T#p+`qv@H]wwz(U_bDT`B2{P 烀@ _w{(E&uH tXrg!.Mu~ꂀ&~qCx"د(DnF1Q2@ J@p08?@p@@H`$Z'DVzc3"DyU r`ޡH+$hW#N_034eK%US&"\@*  _;T  f$  Ӄ란(D'u\ڿ hug@p@';!y0$d/~mNn%DjNA؊2%@ '@!yFv?XOU`XOo~(UTS3".8EC՛(M+ny?߳,X0O@=s?(UC6(,] + 8O7@@@냀?(=E'UT :Q@B8l]`>шn`Yp# .&D*ªت"$ @fYWz:Հ80zukQ5[(uT̪UU;'Fg}@&JHS9@/6gGT#^]]߀(P#US6DX"+Jd^_P4l R%(9E{3UU]E"9\H"Ear TJ<'cOkT"ƺ̪&&I H_kW{_=g$pGV큣@1wK_(T̯U'}Tf`"Fdf`@E27sxp(tTH3T3*؂P6op'(Ȅ~ɀDA /_(S3N35U\QҰ?@ N *5@(f5.9 GĽ^+~U2̱ ʪf"f4 /?İP7pf罁C@R~(TU7wTvAC @p;GW C!,o{(TL2d#"Ȉ~ǽnP 8 !08߾(A2nc3gUUљ ^0HHp"*tg'<~넀 ; K{f(U3͙̘"".fwϷ_pAÀ lA0p[(IU]wwDf @390Ajc%L@ I  (ULf#&߿$D_T0j @p 9 (dC;gUU]ݑH[ Sa:Ƃ>}{߂(UsĘ"nguo}jvP"0 @ C8_ USfD"`DJ 0 g Lƨ=o׃(Un3$ݟsyOE3 @@T}%3gUU\ّ7$x@Qp` ̆v2C@/(_{?̙&n~t/0q 1kk@&eLW&DLgqDP(8gqむ _\t'ue぀fꪬٻ^__o@b P_(%$EUTv0hP?*:8q7qZW k|B:VDV8!~ z߄$p~J @pppqh@@K O(8{``A@!;B8 *E rB'ap o{l ~U*\   pp!??߃7(I!6!CB@ ǀ(g9 01~}uE?(xg9?|zY@> w  |"IfU;?(9g>[0(r%`(q@< ~ B; (]rwO }ß@?o߃w WUt #` & ?(1z1 x8@ -p\;< s<(0la3 ??@a?A~_'xC܀>??/z!(C܀D 0 ???(ON?<

 :|"  2|+(@gx=|>Mv.vŷ?X'8D<'xLJ?]v'G:|? ?@ ?烀8`P0`> _yȀCő@T(Ag, V">~G@('9??zi}@)T0Yp0 O{T'8 p0 1 r- ܕI@ +0(pd` `3ώ0  _ǫ0B(0> _ǫ0B  @ "PO tXG( @] xH@9@oHrwP7<T(  a''sPxA80΃(?A9sQO9΃ apǐ CG fP(aa aD =LkT@)(p@;`GxY|qMk P70(p??xyM}ם7'n`A   (ka O ( QCȫ*`i@ދRB8 W aj"?pj'=~ QbF|w`om]v<lPIRq@ޅ( d@] "#0Px0paAƒ%#G^UPmo]v<#0SϾwoM߀(@G ݁ fM]`<- 4X'>>=πsآMC2RZ$zRJ( 0`(#a|@paL&? {آ`(G/o}oM(D0>Y#a= _ bH +`(`pw ]`,#B!]I$(C0<`[ۺSK4` ABv???$SK=xŽ_Kax@D *(P)( &>7[K  @Ђi’B(@@0` |K]`<@p# (~wg[ |K]`<9לw#πA 1[D+" DA 0=x`(30 *JNLi(@x$f <`@  ("pD胀%|*f <@9B@+~F ;([B9jD(qi9XɉL]Rt(?f$y @UO,hN`烀$?~~$yg'G_O?nsw (Xn?  !('1Ǐ;8o{Q3&t1H ;E,(>?|['<$988f(8?|ox[<9w(`ǀo{ &`IR ]@( xqq$)y 2g22flm '"4(7y ` 88@x(?y_y8x(q0o{$5³faH@BE"(180@< &_IN@(@ x? M?8 "(@΀ ?9I1830?  FORMxILBMBMHDvttvCMAPBODYA@@$@ > Nq ~lo__o/3}  t7P s@P$l@{Pް;ݨxe_PN{HDmy/9 ި (BwԀ%KO   R *; ( PG @( @PVo- @J@T  _n6@a~ug%$@F_ߨN>@@WW_H J;}譀? IEO@UNx@^_hAe~@@D @_ '{@|B"8h|@WOxB@0O{EE }1w@C VW$lE!] hC@_ T SzB  ^Khx` =/|@?n@d?`E6 F ?.` DTW_P QH6>P4(h@EhO}(*Wh aE+YNJ(WB+P_W" Q4}/w i`J+(+ pK| 3'J04֯pU@@(/ +:3QI^[&>M[@ {Y!? ހ/@ BZ$ e؀ )rF2  J*A Ux )`Pߴ!m*@- O*&,m_Ip]T@Jݐ/R 0g$`˧@?[_@`??&`?/$7 T' )%? _[)P: VO@@vR5oWl ?O_? _ ɋ 79_ ?X\~?&_(\[ޣZ/7/_P EX K {݃}t@GX]n?W jj _d<l-P>Dj"wԀE_x7/6P`X2J_Gol_ {?@WZ /7?߀?/_  ' V@_O ?@ ¿/@OW%p? ހ?7`?k` @_ ~ z@@ ___]W @ _@ @/ /ohO  ?  ?_J@_?h/p+v`|  ;}8+ lN P4 %@ ? e@/ W x [ڠ3@_mv@8O>@ PO @< o$߀`/Uzp@ /TJHD׀XPW (/@?A/H=A@'?7? ?ր[/p?_/_ $t B{ @ DD߯  ޲P JP# W߳? PP (iQo_]o_P Z. 0@EP & `X'@ @ @%V@ Հ ƿR[ aV OA@8O@u Pִ>wo\z~_ϠH  <=U=@( p=J]_@ , 8Cp =G\ ,(  0 P$ eCOLORS.IMG;XIMGYYY/G>@Ò88ȀG>@Ò88ȀG>@Ò88ȀG>@Ò88ȀBA$H$$ BA$H$$ BA$H$$ BA$H$$ A$$ 8㊀A$$ 8㊀A$$ 8㊀A$$ 8㊀BAH$ $ BAH$ $ BAH$ $ BAH$ $ Gy#/8"ȀGy#/8"ȀGy#/8"ȀGy#/8"Ȁ /8O"L9_08O"L9_08O"L9_08O"L9_0$H L "ADH$H L "ADH$H L "ADH$H L "ADH8N RJ8 *RIDH8N RJ8 *RIDH8N RJ8 *RIDH8N RJ8 *RIDH$H #ɀ 6^Ix$H #ɀ 6^Ix$H #ɀ 6^Ix$H #ɀ 6^Ix8"H<"R9DH8"H<"R9DH8"H<"R9DH8"H<"R9DH /y8s"q8s<y8s"q8s<y8s"q8s<y8s"q8s<A$H"I$H A$H"I$H A$H"I$H A$H"I$H p$qĀ$8p$qĀ$8p$qĀ$8p$qĀ$8@@$HI$H @@$HI$H @@$HI$H @@$HI$H x@8r/E8r/<x@8r/E8r/<x@8r/E8r/<x@8r/E8r/< /IȘE18<IȘE18<IȘE18<IȘE18<$IEI$H ȉ$IEI$H ȉ$IEI$H ȉ$IEI$H ȉ'I$)IP$I8'I$)IP$I8'I$)IP$I8'I$)IP$I8$I<I$ $I<I$ $I<I$ $I<I$ y$18G<y$18G<y$18G<y$18G<3.6 Der Dump-Modus ---------------------- Hlt man whrend der Anwahl der Datei(en) die Control- und Alternate-Taste gedrckt, so ldt 1st Guide die Datei(en) in Form eines Hex-/ASCII-Dumps. Dabei werden ausnahmslos ALLE Zeichen direkt angezeigt, d.h. es wird kein Zeichen interpretiert. Wenn hier gesagt wird ALLE, dann ist das auch so gemeint, d.h. da z.B. auch ASCII-NUL (Code 0) "angezeigt" wird (es gibt Zeichenstze, z.B. CHICFONT von Christoph Bartholme, die NUL NICHT wie blich als Leerzeichen darstellen!). Damit sofort erkennbar ist, da eine Datei im Dump-Modus dargestellt wird, wird in diesem Fall der Pfadname im Fenstertitel in Kleinschrift angezeigt. Fr ein Dump-Fenster kann wie bei jedem anderen Textfenster auch ein beliebiger Zeichensatz eingestellt werden. Anstelle des Speicherns einer OUT-Datei kann man im Dump-Modus eine DMP-Datei sichern. Diese enthlt den Dump in Form einer ASCII-Textdatei, die dann mit einem Texteditor (oder normal mit 1st Guide) geladen sowie ausgedruckt werden kann (beim Drcken von Control-P im Dump-Modus wird nicht der Dump gedruckt, sondern die Originaldatei, da sich das Drucken immer auf den jeweiligen Pfadnamen und nicht auf die Fensterdarstellung bezieht!). Damit es dabei keine Probleme gibt, mu der Steuerzeichenbereich (0 - 31) in der DMP-Datei natrlich ausgeblendet werden. Dies geschieht durch Ersetzen dieser Zeichen durch einen Punkt (dies ist eine gngige Methode). Alle anderen Zeichen (auch ber 127) werden bernommen, da diese in der Regel normal verarbeitet werden knnen. Achten Sie bitte darauf, da eine DMP-Datei knapp 5 mal so gro wird wie die Originaldatei! Da Sie niemand daran hindert, von einer DMP- Datei nach Einlesen im Dump-Modus wieder eine DMP-Datei zu erzeugen, knnen Sie so schnell sehr groe Dateien erzeugen. Auch bei einer Clipboard-Kopie ^C wird der Dump als DMP-Datei im Clipboard abgelegt. In Dump-Fenstern gilt auch die maximale Zeilenzahl von 32767 Zeilen. Da pro Zeile 16 Byte gedumpt werden, knnen also maximal 32767 * 16 0.5 MB groe Dateien komplett gedumpt werden. Trotzdem knnen auch grere Dateien auch bei weniger Speicher gedumpt werden, es wird dann halt nur soviel geladen wie mglich. Wenn Sie Programmdateien dumpen mchten, beachten Sie bitte, da hier die Doppelklickmethode (GEMINI/Desktop) nicht funktioniert, da dann die Programme gestartet wrden. In diesem Fall mu man also die Dateien explizit "ziehen" bzw. per FileSelect auswhlen. #pragma inline struct { int contrl[15]; int global[80]; int intin[128]; int intout[45]; int ptsout[128]; void *addrin[128]; void *addrout[6]; int ptsin[128]; } _GemParBlk; #define contrl _GemParBlk.contrl #define global _GemParBlk.global #define intin _GemParBlk.intin #define ptsin _GemParBlk.ptsin #define intout _GemParBlk.intout #define ptsout _GemParBlk.ptsout #define addrin _GemParBlk.addrin #define addrout _GemParBlk.addrout int *vdipb[] = { contrl, intin, ptsin, intout, ptsout }; struct { int *Contrl, *Global, *Intin, *Intout; void **Addrin, **Addrout; } aespb = { contrl, global, intin, intout, addrin, addrout }; void CALL_VDI( void ) { asm push ds asm mov dx,seg vdipb asm mov ds,dx asm mov dx,offset vdipb asm mov cx,473h asm int 0EFh asm pop ds } void CALL_AES( void ) { asm push es asm mov ax,seg aespb asm mov es,ax asm mov bx,offset aespb asm mov cx,0C8h asm mov dx,0 asm int 0EFh asm pop es } typedef struct { int contrl[15]; int global[80]; int intin[128]; int intout[45]; int ptsout[128]; void *addrin[128]; void *addrout[6]; int ptsin[128]; } GEMPARBLK; extern GEMPARBLK _GemParBlk; #define contrl _GemParBlk.contrl #define global _GemParBlk.global #define intin _GemParBlk.intin #define ptsin _GemParBlk.ptsin #define intout _GemParBlk.intout #define ptsout _GemParBlk.ptsout #define addrin _GemParBlk.addrin #define addrout _GemParBlk.addrout extern int *vdipb[]; extern struct { int *Contrl, *Global, *Intin, *Intout; void **Addrin, **Addrout; } aespb; void CALL_VDI( void ); void CALL_AES( void ); #define VDI( c0, c1, c3, c6 ) contrl[0] = c0; contrl[1] = c1;\ contrl[3] = c3; contrl[6] = c6; CALL_VDI() #define AES( c0, c1, c2, c3, c4 ) contrl[0] = c0; contrl[1] = c1;\ contrl[2] = c2; contrl[3] = c3;\ contrl[4] = c4; CALL_AES() #ifndef __AES__ #define OBJECT int #define MFORM int #endif #ifndef __VDI__ #define MFDB int #endif IMPORT _GemParBlk EXPORT vdipb, CALL_VDI EXPORT aespb, CALL_AES OFFSET contrl: DS.W 15 global: DS.W 80 intin: DS.W 128 intout: DS.W 45 ptsout: DS.W 128 addrin: DS.L 128 addrout:DS.L 6 ptsin: DS.W 128 DATA ALIGN 4 MODULE vdipb DC.L _GemParBlk + contrl DC.L _GemParBlk + intin DC.L _GemParBlk + ptsin DC.L _GemParBlk + intout DC.L _GemParBlk + ptsout ENDMOD MODULE aespb DC.L _GemParBlk + contrl DC.L _GemParBlk + global DC.L _GemParBlk + intin DC.L _GemParBlk + intout DC.L _GemParBlk + addrin DC.L _GemParBlk + addrout ENDMOD TEXT MODULE CALL_VDI MOVE.L A2,-(SP) MOVE.L #vdipb,D1 MOVEQ.L #$73,D0 TRAP #2 MOVE.L (SP)+,A2 RTS ENDMOD MODULE CALL_AES MOVE.L A2,-(SP) MOVE.L #aespb,D1 MOVE.W #$C8,D0 TRAP #2 MOVE.L (SP)+,A2 RTS ENDMOD 3.3 Rasterbilddateien (.IMG, XIMG, .IFF) -------------------------------------------- Das GEM-Image-Format (.IMG) zeichnet sich durch seine groe Flexibilitt und darauf beruhende Portabilitt aus. Im Gegensatz zu den anderen auf dem ST verwendeten Grafikformaten ist es weder an irgendeine Bildschirm- noch an eine Farbauflsung gebunden. Diese variablen Parameter sind u.a. im Kopf einer IMG-Datei festgehalten. Eine IMG-Datei liegt immer im MOTOROLA-Format vor, so da unter MS-DOS eine entsprechende Anpassung beim Laden und Speichern ntig ist. Fr nhere Informationen empfehle ich wieder das GEM-Profi-Buch von Gei/Gei. Mit 1st Guide knnen Sie nun bei entsprechender Gerte-Ausstattung die volle Farbenpracht nahezu beliebig groer IMG-Bilder genieen. Zwei Besonderheiten gilt es hier zu beachten. Die erste Besonderheit ergibt sich einfach aus der Tatsache, da die Anzahl der Farbebenen, aus denen sich die Anzahl der mglichen Farbindizes ergibt, bei der IMG-Datei und dem angeschlossenen Bildschirm nicht bereinzustimmen brauchen. Eine IMG-Grafik mit 4 Farbebenen (16 Farbindizes) kann auf einem Monochrom-Monitor schwerlich ihre Farbenpracht zeigen. Umgekehrt kann man aus einer monochromen Grafik auch beim buntesten Farbmonitor nicht mehr als 2 Farben herbeizaubern. Es sind nun 2 Ausnahmeflle zu unterscheiden. Ist die Anzahl der IMG-Farbebenen kleiner als die des Bildschirms, so werden die fehlenden Ebenen so erweitert, da die resultierenden Farbindizes einander entsprechen. Im umgekehrten Fall werden die berzhligen Farbebenen einfach zyklisch den vorhandenen berlagert ("transparente Darstellung"). Dies ist eine einfache, aber wenig effektvolle Methode, da so auf einem Monochrommonitor alles, was nicht wei ist, schwarz dargestellt wird. Aus diesem Grunde kann 1st Guide Farbgrafiken auch als monochrome Grauraster darstellen. Die Grafik wird dazu beim Einlesen "gedithert". Die Dither-Routine kommt gegenwrtig mit bis zu 12 Farbebenen (entspricht 4096 Farben) klar. Das Dithering dauert auf einem normalen ST bei einem 320 * 200 Bild mit 16 Farben (niedrige ST-Standardauflsung) etwa 4 Sekunden, wofr man aber mit einem sehr ansprechend aussehenden Bild belohnt wird (Beispiel: AAFALL.IMGAAFALL.IMG). Sinnvoll ist das Dithering brigens eigentlich nur, wenn die Palette-Informationen in der Datei verfgbar sind (siehe unten), sonst wird von der Standard-Palette ausgegangen. Beim ffnen des Fensters nach dem Einlesen wird das Bild zunchst (nach Mglichkeit) in geditherter Form dargestellt. Da diese Darstellung grundstzlich mono-(duo-)chrom ist, kann man auch auf transparente Darstellung umschalten, wo eventuell noch einige Farben zu sehen sind (z.B. wenn ein 16-Farben-Bild in der mittleren ST-Standardauflsung mit 4 Farben dargestellt wird). Kommen wir nun zur zweiten Besonderheit. Sie betrifft die Untersttzung des im GEM-Profi-Buch von Gei/Gei definierten erweiterten IMG-Formats, des sogenannten XIMG-Formats. Diese Erweiterung erlaubt die Abspeicherung der den Farbindizes zugeordneten Farbpalette-Werten, die erst eine Echtfarben-Darstellung einer IMG-Grafik mglich macht. Dazu wird die Tatsache ausgenutzt, da der IMG-Header von Digital Research mit variabler Lnge definiert wurde. Beim XIMG-Format wird der Kopf nun um eine Liste der den Farbindizes zugeordneten Palette-Werte erweitert. Anwendungen, die das IMG-Format untersttzen, aber das XIMG-Format nicht kennen, mssten bei korrekter Programmierung trotzdem mit der Grafik arbeiten knnen. Mit 1st Guide knnen Sie nun jede IMG-Datei in eine entsprechende XIMG-Datei verwandeln, und damit eine entsprechende Farbpaletten-Einstellung sichern, die dann wieder rekonstruierbar ist. Dazu dient der unterste Punkt im Klick-Popup-Men. Damit wird die aktuelle Farbpaletten-Einstellung, die Sie z.B. mit dem Atari-Kontrollfeld vorgenommen haben, in der IMG-Datei verewigt. Wird beim Einlesen einer IMG-Datei das XIMG-Format erkannt, so knnen Sie mit dem Popup-Men-Punkt "Original" die zugehrige Farbpalette aktivieren. Die Einstellung wird nicht sofort nach dem Einlesen vorgenommen, da diese immer auf den ganzen Bildschirm wirkt und nicht lokal auf ein Fenster begrenzt werden kann. Die ursprngliche Farbpalette wird dann anstelle der eingelesenen im Speicher gesichert, damit sie anschlieend durch Anwahl des Punktes "Standard" wiederhergestellt werden kann. Ist der Punkt "Original" nach dem Einlesen einer IMG-Datei gesperrt, so handelt es sich nicht um ein XIMG-Format. Die Grafik COLORS.IMGCOLORS.IMG liegt im XIMG-Format vor und zeigt Ihnen im 16-Farben-Modus die von Digital Research vorgeschlagenen Standardfarben mit den entsprechenden Bezeichnungen, wenn Sie die Original-Einstellung anwhlen. Leider gibt es gegenwrtig zwei verschiedene Interpretationen des XIMG-Formats, was die Reihenfolge der abgespeicherten Farbindizes betrifft. 1stGuide-Versionen vor Dec 23 1991 sowie GEMVIEW bis Version 1.0.4 haben die Farben in der Reihenfolge der VDI-Farbindizes abgespeichert, neuere Versionen beider Programme speichern die Farben in der Reihenfolge der Plane-Indizes, da nur so eine korrekte Zuordnung der Farben auch in niedrigeren Farbauflsungen (Monochrom) gesichert ist. Die Zuordnung zu den VDI-Farbindizes wird erst zur Programmlaufzeit vorgenommen (mit Hilfe der Funktion v_get_pixel). Um auch ltere XIMG-Dateien weiterverarbeiten zu knnen, kann man 1stGuide auch dazu veranlassen, die alte Interpretation vorzunehmen. Dies geschieht durch Gedrckthalten der rechten Shifttaste beim Einladen bzw. bei Sicherung der Farbpalette. Dadurch knnen auch beliebige Konvertierungen von der einen zur anderen Interpretation durchgefhrt werden. Schlielich mchte ich noch bemerken, da die Grafiken eventuell verzerrt auf dem Bildschirm erscheinen knnen, da die Parameter im Kopf, die die originalen Pixelmae angeben, (noch) nicht ausgewertet werden. Der TIGER.IMGTIGER.IMG erscheint z.B. im Monochrom-Modus des ST vertikal gestaucht, da er in einer Auflsung erstellt wurde, die der mittleren Auflsung des ST entspricht (doppelt so hohe Punkte). Neben dem GEM-Image-Format untersttzt 1st Guide auch das ursprnglich auf dem Commodore AMIGA eingefhrte "Interchange File Format" (.IFF). Dieses ist in seiner Flexibilitt mit dem .IMG-Format vergleichbar, wobei sich neben Bitmaps auch noch andere Daten wie zum Beispiel Sounds speichern lassen. 1st Guide untersttzt hier das standardmige "ILBM"-Format (Interleaved Bitmaps). Auerdem erlaubt das IFF-Format standardmig die Abspeicherung von Farbpaletten, deren Manipulation hnlich wie beim IMG-Format mit 1st Guide mglich ist. Ein monochromes (richtiger duochromes) IFF-Bild knnen Sie mit AUGEN_2.IFFAUGEN_2.IFF betrachten. Wer jetzt verlangt, ich solle doch auch die diversen auf dem ST (leider noch) verbreiteten Formate wie SCREEN, DEGAS, STAD und Co. untersttzen, stt bei mir auf taube Ohren. Hier verweise ich auf entsprechende Konvertierungsprogramme (z.B. GEMVIEW von Dieter Fiebelkorn - ein bemerkenswertes Programm, das eine Vielzahl von Bildformaten in das allumfassende XIMG-Format wandeln kann und dabei auch Farben in Grauraster umrechnet!). Ein Format mu schon mindestens die Flexibilitt des IMG- bzw. IFF-Formats besitzen, um von 1st Guide bercksichtigt zu werden. 3.4 Metadateien (.GEM) -------------------------- Metadateien sind Grafiken, die als Folge von VDI-Befehlen gespeichert sind. Der Vorteil solcher objektorientierter Grafiken besteht darin, da sie in jeder Auflsung des Ausgabegertes (Drucker, Bildschirm usw.) optimal dargestellt werden knnen. Da Metadateien immer im INTEL-Format vorliegen, mssen sie auf dem ST beim Laden und Speichern entsprechend umgewandelt werden. Nheres finden Sie im GEM-Profi-Buch von Gei/Gei. 1st Guide untersttzt Metadateien sowohl im RC- als auch im NDC-Koordinatensystem. Nach dem Laden wird die Grafik in ihrer Originalgre auf dem Bildschirm dargestellt. Dazu werden die Parameter im Kopf der Metadatei sowie die OPEN WORKSTATION Parameter des VDI fr den Bildschirm ausgewertet. Wahlweise kann dann die Grafik mit Hilfe des Klick-Popup-Mens in das aktuelle Fenster eingepasst werden. Nehmen Sie als Beispiel die mehrfarbige, mit GEMDRAW unter GEM 3.x (MS-DOS) erzeugte Datei TOOLS.GEMTOOLS.GEM. Fr jede eingelesene Metadatei wird von 1st Guide im Gegensatz zu den anderen Dateiformaten eine eigene virtuelle Workstation fr den Bildschirm beim VDI geffnet (und beim Schlieen des Fensters wieder freigegeben). Damit wird verhindert, da etwa Attribute fr die Textdarstellung in anderen Fenstern verndert werden. Somit brauchen diese nicht stndig neu gesetzt werden. Auerdem werden beim ffnen einer Metadatei von 1st Guide eventuelle zustzliche GDOS-Zeichenstze geladen und beim Schlieen wieder freigegeben (beim Atari ST natrlich nur dann, wenn ein GDOS geladen ist). Das Bit-Image-Flag im Kopf der Metadatei wird von 1st Guide (noch) nicht ausgewertet, so da Metadateien mit eingebundenen Bit-Images nicht untersttzt werden. Allerdings gibt es eine Ausnahme. Die Applikation GEMPAINT unter MS-DOS sowie der Easy-Draw-Scharger auf dem Atari ST erzeugen zu jeder IMG-Datei noch eine zustzliche GEM-Metadatei, die nur den VDI-Befehl V_BIT_IMAGE mit den entsprechenden Parametern enthlt. Findet 1st Guide nun als ersten VDI-Befehl in einer Metadatei diesen V_BIT_IMAGE-Befehl vor, so wird der Dateiname der zugehrigen IMG-Datei ausgewertet und anschlieend in die IMG-Laderoutine verzweigt, so da dann die Darstellung genau wie beim IMG-Format erfolgt. Die zustzlichen Parameter von V_BIT_IMAGE (Seitenmae und Ausrichtung) werden dabei nicht bercksichtigt. Als Beispiel betrachten Sie TIGER.GEMTIGER.GEM. Wird in der Metadatei die VDI-Funktion VS_COLOR benutzt, so kann die Farbpalette, wie schon beim IMG-Format erwhnt, neu eingestellt werden. Dies wird von 1st Guide (noch) nicht erkannt, so da die Einstellung sich sofort auf den ganzen Bildschirm auswirkt. 6. Rebuild-Funktion ------------------------ Wenn Sie eine neue Anwendung starten oder die aktuelle verlassen, so wird Ihr aufgebautes System von Info-Fenstern natrlich berschrieben. Ein besonderes Feature des Programms ist jedoch, da es die so berschriebene Konfiguration nach Mglichkeit vollstndig wiederherstellt, sobald Sie es anschlieend wieder aktivieren (Mentitel anklicken). Es werden alle Fenster (soweit mglich) wieder erzeugt und die im Speicher gehaltenen Datei-Inhalte in dem vorher verlassenen Zustand angezeigt. Beachten Sie also, da offene Fenster entsprechenden Speicherplatz blockieren knnen, wenn Sie sie nicht schlieen. Die Rebuild-Funktion bietet den Vorteil, die Fenster-Konfiguration in eine andere Applikation 'hinberretten' zu knnen. Dies gilt besonders fr Programme, die fast den gesamten verfgbaren Speicher fr sich reservieren, so da Accessories dann kaum noch Spielraum haben (das sind z.B. viele Textprogramme wie WORDPLUS oder TEMPUS). Mit 1st Guide knnen Sie in diesem Fall alle bentigten Fenster vorher ffnen, so da diese Programme von vornherein weniger Speicher bekommen. Nach dem Start des Programms kann dann problemlos auf die Konfiguration zugegriffen werden. Alle bisherigen Betriebssystemversionen haben die unangenehme Eigenschaft, da Accessories nicht als eigenstndige GEMDOS-Prozesse betrachtet werden. Dies hat zur Folge, da Speicher, der durch ein Accessory beim Betriebssystem angefordert wird, immer der gerade laufenden Hauptapplikation zugeordnet wird. Wenn man nun diese Hauptapplikation verlt, so wird automatisch aller von ihr (und dummerweise eben auch von benutzten Accessories) angeforderter Speicher durch das Betriebssystem freigegeben. Verlt man nun ein Programm, in welchem man mit 1st Guide Dateien geladen hat, so kann 1st Guide diese eben nicht restaurieren, da der dazu reservierte Speicherplatz ohne Rcksicht auf Verluste freigegeben wird. Um nun zu erkennen, ob ein Fenster "rebuildet" werden kann, benutzt 1st Guide eine von Atari dokumentierte Systemvariable, die auf den aktuellen GEMDOS-Proze zeigt (unter MSDOS wird dazu eine Funktion namens "get PSP" benutzt). Dieser Zeiger auf den aktuellen Proze-Descriptor wird nun bei jedem Laden einer Datei abgefragt und zu den Fensterdaten mit gesichert. Falls nun eine Rebuild-Situation eintritt, fragt 1st Guide den Zeiger auf den aktuellen Proze-Descriptor erneut ab und vergleicht diesen Wert mit dem gesicherten. Bei einer bereinstimmung kann nun das Fenster "rebuildet" werden, sonst nicht. Zustzlich wird der gesicherte Wert noch mit den Werten der Parent-Proze-Zeiger verglichen, da auch und gerade in diesem Fall ein Rebuild mglich ist. Dies ist mglich, da die Proze-Descriptoren nichts anderes als die Basepages sind, welche ber den Parent-Proze-Pointer untereinander verkettet sind, so da sich 1st Guide durch diese Proze-Liste 'durchhangeln' kann (der "Programm-Segment-Prfix" unter MSDOS bietet diese Mglichkeit nicht, hier kann nur der eigentliche Wert verglichen werden). Die hier beschriebene Vorgehensweise ist vllig legal und benutzt nur dokumentierte Features (kein Schreibzugriff auf "actpd" !), so da zuknftige Betriebssytemversionen keine Probleme bereiten sollten. Falls Accessories einmal den Status von 'richtigen' GEMDOS-Prozessen erhalten sollten (dies ist zu wnschen), funktioniert diese Methode ebenfalls und es knnen stets alle Fenster "rebuildet" werden, da das Programm dann immer seinen eigenen Proze-Descriptor "zu sehen" bekommen mte. Nachtrag: Unter MultiTOS gibt es keine Probleme, da weder Accessory- noch Applikationsfenster durch das System geschlossen werden.3.2 Resourcedateien (.RSC) ------------------------------ Mit Hilfe des Resource-Formates ist es mglich, beispielsweise einfache Blockgrafiken in das Informations-System einzubinden, von denen hnlich wie bei Textdateien verzweigt werden kann. Sie knnen die Resource-Datei wie gewohnt mit einem Resource- Construction-Set erzeugen. Als Verzweigungsschlssel knnen Sie dabei ein beliebiges Objekt mit einer Textkomponente (also auch ein Icon) definieren. Das darauf folgende Objekt in der gleichen Hierarchie-Ebene (Zeiger ob_next in der Objektstruktur) mu dann vom Typ G_STRING sein und als Flag HIDETREE haben. Dieser String enthlt den Namen der Verzweigungs-Datei, der genau wie bei Textdateien relativ anzugeben ist. Durch das Flag HIDETREE wird dieses Objekt von der AES-Funktion "objc_draw" nicht dargestellt. Im RCS2 von Digital Research knnen Sie diese versteckten Objekte wieder sichtbar machen (z.B. zur Bearbeitung), wenn Sie das Vater-Objekt anwhlen und die Funktion "Unhide Children" ausfhren. Um nun die Verzweigungsschlssel-Eigenschaft fr den Anwender sichtbar zu machen, sollten Sie diesen durch eine schattierte Box einrahmen. Dort mu dann allerdings auch die versteckte Verzweigungs- Information hineinpassen, was im RCS2 etwas Geschick erfordert, da der String dann gewhnlich aus dem verkleinerten Objekt herausragt. Aber wie gesagt, bei etwas Geschick ist dies mglich. Als Beispiel habe ich mit dem RCS2 von Digital Research eine bersicht ber das BetriebssystemTOS.RSC des Atari ST erstellt. Hieraus knnen Sie auch einige Grundregeln des Programmierens ableiten. Beispielsweise sollten Sie tunlichst die Nutzung von XBIOS- oder LINE-A-Funktionen vermeiden, wenn Sie portable Programme schreiben wollen. Die Funktionalitt der GEMDOS-Funktionen finden Sie in MS-DOS fast identisch wieder. Durch einen Doppelklick auf einen Begriff knnen Sie nun hnlich wie bei Textdateien eine Verzweigung veranlassen. 1st Guide stellt nach dem ffnen zunchst den ersten Objektbaum einer Resourcedatei dar. Bei GEM-Anwendungen ist das meist die Menzeile, die sich dann voll ausgeklappt vor Ihnen ausbreitet. Sollte die Resource-Datei berhaupt keinen Objektbaum (sondern nur "freie Objekte") enthalten, so wird abgebrochen. Falls die Resourcedatei mehr als einen Objektbaum enthlt, so knnen Sie mit Hilfe des Klick-Popup-Mens oder mit Control-Cursor-links und Control-Cursor-rechts alle Objektbume zyklisch vor- bzw. rckwrts durchlaufen. brigens knnen soviel Resource-Dateien gleichzeitig geladen werden, wie Fenster und Speicherplatz zur Verfgung stehen. Da der Resource-Manager des AES aber nur eine Resource-Datei gleichzeitig verwalten kann (mit der parameterlosen Funktion "rsrc_free" wird beispielsweise immer die zuletzt geladene Resource freigegeben), mute fr 1st Guide eine eigene Laderoutine entwickelt werden. Diese kann nun sowohl Resource- Dateien im MOTOROLA- als auch im INTEL-Format korrekt darstellen, und zwar sowohl in der ST- als auch in der IBM-Version. Die Erkennung des jeweiligen Formates erfolgt dabei automatisch. Doch damit nicht genug. Auch eine Konvertierung in das jeweils andere Format ist in beiden Versionen mglich. Hierzu ist folgendes zu erklren: Whrend IMG-Dateien grundstzlich im Motorola-Format und GEM-Metadateien grundstzlich im Intel-Format vorliegen (und auf dem jeweils anderen Rechner entsprechend konvertiert werden mssen), liegen Resource-Dateien immer im Format des jeweiligen Rechners vor, so da sie normalerweise nicht ohne weiteres austauschbar sind. Die Konvertierung bezieht sich dabei auf das byteweise Drehen von Worten bzw. wortweise Drehen von Langworten. Mit 1st Guide wird nun genau dieses Problem gelst. Sie knnen von nun an Ihre Resourcen problemlos zwischen ST und IBM austauschen, wechselseitig bearbeiten und ungeachtet der Herkunft darstellen. Als GEM-Kenner mssten Sie allerdings bezglich der automatischen Erkennung skeptisch werden. Es gibt nmlich kein von Digital Research vorgesehenes Mittel, um zu erkennen, ob eine Resource-Datei im Intel- oder Motorola-Format vorliegt. Daher mu zu einem Trick gegriffen werden, der zwar nicht 100%ig sicher sein kann, aber wohl 99,99%ig sicher ist. Diese Sicherheit ist identisch mit der Wahrscheinlichkeit, da eine Resource-Datei nicht mehr als 255 Objektbume enthlt (wohlgemerkt: Objektbume, nicht Objekte !). In diesem Fall mu nmlich ein Byte des Wortes im Resource-Header, das die Anzahl der Bume angibt (Komponente rsh_ntree) gleich Null sein. Je nachdem, welches Byte das nun ist, kann das entsprechende Format festgestellt werden. Das erkannte Format erfahren Sie im Klick-Popup-Men, mit dem Sie auch die Konvertierung veranlassen knnen. Dazu wird die Datei nochmals eingelesen (die im Speicher befindliche Resource ist bereits an den Bildschirm angepat), allerdings auf den gleichen Platz der dargestellten Resource, so da kein zustzlicher Speicherplatz gebraucht wird. Die Konvertierung ist umkehrbar, d.h. wenn Sie die Datei wieder zurckkonvertieren, erhalten Sie wieder das Ausgangsformat. Trotzdem empfehle ich Ihnen, die Konvertierung nur mit Kopien der Original-Resource durchzufhren, da bei einem eventuellen Schreibfehler Ihre Daten in den ewigen Jagdgrnden landen knnen (die konvertierte Datei wird auf den Platz der Ausgangsdatei zurckgeschrieben). 3.5 Soundsample-Dateien --------------------------- 1st Guide kann digitalisierte Sounddaten mit 8 Bit Auflsung auf jedem normalen ST abspielen, auf STEs/TTs wahlweise auch im DMA-Mode. Digitalsounds ermglichen die Wiedergabe beliebiger natrlicher oder synthetischer Klnge, wie sie beispielsweise mit einem Soundsampler aufgenommen bzw. erzeugt werden knnen. Da sich offenbar leider fr digitale Sounddateien noch kein verbreitetes Standardformat durchgesetzt hat, werden zur Zeit nur bestimmte, durch verschiedene ST-Programme verwendete Formate untersttzt. Der Aufbau von 8-Bit-Sampledateien ist im Grunde recht einfach, da jedem Samplewert ein Byte in der Datei entspricht. Unterschiede beginnen allerdings schon bei der Interpretation des Wertebereiches eines Samplewertes: von 0 bis 255 oder von -128 bis +127. Sehr wichtig ist die Angabe der sogenannten Samplerate, da nur dann der Sound mit der richtigen Frequenz abgespielt werden kann. 1st Guide untersttzt .SAM-Dateien, wie sie bei den Programmen SoundMachine und SoundMerlin verwendet und beispielsweise auch von der Datenbank PHOENIX untersttzt werden. Diese sind mit einem den eigentlichen Sounddaten vorangehenden Header versehen, der durch eine eindeutige Kennung einen Schlu auf den Wertebereich zult und weiterhin ein Ma fr die Samplerate enthlt, so da 1st Guide diese Samples korrekt wiedergeben kann (Beispiel: WELCOME.SAMWELCOME.SAM). Sind diese Daten nicht verfgbar, so wird von einem Wertebereich von 0 - 255 und einer Samplerate von 7000 Hertz ausgegangen. Damit werden z.B. die .SND-Dateien des Spiels ESPRIT korrekt abgespielt. In jedem Fall lt sich die Abspiel-Frequenz im Rahmen der Hardware- mglichkeiten beliebig einstellen, d.h. beim normalen Interruptsound sehr fein, beim DMA-Sound dagegen sehr grob (6258, 12517, 25033 oder 50066 Hz). Der DMA-Sound wiederum hat, falls verfgbar, den Vorteil, da er keine CPU-Rechenzeit kostet. Der Interruptsound dagegen 'frit' mit zunehmender Frequenz immer mehr Rechenzeit. Die Obergrenze fr die Frequenz ist dabei von verschiedenen Faktoren wie CPU-Takt, Caches usw. abhngig. Auf einem 'ungetunten' 8-MHz-ST kann man bei 20 kHz schon deutliche 'Zeitlupeneffekte' beobachten, und viel hher sollte man die Frequenz auch nicht whlen, da es sonst zu Interruptproblemen kommt. Bei DMA-Sound-fhigen Rechnern (STE/TT) knnen Lautstrke, Hhen und Tiefen ber das SOUND.CPX-Modul des modularen Kontrollfeldes von Atari eingestellt werden, was sowohl den DMA-Sound als auch den Interruptsound entsprechend beeinflut. Wer Samples mit anderen als den angegebenen Standarddaten mit 1stGuide abspielen will, sollte sich an eines der .SAM-Formate halten, also den Sampledaten einen entsprechenden Header voransetzen, der die bentigten Daten zur Verfgung stellt. Dazu kann man sich im Quelltext SOUND.C von 1stView anschauen, wie sich 1stGuide/1stView die entsprechenden Informationen verschaffen. Im Fenster stellt 1stGuide die Sample-Kurve dar, wodurch man ein genaues 'Bild' des Samples erhlt. So sind z.B. bersteuerungen recht deutlich zu erkennen. Kleine Linienfehler beim Scrollen (z.B. fehlende Linienstcke) sind durch den Clipping-Algorithmus des VDI bedingt (fr Experten: Cohen-Sutherland-Clipping) und nicht ohne greren Aufwand vermeidbar. Die Einpassung ins Fenster kann bei groen Samples recht lange dauern, und die Darstellung funktioniert gegenwrtig auch nur dann korrekt, wenn der Sample nicht grer als etwa ein Megabyte ist. 3.1. Textdateien (ASCII, 1st Word, .OUT) ------------------------------------------- Zunchst werden selbstverstndlich normale ASCII-Dateien geladen, die Sie mit einem beliebigen Texteditor erzeugt haben. Wenn Sie sich die beigefgten Texte einmal direkt (d.h. nicht unter 1st Guide) anschauen, werden Sie den Aufbau der Links erkennen. Es handelt sich um eine zweiteilige Struktur, die in drei Paragraphenzeichen eingefat ist. Der erste Teil enthlt das anzuzeigende Keyword (das dann fett und unterstrichen dargestellt wird), der zweite Teil enthlt den relativen Pfad und Dateinamen des zugehrigen Textes (dieser Teil wird unter 1st Guide natrlich nicht dargestellt). Im Grunde genommen sollte die Informationshierarchie der Dateihierarchie entsprechen, man kann jedoch jederzeit von einer Datei zu einer beliebigen anderen Datei verzweigen. Der Pfad mu dabei immer relativ angegeben werden ("..\" benutzen), damit ein Info-System bei Bedarf problemlos im File-System umgehangen werden kann. Die anzuzeigende Textdatei darf Tabulator-Zeichen enthalten (ASCII-Code 09), die standardmig ausgewertet werden (d.h. mit der Weite 8). Sonstige Steuercodes (ASCII kleiner als 32, z. B. Zeilentrenner 13, 10), werden zum Teil gefiltert, Zeichencodes ber 127 werden entsprechend Zeichensatz angezeigt. Das Paragraphenzeichen (ASCII-Code 222 = 0xDE) ist fr den Aufbau von Links reserviert. Auf Links folgende Tabulatorzeichen in der Zeile sollten Sie vermeiden, da diese aufgrund der speziellen Link-Darstellung nicht richtig ausgewertet werden. Bei 1st Word Texten werden die wichtigsten Steuerzeichen gefiltert (Soft- und Wide-Spaces, Phantom-Bindestriche, variable Seitenumbrche) bzw. ausgewertet (Textattribute fett, unterstrichen, kursiv und hell). Funoten sowie eingebundene Grafiken werden (noch) nicht untersttzt. Das Popup-Men bietet Ihnen bei Textdateien die Wahl zwischen drei verschiedenen Schriftgren des Systemfonts, wodurch sich die bersicht unter Umstnden erheblich verbessern lt. Wurde die Datei ber ein Programm geladen, welches das VA-Protokoll und speziell VA_FILEFONT untersttzt (z.B. der GEMINI-Desktop), so kann ein beliebiger GDOS-Font verwendet werden. ber das Konfigurationsmen (siehe Kapitel 7) kann eingestellt werden, ob 1st Guide beim ffnen des Fensters automatisch einen solchen Font erfragen und einstellen soll oder nicht. Auerdem kann der aktuell eingestellte Font permanent gesichert werden, so da er dann auch ohne VA-Protokoll zur Verfgung steht. Die Funktion "OUT-Datei schreiben" ist sinnvoll bei Texten mit Verzweigungsschlsseln und besonders bei 1st Word Texten. Es werden dann nmlich die Text-Attribute der Verzweigungsschlssel- Darstellung bzw. diejenigen von 1st Word in das von Digital Research standardisierte OUT-Format umgewandelt und damit die Texte zur Ausgabe auf einen Drucker vorbereitet. Fr nhere Informationen zum OUT-Format verweise ich Sie auf das GEM-Profi-Buch von Gei/Gei. Welchen Vorteil bietet nun das OUT-Format dem Anwender? Nun, der entscheidende Vorteil besteht darin, da Sie eine solche Datei mit Hilfe eines OUTPUT- (oder AUSDRUCK-) Programms, wie es fr MS-DOS beim GEM mitgeliefert wird und auf dem Atari ST z.B. bei EASYDRAW oder SCIGRAPH zu finden ist, samt Textattributen auf Ihren Drucker ausgeben knnen, ohne eine von 1st Word bekannte spezielle Drucker-Konfigurationsdatei PRINTER.CFG zu verwenden. Die Ausgabe wird dann ber den GDOS-Drucker-Treiber mit Hilfe der VDI-Funktion V_ALPHA_TEXT abgewickelt. Im Unterschied zu den anderen Textausgabe- Funktionen des VDI erfolgt die Ausgabe dabei im Textmodus statt im Grafikmodus. Auerdem knnen in einer OUT-Datei auch Rasterbilder eingebunden werden (wird von 1st Guide noch nicht untersttzt), womit die Funktionalitt dieses Formats der von 1st Word Plus entspricht. Das OUT-Format kann nun von 1st Guide auch eingelesen werden. Wenn Sie etwa eine 1st Word Datei als OUT-Datei schreiben und diese anschlieend einlesen, sollten Sie zumindest bei den 4 oben genannten Textattributen keine Unterschiede in der Darstellung feststellen. Da 1st Guide die Verzweigungs-Links beim OUT-Datei-Schreiben mit den entsprechenden Textattributen versieht und die zugehrige Verzweigungs-Information entfernt, knnen Sie natrlich von einer von 1st Guide geschriebenen OUT-Datei nicht mehr verzweigen (Der Sinn der Aktion besteht ja auch darin, die Texte so, wie sie auf dem Bildschirm erscheinen, auf einen Drucker zu bringen). eE ?ETIGER.IMGt(c?B C ?Ă τ ?   ??9 0?[`@ȿB˓nWB @>i_^^킀JdV_}}oRm ddozo;mJWns-k?| 'o_m` ZU@:@@?uڕSۛo(3?3?8 j 6 JZ͖ς=?uom{; F Qy=vP? ۛG!y758__Uq~o&ѨDQ_|eTuL}Y?驷d8x R#v~/S&?' ׃|tg OֵϾ…/B_‹E B_B?\(l?6KHȷiσew  ^׃NR  ?M++-O| ;诂_K;z@]@rCˆJ[GOO AB}UEi?frVV׾VD~WDV^, oY'*d d`~l9diǂhdd5&4N|'/! /!J{!!!i%^lAL@] @t@@dL'p?(>(0/2(2(2(?Ͱk|' ?Z;wU;7 qɐ_?1FwJbq4wm>Iы ~YL<@E%DPD~gPD]PP*WP0.%_RrP/`#(?R oC? _n^gMGдj5%=7Ԁ̐AB€}@zKBOҋյs;,r1ĀDH˹D"B/6on^? ~A!П ǻX x҉L hA^s+҈BB¿蹮@@V_|A"/wv%~gd eo-$ e'ic$A 10;-劂'0h B`?_@@7@)3(lO0 @3l? ;-c< (2?) _[~;o߈ Ou@/|-o?pP' խWսO?Ցt{@lK*glU/ /S Cs~GŖW S awÿ/< ԥ ?2 C V {|¿`g̋?} ~% KKb?n3߀?c x Ns|տ?[?~ s”_ǿdwW 4_{?ۿnc '?WO{7E7>7 yᆱڿVr-W?W#?.;>ڿ =UXW+?ՐC@LuGUW(Dٿ U_8GGW+*$_#ZS# û UUx Ե-Or A?oND7p8 }EA ?p o EOC ;L/|A6o ? ~; .7 |  >4 0OG~q( .] 6 )B_]Wl -d*ddd?v$ ;~ ??3!!`J?^! ''>gA_o@@@ν@@~ @?#-J(72 2(2:;:H.H2(?2/g?#z+=H ̀??=$*[ ;? U"ߑw { R3PD~ET傀]PdPDPEDsBi'B QC޴ @o ~r R Rsu Д  +߄ B% B?B oA , @@@?Dǂ  @+"o{&z   !i@iX@п@ G¯ r`W ?_~ې15r P7 eBh !0= @?d ؏g %a= П   w ?O`@ p< ݧ{2@ H˿/ ~ﴀ0=w @  w  ! iCOmH Pp%Pr0$zf *6# @ b!PI $\܂@ `k A@IzB TJ@/o  ? $LW v   7Tʍ?Σ ~ =P@ \A₀B|@Pʮ Ṽ? y}]S `)ɿ.ʮ-¤x _nͶSvB8 { Y꾧a/ 6 ?G_ 7W 8? 9ݐ-炀=%U;XM ~NUC=RRuYX m@s @$[[j^嗈p@2@@@W@<\P  P6    \ ?&7 ЀU>Q 0|߃[0"S" ݟ ᅢwڀ5*߄sɼ H@o1HI?U AP!ʯ0o2e COJJNncH7&{(/ewH>\6)'#>AZ75YO{ɛ)s}_ %_jWl7][]O k#?{?OvD'_t\DPF2%@  /~M_Z R {  NHLeZ9]#&:"q_;e^_ΐ"#\X)jx"7޽Fn zj! ??ݿ&ܭoY g?[͌(ns~~ =?}\d~"{ͯn w0LNl{~[h-o  yU0/9R(K d {?J  ~ۂ  ?{o7V|@Ls9 k" OϻooR!  nN3 Ls o7` !!Y  4!` 6Xq @p ddddldddd ddd'djdkd dddhdcPccc chc cP2P2Pcclcc cP2P2PcQcPccc pp ppcQc cPccc c `` c c `` cQcP cLL 4LcLL 4LcQcP c4 LpL884p4  c4 LpL884p4 cQcP c4LLd,d44 c4LLd,d44cQcP c4,LLXX44, c4,LLXX44,cQcP c4L LL4 4 c4L LL4 4cQcP c4LLLx@x4c4LLLx@x4cQc cPcc cXX  Xc cXX  XcQcPc mmmmcQcPcccQcPccQcPc c   c   cQcPc  "\ "\cQcP  4\l 4\lcQcP  \ \cQcPcccQcPccQcPccQcPccQcPccQcPccQc cPccc  pPpcP>pPpcQcPc cvPPcvPPcQcPccPPcQcPcDPgcQc cPcc hal hah2hcQcP a a2cQcP nmlnmnmncQcP cb0bcb0bcQcP c0hBhc0hBhcQcP cB9t9BcB9t9BcQcP ctuu tuctuu tucQcP cFFhFcFFhFcQcP ch6I Ich6I IcQc TREE1TREE2,L  $, ,%) % # %   #     #       #  !%  #48 ?EX   kp!"  " $ %"#, L (h*0 9@   4ST-HardwareHARDWARETOS..\TOS..\XBIOS\XBIOS.HLPLINE-A..\LINEA\LINEA.HLPLINEAAES..\AES\AES.HLP..\GEMVDI..\VDI\VDI.HLPTOS..\TOSXBIOS..\XBIOS\XBIOS.HLP..\XBIOS\XBIOS.HLPBIOS..\BIOS\BIOS.HLPGEMDOS..\GEMDOS\GEMDOS.HLPPortable AnwendungenST-AnwendungenDesktopOK Digital Design Guido Vollbeding, Blstringer Str. 47, 3240 HaldenslebenGEM weniger Platz + einfachere Weitergabe (+ weniger Arbeit fr mich) Dec 23 1991: """""""""""" - "Sag niemals nie!": In bestimmten Fllen konnte die in der letzten Version eingefhrte neue Rebuild-Methode doch noch fehlschlagen. Die Idee war schon gut, die Umsetzung leider mangelhaft. Ich hoffe (stark...), da jetzt alle Probleme beseitigt sind. - Um Abhngigkeiten von der Farbauflsung zu vermeiden, mute die Interpretation des XIMG-Formats (Reihenfolge der Farbindizes) gendert werden (in Abstimmung mit dem GEMVIEW-Autor Dieter Fiebel- korn). Alte XIMG-Dateien sollten wie folgt transformiert werden: Bild einladen MIT gedrckter rechter Shifttaste, Originalpalette anwhlen, Farbpalette sichern OHNE gedrckte rechte Shifttaste (funktioniert bei Bildern bis 16 Farben auch in Monochrom!). Nheres steht in 3.3. - Probleme beim Konfigurieren unter Let'emFly (Freeware von Oliver Scheel) umgangen sowie Tastaturbelegung angepat. (Man fliegt halt nicht mehr ohne...) - 1st Guide kann jetzt mehrseitige Metafiles korrekt darstellen (Seitenvorschub mit v_updwk und v_clrwk). Es kann seitenweise geblttert und gedruckt werden. Derartige Metafiles knnen von 7UP ab Version 2.1 (liegt mir der- zeit als Beta-Version vor) aus beliebigen ASCII-Dateien erzeugt werden. Bemerkung: Diese Funktion war (per Tastatur) im wesentlichen schon in der letzten Version verfgbar (fr Testzwecke, daher undokumen- tiert). - Wenn man bei der Aktivierung Control-Shift gedrckt hlt, wird sofort die Indexdatei geladen und man kann einen Begriff eintippen! - Kein Nachlaufen mehr beim Tastatur-Scrollen (Dank an Michael fr die elegante Methode). Nov 24 1991: """""""""""" Bezugsversion. Sollten Sie eine noch ltere Version besitzen, lesen Sie am besten alles nochmal durch. welcome B.             #(+//5330)&   !#%%%%$#         *)+*+,)'      !+/4599;:5.%   '-367>?D@;0(" '('#"## '/35;EOROE<740  +3776331,  /587CGSQLD860*ɾ #+/5;?AC@60&ž #56;>CNYVOLB97." º +27??GNOH=6-$  #-<7?CKSWRFH<9.$ƻ %+1:EGKLHGG@4( '/5>COWZXQQGF<2"#-;EKKNOOQL@0$ #//7?GMOLEGC>:0$ ý &/7>BCCB=;6+  '/=A?@CHGI@6.(& #*/35;<>;82((# '+.%/.32-)!% %!" "+,,,#%$%    '(++)$  &))!"!   #" )#0/0*"  »33>CJSNL@>03(  +5:981($ ľ+77?KQRLD51$#   %/7KR]bZTGA8*  "/;OOQH<<72$ #!+3?IOJ92'( ';?W\ghbUKL80   *3>GLO]PC88$  !+:KPSZPH:2(   -+;QSee]TG@<$ 7;GXP_`KD0 ȿ  +3EEW^VQK8'*  ̲'GU]fsyrhZL0) )3GSQYefVK@   '7NKWgidYM8 " +KLLMMOJF: +0)  ĸЪ';Wmiewwzp`@$ ȹ '/?U_ce]TH@0к # /SP[l]]SR@ ->IF?E4 Ь ?SYnnjfVL4**/32($  ?_mswqj`VH /GWPWTE8 ȥ˴'WewxrhT<0/GI@@$=k}}xr`@$ ʽ /93.$ Ĩ:Kov`E0 ȵ&->>=4 ̺5COw{bB$и/?FEFMPN@ Ÿ?OotZ@#-;CAOUVL0Ȳ?_mw|P0 Ĭ7NTPJ:( ̸ε/[w~X '?@26EH@$ĸ/Wm`_rP ఍$'?W_XH4-  ĿOwrVZ`P(Ȱ10-7DN[P8"к/_{v`PB(ఌ'/?GCOQOTH$ Ҵ/k}t`J: ̤7GRFKPKB8,IJ7]ol]P4ظ 3?O[T@0ȸм/_~jXB,+1,   й+W^X@(10"/KST@&34*  34/U_T2̷) -7KF0  /KZ\0ȸ!7MSPD,+: Ġ?HA2  ?UTH4  '0థ'=@, ̶';MB(!е3GJ@ ̱'/?KJ4    +-;KF0̺39=OYJ  Ф35Ol`,ȿ?B=GD(  Ԑ5&+MZJ ;UND=2̸ /E8 1,+=F4ȷ'?EOP@,Ș?[PGLJ4'KRI:(𨀗JOYg`@а/KI8(  &/6Ggh@кȻ?]R@(/F0 ؔ7F_gY@ʰнGkbH(?U\0𠀗=KPM8?WZH( 32$АOkdR@̵?ehZ@  Ⱥ'7(Ȉ/O\RD*74Ȭ7D:& '58䠀'G[TB$µ'4̪/S[cT@ ¾7@ SgjX0༶-?Wa\L0.0')Ĉ/gsfT8ب7GKQH0 /SR4ب/_mbL0$آ7A95*/MP0 OTJ@( 7ML*/(7@( Đ77,$7W`D'?:(И%*/-34/B810( ࠀ'+170/0¿'5?B0 $?IQH 5$а7QH43>(Ā7KQH0/, OrdD" %5?2言';JSL('/OI2 %/,ě+?V_`@ȷ ?N@-  +51𰕻7OkxlP 踠ĴSP@(#I@ +Gkrd@ഥмMJ<0( "Я7KefP,й>5.+(+;0G[cP0 1-+-( #)//[\Y@  ("+& ',ક;B<*"  ,*376   /(п+1?DA(  '/7* #ി5;OWD'0=@,  ?XYciP %37>G8ਥKT]fd@ #   /(7Snj`L0Ȱ/5" -?>;;0'&+79KX8 Ь'GD0'*  /?L@,&/7>(ȸ .(  /O@& '(/0$/;0 ',"+4(ʼ7GA2#  $'+)*&'/,     )       "!+.*       '$   #! "  ##                                                          #      )$                                                                   #$          - ! +(  & $ (        &                                                              '6;:;2$   '?W[[VD, !#($%$ Ь7k|`8ʶ+;FCKH0ȼ"  OtT(İ/?GH8 +-$!'_xX  /=A@90*/3) аGsx}|dH$ +5=:3&+650¡/Oh`_ZF0&7EFMH8. ʼ-," ̰/WX9811( '19:1&$Ͱ-[l_kdXD  %/.%$%(Ȫ7_~jc`L<$+?8,*+) ¿&% в?o}msxh@-29>4'%'ž#,-(! /Ooh_mX@  .7?8()#'-+&ɨ?gh^c\P0 ! ?XQ[ghX0     യ?]PIW_`@20    ̿ʺ737Wkb@" KD;OopP    ľ7H9OkpX$    /D8?gnd(д  )-$/,?H9[slHи*    +=:к;0'UglHി# ':80  +Ը7V@Oyx@Ѱ   ľ;GFD<,'0ȹ?F;_{xX !-40%61 '3670&/1ȹKR9OdX0̼'78  $++$+/)  #'(-"ո?@7gh\4' &,(& ')'  ;S@7_fP  ;8*%*!/N@"38,$   &'62    ȿ?@ 392'! #&)  O`H5OV@  -'    / +OM0  '  #Գ7J8/OJ    B0 GH$ +,    /2"/MV@Ⱥ'#     -,?R@  п"   ',  7E4/4     /@2 #   '64$  $$  %)"%54!      '34+     "')             * %70   '$ )%        "!!                     &."         !"  "    #!                                                                                                                                                                              ($      . (E.. ATTRIB )ECONTROL MEESCAPE ]EINPUT cEINQUIRE EOUTPUT ERASTER E/VDI HLP twT9READ_ME TXT!. *E.. (EATTRIB HLP yxVSF_COLOC VSF_INTEC rVSF_PERIC ΈsVSF_STYLC VSF_UPDAC VSL_COLOC ̝VSL_ENDSC OVSL_TYPEC DVSL_UDSTC \VSL_WIDTC VSM_COLOC ΞZVSM_HEIGC sHVSM_TYPEC T78VST_ALIGC SsVST_COLOC wVST_EFFEC ĈsVST_FONTC VVST_HEIGC uQVST_POINC  VST_ROTAC VSWR_MODC T VS_COLORC "xTREAD_ME TXT!Attributfunktionen Diese Gruppe von Funktionen dient dem Einstellen von Farbe, Typ, Stil und Hhe der Ausgabefunktionen..\OUTPUT\OUTPUT.HLP. bergeordnete Attribute: vs_colorVS_COLOR.C Farbintensitt einer Farbe festlegen. vswr_modeVSWR_MOD.C Schreibmodus(Replace, Transparent, ...) auswhlen. Linienattribute: vsl_colorVSL_COLO.C Linienfarbe auswhlen. vsl_endsVSL_ENDS.C Linienenden definieren (Abrundung, Pfeile, ...). vsl_typeVSL_TYPE.C Liniendarstellung einstellen. vsl_udstyVSL_UDST.C Eigene Liniendarstellung definieren. vsl_widthVSL_WIDT.C Linienbreite definieren. Markierungsattribute: vsm_colorVSM_COLO.C Markierungsfarbe festlegen. vsm_heightVSM_HEIG.C Markierungsgre festlegen. vsm_typeVSM_TYPE.C Markierungstyp auswhlen. Textattribute: vst_alignmentVST_ALIG.C Horizontale und vertikale Ausrichtung eines Texts bestimmen. vst_colorVST_COLO.C Farbe fr Textausgaben festlegen. vst_effectsVST_EFFE.C Texteffekte auswhlen (kursiv, ...). vst_fontVST_FONT.C Zeichensatz auswhlen. vst_heightVST_HEIG.C Textgre festlegen. vst_pointVST_POIN.C Gre der Zeichenzelle festlegen. vst_rotationVST_ROTA.C Drehung der Textausgabe. Flltypattribute: vsf_colorVSF_COLO.C Fllfarbe auswhlen. vsf_interiorVSF_INTE.C Auswahl des Flltyps (Muster, schraffiert, ...). vsf_perimeterVSF_PERI.C Rahmen zeichnen oder nicht. vsf_styleVSF_STYL.C Fllmuster auswhlen. vsf_updatVSF_UPDA.C Eigenes Fllmuster definieren. /* * VSF_COLOR (C) Digital Design 1990 * * SET FILL COLOR INDEX * * Diese Funktion stellt die Farbe fr die Fll-Operationen ein. Diese * Farben knnen mit der SET-COLOR-REPRESENTATION-Funktion VS_COLORVS_COLOR.C be- * liebig gemischt werden. Bei monochromen Bildschirmen stehen nur die * Farben schwarz (1) und wei (0) zur Verfgung. */ #include int vsf_color( int handle, int color_index ) { intin[0] = color_index; /* Fllfarbe */ VDI( 25, 0, 1, handle ); return intout[0]; /* = set_color: Ausgewhlte Fllfarbe */ } /* * VSF_INTERIOR (C) Digital Design 1990 * * SET FILL INTERIOR STYLE * * Diese Funktion setzt den Flltyp fr die Fllfunktionen. */ #include int vsf_interior( int handle, int style ) { intin[0] = style; /* Flltyp: 0 = Flche wird nicht ausgefllt * * 1 = Flche wird komplett mit Fllfarbe * * ausgefllt * * 2 = Flche wird punktiert ausgefllt * * 3 = Flche wird schraffiert ausgefllt * * 4 = Flche wird mit benutzereigenem * * Fllmuster ausgefllt (vsf_updatVSF_UPDA.C) */ VDI( 23, 0, 1, handle ); return intout[0]; /* = set_interior: Ausgewhlter Flltyp */ } /* siehe auch: vsf_styleVSF_STYL.C */ /* * VSF_PERIMETER (C) Digital Design 1990 * * SET FILL PERIMETER VISIBILITY * * Diese Funktion erlaubt das Ein- und Ausschalten der Umrahmung der * Fllflche. Standardmig werden alle Fllflchen mit einer Linie * in Fllfarbe eingeschlossen. Dies kann mit dieser Funktion verhin- * dert werden. */ #include int vsf_perimeter( int handle, int per_vis ) { intin[0] = per_vis; /* Flag Umrahmung: 0 = Umrahmung aus * * 1 = Umrahmung ein */ VDI( 104, 0, 1, handle ); return intout[0]; /* = set_perimeter: Ausgewhlte Option */ } /* * VSF_STYLE (C) Digital Design 1990 * * SET FILL STYLE INDEX * * Diese Funktion erweitert die Mglichkeiten zum Ausfllen von Flchen. * Sie erlaubt die Auswahl von 24 verschiedenen Punktmustern und 12 ver- * schiedenen Schraffiermustern. Vor Aufruf dieser Funktion mu der * Flltyp PUNKTIERT oder SCHRAFFIERT mit der Funktion VSF_INTERIORVSF_INTE.C ein- * gestellt werden. * Wird zuvor ein anderer Flltyp als 2 (PUNKTIERT) oder 3 (SCHRAFFIERT) * ausgewhlt, so hat diese Funktion keine Auswirkung auf das Fllmuster. * Ist die Nummer des Flltyps ungltig, so wird der Standard-Flltyp * gesetzt. */ #include int vsf_style( int handle, int style_index ) { intin[0] = style_index; /* Fllmuster (1-24 bzw. 1-12) */ VDI( 24, 0, 1, handle ); return intout[0]; /* = set_style: Ausgewhltes Fllmuster */ } /* * VSF_UPDAT (C) Digital Design 1990 * * SET USER DEFINED FILL PATTERN * * Bei der Funktion VSF_INTERIORVSF_INTE.C zur Bestimmung des Flltyps kann auch * ein benutzerdefinierter Flltyp angegeben werden. Dieses Fllmuster * wird hier eingerichtet. * Das Fllmuster erstreckt sich ber 16 2-Byte-Worte. Das Bit 15 des * ersten Wortes ist der obere rechte und das Bit 1 des 16. Wortes der * untere rechte Punkt des Fllmusters. * Mehrfarbige Fllmuster erstrecken sich ber mehrere 16-Wort-Gruppen, * die hintereinander im Eingabe-Array enthalten sind. Fr jede Farbe * mu eine Gruppe definiert werden. */ #include void vsf_updat( int handle, int *pfill_pat, int planes ) { vdipb[1] = pfill_pat; /* Fllmuster-Definitions-Array */ VDI( 112, 0, planes <<= 4, handle ); /* planes=Anzahl der Fllfarben */ vdipb[1] = intin; } /* * VSL_COLOR (C) Digital Design 1990 * * SET POLYLINE COLOR INDEX * * Die Farbe der zu zeichnenden Linien wird hier aus der Tabelle der mit * der Funktion VS_COLORVS_COLOR.C gemischten Farben ausgewhlt. Beim Monochrom- * Monitor existieren nur die Farbindizes 0 und 1, die nicht vorher * gemischt werden mssen. */ #include int vsl_color( int handle, int color_index ) { intin[0] = color_index; /* Linienfarbe */ VDI( 17, 0, 1, handle ); return intout[0]; /* = set_color: Ausgewhlte Linienfarbe */ } /* * VSL_ENDS (C) Digital Design 1990 * * SET POLYLINE END STYLES * * Die mit der Funktion V_PLINE..\OUTPUT\V_PLINE.C erstellten Linien oder Linienfolgen * knnen am Anfang und am Ende geformt werden. * Es gibt drei Mglichkeiten: * - kantig (normal) * - Pfeil * - abgerundet */ #include void vsl_ends( int handle, int beg_style, int end_style ) { intin[0] = beg_style; /* Gestaltung des Linienanfangs: * * 0 = kantig * * 1 = Pfeil * * 2 = abgerundet */ intin[1] = end_style; /* Gestaltung des Linienendes (siehe beg_style) */ VDI( 108, 0, 2, handle ); } /* * VSL_TYPE (C) Digital Design 1990 * * SET POLYLINE LINE TYPE * * Mit der Funktion V_PLINE..\OUTPUT\V_PLINE.C knnen nicht nur durchgezogene Linien * gezeichnet werden, sondern auch gestrichelte. Der gewnschte Linien- * typ kann mit dieser Funktion aus mehreren zur Verfgung stehenden * ausgewhlt werden. * Diese Funktion ist nicht auf jedem Gert verfgbar. Die Funktionen * V_OPNWK..\CONTROL\V_OPNWK.C und V_OPNVWK..\CONTROL\V_OPNVWK.C teilen dies in work_out[6] mit. */ #include int vsl_type( int handle, int style ) { intin[0] = style; /* Linientyp: style MSB (16 Bit) LSB * * 1 1111111111111111 * * 2 1111111111110000 * * 3 1110000011100000 * * 4 1111111000111000 * * 5 1111111100000000 * * 6 1111000110011000 * * 7 extern definiert * * Der Typ 7 mu mit der Funktion VSL_UDSTY * * definiert werden. */ VDI( 15, 0, 1, handle ); return intout[0]; /* = set_type: Ausgewhlter Linientyp */ } /* * VSL_UDSTY (C) Digital Design 1990 * * SET USER-DEFINED LINE STYLE PATTERN * * Der Linientyp 7 der Funktion VSL_TYPEVSL_TYPE.C wird mit einem 16-Bit-Wort in * dieser Funktion definiert. */ #include void vsl_udsty( int handle, int pattern ) { intin[0] = pattern; /* Linientyp (16-Bit-Wort). Das hchstwertige Bit * * ist der erste Punkt der Linie. */ VDI( 113, 0, 1, handle ); } /* * VSL_WIDTH (C) Digital Design 1990 * * SET POLYLINE LINE WIDTH * * Neben dem Linientyp kann auch die Breite der Linien eingestellt wer- * den. Die Breite der Linien wird in ungeraden Zahlen ab 3 angegeben. * Diese Funktion ist nicht auf jedem Gert verfgbar. Die Funktionen * V_OPNWK..\CONTROL\V_OPNWK.C und V_OPNVWK..\CONTROL\V_OPNVWK.C teilen dies in work_out[7] mit. */ #include int vsl_width( int handle, int width ) { ptsin[0] = width; /* Linienbreite */ ptsin[1] = 0; VDI( 16, 1, 0, handle ); return ptsout[0]; /* = set_width: Ausgewhlte Linienbreite */ /* ptsout[1] = 0 */ } /* siehe auch: v_pline..\OUTPUT\V_PLINE.C */ /* * VSM_COLOR (C) Digital Design 1990 * * SET POLYMARKER COLOR INDEX * * Die Farbe der Markierungen wird mit dieser Funktion ausgewhlt. * Wird ein ungltiger Farbindex bergeben, so setzt die Funktion * selbstndig den Index 1 (schwarz). */ #include int vsm_color( int handle, int color_index ) { intin[0] = color_index; /* Farbindex */ VDI( 20, 0, 1, handle ); return intout[0]; /* = set_color: Ausgewhlter Farbindex */ } /* siehe auch: vs_colorVS_COLOR.C */ /* * VSM_HEIGHT (C) Digital Design 1990 * * SET POLYMARKER HEIGHT * * Die Hhe der Markierungen wird mit dieser Funktion bestimmt. * Falls der Wert zu gro ist, wird der nchst kleinere eingesetzt. */ #include int vsm_height( int handle, int height ) { ptsin[0] = 0; ptsin[1] = height; /* Markierungshhe */ VDI( 19, 1, 0, handle ); /* ptsout[0] = Eingestellte Markierungsbreite */ return ptsout[1]; /* = set_height: Eingestellte Markierungshhe */ } /* * VSM_TYPE (C) Digital Design 1990 * * SET POLYMARKER TYPE * * Markierungen mit der Funktion V_PMARKER..\OUTPUT\V_PMARKE.C knnen nicht nur als Punkt, * sondern auch z.B. als Stern oder Kreuz dargestellt werden. * Der Punkt als kleinste Markierungsart kann nicht vergrert werden. * Wird eine ungltige Markierungsart gewhlt, so setzt das VDI stan- * dardmig den Stern (3) ein. * Die Anzahl der Markierungsarten ist unterschiedlich. Die Funktionen * V_OPNWK..\CONTROL\V_OPNWK.C und V_OPNVWK..\CONTROL\V_OPNVWK.C teilen dies in work_out[8] mit. */ #include int vsm_type( int handle, int symbol ) { intin[0] = symbol; /* Markierungstyp: 1 = Punkt * * 2 = Plus-Zeichen * * 3 = Stern * * 4 = Quadrat * * 5 = Diagonal-Kreuz * * 6 = Diamant * * 7 bis n = gerteabhngig */ VDI( 18, 0, 1, handle ); return intout[0]; /* = set_type: Ausgewhlter Markierungstyp */ } /* * VST_ALIGNMENT (C) Digital Design 1991 * * SET GRAPHIC TEXT ALIGNMENT * * Der Text, der mit V_GTEXT..\OUTPUT\V_GTEXT.C sowie V_JUSTIFIED..\OUTPUT\V_JUSTIF.C ausgegeben wird, kann * mit dieser Funktion horizontal und vertikal ausgerichtet werden. */ #include void vst_alignment( int handle, int hor_in, int vert_in, int *hor_out, int *vert_out ) { intin[0] = hor_in; /* horizontale Ausrichtung: * * 0 = linksbndig * * 1 = zentriert * * 2 = rechtsbndig */ intin[1] = vert_in; /* vertikale Ausrichtung: * * 0 = baseline (Untergrenze Zeichenbox) * * 1 = half line (Obergrenze Kleinbuchstaben) * * 2 = ascent line (Obergrenze Zeichen) * * 3 = bottom line (Untergrenze Zeichenbox) * * 4 = descent line (Untergrenze Unterlngen) * * 5 = top line (Obergrenze Zeichenbox) */ VDI( 39, 0, 2, handle ); *hor_out = intout[0]; /* Ausgewhlte horizontale Ausrichtung */ *vert_out = intout[1]; /* Ausgewhlte vertikale Ausrichtung */ } /* * VST_COLOR (C) Digital Design 1990 * * SET GRAPHIC TEXT COLOR INDEX * * Mit dieser Funktion wird die Farbe des Textes eingestellt. */ #include int vst_color( int handle, int color_index ) { intin[0] = color_index; /* Farbindex fr Text */ VDI( 22, 0, 1, handle ); return intout[0]; /* = set_color: Ausgewhlter Farbindex */ } /* siehe auch: vs_colorVS_COLOR.C */ /* * VST_EFFECTS (C) Digital Design 1990 * * SET GRAPHIC TEXT SPECIAL EFFECTS * * Diese Funktion erlaubt eine komfortable Gestaltung des Grafiktextes. */ #include int vst_effects( int handle, int effect ) { intin[0] = effect; /* Bitmuster der Effekte: * * Bit Wertigkeit Schriftart * * 0 1 fett * * 1 2 hell * * 2 4 kursiv * * 3 8 unterstrichen * * 4 16 auseinandergezogen * * 5 32 schattiert */ VDI( 106, 0, 1, handle ); return intout[0]; /* = set_effect: Ausgewhlte Effekte */ } /* * VST_FONT (C) Digital Design 1990 * * SET TEXT FACE * * Mit dieser Funktion wird ein Zeichensatz ausgewhlt. Der Zeichensatz * 1 ist Standard. Alle anderen mssen evnt. mit der Funktion * VST_LOAD_FONTS..\CONTROL\VST_LOAD.C nachgeladen werden. * Diese Funktion ist nicht auf jedem Gert verfgbar. Die Funktionen * V_OPNWK..\CONTROL\V_OPNWK.C und V_OPNVWK..\CONTROL\V_OPNVWK.C teilen dies in work_out[10] mit. */ #include int vst_font( int handle, int font ) { intin[0] = font; /* Zeichensatz-Nummer */ VDI( 21, 0, 1, handle ); return intout[0]; /* = set_font: Ausgewhlter Zeichensatz */ } /* * VST_HEIGHT (C) Digital Design 1990 * * SET CHARACTER HEIGHT, ABSOLUTE MODE * * Diese Funktion ermglicht es, den auszugebenden Grafiktext in der * Hhe zu variieren. Es wird die Zeichenhhe, also der Abstand von der * Zeichengrundlinie bis zum Ende der Zeichen-Box definiert. * Handelt es sich um einen proportionalen Zeichensatz, so beziehen * sich zurckgelieferten Parameter auf das grte Zeichen. */ #include void vst_height( int handle, int height, int *char_width, int *char_height, int *cell_width, int *cell_height ) { ptsin[0] = 0; ptsin[1] = height; /* Zeichenhhe */ VDI( 12, 1, 0, handle ); *char_width = ptsout[0]; /* Aktuelle Zeichenbreite */ *char_height = ptsout[1]; /* Aktuelle Zeichenhhe */ *cell_width = ptsout[2]; /* Aktuelle Zeichenbox-Breite */ *cell_height = ptsout[3]; /* Aktuelle Zeichenbox-Hhe */ } /* siehe auch: vst_pointVST_POIN.C */ /* * VST_POINT (C) Digital Design 1990 * * SET CHARACTER CELL HEIGHT, POINTS MODE * * Jedes Zeichen befindet sich innerhalb einer Box, deren Hhe mit dieser * Funktion eingestellt wird. Die Hhe der Box wird in Druckerschritten * von 1/72 inch angegeben. Die Hhe der Zeichenbox entspricht dem * Abstand zwischen den Grundlinien der Druckzeilen. * Die Funktion gibt die aktuelle Hhe und Breite der Zeichen und * Zeichenbox in NDC/RC-Koordinaten zurck. Bei Proportionalschrift * werden die Mae des grten Zeichens ausgegeben. */ #include int vst_point( int handle, int point, int *char_width, int *char_height, int *cell_width, int *cell_height ) { intin[0] = point; /* Hhe der Zeichenbox (Zeilenabstand) */ VDI( 107, 0, 1, handle ); *char_width = ptsout[0]; /* Aktuelle Zeichenbreite */ *char_height = ptsout[1]; /* Aktuelle Zeichenhhe */ *cell_width = ptsout[2]; /* Aktuelle Zeichenbox-Breite */ *cell_height = ptsout[3]; /* Aktuelle Zeichenbox-Hhe */ return intout[0]; /* = set_point: Ausgewhlte Hhe der Box */ } /* siehe auch: vst_heightVST_HEIG.C */ /* * VST_ROTATION (C) Digital Design 1990 * * SET CHARACTER BASELINE VEKTOR * * Die Grundlinie der Zeichen kann mit dieser Funktion gedreht werden. * Somit kann Text kreuz und quer auf dem Bildschirm oder anderen * Gerten ausgegeben werden. Der Winkel wird in 1/10 Grad gem * folgender Spezifikation angegeben: * 900 * . * . * 1800............0 * . * . * 2700 * Diese Funktion ist nicht auf jedem Gert verfgbar. Die Funktionen * V_OPNWK..\CONTROL\V_OPNWK.C und V_OPNVWK..\CONTROL\V_OPNVWK.C teilen dies in work_ou[36] mit. */ #include int vst_rotation( int handle, int angle ) { intin[0] = angle; /* Winkel der Zeichengrundlinie (0-3600) */ VDI( 13, 0, 1, handle ); return intout[0]; /* = set_baseline: Ausgewhlter Winkel */ } /* * VSWR_MODE (C) Digital Design 1990 * * SET WRITING MODE * * Die von den Grafikoperationen erzeugten Zeichnungen werden im Normal- * fall ohne Rcksicht auf bisher auf dem Arbeitsbereich enthaltene * Zeichnungen ausgegeben. Das heit, da Punkte immer dort gesetzt * werden, wo noch keine gesetzt sind. GEM..\..\GEM bietet mehrere Mglichkeiten, * beim Ausgeben der Grafik bereits vorhandene Grafik zu bercksichtigen. * Nicht nur die Punkte, auch die Farbe der Punkte spielt hier eine * Rolle. Fr die Beschreibung der Zeichenmodi sollen zunchst die * Operatoren fr die Bool'schen Formeln beschrieben werden: * obj = Grafikobjekt (Linie, Fllmuster, Kreis usw.) * col = Farbmaske des Objektes * old = Farbe des bereits gesetzten Punktes * new = resultierende Punktfarbe * Replace-Modus: * Der Replace-Modus setzt die Punkte ohne Rcksicht auf die vorhandene * Grafik. Diese ist der normale Zeichenmodus. * new = col AND obj * Transparent-Modus: * Im Transparent-Modus werden die Punkte nur dort gesetzt, wo noch keine * Punkte vorhanden sind. Weiterhin werden die Punkte der Grafik gelscht, * an die Punkte ohne Farbe gesetzt werden sollen. Dies lt sich an einem * Beispiel besser erklren: Eine ausgefllte Flche soll gezeichnet wer- * den. Ist der Bildschirmbereich leer, so besteht kein Unterschied zwi- * schen Replace- und Transparent-Modus. Ist der Bildschirmbereich jedoch * bereits mit Grafik belegt, so wrde das Fllmuster im Replace-Modus * nicht zu erkennen sein. Ein Fllmuster auf einem Bildschirm, der die * Farbe des Fllmusters hat, ist so im Replace-Modus nicht zu erkennen. * new = (col AND obj) OR (old AND NOT obj) * XOR-Modus: * Im XOR-Modus werden nur dort Punkte gesetzt, wo in der vorhandenen * Grafik keine enthalten sind. Alle bereits gesetzten Punkte an den neuen * Positionen werden gelscht. Die Schnittpunkte einer alten und einer * neuen Linie werden demnach gelscht. * new = obj XOR old * REVERSE TRANSPARENT-MODUS * In diesem Modus bleiben alle berschneidenden Punkte erhalten, fr die * im Objekt keine Farbe zugeordnet ist (z.B. die Lcken einer gestrichel- * ten Linie). Die berschneidenden Punkte, fr die im Objekt eine Farbe * zugeordnet wurde, werden gelscht. Ein auf eine schwarze Flche ge- * zeichnetes Fllmuster im Reverse-Transparent-Modus ist demnach das * Negativ vom entsprechenden Fllmuster im Transparent-Modus. * new = (old AND obj) OR (col AND NOT obj) */ #include int vswr_mode( int handle, int mode ) { intin[0] = mode; /* Zeichenmodus: 1 = Replace * * 2 = Transparent * * 3 = XOR * * 4 = Reverse Transparent */ VDI( 32, 0, 1, handle ); return intout[0]; /* = set_mode: Ausgewhlter Zeichenmodus */ } /* * VS_COLOR (C) Digital Design 1990 * * SET COLOR REPRESENTATION * * Die Farben knnen beliebig aus den Grundfarben rot, grn und blau * (RGB) gemischt werden. Jedem Farbindex wird eine Farbintensitt fr * die drei Farben zwischen 0 und 1000 zugeordnet. */ #include void vs_color( int handle, int index, int rgb_in[3] ) { intin[0] = index; /* Farbindex */ intin[1] = rgb_in[0]; /* Rot-Intensitt (0-1000) */ intin[2] = rgb_in[1]; /* Grn-Intensitt (0-1000) */ intin[3] = rgb_in[2]; /* Blau-Intensitt (0-1000) */ VDI( 14, 0, 4, handle ); } /* siehe auch: vq_color..\INQUIRE\VQ_COLOR.C */ . ME.. (ECONTROL HLP b5VST_LOADC VST_UNLOC VS_CLIP C erTV_CLRWK C V_CLSVWKC wV_CLSWK C :V_OPNVWKC #sTV_OPNWK C rT9V_UPDWK C b5READ_ME TXT! Kontrollfunktionen Alle VDI-Applikationen mssen sich beim System ordentlich anmelden, damit die vorhandenen Resourcen einwandfrei bereitgestellt werden knnen. v_clrwkV_CLRWK.C Reinitialisierung einer Arbeitsstation. v_clswkV_CLSWK.C Physikalische Arbeitstation (Drucker etc.) abmelden. v_clsvwkV_CLSWK.C Virtuelle Arbeitstation (Bildschirm) abmelden. v_opnwkV_OPNWK.C Physikalische Arbeitstation (Drucker etc.) anmelden. v_opnvwkV_OPNVWK.C Virtuelle Arbeitstation (Bildschirm) anmelden. v_updwkV_UPDWK.C Befehle im Puffer eines Ein-/Ausgabegerts sofort ausfhren. vs_clipVS_CLIP.C Arbeitsbereich auf einen Teil des Bildschirms be- schrnken. vst_load_fontsVST_LOAD.C Zustzliche Zeichenstze laden. vst_unload_fontsVST_UNLO.C Speicherplatz, den zustzliche Zeichenstze belegt haben, freigeben. /* * VST_LOAD_FONTS (C) Digital Design 1990 * * Jeder Gertetreiber enthlt eine Information, die besagt, wieviel * Zeichenstze das Gert beherrscht. Diese Funktion beschafft diese * Information und stellt die Zeichenstze gleichzeitig zur Verfgung. * Wenn die Zeichenstze bereits angefordert worden oder keine zustz- * lichen Zeichenstze verfgbar sind, wird eine Null zurckgegeben. */ #include int vst_load_fonts( int handle, int select ) { intin[0] = select; /* reserviert fr knftige Anwendung (1) */ VDI( 119, 0, 1, handle ); return intout[0]; /* Anzahl der zustzlichen Zeichenstze */ } /* siehe auch: VST_UNLOAD_FONTSVST_UNLO.C VST_FONT..\ATTRIB\VST_FONT.C */ /* * VST_UNLOAD_FONTS (C) Digital Design 1990 * * Diese Funktion gibt den Speicherplatz der zustzlich geladenen * Zeichenstze wieder frei. Wenn die Zeichenstze auch fr andere * virtuelle Gerte mit gleicher Gertekennung verfgbar sind, so * mssen entweder alle virtuellen Gerte geschlossen oder diese * Funktion mu fr jedes virtuelle Gert ausgefhrt werden. * Die Standardzeichenstze bleiben selbstverstndlich erhalten. */ #include void vst_unload_fonts( int handle, int select ) { intin[0] = select; /* reserviert */ VDI( 120, 0, 1, handle ); } /* siehe auch: VST_LOAD_FONTSVST_LOAD.C */ /* * VS_CLIP (C) Digital Design 1991 * * SET CLIPPING RECTANGLE * * GEM erlaubt es, alle Grafikoperationen auf einen Bildschirmausschnitt * zu begrenzen. Alles, was ber diesen definierten Abschnitt hinausragt, * wird "abgeschnitten". Der Ausschnitt wird ebenfalls mit dieser Funk- * tion wieder ausgeschaltet. Der Funktion mssen die beiden gegenber- * liegenden Eckpunkte des "Fensters" bergeben werden. */ #include void vs_clip( int handle, int clip_flag, int *pxyarray ) { intin[0] = clip_flag; /* 0 = Ausschnitt aus * * 1 = Ausschnitt ein */ vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate des Eckpunktes * * pxyarray[1] = y-Koordinate des Eckpunktes * * pxyarray[2] = x-Koordinate des Eckpunktes * * diagonal gegenber * * pxyarray[3] = y-Koordinate des Eckpunktes * * diagonal gegenber */ VDI( 129, 2, 1, handle ); vdipb[2] = ptsin; } /* * V_CLRWK (C) Digital Design 1990 * * CLEAR WORKSTATION * * Der Aufruf dieser Funktion lscht den Bildschirm oder fhrt einen * Seitenvorschub auf dem Drucker oder Plotter durch. Bei einem Metafile * wird lediglich der Opcode gespeichert. * Nach dem ffnen des Arbeitsgertes wird die Funktion automatisch * ausgefhrt. */ #include void v_clrwk( int handle ) { VDI( 3, 0, 0, handle ); } /* * V_CLSVWK (C) Digital Design 1990 * * CLOSE VIRTUAL SCREEN WORKSTATION * * Diese Funktion schliet das virtuelle Arbeitsgert. * Ausgaben auf dieses Gert sind dann nicht mehr mglich. */ #include void v_clsvwk( int handle ) { VDI( 101, 0, 0, handle ); } /* siehe auch: V_OPNVWKV_OPNVWK.C */ /* * V_CLSWK (C) Digital Design 1990 * * CLOSE WORKSTATION * * Diese Funktion schliet das mit V_OPNWKV_OPNWK.C geffnete Arbeitsgert. Bevor * das mit V_OPNWKV_OPNWK.C geffnete Gert wieder geschlossen wird, mssen alle * virtuellen Gerte (mit V_OPNVWKV_OPNVWK.C geffnet) mit V_CLSVWKV_CLSVWK.C geschlossen * werden. * Ist das AES aktiv, so ist diese Funktion fr den Bildschirm nicht * einsetzbar. */ #include void v_clswk( int handle ) { VDI( 2, 0, 0, handle ); } /* * V_OPNVWK (C) Digital Design 1991 * * OPEN VIRTUAL SCREEN WORKSTATION * * Diese Funktion ist fr alle Anwendungen erforderlich, die den Bild- * schirm ansprechen sollen. */ #include void v_opnvwk( int work_in[11], int *handle, int work_out[57] ) { vdipb[1] = work_in; /* Inhalt des Feldes siehe V_OPNWKV_OPNWK.C */ vdipb[3] = work_out; vdipb[4] = work_out + 45; VDI( 100, 0, 11, *handle ); /* *handle = Handle der physischen * * Arbeitsstation. Bei Nutzung des AES * * ist diese mit der Funktion GRAF_HANDLE..\..\AES\GRAF\GRAF_HAN.C * * zu bestimmen. */ vdipb[1] = intin; vdipb[3] = intout; vdipb[4] = ptsout; *handle = contrl[6]; /* Handle der virtuellen Arbeitsstation, die bei * * allen folgenden VDI-Aufrufen angegeben * * werden mu. */ /* Inhalt des work_out-Feldes siehe V_OPNWKV_OPNWK.C */ } /* siehe auch: V_CLSVWKV_CLSVWK.C */ /* * V_OPNWK (C) Digital Design 1991 * * OPEN WORKSTATION * * Diese Funktion ldt den Gertetreiber fr ein bestimmtes Ein/Ausgabe- * gert. Das Ein/Ausgabegert wird mit den Parametern im Eingabe- * Array initialisiert. Das Ausgabe-Array bermittelt nhere Informa- * tionen zu dem Gert. Weiterhin bergibt diese Funktion dem Programm * eine Gertekennung. * Falls das Gert aus welchen Grnden auch immer nicht geffnet werden * kann, ist die Gertekennung Null. */ #include void v_opnwk( int work_in[103], int *handle, int work_out[57] ) { vdipb[1] = work_in; /* Inhalt des Feldelementes Nummer * * 0: Gerte-Identifikation, gibt den zu ladenden * * Gertetreiber an * * 1: Linientyp * * 2: Linienfarbe * * 3: Markierungstyp * * 4: Markierungsfarbe * * 5: Zeichensatz * * 6: Schriftfarbe * * 7: Flltyp * * 8: Fllmuster * * 9: Fllfarbe * * 10: Koordinatenflag: * * 0 = Normalkoordinaten * * 1 = reserviert * * 2 = Rasterkoordinaten */ vdipb[3] = work_out; vdipb[4] = work_out + 45; VDI( 1, 0, 103, *handle ); vdipb[1] = intin; vdipb[3] = intout; vdipb[4] = ptsout; *handle = contrl[6]; /* Inhalt von work_out-Nummer * * 0: Rasterbreite des Gertes in Punkte oder Schritte * * 1: Rasterhhe des Gertes in Punkte oder Schritte * * 2: 0 * * 3: Breite eines Punktes oder Plotterschrittes in mm/1000 * * 4: Hhe eines Punktes oder Plotterschrittes in mm/1000 * * 5: Anzahl der verschiedenen Schriftgren (0 = unbegrenzt) * * 6: Anzahl der Linientypen * * 7: Anzahl der Linienbreiten (0 = unbegrenzt) * * 8: Anzahl der Markierungsarten * * 9: Anzahl der Markierungsgren (0 = unbegrenzt) * * 10: Anzahl der Zeichenstze des Gertes * * 11: Anzahl der Muster * * 12: Anzahl der Schraffier-Arten * * 13: Anzahl der Farben (2 bei Monochrom-Monitor) * * 14: Anzahl der Grafik-Grundfunktionen * * 15-24: Sequentielle Liste der untersttzten Grafik-Grundfunktionen.* * Eine -1 kennzeichnet das Ende der Liste: * * 1 = Balken * * 2 = Bogen * * 3 = Kreissegment * * 4 = Kreis * * 5 = Ellipse * * 6 = elliptischer Bogen * * 7 = Ellipsensegment * * 8 = abgerundetes Rechteck * * 9 = geflltes abgerundetes Rechteck * * 10 = justierter Grafiktext * * 25-34: sequentielle Liste der Attribute der Grundfunktionen: * * 0 = Linienoperation * * 1 = Markierungsoperation * * 2 = Text * * 3 = ausgefllter Bereich * * 4 = kein Attribut * * 35: Flag Farbdarstellung: 0 = nicht verfgbar * * 1 = verfgbar * * 36: Flag fr Textrotation: 0 = nicht verfgbar * * 1 = verfgbar * * 37: Flag ausgefllte Bereiche: 0 = nicht verfgbar * * 1 = verfgbar * * 38: Flag Funktion v_cellarray: 0 = nicht verfgbar * * 1 = verfgbar * * 39: Anzahl der verfgbaren Farben: 0 = mehr als 32767 Farben * * 1 = monochrom * * >2 = Anzahl der Farben * * 40: Grafikcursor-Kontrolle: * * 1 = nur ber Tastatur * * 2 = ber Tastatur und ein anderes Gert (Mouse) * * 41: wertverndernde Eingaben: 1 = ber Tastatur * * 2 = anderes Gert * * 42: Auswahltasten: 1 = Funktionstasten * * 2 = anderes Tastenfeld * * 43: alphanumerische Eingabe: 1 = Tastatur * * 44: Art des Arbeitsgertes: 0 = Ausgabegert * * 1 = Eingabegert * * 2 = Ein/Ausgabegert * * 3 = reserviert * * 4 = Metafile-Ausgabe * * 45: minimale Zeichenbreite * * 46: minimale Zeichenhhe * * 47: maximale Zeichenbreite * * 48: maximale Zeichenhhe * * 49: minimale Zeilenbreite * * 50: 0 * * 51: maximale Zeilenbreite * * 52: 0 * * 53: minimale Markierungsbreite * * 54: minimale Markierungshhe * * 55: maximale Markierungsbreite * * 56: maximale Markierungshhe */ } /* siehe auch: V_CLSWKV_CLSWK.C */ /* * V_UPDWK (C) Digital Design 1991 * * UPDATE WORKSTATION * * "UPDATE WORKSTATION" wird bentigt, um einem Ein-/Ausgabegert mit- * zuteilen, alle gepufferten Graphikkommandos auszufhren. Auf einem * Bildschirm wird diese Funktion nicht bentigt, da die Graphikkoman- * dos hier umgehend ausgefhrt werden. * So speichern beispielsweise Druckertreiber die Kommandos in einem * Puffer (wird beim Druckertreiber auch Display-List genannt). Die * Ausgabe ber diese Gerte erfolgt erst nach Aufruf der "UPDATE * WORKSTATION"-Funktion. Ist der Buffer fr das Ausgabegert geleert, * kehrt die "UPDATE WORKSTATION"-Funktion zurck. Zu beachten ist * hierbei, da bei einem Drucker kein Seitenvorschub gegeben wird. * * Zustzliche Funktion fr Druckertreiber: Statt der aktuellen Seite * kann ein eigener Buffer auf dem Drucker ausgegeben werden: * * *(void **)intin = [Anfangsadresse des Buffers]; * VDI( 4, 1, 1, handle ); // contrl[1] = 1: Buffer nicht lschen * * Zustzliche Funktion fr den ATARI-Page-Printer (SLM 804): * In intout[0] wird der Status des Druckers zurckgeliefert: * * 0 = NO ERROR * 2 = PRINTER NOT READY * 3 = TONER EMPTY * 4 = WARM UP * 5 = PAPER EMPTY * 6 = DRUM EMPTY * 7 = INPUT JAM * 8 = THROUGH JAM * 9 = OUTPUT JAM * 10 = COVER OPEN * 11 = FUSER MALFUNCTION * 12 = IMAGER MALFUNCTION * 13 = MOTOR MALFUNCTION * 14 = VIDEO MALFUNCTION * 16 = SYSTEM TIMEOUT */ #include void v_updwk( int handle ) { VDI( 4, 0, 0, handle ); } . ]E.. (EESCAPE HLP y V_BIT_IMC vq1READ_ME TXT! Escapefunktionen Mit den Escapefunktionen wird es einem Anwenderprogramm ermglicht, auf spezielle Eigenschaften einer Arbeitsstation zuzugreifen. Textfunktionen: v_curaddressV_CURADD.C Textcursor in Reihe und Spalte positionieren. v_curdownV_CURDOW.C Textcursor eine Zeile nach unten bewegen. v_currightV_CURRIG.C Textcursor eine Spalte nach rechts bewegen. v_curleftV_CURLEF.C Textcursor eine Spalte nach links bewegen. v_curhomeV_CURHOM.C Textcursor in die linke obere Ecke bewegen. v_curtextV_CURTEX.C Text ab Textcursorposition ausgeben. v_curupV_CURUP.C Textcursor eine Zeile nach oben bewegen. v_eeolV_EEOL.C Bildschirm ab Textcursor bis Zeilenende lschen. v_eeosV_EEOS.C Bildschirm ab Textcursor bis Bildschirmende lschen. v_enter_curV_ENTER_.C Textmodus einschalten. v_exit_curV_EXIT_C.C Textmodus verlassen. v_rvonV_RVON.C Inverse Darstellung einschalten. v_rvoffV_RVOFF.C Inverse Darstellung abschalten. vq_chcellsVQ_CHCEL.C Zeilen und Spalten des Textbildschirms ermitteln. vq_curaddressVQ_CURAD.C Zeile und Spalte des Textcursors ermitteln. Grafikspezialfunktionen: v_bit_imageV_BIT_IM.C Bildinformationen auf Drucker ausgeben. v_clear_disp_listV_CLEAR_.C Druckpuffer lschen. v_dspcurV_DSPCUR.C Grafikcursor versetzen. v_form_advV_FORM_A.C Seitenvorschub auf Drucker durchfhren. v_hardcopyV_HARDCO.C Hardcopy auf Drucker ausgeben. v_output_windowV_OUTPUT.C Bildschirmbereich auf Drucker ausgeben. v_rmcurV_RMCUR.C Letzten Grafikcursor lschen. vq_tabstatusVQ_TABST.C Verfgbarkeit eines Grafiktabletts, Maus, usw. abfragen. vs_paletteVS_PALET.C Auswahl der Farbpalette. Polaroid-Camera: vqp_errorVQP_ERRO.C Fehlercodes des Polaroid-Treibers abfragen. vqp_filmsVQP_FILM.C Verfgbare Filmtypen ermitteln. vqp_stateVQP_STAT.C Status des Polaroid-Treibers ermitteln. vsp_messageVSP_MESS.C Fehlermeldungen des Polaroid-Treibers unterdrcken oder zulassen. vsp_saveVSP_SAVE.C Einstellung des Polaroid-Treibers sichern. vsp_stateVSP_STAT.C Polaroid-Treiber neu einstellen. Metafiles: v_meta_extentsV_META_E.C Dimensionen eines Metafiles berechnen. v_write_metaV_WRITE_.C Grafik-Pimitive in Metafile ablegen. vm_filenameVM_FILEN.C Metafile umbenennen. Spezialfunktionen: v_fontinitV_FONTIN.C Eigenen Systemzeichensatz auswhlen. v_offsetV_OFFSET.C Abstand zum linken Bildschirmrand festlegen. /* * V_BIT_IMAGE (C) Digital Design 1991 * * OUTPUT BIT IMAGE FILE * * Die Funktion "OUTPUT BIT IMAGE FILE" kann nur in Verbindung mit * einem Drucker benutzt werden. Mit "OUTPUT BIT IMAGE FILE" kann * die in einem entsprechenden File abgespeicherte Bild-Information * gelesen und auf dem Drucker ausgegeben werden. */ #include void v_bit_image( int handle, char *filename, int aspect, int x_scale, int y_scale, int h_align, int v_align, int *xyarray ) { int *pintin; char *pstring; vdipb[2] = xyarray; /* xyarray[0] = x-Koordinate der oberen linken * * Ecke des Ausgaberechtecks * * xyarray[1] = y-Koordinate der oberen linken * * Ecke des Ausgaberechtecks * * xyarray[2] = x-Koordinate der unteren rechten * * Ecke des Ausgaberechtecks * * xyarray[3] = y-Koordinate der unteren rechten * * Ecke des Ausgaberechtecks */ pintin = intin; *pintin++ = aspect; /* Aspect Ratio (Abbildungsmastab) * * 0 = Aspect Ratio wird ignoriert * * 1 = Pixel werden bercksichtigt (z.B. Kreise * * werden wieder auf Kreise abgebildet) */ *pintin++ = x_scale; /* Skalierung der X-Achse * * 0 = gebrochen, 1 = ganzzahlig */ *pintin++ = y_scale; /* Skalierung der Y-Achse * * 0 = gebrochen, 1 = ganzzahlig */ *pintin++ = h_align; /* Horizontale Ausrichtung * * 0 = links, 1 = zentriert, 2 = rechts */ *pintin++ = v_align; /* Vertikale Ausrichtung * * 0 = oben, 1 = zentriert, 2 = unten */ pstring = filename; while ((*pintin++ = (unsigned char)*pstring++) != 0); contrl[5] = 23; VDI( 5, 2, (int)(pstring - filename + 4), handle ); vdipb[2] = ptsin; } . cE.. (EINPUT HLP y2VEX_BUTVC VEX_CURVC VEX_MOTVC {VEX_TIMVC VQ_KEY_SC sVQ_MOUSEC s VRQ_CHOIC $VRQ_LOCAC OeVRQ_STRIC VRQ_VALUC _VSC_FORMC sVSIN_MODC scVSM_CHOIC VSM_LOCAC  VSM_STRIC H0VSM_VALUC bV_HIDE_CC _V_SHOW_CC _READ_ME TXT! Eingabefunktionen Die Eingabefunktionen dienen der Interaktion zwischen Betriebssystem und Anwenderprogramm. Sie lassen sich in zwei verschiedenen Modi be- treiben: REQUEST-Modus: Es wird nach Aufruf einer der Funktionen solange gewartet, bis das entsprechende Ereignis ein- tritt. SAMPLE-Modus: Es wird lediglich der Status des Gertes ber- prft, danach kehrt die Funktion sofort wieder zurck. Hier nun eine Auflistung der Eingabefunktionen: v_hide_cV_HIDE_C.C Grafikcursor abschalten. v_show_cV_SHOW_C.C Grafikcursor darstellen. vex_butvVEX_BUTV.C Serviceroutine fr Maustasteninterrupt verlegen. vex_curvVEX_CURV.C Mauszeiger selbst zeichnen. vex_motvVEX_MOTV.C Serviceroutine fr Mausbewegungsinterrupt verlegen. vex_timvVEX_TIMV.C Serviceroutine des Timerinterrupts verlegen. vq_key_sVQ_KEY_S.C Tastaturstatus abfragen. vq_mouseVQ_MOUSE.C Position des Grafikcursors ermitteln. vrq_choiceVRQ_CHOI.C Tastendruck abwarten (REQUEST). vrq_locatorVRQ_LOCA.C Position des Grafikcursor ermitteln (REQUEST). vrq_stringVRQ_STRI.C String von Tastatur einlesen (REQUEST). vrq_valuatorVRQ_VALU.C berwachung von Eingabegerten (REQUEST). vsc_formVSC_FORM.C Grafikcursor definieren. vsin_modeVSIN_MOD.C Umschalten zwischen REQUEST- und SAMPLE-Modus. vsm_choiceVSM_CHOI.C Ermittelt die zuletzt gedrckte Taste (SAMPLE). vsm_locatorVSM_LOCA.C Position des Grafikcursor ermitteln (SAMPLE). vsm_stringVSM_STRI.C String von Tastatur einlesen (SAMPLE). vsm_valuatorVSM_VALU.C Ermittlung des Status von Eingabegerten (SAMPLE). /* * VEX_BUTV (C) Digital Design 1990 * * EXCHANGE BUTTON CHANGE VECTOR * * Diese Funktion bewirkt, da bei Bettigung der Maustaste zu einer * definierten Adresse gesprungen wird. An dieser Adresse befindet sich * in der Regel eine Routine, die auf den Druck der Maustaste reagiert. * Die Funktion gibt weiterhin die Adresse der bisherigen Mausroutine * zurck. * Das Setzen und Rcksetzen der Register mu vom Programm selbst * sichergestellt sein. * Der gedrckte Mausknopf kann von der Mausroutine aus einem * Prozessorregister gelesen werden. */ #include void vex_butv( int handle, int (*pusrcode)(), int (**psavcode)() ) { *(int (**)())(contrl + 7) = pusrcode; /* Adresse der neuen * * Mausknopfroutine */ VDI( 125, 0, 0, handle ); *psavcode = *(int (**)())(contrl + 9); /* Adresse der alten * * Mausknopfroutine */ }/* * VEX_CURV (C) Digital Design 1990 * * EXCHANGE CURSOR CHANGE VECTOR * * Diese Funktion bewirkt, da zu einer definierten Adresse gesprungen * wird, wenn der Cursor auf dem Bildschirm gendert wurde. Der Funktion * wird eine Adresse bergeben, zu der VDI..\VDI.HLP bei Vernderung der Grafik- * cursor-Position springen soll. Vor Verzweigung zu dieser Routine * wird die neue x/y-Position des Cursors berechnet und aktualisiert. * Die Funktion gibt die Adresse der bisherigen Routine zurck. * Das Setzen und Zurcksetzen der Register mu vom Programm selbst * sichergestellt sein. * Die neue x/y-Position des Cursors kann aus Prozessorregistern * ausgelesen werden. */ #include void vex_curv( int handle, int (*pusrcode)(), int (**psavcode)() ) { *(int (**)())(contrl + 7) = pusrcode; /* Adresse der neuen * * Grafikcursor-Routine */ VDI( 127, 0, 0, handle ); *psavcode = *(int (**)())(contrl + 9); /* Adresse der alten * * Grafikcursor-Routine */ }/* * VEX_MOTV (C) Digital Design 1990 * * EXCHANGE MOUSE MOVEMENT VECTOR * * Mit Hilfe dieser Funktion knnen die Aktionen der Maus umfangreicher * verwaltet werden. Der Routine wird eine Adresse bergeben, zu der * VDI bei Bewegung der Maus springen soll. Vor Verzweigung zu dieser * Mausroutine wird die neue x/y-Position des Cursors berechnet, jedoch * noch nicht aktualisiert. * Die Funktion gibt die Adresse der bisherigen Mausroutine zurck. * Das Setzen und Zurcksetzen der Register mu vom Programm selbst * sichergestellt sein. * Die neue x/y-Position des - noch unsichtbaren - Cursors kann aus * Prozessorregistern ausgelesen, aber auch gendert werden. Erst nach * Rcksprung zum VDI..\VDI.HLP wird diese Position als aktuelle Position * gespeichert. */ #include void vex_motv( int handle, int (*pusrcode)(), int (**psavcode)() ) { *(int (**)())(contrl + 7) = pusrcode; /* Adresse der neuen * * Mausbewegungsroutine */ VDI( 126, 0, 0, handle ); *psavcode = *(int (**)())(contrl + 9); /* Adresse der alten * * Mausbewegungsroutine */ }/* * VEX_TIMV (C) Digital Design 1990 * * EXCHANGE TIMER INTERRUPT VECTOR * * Mit dieser Funktion kann der Interrupt des Systems auf eine eigene * Routine gelegt werden. Der Funktion wird die Adresse der eigenen * Interruptroutine im 32-Bit-Format bergeben Die Funktion gibt dann * die alte Interruptadresse und den Intervall des Interruptaufrufs * in Millisekunden zurck. * Die eigene Interruptroutine mu selbst fr die Sicherstellung der * Register und den Rcksprung zum System sorgen. Der Systeminterrupt * wird wieder aktiviert, indem wieder die alte Interruptadresse * gesetzt wird. */ #include void vex_timv( int handle, int (*tim_addr)(), int (**otim_addr)(), int *tim_conv ) { *(int (**)())(contrl + 7) = tim_addr; /* Adresse der neuen * * Interrupt-Routine */ VDI( 118, 0, 0, handle ); *otim_addr = *(int (**)())(contrl + 9); /* Adresse der alten * * Interrupt-Routine */ *tim_conv = intout[0]; /* Interrupt-Intervall in Millisekunden */ }/* * VQ_KEY_S (C) Digital Design 1990 * * SAMPLE KEYBOARD STATE INFORMATION * * Diese Funktion stellt fest, welche der vier Status-Tasten gedrckt * sind. */ #include void vq_key_s( int handle, int *pstatus ) { VDI( 128, 0, 0, handle ); *pstatus = intout[0]; /* Tastatur-Status: * * Bit: Wert: Taste: * * 0 1 rechte SHIFT-Taste * * 1 2 linke SHIFT-Taste * * 2 4 CONTROL-Taste * * 3 8 ALT-Taste * * Bit = 1: Taste gedrckt * * Bit = 0: Taste nicht gedrckt */ } /* * VQ_MOUSE (C) Digital Design 1990 * * SAMPLE MOUSE BUTTON STATE * * Diese Funktion wird zur Ermittlung der gedrckten Maus-Taste * eingesetzt. Weiterhin gibt sie die aktuelle Position des Grafik- * cursors zurck. */ #include void vq_mouse( int handle, int *pstatus, int *x, int *y ) { VDI( 124, 0, 0, handle ); *pstatus = intout[0]; /* Status der Maustaste: * * 0 = Taste nicht gedrckt * * 1 = Taste gedrckt */ *x = ptsout[0]; /* x-Position des Grafikcursors */ *y = ptsout[1]; /* y-Position des Grafikcursors */ } /* * VRQ_CHOICE (C) Digital Design 1990 * * INPUT CHOICE, REQUEST MODE * * Diese Funktion erwartet die Aktion einer Auswahl- (Funktions-)Taste. * Wird keine gltige Funktionstaste gedrckt, so gibt die Funktion den * ASCII-Wert der "falschen" Taste zurck. Ansonsten wird die Nummer * der Auswahltaste zurckgegeben. */ #include void vrq_choice( int handle, int ch_in, int *ch_out ) { intin[0] = ch_in; /* initialisierende Auswahlnummer (1-10) */ VDI( 30, 0, 1, handle ); *ch_out = intout[0]; /* bettigte Auswahltaste (1-10) */ } /* siehe auch: vsm_choiceVSM_CHOI.C, vsin_modeVSIN_MOD.C */ /* * VRQ_LOCATOR (C) Digital Design 1990 * * INPUT LOCATOR, REQUEST MODE * * Diese Funktion ermittelt die Position des Grafikcursors. Da sie im * request-Mode arbeitet, gibt sie die Position erst zurck, wenn eine * Taste gedrckt wird. * Whrend des Aufrufes der Funktion wird der Cursor unabhngig vom * Zustand auf jeden Fall an der spezifizierten Stelle sichtbar. * Diese Funktion wird immer dann in Programmen eingesetzt, wenn der * Anwender eine Stelle auf dem Bildschirm markieren soll. * Da die Funktion mit jeder beliebigen Taste beendet wird, mu der * Programmierer selbst die Kontrolle ber eine bedingte Abbruchtaste * bernehmen. Das heit, er ruft die Funktion immer wieder auf, bis * "seine" Taste gedrckt wird. */ #include void vrq_locator( int handle, int x, int y, int *xout, int *yout, int *term ) { ptsin[0] = x; /* initialisierende Position des Grafikcursors * * (x-Koordinate) */ ptsin[1] = y; /* initialisierende Position des Grafikcursors * * (y-Koordinate) */ VDI( 28, 1, 0, handle ); *term = intout[0]; /* Funktions-Ende-Taste: * * Im Low-Byte dieses Parameters wird der ASCII- * * Code der Taste eingetragen, die die Positionie- * * rung abschliet (z.B. RETURN = 13). * * Spezielle Ende-Tasten sind z.B. die beiden * * Maus-Knpfe oder Tasten eines Grafiktabletts. * * Der Code dieser Tasten beginnt ab 20h (32). Die * * linke Taste der Maus hat den Code 20h (32), die * * rechte 21h (33). */ *xout = ptsout[0]; /* ermittelte x-Position */ *yout = ptsout[1]; /* ermittelte y-Position */ } /* siehe auch: vsm_locatorVSM_LOCA.C, vsin_modeVSIN_MOD.C */ /* * VRQ_STRING (C) Digital Design 1990 * * INPUT STRING, REQUEST MODE * * Diese Funktion liest einen String von der Tastatur. Als Endekriterium * gilt die Taste RETURN (ASCII 13) oder das Erreichen der maximalen * Stringlnge. * Bei eingeschaltetem Echo-Modus werden die von der Tastatur eingege- * benen Zeichen zustzlich auf dem Bildschirm in einen spezifizierten * Bereich ausgegeben. Alle Attribute-Funktionen fr Text haben auch in * diesem Echo-Modus Gltigkeit. * Wenn die maximale Stringlnge negativ ist, so wird im intout-Array * der 2-Byte-Code der VDI..\VDI.HLP-Standard-Tastatur (siehe Anhang) angelegt. */ #include void vrq_string( int handle, int max_length, int echo_mode, int echo_xy[2], char *string ) { intin[0] = max_length; /* maximale Stringlnge */ intin[1] = echo_mode; /* Echo-Modus: * * 0 = Echo-Modus ausgeschaltet * * 1 = Echo-Modus eingeschaltet */ ptsin[0] = echo_xy[0]; /* x-Koordinate des Echo-Bereiches */ ptsin[1] = echo_xy[1]; /* y-Koordinate des Echo-Bereiches */ VDI( 31, 1, 2, handle ); string[max_length] = 0; /* eingegebener String */ while (max_length-- > 0) string[max_length] = intout[max_length]; } /* siehe auch: vsm_stringVSM_STRI.C, vsin_modeVSIN_MOD.C */ /* * VRQ_VALUATOR (C) Digital Design 1990 * * INPUT VALUATOR, REQUEST MODE * * Diese Funktion verwaltet die logische Eingabeeinheit zur Wertvern- * derung. Die CURSOR-OBEN- und CURSOR-UNTEN-Taste z.B. sind die Stan- * dardtasten zur wertverndernden Eingabe. Es wird stets ein Wert zwi- * schen 1 und 100 zurckgegeben, je nach bettigter Taste oder Tasten- * kombination. Fr die Cursor-Tasten gilt die folgende Vereinbarung: * CURSOR-OBEN Wert+10 * CURSOR-UNTEN Wert-10 * SHIFT/CURSOR-OBEN Wert+1 * SHIFT/CURSOR-UNTEN Wert-1 */ #include void vrq_valuator( int handle, int valuator_in, int *valuator_out, int *terminator ) { intin[0] = valuator_in; /* initialisierender Wert */ VDI( 29, 0, 1, handle ); *valuator_out = intout[0]; /* ermittelter Wert */ *terminator = intout[1]; /* bettigte Taste */ } /* siehe auch: vsm_valuatorVSM_VALU.C, vsin_modeVSIN_MOD.C */ /* * VSC_FORM (C) Digital Design 1990 * * SET MOUSE FORM * * Diese Funktion definiert eine neue Form des Grafikcursors. Das Raster * des Cursors ist 16 * 16 Punkte und wird in zwei Arrays von 16 Worten * definiert. Das Bit 15 des ersten Wortes ist der obere linke Punkt der * Cursordefinition. Das erste Array, die Cursormaske, kennzeichnet die * Cursorform ohne Farbinformation. Im zweiten Array werden die Punkte * auf 1 gesetzt, die in der Vordergrundfarbe erscheinen sollen. * Weiterhin wird ein Aktionspunkt innerhalb der Cursorform angegeben. * Dieser Punkt bestimmt die exakte Position des Cursors. Die Spitze des * Standard-Cursorpfeils z.B. ist der Aktionspunkt dieses Cursors. Der * Aktionspunkt wird relativ zur oberen linken Ecke des Cursorrasters * adressiert. */ #include void vsc_form( int handle, int *pcur_form ) { vdipb[1] = pcur_form; /* Inhalt des Elementes Nummer * * 0: x-Koordinate des Aktionspunktes * * 1: y-Koordinate des Aktionspunktes * * 2: reserviert fr knftige Anwendung * * (mu auf 1 gesetzt werden) * * 3: Farbindex Maske (normal 0) * * 4: Farbindex Cursorform (normal 1) * * 5-20: 16-Wort-Gruppe der Maske * * 21-36: 16-Wort-Gruppe der Cursorform */ VDI( 111, 0, 37, handle ); vdipb[1] = intin; } /* * VSIN_MODE (C) Digital Design 1990 * * SET INPUT MODE * * Diese Funktion bestimmt den Modus der logischen Eingabeeinheiten. * VDI untersttzt vier spezifizierte Eingabeeinheiten: * - POSITIONSEINGABEN werden in der Standardkonfiguration mit der * Maus oder den Cursor-Tasten zur Steuerung des Grafikcursors * gemacht. * - WERTVERNDERNDE EINGABEN werden mit den Cursortasten "oben" und * "unten" vorgenommen. Diese Tasten bewirken lediglich den Wert, den * die Funktion zurckgibt. * - Die logische AUSWAHLEINHEIT sind die Funktionstasten. Es wird eine * Auswahlnummer ermittelt, die der bettigten Funktionstaste ent- * spricht. * - STRINGEINGABE erfolgt ber die Tastatur. * Diese Funktion legt den Modus fest, in dem die Funktionen der logi- * schen Eingabeeinheiten arbeiten sollen (request oder sample). */ #include int vsin_mode( int handle, int dev_type, int mode ) { intin[0] = dev_type; /* logisches Eingabegert: * * 1 = Positions-Eingabegert * * 2 = Wert-Eingabegert * * 3 = Auswahl-Eingabegert * * 4 = String-Eingabegert */ intin[1] = mode; /* Eingabemodus: 1 = request-Modus * * 2 = sample-Modus */ VDI( 33, 0, 2, handle ); return intout[0]; /* = set_mode: Ausgewhlter Eingabemodus */ } /* * VSM_CHOICE (C) Digital Design 1990 * * INPUT CHOICE, SAMPLE MODE * * Die Funktion ermittelt die zuletzt bettigte Auswahl- (Funktions-) * Taste. Wurde keine gltige Funktionstaste gedrckt, so wird der * ASCII-Code der ungltigen Taste zurckgegeben. */ #include int vsm_choice( int handle, int *choice ) { VDI( 30, 0, 0, handle ); *choice = intout[0]; /* bettigte Auswahltaste (1-10) oder ASCII-Code * * der ungltigen Taste */ return contrl[4]; /* 0 = keine Taste wurde bettigt * * 1 = Taste wurde bettigt */ } /* siehe auch: vrq_choiceVRQ_CHOI.C, vsin_modeVSIN_MOD.C */ /* * VSM_LOCATOR (C) Digital Design 1990 * * INPUT LOCATOR, SAMPLE MODE * * Der Grafikcursor wird von einem Interrupt gesteuert. Das heit, das * Programm mu die Bewegung des Cursors nicht koordinieren. Der Anwen- * der kann den Cursor bewegen, auch wenn das Programm gerade mit * Anderem beschftigt ist. Diese Funktion nun ermglicht jederzeit * festzustellen, was sich in der Zwischenzeit getan hat. Der Funktion * wird eine initialisierende Koordinate bergeben. Die Funktion gibt * dann zurck, ob die Koordinaten, also die Position des Grafikcursors, * gendert wurde und ob eine Taste bettigt wurde. Die entsprechende * genderte Position und die bettigte Taste werden selbstverstndlich * auch bermittelt. */ #include int vsm_locator( int handle, int x, int y, int *xout, int *yout, int *term ) { ptsin[0] = x; /* initialisierende Position des Grafikcursors * * (x-Koordinate) */ ptsin[1] = y; /* initialisierende Position des Grafikcursors * * (y-Koordinate) */ VDI( 28, 1, 0, handle ); *term = intout[0]; /* Funktions-Ende-Taste: * * Im Low-Byte dieses Parameters wird der ASCII- * * Code der Taste eingetragen, die bettigt wurde * * (z.B. RETURN = 13). Spezielle Ende-Tasten sind * * z.B. die beiden Maus-Knpfe oder Tasten eines * * Grafiktabletts. Der Code dieser Tasten beginnt * * ab 20h (32). Die linke Taste der Maus hat den * * Code 20h (32), die rechte 21h (33). */ *xout = ptsout[0]; /* neue x-Position */ *yout = ptsout[1]; /* neue y-Position */ return (contrl[2] | (contrl[4] << 1)); /* = status: * * contrl[2]: 1 = Koordinaten sind gendert worden * * 0 = Koordinaten sind nicht gendert worden * * contrl[4]: 1 = Taste wurde bettigt * * 0 = keine Taste wurde bettigt */ } /* siehe auch: vrq_locatorVRQ_LOCA.C, vsin_modeVSIN_MOD.C */ /* * VSM_STRING (C) Digital Design 1990 * * INPUT STRING, SAMPLE MODE * * Diese Funktion entspricht weitgehend dem request-Modus. Es wird zu- * stzlich die Information zurckgegeben, ob eine ungltige Taste ge- * drckt wurde. Dies kann im request-Modus nicht ermittelt werden. * Wenn der String grundstzlich mit RETURN beendet wird, sollte die * Funktion deshalb im request-Modus ausgefhrt werden. * Wenn die maximale Stringlnge negativ ist, so wird im intout-Array * der 2-Byte-Code der VDI-Standard-Tastatur angelegt. */ #include int vsm_string( int handle, int max_length, int echo_mode, int echo_xy[2], char *string ) { intin[0] = max_length; /* maximale Stringlnge */ intin[1] = echo_mode; /* Echo-Modus: 0 = Echo-Modus ausgeschaltet * * 1 = Echo-Modus eingeschaltet */ ptsin[0] = echo_xy[0]; /* x-Koordinate des Echo-Bereiches */ ptsin[1] = echo_xy[1]; /* y-Koordinate des Echo-Bereiches */ VDI( 31, 1, 2, handle ); string[max_length] = 0; /* eingegebener String */ while (max_length-- > 0) string[max_length] = intout[max_length]; return contrl[4]; /* = status: 0 = Funktion wurde mit ungltigem * * Zeichen abgebrochen * * >1 = Gre des Strings */ } /* siehe auch: vrq_stringVRQ_STRI.C, vsin_modeVSIN_MOD.C */ /* * VSM_VALUATOR (C) Digital Design 1990 * * INPUT VALUATOR, SAMPLE MODE * * Diese Funktion entspricht weitgehend der entsprechenden request-Mode- * Funktion. Der Unterschied ist, da nicht auf einen Tastendruck gewar- * tet wird. Die Funktion ermittelt, welche Aktionen die Eingabeeinheit * ausgefhrt hat. Das Prinzip entspricht der Funktion INPUT LOCATORVSM_LOCA.C. */ #include void vsm_valuator( int handle, int val_in, int *val_out, int *term, int *status ) { intin[0] = val_in; /* initialisierender Wert */ VDI( 29, 0, 1, handle ); *val_out = intout[0]; /* neuer Wert */ *term = intout[1]; /* bettigte Taste, ASCII-Code */ *status = contrl[4]; /* 0 = keine Aktion * * 1 = Wert wurde gendert * * 2 = Taste wurde bettigt */ } /* siehe auch: vrq_valuatorVRQ_VALU.C, vsin_modeVSIN_MOD.C */ /* * V_HIDE_C (C) Digital Design 1990 * * HIDE CURSOR * * Der Cursor, der mit der Funktion V_SHOW_CV_SHOW_C.C aktiviert wird, kann mit * dieser Funktion wieder ausgeschaltet werden. Immer dann, wenn der * Anwender keinen Einflu auf den Programmablauf haben soll, wird diese * Funktion aktiviert. * Wird diese Funktion mehrmals aufgerufen, so mu die Funktion V_SHOW_CV_SHOW_C.C * zum Sichtbarmachen des Cursors genausooft aufgerufen werden. */ #include void v_hide_c( int handle ) { VDI( 123, 0, 0, handle ); } /* * V_SHOW_C (C) Digital Design 1990 * * SHOW CURSOR * * Diese Funktion bewirkt, da der Grafikcursor auf dem Bildschirm * sichtbar wird und mit der Maus bewegt werden kann. Der Cursor kann * mit der Funktion V_HIDE_CV_HIDE_C.C wieder ausgeschaltet werden. * Das VDI notiert intern, wie oft die Funktion V_HIDE_CV_HIDE_C.C aufgerufen * wurde. Zur Darstellung des Cursors ist dann die gleiche Anzahl * Aufrufe von V_SHOW_C notwendig. Diese Beziehung zwischen den beiden * Funktion kann jedoch auch ausgeschaltet werden. */ #include void v_show_c( int handle, int reset ) { intin[0] = reset; /* 0 = Anzahl der V_HIDE_CV_HIDE_C.C-Aufrufe wird ignoriert * * 1 = normale Funktion */ VDI( 122, 0, 1, handle ); } . E.. (EINQUIRE HLP JjVQF_ATTRC sVQIN_MODC VQL_ATTRC sVQM_ATTRC sVQT_ATTRC xTVQT_EXTEC VVQT_FONTC Y #VQT_WIDTC yT VQ_COLORC ' VQ_EXTNDC yT VQ_SCAN C jREAD_ME TXT! Nachfragefunktionen Mittels der Nachfragefunktionen ist es mglich, weitere Informationen ber Einstellungen einzelner Gerte zu holen. vq_cellarrayVQ_CELLA.C Abfrage der Belegung einer Farbauswahltabelle. vq_colorVQ_COLOR.C Farbintensitten ermitteln. vq_extndVQ_EXTND.C Zustzliche Informationen ber die Konfiguration einer Arbeitsstation ermitteln. vq_gdosVQ_GDOS.C Ermitteln, ob GDOS geladen ist. vq_scanVQ_SCAN.C Druckerparameter ermitteln. vqf_attributesVQF_ATTR.C Fllattribute ermitteln. vqin_modeVQIN_MOD.C Eingabemodus eines Eingabegerts abfragen. vql_attributesVQL_ATTR.C Linienattribute ermitteln. vqm_attributesVQM_ATTR.C Markierungsattribute ermitteln. vqt_attributesVQT_ATTR.C Textattribute ermitteln. vqt_extentVQT_EXTE.C Dimensionen eines Textrechtecks berechnen. vqt_fontinfoVQT_FONT.C Informationen ber einen Zeichensatz ermitteln. vqt_nameVQT_NAME.C Namen und Index eines Zeichensatzes ermitteln. vqt_widthVQT_WIDT.C Dimensionen einer Zeichenzelle berechnen./* * VQF_ATTRIBUTES (C) Digital Design 1990 * * INQUIRE CURRENT FILL AREA ATTRIBUTES * * Diese Funktion gibt alle eingestellten Fll-Attribute zurck. */ #include void vqf_attributes( int handle, int *attrib ) { VDI( 37, 0, 0, handle ); attrib[0] = intout[0]; /* Flltyp */ attrib[1] = intout[1]; /* Fllfarbe */ attrib[2] = intout[2]; /* Fllmuster */ attrib[3] = intout[3]; /* Zeichenmodus */ attrib[4] = intout[4]; /* Status Umrahmung */ } /* * VQIN_MODE (C) Digital Design 1990 * * INQUIRE INPUT MODE * * Diese Funktion ermittelt den aktuellen Eingabemodus einer spezifi- * zierten logischen Eingabeeinheit. */ #include void vqin_mode( int handle, int dev_type, int *input_mode ) { intin[0] = dev_type; /* logische Eingabeeinheit: * * 1 = Grafikcursor-Einheit * * 2 = wertverndernde Eingabeeinheit * * 3 = Auswahl-Eingabeeinheit * * 4 = String-Eingabeeinheit */ VDI( 115, 0, 1, handle ); *input_mode = intout[0]; /* Eingabe-Modus: * * 0 = request-Modus * * 1 = sample-Modus */ } /* siehe auch: vsin_mode..\INPUT\VSIN_MOD.C */ /* * VQL_ATTRIBUTES (C) Digital Design 1990 * * INQUIRE CURRENT POLYLINE ATTRIBUTES * * Diese Funktion ermittelt alle Linien-Attribute. */ #include void vql_attributes( int handle, int *attrib ) { VDI( 35, 0, 0, handle ); attrib[0] = intout[0]; /* Linientyp */ attrib[1] = intout[1]; /* Linienfarbe */ attrib[2] = intout[2]; /* Zeichenmodus */ attrib[3] = intout[3]; /* Aussehen Anfangspunkt */ attrib[4] = intout[4]; /* Aussehen Endpunkt */ attrib[5] = ptsout[0]; /* Linienbreite */ /* ptsout[1] = 0 */ } /* * VQM_ATTRIBUTES (C) Digital Design 1990 * * INQUIRE CURRENT POLYMARKER ATTRIBUTES * * Diese Funktion ist fr die Feststellung der eingestellten Markie- * rungs-Attribute zustndig. */ #include void vqm_attributes( int handle, int *attrib ) { VDI( 36, 0, 0, handle ); attrib[0] = intout[0]; /* Markierungstyp */ attrib[1] = intout[1]; /* Markierungsfarbe */ attrib[2] = intout[2]; /* Zeichenmodus */ attrib[3] = ptsout[0]; /* Markierungsbreite */ attrib[4] = ptsout[1]; /* Markierungshhe */ } /* * VQT_ATTRIBUTES (C) Digital Design 1991 * * INQUIRE CURRENT GRAPHIC TEXT ATTRIBUTES * * Diese Funktion gibt alle eingestellten Text-Attribute aus. */ #include void vqt_attributes( int handle, int *attrib ) { VDI( 38, 0, 0, handle ); attrib[0] = intout[0]; /* Zeichensatz */ attrib[1] = intout[1]; /* Textfarbe */ attrib[2] = intout[2]; /* Rotationswinkel */ attrib[3] = intout[3]; /* Horizontal-Ausrichtung */ attrib[4] = intout[4]; /* Vertikal-Ausrichtung */ attrib[5] = intout[5]; /* Zeichenmodus */ attrib[6] = ptsout[0]; /* Zeichenbreite */ attrib[7] = ptsout[1]; /* Zeichenhhe */ attrib[8] = ptsout[2]; /* Zeichenbox-Breite */ attrib[9] = ptsout[3]; /* Zeichenbox-Hhe */ } /* * VQT_EXTENT (C) Digital Design 1990 * * INQUIRE TEXT EXTENT * * Diese Funktion berechnet auf Grundlage der aktuellen Text-Attribute * die Ausmae eines spezifizierten Strings. Es werden die vier Eck- * punkte des Rechteckes, das den String umfat, relativ ausgegeben. * Das stringumfassende Rechteck wird mit den beiden Ecken links vom * Text an die X- und Y-Achse gelegt. Die Eckpunkte des Rechteckes * werden unten links beginnend gegen den Uhrzeigersinn numeriert. */ #include void vqt_extent( int handle, char *string, int *extent ) { int *pintin; char *pstring; pintin = intin; pstring = string; while ((*pintin++ = (unsigned char)*pstring++) != 0); vdipb[4] = extent; VDI( 116, 0, (int)(pstring - string - 1), handle ); vdipb[4] = ptsout; /* extent[0] = relative x-Koordinate fr Punkt 1 * * des Textes * * extent[1] = relative y-Koordinate fr Punkt 1 * * des Textes * * extent[2] = relative x-Koordinate fr Punkt 2 * * des Textes * * extent[3] = relative y-Koordinate fr Punkt 2 * * des Textes * * extent[4] = relative x-Koordinate fr Punkt 3 * * des Textes * * extent[5] = relative y-Koordinate fr Punkt 3 * * des Textes * * extent[6] = relative x-Koordinate fr Punkt 4 * * des Textes * * extent[7] = relative y-Koordinate fr Punkt 4 * * des Textes */ } /* * VQT_FONTINFO (C) Digital Design 1992 * * INQUIRE CURRENT FACE INFORMATION * * Diese Funktion gibt ber den aktuellen Zeichensatz Auskunft. * Es wird die gegenwrtige Gre ausgegeben. Die aktuellen Text- * effekte werden ebenso bercksichtigt. Sollten die Zeichen in * Kursivschrift dargestellt sein, so wird die Neigung als rechter * und linker Offsetwert bedacht. Rechter Offsetwert ist der hori- * zontale Abstand der Zeichenposition (linkes Basislinienende) * zum Lotfupunkt des Lotes auf die Basislinie durch die obere * rechte Ecke. Linker Offset ist der Abstand der Zeichenposition * zum Lotfupunkt des Lotes auf die Basislinie durch die untere * linke Ecke. */ #include void vqt_fontinfo( int handle, int *minADE, int *maxADE, int *distances, int *maxwidth, int *effects ) { VDI( 131, 0, 0, handle ); *minADE = intout[0]; /* niedrigster ASCII-Wert, * * erstes Zeichen des Zeichensatzes */ *maxADE = intout[1]; /* hchster ASCII-Wert, * * letztes Zeichen des Zeichensatzes */ *maxwidth = ptsout[0]; /* maximale Zeichenzellenbreite * * ohne Texteffekte */ distances[0] = ptsout[1]; /* Abstand Untergrenze Zeichenzelle * * zur Basislinie (bzgl. Y-Achse) */ distances[1] = ptsout[3]; /* Abstand Untergrenze Zeichen * * (Unterlngen) zur Basislinie * * (bzgl. Y-Achse) */ distances[2] = ptsout[5]; /* Abstand Halblinie (Obergrenze * * Kleinbuchstaben (wie a,c,e,g)) * * zur Basislinie (bzgl. Y-Achse) */ distances[3] = ptsout[7]; /* Abstand Obergrenze Zeichen * * zur Basislinie (bzgl. Y-Achse) */ distances[4] = ptsout[9]; /* Abstand Obergrenze Zeichenzelle * * zur Basislinie (bzgl. Y-Achse) */ effects[0] = ptsout[2]; /* Betrag, um den die Zeichenbreite * * bei den aktuell eingestellten Text-* * effekten zunimmt (bzgl. X-Achse) */ effects[1] = ptsout[4]; /* linker Offsetwert (bzgl. X-Achse) */ effects[2] = ptsout[6]; /* rechter Offsetwert (bzgl. X-Achse) */ } /* * VQT_WIDTH (C) Digital Design 1991 * * INQUIRE CHARACTER CELL WIDTH * * Diese Funktion ermittelt die Mae eines spezifizierten Zeichens * und dessen umfassende Zeichenbox. Texteffekte und Rotation * werden hier nicht bercksichtigt. */ #include int vqt_width( int handle, int character, int *cell_width, int *left_delta, int *right_delta ) { intin[0] = character; /* zu messendes Zeichen */ VDI( 117, 0, 1, handle ); *cell_width = ptsout[0]; /* Breite der Zeichenbox */ /* ptsout[1] = 0 */ *left_delta = ptsout[2]; /* Abstand vom Zeichen zum linken Rand * * der Zeichenbox */ /* ptsout[3] = 0 */ *right_delta = ptsout[4]; /* Abstand vom Zeichen zum rechten Rand * * der Zeichenbox */ /* ptsout[5] = 0 */ return intout[0]; /* vermessenes Zeichen (-1 wenn Zeichen ungltig) */ } /* * VQ_COLOR (C) Digital Design 1990 * * INQUIRE COLOR REPRESENTATION * * Diese Funktion stellt die Einstellung der Farbmischung fr den * aktuellen oder spezifizierten Farbindex fest. */ #include int vq_color( int handle, int color_index, int set_flag, int rgb[3] ) { intin[0] = color_index; /* zu analysierender Farbindex */ intin[1] = set_flag; /* Flag aktueller oder bergebener Farbindex: * * 0 = bergebener Farbindex * * 1 = aktueller Farbindex */ VDI( 26, 0, 2, handle ); rgb[0] = intout[1]; /* Rot-Intensitt (0-1000) */ rgb[1] = intout[2]; /* Grn-Intensitt (0-1000) */ rgb[2] = intout[3]; /* Blau-Intensitt (0-1000) */ return intout[0]; } /* siehe auch: vs_color..\ATTRIB\VS_COLOR.C */ /* * VQ_EXTND (C) Digital Design 1991 * * EXTENDED INQUIRE FUNCTION * * Diese erweiterte Nachfragefunktion bietet zwei Mglichkeiten: * - Die nachtrgliche Ermittlung der 57 OPEN WORKSTATION..\CONTROL\V_OPNWK.C-Parameter, * - Die Ermittlung 19 weiterer gertespezifischer Informationen. * Unabhngig vom Informationstyp werden auf jeden Fall 45 intout- * und 6 ptsout- bzw. 57 work_out-Parameter zurckgegeben. */ #include void vq_extnd( int handle, int owflag, int *work_out ) { intin[0] = owflag; /* Informationstyp: * * 0 = OPEN WORKSTATION..\CONTROL\V_OPNWK.C-Parameter * * 1 = erweiterte Parameter */ vdipb[3] = work_out; vdipb[4] = work_out + 45; VDI( 102, 0, 1, handle ); vdipb[3] = intout; vdipb[4] = ptsout; /* Die erweiterten Parameter (Angabe der work_out-Nummer): * * 0: Art des Bildschirms: * * 0 = kein Bildschirm * * 1 = separater Alpha- und Grafikcontroller mit separatem * * Bildschirm * * 2 = separater Alpha- und Grafikcontroller mit gemeinsamem * * Bildschirm * * 3 = gemeinsamer Alpha- und Grafikcontroller mit separatem * * Grafikspeicher * * 4 = gemeinsamer Alpha- und Grafikcontroller mit gemeinsamem * * Grafikspeicher * * 1: Anzahl der verfgbaren Hintergrundfarben * * 2: untersttzte Texteffekte * * 3: Vergrerungsraster: * * 0 = Vergrerung nicht mglich * * 1 = Vergrerung mglich * * 4: Anzahl der Farbebenen fr Raster * * 5: "look-up table"-Untersttzung: * * 0 = wird untersttzt * * 1 = wird nicht untersttzt * * 6: Anzahl der 16 * 16-Raster-Operationen je Sekunde * * 7: CONTOUR FILL..\OUTPUT\V_CONTOU.C-Untersttzung: * * 0 = wird nicht untersttzt * * 1 = wird untersttzt * * 8: Untersttzung Text-Rotation: * * 0 = keine Untersttzung * * 1 = nur in 90-Grad-Schritten * * 2 = beliebige Rotationswinkel * * 9: Anzahl der Zeichen-Modi * * 10: hchstmglicher Eingabe-Modus: * * 0 = keiner * * 1 = request-Modus * * 2 = sample-Modus * * 11: Untersttzung Textausrichtung: * * 0 = wird nicht untersttzt * * 1 = wird untersttzt * * 12: Farbwechsel mit Farbstiften (Plotter): * * 0 = wird beherrscht * * 1 = wird nicht beherrscht * * 13: Farbwechsel mit Farbbandverschiebung (Matrixdrucker): * * 0 = wird beherrscht * * 1 = wird nicht beherrscht * * 14: maximale Anzahl der Punkte in polyline, polymarker oder * * filled area (-1 = unbegrenzt) * * 15: maximale Lnge intin-Array (-1 = unbegrenzt) * * 16: Anzahl der Maustasten * * 17: Linientypen fr verbreiterte Linien: * * 0 = wird nicht untersttzt * * 1 = wird untersttzt * * 18: Zeichenmodi fr verbreiterte Linien * * 19-56: reserviert, enthlt Wert 0 */ } /* * VQ_SCAN (C) Digital Design 1991 * * INQUIRE PRINTER SCAN * * Diese Funktion fragt verschiedene druckerspezifische Parameter ab. * Der Druckertreiber unterteilt eine Druckseite in mehrere "Scheiben" * (slices), die nacheinander formatiert und gedruckt werden, um den * Speicherplatzbedarf zu senken. Dabei ist g_slice die Anzahl dieser * Scheiben und g_page die Pixelhhe einer Scheibe. a_slice gibt die * Hhe einer Textzeile in Pixel und a_page die Anzahl Textzeilen pro * Seite an. * Durch div_fac mssen die anderen Werte ggf. noch geteilt werden. */ #include void vq_scan( int handle, int *g_slice, int *g_page, int *a_slice, int *a_page, int *div_fac ) { contrl[5] = 24; VDI( 5, 0, 0, handle ); *g_slice = intout[0]; /* Anzahl der Drucker-Scheiben */ *g_page = intout[1]; /* Pixelhhe einer Scheibe */ *a_slice = intout[2]; /* Hhe einer Textzeile in Pixel */ *a_page = intout[3]; /* Textzeilen pro Seite */ *div_fac = intout[4]; /* Divisor */ } . E.. (EOUTPUT HLP 1d1VR_RECFLC ys)V_ALPHA_C dq1V_ARC C sV_BAR C 8SV_CELLARC LSV_CIRCLEC s^V_CONTOUC ns V_ELLARCC |S!XV_ELLIPSC S"rV_ELLPIEC S#V_FILLARC S%vV_GTEXT C @S&V_JUSTIFC `S'PV_PIE C S)}V_PLINE C S*V_PMARKEC FxT+%V_RBOX C y-V_RFBOX C .READ_ME TXT! Ausgabefunktionen im berblick: v_alpha_textV_ALPHA_.C Text im Textmodus ausgeben. v_plineV_PLINE.C Linienzug zeichnen. v_pmarkerV_PMARKE.C Markierung zeichnen. v_gtextV_GTEXT.C Text grafisch ausgeben. v_fillareaV_FILLAR.C Angegebene Flche ausfllen. v_cellarrayV_CELLAR.C Farbauswahltabelle darstellen. v_contourfillV_CONTOU.C Flche bis zu bestimmten Begrenzungen ausfllen. vr_recflVR_RECFL.C Rechteck ausfllen. v_arcV_ARC.C Kreisbogen zeichnen. v_barV_BAR.C Ausgeflltes Rechteck zeichnen. v_circleV_CIRCLE.C Ausgefllten Kreis zeichnen. v_ellipseV_ELLIPS.C Ausgefllte Ellipse zeichnen. v_ellarcV_ELLARC.C Ellipsenbogen zeichnen. v_ellpieV_ELLPIE.C Ausgeflltes Ellipsensegment zeichnen. v_justifiedV_JUSTIF.C Ausgerichteten Text ausgeben. v_piesliceV_PIE.C Ausgeflltes Kreissegment zeichnen. v_rboxV_RBOX.C Abgerundetes Rechteck zeichnen. v_rfboxV_RFBOX.C Ausgeflltes, abgerundetes Rechteck zeichnen. Mit den Ausgabefunktionen knnen grafische Elemente wie Kreise und Linien, aber auch Texte auf den angemeldeten Arbeitsstationen ausge- geben werden. /* * VR_RECFL (C) Digital Design 1990 * * FILL RECTANGLE * * Diese Funktion fllt ein definiertes Rechteck aus. * Dabei finden die Attribute fr Flloperationen Verwendung. */ #include void vr_recfl( int handle, int *pxyarray ) { vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate des Eckpunktes * * pxyarray[1] = y-Koordinate des Eckpunktes * * pxyarray[2] = x-Koordinate des Eckpunktes * * diagonal gegenber * * pxyarray[3] = y-Koordinate des Eckpunktes * * diagonal gegenber */ VDI( 114, 2, 0, handle ); vdipb[2] = ptsin; } /* * V_ALPHA_TEXT (C) Digital Design 1991 * * OUTPUT ALPHA TEXT * * Mit Hilfe dieser Funktion ist es mglich, alphanumerischen Text auf * einem Drucker auszugeben. Die angegebene Zeichenkette wird nicht im * Grafikmodus ausgegeben, sondern im Standard-Druckerzeichensatz. * Das WORDPLUS, das mit GEM/3 mitgeliefert wird, bedient sich dieser * Methode, um Texte auszugeben. Es existieren keine Konfigurations- * dateien mehr fr den Drucker (HEX, CFG), vielmehr erzeugt WORDPLUS * eine OUT-Datei, in der alle Informationen fr den Text stehen. Bei * der Ausgabe des Textes auf die OUT-Datei werden auerdem Steuerzei- * chen mitgeschrieben, die die Attribute eines Textes bestimmen. * Diese Steuerzeichen fr Textattribute sind von Digital Research * vorgeschrieben und werden vom OUTPUT an den Drucker weitergeleitet. * Es ist Aufgabe des Druckertreibers, diese zu analysieren und auf * das entsprechende Textattribut umzuschalten. Alle Steuerzeichen * werden mit dem ASCII Code DC2 (Dezimalwert 18) eingeleitet. * Folgende Steuerzeichen sind definiert und schalten ein Attribut * ein oder aus: * * (DC2) '0' = Fettschrift ein (DC2) '1' = Fettschrift aus * (DC2) '2' = Kursivschrift ein (DC2) '3' = Kursivschrift aus * (DC2) '4' = Unterstreichen ein (DC2) '5' = Unterstreichen aus * (DC2) '6' = Superscript ein (DC2) '7' = Superscript aus * (DC2) '8' = Subscript ein (DC2) '9' = Subscript aus * (DC2) 'A' = NLQ-Schrift ein (DC2) 'B' = NLQ-Schrift aus * (DC2) 'C' = Breitschrift ein (DC2) 'D' = Breitschrift aus * (DC2) 'E' = Hellschrift ein (DC2) 'F' = Hellschrift aus * (DC2) 'G' - (DC2) 'V' = reserviert * (DC2) 'W' = Pica ein * (DC2) 'X' = Elite ein * (DC2) 'Y' = Schmalschrift ein * (DC2) 'Z' = Proportionalschrift ein */ #include void v_alpha_text( int handle, char *string ) { int *pintin; char *pstring; pintin = intin; pstring = string; while ((*pintin++ = (unsigned char)*pstring++) != 0); contrl[5] = 25; VDI( 5, 0, (int)(pstring - string - 1), handle ); } /* * V_ARC (C) Digital Design 1990 * * Die Funktion zeichnet einen Kreisausschnitt, wobei Anfangs- und End- * winkel definiert werden. * Folgende Attribute fr Linien finden dabei Verwendung: * Linienfarbe * Linientyp * Zeichenmodus * Linienbreite * Endform */ #include void v_arc( int handle, int x, int y, int radius, int begang, int endang ) { intin[0] = begang; /* Startwinkel (0-3600) */ intin[1] = endang; /* Endwinkel (0-3600) */ ptsin[0] = x; /* X-Koordinate des Mittelpunktes */ ptsin[1] = y; /* Y-Koordinate des Mittelpunktes */ ptsin[2] = ptsin[3] = ptsin[4] = ptsin[5] = ptsin[7] = 0; ptsin[6] = radius; /* Radius */ contrl[5] = 2; VDI( 11, 4, 2, handle ); } /* * V_BAR (C) Digital Design 1991 * * Die Funktion zeichnet einen ausgefllten Balken. Sie ist also zur * Erstellung von Balkendiagrammen geeignet. * Folgende Attribute fr Flloperationen finden dabei Verwendung: * Fllfarbe * Flltyp (leer, voll, punktiert, Muster, schraffiert oder * selbstdefiniert) * Zeichenmodus * Fllmuster * Einrahmung */ #include void v_bar( int handle, int *pxyarray ) { vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate der Ecke * * pxyarray[1] = y-Koordinate der Ecke * * pxyarray[2] = x-Koordinate der diagonal * * gegenberliegenden Ecke * * pxyarray[3] = y-Koordinate der diagonal * * gegenberliegenden Ecke */ contrl[5] = 1; VDI( 11, 2, 0, handle ); vdipb[2] = ptsin; } /* * V_CELLARRAY (C) Digital Design 1991 * * Diese Funktion ist sehr komplex und darum auch schwer zu beschreiben. * Zunchst wird ein definiertes Rechteck gezeichnet. Dieses Rechteck * wird logisch in eine Tabelle mit beliebig vielen Zeilen und Spalten * eingeteilt. Jedem der dadurch entstehenden Tabellenelemente wird eine * frei definierbare Farbe zugeordnet. Die Bildschirmpunkte, die inner- * halb dieser Tabelle liegen, nehmen die Farbe der sie eingrenzenden * Tabellenelemente an. Ein Beispiel: Der Grafikbildschirm wird in vier * gleiche Teile, also vier Farbzonen zerlegt. Die ausgegebenen Grafik- * punkte nehmen jeweils die Farbe der Zone an, in der sie sich befinden. * Nicht jedes Arbeitsgert, so z.B. der Monochrommonitor, erlauben den * Einsatz dieser Funktion. Es wird dann lediglich das Rechteck in der * aktuellen Linienfarbe und Linienbreite gezeichnet. */ #include void v_cellarray( int handle, int *pxyarray, int row_length, int el_used, int num_rows, int wrt_mode, int *colarray ) { contrl[7] = row_length; /* Lnge der Zeilen im Farbarray */ contrl[8] = el_used; /* Anzahl der Zonen in den Zeilen des Farbarrays */ contrl[9] = num_rows; /* Anzahl der Zeilen im Farbarray */ contrl[10] = wrt_mode; /* Zeichenmodus (siehe VSWR_MODE..\ATTRIB\VSWR_MOD.C) */ vdipb[1] = colarray; /* Farbarray, enthlt zeilenweise die Farbe * * jeder Tabellenzone */ vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate der unteren linken * * Ecke des Rechteckes * * pxyarray[1] = y-Koordinate der unteren linken * * Ecke des Rechteckes * * pxyarray[2] = x-Koordinate der oberen rechten * * Ecke des Rechteckes * * pxyarray[3] = y-Koordinate der oberen rechten * * Ecke des Rechteckes */ VDI( 10, 2, num_rows * el_used, handle ); vdipb[1] = intin; vdipb[2] = ptsin; } /* * V_CIRCLE (C) Digital Design 1990 * * Mit dieser Funktion lassen sich ausgefllte Kreise erstellen. * Folgende Attribute fr Flloperationen finden dabei Verwendung: * Fllfarbe * Flltyp (leer, voll, punktiert, Muster, schraffiert oder * selbstdefiniert) * Zeichenmodus * Fllmuster * Einrahmung * Diese Funktion wird nicht von jedem Gert untersttzt. */ #include void v_circle( int handle, int x, int y, int radius ) { ptsin[0] = x; /* x-Koordinate des Mittelpunktes */ ptsin[1] = y; /* y-Koordinate des Mittelpunktes */ ptsin[2] = ptsin[3] = ptsin[5] = 0; ptsin[4] = radius; /* Radius */ contrl[5] = 4; VDI( 11, 3, 0, handle ); } /* * V_CONTOURFILL (C) Digital Design 1990 * * Diese Funktion fllt einen Bereich aus, bis sie entweder an den * Bildschirmrand oder eine definierte Farbe gelangt. Es ist der * Standard-Fllalgorithmus, wie man ihn in vielen Grafikprogrammen * findet. */ #include void v_contourfill( int handle, int x, int y, int index ) { intin[0] = index; /* Farbe der auszufllenden Flche */ ptsin[0] = x; /* x-Koordinate des Startpunktes */ ptsin[1] = y; /* y-Koordinate des Startpunktes */ VDI( 103, 1, 1, handle ); } /* * V_ELLARC (C) Digital Design 1991 * * Mit dieser Funktion kann der Ausschnitt einer Ellipse gezeichnet * werden, der sich durch Angabe von Mittelpunkt, X- und Y-Radius, * Anfangs- und Endwinkel ergibt. * Folgende Attribut fr Linien finden dabei Verwendung: * Linienfarbe * Linientyp * Zeichenmodus * Linienbreite * Endform */ #include void v_ellarc( int handle, int x, int y, int xradius, int yradius, int begang, int endang ) { intin[0] = begang; /* Startwinkel (0-3600) */ intin[1] = endang; /* Endwinkel (0-3600) */ ptsin[0] = x; /* x-Koordinate des Mittelpunktes */ ptsin[1] = y; /* y-Koordinate des Mittelpunktes */ ptsin[2] = xradius; /* Radius in x-Richtung */ ptsin[3] = yradius; /* Radius in y-Richtung */ contrl[5] = 6; VDI( 11, 2, 2, handle ); } /* * V_ELLIPSE (C) Digital Design 1991 * * Neben Kreisen, deren X- und Y-Radius identisch ist, knnen mit dieser * Funktion auch ausgefllte Ellipsen mit unterschiedlichen Radien * erzeugt werden. Parameter wie X- und Y-Radius sowie der Mittelpunkt * mssen der Funktion bergeben werden. * Folgende Attribute fr Flloperationen finden Verwendung: * Fllfarbe * Flltyp (leer, voll, punktiert, Muster, schraffiert oder * selbstdefiniert) * Zeichenmodus * Fllmuster * Einrahmung */ #include void v_ellipse( int handle, int x, int y, int xradius, int yradius ) { ptsin[0] = x; /* x-Koordinate des Mittelpunktes */ ptsin[1] = y; /* y-Koordinate des Mittelpunktes */ ptsin[2] = xradius; /* Radius in x-Richtung */ ptsin[3] = yradius; /* Radius in y-Richtung */ contrl[5] = 5; VDI( 11, 2, 0, handle ); } /* * V_ELLPIE (C) Digital Design 1991 * * Diese Funktion erzeugt einen ausgefllten Ellipsenausschnitt, dessen * Anfang und Ende mit dem Mittelpunkt verbunden ist. Diese Flche * bezeichnet man auch als elliptische Torte. Es werden Anfangs- und * Endwinkel, X- und Y-Radius sowie der Mittelpunkt angegeben. * Folgende Attribute fr Flloperationen finden Verwendung: * Fllfarbe * Flltyp (leer, voll, punktiert, Muster, schraffiert oder * selbstdefiniert) * Zeichenmodus * Fllmuster * Einrahmung */ #include void v_ellpie( int handle, int x, int y, int xradius, int yradius, int begang, int endang ) { intin[0] = begang; /* Startwinkel (0-3600) */ intin[1] = endang; /* Endwinkel (0-3600) */ ptsin[0] = x; /* x-Koordinate des Mittelpunktes */ ptsin[1] = y; /* y-Koordinate des Mittelpunktes */ ptsin[2] = xradius; /* Radius in x-Richtung */ ptsin[3] = yradius; /* Radius in y-Richtung */ contrl[5] = 7; VDI( 11, 2, 2, handle ); } /* * V_FILLAREA (C) Digital Design 1991 * * Diese Funktion fllt ein bestimmtes Polygon aus. Dabei finden die * Attribute fr Flloperationen Verwendung. * Der ausgefllte Bereich wird standardmig mit der Fllfarbe einge- * rahmt. Dies kann mit einer Attribute-Funktion (VSF_PERIMETER..\ATTRIB\VSF_PERI.C) unter- * drckt werden. * Wenn das Ausgabegert keine Mglichkeit des Ausfllens von Polygonen * besitzt, wird das Polygon in der Standard-Fllfarbe ausgegeben. */ #include void v_fillarea( int handle, int count, int pxyarray[] ) { vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate des 1.Punktes * * pxyarray[1] = y-Koordinate des 1.Punktes * * pxyarray[2] = x-Koordinate des 2.Punktes * * pxyarray[3] = y-Koordinate des 2.Punktes * * usw. */ VDI( 9, count, 0, handle ); vdipb[2] = ptsin; } /* * V_GTEXT (C) Digital Design 1991 * * Zur Ausgabe von Text auf den Grafikbildschirm sollte man nicht die * C-Standardfunktion "printf" verwenden, sondern die eigens fr * diesen Zweck eingerichtete Funktion. * Die Ausrichtung des Textes und damit die Bedeutung der x/y-Position * kann mit der VST_ALIGNMENT..\ATTRIB\VST_ALIG.C-Funktion beeinflut werden. * Standardmig erscheint der Text linksbndig an der angegebenen * y-Achse, und die Basislinie des Textes liegt auf der angegebenen * x-Achse. */ #include void v_gtext( int handle, int x, int y, char *string ) { int *pintin; char *pstring; ptsin[0] = x; /* x-Koordinate der Textausrichtung */ ptsin[1] = y; /* y-Koordinate der Textausrichtung */ pintin = intin; pstring = string; while ((*pintin++ = (unsigned char)*pstring++) != 0); VDI( 8, 1, (int)(pstring - string - 1), handle ); } /* siehe auch: v_justifiedV_JUSTIF.C */ /* * V_JUSTIFIED (C) Digital Design 1991 * * Diese Funktion erlaubt die Ausgabe komfortabel formatierter Texte * auf den Bildschirm. Der Text wird links und rechts justiert, indem * die linke Ausrichtung sowie die Textlnge wahlfrei bestimmt wird. * Der Text wird durch Einfgen von Zwischenrumen innerhalb der * Zeichen oder der Worte auf die gewnschte Lnge gedehnt. * Die Ausdehnung der Zeichen und/oder der Worte kann ein- und * ausgeschaltet werden. */ #include void v_justified( int handle, int x, int y, char *string, int length, int word_space, int char_space ) { int *pintin; char *pstring; ptsin[0] = x; /* x-Koordinate der Textausrichtung */ ptsin[1] = y; /* y-Koordinate der Textausrichtung */ ptsin[2] = length; /* gewnschte Textlnge in x-Richtung */ ptsin[3] = 0; pintin = intin; pstring = string; *pintin++ = word_space; /* Flag fr Wort-Dehnung: * * 0 = Wortdehnung aus * * 1 = Wortdehnung ein */ *pintin++ = char_space; /* Flag fr Zeichendehnung: * * 0 = Zeichendehnung aus * * 1 = Zeichendehnung ein */ while ((*pintin++ = (unsigned char)*pstring++) != 0); contrl[5] = 10; VDI( 11, 2, (int)(pstring - string + 1), handle ); } /* siehe auch: v_gtextV_GTEXT.C, vst_alignment..\ATTRIB\VST_ALIG.C */ /* * V_PIE (C) Digital Design 1991 * * Diese Funktion zeichnet einen ausgefllten Kreisbogen, dessen * Anfangs- und Endpunkt mit dem Mittelpunkt verbunden werden. Es * ergibt sich somit eine Flche, die man auch als Torte bezeichnet. * Die bekannten Tortengrafiken lassen sich mit Hilfe dieser Funktion * auf einfachste Weise erstellen. * Diese Funktion wird nicht von jedem Gert untersttzt. */ #include void v_pie( int handle, int x, int y, int radius, int begang, int endang ) { intin[0] = begang; /* Startwinkel (0-3600) */ intin[1] = endang; /* Endwinkel (0-3600) */ ptsin[0] = x; /* x-Koordinate des Mittelpunktes */ ptsin[1] = y; /* y-Koordinate des Mittelpunktes */ ptsin[2] = ptsin[3] = ptsin[4] = ptsin[5] = ptsin[7] = 0; ptsin[6] = radius; /* Radius */ contrl[5] = 3; VDI( 11, 4, 2, handle ); } /* * V_PLINE (C) Digital Design 1991 * * POLYLINE * * Polylines sind miteinander verbundene Bildschirmkoordinaten. Ein * Polygon besteht z.B. aus mehreren verbundenen Punkten, deren * Anfangspunkt gleichzeitig der Endpunkt ist. Zur Erstellung von * Mehrfachlinien stellt das VDI..\VDI.HLP eine komfortable Funktion zur * Verfgung. * Die Linien knnen beliebig gestaltet werden. Dazu mssen die * Attribute-Funktionen zur Bestimmung von * Farbe * Linientyp * Linienbreite * Endaussehen * und Zeichenmodus * herangezogen werden. */ #include void v_pline( int handle, int count, int pxyarray[] ) { vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate des 1.Punktes * * pxyarray[1] = y-Koordinate des 1.Punktes * * pxyarray[2] = x-Koordinate des 2.Punktes * * pxyarray[3] = y-Koordinate des 2.Punktes * * usw. */ VDI( 6, count, 0, handle ); vdipb[2] = ptsin; } /* * V_PMARKER (C) Digital Design 1991 * * POLYMARKER * * Hier handelt es sich um eine Funktion, die mehrere definierte * Markierungen auf dem Bildschirm setzt. Diese Markierungen knnen * verschiedener Art, im einfachsten Fall ein Bildschirmpunkt sein. * Die Art der Markierung sowie andere Eigenschaften werden mit den * Attribute-Funktionen eingestellt: * Farbe der Markierungen * Gre der Markierungen * Markierungsart * Zeichenmodus * Die Anzahl der vom Gert erlaubten Markierungspunkte ist unter- * schiedlich und kann mit der erweiterten Nachfragefunktion * (VQ_EXTND..\INQUIRE\VQ_EXTND.C) ermittelt werden. */ #include void v_pmarker( int handle, int count, int pxyarray[] ) { vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate der 1.Markierung * * pxyarray[1] = y-Koordinate des 1.Markierung * * pxyarray[2] = x-Koordinate des 2.Markierung * * pxyarray[3] = y-Koordinate des 2.Markierung * * usw. */ VDI( 7, count, 0, handle ); vdipb[2] = ptsin; } /* * V_RBOX (C) Digital Design 1990 * * Neben normalen Rechtecken knnen auch Rechtecke mit abgerundeten * Kanten erstellt werden. Diese Funktion macht dies mglich. Es * werden dazu die beiden gegenberliegenden Eckpunkte bergeben. * Folgende Attribute fr Linien finden Verwendung: * Linienfarbe * Linientyp * Zeichenmodus * Linienbreite */ #include void v_rbox( int handle, int *pxyarray ) { vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate des Eckpunktes * * pxyarray[1] = y-Koordinate des Eckpunktes * * pxyarray[2] = x-Koordinate der diagonal * * gegenberliegenden Ecke * * pxyarray[3] = y-Koordinate der diagonal * * gegenberliegenden Ecke */ contrl[5] = 8; VDI( 11, 2, 0, handle ); vdipb[2] = ptsin; } /* * V_RFBOX (C) Digital Design 1990 * * Diese Funktion zeichnet ein ausgeflltes Rechteck mit abgerundeten * Ecken. * Folgende Attribute fr Flloperationen finden dabei Verwendung: * Fllfarbe * Flltyp (leer, voll, punktiert, Muster, schraffiert oder * selbstdefiniert) * Zeichenmodus * Fllmuster * Einrahmung */ #include void v_rfbox( int handle, int *pxyarray ) { vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate des Eckpunktes * * pxyarray[1] = y-Koordinate des Eckpunktes * * pxyarray[2] = x-Koordinate der diagonal * * gegenberliegenden Ecke * * pxyarray[3] = y-Koordinate der diagonal * * gegenberliegenden Ecke */ contrl[5] = 9; VDI( 11, 2, 0, handle ); vdipb[2] = ptsin; } . E/.. (ERASTER HLP z0 VRO_CPYFC xT1 VRT_CPYFC xT4 VR_TRNFMC ʥJ7vV_GET_PIC ps8READ_ME TXT!Rasterfunktionen Die Rasterfunktionen erlauben es logische Operationen auf rechtwink- ligen Blcken auszufhren. Dazu gehrt auch das Kopieren von Speicher- bereichen in den Bildschirm hinein oder ebenso heraus. v_get_pixelV_GET_PI.C Pixelstatus ermitteln (gesetzt oder gelscht). vr_trnfmVR_TRNFM.C Raster in gertespezifische Formate transformieren. vro_cpyfmVRO_CPYF.C Bildschirmbereich pixelweise kopieren (opaque). vrt_cpyfmVRT_CPYF.C Bildschirmbereich pixelweise kopieren (transparent). /* * VRO_CPYFM (C) Digital Design 1991 * * COPY RASTER, OPAQUE * * Diese Funktion kopiert das Quellraster nicht an einen anderen * Speicherplatz, sondern verknpft es logisch mit einem anderen * Speicherbereich, dem Zielraster. * Falls die beiden Raster unterschiedliche Gren aufweisen, wird in * der Gre des Quellrasters verknpft. Die Mglichkeit des Vergr- * erns von Rastern wird mit der erweiterten Nachfrage-Funktion * VQ_EXTND..\INQUIRE\VQ_EXTND.C ermittelt. * Die Funktion arbeitet nur mit gertespezifischen Rasterformen. * Entsprechende Umwandlungen sind mit der TRANSFORM-FORM-Funktion * VR_TRNFMVR_TRNFM.C mglich. */ #include void vro_cpyfm( int handle, int vr_mode, int *pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB ) { *(MFDB far **)(contrl + 7) = psrcMFDB; /* Doppelwort-Adresse MFDB */ /* des Quellrasters */ *(MFDB far **)(contrl + 9) = pdesMFDB; /* Doppelwort-Adresse MFDB */ /* des Zielrasters */ intin[0] = vr_mode; /* Modus der logischen Verknpfung * * (q = Quellraster, z = Zielraster, r = * * resultierendes, abgespeichertes Zielraster): * * 0: r = 0 * * 1: r = q AND z * * 2: r = q AND (NOT z) * * 3: r = q (1:1 bertragung) * * 4: r = (NOT q) AND z * * 5: r = z * * 6: r = q XOR z * * 7: r = q OR z * * 8: r = NOT (q OR z) * * 9: r = NOT (q XOR z) * * 10: r = NOT z * * 11: r = q OR (NOT z) * * 12: r = NOT q * * 13: r = (NOT q) OR z * * 14: r = NOT (q AND z) * * 15: r = 1 */ vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate des Eckpunktes * * des Quellrasters * * pxyarray[1] = y-Koordinate des Eckpunktes * * des Quellrasters * * pxyarray[2] = x-Koordinate des diagonal * * gegenberliegenden Eckpunktes * * des Quellrasters * * pxyarray[3] = y-Koordinate des diagonal * * gegenberliegenden Eckpunktes * * des Quellrasters * * pxyarray[4] = x-Koordinate des Eckpunktes * * des Zielrasters * * pxyarray[5] = y-Koordinate des Eckpunktes * * des Zielrasters * * pxyarray[6] = x-Koordinate des diagonal * * gegenberliegenden Eckpunktes * * des Zielrasters * * pxyarray[7] = y-Koordinate des diagonal * * gegenberliegenden Eckpunktes * * des Zielrasters */ VDI( 109, 4, 1, handle ); vdipb[2] = ptsin; } /* * VRT_CPYFM (C) Digital Design 1991 * * COPY RASTER, TRANSPARENT * * Diese Funktion kopiert ein einfarbiges Raster in ein farbiges Raster. * Die Farbe der gesetzten und nicht gesetzten Punkte wird definiert. * Im Gegensatz zur COPY-RASTER-OPAQUE-Funktion VRO_CPYFMVRO_CPYF.C sind hier nur * die auch bei der SET-WRITE-MODUS-Funktion VSWR_MODE..\ATTRIB\VSWR_MOD.C mglichen logi- * schen Verknpfungen erlaubt (replace, transparent, XOR, reverse * transparent). * Wenn die Gre der beiden Raster unterschiedlich ist, bertrgt die * Funktion in der Gre des Quellrasters, angefangen bei der oberen * linken Ecke des Zielrasters. */ #include void vrt_cpyfm( int handle, int vr_mode, int *pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB, int *color_index ) { *(MFDB far **)(contrl + 7) = psrcMFDB; /* Doppelwort-Adresse MFDB */ /* des Quellrasters */ *(MFDB far **)(contrl + 9) = pdesMFDB; /* Doppelwort-Adresse MFDB */ /* des Zielrasters */ intin[0] = vr_mode; /* Zeichenmodus (siehe Funktion vswr_mode) */ intin[1] = color_index[0]; /* Farbindex der gesetzten Punkte */ intin[2] = color_index[1]; /* Farbindex der nicht gesetzten Punkte */ vdipb[2] = pxyarray; /* pxyarray[0] = x-Koordinate des Eckpunktes * * des Quellrasters * * pxyarray[1] = y-Koordinate des Eckpunktes * * des Quellrasters * * pxyarray[2] = x-Koordinate des diagonal * * gegenberliegenden Eckpunktes * * des Quellrasters * * pxyarray[3] = y-Koordinate des diagonal * * gegenberliegenden Eckpunktes * * des Quellrasters * * pxyarray[4] = x-Koordinate des Eckpunktes * * des Zielrasters * * pxyarray[5] = y-Koordinate des Eckpunktes * * des Zielrasters * * pxyarray[6] = x-Koordinate des diagonal * * gegenberliegenden Eckpunktes * * des Zielrasters * * pxyarray[7] = y-Koordinate des diagonal * * gegenberliegenden Eckpunktes * * des Zielrasters */ VDI( 121, 4, 3, handle ); vdipb[2] = ptsin; } /* * VR_TRNFM (C) Digital Design 1990 * * TRANSFORM FORM * * Diese Funktion wandelt Rasterformate vom Standard- ins gerteeigene * Format um und umgekehrt. Es wird immer das aktuelle Format, definiert * im MFDB, in das andere gewandelt. Diese Funktion mu eventuell zum * Einsatz der Funktion VRO_CPYFMVRO_CPYF.C aufgerufen werden, da diese nur mit * gertespezifischem Format einsetzbar ist. */ #include void vr_trnfm( int handle, MFDB *psrcMFDB, MFDB *pdesMFDB ) { *(MFDB far **)(contrl + 7) = psrcMFDB; /* Doppelwort-Adresse MFDB */ /* des Quellrasters */ *(MFDB far **)(contrl + 9) = pdesMFDB; /* Doppelwort-Adresse MFDB */ /* des Zielrasters */ VDI( 110, 0, 0, handle ); } /* * V_GET_PIXEL (C) Digital Design 1990 * * Diese Funktion ermittelt, ob ein definierter Punkt eines Grafik- * bereiches (z.B. Bildschirm) gesetzt ist oder nicht. Weiterhin wird * die Farbe dieses Punktes festgestellt. */ #include void v_get_pixel( int handle, int x, int y, int *pel, int *index ) { ptsin[0] = x; /* x-Koordinate des Punktes */ ptsin[1] = y; /* y-Koordinate des Punktes */ VDI( 105, 1, 0, handle ); *pel = intout[0]; /* Wert des Punktes (0 oder 1) */ *index = intout[1]; /* Farbe des Punktes */ } VDI-Funktionen Die VDI-Funktionen lassen sich in folgende Gruppen gliedern: KontrollfunktionenCONTROL\CONTROL.HLP AusgabefunktionenOUTPUT\OUTPUT.HLP AttributfunktionenATTRIB\ATTRIB.HLP RasterfunktionenRASTER\RASTER.HLP EingabefunktionenINPUT\INPUT.HLP NachfragefunktionenINQUIRE\INQUIRE.HLP EscapefunktionenESCAPE\ESCAPE.HLP Die zum Arbeiten mit den VDI-Funktionen ntigen Konstanten, Daten- strukturen und Funktionsprototypen finden Sie in der Datei VDI.H. Whrend das AES-System in erster Linie die Basis fr eine bedie- nungsfreundliche Benutzeroberflche sein soll, sind die VDI-Funktionen als standardisiertes Grafiksystem zu verstehen. Dem Programmierer stellt sich VDI als eine sehr umfangreiche Grafik- bibliothek dar, deren Ausgabeformat ber mehrere Computersysteme hinweg portabel ist. Fr ein systemunabhngiges Grafiksystem ist ein von der jeweiligen Hardware unabhngiges Koordinatensystem ntig. In VDI sind dies die Normalkoordinaten. Der Ursprung dieses Koordinatensystems liegt in der linken unteren Ecke, der Wertebereich reicht von 0 bis 32767, schpft demnach die 16 Bit eines Maschinenwortes voll aus. Daneben gibt es jedoch noch ein zweites Koordinatensystem, die Rasterkoordinaten, mit deren Hilfe groflchige Kopieroperationen und Verschiebungen ohne Ge- schwindigkeitsverlust durchgefhrt werden knnen. Unter GEM kann man also wahlweise zwei verschiedene Koordinatensysteme verwenden. . E;.. DRIVE E<INTFACE ELINTRUPT E_KEYBD EcPRINTER EhSCREEN EmSPECIAL FTIMER $FXBIOS HLP }MREAD_ME TXT!V. E<.. E;DMAREAD o=DMAWRITE >DRIVE HLP q?FLOPFMT 'oC@2FLOPRATE uBFLOPRD *jCCFLOPVER nEFLOPWR LlCG5PROTOBT ְH 42 DMAread int DMAread( long sector, int count, void *buffer, int devno ); Die XBiosroutine DMAread liest einzelne oder mehrere Sektoren einer DMA-Einheit. Sector ist die Nummer des ersten Sektors, count die Anzahl der zu lesenden Sek- toren, buffer ist ein Zeiger auf den Standard-RAM des TT, in den die Daten gelesen werden sollen, devno ist die DMA-Einheit von der gelesen werden soll. Folgende Werte sind fr denvo erlaubt: 0 - 7 ACSI devices, 8 - 15 SCSI devicee, andere reserviert. Die Funktion liefert als Ergebnis eine 0, wenn kein Fehler passiert ist, ansonsten einen Fehlercode. Hinweis: Dise Funktion ist nur im TOS030 des TT vefgbar. 43 DMAwrite int DMAwrite( long sector, int count, void *buffer, int devno ); Die XBIOS-Routine DMAwrite schreibt einzelne oder mehrere Sektoren auf einer DMA-Einheit. Sector ist die Nummer des ersten Sektors, count die Anzahl der zu schreibenden Sektoren, buffer ist ein Zeiger auf den Standard-RAM des TT, von dem die Daten geschrieben werden sollen, devno ist die DMA-Einheit von der geschrieben werden soll. Folgende Werte sind fr denvo erlaubt: 0 - 7 ACSI devices, 8 - 15 SCSI devicee, andere reserviert. Die Funktion liefert als Ergebnis eine 0, wenn kein Fehler passiert ist, ansonsten einen Fehlercode. Hinweis: Dise Funktion ist nur im TOS030 des TT vefgbar. Laufwerksfunktionen 8 FloprdFLOPRD Einzelne Sektoren lesen. 9 FlopwrFLOPWR Einzelne Sektoren schreiben. 10 FlopfmtFLOPFMT Spur auf einer Diskette formatieren. 18 ProtobtPROTOBT Bootsektor fr Diskette im Speicher generieren. 19 FlopverFLOPVER Sektoren mit Speicherinhalt vergleichen. 41 FloprateFLOPRATE Lesen oder Setzen der Seekrate. (erst ab TOS Version 1.4 verfgbar) Ab TOS030 (TT) 42 DMAreadDMAREAD Sektoren von Festplatte lesen. 43 DMAwriteDMAWRITE Sektoren auf Festplate schreiben. 10 Flopfmt int Flopfmt( void *buf, long filler, int devno, int spt, int trackno, int sideno, int interlv, long magic, int virgin ); Diese Routine dient zum Formatieren eines Tracks auf der Diskette. Die Parameter haben dabei folgende Bedeutung: virgin: Mit diesem Wert werden die Sektoren beim Formatieren beschrieben. Als Standardwert hierzu empfiehlt sich $E5E5. Das Hi-Nibble jedes Bytes darf dabei nicht den Wert $F enthalten. magic: Als magic mu die Konstante $87654321 benutzt werden, sonst wird die Formatierung abgebrochen. interlv:Bestimmt, in welcher Reihenfolge die Sektoren auf Diskette geschrieben werden, normalerweise 1. sideno: Damit wird die Diskettenseite ausgewhlt (0 oder 1). trackno:Die Nummer des Tracks, der formatiert werden soll (0-79). spt: Sektoren pro Track, normalerweise 9. dev: Das Laufwerk, 0 fr A und 1 fr B. filler: unbenutztes Langwort buf: Puffer fr die kompletten Trackdaten; bei 9 Sektoren pro Track mu der Puffer mindestens 8 KByte gro sein. Die Funktion gibt als Ergebnis einen Fehlercode..\..\BIOS\ERROR zurck. Der Wert -16, bad sectors, bedeutet, da bei einigen Sektoren die Daten nicht korrekt zurckgelesen werden konnten. In diesem Fall steht im Puffer eine Liste von schlechten Sektoren (Wort-Daten, durch Null abgeschlossen). Sie knnen daraufhin nochmal formatieren oder die Sektoren als schlecht markieren. Beispiel: move.w #$E5E5,-(sp) * Initial-Daten move.l #$87654321,-(sp) * magic move.w #1,-(sp) * interleave move.w #0,-(sp) * Seite 0 move.w #79,-(sp) * Track 79 move.w #9,-(sp) * 9 Sektoren pro Track move.w #0,-(sp) * Laufwerk A clr.l -(sp) move.l #puffer,-(sp) move.w #10,-(sp) * Flopfmt trap #14 add.l #26,sp tst d0 bmi error ... puffer: ds.b $2000 * 8 K Puffer 41 Floprate int Floprate( int devno, int newrate ); Die XBIOS-Routine Floprate liefert die augenblickliche seek rate, wenn fr newrate -1 bergeben wird. Sonst wird die seek rate auf den Wert in newrate gesetzt. Gltige seek rate Werte sind: Wert seek rate ----------------- 00 6 ms 01 12 ms 02 2 ms 03 3 ms Es wird keine Bereichsberprfung fr devno und newrate vorgenommen. Hinweis: Floprate wird erst ab TOS 1.4 untersttzt. 8 Floprd int Floprd( void *buf, long filler, int devno, int sectno, int trackno, int sideno, int count ); Mit dieser XBIOS-Funktion lassen sich ein oder mehrere Sektoren von Diskette lesen. Die Parameter haben dabei folgende Bedeutung: count: Gibt an, wieviel Sektoren nacheinander gelesen werden. Dabei sind Werte zwischen eins und neun (Anzahl der Sektoren pro Track) mglich. sideno: Whlt die Diskettenseite aus, 0 bei einseitigen Laufwerken und 0 oder 1 bei doppelseitigen Laufwerken. trackno:Damit wird die Tracknummer bestimmt (0-79 bei 80-Spur- Laufwerken oder 0-39 bei 40-Spur-Laufwerken). sectno: Die Sektornummer des ersten zu lesenden Sektors (1-9). devno: Bestimmung der Laufwerksnummer, 0 fr Laufwerk A und 1 fr Laufwerk B. filler: unbenutztes Langwort. buf: Puffer, in den die Diskettendaten geschrieben werden sollen. Der Puffer mu an einer Wortgrenze beginnen und gro genug fr die zu lesenden Daten sein (512 Bytes mal Anzahl der Sektoren). Die Funktion liefert als Ergebnis einen Fehlercode..\..\BIOS\ERROR. Beispiel: move.w #1,-(sp) * einen Sektor lesen move.w #0,-(sp) * Seite 0 move.w #0,-(sp) * Track 0 move.w #1,-(sp) * Sektor 1 move.w #1,-(sp) * Laufwerk B clr.l -(sp) move.l #puffer,-(sp) move.w #8,-(sp) * Floprd trap #14 add.l #20,sp tst d0 * Fehler aufgetreten ? bmi error * ja ... puffer: ds.b 512 * Puffer fr einen Sektor 19 Flopver int Flopver( void *buf, long filler, int devno, int secno, int trackno, int sideno, int count ); Diese Funktion dient zum Verifizieren eines oder mehrerer Sektoren auf der Diskette. Dabei werden die Sektoren von Diskette gelesen und mit dem Pufferinhalt im Speicher verglichen. Die Parameter haben die gleiche Bedeutung wie bei den Funktionen zum Lesen (8 FloprdFLOPRD) und Schreiben (9 FlopwrFLOPWR) von Sektoren. Stimmen Sektor- und Pufferinhalt berein, so wird als Ergebnis der Funktion Null zurckgegeben. Bei einem Fehler steht die negative Fehlernummer..\..\BIOS\ERROR in D0. Im Fehlerfalle steht im Puffer eine Liste der fehlerhaften Sektoren (16-Bit-Werte), die durch ein Nullwort abgeschlossen ist. Benutzt man zum Schreiben von Sektoren die BIOS-Funktion 5 Rwabs..\..\BIOS\RWABS und ist die Variable fverify (bei $444) gesetzt, so werden die Sektoren nach dem Schreiben automatisch verifiziert. Beispiel: move.w #1,-(sp) * 1 Sektor move.w #0,-(sp) * Seite Null move.w #39,-(sp) * Track 39 move.w #1,-(sp) * Sektor 1 move.w #0,-(sp) * Laufwerk A clr.l -(sp) move.l #puffer,-(sp) * Pufferadresse move.w #19,-(sp) * Flopver trap #14 add.l #16,sp tst d0 * Fehler ? bmi error 9 Flopwr int Flopwr( void *buf, long filler, int devno, int sectno, int trackno, int sideno, int count ); Mit dieser XBIOS-Funktion lassen sich ein oder mehrere Sektoren auf Diskette schreiben. Die Parameter haben dabei die gleiche Bedeutung wie bei der Funktion 8 FloprdFLOPRD. Die Funktion liefert als Ergebnis wieder einen Fehlercode..\..\BIOS\ERROR, der die gleiche Bedeutung wie beim Sektorlesen hat. Beispiel: move.w #3,-(sp) * drei Sektoren schreiben move.w #0,-(sp) * Seite 0 move.w #7,-(sp) * Track 7 move.w #1,-(sp) * Sektor 1 move.w #0,-(sp) * Laufwerk A clr.l -(sp) move.l #puffer,-(sp) * Adresse des Puffers move.w #9,-(sp) * Flopwr trap #14 add.l #20,sp tst d0 * Fehler aufgetreten ? bmi error * ja ... puffer: ds.b 3*512 * Puffer fr 3 Sektoren 18 Protobt void Protobt( void *buf, long serialno, int disktype, int execflag ); Diese Funktion dient dazu, einen Bootsektor zu erzeugen. Ein Bootsektor steht auf Track 0, Sektor 1, Seite 0 einer Diskette und gibt dem DOS Auskunft ber den Diskettentyp. Ist der Bootsektor ausfhrbar, kann damit das Betriebssystem geladen werden. Mit dieser Funktion knnen Sie einen neuen Bootsektor erzeugen, etwa fr ein anderes Disketten- format, oder einen vorhandenen Bootsektor verndern. Die Parameter haben folgende Bedeutung: execflag: Damit wird entschieden, ob der Bootsektor ausfhrbar ist: 0 = nicht ausfhrbar; 1 = ausfhrbar; -1= Bootsektor bleibt so, wie er war. disktype: 0 = 40 Track, single sided (180 K); 1 = 40 Track, double sided (360 K); 2 = 80 Track, single sided (360 K); 3 = 80 Track, double sided (720 K); 4 = High-Density (nur wenn im _FDC-Cookie der Wert fr HD-Untersttzung eingetragen ist); 5 = Extra-High-Density (nur wenn im _FDC-Cookie der Wert fr ED-Untersttzung eingetragen ist); -1= Disktyp bleibt unverndert. serialno: ist eine 24-Bit-Seriennummer, die in den Bootsektor geschrieben wird. Ist die Seriennummer grer als 24 Bits ($01000000), so wird eine Zufalls-Seriennummer erzeugt (mit der XBIOS-Funktion Random..\SPECIAL\RANDOM (17)). Ein Wert von -1 bedeutet, da die Seriennummer nicht verndert wird. buf: ist die Adresse eines 512-Byte-Puffers, der den Bootsektor enthlt bzw. in dem der Bootsektor erzeugt wird. Ein Bootsektor hat folgenden Aufbau: Adresse 40 Track SS 40 Track DS 80 Track SS 80 Track DS 0 - 1 Branch-Befehl auf Bootprogramm sofern ausfhrbar 2 - 7 'Loader' 8 - 10 24-Bit-Seriennummer 11 - 12 BPS 512 512 512 512 13 SPC 1 2 2 2 14 - 15 RES 1 1 1 1 16 FAT 2 2 2 2 17 - 18 DIR 64 112 112 112 19 - 20 SEC 360 720 720 1440 21 MEDIA 252 253 248 249 22 - 23 SPF 2 2 5 5 24 - 25 SPT 9 9 9 9 26 - 27 SIDE 1 2 1 2 28 - 29 HID 0 0 0 0 510-511 CHECKSUM Die Abkrzungen haben dabei folgende Bedeutung: BPS: Bytes pro Sektor. Die Sektorgre ist bei allen Formaten einheitlich 512 Bytes. SPC: Sektoren pro Cluster. Die Anzahl der Sektoren, die vom DOS zu einem Block zusammengefat werden, 2 Sektoren gleich 1 KByte. RES: Anzahl der reservierten Sektoren am Beginn der Diskette einschlielich dem Bootsektor. FAT: Die Anzahl der File Allocation Tables auf der Diskette. DIR: Die maximale Anzahl der Directory-Eintrge. SEC: Die Gesamtzahl der Sektoren auf der Diskette. MEDIA: Media Descriptor Byte, wird vom ST-BIOS nicht benutzt. SPF: Anzahl der Sektoren pro FAT. SPT: Anzahl Sektoren pro Track. SIDE: Anzahl der Seiten auf der Diskette. HID: Anzahl der versteckten Sektoren auf der Diskette. Der Bootsektor ist kompatibel zu MS-DOS. Deshalb sind alle 16-Bit-Worte im 80x86-Format abgespeichert (erst Low-Byte, dann Hi-Byte). Ist die Checksumme des gesamten Bootsektors $1234, so ist der Sektor ausfhrbar. In diesem Falle steht ab Adresse 30 das Bootprogramm. Beispiel: move.w #-1,-(sp) * Ausfhrbarkeit nicht ndern move.w #3,-(sp) * 80 Tracks, DS move.l #-1,-(sp) * Seriennummer nicht ndern move.l #puffer,-(sp) move.w #18,-(sp) * Protobt trap #14 lea 14(sp),sp puffer: ds.b 512 Mit diesem Beispielprogramm kann z.B. ein vorhandener Bootsektor fr 80 Tracks, double sided, angepat werden. Bemerkungen: - Damit die Diskette auch auf MS-DOS-Systemen lesbar ist, mu man manuell die hexadezimalen Werte $E9 $00 $4E in die ersten drei Bytes des Bootsektors eintragen. - Protobt neigt zur Verschwendung: auf einer normalen 720K-Diskette wird Platz fr 5 FAT-Sektoren angelegt, obwohl 3 vllig reichen wrden.. EL.. E;BCONMAP oMDOSOUND N?GIACCESS %PJIKBDWS pRINTFACE HLP -ySKIOREC pTKBDVBASE IWMFPINT zYWMIDIWS zZOFFGIBIT p[_ONGIBIT K\[RSCONF hw] 44 Bconmap long Bconmap( int devno ); Die XBIOS-Routine Bconmap whlt eine der seriellen Schnittstellen fr die Biosausgabe aus. Devno kann dabei folgende Werte annehmen: -1 keine nderung, 0 ST-kompatibler RS232-Port, 1 SCC Kanal B, 2 TTMFP RS232-Port, 3 SCC Kanal A, >4 eigene Treiber. Bconmap liefert die alte Einstellung. Falls devno gleich -2 ist liefert die Funktion einen Zeiger auf BCONMAP zurck: typedef struct { MAPTAB *maptab; int maptabsize; } BCONMAP; typedef struct { int (*Bconstat) (); long (*Bconin) (); int (*Bcostat) (); void (*Bconout) (); long (*Rsconf) (); IOREC *iorec; } MAPTAB; typedef struct { void *ibuf; int ibufsiz; int ibufhd; int ibuftl; int ibuflow; int ibufhi; } IOREC; Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. Wird die Funktion auf einem ST verwendet, liefert sie die Konstante 44 zurck. 32 Dosound void Dosound( void *buf ); Diese Funktion erlaubt eine automatische komfortable Abarbeitung eines Sounds. Dazu mu 'buf' auf einen String von Soundbefehlen zeigen. Folgende Befehle knnen benutzt werden: Befehle $00 - $0F Diese Befehle werden als Registernummer des Soundchips interpre- tiert. Ihnen folgt jeweils ein Byte, das in das entsprechende Register geladen wird. Befehl $80 Diesem Befehl folgt ein Argument, das in ein temporres Register geladen wird. Befehl $81 Diesem Befehl mssen drei Argumente folgen. Das erste Argument ist die Nummer des Registers des Soundchips, in das der Inhalt des temporren Registers geladen wird. Das zweite Argument ist ein Zweierkomplementwert, der zu dem temporren Register addiert wird. Das dritte Argument enthlt ein Endekriterium. Das Ende ist erreicht, wenn der Inhalt des temporren Registers gleich dem Endekriterium ist. Befehle $82 - $FF Diesen Befehlen folgt jeweils ein weiteres Argument. Lautet dieses Argument Null, so wird die Soundverarbeitung abgebrochen. Ansonsten gibt dieses Argument an, wieviele Timerticks (20 ms, 50 Hz) bis zur nchsten Verarbeitung des Sounds vergehen sollen. Beispiel: move.l #buf,-(sp) * Buffer fr Sound-Befehle move.w #32,-(sp) * Dosound trap #14 addq.l #6,sp ... buf: dc.b 0,10,1,50,... 28 Giaccess char Giaccess( char data, int regno ); Diese Funktion erlaubt den Zugriff auf die Register des GI-Soundchips. 'regno' mu dabei die Registernummer des Soundchips enthalten: 0,1 12-Bit-Periodendauer Kanal A 2,3 12-Bit-Periodendauer Kanal B 4,5 12-Bit-Periodendauer Kanal C 6 5-Bit-Periodendauer des Rausch-Generators 7 Bit 0: Ton Kanal A ein(=0)/aus(=1) Bit 1: Ton Kanal B ein(=0)/aus(=1) Bit 2: Ton Kanal C ein(=0)/aus(=1) Bit 3: Rauschen Kanal A ein(=0)/aus(=1) Bit 4: Rauschen Kanal B ein(=0)/aus(=1) Bit 5: Rauschen Kanal C ein(=0)/aus(=1) Bit 6: Port A in(=0)/out(=1) Bit 7: Port B in(=0)/out(=1) 8 4-Bit-Amplitude Kanal A 9 4-Bit-Amplitude Kanal B 10 4-Bit-Amplitude Kanal C 11,12 16-Bit-Periodendauer des Hllkurven-Generators 13 4-Bit-Hllkurvenform 14 8-Bit Port A 15 8-Bit Port B Ob das angegebene Register gelesen werden soll oder ob in das Register geschrieben wird, wird durch Bit 7 der Registernummer entschieden: Bit 7 = 0: lesen = 1: schreiben Beim Schreiben wird in 'data' der zu schreibende 8-Bit-Wert bergeben; beim Lesen liefert die Funktion den Inhalt des entsprechenden Registers. Beispiel: move.w #$80+3,-(sp) * Register 3 schreiben move.w #$50,-(sp) * zu schreibender Wert move.w #28,-(sp) * Giaccess trap #14 addq.l #6,sp 25 Ikbdws void Ikbdws( int count, void *ptr ); Zum bermitteln von Befehlen an den Tastaturprozessor (intelligent keyboard) dient diese XBIOS-Funktion. 'ptr' ist dabei die Adresse eines Strings, der gesendet werden soll, 'count' ist die Lnge des Strings minus 1. Beispiel: move.l #string,-(sp) * Adresse des Strings move.w #strend-string-1,-(sp) * Lnge minus 1 move.w #25,-(sp) * Ikbdws trap #14 addq.l #8,sp ... string: dc.b $80,1 * Reset IKBD-Chip strend: Schnittstellen-Programmierung 12 MidiwsMIDIWS Strings lesen und schreiben auf MIDI-Schnittstelle. 13 MfpintMFPINT Programmierung des Multifunktionsperipherie-Chips. 14 IorecIOREC Interruptpuffer fr RS232, Tastatur-Chip und MIDI-Schnittstelle abfragen. 15 RsconfRSCONF Konfiguration der RS232-Schnittstelle. 25 IkbdwsIKBDWS Programmierung des Tastatur-Chips. 28 GiaccessGIACCESS Register des GI-Soundchips lesen und schreiben. 29 OffgibitOFFGIBIT Bit im Port A-Register des GI-Chips lschen. 30 OngibitONGIBIT Bit im Port A-Register des GI-Chips setzen. 32 DosoundDOSOUND Sound-Befehle abschicken. 34 KbdvbaseKBDVBASE Puffer und Interruptvektoren fr Maus-, MIDI- und Tastaturschnittstelle abfragen. 44 BconmapBCONMAP Auswhlen einer seriellen Schnittstelle (ab TOS030) 14 Iorec IOREC *Iorec( int dev ); Mit dieser Funktion wird ein Zeiger auf einen Puffer-Datensatz fr ein Eingabegert geholt. Folgende Eingabegerte knnen angegeben werden: dev Eingabegert 0 RS232 1 Tastatur 2 MIDI Der Puffer-Datensatz fr ein Eingabegert hat folgenden Aufbau: typedef struct { void *ibuf; /* Zeiger auf Eingabepuffer */ int ibufsiz; /* Gre des Eingabepuffers */ int ibufhd; /* Head Index */ int ibuftl; /* Tail Index */ int ibuflow; /* Low water mark */ int ibufhi; /* High water mark */ } IOREC; Bei dem Eingabepuffer handelt es sich um einen zirkulren Puffer, der Head Index gibt die nchste Schreibposition an (der Puffer wird von einer Interruptroutine gefllt) und der Tail Index gibt an, von wo aus dem Puffer gelesen werden kann. Sind Head und Tail Index gleich, so ist der Puffer leer. Low und High water mark werden im Zusammenhang mit der Kommunikationskontrolle bei RS232 benutzt (XON/XOFF oder RTS/CTS). Ist der Eingabepuffer bis zur High water mark gefllt, so wird dem Sender ber XOFF bzw. CTS mitgeteilt, da der Rechner keine weiteren Daten mehr empfangen kann. Werden die empfangenen Daten dann vom Rechner weiterverar- beitet, so da der Pufferinhalt unter die Low water mark sinkt, so wird die bertragung wieder freigegeben. Fr die RS232-Ausgabe existiert ein gleich aufgebauter Puffer- Datensatz, der sich direkt an den Eingabe-Datensatz anschliet. Beispiel: move.w #1,-(sp) * Pufferdatensatz fr Tastatur move.w #14,-(sp) * Iorec trap #14 addq.l #4,sp ... Ergebnis: $DB0 Die folgende Tabelle enthlt die Daten fr alle Gerte: RS232 Eingabe RS232 Ausgabe Tastatur MIDI --------------------------------------------------------------- Adresse $D8E ($D9C) $DB0 $DBE Pufferadresse $A0E $B0E $C0E $D0E Pufferlnge $100 $100 $100 $80 Head Index 0 0 0 0 Tail Index 0 0 0 0 Low water mark $40 $40 $40 $20 High water mark $C0 $C0 $C0 $60 Head und Tail Index sind natrlich vom augenblicklichen Betriebs- zustand abhngig. High und Low water mark sind jeweils auf 3/4 bzw. 1/4 der Puffergre gesetzt. Sie sind nur bei eingeschalte- tem XON/XOFF bzw. RTS/CTS bei RS232 von Bedeutung. 34 Kbdvbase KBDVBASE *Kbdvbase( void ); Diese XBIOS-Funktion liefert einen Zeiger auf eine Vektortabelle, die die Adressen von Routinen enthlt, die Tastatur- und MIDI- Daten verarbeiten. Die Tabelle ist folgendermaen aufgebaut: typedef struct { void (*kb_midivec)(); /* MIDI-Eingabe */ void (*kb_vkbderr)(); /* Tastatur-Fehler */ void (*kb_vmiderr)(); /* MIDI-Fehler */ void (*kb_statvec)(); /* IKBD Status */ void (*kb_mousevec)(); /* Maus-Routinen */ void (*kb_clockvec)(); /* Uhrzeit-Routine */ void (*kb_joyvec)(); /* Joystick-Routinen */ void (*kb_midisys)(); /* MIDI-Systemvektor */ void (*kb_kbdsys)(); /* IKBD-Systemvektor */ } KBDVBASE; 'midivec' zeigt auf eine Routine, die die empfangenen Daten vom MIDI-Eingang (Byte in D0) in den MIDI-Puffer schreibt. 'vkbderr' und 'vmiderr' werden aufgerufen, wenn ein berlauf von der Tastatur- oder MIDI-ACIA gemeldet wird. Die restlichen vier Routinen 'statvec', 'mousevec', 'clockvec' und 'joyvec' verarbeiten die entsprechenden Datenpakete, die von der Tastatur-ACIA kommen. Diesen Routinen wird ein Zeiger auf das empfangene Paket in A0 und auf dem Stack bergeben. Der Maus-Vektor wird von GEM benutzt. Wenn Sie eigene Routinen be- nutzen wollen, so mssen sie mit RTS abgeschlossen werden und drfen nicht lnger als eine Millisekunde Verarbeitungszeit bentigen. Die Routinen 'midisys' und 'ikbdsys' werden aufgerufen, wenn ein Zeichen an der betreffenden ACIA zur Verfgung steht. 'midisys' holt das Zeichen und springt dann ber 'midivec'; 'ikbdsys' holt ein Datenpaket von der ACIA und verzweigt dann in die oben beschriebenen Unterroutinen. Beispiel: move.w #34,-(sp) * Kbdvbase trap #14 addq.l #2,sp 13 Mfpint void Mfpint( int erno, void (*vector)() ); Damit kann eine Interruptroutine im MFP initialisiert werden. In 'erno' mu dabei die Nummer des MFP-Interrupts stehen: 0 I/O-Port Bit 0 Busy par. Schnittstelle 1 RS-232 DCD 2 RS-232 CTS 3 Blitter 4 Timer D, RS232-232 Baud-Generator 5 Timer C, 200-Hz System-Uhr 6 Tastatur und MIDI 7 FDC und DMA 8 Timer B Zeilenrcklauf 9 RS-232 Sendefehler 10 RS-232 Sendepuffer leer 11 RS-232 Empfangspuffer voll 12 RS-232 Puffer voll 13 Timer A 14 RS-232 RI 15 Monochrom-Monitor Detect 'vector' enthlt die Adresse der zugehrigen Interruptroutine. Der alte Interruptvektor wird dabei berschrieben. Beispiel: move.l #busy,-(sp) * Busy-Interruptroutine move.w #0,-(sp) * Vektor-Nummer 0 move.w #13,-(sp) * Mfpint trap #14 addq.l #8,sp ... busy: ... 12 Midiws void Midiws( int cnt, void *ptr ); Mittels dieser Funktion ist es mglich, einen String an die MIDI-Schnittstelle auszugeben (MIDI OUT). ptr mu dabei auf den String zeigen, cnt mu die Anzahl der Zeichen minus 1 enthalten, die gesendet werden. Beispiel: move.l #string,-(sp) * Adresse des Strings move.w #stringend-string-1,-(sp) * Lnge move.w #12,-(sp) * midiws trap #14 addq.l #8,sp ... string: dc.b 'MIDI-Daten' stringend: 29 Offgibit void Offgibit( int bitno ); Mit diesem Funktionsaufruf lt sich selektiv ein Bit im Port A des Soundchips lschen. Port A ist ein 8-Bit- Ausgabe-Port, in dem die einzelnen Bits folgende Bedeutung haben: Bit 0: Floppy Seite 0/Seite 1 selektieren Bit 1: Floppy Laufwerk A selektieren Bit 2: Floppy Laufwerk B selektieren Bit 3: RS232 RTS (Request to Send) Bit 4: RS232 DTR (Data Terminal Ready) Bit 5: Centronics Strobe Bit 6: General Purpose Output Bit 7: unbenutzt Beispiel: move.w #4,-(sp) * DTR-Bit move.w #29,-(sp) * Offgibit trap #14 addq.l #4,sp 30 Ongibit void Ongibit( int bitno ); Mit diesem Funktionsaufruf lt sich selektiv ein Bit im Port A des Soundchips setzen. Port A ist ein 8-Bit- Ausgabe-Port, in dem die einzelnen Bits folgende Bedeutung haben: Bit 0: Floppy Seite 0/Seite 1 selektieren Bit 1: Floppy Laufwerk A selektieren Bit 2: Floppy Laufwerk B selektieren Bit 3: RS232 RTS (Request to Send) Bit 4: RS232 DTR (Data Terminal Ready) Bit 5: Centronics Strobe Bit 6: General Purpose Output Bit 7: unbenutzt Beispiel: move.w #4,-(sp) * DTR-Bit move.w #30,-(sp) * Ongibit trap #14 addq.l #4,sp 15 Rsconf long Rsconf( int baud, int ctr, int ucr, int rsr, int tsr, int scr ); Diese XBIOS-Funktion dient zum Konfigurieren der RS232 Schnittstelle. Die Parameter haben dabei folgende Bedeutung: scr: Synchronuous Character Register im MFP tsr: Transmitter Status Register im MFP rsr: Receiver Status Register im MFP ucr: USART Control Register im MFP ctrl: Kommunikationsparameter baud: Baudrate Ist einer der Parameter -1, so wird der vorherige Wert beibehalten. Mit dem ctrl-Parameter knnen Sie den Handshake-Modus whlen: ctrl Bedeutung 0 kein Handshake, default nach dem Einschalten 1 XON/XOFF 2 RTS/CTS 3 XON/XOFF und RTS/CTS (nicht sinnvoll) Der baud-Parameter enthlt eine Kennziffer fr die Baudrate. baud Baudrate 0 19200 1 9600 2 4800 3 3600 4 2400 5 2000 6 1800 7 1200 8 600 9 300 10 200 11 150 12 134 13 110 14 75 15 50 Beispiel: move.w #-1,-(sp) * MFP-Register nicht verndern move.w #-1,-(sp) move.w #-1,-(sp) move.w #-1,-(sp) move.w #1,-(sp) * XON/XOFF move.w #9,-(sp) * 300 Baud move.w #15,-(sp) * Rsconf trap #14 add.l #14,sp . E_.. E;INTRUPT HLP 9`pJDISINT aJENABINT bInterruptfunktionen 26 JdisintJDISINT Interrupts sperren. 27 JenabintJENABINT Interrupts freigeben. 26 Jdisint void Jdisint( int number ); Diese Funktion ermglicht es, einen Interrupt des MFP 68901 selektiv zu sperren. Als Parameter wird dabei die Interrupt- nummer des MFP bergeben: 0 I/O-Port Bit 0 Busy par. Schnittstelle 1 RS-232 DCD 2 RS-232 CTS 3 Blitter 4 Timer D, RS232-232 Baud-Generator 5 Timer C, 200-Hz System-Uhr 6 Tastatur und MIDI 7 FDC und DMA 8 Timer B Zeilenrcklauf 9 RS-232 Sendefehler 10 RS-232 Sendepuffer leer 11 RS-232 Empfangspuffer voll 12 RS-232 Puffer voll 13 Timer A 14 RS-232 RI 15 Monochrom-Monitor Detect Beispiel: move.w #10,-(sp) * RS232 Transmitter Interrupt sperren move.w #26,-(sp) * disable Interrupt trap #14 addq.l #4,sp 27 Jenabint void Jenabint( int number ); Soll ein Interrupt des MFP wieder freigegeben werden, so knnen Sie dazu diese Funktion benutzen. bergeben wird dabei die Nummer des Interrupts: 0 I/O-Port Bit 0 Busy par. Schnittstelle 1 RS-232 DCD 2 RS-232 CTS 3 Blitter 4 Timer D, RS232-232 Baud-Generator 5 Timer C, 200-Hz System-Uhr 6 Tastatur und MIDI 7 FDC und DMA 8 Timer B Zeilenrcklauf 9 RS-232 Sendefehler 10 RS-232 Sendepuffer leer 11 RS-232 Empfangspuffer voll 12 RS-232 Puffer voll 13 Timer A 14 RS-232 RI 15 Monochrom-Monitor Detect Beispiel: move.w #12,-(sp) * RS232 Receiver Interrupt freigeben move.w #27,-(sp) * enable Interrupt trap #14 addq.l #4,sp . Ec.. E;BIOSKEYS adKBRATE QecKEYBD HLP fKEYTBL g 24 Bioskeys void Bioskeys( void ); Wenn Sie mit der XBIOS-Funktion 16, KeytblKEYTBL, eine neue Tastatur- belegung gewhlt haben, stellt diese Funktion wieder die Standard- tastaturbelegung des BIOS her. Sie knnen diese Funktion z.B. vor dem Verlassen eines eigenen Programms aufrufen, das die Tastatur- belegung verndert hat. Beispiel: move.w #24,-(sp) * Bioskeys trap #14 addq.l #2,sp 35 Kbrate int Kbrate( int initial, int repeat ); Mit dieser Funktion kann der Tastatur-Repeat kontrolliert werden. Der Parameter 'initial' gibt die Verzgerungszeit nach dem Drcken einer Taste an, nach der die Taste automatisch wiederholt wird. Der Parameter 'repeat' bestimmt die Zeitspanne, nach der der Tastendruck jeweils wiederholt wird. Diese Werte knnen Sie vom Desktop aus mittels des Kontrollfeldes mit den beiden Schiebereglern ndern. Die Zeiten basieren auf dem 50-Hz-Systemtakt. Wird fr einen der Parameter -1 angegeben, so wird der entsprechende Wert nicht ge- setzt. Die Funktion liefert die vorherigen Werte als Ergebnis: Bit 0-7 enthalten den 'repeat'-Wert und Bit 8-15 den Wert 'initial'. Beispiel: move.w #-1,-(sp) * alte Werte lesen move.w #-1,-(sp) move.w #35,-(sp) * Kbrate addq.l #6,sp Ergebnis: D0 = $0B03 Tastaturfunktionen Die folgenden Funktionen regeln die direkte Programmierung der Tasta- tur. Mit KeytblKEYTBL kann man eine eigene Tastaturtabelle installieren. Die Funktion BioskeysBIOSKEYS dient zur Reinitialisierung der Tastatur: Die Tastatur wird in den Urzustand versetzt. Mit KbrateKBRATE kann man das Ansprechverhalten der Tastatur einstellen. Es geht dabei darum, ab welchem Zeitpunkt in den Auto-Repeat-Modus (automatische Tastatur- wiederholung) umgeschaltet wird, und wie schnell der Auto-Repeat-Modus durchgefhrt wird. 16 KeytblKEYTBL Neue Tabelle fr Tastaturcodes vorgeben 24 BioskeysBIOSKEYS BIOS-Tabelle fr Tastaturcodes zurcksetzen 35 KbrateKBRATE Auto-Repeat der Tastatur ndern oder ermitteln 16 Keytbl void *Keytbl( void *unshift, void *shift, void *capslock ); Mit dieser Funktion ist es mglich, eine neue Tastaturbelegung zu erzeugen. Dazu mssen Sie die Adressen der neuen Tabellen bergeben, die die Tastencodes bei normalen Tasten (ohne Shift), bei gedrckter Shift-Taste und bei Capslock enthalten. Die Funktion liefert als Er- gebnis die Adresse der Vektortabelle, in der die drei Tastaturtabel- lenzeiger stehen. Soll eine Tabelle unverndert bleiben, so mu als Adresse -1 bergeben werden. Eine Tastaturtabelle mu 128 Bytes lang sein. Sie wird ber den Tasten-Scancode adressiert und liefert als Ergebnis den ASCII-Code der jeweiligen Taste. Beispiel: move.l #-1,-(sp) * Caps Lock nicht ndern move.l #shift,-(sp) * Shift-Tabelle move.l #unshift,-(sp) * Tabelle ohne Shift move.w #16,-(sp) trap #14 addq.l #14,sp ... shift: ds.b 128 unshift:ds.b 128 . Eh.. E;PRINTER HLP iPRTBLK 3jSCRDMP kSETPRT ǥlDruckerfunktionen 20 ScrdmpSCRDMP Bildschirminhalt ausdrucken. 33 SetprtSETPRT Druckereinstellung ermitteln oder ndern. 36 PrtblkPRTBLK Hardcopy-Funktion mit Parameterblock. 36 Prtblk void Prtblk( PBDEF *par ); Diese Funktion hnelt der Funktion ScrdmpSCRDMP (20) und wird von dieser benutzt. Die Funktion erwartet jedoch eine Parameterliste, deren Adresse bergeben wird. Diese Liste ist folgendermaen aufgebaut: typedef struct { void *pb_scrptr; /* Adresse des Bildschirm-RAMs */ int pb_offset; int pb_width; /* Bildschirmbreite */ int pb_height; /* Bildschirmhhe */ int pb_left; int pb_right; int pb_screz; /* Bildschirmauflsung (0, 1 oder 2) */ int pb_prrez; /* Druckerauflsung (0 oder 1) */ void *pb_colptr; /* Adresse der Farbpalette */ long pb_prtype; /* Druckertyp (0-3) */ int pb_prport; /* Druckerport (0=Centronics, 1=RS232) */ void *pb_mask; /* Zeiger auf Halbtonmaske */ } PBDEF; Beispiel: move.l #par,-(sp) * Adresse des Parameterblocks move.w #36,-(sp) * Prtblk trap #14 addq.l #6,sp ... par: dc.l ... 20 Scrdmp void Scrdmp( void ); Mit dieser Funktion wird eine Bildschirm-Hardcopy auf einen ange- schlossenen Drucker ausgegeben. Dabei werden die voreingestellten Druckerparameter ('Drucker Anpassung') benutzt. Diese Funktion knnen Sie jederzeit auch durch gleichzeitiges Drcken der Tasten ALT und HELP auslsen oder vom Desktop aus durch 'EXTRAS/Hardcopy'. Beispiel: move.w #20,-(sp) * Hardcopy trap #14 addq.l #2,sp 33 Setprt int Setprt( int config ) Mittels dieser Funktion kann die eingestellte Druckerkonfiguration gelesen oder verndert werden. Enthlt 'config' den Wert -1, so wird nur der augenblickliche Wert geliefert, ansonsten wird der Wert als neue Druckerkonfiguration bernommen. Die Druckerkonfiguration ist ein Bitvektor mit folgender Bedeutung: Bitnummer 0 1 0 Matrixdrucker Typenraddrucker 1 Monochromdrucker Farbdrucker 2 ATARI-Drucker Epson-Drucker 3 Test-Modus Qualitts-Modus 4 Centronics-Port RS232-Port 5 Endlospapier Einzelblatt 6 - 14 reserviert 15 immer 0 Beispiel: move.w #%000100,-(sp) * Epson-Drucker move.w #33,-(sp) * Setprt trap #14 addq.l #4,sp . Em.. E;CURSCONF Tn#EGETPALE pEGETSHIF $qESETBANK rESETCOLO sBESETGRAY itLESETPALE ou ESETSHIF vESETSMEA Ȩw'GETREZ 'x|INITMOUS yLOGBASE j{PHYSBASE |KSCREEN HLP r}SETCOLOR SETPALET SETSCREE BVSYNC ŠREAD_ME TXT!Ȟ 21 Cursconf int Cursconf( int func, int rate ); Diese XBIOS-Funktion dient zur Bestimmung der Cursor-Funktion. 'func' kann dabei Werte von 0-5 annehmen, die folgende Bedeutung haben: Funktion Bedeutung 0 Cursor abschalten 1 Cursor einschalten 2 Cursor blinkend 3 Cursor nicht blinkend 4 Cursor Blinkrate setzen 5 Cursor Blinkrate holen Sie knnen mit dieser Funktion also bestimmen, ob der Cursor sichtbar ist, ob er feststehend ist oder blinkt. Ein definiertes Ergebnis liefert diese XBIOS-Funktion nur, wenn Sie die alte Blinkrate holen. Die Einheit der Blinkfrequenz ist abhngig von der Bildfrequenz: Bei einem Monochrommonitor betrgt sie 70 Hz; ein Farbmonitor wird mit 50 Hz oder 60 Hz betrieben. Mit Funk- tionsnummer 5 knnen Sie eine neue Blinkrate einstellen. Den Parameter 'rate' brauchen Sie nur dann benutzen, wenn Sie eine neue Blinkrate bergeben wollen. Beispiel: move.w #20,-(sp) * 20/70 Sekunden move.w #4,-(sp) * Blinkrate setzen move.w #21,-(sp) * Cursconf trap #14 addq.l #6,sp 85 EgetPalette void EgetPalette( int colorNum, int count, int *palettePtr ); Die XBIOS-Routine EgetPalette liest count Farbeintrge ab colorNum aus der Farbtabelle in das Array palettePtr. Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. 81 Egetshift int Egetshift( void ); Die XBIOS-Routine Egetshift liest das Shift mode register des TT und liefert den Inhalt des Regis- ters als Ergebnis zurck: |S|00|H|0|MMM|0000|BBBB| | | | | | | | +-- Bank | | +------------ Auflsung GetrezGETREZ | | 000 320 * 200 * 4 | | 001 640 * 200 * 2 | | 010 640 * 400 * 1 | | 100 640 * 480 * 4 | | 110 1280 * 960 * 1 | | 111 320 * 480 * 8 | +----------------- Hyper Mode +---------------------- Sample & Hold Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. 82 EsetBank int EsetBank( int bankNum ); Die XBIOS-Routine EsetBank setzt die Banknummer fr die Farbtabelle des TT auf den Wert bankNum. Der erlaubte Wert von bankNum liegt zwischen 0 und 15. Ist bankNum negativ, wird die aktuelle Einstellung nicht verndert. Die Funktion liefert die vorherige Einstellung. Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. 83 EsetColor int EsetColor( int colorNum, int color ); Die XBIOS-Routine EsetColor setzt den Farbeintrag colorNum in der Farbtabelle auf den Wert color. Ein negativer Wert verndert den Eintrag nicht. Die Funktion liefert die vorherige Einstellung. Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. 86 EsetGray int EsetGray( int swtch ); Die XBIOS-Routine EsetGray schaltet die Farbinter- pretation in der Farbtabelle als Graustufe ein (1) bzw. aus (0). Ein negativer Wert verndert die Einstellung nicht. Die Funktion liefert die bisherige Einstellung. Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. 84 EsetPalette void EsetPalette( int colorNum, int count, int *palettePtr ); Die XBIOS-Routine EsetPalette setzt count Farbeintrge ab colorNum in der Farbtabelle auf die Werte im Array palettePtr. Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. 80 Esetshift int Esetshift( int shftMode ); Die XBIOS-Routine Esetshift schreibt in das Shift mode register des TT den Wert shftMode. ShftMode ist ein Bitfeld mit folgender Bedeutung: |S|00|H|0|MMM|0000|BBBB| | | | | | | | +-- Bank EsetBankESETBANK | | +------------ Auflsung SetscreenSETSCREE | | 000 320 * 200 * 4 | | 001 640 * 200 * 2 | | 010 640 * 400 * 1 | | 100 640 * 480 * 4 | | 110 1280 * 960 * 1 | | 111 320 * 480 * 8 | +----------------- Hyper Mode EsetGrayESETGRAY +---------------------- Sample & Hold Die Funktion liefert den vorherigen Wert des Registers. Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. 87 EsetSmear int EsetSmear( int swtch ); Die XBIOS-Routine EsetSmear schaltet die Farbver- wischung ein (1) bzw. aus (0). Ein negativer Wert verndert die Einstellung nicht. Die Funktion liefert die bisherige Einstellung. Hinweis: Diese Funktion ist nur im TOS030 des TT verfgbar. 4 Getrez int Getrez( void ); Dieser Funktionsaufruf liefert den Modus-Wert der Bildschirmauflsung zurck: Modus Auflsung Farben Ebenen Farbwort Bytes/Zeile Bildschirm 0 320 * 200 16 4 8 Bytes 160 32000 Bytes 1 640 * 200 4 2 4 Bytes 160 32000 Bytes 2 640 * 400 2 1 2 Bytes 80 32000 Bytes 4 (TT) 640 * 480 16 4 8 Bytes 320 150 KBytes 6 (TT) 1280 * 960 2 1 2 Bytes 160 150 KBytes 7 (TT) 320 * 480 256 8 16 Bytes 320 150 KBytes Beispiel: move.w #4,-(sp) * getrez trap #14 addq.l #2,sp * D0 = 2 : 640 *400 monochrom 0 Initmouse void Initmouse( int type, MOUSE *par, void (*mousevec)() ); Mit Hilfe dieser XBIOS-Funktion werden die Routinen zur Mouse- Bearbeitung initialisiert. 'mousevec' ist dabei die Adresse einer Routine, die bei einem Mouse-Report vom Tastaturprozessor ange- sprungen wird. 'type' whlt unter folgenden Alternativen aus: type 0 Disable mouse 1 Enable mouse, relativer Modus 2 Enable mouse, absoluter Modus 3 unbenutzt 4 Enable mouse, Tastatur-Modus Damit knnen Sie also auswhlen, ob Mausbewegungen gemeldet werden und auf welche Weise dies geschieht. 'par' zeigt auf einen Parameterblock, der folgendermaen aufgebaut ist: typedef struct { char topmode; char buttons; char x_scale; char y_scale; int x_max; int y_max; int x_start; int y_start; } MOUSE; 'topmode' entscheidet ber die Anordnung des Koordinatensystems. 0 bedeutet Y=0 liegt in der unteren Ecke, 1 bedeutet, da die Y-Achse von oben aus zhlt. 'buttons' ist ein Parameter fr den Befehl 'set mouse buttons' des Tastaturprozessors. 'x_scale' und 'y_scale' sind Skalierungsfaktoren fr die Mouse- Bewegung. Wenn Sie 'type' zu 2 gewhlt haben, also mit absolut mouse arbeiten, bedeuten 'x_max' und 'y_max' die X- und Y-Koordinaten des Maximalwerts, den die Mouse-Position annehmen kann sowie 'x_start' und 'y_start' die Startwerte, auf die die Mouse gesetzt wird. Beispiel: move.l #vector,-(sp) * Adresse der Mouse-Routine move.l #param,-(sp) * Adresse des Parameterblocks move.w #1,-(sp) * enable relative mouse move.w #0,-(sp) * initmouse trap #14 add.l #12,sp ... param: dc.b 12 vector: ... * Mouse Interrupt-Routine 3 Logbase void *Logbase( void ); Die logische Bildschirmbasis ist die Adresse, die bei allen Ausgabefunktionen als Bildschirmbasis benutzt wird. Sind physikalische und logische Bildschirmbasis verschieden, so wird ein Bildschirm dargestellt, whrend in einem anderen RAM-Bereich bereits ein anderes Bild aufgebaut werden kann, welches dann spter angezeigt wird. Beispiel: move.w #3,-(sp) * logbase trap #14 addq.l #2,sp * D0 = $78000 bei 512 KB RAM 2 Physbase void *Physbase( void ); Diese Funktion liefert die Basis des physikalischen Bildschirm- RAMs. Unter der physikalischen Bildschirmadresse versteht man den Speicherbereich, der vom Video-Shifter dargestellt wird. Beispiel: move.w #2,-(sp) * physbase trap #14 addq.l #2,sp * D0 = $F8000 bei 1 MB RAM Bildschirmfunktionen Zur direkten Programmierung des Bildschirms stehen mehrere Funktionen zur Verfgung. Mit InitmouseINITMOUS und CursconfCURSCONF kann man sowohl die Ein- stellung des Grafik- als auch des Textcursors beeinflussen. Fr beson- ders schnelle Animationen erweisen sich die beiden Funktionen LogbaseLOGBASE und PhysbasePHYSBASE als vorteilhaft: Auf dem logischen Bildschirm wird im Hintergrund gezeichnet, dann schaltet man den physikalischen Bild- schirm mit SetscreenSETSCREE um. 0 InitmouseINITMOUS Mauszeiger initialisieren. 2 PhysbasePHYSBASE Anfangsadresse des physikalischen Bildschirmspeichers ermitteln (der dargestellte Bildschirm). 3 LogbaseLOGBASE Anfangsadresse des logischen Bildschirmspeichers er- mitteln (der Bildschirm, auf dem gezeichnet wird). 4 GetrezGETREZ Auflsung ermitteln. 5 SetscreenSETSCREE Festlegen der Bildschirmauflsung und der Bildschirm- adressen. 6 SetpaletteSETPALET Farbpalette auswhlen. 7 SetcolorSETCOLOR Farbe einstellen. 21 CursconfCURSCONF Cursordarstellung ndern oder ermitteln. 37 VsyncVSYNC Vertikales Synchronisationssignal abfragen. AB TOS030 (TT) 80 EsetShiftESETSHIF TT-shift mode register setzen. 81 EgetShiftEGETSHIF TT-shift mode register lesen. 82 EsetBankESETBANK TT-farbtabelle setzen. 83 EsetColorESETCOLO TT-farbtabelleneintrag setzen. 84 EsetPaletteESETPALE TT-farbtabelle laden. 85 EgetPaletteEGETPALE TT-farbtabelle lesen. 86 EsetGrayESETGRAY TT-farbinterpretation setzen. 87 EsetSmearESETSMEA TT-farbverwischung setzen. 7 Setcolor int Setcolor( int colornum, int color ); Diese Funktion erlaubt es, nur eine Farbe zu verndern. Dazu mssen die Farbnummer (0..15) und die zugehrige Farbe (0..$777) angegeben werden. Wenn als Farbe -1 angegeben wird, wird die Farbe nicht gesetzt, und Sie erhalten nur den alten Farbwert zurck. Beispiel: move.w #$777,-(sp) * Farbe wei move.w #1,-(sp) * als Farbnummer 1 move.w #7,-(sp) * setcolor trap #14 addq.l #6,sp 6 Setpalette void Setpalette( void *pallptr ); Mit dieser Funktion kann eine neue Farbpalette geladen werden. Dazu mu 'pallptr' ein Zeiger auf eine Tabelle mit 16 Farben (je ein Wort) sein. Die Adresse der Tabelle mu gerade sein. Die Farben werden zu Beginn des nchsten VBL geladen. Beispiel: move.l #palette,-(sp) * Adresse der neuen Farbtabelle move.w #6,-(sp) * setpalette trap #14 addq.l #6,sp ... palette:dc.w $777,$700,$070,$007,$111,$222,$333,$444 dc.w $555,$000,$001,$010,$100,$200,$020,$002 5 Setscreen void Setscreen( void *laddr, void *paddr, int rez ); Diese Funktion dient zum ndern der Bildschirmparameter, die mit den 3 Funktionen PhysbasePHYSBASE, LogbaseLOGBASE und GetrezGETREZ gelesen werden knnen. Soll ein Parameter nicht gesetzt werden, so mu ein negativer Wert bergeben werden. Die Parameter werden in der nchsten VBL-Routine gesetzt, damit keine Strungen auf dem Bildschirm auftreten. Beispiel: Die physikalische und die logische Bildschirmadresse soll auf $70000 gesetzt, die Auflsung soll beibehalten werden. move.w #-1,-(sp) * Auflsung nicht ndern move.l #$70000,-(sp) * physikalische Basis move.l #$70000,-(sp) * logische Basis move.w #5,-(sp) * setscreen trap #14 add.l #12,sp 37 Vsync void Vsync( void ); Diese Funktion wartet auf den nchsten Bildstrahlrcklauf. Man kann sie z.B. benutzen, um Grafikausgaben mit dem Strahlrcklauf zu synchronisieren. Beispiel: move.w #37,-(sp) trap #14 addq.l #2,sp . F.. E;BLITMODE s#PUNTAES nRANDOM jmDSPECIAL HLP =:SSBRK mFSUPEXEC n{ 64 Blitmode int Blitmode( int mode ); Blitmode ist eine XBIOS-Routine um den Blitter einzu- schalten oder seine Existenz festzustellen. Wenn im Parameter mode der Wert -1 angegeben wird, dann erhlt man den Status des Blitter-Chips. Bei allen anderen Werten wird der Blitter konfiguriert: Bit Beschreibung 0 Blitter oder Line A umschalten 1-14 reserviert (immer 0) 15 immer 0 Achtung: Diese Funktion gibt es zwar nur im Blitter-TOS. Sie liefert aber, wenn man sie nur als Nachfrage- Funktion verwendet, auch im alten TOS den korrekten Wert. (Bit 1 = 0: Blitter nicht vorhanden). Die Funktion liefert als Ergebnis im Bit 0 den Status des Blitters 0 Blitter aus 1 Blitter an und im Bit 1, ob ein Blitter vorhaden ist: 0 Blitter nicht vorhanden 1 Blitter vorhanden. 39 Puntaes void Puntaes( void ); Mit dieser Funktion kann das AES abgeschaltet werden, sofern es sich nicht im ROM befindet. Beispiel: move.w #39,-(sp) * AES abschalten trap #14 addq.l #2,sp 17 Random long Random( void ); Diese Funktion liefert eine 24-Bit-Zufallszahl. Die Bit 24-31 sind dabei Null. Bei jedem Aufruf erhalten Sie ein anderes Ergebnis. Nach dem Einschalten des Rechners wird jedesmal ein anderer Start- wert erzeugt. Beispiel: move.w #17,-(sp) * Random trap #14 addq.l #2,sp Spezialbefehle 1 SsbrkSSBRK Speicherplatz reservieren (nur intern verwendet). 17 RandomRANDOM Zufallszahlengenerator. 38 SupexecSUPEXEC Unterprogramm im Supervisormodus starten. 39 PuntaesPUNTAES AES im ROM abschalten. 64 BlitmodeBLITMODE Blitterkonfiguration ndern oder ermitteln. 1 Ssbrk void *Ssbrk( int count ); Diese Funktion reserviert Speicherplatz. Die Anzahl der Bytes mu dabei in 'count' bergeben werden. Der Speicherplatz wird am obe- ren Ende des Speichers bereitgestellt. Die Funktion liefert als Ergebnis die Adresse des reservierten Speicherbereichs. Diese Funktion mu vor der Initialisierung des Betriebssystems aufgeru- fen werden, d.h. sie mu noch vom Boot-ROM ausgefhrt werden, ehe das Betriebssystem geladen wird. Beispiel: move.w #$400,-(sp) * 1 KByte reservieren move.w #1,-(sp) * Ssbrk trap #14 addq.l #4,sp 38 Supexec long Supexec( void (*func)() ); Soll eine Routine im Supervisor-Modus des 68000-Prozessors ausge- fhrt werden, so knnen Sie dies mit dieser Funktion erreichen. Dazu bergibt man einfach die Adresse der Routine an diese Funktion. Beispiel: move.l #adresse,-(sp) move.w #38,-(sp) trap #14 addq.l #6,sp ... adresse:move.l $400,d0 ... rts . $F.. E;GETTIME +SETTIME hTIMER HLP XBTIMER ؈1 23 Gettime unsigned long Gettime( void ); Diese Funktion liefert das aktuelle Datum und die Uhrzeit in dem bei SettimeSETTIME beschriebenen Format. Im Unterschied zu den GEMDOS-Funktionen Tgetdate..\..\GEMDOS\TIME\TGETDATE und Tgettime..\..\GEMDOS\TIME\TGETTIME werden hier die durch den Tastaturprozessor verwalteten Angaben geliefert, welche auch nach einem Reset erhalten bleiben (mit GettimeGETTIME vernderbar)! Beispiel: move.w #23,-(sp) * Gettime trap #14 addq.l #2,sp move.l d0,time * Zeit und Datum merken 22 Settime void Settime( unsigned long time ); Mit dieser Funktion knnen Sie Uhrzeit und Datum neu setzen. Die Zeit wird dabei im unteren Wort von time bergeben, das Datum im oberen Wort. Zeit und Datum sind folgendermaen kodiert: Bit 0-4 Sekunden in Zweierschritten Bit 5-10 Minuten Bit 11-15 Stunden Bit 16-20 Tag 1-31 Bit 21-24 Monat 1-12 Bit 25-31 Jahr 0-119 (minus Offset 1980) Hinweis: Im Unterschied zu den GEMDOS-Funktionen Tsetdate..\..\GEMDOS\TIME\TSETDATE und Tsettime..\..\GEMDOS\TIME\TSETTIME werden hier die durch den Tastaturprozessor verwalteten Angaben gesetzt, welche auch nach einem Reset erhalten bleiben (mit GettimeGETTIME wieder abrufbar)! Beispiel: move.l #%1011001100000100000000000000,-(sp) move.w #22,-(sp) * Settime trap #14 addq.l #6,sp Dieser Aufruf setzt das Datum auf den 16. September 1985 und die Uhrzeit auf 8 Uhr. Datum, Uhrzeit und Zeitgeber im XBIOS 22 SettimeSETTIME Datum und Uhrzeit einstellen. 23 GettimeGETTIME Datum und Uhrzeit ermitteln. 31 XbtimerXBTIMER Systemzeitgeber initialisieren. 31 Xbtimer void Xbtimer( int timer, int control, int data, void (*vector)() ); Mit dieser Funktion knnen Sie einen Timer im MFP 68901 starten und ihm eine Interruptroutine zuordnen. 'timer' ist die Nummer des Timers im MFP: Timer A: 0 Timer B: 1 Timer C: 2 Timer D: 3 'data' und 'control' sind die Werte, die in das entsprechende Kontroll- und Datenregister des Timers bertragen werden. Beachten Sie dazu die Hardware-Beschreibung des MFP 68901. 'vector' ist die Adresse der zugehrigen Interruptroutine, die nach Ablauf des Timers angesprungen wird. Die vier Timer des MFP werden teilweise schon vom Betriebssystem benutzt: Timer A: Fr den Endbenutzer reserviert Timer B: Horizontal Blank Zhler Timer C: 200 Hz System Timer Timer D: RS232 Baudrate-Generator (der zugehrige Interruptvektor ist frei) Beispiel: move.l #vector,-(sp) * Interruptroutine move.w data,-(sp) * Daten- und move.w control,-(sp) * Kontroll-Register move.w #0,-(sp) * Timer A move.w #31,-(sp) * Xbtimer trap #14 add.l #12,sp XBIOS Diese Funktionen ermglichen den geordneten Zugriff auf die verschie- denen Spezial-Chips im Atari-ST. Sie werden ber den 680X0-Trap #14 aufgerufen. Das XBIOS lt sich in folgende Funktionsgruppen einteilen: TastaturfunktionenKEYBD\KEYBD.HLP BildschirmfunktionenSCREEN\SCREEN.HLP DruckerfunktionenPRINTER\PRINTER.HLP LaufwerksfunktionenDRIVE\DRIVE.HLP Funktionen fr Datum, Uhrzeit und ZeitgeberTIMER\TIMER.HLP InterruptfunktionenINTRUPT\INTRUPT.HLP SchnittstellenprogrammierungINTFACE\INTFACE.HLP SpezialbefehleSPECIAL\SPECIAL.HLP `l9`hH>>>> PURE-C <<<< for ATARI-ST Version 1.0 (C)88-90 Borland International xArgARGV&H f&op`B@#:3> k #D Ј<.@#@Jy>g<"@(I$k,"Jf"JfB// ?<?<JNAO ApNiB g0pNlJg"f @ Jf ( $f6$P`A7NiB g$ +f["LfBB$IBC`RCJf`zA<~kRrRAfA6<HCBB`6 !jBJ)gHiRC` "fSI "WSAkHiRCBSQJ)gHiRCHyi$ONi00 J"LNS>? 9g @N 9g @NNnD?<LNA/ $H2H ЁЁЁЀЁЀ2*H$ԁԁԁԂԁԂЂ2*H$犔ԁЂм= "<zas&$_Nu/ YO$H g r09avBAr09axCABBBA09aw0XO$_Nu/ $Hr09avE Jr09ax5y,0Hj$C Jr09atLXO 9b$_Nuty.f@fpNuy`oNuAbBA00Nuty.g|f0Nuy`oNuAbBA00NuH86<E`Apr t r 0C0BDj|j|0j| j|j|j|0j| jVD0@5SCj6<A8200H@2A1|D1@UCj6<A, Pl v(kSCxCnPl6G6I* Sn40H`209asa8Sc8A0C@SCjLNu/ $HpCTA@a[ jha2<$_NuH4]O$HpjhgZGl2fR2*y,l*`9-vkBDK`"ABB20aq K20at666RDDn jh\OL,NuH0YO:<6$HH…SB6BD?20a22A@HҁGJEg Kr0a|h`P2H ሐ"<ap$2H ሐ"<ap@2H ሐ"<ao@Ar0a|RDDlXOL xNuH6QO$HGlB[0*y,l*`9-vkBD0@DHЀABB209apRDDnޑpawpA4a|>8jB@aw0D@|aw`p*h6C@K:pjhgrjhg^/| t2pЯa{jAr0a{vrnpC AaeJ@f K/o o4/ `42B@ _ab`\BB2pa{Ar0az K42pa<`6t2paz*az,H f0a{B@avp avB`BB2paz N"0az*BB2pazpjhg| .l NazX0azΑB@avpau`p жx܀C%AxpaeJ@fpCHѮ N"0az.0H,A r0az Nr0az K42B@a^`><.FHp C=@ Nr0ayA*r0ayAr0ay K42paAh"0ay Nayjh0azB@auPOLlNuH0&H$I 0+HЀ2+Hal2+ Hal& ayN&f&` "R Saf "J K09aox SgayL NuH>O&H(IBO?@>?Aaop aj.`09fSyp AaLa o61o<1ot1o:0/xg2/A`2?At*o6Kl0/0M&o2SC?E.|l4`t?B0`"o0l0@E@Aa``BPSEj0/xgBE| m Mr0/>anpCd MaXJ@f Mr0/>amTM?20a22A@AE Jr0/>am0/.g Ja20a om: oo Jab/20aH'` Ja?20aHЀ7REElzzBB2/>0/x@HamH`vz Lr0/>amLro$ o2al o6al0/>amPpah|`zpCi LaWJ@g*pCZ LaWJ@fB]BEA r0/>al?20a22A@AEBA/ H 눐Ё"<a`L4BA/ H 눐Ё"<a`,5@BA/H 눐Ё"<a` 5@2/.g Jaz20a om: oo Ja/20ahH'` Ja?20aNHЀ7WoREElzt2/>pЬak` om ooNpEgAa`Aar.o0l0@C@AaV` 2H'SCj`NpEg Aa`AaF"/&B@ NaXBo0?|.*o2$Mt0/xgAaQ6J@g|gR`hAaQ6g*(J:/v`AaPSEj` :/v`SEjSCn`AaPҰ|fzAaP?@.`lAaP6`AaPSCj`RJCj$M`JBEJjSEUCf`80/vf AaP~`(AaPt>JkAaPhSj`AaPZ:Rob&potb2/0o. om$o2K@ ol,~vBE(JgCCķbE0*`aX`$_Nu?/ $H64|g| g|Sg|gH`np Ja``p Ja`V *gP|Ad%j@5P05hSjg&JCf` *@gAd01j%j@Rja^B@`p$_6NuH0$H86G *gBA`r7Aj7AR *@gBB`t7Br ApjaG *L2*Hf$*P0*Hfr`r A *LTf$*PXfr`r ACY.4p K2a@Z8|bn@0;NdddD0 Ja`JAd%j@5P05hSjg$|f`Ad@01j%j@RjaBL NuNu/ OAra^HpAa>(G0/or`BA67o0g4/`4/DB7B0/H2/HaQ8R'@ 0/H2/HaQ R'@2/H'A0/H'@0/@HO&_NuHO6<:raTbHWHoCArc0aTPO8HWHoHo C A 0aQO po o2H ЀЁЁЀЁЁ爐4/H"҂aP8H2HaP2HaP<"9 ЀЁЁ2HaP#"9 ЀЁЁ2HaP#r0aSOLxNuHISj *I&*0`p La8BAp La8ISj * I&*4`zJDf.0,H2,HaKD* "Aa7 ",Aa7p" La7BAp La7JDg.0,H2,HaK* "Aa7 ",Aa7zI"Sj *I&*8`RJDf0,H2,HaJ"Aa7Dp La7p"J Ka\ +K.v`(- 0-||| b@0;N&&P&&pAH+H `AH+H C (C!I (C!I`nIH+L A(2,0,Ha>`NIH+L A( ,C)I ,A)H2,0, Ta2,0, la`;|0 WaQ4KR(m XOL<NuH8$HpaQpA4aV6jB@aQ0D@|aP`GD(j@t2paUb(BB2A aUPA"0aUXBB2paU80*"L Ka0*f"L Kaf KrH0aT`( Kp0XKS@fADr$0aT Lpr2 'S@fA"0aT0aU j0*"L KaB@aPLNu/ "(h"h@$("1($h@"JJ@g"0(2(IA3@2(4( JB3A`pi@1@ riA1A I$_Nu/ $HJ@gR *pmB`Sj *pѪB@ Jana 2$_NuH0$H&IpaX$H6*j8*jkoko jf K09aIʶSo.ko(0+kR@?2+SRA??+4 JB@raN \OL NuNu/ $H2|% g"|Mg|g `B@ Ja,`p Ja"` JaB@`p$_NuH0$H86Gppfr`BA7Aj7A:A0*rra3dr Apja;$0*gA`A'HCMf42p Ka4U@g U@gU@g`B@ Ja`p Ja` Ja(L NuH0QO$H:<6JBkpa$H?4rB@aM(TO8R@g2H ЀЁ rgG2H ЀЁ& 42||| bB4; N $$$ S&` S&HWC0 JaLXO2H ЀЁ:2<222H$Ԃԁ jf$ jf???/"S j 4/2pa l\OPOL xNuH08& мaQz$H f0aQp aM`VGD Kr$0aQ jDgG$ KC$pr2 #S@f%K@A$"0aQr0aQ *pf JaQpaL` *pgp`B@5@"KADaNG0f SSp Ka/Zp5@5@BB@ JaB0* H5@2*I5A%|-$%|.B(%|.D %|.,%|/0 JL NuH8(HaPP$@ x h he"h(&Q`0(@Y@g&x`,`&y< g`&k$HjHjHjHR20*aHHO%j`0*g0*rRjrjj$_6Nu/ / p aJ@gȑ0<aGE:pjj pj j0*jo5@0*j o5@ 0*j l5@ 0*jl5@0*Ro40* jo5@0* jl5@0*jl5@0*Rm2*jm"J j&j&k$Np aJ@f0<aG&_$_NuA"P!i,"P!i0a NuA"PB"P0)Hi "P0)HiaaNu/ aE:?*?* ?* ?*r0*aGJPOa$_NuH0:E R&(((JEg"0(Hh R0(Hha R0(H1@ Rh R0(1@ R2( hl 1Aj RBh R0(H1@ Rh R0(1@ R2(h l 1A j RBh RfgaaaJEf0G$67j6Bk R7P'h'h Kr0*6aCL 8Nu?9&py$?49"ry 0<aEXONuH :86aa.E:?*?* ?* ?*?/420aDO ?*?* 4* 2*0*aEXOa jBaLBB2*0O<8?B0(H/I,vGJDf6a:k7@"`(JFnApaCz`ApaCjU@gxJFoM@"SC4 Na1$SE4p|f"fEC *HAa1` ,:g*fSN &\fpC\ La2HJ@f VL .:fRN V@"STIAp a4E B"N Ja1j"L Na1bfSJ`JCg,Lg:p\ La0,H g ,:fRN"LA@a1*`p\A@a0,HRN"L Na1fLa$C`Aa0JDgCu`CzAa0JFfC~`CAa0AaJ@gpaBJCgF~p\A@a0<,HRNp'AXa$J@g(a$gCXA@p'a#>g D@|aAJGfPCv Na0f/kr(AXa$h6ga$~JGfJFn AXa#6*S2 /(A@a& f$&JCghB@aBJDf0+"aBa$6`ZB@aBC@ SA4a/ SB S0"a."S#H< g"S#m44+S4 S!m` S!S4 S!yBJFoC SAa/ <C4 SA4a2 A4"S@4|f SAp:a.Bp C STHa1`R$SEfSJ *"f SJ ""fSJ: "o, Ja/"` JFf SA4a/"N SAa/ SB(4JDg$ S!m S!m&aa@B@aX`& g2+8 Sh2+: Sh S:+8Mho1E S:+:Mho1EHk2Hk0 S?(?(?(C.A,/ "S4)2<B@"_aAVOzkk0k,lk l :+ 7k07E,zkk2k.lk l :+ 7k27E.ah Sh S0(H1@ Sh S0(1@ S2(H1A Sh S0(1@?/b4/b2/`0/2adTOBDJCgdO2L|NuH0BCE gj @2fdBDRD h4fG R"ha:SDf`BgBBBAB@aTOv R$4SDf0L Nu/ E:0*a@4a?*?* ?* ?*BgBBBAB@a>O BB2*0vazp aJ@g0H R2(Ha5(0+So60+ko7@0+kl7@0+kl7@0+Sm>6+kk42Hn 'S'k kk apk 7@"K R(R(l$Np aJ@f|0<a=LNuH86EG: R0(h h j Rh j RBh @o0<a=~ap a$J@g0H R2(Ha4(0+So60+ko7@0+kl7@0+kl7@0+Sm>6+kk42Hn 'S'k kka&pk7@"K R(R(l$Np aJ@f|0<a0+km42Hn 'S'k kka:pk7@"K R(R(l$Np aJ@f|0<a;LNuH86EG: R0( hhj Rhj RBh@o0<a;aPp a@J@g0H R2(Ha2(0+So60+ko7@0+kl7@0+kl7@6+Sk:0+km02Hn'S'k Sk aDpk 6"K R(R(l$Np aJ@f0<a:LNu?6 yh j0D@a&JCo0a6Nu?6 yhj0D@aJCo0a6Nu/ E:HjHjHjHRr0*a:OHjHj Hj Hjr0*a:O0jQ@lp2*j ff4* j jܴhlT2jlFHjHj Hj Hj0*ra:(HGV$Lg6p\ La&*$H g ,:f RJ"L Ka&`p\ Ka&$HRJ"L Ja&jIfaAazJ@grp\ Ka%$HRJKMp' Ma$J@f C Ja&&`gB Na&`/ Ka&XПe Apa7V`C/ "K Na%$"_a% MaJ@gaL|NuH8OEVgvG0ffpfIr2A9S@n8.9|9|HW"K La4XOpW5@ro5A5o5o4nA pa6BSB`7|3O@LNuYOHy.HoCAa7BPOpoXONu/ / $Ha0fJ@fApa6\`L g&g"p Ja$p&H gB Ja4$K g$f`aJ@g 09.ah` Aa a&_$_NuH YOaJ@gpa6EVB@ jA4a:6j8`(p. jA4a$"H Ja#B@ Ja:8j0a:B@a6R0D@|a5`|t2pa:2*BB2pa:& a9$H fpa9*pl a9$H`zE J"0a: ,o J"0a9ļgA׵g Ja90a:0a:B@a5XOLxNu?/ $H6ry.]Af fELBgBgBg JBB2p y.|a\O$_6Nu/ EHj"r B@a5XOaJ@g0*4|Hgnn|gn2|gn|g|gz`|gf|g>`|!gln|g|g0`|Gg|7g`а|PgZn,|K4gn|H8gR|gx`|Mgx|6g`|P2gF|g|0g|g@`zpa`pa` R0(HS@a` R0(HS@a`npa`dpab`Z R0(HS@a``D R0(HS@a6`.B@a `$ R0(a`B@a.` R0( a `B@Aa`pAa`a` R5P"a f`apa ` RA4/p j| fr`BA09(AgC`CB _N`0*a`t R(4gjBgBgBgBBrpa\O`Rp@yf R"h4g r 0a3`42*0*4 R"R"i NJ@g j.4fa<`4*42*08(rkAA:(Hŋ0H2Ha$ R2( EHa% :kl:+E R0(k2AAW@:pa-Lpa.pKMHSHo"M Na-BPO WJCg*UjBUUl:0H R2(Ha$j2Ha$a`(VjBVVl<0H R2( Ha$@2Ha$aHSHSHSHSHUBgBgBgBgBgBgBgp??????/,"N42paO.|gjpa-B@a,0gHSHS"K KBBrpa*PO\OLl8NuHByyB@a+POL<NuHg y8m A0+a)09>f pa a`B@a)ra(J@g|npa*0+aB@a*zp kذ| fr`BA09&Af SCn AB@ah`JB@XM Ua\SCf`:a"\J@fApa(R`$SCn Aa<` XM Ua2SCfa`ax +f+f0+a%*a&B@OL<NuH0$H*8B@a-6jD@|a'`JDf "0aG`p. Ja$H gAaH$HGC JaJ@f 0a|`vC JaJ@f0aĨ`^C JaJ@f "0aX`FC JaJ@f "0aD`.C JaJ@gC# JaJ@f "0aP`"0aCpL 8NuHr?t2H ЀЁ02 B??9&?9$?9"0BA49 a4O $_6NuH4O$H6?A?B&IK0/4H"ҁ҂牐r42BB>0y o>pj?@8@SDy(oW04H"ҁ҂牐r42BB?@0y"o?Hpj?@8/@SDy*oopW5@ro5A0<aApax2H ЀЁr JDf r ?9&?9$?9"49 rB@ JN\OJDf2H ЀЁ r  GHSHo"MAaFPO opaP?4/rB@ JaTO8R@fBD0 Ja80<aHUC0 JaXOHSHSHSHSHUBgBgBgBgBgBgBg2H ЀЁ?2?2??/>JDgt`BB??/>CDtrpaO.:0<a0 JapEgTpap4H"ҁ҂r fDfBDJDgz0 Ja~SEg BAp2a`AB@a0<a*0/gHSHS"K KBBrpa4PO0OL,8NuHBCgBSAB(| | 24|B I4|BIAAQ̑N @C "/ $/Jo f\ffB8"""2Jf 8@!NA$<RBJ.rB@N`nff^BxgV#‰‰‰2|'0<nR@n R@nR@1 . /@R@1NLNuXBRASMPLg^HA "Xd 0<! HA!؈!؈!؈LNs0(g!h`B88( <8B( `" BBBBBBg"C"t/adA2"_""""NuCH0BBgf" 3| 3@ 3o4 U" C"`$CH0BBg."3@ " C2f"A3H/ "<psNB$_Nu/ C#HA""BQC"1!!!!!!!!!!!!!Ha,A0" "_2E"Z2"Z2"Z2"Z2"Z2$ANu/ "<0<NB$_Nu"XdB@! Nu"Y o/0( Pa& _"XЉ bpNu"Xd! NuY/?a0 _"X`A(p"@ "ByA1B33O"Nu/ Hz?<&NN\O$_Nu/ "y: ),g2"@g,g(f$HgggJf`g<=f I$_Nu`??B@C gJ1kB@BA< C (<-Wg<+fg"1bAg1b @8@@D`JgD@86Nu//O4UB|"bBJ@j < fD@-CtH@B@H@&HC;0(RBH@B@H@fQBO _&Nu3!`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ//"4UB|"bjJj < f-DC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!`0123456789abcdefghijklmnopqrstuvwxyz JgJgJgJgJg JgJgJfSHggggg ggf @NugfSHNuJgNug fC`Jg INuSHNugFf8g>f0g6f(g.f g&fgfgfggepNupNuJfpNu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNu"CB@f ANu"Jg JgJgJfSHSefB ANuSeg gb pNuJfpNupNu"SefBJgSf ANu/ / g($Ig"f&Hggg"J K`A&_$_Nu`H0$H|g|$bGrtgJ3kSJgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<Xfg.G3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"p` 3!p& g"`"C\B@f ANu/ EHB@BA2g2g!2ep` p`Jfp$_Nu/ EBABBSe2g2 ge p` Jfp`p$_Nu/ &y g/ &S?<INA\O`&y g/ &S?<INA\O`&_NuJg/bg2 4gf!Sf`f`!Sg"gH?LxH?LxH?LxH?Lx`H?Lx8H?LxH?LxH?LxH?LxH?LxpH?LxHH?Lx H?LH?SfvLx2|HgS@!!Q|gSA!Q`2 4gfSf`f`S"gH?LxHxLxHx(LxHxPLxHxxLxHxLxHxLxHxLxHxLxHx@LxHxhLxHxLxHxLHSfxLx2|HgS@ Q|gSAQ _Nu/$gSe40HB4 gxH_>"&(*,."B$B&B(B*B,BH~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H~H`SfL||0HgS@!Q|gSAQ _Nu  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#J@kNuD@NuJkNuDNu oHH@ Nu$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNu"@$jDJjD$HBJBf.$HBJBfB@H@$ jDNuB@H@HB0B@H@$ jDNu A"B@H@HABAtҁрdЈӁрQ$ jDNu/ /ABhBh2<a2"_2"_2A"o222"2&2*"o2"o 22 2$Nu/ABh1|1A1B2<a"_222Nu/ABh1|1A2<fa"_2r+2QA2r 2QNu/ pNBT@$_Nu/A1|1|!I!o1A"_A000000000Arm`CBi3|C2222Ar`"HAABABBg0RB`ABh1B1| r`/ "HAA0000 0 rtg0RB`A1|1B1| "_1Y01Y21Y41Q6r`ABhBhr`tABhBhre``ABhBhr`L/ /A1|Bh1A01B2ria*"_2"_2Nu3&/ C2dBi3| Cp 2Q"<zps/ NB$_ _0&A"op,2QA2p 2QNuJ2/ C2Bi3| Cp 2Q"<{lps/ NB$_ _0&A"op,2QA2p 2QNuJ2C3ABi# Ira"#JNuABhBhr`/ 1@ 0"<psNBA0$_Nup `#2A00p `pp`j#2p `^/ /A000paH"_2"_2"o2"o2NuA00p`"#2A000000p*`#2A0000p+`/ #23p,a"_2"o2Nu#2A0000000 0 p/`#23p2`#2A0000000 0 0p3`T/ #2p6aF"_2"o2"o2"o 2Nu#23p4`3p5`#23pr`3#2p#`/ /pMa"_2"_2"o2"o2NuA0000000 0 pI`A0000000 0 pJ`#23pN`n/ /pOad"_2"_2"o2"o2Nu/ ?A00pha:2CSA|;$Y4Q$_NuA00000pd`A00000pe`3pg`A000000 pi`33pj`/ /A0000 00plax"_2"_2"o 2"o2Nu3pf`V3pk`J#2pP`>#2#6pZa,"o2Nu#2#6#:p[a "o2Nu/ 3@@A"CB@22220<"<NBA0$_Nu822 HRHP?< NA\O$_NuHRHP?<INA\O$_NuHR/?<HNA\O @$_NuH>@NAO $_NuHRHP?<NA\O$_NuHR??/?<BNAO $_NuH>?NAO $_NuHR?</NATO @$_NuHR??<>NAXO$_NuHR?<NATO$_NuHR?<ONATO$_NuHR?HP?<NNAPO$_NuHR?HP?<=NAPO$_NuHR?HP?<\O0OL8NuH0O68E20a3HGNHkHSCA20aPO3J29gBA30aCAi0a7oCAk0a0+oaSOL NuH $H68jDfjFgd20aP%yHDAJ *j5hL`0*LH5@L5@L0*Hj 5P0*Hj5hB@aLNuH:YO$H:2|5I85IP5Ih?/ ?/ ?/ ax\OG09gBA30aI l*gr0azMHWHV"N Nr E0aPO2H ЀЁBr r 4*rrW2*0aRE|m l*g 2,*0aNHVHV"N N2,,0apPOB@XOL\ NuH 68$HJ@kڳCpAgpaF J/pCgp0`p1 _a0pDg Jpa" J/pCgpE`pF _a pDg Jpa J/pCgp2`p3 _apDg Jpa J/pCgp4`p5 _apDg Jpa J/pCgp6`p7 _ap Dg Jpa J/p Cgp8`p9 _a|0LNuH?A?B?oGr0ar0aA0aBA0ar0aPO&_NuH>$H&I *DHg 2*F0*DaI K0aR6+0*j 8*j@SDkl 7DDn Kr0a K2*0jax8* jHSjHk*j@*NfFpJDj %gfz %gzRM-jJ`RDkJDo6RMgfzRMjJ`SDn`JDj%fRDkJDo RMfSDn0*Jyg230a:,M%N@0*<*@:ByNRNB@J@g| gZ|g|g`09g M20a6`A420aQO$H&I *DHg 2*F0*Da6+8+0* jpMjS@@o60*j0*j2*AS@@o8kmkm 0*jLl" K09a7C7DSmkm09gBA309a:*LjUEA2*0+javooA2*0ja芖ooA2*0+jap8oA2*0+jaXWog Kr09aZMP0* WHI0+o9@22*jLl4*0*B9@0vL`0o9@02*oHҁӹKX;< p$*@`;< SoBA6;Sj;< p` r ;;;SoBA6;< tA|0|9o^B;A|0|9o^A;Sj;< ;< ;<: APt@|0|9o^B;耻bM89|9C9y a0*l2SDj8#JEg KBA09aPOL|8NuB@aNu?O60A?H2y o?I?B 09"Bo?@ pA?@ 0y(l?H 0oS@?@29*@l?AHoHoHo Ho r 0aVO`pWopoo0/Wo>0/ oo?@0/ ol?@0/ol?@0on2/on A09aHoHoHo Ho r 0aO0/g2/ftO6NuH>$H6*jHjH&j@*NfFpJCj #gfx #gxRK+jJ`RCkJCo6RKgfxRKjJ`SCn`JCj#fRCkJCo RKfSCnK0*Jyg230a,K%N@IN8*0*@:BTRNB@| g|g,|gP` S@jLT80HLH@@8E`LB KaB@H|y290a`"0J@g S@gS@gn`B Ka@v&N`rr 0aB Ka6@290a *Af"?,?4*j j20aRXO`vUC`L|8NuH0$H8& j k2*HAm0*H@?0_aĶgf0<aGr0ar0a0*j k2*HAl Ja%C5D JaBA0a|r0a皑0<aYO$H>8?BKN *o"*DHg 2*F0*Da 6*0CjH2*j AnX:* jH`REmCljH(j@*NfHJEj"$g<f| $g|RL,jJ`REkJEo8RLg<f|RLjJ`SEn`JEj$fREkJEo RLfSEn0*Jyg2309aN&L%K@<*0*@>BURKB@J@g| g|g.|gV` S@jLU<0HLH@@:W`B La@H|y2909a`j0J@gS@g*S@gZS@g^`xB La@ݼGoB@`z,K`6r 09aB La8@2909abzGoREUE(K` Jaj0*H"L Ja0/k2B?-?4m?CA4Dp2/a\OppXOL|NuH8$H86taJ@f G*pygBA`r7AIp/rygCf`CtA aԴp/"*kCk`CfA aԖrA0*Hjaz jDf j Fnz jFCb420 Ka.:|b`@0;NVVV V.r Ep Ja`6BBBA0*H$I09 Ia* Jr09a֞IJ,mL&N&-P8-0- H@Df|2-H4H҂0-H&N2*RRKPc&mPzRSNLd8RNRE`28REpHAH"-HaD8Jf La(H XLb`:-0-H@pREH"a"-DapjEH"aѼ"-DaLd,mLPcL&mP`F L"-Daю"aE8pHAH"-HarD8Jf Lap(H XLb La^ JBA09aLL|8Nu/ $H4*@r *"jL jLa$_Nu/ $H5y¦@4*@r *"jP jLa5@B$_Nu/ $H2|1gXn|g$|g^| g"`t|2 g"|@gP|gT`^p Ja>`Pp Ja4`F09f> Ja`3¦` JaPBy¦ Jab` Ja<`p Ja`p JaB@`p$_NuH8$H<:&*xG¨I r a<0Sg r aj&f`< Sn0*@f < `2*BHaF&`20*B|g S@gS@g`&<r`&<0`&<a`&<Òr A a *D2*Hf$*H6*Hôfx`x D *D jPLf Hfr`r A/0*@gt `tBB0*@gr`r AMCJ4pAX2at| bn@0;Ndd d*4d>J^p Ja`Dp Ja6`:p Ja,`0p Ja`& JaBk` Ja7| Ja` JaLxNuNuH<8& мTa$H f0atp a֠`%y"GTI8%LP K"0a(0aDK0fSUp MaHaJ f2+0HA@t4%BG2(K`B f%|2G"(K`* JONfBA+t4%BXK`$e%KL5| 5|5|5|%|H5|  jP%HDp"Ё5@ %|$%|(%|X %|,%|0 Jaj JL<NuXXXXX *XXXXX Pixel---- XX Ebenen ---- Sichern (XIMG) ^X Original-Pal. ^E Standard-Pal. ^S Dithered ^K Transparent ^K=3?1)&*% 784;" , .>0<2+$ ('5:69! /# -MMM  :@ < F b   -- ^++ ^--- Farbpalette ---CMAPBMHDXIMGBODYFORMILBM Fenster ^E Original ^S ^xrv {  - Mastab / Seite -1 ^ -+ ^---- XX Bume ---- Ix86 -> M68k ^K M68k -> Ix86 ^K `f l << ^>> ^-- Konvertieren --[1][Keine weiteren Fenster|vorhanden! Abhilfe durch|Schlieen eines Fensters.][ OK ][1][1STGUIDE-Warnung:|Die Gerteausgabe funktioniert|nur, wenn Sie ein GDOS im|AUTO-Ordner installiert haben.][ Aha ]*.*[0][Um Dateien auf ein Gert|ausgeben zu knnen, mu ein|Spooler-Accessory namens|CALCLOCK installiert werden.][1STGUIDE[3][Keine weiteren Fenster|vorhanden!|Wollen Sie das|Ausgangsfenster|berladen ?][berladen|Abbrechen]..\1stGuide: Datei(en) berneudumpenladenCALCLOCKCHMELEONCALCLOCK.AC*Install.|Abbrechen] Aha ]1stGuide: Datei(en) spoolen[1][1STGUIDE-Warnung:|Der Spooler-Puffer ist voll.][ Aha ][1][1STGUIDE-Warnung:|Fehler beim ffnen des|Ausgabegertes.|Ausgabe wird abgebrochen|und Spooler-Puffer geleert.][ Oh jeh ][1][1st Guide:| |""| |nicht gefunden][ OK ] 1st Guide))D N [ h;;KRB> >2'R>  L  d   , # i lH#qx ~  #  '$  #    d ! $"## #!%&# &$(. )-*,#+, ).'/1#01 .G3F> 746#:563(;8:#:9: 7(?<>#:=>0;7(C@B#:ADBY?g(D0u E F( 2 :H I  J K$ LLA1KMN AN L  L  [1][1STGUIDE-Warnung:|Ausgabe von XXX-Dateien|wird noch nicht untersttzt.][ Na sowas ]21Gertenummer: __99 ABBRUCH D. AUSGABE MIT L.SHIFT-R.SHIFT 00Linker Rand: __ ZeichenSEITENVORSCHUB NACH DATEI:QUALITT:X-SKALIERUNGY-SKALIERUNGHORIZONTALE AUSRICHTUNG:VERTIKALE AUSRICHTUNG:__________________________________________________________PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP1STGUIDE: Ausgabe-Konfiguration Digital Design, Jan 20 1993Allgemeine Parameter...TextJaNeinnormalDraftLetterMetaGrepassendOriginalImagePixel 1:1BruchGanzLinksMitteRechtsObenUntenStandard-AusgabeFensterGertControl-P-AusgabeInternCALCLOCKTextfont-EinstellungNormalber VA_FILEDoppelklick-StandardNeues FensterberschreibenIndexdatei:Sound-Parameter...Gerte-Parameter...LadenSichernOKAbbruchMEM: XXXXXX KTOT: XXXXXX KIMGIFFRSCGEMSAMSND[2][1STGUIDE:|Wollen Sie die Ausgabe|wirklich abbrechen und den|Spooler-Puffer leeren?][Abbruch|Weiter]1STGUIDE.AC*APPPRGGTP1stGuide: Programm finden[1][|Voreinstellungen|sichern?][ OK |Abbruch][1][|Zuletzt gesicherte|Einstellungen laden?][ OK |Abbruch]1stGuide: Indexdatei whlen:X> D:\1STGUIDE\1STGUIDE.IDXSeite XXXAbbruch nicht mglich!&X  Drucke[1][|Kein Clipboard-Pfad gesetzt.][Abbruch]0 1A 1A  0 @ P Q S b c  0 1 P R S b p r  0 1 A Q S b c r t ! A Q S b p r t u 1 P R a p r t u 1RbruppJ2822J2 XXXXXXXX-Font ^E---XXXXX Zeilen --- >> OUT-Datei ^X /BU --- System-Font --- Norm (10 Pt) ^N Mittel (9 Pt) ^M Klein (8 Pt) ^K-------------------Wl.DMP.OUT.TXTVA_FILE [1][|Nichts zu dumpen.][ OK ]--- Hertz --- Fenster ^E Original ^S Norm ^N DMA ^M   ¨¼       &- ^+ ^----- P L A Y ----- STOP ^T z@0  x    (n L6r$ <0bNN @>.|<0$n"bp(b`&$*:B @$0@ ,PJ\RZ\ HN<8:$*  D P22B.* ($ T J"4>& Dn  B $ j   2N L( Nt BJp f846,p  (:,(6B (.(   (& ,$  ,&&0> 4   2,l B **R@ "(.*$VLl F, lN, ~B F*6*$ ., (  $2rB$n0P0000000000000H000Hx$f"1STGUIDE.ACC 29.04.1992 Digital Design ===================================================================== Inhaltsbersicht ---------------- 1. Einfhrung 2. Bedienung 3. Dateiformate 3.1. TextUTIL\TEXTdateien (ASCII, 1st WORD, .OUT) 3.2. ResourceUTIL\RESOURCEdateien (.RSC) 3.3. RasterbildUTIL\IMAGEdateien (.IMG, XIMG, .IFF) 3.4. MetaUTIL\METAdateien (.GEM) 3.5. SoundsampleUTIL\SOUNDdateien (.SAM, .SND) 3.6. DumpUTIL\DUMP-Modus 4. Kommunikation 4.1 1st Guide und GEMINI 4.2 1st Guide und TC_HELP 4.3 1st Guide und CALCLOCK 4.4 1st Guide und das GEM-Clipboard 4.5 1st Guide und andere Applikationen 5. Gerteausgabe 6. RebuildUTIL\REBUILD-Funktion 7. Konfiguration 8. Grenzen 9. 1st IndexUTIL\1STINDEX 10. Neu in VersionUTIL\VERSION 11. Referenz --------------------------------------------------------------------- 1. Einfhrung ------------------ Hatten Sie schon immer Probleme, zur richtigen Zeit die richtigen Informationen parat zu haben? Dann wird Ihnen dieses Accessory gerade recht kommen. Hierbei handelt es sich in erster Linie um ein Hypertext-System, welches Sie spielend und zielgerichtet durch einen Dschungel von Informationen fhrt. Der Multi-Window-View mit perfekter GEM-Einbindung schafft dabei den ntigen Durchblick fr Ihre Arbeit. In der Tat, eine hervorstechende Eigenschaft dieses Programms gegenber anderen bekannten Informations-Systemen ist die Mglichkeit der ffnung eines neuen Fensters bei jeder Verzweigung. Der gesamte Informationspfad bleibt damit stndig im Zugriff, Sie knnen verschiedene Pfade gleichzeitig verfolgen und haben damit verschiedene Stellen gleichzeitig im Blick. Die Hypertext-Eigenschaft wird ermglicht, indem Sie sogenannte "Links" (Verzweigungen) in Ihren Dateien auf einfache Weise definieren knnen (je nach Dateiformat). Physisch prsentiert sich das Informationssystem als hierarchisches System von Hilfsdateien, in dem sich durch die Links ein umfassendes Informationsnetz herausbildet, das schnell und zielgerichtet durchsucht werden kann. Die untersttzten Dateiformate sind nicht willkrlich gewhlt, sondern es handelt sich hierbei um die systembergreifenden Standard-GEM-Formate. 1st Guide wurde portabel in Purbo C fr den Atari ST(E)/TT und fr IBM-Kompatible geschrieben und sollte in jeder Auflsung und mit jeder Grafikkarte arbeiten. 2. Bedienung ----------------- Wenn Sie bereits mit Purbo-C fr den Atari ST gearbeitet haben, wird Ihnen die Bedienung wohl bekannt vorkommen. In der Tat orientiert sich 1st Guide hier an Purbo-C, d.h. Links (Keywords, Verzweigungsschlssel) werden in Texten fett unterstrichen dargestellt, und die Verzweigung wird durch Doppelklick mit der linken Maustaste auf das jeweilige Keyword ausgelst (oder durch Drcken der RETURN/ENTER/HELP-Taste nach Selektion des gewnschten Eintrags). Dabei wird jedoch bereits der erste Unterschied deutlich: Das Hilfe-Fenster wird nicht mit dem neuen Datei-Inhalt ber- schrieben, sondern es ffnet sich ein eigenes Fenster. Der Informationspfad wird genau wie bei Purbo-C im Fenstertitel dargestellt. Wenn Sie den Doppelklick bei gedrckter Control-, Alternate- oder Shift-Taste ausfhren (bzw. statt RETURN/ENTER die HELP-Taste drcken), so wird kein neues Fenster geffnet, sondern das aktuelle mit dem neuen Datei-Inhalt berschrieben, wie das etwa auch bei Purbo-C geschieht (Der ursprngliche Inhalt wird aus dem Speicher gelscht, wenn der neue erfolgreich geladen werden konnte). Man kann 1st Guide auch so konfigurieren (siehe Kapitel 7), da standardmig das Fenster berschrieben und nur bei Drcken einer Statustaste ein neues Fenster geffnet wird. Mit der UNDO- oder ESC-Taste knnen Sie den Informationspfad schrittweise zurckverfolgen. Dabei wird die vorhergehende Datei im obersten Fenster berladen und an der Position angezeigt, wo Sie abgezweigt sind. Fast berflssig zu erwhnen, da Sie die Info-Fenster wie gewohnt mit der Maus manipulieren, d.h. beliebig auf Ihrem Desktop (bzw. in der Applikation) positionieren, zoomen usw. und beliebig scrollen knnen. Alternativ zur Maussteuerung steht eine Reihe von TastaturTASTATUR-Kommandos zur Verfgung, welche Ihnen die Arbeit erleichtern knnen. Auerdem gibt es eine "Echtzeit-Scroll"- Funktion: Wenn Sie bei gedrckter rechter Maustaste in den Sliderbereich klicken, knnen Sie bis zum Loslassen bzw. erneuten Klick der linken Maustaste durch bloe Mausbewegung durch die Datei "browsen". Das Programm kann beliebig viele Info-Fenster gleichzeitig verwalten, allerdings beschrnkt der Window-Manager des GEM in gegenwrtigen Versionen die Gesamtzahl der Fenster auf 7. Sie erhalten eine entsprechende Meldung, falls kein Fenster mehr geffnet werden kann. Wenn Sie mit der Maus einmal auf das oberste Info-Fenster klicken, erscheint ein Popup-Men, mit dem Sie je nach Dateiart verschiedene Parameter einstellen oder Konvertierungen vornehmen knnen. Die Bedienung kann wahlweise auf GEM-Art (einmal kurz drcken und loslassen, auswhlen und danach noch mal drcken) oder auf Macintosh-Art (Maustaste gedrckt halten, auswhlen und dann loslassen) erfolgen. brigens, wenn Sie den Popup-Men-Einfachklick bzw. den Verzweigungs-Doppelklick bei gedrckter rechter Maustaste ausfhren, knnen Sie die entsprechende Aktion auch in einem Info-Fenster auslsen, das nicht oben liegt (ohne da dieses, wie es sonst der Fall wre, nach oben kommt). Wuten Sie schon, da eine analoge Mglichkeit auch im normalen Desktop mit seinen Verzeichnisfenstern besteht (Markieren, ffnen, Kopieren usw.)? Dies ist in den gewhnlichen Handbchern nicht dokumentiert, kann aber manchmal recht ntzlich sein. Das beiliegende Informationssystem ist fr den informationsbedrf- tigen ST-C- und Assembler-Programmierer gedacht. Es ist so angelegt, da Sie per Tastatur bzw. Doppelklick jede detaillierte Information ber das Betriebssystem TOSTOS des ST mit GEMGEM erreichen knnen, wobei Sie gleich hier beginnen knnen. Wie Sie bemerken werden, ist es allerdings noch nicht ganz komplett. 3. Dateiformate -------------------- Wie schon erwhnt, werden smtliche Standard-GEM-Formate sowie natrlich das ASCII-Textformat untersttzt und knnen jederzeit geladen werden. Die Erkennung eines Formates erfolgt anhand der Extension im Dateinamen: .RSC GEM-ResourceUTIL\RESOURCE-Dateien, Bsp.: TOS.RSCUTIL\TOS.RSC .IMG GEM-ImageUTIL\IMAGE-Dateien (Rastergrafiken), Bsp.: TIGER.IMGUTIL\TIGER.IMG, COLORS.IMGUTIL\COLORS.IMG, AAFALL.IMGUTIL\AAFALL.IMG .IFF Interchange File Format (ILBM - Interleaved BitmapsUTIL\IMAGE), Bsp.: AUGEN_2.IFFUTIL\AUGEN_2.IFF .GEM GEM-MetaUTIL\METAdateien (Objektgrafiken), Bsp.: TOOLS.GEMUTIL\TOOLS.GEM, TIGER.GEMUTIL\TIGER.GEM .SAM,.SND 8-Bit-SoundsampleUTIL\SOUNDdateien, Bsp.: WELCOME.SAMUTIL\WELCOME.SAM sonst ASCII-TextUTIL\TEXTdateien, 1st Word Plus Dateien (.DOC) oder Ausgabe-Dateien mit Schriftattributen (.OUT) Wenn Sie etwa eine Textdatei in eine Datei mit der Extension .IMG umbenennen, knnten Sie sehen, wie sich Ihr Text als Rastergrafik prsentiert. Ich rate Ihnen jedoch von derlei Experimenten ab, da Sie sonst mglicherweise unliebsame berraschungen erleben knnten. Verzweigungsmglichkeiten sind derzeit beim Text- und Resource- Format eingebaut. Bei Rasterbildern kann ich mir keine solche Funktion vorstellen, bei Metadateien bieten sich die String-Objekte (V_GTEXT oder V_JUSTIFIED) dafr an, ich werde dies demnchst implementieren, so da Sie dann auch diese Dateien in Ihr Info-System einbinden knnen. Ansonsten knnen Sie die Grafik-Formate derzeit zumindest als End-Knoten in Info-Ketten verwenden. 4. Kommunikation --------------------- 4.1 1st Guide und GEMINI ---------------------------- Wenn Sie den Shareware-Desktop GEMINI von Stefan Eissing und Gereon Steffens benutzen, knnen Sie die Arbeit mit 1st Guide wesentlich komfortabler gestalten. 1st Guide versteht das in GEMINI implementierte Kommunikationsprotokoll. Das bedeutet, wenn Sie das 1STGUIDE.ACC-Icon auf dem offenen GEMINI-Desktop ablegen, so knnen Sie Dateien aus einem GEMINI-Fenster daraufziehen, woraufhin diese von 1st Guide geffnet werden. Sie ersparen sich so die unter Umstnden lstige Suche in der Datei-Auswahl-Box. Es knnen auch mehrere Dateien gleichzeitig gezogen werden, wobei dann fr jede Datei ein entsprechendes Fenster geffnet wird. Auer auf das 1STGUIDE.ACC-Icon knnen Sie Objekte aus GEMINI-Fenstern auch in ein von 1st Guide geffnetes Fenster ziehen. Das hat dann zur Folge, da der ent- sprechende Fensterinhalt mit dem Inhalt des neuen Objekts berschrieben wird (entspricht Control-D mit Dateiauswahl). Ziehen Sie mehrere Objekte auf ein 1stGuide-Fenster, so wird fr die weiteren Objekte jeweils ein weiteres Fenster geffnet. Ein Doppelklick auf das 1STGUIDE.ACC-Icon bringt die Datei-Auswahl-Box zum Vorschein (entspricht Control-O bzw. Anklicken des Acc- Menpunktes). Melden Sie 1STGUIDE.ACC bei GEMINI als Applikation auf einen bestimmten Dateityp an (z.B. *.HLP), so knnen Sie durch einen Doppelklick auf ein derartiges Objekt in einem GEMINI-Fenster das ffnen eines entsprechenden 1stGuide-Fensters veranlassen (anstatt dieses Objekt auf das 1STGUIDE.ACC-Icon zu ziehen). Sie knnen auch 1st Guide auf "*" anmelden und in der Applikationsliste ganz unten positionieren. Dadurch erreichen Sie bei Doppelklick auf ein Objekt, das nicht schon einer anderen Applikation zugeordnet ist, ein sofortiges ffnen eines Fensters durch 1st Guide statt des sonst blichen Ansehen/Drucken/Abbruch-Dialoges von GEMINI. Tastatur-Eingaben, die unter 1st Guide keine Wirkung haben, werden von 1st Guide an GEMINI weitergeleitet. Auf diese Weise knnen Sie bestimmte GEMINI-Aktionen auch dann auslsen, wenn gerade ein 1stGuide-Fenster oben liegt. Schlielich mchte ich noch bemerken, da alles eben Gesagte auch dann funktioniert, wenn Sie 1st Guide ber "The Chameleon" von Karsten Isakovic geladen haben, da The Chameleon Nachrichten von GEMINI an das geladene Accessory (bzw. umgekehrt) durchreicht. 4.2 1st Guide und TC_HELP ----------------------------- In 1st Guide ist das TC_HELP-Protokoll eingebaut. Das bedeutet, da 1st Guide auf den Nachrichtentyp AC_HELP (Nummer 1025) reagiert. Dies wird von neueren Versionen verschiedener Editoren wie TEMPUS, EDISON, PKS-Edit sowie von 7UP (ein ausgezeichneter Shareware-Editor von Michael Thnitz) untersttzt. Man kann dort ein Wort in einem Text selektieren und durch Drcken einer Taste (z.B. HELP) das Senden einer AC_HELP-Nachricht veranlassen. Ein Problem hierbei ist, da die Editoren dabei von dem Namen "TC_HELP" des betreffenden Accessorys ausgehen. Eine Mglichkeit zur Lsung dieses Problems wre das Umbenennen von 1STGUIDE.ACC in TC_HELP.ACC, wodurch die Nachrichten richtig ankommen wrden. Dadurch kann man dann aber die Konfiguration von 1st Guide nicht mehr ohne weiteres sichern (siehe Kapitel 7), da 1st Guide dann sein eigenes Programm nicht mehr findet. Eine gnstigere Mglichkeit ist daher das Patchen der entsprechenden Programme, indem man mit einem Dateimonitor die Zeichenkette "TC_HELP " sucht und durch "1STGUIDE" ersetzt. Dies funktioniert bei 7UP, EDISON sowie TEMPUS 2.10 tadellos, PKS-Edit konnte noch nicht getestet werden. Im allgemeinen sollte dies immer funktionieren, solange die Strings nicht aus irgendeinem Grunde verschlsselt im Programm stehen. Bei 7UP ab Version 2.1 ist ein Patch nicht mehr ntig, da der Name des Hilfsaccessorys frei konfiguriert werden kann. Das bergebene Schlsselwort sucht 1st Guide in seiner Indexdatei (kann im Konfigurations-Dialog eingestellt werden, siehe Kapitel 7) und ffnet ein entsprechendes Fenster (bzw. gibt eine Alertbox aus, da der Begriff nicht gefunden werden konnte). Bei der Indexdatei handelt es sich dabei um eine ganz normale Textdatei mit Verzweigungsinformationen, die normalerweise von dem Hilfsprogramm 1st IndexUTIL\1STINDEX erstellt wurde. 4.3 1st Guide und CALCLOCK ------------------------------ 1st Guide hat zwei Berhrungspunkte mit einem Spooler-Accessory namens CALCLOCK. Zunchst kann man 1st Guide so konfigurieren (siehe Kapitel 7), da es bei Drcken von ^P eine Nachricht an ein CALCLOCK-Accessory zur Ausgabe der aktuellen Datei schickt anstatt die Ausgabe selbst vorzunehmen (kann man auch mit Control-L.Shift-Alternate-P erreichen). Andererseits kann 1st Guide selbst auch CALCLOCK-Auftrge bearbeiten, d.h. es reagiert auf entsprechende Nachrichten von anderen Applikationen mit dem Ausdruck von Dateien und kann damit ein weiteres CALCLOCK-Accessory ersparen. Der oben bereits erwhnte Shareware-Editor 7UP von Michael Thnitz untersttzt dies beispielsweise. Ab Version 2.1 wird 1st Guide direkt untersttzt, bei lteren Versionen kann man sich mit einem Patch behelfen (siehe oben). 4.4 1st Guide und das GEM-Clipboard --------------------------------------- 1st Guide untersttzt den Datenaustausch mit anderen Applikationen ber das GEM-Clipboard. Wenn Sie ^C drcken, so wird die aktuelle Datei ins Clipboard kopiert, sofern ein solches gesetzt ist (anderenfalls wird nicht die Datei in das fehlende Clipboard, sondern eine Fehlermeldung auf den realen Bildschirm kopiert). Bei Textdateien werden dabei grundstzlich zwei Dateien erzeugt: SCRAP.TXT als reine ASCII-Datei (bereinigt von eventuellen Text-Attributen) sowie SCRAP.OUT mit eventuellen Standard- Textattributen. Andere Dateiformate werden als SCRAP.IMG, SCRAP.GEM, SCRAP.RSC, SCRAP.SAM bzw. SCRAP.SND geschrieben. Befindet man sich gerade im Dump-Modus, so wird schlielich eine Datei namens SCRAP.DMP erzeugt. Wenn man mit dem Shareware-Editor 7UP arbeitet, kann man beispiels- weise unmittelbar nach der Kopie eines Hilfstextes ins Clipboard diesen in einen Text in 7UP einfgen, falls die GEM-Clipboard-Option eingeschaltet ist. 4.5 1st Guide und andere Applikationen ------------------------------------------ Falls Sie selber auch (GEM-)Programme schreiben, so knnen Sie 1st Guide ber die implementierten Kommunikations-Schnittstellen auch aus eigenen Anwendungen heraus ansprechen. Zunchst wre da der Nachrichtentyp VA_START. Durch Sendung dieser Nachricht an 1st Guide (nach Ermittlung der Identifikations-Nummer von 1st Guide mit Hilfe der Funktion appl_find) einschlielich der entsprechenden Parameter (Pfadnamen) kann 1st Guide bereits aktiviert und zur Fensterffnung veranlat werden. 1st Guide informiert dann seinerseits den Absender dieser Nachricht ber geffnete Fenster bzw. deren Schlieung (Meldungen AV_ACCWINDOPEN und AV_ACCWINDCLOSED). Falls das Programm diese Meldungen auswertet, kann es mit VA_DRAGACCWIND Nachrichten an 1st Guide mit Bezug auf eines dieser Fenster senden, was das berschreiben des Fensterinhalts zur Folge hat. Je nach Konfiguration von 1st Guide (siehe Kapitel 7) kann es jedoch auch sein, da die Dateien bei VA_START nicht in einem Fenster, sondern auf ein Gert ausgegeben werden. Mchte man unbedingt Dateien ausdrucken, so schickt man einfach eine Standard-CALCLOCK-Message (Nummer 100) an 1st Guide. Dabei knnen sogar wie bei VA_START auch mehrere Dateien gleichzeitig angegeben werden. Schlielich kann man sich auch die AC_HELP-Message zunutze machen, um 1st Guide einen Begriff in einer Indexdatei suchen zu lassen um daraufhin ein entsprechendes Fenster zu ffnen. Noch ein Hinweis: Rufen Sie appl_find immer erst unmittelbar bei Aktivierung eines entsprechenden Punktes durch den Nutzer auf und nicht nur bei Programmbeginn. Seit der Existenz von "The Chameleon" von Karsten Isakovic knen Accessories nmlich dynamisch nachgeladenen werden, so da bei Meldung eines nichtgeladenen 1st Guide der Nutzer dieses anschlieend nachladen und den entsprechenden Punkt einfach nochmal anwhlen knnte. 5. Gerteausgabe --------------------- Durch Drcken von ^P knnen Sie die aktuelle Datei ausdrucken. 1st Guide bentigt dazu grundstzlich GDOS. Wenn Sie bereits ein GDOS auf Ihrem ST installiert haben (z.B. im Zusammenhang mit GEMINI oder NVDI), knnen Sie sich also schon mal beruhigt zurcklehnen, ansonsten werden Sie eine Installation vielleicht im Zusammenhang mit 1st Guide in Erwgung ziehen. Falls Sie einen passenden GDOS-Treiber fr Ihren Drucker haben, knnen Sie problemlos Image- und Meta-Dateien ber 1st Guide in entsprechender Qualitt ausdrucken. Bei Text-Dateien wird die Ausgabe ber die VDI-Funktion V_ALPHA_TEXT vorgenommen, die ber den GDOS-Treiber Ausgaben im Textmodus auf den Drucker leitet und auerdem Textattribute in standardisierter Form (OUT-Format, siehe GEM-Profi-Buch von Gei/Gei) auswertet. 1st Guide wandelt nun auch die 1st Word Attribute sowie die der Link-Darstellung in diese Form um, so da Sie auf Ihrem Drucker eine analoge Ausgabe wie auf dem Bildschirm erhalten, und das ohne irgendeine PRINTER.CFG-Datei. Bei der Text-Ausgabe werden die eingeschrnkten Multitasking- Fhigkeiten des AES ausgenutzt, d.h. whrend der Ausgabe kann weitergearbeitet werden, wobei es allerdings zu 'Stockungen' kommen kann. Da 1st Guide mit geffneten Dateien arbeitet, kann es auerdem zu ernsthaften (sprich bombigen) Problemen kommen, wenn ein Programm beendet wird (auer unter MultiTOS!). Wenn Sie whrend der Ausgabe beide Shift-Tasten gleichzeitig gedrckt halten, knnen Sie diese abbrechen. Sicherheitshalber fragt 1st Guide nochmal nach. 6. RebuildUTIL\REBUILD-Funktion ------------------------ 7. Konfiguration --------------------- Durch Gedrckthalten der rechten Maustaste beim Aktivieren oder durch Drcken von ^A knnen Sie das Verhalten von 1st Guide in bestimmten Punkten Ihren individuellen Bedrfnissen anpassen und permanent sichern. Die Parameter werden direkt im Datenbereich des Programms gespeichert, so da keine INF-Datei bentigt wird. Dazu ist es erforderlich, da das Programm den Namen 1STGUIDE.AC*, 1STGUIDE.PRG, 1STGUIDE.APP oder 1STGUIDE.GTP hat und sich in demjenigen Pfad befindet, der beim Starten von 1st Guide aktuell war. Folgende Parameter knnen eingestellt werden: Standard-Ausgabe Fenster/Gert steht normalerweise auf "Fenster". Wenn Sie "Gert" einstel- len, werden die Dateien nicht in ein Fenster, sondern sofort auf das eingestellte Gert ausgegeben. Sie knnen jederzeit die alternative Ausgabemglichkeit verwenden, wenn Sie L.Shift-Alternate bei der Anwahl der Datei(en) gleichzeitig gedrckthalten. So knnen Sie in GEMINI z.B. schnell mal nebenbei Dateien ausdrucken, indem Sie sie auf das instal- lierte 1STGUIDE.ACC-Icon ziehen und beim Loslassen L.Shift-Alternate gedrckthalten. Control-P-Ausgabe Intern/CALCLOCK steht standardmig auf "Intern". Gerteausgaben werden so von 1st Guide selbst vorgenommen. Stellen Sie den Schalter auf "CALCLOCK", so wird statt dessen eine Nachricht an ein CALCLOCK-Accessory geschickt, welches dann die Ausgabe ber- nimmt. Vorsicht: Dies ist nur bei ASCII-Textdateien sinnvoll! Auch hierbei ist es mglich, durch zustzliches Gedrckthal- ten von L.Shift-Alternate jeweils die alternative Form anzu- whlen. Textfont-Einstellung Normal/VA_FILE Steht dieser Schalter auf "Normal", so wird beim Laden einer Textdatei immer der in 1st Guide aktuelle Font verwendet. Stellen Sie den Schalter auf "VA_FILE", so wird bei jedem ffnen eines Textfensters automatisch der Font ber das VA- Protokoll erfragt und eingestellt, falls ein entsprechendes Programm aktiv ist (z.B. GEMINI). Doppelklick-Standard Neues Fenster/berschreiben steht zunchst auf "Neues Fenster", d.h. beim Doppelklick auf ein Keyword wird ein neues Fenster geffnet, falls nicht eine Shift-, Alternate- oder Controltaste gedrckt ist. Steht der Schalter auf "berschreiben", so ist es genau andersherum. Auerdem ndert sich dadurch die Bedeutung des Fenster- Schlieknopfes! Er bewirkt dann das Zurckgehen im Infopfad (entspricht UNDO, ESC) hnlich wie bei Verzeichnishierarchien im Desktop. Mchte man trotzdem das Fenster schlieen, so kann man zustzlich die rechte Maustaste gedrckthalten. Die Indexdatei kann in dem entsprechenden Textfeld eingetragen oder per Datei-Auswahl-Box gewhlt werden. Zustzlich knnen Sie Parameter fr die Gerteausgabe festlegen, die sich weitgehend selbst erklren (sollten). Beim Sichern werden neben den angegebenen Parametern noch die aktuelle Fensterposition (wird dann beim nchsten ffnen des ersten Fensters wieder verwendet) sowie der aktuell eingestellte Textfont gespeichert! Die Fensterkoordinaten werden dabei in Promille der aktuellen Bildschirmausmae gespeichert, so da die Verhltnisse bei verschiedenen Auflsungen gleich sind. In der rechten unteren Ecke der Konfigurationsbox wird der grte verfgbare Speicherblock ("MEM:") sowie die Gesamtsumme aller freien Speicherblcke angezeigt ("TOT:"). An der Differenz beider Werte ist eine Speicherfragmentierung erkennbar. 8. Grenzen --------------- Fenster: 1st Guide kann theoretisch bis zu 32767 Fenster verwalten. Dies entspricht der Anzahl der gltigen Window-Handles. Wenn Sie mit TOS 1.04 arbeiten und das Programm WINX von Martin Osieka besitzen, knnen Sie bis zu 127 Fenster unter 1st Guide verwenden (auch GEMINI kommt mit dieser Fensterflut zurecht). Unter MultiTOS konnte ich keine Beschrnkung der offenen Fenster feststellen! Textdateien werden mit bis zu 32767 Zeilen mit maximal 512 Zeichen untersttzt. Pfadnamen drfen maximal 127 Zeichen lang sein. Argumente knnen sowohl ber VA_START als auch bei Programmstart in beliebiger Anzahl verarbeitet werden. Bei Programmstart wird dabei zuerst nach xArg und dann nach ARGV gefahndet. Erst wenn dies nichts fruchtet, wird die (beschrnkte) Standard- GEMDOS-Kommandozeile in der Basepage ausgewertet. Von mir gibt es dazu einen modifizierten Startcode, der das Scannen bernimmt und argc und argv fr main entsprechend setzt, so da keine Quelltext-nderung notwendig ist (liegt auch als Source DDSTART.S bei). Verzweigungen knnen nicht unbegrenzt geschachtelt werden. Zu jedem Fenster werden drei beschrnkte Buffer angelegt: - 128 Byte fr den Pfadnamen - 128 Byte fr die Schlsselkette (Fenstername) - 256 Byte "History-Buffer" (zum Ablegen von Informationen fr's Zurckverfolgen des Infopfades) 10 Verschachtelungen sollten normalerweise drin sein, leider wird das berlaufen der Buffer noch nicht gecheckt, so da man es mit dem Verzweigen nicht allzusehr bertreiben sollte. Bei Gelegenheit werde ich natrlich noch einen Check einbauen oder aber gleich zu dynamischen Buffern bergehen. 9. 1st IndexUTIL\1STINDEX ------------------- 10. Neu in VersionUTIL\VERSION ---------------------- 11. Referenz ---------------- Zunchst mchte ich mich herzlichst bei den Brdern Gei fr ihr GEM-Profi-Buch bedanken, ohne das dieses Projekt kaum mglich gewesen wre. Ein weiterer Dank gebhrt Stefan Eissing und Gereon Steffens fr ihren kommunikationsfreudigen und kaum Wnsche offenlassenden Desktop GEMINI, der eine bequeme Arbeit mit 1st Guide erst ermglicht. Nicht zuletzt geht mein Dank an Borland Mnchen fr ihre konkurrenzlos komfortable und leistungsfhige Purbo-C- Programmier-Umgebung. Bei 1st Guide handelt es sich um "Shareware"! Wenn Ihnen dieses Programm gefllt, Sie es benutzen und es Ihnen hilft, so sollten Sie sich gegen eine Untersttzung von DM 20,- bei untenstehender Adresse registrieren lassen. Sie knnen dann mit der Zustellung eines kompletten Info-Hypertext-Systems fr den geplagten ST-C-Programmierer und noch geplanter Weiterentwicklungen des Programms rechnen. Auerdem werde ich mich dann bemhen, evt. von Ihnen aufgesprte Bugs zu entfernen und Verbesserungsvorschlge zu bercksichtigen, sofern Sie mich davon berzeugen knnen. Sie knnen dieses Programm bedenkenlos weitergeben, aber achten Sie bitte darauf, da stets alle Dateien zusammen und unverndert kopiert werden. Viel Erfolg bei der Anwendung des Programms wnscht Ihnen Guido Vollbeding Leitergasse 4 / 503 D-O-4020 Halle Bankverbindung: Guido Vollbeding Stadt- u. Saalkreis-Sparkasse Halle Kto. 486260725 Blz. 800 537 62 TextUTIL\TEXT ResourceUTIL\RESOURCE RasterbildUTIL\IMAGE MetaUTIL\META SoundsampleUTIL\SOUND DumpUTIL\DUMP RebuildUTIL\REBUILD 1st IndexUTIL\1STINDEX Neu in VersionUTIL\VERSION TastaturTASTATUR TOSTOS GEMGEM TOS.RSCUTIL\TOS.RSC TIGER.IMGUTIL\TIGER.IMG COLORS.IMGUTIL\COLORS.IMG AAFALL.IMGUTIL\AAFALL.IMG AUGEN_2.IFFUTIL\AUGEN_2.IFF TOOLS.GEMUTIL\TOOLS.GEM TIGER.GEMUTIL\TIGER.GEM WELCOME.SAMUTIL\WELCOME.SAM AESAES\AES.HLP VDIVDI\VDI.HLP GEMDOSGEMDOS\GEMDOS.HLP XBIOSXBIOS\XBIOS.HLP BIOSBIOS\BIOS.HLP GEMDEFS.HUTIL\GEMDEFS.H GEMDEFS.SUTIL\GEMDEFS.S GEMDEFS.CUTIL\GEMDEFS.C ApplikationsAES\APPL\APPL.HLP EreignisAES\EVNT\EVNT.HLP MensAES\MENU\MENU.HLP ObjekteAES\OBJC\OBJC.HLP FormulareAES\FORM\FORM.HLP GrafikAES\GRAF\GRAF.HLP ZwischenspeicherAES\SCRP\SCRP.HLP DateiauswahlAES\FSEL\FSEL.HLP FensterAES\WIND\WIND.HLP ResourceAES\RSRC\RSRC.HLP ShellAES\SHEL\SHEL.HLP KontrollfunktionenVDI\CONTROL\CONTROL.HLP AusgabefunktionenVDI\OUTPUT\OUTPUT.HLP AttributfunktionenVDI\ATTRIB\ATTRIB.HLP RasterfunktionenVDI\RASTER\RASTER.HLP EingabefunktionenVDI\INPUT\INPUT.HLP NachfragefunktionenVDI\INQUIRE\INQUIRE.HLP EscapefunktionenVDI\ESCAPE\ESCAPE.HLP Zeichenweise Ein-/AusgabeGEMDOS\CINCOUT\CINCOUT.HLP ProgrammausfhrungGEMDOS\PEXEC\PEXEC.HLP DateifunktionenGEMDOS\FILE\FILE.HLP VerzeichnisfunktionenGEMDOS\DIR\DIR.HLP SpeicherbereichsverwaltungGEMDOS\MEM\MEM.HLP Datum und UhrzeitGEMDOS\TIME\TIME.HLP SystemfunktionenGEMDOS\SYS\SYS.HLP TastaturfunktionenXBIOS\KEYBD\KEYBD.HLP BildschirmfunktionenXBIOS\SCREEN\SCREEN.HLP DruckerfunktionenXBIOS\PRINTER\PRINTER.HLP LaufwerksfunktionenXBIOS\DRIVE\DRIVE.HLP Datum, Uhrzeit und ZeitgeberXBIOS\TIMER\TIMER.HLP InterruptfunktionenXBIOS\INTRUPT\INTRUPT.HLP SchnittstellenprogrammierungXBIOS\INTFACE\INTFACE.HLP SpezialbefehleXBIOS\SPECIAL\SPECIAL.HLP GetmpbBIOS\GETMPB BconstatBIOS\BCONSTAT BconinBIOS\BCONIN BconoutBIOS\BCONOUT RwabsBIOS\RWABS SetexcBIOS\SETEXC TickcalBIOS\TICKCAL GetbpbBIOS\GETBPB BcostatBIOS\BCOSTAT MediachBIOS\MEDIACH DrvmapBIOS\DRVMAP KbshiftBIOS\KBSHIFT appl_exitAES\APPL\APPL_EXI.C appl_findAES\APPL\APPL_FIN.C appl_initAES\APPL\APPL_INI.C appl_readAES\APPL\APPL_REA.C appl_tplayAES\APPL\APPL_TPL.C appl_trecordAES\APPL\APPL_TRE.C appl_writeAES\APPL\APPL_WRI.C evnt_mesagAES\EVNT\EVNT_MES.C evnt_buttonAES\EVNT\EVNT_BUT.C evnt_dclickAES\EVNT\EVNT_DCL.C evnt_keybdAES\EVNT\EVNT_KEY.C evnt_mouseAES\EVNT\EVNT_MOU.C evnt_multiAES\EVNT\EVNT_MUL.C evnt_timerAES\EVNT\EVNT_TIM.C menu_barAES\MENU\MENU_BAR.C menu_icheckAES\MENU\MENU_ICH.C menu_ienableAES\MENU\MENU_IEN.C menu_registerAES\MENU\MENU_REG.C menu_textAES\MENU\MENU_TEX.C menu_tnormalAES\MENU\MENU_TNO.C objc_addAES\OBJC\OBJC_ADD.C objc_changeAES\OBJC\OBJC_CHA.C objc_deleteAES\OBJC\OBJC_DEL.C objc_drawAES\OBJC\OBJC_DRA.C objc_editAES\OBJC\OBJC_EDI.C objc_findAES\OBJC\OBJC_FIN.C objc_offsetAES\OBJC\OBJC_OFF.C objc_orderAES\OBJC\OBJC_ORD.C form_alertAES\FORM\FORM_ALE.C form_buttonAES\FORM\FORM_BUT.C form_centerAES\FORM\FORM_CEN.C form_dialAES\FORM\FORM_DIA.C form_doAES\FORM\FORM_DO.C form_errorAES\FORM\FORM_ERR.C form_keybdAES\FORM\FORM_KEY.C graf_dragboxAES\GRAF\GRAF_DRA.C graf_growboxAES\GRAF\GRAF_GRO.C graf_handleAES\GRAF\GRAF_HAN.C graf_mkstateAES\GRAF\GRAF_MKS.C graf_mouseAES\GRAF\GRAF_MOU.C graf_moveboxAES\GRAF\GRAF_MOV.C graf_rubberboxAES\GRAF\GRAF_RUB.C graf_shrinkboxAES\GRAF\GRAF_SHR.C graf_slideboxAES\GRAF\GRAF_SLI.C graf_watchboxAES\GRAF\GRAF_WAT.C scrp_readAES\SCRP\SCRP_REA.C scrp_writeAES\SCRP\SCRP_WRI.C scrp_clearAES\SCRP\SCRP_CLE.C fsel_inputAES\FSEL\FSEL_INP.C fsel_exinputAES\FSEL\FSEL_EXI.C wind_calcAES\WIND\WIND_CAL.C wind_closeAES\WIND\WIND_CLO.C wind_createAES\WIND\WIND_CRE.C wind_deleteAES\WIND\WIND_DEL.C wind_findAES\WIND\WIND_FIN.C wind_getAES\WIND\WIND_GET.C wind_openAES\WIND\WIND_OPE.C wind_setAES\WIND\WIND_SET.C wind_updateAES\WIND\WIND_UPD.C rsrc_freeAES\RSRC\RSRC_FRE.C rsrc_gaddrAES\RSRC\RSRC_GAD.C rsrc_loadAES\RSRC\RSRC_LOA.C rsrc_obfixAES\RSRC\RSRC_OBF.C rsrc_saddrAES\RSRC\RSRC_SAD.C shel_envrnAES\SHEL\SHEL_ENV.C shel_findAES\SHEL\SHEL_FIN.C shel_getAES\SHEL\SHEL_GET.C shel_putAES\SHEL\SHEL_PUT.C shel_readAES\SHEL\SHEL_REA.C shel_writeAES\SHEL\SHEL_WRI.C v_clrwkVDI\CONTROL\V_CLRWK.C v_clswkVDI\CONTROL\V_CLSWK.C v_opnwkVDI\CONTROL\V_OPNWK.C v_opnvwkVDI\CONTROL\V_OPNVWK.C v_updwkVDI\CONTROL\V_UPDWK.C vs_clipVDI\CONTROL\VS_CLIP.C vst_load_fontsVDI\CONTROL\VST_LOAD.C vst_unload_fontsVDI\CONTROL\VST_UNLO.C v_alpha_textVDI\OUTPUT\V_ALPHA_.C v_plineVDI\OUTPUT\V_PLINE.C v_pmarkerVDI\OUTPUT\V_PMARKE.C v_gtextVDI\OUTPUT\V_GTEXT.C v_fillareaVDI\OUTPUT\V_FILLAR.C v_cellarrayVDI\OUTPUT\V_CELLAR.C v_contourfillVDI\OUTPUT\V_CONTOU.C vr_recflVDI\OUTPUT\VR_RECFL.C v_arcVDI\OUTPUT\V_ARC.C v_barVDI\OUTPUT\V_BAR.C v_circleVDI\OUTPUT\V_CIRCLE.C v_ellipseVDI\OUTPUT\V_ELLIPS.C v_ellarcVDI\OUTPUT\V_ELLARC.C v_ellpieVDI\OUTPUT\V_ELLPIE.C v_justifiedVDI\OUTPUT\V_JUSTIF.C v_piesliceVDI\OUTPUT\V_PIE.C v_rboxVDI\OUTPUT\V_RBOX.C v_rfboxVDI\OUTPUT\V_RFBOX.C vs_colorVDI\ATTRIB\VS_COLOR.C vswr_modeVDI\ATTRIB\VSWR_MOD.C vsl_colorVDI\ATTRIB\VSL_COLO.C vsl_endsVDI\ATTRIB\VSL_ENDS.C vsl_typeVDI\ATTRIB\VSL_TYPE.C vsl_udstyVDI\ATTRIB\VSL_UDST.C vsl_widthVDI\ATTRIB\VSL_WIDT.C vsm_colorVDI\ATTRIB\VSM_COLO.C vsm_heightVDI\ATTRIB\VSM_HEIG.C vsm_typeVDI\ATTRIB\VSM_TYPE.C vst_alignmentVDI\ATTRIB\VST_ALIG.C vst_colorVDI\ATTRIB\VST_COLO.C vst_effectsVDI\ATTRIB\VST_EFFE.C vst_fontVDI\ATTRIB\VST_FONT.C vst_heightVDI\ATTRIB\VST_HEIG.C vst_pointVDI\ATTRIB\VST_POIN.C vst_rotationVDI\ATTRIB\VST_ROTA.C vsf_colorVDI\ATTRIB\VSF_COLO.C vsf_interiorVDI\ATTRIB\VSF_INTE.C vsf_perimeterVDI\ATTRIB\VSF_PERI.C vsf_styleVDI\ATTRIB\VSF_STYL.C vsf_updatVDI\ATTRIB\VSF_UPDA.C v_get_pixelVDI\RASTER\V_GET_PI.C vr_trnfmVDI\RASTER\VR_TRNFM.C vro_cpyfmVDI\RASTER\VRO_CPYF.C vrt_cpyfmVDI\RASTER\VRT_CPYF.C v_hide_cVDI\INPUT\V_HIDE_C.C v_show_cVDI\INPUT\V_SHOW_C.C vex_butvVDI\INPUT\VEX_BUTV.C vex_curvVDI\INPUT\VEX_CURV.C vex_motvVDI\INPUT\VEX_MOTV.C vex_timvVDI\INPUT\VEX_TIMV.C vq_key_sVDI\INPUT\VQ_KEY_S.C vq_mouseVDI\INPUT\VQ_MOUSE.C vrq_choiceVDI\INPUT\VRQ_CHOI.C vrq_locatorVDI\INPUT\VRQ_LOCA.C vrq_stringVDI\INPUT\VRQ_STRI.C vrq_valuatorVDI\INPUT\VRQ_VALU.C vsc_formVDI\INPUT\VSC_FORM.C vsin_modeVDI\INPUT\VSIN_MOD.C vsm_choiceVDI\INPUT\VSM_CHOI.C vsm_locatorVDI\INPUT\VSM_LOCA.C vsm_stringVDI\INPUT\VSM_STRI.C vsm_valuatorVDI\INPUT\VSM_VALU.C vq_cellarrayVDI\INQUIRE\VQ_CELLA.C vq_colorVDI\INQUIRE\VQ_COLOR.C vq_extndVDI\INQUIRE\VQ_EXTND.C vq_gdosVDI\INQUIRE\VQ_GDOS.C vq_scanVDI\INQUIRE\VQ_SCAN.C vqf_attributesVDI\INQUIRE\VQF_ATTR.C vqin_modeVDI\INQUIRE\VQIN_MOD.C vql_attributesVDI\INQUIRE\VQL_ATTR.C vqm_attributesVDI\INQUIRE\VQM_ATTR.C vqt_attributesVDI\INQUIRE\VQT_ATTR.C vqt_extentVDI\INQUIRE\VQT_EXTE.C vqt_fontinfoVDI\INQUIRE\VQT_FONT.C vqt_nameVDI\INQUIRE\VQT_NAME.C vqt_widthVDI\INQUIRE\VQT_WIDT.C v_curaddressVDI\ESCAPE\V_CURADD.C v_curdownVDI\ESCAPE\V_CURDOW.C v_currightVDI\ESCAPE\V_CURRIG.C v_curleftVDI\ESCAPE\V_CURLEF.C v_curhomeVDI\ESCAPE\V_CURHOM.C v_curtextVDI\ESCAPE\V_CURTEX.C v_curupVDI\ESCAPE\V_CURUP.C v_eeolVDI\ESCAPE\V_EEOL.C v_eeosVDI\ESCAPE\V_EEOS.C v_enter_curVDI\ESCAPE\V_ENTER_.C v_exit_curVDI\ESCAPE\V_EXIT_C.C v_rvonVDI\ESCAPE\V_RVON.C v_rvoffVDI\ESCAPE\V_RVOFF.C vq_chcellsVDI\ESCAPE\VQ_CHCEL.C vq_curaddressVDI\ESCAPE\VQ_CURAD.C v_bit_imageVDI\ESCAPE\V_BIT_IM.C v_clear_disp_listVDI\ESCAPE\V_CLEAR_.C v_dspcurVDI\ESCAPE\V_DSPCUR.C v_form_advVDI\ESCAPE\V_FORM_A.C v_hardcopyVDI\ESCAPE\V_HARDCO.C v_output_windowVDI\ESCAPE\V_OUTPUT.C v_rmcurVDI\ESCAPE\V_RMCUR.C vq_tabstatusVDI\ESCAPE\VQ_TABST.C vs_paletteVDI\ESCAPE\VS_PALET.C vqp_errorVDI\ESCAPE\VQP_ERRO.C vqp_filmsVDI\ESCAPE\VQP_FILM.C vqp_stateVDI\ESCAPE\VQP_STAT.C vsp_messageVDI\ESCAPE\VSP_MESS.C vsp_saveVDI\ESCAPE\VSP_SAVE.C vsp_stateVDI\ESCAPE\VSP_STAT.C v_meta_extentsVDI\ESCAPE\V_META_E.C v_write_metaVDI\ESCAPE\V_WRITE_.C vm_filenameVDI\ESCAPE\VM_FILEN.C v_fontinitVDI\ESCAPE\V_FONTIN.C v_offsetVDI\ESCAPE\V_OFFSET.C CconinGEMDOS\CINCOUT\CCONIN CconoutGEMDOS\CINCOUT\CCONOUT CauxinGEMDOS\CINCOUT\CAUXIN CauxoutGEMDOS\CINCOUT\CAUXOUT CprnoutGEMDOS\CINCOUT\CPRNOUT CrawioGEMDOS\CINCOUT\CRAWIO CrawcinGEMDOS\CINCOUT\CRAWCIN CnecinGEMDOS\CINCOUT\CNECIN CconwsGEMDOS\CINCOUT\CCONWS CconrsGEMDOS\CINCOUT\CCONRS CconisGEMDOS\CINCOUT\CCONIS CconosGEMDOS\CINCOUT\CCONOS CprnosGEMDOS\CINCOUT\CPRNOS CauxisGEMDOS\CINCOUT\CAUXIS CauxosGEMDOS\CINCOUT\CAUXOS Pterm0GEMDOS\PEXEC\PTERM0 PtermresGEMDOS\PEXEC\PTERMRES PexecGEMDOS\PEXEC\PEXEC PtermGEMDOS\PEXEC\PTERM FsetdtaGEMDOS\FILE\FSETDTA FgetdtaGEMDOS\FILE\FGETDTA FcreateGEMDOS\FILE\FCREATE FopenGEMDOS\FILE\FOPEN FcloseGEMDOS\FILE\FCLOSE FreadGEMDOS\FILE\FREAD FwriteGEMDOS\FILE\FWRITE FdeleteGEMDOS\FILE\FDELETE FseekGEMDOS\FILE\FSEEK FattribGEMDOS\FILE\FATTRIB FdupGEMDOS\FILE\FDUP FforceGEMDOS\FILE\FFORCE FsfirstGEMDOS\FILE\FSFIRST FsnextGEMDOS\FILE\FSNEXT FrenameGEMDOS\FILE\FRENAME FdatimeGEMDOS\FILE\FDATIME DsetdrvGEMDOS\DIR\DSETDRV DgetdrvGEMDOS\DIR\DGETDRV DfreeGEMDOS\DIR\DFREE DcreateGEMDOS\DIR\DCREATE DdeleteGEMDOS\DIR\DDELETE DsetpathGEMDOS\DIR\DSETPATH DgetpathGEMDOS\DIR\DGETPATH MallocGEMDOS\MEM\MALLOC MfreeGEMDOS\MEM\MFREE MshrinkGEMDOS\MEM\MSHRINK MaddaltGEMDOS\MEM\MADDALT MxallocGEMDOS\MEM\MXALLOC TgetdateGEMDOS\TIME\TGETDATE TsetdateGEMDOS\TIME\TSETDATE TgettimeGEMDOS\TIME\TGETTIME TsettimeGEMDOS\TIME\TSETTIME SuperGEMDOS\SYS\SUPER SversionGEMDOS\SYS\SVERSION KeytblXBIOS\KEYBD\KEYTBL BioskeysXBIOS\KEYBD\BIOSKEYS KbrateXBIOS\KEYBD\KBRATE InitmouseXBIOS\SCREEN\INITMOUS CursconfXBIOS\SCREEN\CURSCONF LogbaseXBIOS\SCREEN\LOGBASE PhysbaseXBIOS\SCREEN\PHYSBASE SetscreenXBIOS\SCREEN\SETSCREE GetrezXBIOS\SCREEN\GETREZ SetpaletteXBIOS\SCREEN\SETPALET SetcolorXBIOS\SCREEN\SETCOLOR VsyncXBIOS\SCREEN\VSYNC EsetShiftXBIOS\SCREEN\ESETSHIF EgetShiftXBIOS\SCREEN\EGETSHIF EsetBankXBIOS\SCREEN\ESETBANK EsetColorXBIOS\SCREEN\ESETCOLO EsetPaletteXBIOS\SCREEN\ESETPALE EgetPaletteXBIOS\SCREEN\EGETPALE EsetGrayXBIOS\SCREEN\ESETGRAY EsetSmearXBIOS\SCREEN\ESETSMEA ScrdmpXBIOS\PRINTER\SCRDMP SetprtXBIOS\PRINTER\SETPRT PrtblkXBIOS\PRINTER\PRTBLK FloprdXBIOS\DRIVE\FLOPRD FlopwrXBIOS\DRIVE\FLOPWR FlopfmtXBIOS\DRIVE\FLOPFMT ProtobtXBIOS\DRIVE\PROTOBT FlopverXBIOS\DRIVE\FLOPVER FloprateXBIOS\DRIVE\FLOPRATE DMAreadXBIOS\DRIVE\DMAREAD DMAwriteXBIOS\DRIVE\DMAWRITE SettimeXBIOS\TIMER\SETTIME GettimeXBIOS\TIMER\GETTIME XbtimerXBIOS\TIMER\XBTIMER JdisintXBIOS\INTRUPT\JDISINT JenabintXBIOS\INTRUPT\JENABINT MidiwsXBIOS\INTFACE\MIDIWS MfpintXBIOS\INTFACE\MFPINT IorecXBIOS\INTFACE\IOREC RsconfXBIOS\INTFACE\RSCONF IkbdwsXBIOS\INTFACE\IKBDWS GiaccessXBIOS\INTFACE\GIACCESS OffgibitXBIOS\INTFACE\OFFGIBIT OngibitXBIOS\INTFACE\ONGIBIT DosoundXBIOS\INTFACE\DOSOUND KbdvbaseXBIOS\INTFACE\KBDVBASE BconmapXBIOS\INTFACE\BCONMAP SsbrkXBIOS\SPECIAL\SSBRK RandomXBIOS\SPECIAL\RANDOM SupexecXBIOS\SPECIAL\SUPEXEC PuntaesXBIOS\SPECIAL\PUNTAES BlitmodeXBIOS\SPECIAL\BLITMODE FehlerBIOS\ERROR V_CLSVWKVDI\CONTROL\V_CLSVWK.C FehlernummerGEMDOS\ERROR GEM (Graphics Environment Manager) Im Gegensatz zu einem konventionellen BetriebssystemTOS, dessen Haupt- augenmerk meist auf der Dateiorganisation, einem Multitaskingsystem und der Ansteuerung von Peripheriegerten liegt, ist GEM in erster Linie zur konsistenten und portablen Programmierung von grafischen Ausgabesystemen entwickelt worden. Darberhinaus soll GEM den Dialog zwischen Programm und Anwender erleichtern. Die Betriebssystemumgebung von GEM besteht aus zwei Teilen, einem mehr auf die Grafik spezialisiertem und einem berwiegend im Hinblick auf eine leicht anzuwendende Benutzerschnittstelle orientierten Ab- schnitt: AESAES\AES.HLP (Application Environment Services) VDIVDI\VDI.HLP (Virtual Device Interface) AES bernimmt dabei die Organisation der Benutzerumgebung, wohingegen VDI fr eine einheitliche grafische Gestaltung der Benutzeroberflche sorgt. Whrend AES auf VDI-Funktionen basiert, wird im VDI keine AES-Funktion verwendet. Man kann AES als das bergeordnete System be- trachten. Zusammen mit den Funktionen eines konventionellen Betriebs- sytems erfllt GEM damit alle Anforderungen an ein anwendergerechetes Betriebssystem. GEM-Funktionen werden, hnlich anderen Betriebssystemfunktionen, ber ein standardisiertes Interface angesprochen. Normalerweise braucht sich der Programmierer darum nicht zu kmmern, da auch der Aufruf ber Funktionsnamen von einer hheren Programmiersprache aus standar- disiert ist. Manchmal ist es jedoch ntzlich, ber die Parameter- bergabe bescheid zu wissen. Die Datei GEMDEFS.HUTIL\GEMDEFS.H zeigt ein mgliches Interface zur Nutzung mit Purbo-C unter TOS und MS-DOS, welches auch tatschlich zur Herstellung einer entsprechenden Anbindung in Form einer Funktionsbibliothek genutzt wurde. Die zugehrigen systemabhngigen Definitionen befinden sich fr TOS (Turbo-C 2.0 oder Pure-C 1.0) in der Datei GEMDEFS.SUTIL\GEMDEFS.S und fr MS-DOS (Turbo-C 2.0 oder Turbo-C++ 1.0) in der Datei GEMDEFS.CUTIL\GEMDEFS.C. Installation fr Atari ST(E)/TT: -------------------------------- 1. Kopieren Sie die Datei 1STGUIDE.ACC in Ihr Boot-Verzeichnis. Falls Sie ber 1st Guide drucken mchten, mu GDOS installiert sein. 2. Wenn Sie eine Festplatte bzw. bei groem Arbeitsspeicher eine gengend groe RAM-Disk besitzen, legen Sie dort einen neuen Ordner an (z.B. "1STGUIDE"), und kopieren Sie den gesamten Disketteninhalt dort hinein (falls nicht schon beim Auspacken geschehen). 3. Starten Sie Ihren Computer neu, klicken im Desk-Men des Desktops den Punkt "1st Guide" an und whlen in der darauf erscheinenden Datei-Auswahlbox die Datei "1STGUIDE.HLP" im entsprechenden Datentrger/Ordner aus. Dort erhalten Sie weitere Benutzungs- Informationen. Zustzlich kann man in die [NEW]DESK[TOP].INF-Datei etwa folgende Zeile VOR allen anderen Anwendungen einfgen: #G 03 04 C:\1STGUIDE.ACC@ *.*@ Man erhlt dann nie mehr die Meldung "Anzeigen/Drucken/Abbrechen". Fgt man danach noch die Zeile #G 03 FF *.AC*@ @ ein, so kann man 1STGUIDE (und bestimmte andere, auch inaktivierte Accessories) direkt als Programm starten. Alternativ dazu kann 1STGUIDE auch in .PRG, .APP oder .GTP umbenannt werden, um es als Programm zu benutzen. Auerdem finden Sie im Ordner \TOOLS\1STVIEW das Accessory 1STVIEW.ACC. Damit knnen Sie wie in 1st Guide Dateien verschiedenster Formate betrachten, es fehlt jedoch die Hypertext-Verzweigungs-Mglichkeit. Fr interessierte Programmierer habe ich dazu den kompletten Quelltext beigelegt (im Ordner \TOOLS\QUELLEN). 1st Guide stellt im Grunde genommen eine Erweiterung dieses Programms dar. Andererseits hat 1st Guide aber einen entscheidenden Nachteil gegenber 1st View: Das schlechte Gewissen, das Sie plagen wird, wenn Sie 1st Guide regelmig benutzen, ohne sich ordnungsgem beim Autor registrieren zu lassen (siehe 1STGUIDE.HLP). Bei 1st Guide handelt es sich nmlich um Shareware, whrend 1st View als Freeware zu betrachten ist. Der Inhalt des Ordners \TOOLS\1STVIEW darf auch unabhngig von 1st Guide weitergegeben werden. Wer auf eine ansprechende gedruckte Anleitung Wert legt, findet auerdem die Datei 1STGUIDE.DVI, die mit einem TeX-System ausgedruckt werden kann. Sie knnen 1st Guide und 1st View auch unter MSDOS-GEM nutzen. Im Ordner \TOOLS\MSDOS finden Sie die entsprechenden Programme, welche aus der bersetzung der Quellen mit der MSDOS-Version von Turbo-C entstanden sind (unter Nutzung der hier dokumentierten GEM-Einbindung). Die Installation ist hnlich der ST-Version. Das jeweilige Accessory ist in den Ordner \GEMBOOT (GEM 2.x) bzw. \GEMAPPS\GEMBOOT (GEM 3.x) zu kopieren und man kann die DESKTOP.INF-Datei etwa um folgende BEIDEN Zeilen erweitern (VOR allen anderen Applikationen): #G0828 E:\PROGRAMM\1STGUIDE\1STGUIDE.APP@ *.*@ #G0828 *.APP@ @ Achtung! Im Gegensatz zur ST-Version kann das Accessory nicht einfach umbenannt werden, um es als Programm zu starten. Man mu die jeweilige Programmversion benutzen. Erklrung: ---------- 1st Guide ist ein Shareware-Programmpaket von: Guido Vollbeding Leitergasse 4 / 503 D-O-4020 Halle Fr irgendwelche Schden, einschlielich aber nicht beschrnkt auf materielle oder finanzielle, die direkt oder indirekt durch die Benutzung oder Nichtbenutzung der Programme und/oder Dokumentationen oder Teilen davon oder durch die Untauglichkeit derselben fr einen bestimmten Zweck entstehen, kann ich, Guido Vollbeding, keinerlei Haftung bernehmen. Eventuelle hnlichkeiten der vorliegenden Software mit existierenden oder geplanten Produkten namhafter oder unbekannter Hersteller sind nicht beabsichtigt, sondern wren rein zufllig. Alle Rechte an den vorliegenden Programmen liegen beim Autor. Das Programmpaket darf ausschlielich FREI weitergegeben werden, eine kommerzielle Verbreitung in jeder Form (PD-Sammeldisketten o..) ist nur mit meiner schriftlichen Genehmigung gestattet. Zur Zeit ist nur der PD-Service des Atari-Journals von mir zur Weitergabe autorisiert (schlielich hat sich dieses Blatt auch in der Ausgabe 4/92 zu einem Testbericht ber 1st Guide herabgelassen). Es mssen immer ALLE Dateien zusammen und unverndert weitergegeben werden. Unsachgeme nderungen oder Eingriffe sind nicht erlaubt. Daher merke: Wer 1stGuide-Programme nachmacht oder verflscht oder nachgemachte oder verflschte 1stGuide-Programme sich verschafft und in Verkehr bringt, wird mit System-Ab- strzen nicht unter 2 Bomben bestraft. Ansonsten viel Spa mit 1st Guide, und mge der Atari immer mit Ihnen sein! Folgende allgemeine Tastatur-Kommandos stehen zur Verfgung: Control-O ffnen eines neuen Info-Fensters. Entspricht Anwahl des Punktes "1st Guide" im Desk-Men. Control-D berladen des obersten Info-Fensters mit neuer Datei. Control-U Schlieen des obersten Info-Fensters. Entspricht Anklicken des Schliefeldes im Info-Fenster mit der Maus. Control-F Zoomen des obersten Info-Fensters. Entspricht Anklicken des Full-Knopfes im Info-Fenster mit der Maus. Control-W "Cycle Windows", d. h. zyklisch nacheinander Aktivierung aller Info-Fenster mglich. Control-Q Schliet alle Info-Fenster. (Shift-) (Seitenweises) Cursortasten Scrollen. (Shift-) Zum (unteren) ClrHome oberen Rand. (Shift-) Zum (rechten) Insert linken Rand. Undo; Esc Oberstes Fenster mit vorhergehendem Inhalt berschreiben. Control-A ffnet den Konfigurations-Dialog und zeigt das aktuelle Versionsdatum von 1STGUIDE. Dies kann auch durch Gedrckthalten der rechten Maustaste beim Aktivieren ber das Desk-Men erreicht werden. Control-C Kopiert die aktuelle Datei ins GEM-Clipboard. Control-P Gibt die aktuelle Datei auf ein Gert (Drucker) aus oder sendet einen entsprechenden Auftrag an den System-Spooler (CALCLOCK.ACC). Sonder-Funktionen bei Aktivierung: Shift-Alternate Alternative Dateiausgabe Fenster/Gert. Control-Alternate Datei im Dump-Modus laden. Shift-Control Indexdatei laden. Rechts-Shift bei IMGs Farbpalette in Reihenfolge der VDI-Indizes laden/speichern Je nach Dateiformat werden zustzlich folgende Tasten ausgewertet: Text """" Control-N Einstellen Normalschrift (10 Punkt). Control-M Einstellen Mittelschrift (9 Punkt). Control-K Einstellen Kleinschrift (8 Punkt). Control-E Font ber VA-Protokoll einstellen. Control-X OUT- bzw. DMP-Datei schreiben. Backspace Suchstring um letztes Zeichen verkrzen. Delete Suchstring lschen. Zeichen mit einem ASCII-Code nicht kleiner als 32 werden schritt- weise zu einem Suchstring zusammengefat, welcher im Fenstertitel angezeigt wird. Die Suche bezieht sich bei Texten mit Verzweigungs- schlsseln immer auf die Link-Eintrge, sonst auf den ganzen Text. Gro/Kleinschreibung wird bei Links ignoriert, sonst nicht. Die folgenden Tasten werden nur bei Texten mit Verzweigungsschlsseln ausgewertet: Help Zu selektiertem Eintrag verzweigen mit berschreiben des Fensters. Return; Enter Zu selektiertem Eintrag verzweigen mit ffnen eines neuen Fenster. (Shift-) (Vorhergehenden) Tab Nchsten Verzweigungseintrag selektieren. Resource """""""" Control-Cursor Vorhergehenden/Nachfolgenden -Links/Rechts Objektbaum darstellen. Control-K Konvertieren M68k <-> Ix86. Image """"" Control-S Einstellen Standard-Farbpalette. Control-E Einstellen Original-Farbpalette (nur XIMG bzw. CMAP). Control-K Wechsel zwischen geditherter und transparenter Darstellung. Control-X Sichern XIMG bzw. CMAP. Meta """" Control-S Einstellen Original-Mastab. Control-E Einpassen in Fenster. Control-Cursor Zur ersten/nchsten -Links/Rechts Seite. Soundsample """"""""""" Control-S Einstellen Original-Mastab. Control-E Einpassen in Fenster. Control-Cursor Nchstniedere/Nchsthhere -Links/Rechts Frequenz einstellen. Control-N Interruptsound aktivieren Control-M DMA-Sound aktivieren Control-T Sound stoppen TOS - Das Betriebssystem Das Atari-Betriebssystem ist in verschiedene Bereiche aufgeteilt. Zum einen gibt es die grafische Benutzeroberflche GEMGEM, mit AESAES\AES.HLP und VDIVDI\VDI.HLP, zum andern aber auch die klassischen Betriebssystemfunktionen. Diese Betriebssystemfunktionen sind wiederum in drei Bereiche aufge- gliedert: GEMDOSGEMDOS\GEMDOS.HLP XBIOSXBIOS\XBIOS.HLP BIOSBIOS\BIOS.HLP GEMDOSGEMDOS\GEMDOS.HLP ist der Kern des Betriebssystems. Es werden unter anderem Funktionen zur Ein-/Ausgabe, Datei- und Speicherverwaltung bereitge- stellt. Im BIOSBIOS\BIOS.HLP (basic input output system) und XBIOSXBIOS\XBIOS.HLP (extended basic input output system) sind die hardware-abhngigen Funktionen enthalten. Das BIOSBIOS\BIOS.HLP enthlt dabei smtliche Funktionen, die zur Implementierung des GEMDOSGEMDOS\GEMDOS.HLP bentigt werden. Das XBIOSXBIOS\XBIOS.HLP enthlt weitere Funktionen, die besondere Eigenschaften der ST-Hardware untersttzen und nicht von GEMDOSGEMDOS\GEMDOS.HLP verwendet werden. Whrend die BIOSBIOS\BIOS.HLP-Funktionen in erster Linie die zeichenweise Ausgabe untersttzen, sind im XBIOSXBIOS\XBIOS.HLP vor allem die Funktionen fr die speziellen Gerte am Atari ST vom Diskettenlaufwerk bis hin zur MIDI-Schnittstelle zusammengefat. GEMDOS - was ist das? Ist das auch im ATARI ST? Da soll doch als Betriebssystem TOS drin sein. Oder CP/M68K. Oder was? Diese Frage ist mit wenigen Worten beantwortet. Das Betriebssystem des ST wird nach dem Chef der Firma ATARI als TOS - Tramiel Opera- ting System - bezeichnet. Manchmal findet man auch die Erklrung 'The Operating System'. Dieses TOS hat, im Gegensatz zu frheren Informationen, nichts mit CP/M 68K von DIGITAL RESEARCH zu tun. Zwar wurde zu Beginn der Entwicklung des ST das CP/M 68K auf dem ATARI implementiert, diese Entwicklung jedoch spter wieder einge- stampft, weil besonders der Diskettenzugriff unter CP/M 68K nicht gerade ein Ausbund an Arbeitsgeschwindigkeit darstellt. Anfang 1985 begann bei DIGITAL RESEARCH die Entwicklung eines neuen Betriebssystems fr 68000-Rechner, die mit der Benutzerober- flche GEM ausgerstet werden sollten. Dieses Betriebssystem bekam den Namen GEMDOS. Und genau dieses GEMDOS stellt den hardwareunab- hngigen Teil des TOS dar. *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ############################################### *********************************************** Program ten zostal sprowadzony do Polski przez Krata Soft z Krakowa w lipcu 1993. Jesli chcesz miec najnowsze oprogramowanie na Atari ST,STE,TT,FALCON 030 to przyjdz do nas.Stoimy na gieldzie Elbud ul.Wadowicka 12 w Krakowie w kazda sobote i niedziele. Czesc! Krata Soft ###############################################