![]() |
ENGLISH VERSION |
|
![]() |
Links | | | Forum | | | Kommentare | | | News melden |
![]() |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
![]() |
amiga-news.de Forum > Programmierung > ASL-Screenmoderequester will nich so | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
23.07.2003, 08:03 Uhr Reth Posts: 1860 Nutzer |
Hallo, ich mal wieder, hab gestern eben mal nen ASL-Screenmode-Requester fabriziert und dabei festgestellt, dass er die Angaben zu MinDepth und MaxDepth völlig ignoriert! Ich hab beide auf 8 eingestellt, aber dennoch alle Modi zur Auswhl bekommen, auch mit 16Bit und 24 Bit. Nun versuch ich gerad ne Filterfunktion einzubauen, aber das klappt noch nicht! Weiss jemand, warum der ASL-Screenmoderequester die beiden Angaben ignoriert? Danke schon mal Ciao [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 09:51 Uhr thomas Posts: 7721 Nutzer |
MinDepth und MaxDepth beziehen sich auf die Farbauswahl (ASLSM_DoDepth = TRUE), nicht auf die ModeID-Liste. Wenn du MinDepth = 7 und MaxDepth = 8 machst, kannst du zwischen 128 und 256 Farben auswählen, egal welcher Modus. Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 09:53 Uhr Reth Posts: 1860 Nutzer |
Oh, vielen Dank, das stand niergendwo! Dann muss ich wohl sehen, dass ich die Filterfunktion hinbekomme! Danke nochmals Ciao [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 10:21 Uhr thomas Posts: 7721 Nutzer |
Hier ist ein Programm mit Filterfunktion:code:#include <clib/asl_protos.h> #include <clib/graphics_protos.h> __saveds ULONG filter (register __A0 struct Hook *hook,register __A1 ULONG modeid,register __A2 struct ScreenModeRequester *req) { struct DimensionInfo info; if (GetDisplayInfoData (NULL,&info,sizeof(info),DTAG_DIMS,modeid)) { if (info.MaxDepth == 8) return (TRUE); } return (FALSE); } int main (void) { struct ScreenModeRequester *req; struct Hook hook; hook.h_Entry = (void *)filter; hook.h_SubEntry = NULL; if (req = AllocAslRequestTags (ASL_ScreenModeRequest, ASLSM_FilterFunc,&hook, TAG_END)) { AslRequestTags (req, TAG_END); FreeAslRequest (req); } return (0); } Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ Dieser Beitrag wurde von thomas am 23.07.2003 editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 10:52 Uhr Reth Posts: 1860 Nutzer |
SUPER!!! Vielen Dank! Noch ne Frage: Muss man die Definitionen so vornehmen? (Also mit __saveds und register __A0 glaub dazu steht was im AmigaIntern bzgl. Hooks, kann das sein?)?? Und muss der Rückgabewert ULONG sein, oder kann er auch BOOL sein? Ach ja, wenn ich gerad am Fragen bin: Hab mich da noch nich so eingelesen. Wenn ich nen Overscan-Screen mit Autoscroll öffnen will, was muss ich da noch tun als in der Funktion zum Screenöffnen die entsprechenden Tags richtig zu setzen? Meine Vorstellung ist die, dass der Anwender einen 640x480 Screen öffnet, ich aber immer ein Fenster der Größe 1024x768 aufmache. So weit so gut, nur scrollt dann das Fenster mit/in diesem Screen nicht, wenn ich mit der Maus an den Rand komme! Irgendwas fehlt da noch, aber was? Nochmals vielen Dank für die Funktion! Ciao [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 12:42 Uhr thomas Posts: 7721 Nutzer |
Der h_Entry bekommt die Parameter immer in Registern. Du könntest in h_Entry ein kurzes Assembler-Programm übergeben, das die Parameter auf den Stack schiebt und dann h_SubEntry aufruft. Dann kannst (bzw. mußt) du die C-Funktion ohne __A0 etc. deklarieren. __saveds ist für das small-data-model, damit das Basis-Register (meistens A4) neu gesetzt wird, denn das AmigaOS schert sich nicht um die lokalen Variablen des Programms. Das mit dem Overscan habe ich schon lange nicht mehr gemacht. Ich glaube, du muß einen Screen der Größe 1024x768 öffnen, mit SA_DisplayID und SA_Overscan die Anzeige auf 640x480 begrenzen und natürlich SA_Autoscroll auf TRUE setzen. Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 13:55 Uhr Reth Posts: 1860 Nutzer |
Hallo Thomas, vielen vielen Dank für die Tipps! Bin im Assembler überhaupt nicht mehr firm (wars auch nur für den 6809, den kleinen Bruder vom 68000)! Das mit dem SmallDataModel sagt mir leider gar nichts! Wenn ich diese Definition weglasse, stimmen dann u.U. Registerinhalte nicht mehr? Muss ich als Rückgabewert nun ULONG nehmen, oder geht auch BOOL (müsste eigentlich egal sein, da TRUE und FALSE auch nur Definitionen von 0 und 1 sind, also Konstanten!)? Danke nochmal! Ciao [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 14:43 Uhr gni Posts: 1106 Nutzer |
Zitat:Dein Programm stürtzt einfach ab, wenn Du small-data verwendest und __saveds weglässt. Zitat:Es hat schon seinen Grund, warum ULONG verwendet wird. BOOL==short < ULONG, dh. wenn Du BOOL nimmst aber das OS ULONG erwartet dann produzierst Du Schrott. Ganz allgemein gesagt, für "normale" Variablen und Parameter verwendet man nichts kleineres als int. BOOL, short haben nur Nachteile. [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 14:50 Uhr Reth Posts: 1860 Nutzer |
Zitat: Woher weiss ich denn, wenn ich gerad einfach nur C oder C++ programmiere, wann ich small-data verwende? [ Dieser Beitrag wurde von Reth am 23.07.2003 editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 15:01 Uhr thomas Posts: 7721 Nutzer |
Das ist eine Compiler-Option. Geh einfach davon aus, daß du immer Small-Data benutzt. Bei Large-Data werden überall absolute Adressen benutzt: move.l adresse,D0 bei Small-Data werden alle Speicherzugriffe über ein Basisregister gemacht: move.l offset(A4),D0 Das setzt natürlich voraus, daß A4 im ganzen Programm nicht verändert wird. Aber gerade bei Hook-Funktionen, die vom OS gerufen werden, ist der Zustand von A4 undefiniert. Durch die Deklaration mit __saveds wird ein lea.l basisadresse,A4 an den Anfang der Routine generiert, sodaß A4 wieder richtig steht. Die Deklaration des Rückgabewerts ist vollkommen egal, er wird immer in Register D0 zurückgegeben, soviel ich weiß auch immer als Langwort. Ich habe ULONG genommen, weil ich hoffte, die Zuweisung zu h_Entry ohne Casting machen zu können, hat aber nicht geklappt. Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 15:46 Uhr gni Posts: 1106 Nutzer |
Zitat:Seit wann ist BOOL ein Langwort? Zitat:Da h_(Sub)Entry mit leerer Parameterliste definiert sind, kommt man ohne cast nicht aus. Dafür wurde HOOKFUNC definiert (siehe utility/hooks.h) [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 15:51 Uhr Reth Posts: 1860 Nutzer |
Nochmals Dank! Das erklärts natürlich! Dachte mir schon, dass das Hook-System was mit dem smalldata zu tun hat, innerhalb von C, C++ bleibt das ja unsichtbar. ciao [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 16:17 Uhr gni Posts: 1106 Nutzer |
Zitat:Irgendwas hast Du mißverstanden. Small (Near) Data steht in keinem Zusammenhang zum Hooksystem. Hookfunktionen sind zwar Teil Deines Programmes und erwarten deshalb einen bestimmten Zustand. Aber sie werden von einem _fremden_ Kontext aufgerufen. Damit ist der erwartete Zustand nicht mehr gegeben. [ - Antworten - Zitieren - Direktlink - ] |
23.07.2003, 17:41 Uhr thomas Posts: 7721 Nutzer |
Zitat: BOOL ist kein Langwort, aber D0 ist ein Langwort. Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > ASL-Screenmoderequester will nich so | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
![]() |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2025 by amiga-news.de - alle Rechte vorbehalten. |
![]() |