amiga-news 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: 1858
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: 7716
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: 1858
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: 7716
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: 1858
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: 7716
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: 1858
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:
Reth:
Das mit dem SmallDataModel sagt mir leider gar nichts! Wenn ich diese Definition weglasse, stimmen dann u.U. Registerinhalte nicht mehr?

Dein Programm stürtzt einfach ab, wenn Du small-data verwendest und __saveds weglässt.
Zitat:
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!)?
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: 1858
Nutzer
Zitat:
Dein Programm stürtzt einfach ab, wenn Du small-data verwendest und __saveds weglässt.

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: 7716
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:
thomas:
Die Deklaration des Rückgabewerts ist vollkommen egal, er wird immer in Register D0 zurückgegeben, soviel ich weiß auch immer als Langwort.

Seit wann ist BOOL ein Langwort?
Zitat:
Ich habe ULONG genommen, weil ich hoffte, die Zuweisung zu h_Entry ohne Casting machen zu können, hat aber nicht geklappt.
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: 1858
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:
Reth:
Dachte mir schon, dass das Hook-System was mit dem smalldata zu tun hat, innerhalb von C, C++ bleibt das ja unsichtbar.

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: 7716
Nutzer
Zitat:
Seit wann ist BOOL ein Langwort?

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-2024 by amiga-news.de - alle Rechte vorbehalten.
.