amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > die alten gfx-ripper [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 [ - Beitrag schreiben - ]

21.10.2009, 20:28 Uhr

AGSzabo
Posts: 1663
Nutzer
hi,

ich suche nach einer möglichkeit die alten gfx-ripper auf amiga systemen mit grafikakrte wiederzubeleben. es soll der inhalt einer datei im speicher als scrollbare bitplane dargestellt werden. früher habe ich das gemacht indem ich eine bitmapstruktur angelegt habe und darin die quell-chipmem-zeiger eingetragen habe und das dann mit blitbitmaprastport in mein fenster geholt habe. aber das läuft wohl nicht mit einer planaren bitmap (nur 1 plane) als quelle und einer ganzen truecolor bitmap als ziel? gibts sonst nich ne möglichkeit ausser jedes bit zu testen und WritePixel zu machen?

mfg
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 21.10.2009 um 20:30 Uhr geändert. ]

[ Dieser Beitrag wurde von AGSzabo am 21.10.2009 um 20:32 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.10.2009, 16:30 Uhr

ZeroG
Posts: 1487
Nutzer
@AGSzabo:
Wofür soll das gut sein?
Praktisch jedes Programm das eine Grafikkarte benutzen kann läuft sowieso im normalen Multitasking, da kann man genau so gut einen x-beliebigen Screengraber benutzen.

[ - Antworten - Zitieren - Direktlink - ]

22.10.2009, 23:19 Uhr

AGSzabo
Posts: 1663
Nutzer
@ZeroG:

der trick ist, das soll garnicht als gfxripper eingesetzt werden sondern als "visualisierung". die erfahrung hat gezeigt dass man anhand des "aussehens" von daten sehr leicht auf ihre art schließen kann. man findet damit zb viel schneller den sound eines intros oder aber auch den scrolltext! auch soundsamples haben im bitplaneviewer ihr ganz eigenes typisches aussehen!

grüsserl,
Andreas


--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 22.10.2009 um 23:21 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

23.10.2009, 10:23 Uhr

Holger
Posts: 8116
Nutzer
@AGSzabo:
Eigentlich sollte das Blitten einer planaren BitMap in einen TrueColor-Bildschirm funktionieren, solange Du die OS-Funktionen benutzt.

Im Übrigen funktioniert diese Art der Visualisierung, wie sie Dir offenbar vorschwebt, auch, wenn Du den Speicher als Chunky- oder TrueColor BitMap interpretierst. Es ist halt nur Gewohnheits- oder Übungssache, in den anders aussehenden Bildern typische Muster zu erkennen.

Dafür kann man damit wesentlich mehr Daten auf einmal überblicken.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.10.2009, 10:44 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

> Eigentlich sollte das Blitten einer planaren BitMap in einen TrueColor-Bildschirm funktionieren, solange Du die OS-Funktionen benutzt.

Das hatten wir hier schonmal beim thema doublebuffering. da hiess es afaik es geht nicht? oder was war das?

--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

23.10.2009, 11:10 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Das hatten wir hier schonmal beim thema doublebuffering. da hiess es afaik es geht nicht? oder was war das?

Kann ich mich jetzt nicht erinnern.
Was nicht geht, ist der umgekehrte Weg, TrueColor nach Planar zu blitten. Das geht nur in der Kombination CyberGraphics und Permedia2, ist aber auch nicht gerade empfehlenswert.
Ansonsten ist Blitten zwischen zwei verschiedenen Formaten nicht gerade effizient, aber schneller als ein Bild pixelweise aufzubauen, allemal.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.10.2009, 13:34 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

danke für den tip, allerdings funtioniert es unter os4+ nur auf geladene files, nicht auf beliebige ram-addressen. das macht aber nix, letzteres ist in dem viewer porgramm unter os4+ generell abgeschaltet!

code:
;===================================
; view memory as bitplane demo
;===================================
; doesnt run under os4+ because the
; used portion of chipram isnt
; allocated -> grim reaper ...
; this can be fixed by loading a
; file into memory and view that!


		; konstanten aus unterlagen einbeziehen

		incdir	include:

		include	exec/types.i			; macros
		include	exec/funcdef.i			; mehr macros
		include	exec/exec_lib.i
		include	intuition/intuition.i		; strukturen
		include intuition/intuition_lib.i	; funktionen
		include utility/tagitem.i		; für fenster tags
		include graphics/gfx.i			; strukturen
		include graphics/graphics_lib.i		; funktionen

TRUE		EQU	1
FALSE		EQU	0

memview_demo	moveq	#39,d0			; version
		lea	.intname(pc),a1
		move.l	4.w,a6
		jsr	_LVOOpenLibrary(a6)
		move.l	d0,.intbase
		beq	.rts

		moveq	#39,d0
		lea	.gfxname(pc),a1
		jsr	_LVOOpenLibrary(a6)
		move.l	d0,.gfxbase
		beq	.close_int

		; make off bitmap

		move.l	d0,a6

		move.l	#640,d0
		move.l	#200,d1
		moveq	#1,d2	; 1 plane
		moveq	#0,d3
		sub.l	a0,a0
		jsr	_LVOAllocBitMap(a6)
		move.l	d0,.bitmap
		beq.b	.close_gfx

		; make zoom table

		lea	.zoomtable(pc),a0
		moveq	#0,d0
.ih_lp1		move.w	d0,d1
		moveq	#0,d2
		moveq	#7,d3
.ih_lp		lsl.b	#1,d1
		bcs.b	.ih_1
		add.w	d2,d2
		add.w	d2,d2
		bra.b	.ih_lpc
.ih_1		add.w	d2,d2
		add.w	d2,d2
		or.w	#3,d2
.ih_lpc		dbf	d3,.ih_lp
		move.w	d2,(a0)+
		addq.w	#1,d0
		cmp.w	#256,d0
		bne.b	.ih_lp1

		; open window

		sub.l	a0,a0
		lea	.window_tags(pc),a1
		move.l	.intbase(pc),a6
		jsr	_LVOOpenWindowTagList(a6)
		move.l	d0,.window
		beq.b	.close_gfx

		; get block of memory into bitmap

		lea	$70000,a1
		move.l	a1,.address
		move.w	#300,d7

.scroll		move.l	.address(pc),a1
	
		lea	.zoomtable(pc),a3

		move.l	.bitmap(pc),a0
		move.l	bm_Planes(a0),a2	; get single bitplane pointer
		move.w	bm_Rows(a0),d1
		subq.w	#1,d1
.rows_loop	move.w	bm_BytesPerRow(a0),d0
		lsr.w	#1,d0
		subq.w	#1,d0
.row_loop	moveq	#0,d2
		move.b	(a1)+,d2
		lsl	#1,d2
		move.w	(a3,d2.w),d2
		move.w	d2,(a2)+
		dbf	d0,.row_loop
		dbf	d1,.rows_loop

		; blit bitmap into front rastport

		move.l	.bitmap(pc),a0
		moveq	#0,d0
		moveq	#0,d1
		move.l	.window(pc),a1
		move.l	wd_RPort(a1),a1
		moveq	#0,d2
		moveq	#0,d3
		move.w	#640,d4
		move.w	#200,d5
		move.w	#$c0,d6
		move.l	.gfxbase(pc),a6
		jsr	_LVOBltBitMapRastPort(a6)

		add.l	#320,.address
		dbf	d7,.scroll


		; wait for input from close-requester

		lea	.text(pc),a0
		move.l	.intbase(pc),a6
		bsr	auto_request

		move.l	.window(pc),a0
		jsr	_LVOCloseWindow(a6)

		; free off bitmap

		move.l	.bitmap(pc),a0
		move.l	.gfxbase(pc),a6
		jsr	_LVOFreeBitMap(a6)

.close_gfx	move.l	.gfxbase(pc),a1
		move.l	4.w,a6
		jsr	_LVOCloseLibrary(a6)

.close_int	move.l	.intbase(pc),a1
		jsr	_LVOCloseLibrary(a6)

.rts		rts

.intbase	dc.l	0
.gfxbase	dc.l	0
.window		dc.l	0
.bitmap		dc.l	0
.address	dc.l	0

.zoomtable	blk.w	256

.window_tags	dc.l	WA_InnerWidth,640
		dc.l	WA_InnerHeight,200
		dc.l	WA_DragBar,TRUE
		dc.l	WA_DepthGadget,TRUE
		dc.l	WA_GimmeZeroZero,TRUE
		dc.l	TAG_END

.text		dc.b	"Click here to close the window.",0
.intname	dc.b	"intuition.library",0
.gfxname	dc.b	"graphics.library",0
		even

auto_request	; a0	*text
		; a6 	*intbase

		lea	.it_body(pc),a1
		move.l	a0,it_IText(a1)	; insert *text into body intuitext
		sub.l	a0,a0		; no parent window
		sub.l	a2,a2		; no positive text
		lea	.it_ok(pc),a3	; negative text
		moveq	#0,d0
		moveq	#0,d1

		jmp	_LVOAutoRequest(a6)

.it_body	dc.b	1,0		; the pens for rendering the text, front,back
		dc.b	0		; the mode for rendering the text
		dc.b	0		; pad
    		dc.w	0,0		; relative start location for the text, x,y
  		dc.l	0		; font, if NULL, you accept the defaults
		dc.l	0		; pointer to null-terminated text
		dc.l	0		; pointer to another IntuiText to render

.it_ok		dc.b	1,0		; the pens for rendering the text, front,back
		dc.b	0		; the mode for rendering the text
		dc.b	0		; pad
    		dc.w	0,0		; relative start location for the text, x,y
  		dc.l	0		; font, if NULL, you accept the defaults
		dc.l	.ok		; pointer to null-terminated text
		dc.l	0		; pointer to another IntuiText to render

.ok		dc.b	"OK",0
		even


--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

23.10.2009, 14:23 Uhr

tboeckel
Posts: 124
Nutzer
@AGSzabo:

Das ist so gewollt und auch richtig. Man darf halt nicht auf beliebigen Speicher zugreifen, vor allem nicht auf ungemappten Speicher, weder lesend noch schreibend. Das nennt man auch "Speicherschutz". Jeder Zugriff auf ungemappten Speicher bringt die bekannten DSI's.

[ - Antworten - Zitieren - Direktlink - ]

23.10.2009, 20:46 Uhr

AGSzabo
Posts: 1663
Nutzer
Da wir grad beim speicher selbst sind, welches ist die höchste vielleicht gülltige addresse? $7FFFFFFF oder $FFFFFFFF oder etwas anderes? ich meine es ist bei verschiedenen amigas unterschiedlich, aber mich interessiert das höchste davon.
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 23.10.2009 um 20:47 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 08:37 Uhr

ZeroG
Posts: 1487
Nutzer
@AGSzabo:
Wenn du sowieso schon alle Regeln überbord wirfst kannst du auch die MemList in der der execbase auf gültige Adressräume untersuchen.

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 11:07 Uhr

AGSzabo
Posts: 1663
Nutzer
@ZeroG:

das mache ich so, allerdings nicht wenn das os die version 4+ hat. ich will trotzdem wissen was die höchste gültige addresse sein kann, was technisch addressiert werden kann wenn man soviel speicher hat.

gfm
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 24.10.2009 um 11:08 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 13:16 Uhr

Holger
Posts: 8116
Nutzer
@AGSzabo:
Du solltest davon ausgehen, dass jedes der 32 Bit einer Speicheradresse zur Adressierung benutzt werden kann. Selbst, wenn diese Version von AmigaOS4 davon einen Teil nicht benutzt oder für den Kernel reserviert oder ähnliches, heißt das nicht, dass die nächste Version das auch noch so macht.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 13:31 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

ja schön, ja gut, aber wo liegt denn die grenze der hardware? kommt drauf an welche .. mich interessiert die höchste.
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 13:51 Uhr

Thore
Posts: 2266
Nutzer
Die obere Grenze ist bei 32 Bit $FFFFFFFF.
Oder meintest Du "ab wann fangen z.B. Hardware-Register an, und ist für normalen RAM Gebrauch nicht mehr zu nutzen?"

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 14:42 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

> Die obere Grenze ist bei 32 Bit $FFFFFFFF.

heisst das der computer kann volle 32 bit addressieren? war da nicht was vom a500 der blos 24 bit konnte oder so?

> Hardware-Register

beim classic amiga weis ich das, es wäre aber interssant zu erfahren wo die zb beim sam liegen falls es da sowas gibt.


hier übrigens eine erklärung wozu ich das hier frage: irgednwie muss ich unterscheiden können ob es ich bei einem langwortinhalt um eine addresse oder um eine konstante hadelt. im moment mache ich es so dass in den konstanten das oberste bit gesetzt ist, wenn das aber nicht geht könnte ich die konstanten in den hardware bereich legen wo keine daten für mich liegen können. oder gibts noch ne andere methode? das niederste bit liesse sich evtl auch nutzen, wenn ich wüsste das die daten imemr an gerader addresse liegen. für strings träfe das aber in meinem fall nicht zu oder wäre zu umschtändlich.

gmf,
Andreas
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 15:08 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
@Thore:
heisst das der computer kann volle 32 bit addressieren? war da nicht was vom a500 der blos 24 bit konnte oder so?

Ja, und dann kam der 68020, und seit dem gibts keine Begrenzung mehr.
Zitat:
hier übrigens eine erklärung wozu ich das hier frage: irgednwie muss ich unterscheiden können ob es ich bei einem langwortinhalt um eine addresse oder um eine konstante hadelt.
Iss nich.
Wurde auch schon beim A500 ausdrücklich gesagt, dass man davon ausgehen soll, dass alle Bits benutzt werden können. Außer Microsoft (AmigaBasic) haben sich auch alle dran gehalten. Oder fast alle.

Wenn Du wissen willst, ob ein 32Bit-Wert eine Adresse sein könnte, kannst Du TypeOfMem(...) (oder so ähnlich) aufrufen. Allerdings kann Dir das nur sagen, ob ein Wert definitiv keine Adresse ist. Nur weil ein Wert eine Adresse sein könnte, heißt das nicht, dass es eine ist.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 15:23 Uhr

ZeroG
Posts: 1487
Nutzer
@AGSzabo:
Zitat:
heisst das der computer kann volle 32 bit addressieren? war da nicht was vom a500 der blos 24 bit konnte oder so?
Der 68000 und die EC-Varianten der 68k-Reihe haben nur 24 Adressleitungen belegt.

Zitat:
beim classic amiga weis ich das, es wäre aber interssant zu erfahren wo die zb beim sam liegen falls es da sowas gibt.
Jeder Computer hat irgendwo solche Hardwareregister, auch der SAM.
Bei OS4.x ist der Speicher aber virtuell und man muß sich erst per exec den richtigen Realspeicherbereich an die virtuelle Adresse mappen lassen um darauf zuzugreifen und das ist nur sinnvoll wen man Hardwaretreiber schreibt.

Ansonsten erscheint mir die Frage unnötig da du weiter oben schreibst das unter OS4 sowieso der Speichersschutz greift und dein Programm abstürtzt. Und wenn du den beschriebenen "Fix" anwendest und die Daten in einen ordnungsgemäß angeforderten Speicherbereich lädst, brauchst du dich nicht mehr um sowas kümmern.

Zitat:
hier übrigens eine erklärung wozu ich das hier frage: irgednwie muss ich unterscheiden können ob es ich bei einem langwortinhalt um eine addresse oder um eine konstante hadelt. im moment mache ich es so dass in den konstanten das oberste bit gesetzt ist, wenn das aber nicht geht könnte ich die konstanten in den hardware bereich legen wo keine daten für mich liegen können. oder gibts noch ne andere methode? das niederste bit liesse sich evtl auch nutzen, wenn ich wüsste das die daten imemr an gerader addresse liegen. für strings träfe das aber in meinem fall nicht zu oder wäre zu umschtändlich.

:dance3:
Das klingt reichlich wirr.
Warum mußt du wissen ob irgendein x-beliebiges Langwort im moment gerade ein Zeiger oder eine Konstante darstellt wenn du den Speicher eh nur graphisch Darstellen willst?

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 15:25 Uhr

Thore
Posts: 2266
Nutzer
Dafür gibts die internen Strukturen (siehe RKM!) und man sollte auch die AmigaOS API Funktionen verwenden, denn die Funktionen wissen wie die Struktur aussehen müssen.
Du kannst den Daten direkt nicht ansehen obs Adresse oder Wert ist!

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 15:45 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

unter os 4+ lassen sich mit meinem viewer NUR geladene files anschauen, nicht addressen! unter allen anderen os gillt das was in der exec memory liste steht!

wegen dem unterscheiden zwischen pointern und konstanten ist mir eine idee gekommen: alle pointer sind GERADE, zumindest kann ich das für meinen fall auf jedenfall sicherstellen dass sie es sind!

wozu ich das brauche: in dem openxui gui gibts zur erstellung von objektbäumen verschachtelte taglisten. der tag ist dabei eine konstante welche eine der internen klassen bedeutet. für externe klassen wird statdessen der name der klasse gebraucht und das tag ist dabei ein zeiger auf einen string, den ich super an eine gerade address forcen kann. alternativ wäre es auch möglich komplett auf die ID zu verzichten und alle klassen nur über ihren namen anzusprechen. es fragt sich blos was schneller ist und ausserdem kann das tag auch ein attribut sein, dass im falle des falles auch immer ungerade sein muss.

also ein "is nicht" is noch lange nich. denn es geht doch irgendwie...

gfm
Andreas

--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 24.10.2009 um 15:49 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 16:43 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
der tag ist dabei eine konstante welche eine der internen klassen bedeutet. für externe klassen wird statdessen der name der klasse gebraucht und das tag ist dabei ein zeiger auf einen string, ...
also ein "is nicht" is noch lange nich. denn es geht doch irgendwie...

Gottseidank wird Dein XUI niemand außer Dir benutzen.

Denselben Tag für verschiedene Zwecke zu benutzen und dann raten, was er bedeutet, obwohl vier Milliarden Tags zur Verfügung stehen...
nee, ich schreib jetzt lieber nicht, was ich davon halte...

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 17:08 Uhr

Thore
Posts: 2266
Nutzer
Normalerweise wird sowas mit Tag-Bereiche gemacht. Du wirst sowieso nie 4,3 Milliarden Tags brauchen.
Reservier einfach einen Bereich für interne Klassen, dann mach einen Bereich für externe Klassen die man bei Dir registrieren muss, und dann einen User-Bereich den man für sich selbst nutzen kann, wenn man was eigenes programmiert.
Du kannst meinetwegen die Klassenstruktur so umbauen, daß Du ein Klassennamen vergibst, und den dann zur weiteren Überprüfung auslesen kannst, aber der Weg mit einer ID-Range wäre wohl sauberer.

[ - Antworten - Zitieren - Direktlink - ]

24.10.2009, 17:36 Uhr

AGSzabo
Posts: 1663
Nutzer
nee, raten is nicht. ist alles fest definiert. aber es stimmt: vererbungen und unterklassen sind mit xui NICHT möglich. man kann zwar andere klassen in der eigenen mitverwenden aber es gibt keine möglichkeit ein unbekanntes tag an eine superklasse 'durchhzureichen'. das macht aber (mir) nix aus. es war am amfang der programmeirung des toolkits eine entscheidung: bereiche registrieren müssen ODER selbe tagnummern die in unterschiedlichen klassen unterschiedliche bedeutungen haben lassen. hätte ich mich für die registrierungsvariante entschieden, hätte ich genausogut auch gleich boopsi oder reaction nehmen können! aber xui will keine neuerfindung des rades sein sondern einen eigenen(willigen) weg gehen. es ist nicht so dass ich nicht wüsste was ich "falsch" gemacht habe sondern ich wollte es so!

aber kommen wir mal zum thema zurück: als standalone programm hat das blitten der off-bitmap funktioniert. jetzt wo der view-teil des viewers eine eigene klassen ist, dauert genau der ERSTE blit in das fenster relativ sehr lange. die folgenden blits gehen superschnell. hat vielleicht jemadn schonmal was änliches erlebt?

--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 24.10.2009 um 17:54 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

25.10.2009, 02:56 Uhr

tboeckel
Posts: 124
Nutzer
@AGSzabo:

first rule: not not assume.

second rule: do NOT assume.

third rule: DO NOT ASSUME!!!!

Wenn du nach Beachtung dieser drei Regeln immer noch meinst du dürftest wild im Speicher rumlesen (oder vielleicht sogar noch schreiben), dann darfst du das gerne tun, aber bitte nicht auf meinem Rechner.

Einerseits sagst du, daß "raten nicht ist", andererseits willst du vermuten, ob und wann du eine Konstante als Adresse auffassen darfst und wann nicht und außerdem noch was eine gültige Adresse ist und was nicht, je nach verwendeter Hardware.

Einfacher und leichter Tip: Lern anständig programmieren. Vermute und rate nicht, sondern *wisse*. Wenn du nicht weißt, dann *versuch* nicht zu wissen!!! Wenn dich das OS nicht wissen läßt, dann versuch auch nicht schlauer als das OS zu sein.

Wenn unter OS4 irgendwas in die Buchse geht, dann liegt das zu 99.9% an dir und nicht an OS4 oder irgendwelchen Vorgängerversionen. Selbst wenn etwas von deinem Gehacke unter OS3 auf einem Classic-Rechner aus lauter purem Zufall funktioniert hat, dann ist das unter OS4 überhaupt kein Grund da auch noch zu funktionieren. OS3 hat überhaupt *gar* *nichts* überprüft (oder höchstens nur sehr wenig), sondern *alles* alles les- und schreibbar hingenommen, selbst dann, wenn es die offiziellen Regeln (Autodocs) streng verboten haben. Daß ein Verstoß gegen die Regeln unter OS4 bestraft wird ist alleine dem Verursacher zuzuschreiben, und das bist im Zweifelsfall du selbst. Auch OS4 überprüft nicht alles, aber überprüft zum Glück endlich mal ein paar grundsätzliche Dinge, und du wärst nicht der erste, der darüber aus lauter alter Gewohnheit stolpert.

Akzeptier einfach, daß man nicht von beliegigen Adresse lesen darf. Auch unter OS3 nicht!! Und selbst dann nicht, wenn es durch stumpfes Ausprobieren vielleicht klappt. Jede Adresse könnte das Interruptregister einer beliebigen Hardware sein, daß durch einfaches Auslesen zurückgesetzt wird. Wenn du nicht weißt was das bedeutet. das hör bitte auf mit diesem Unfug anstatt einfach völlig unwissend weiterzumachen, getreu dem Motto "aber es geht doch..."!!!

[ - Antworten - Zitieren - Direktlink - ]

25.10.2009, 04:30 Uhr

AGSzabo
Posts: 1663
Nutzer
@tboeckel:

ich habe doch ausdrücklich geschrieben dass ich NICHT wild im speicher herum lese! nochmal: unter os4 ist es abgeschaltet und unter os 3 gillt die exec-memory-liste!

und was das gui betrifft: ich WEISS, dass alle string-addressen die in meinem fall welche sein können immer GERADE sind!

geht doch.
Andreas
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 25.10.2009 um 04:31 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

25.10.2009, 16:41 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
es war am amfang der programmeirung des toolkits eine entscheidung: bereiche registrieren müssen ODER selbe tagnummern die in unterschiedlichen klassen unterschiedliche bedeutungen haben lassen.

Das ist totaler Unsinn. Man muss sich überhaupt nicht zwischen diesen beiden Dingen entscheiden.

Außerdem hat es überhaupt nichts mit dem eigentlichen Problem zu tun: Du entscheidest an einer Stelle, ob der Wert eine Konstante oder eine Adresse ist, statt einfach zwei unterschiedliche Tag-IDs dafür zu verwenden. Ob diese IDs in anderen Klassen eine andere Bedeutung haben, ist für diese eine Stelle vollkommen irrelevant.
Zitat:
und was das gui betrifft: ich WEISS, dass alle string-addressen die in meinem fall welche sein können immer GERADE sind!
Das ist schön für Dich. Genau deshalb habe ich ja betont, wie gut es ist, dass auch nur Du dieses Toolkit benutzt. Der Du solche Dinge immer weißt.

Ich hätte nämlich keine Lust, solche Dinge wissen zu müssen und dann noch Strings sinnloserweise an gerade Stellen im Speicher verschieben zu müssen.

Abgesehen davon..., Du weißt doch mit Sicherheit, dass Deine Konstanten immer ungerade sind, oder anders gesagt, Du kennst die Konstanten und müsstest ohnehin wissen, welche Werte keine sind, oder?

Na ja, die logischen Vorgehensweise, für jeden Zweck auch eine Tag-ID zu vergeben, bleibt trotzdem die beste.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

25.10.2009, 17:48 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

>Das ist totaler Unsinn. Man muss sich überhaupt nicht zwischen diesen beiden Dingen entscheiden.

tja, hm wenn das so ist dann habe ich wohl keine ahnung. also was ist das und wie ist das wirklich?

> Ich hätte nämlich keine Lust ... Strings sinnloserweise an gerade Stellen im Speicher verschieben zu müssen.


Das betrifft NUR die namen der externen klassen und dafür gibts ein macro:
code:
XUICLASSNAME	MACRO
		even
		dc.b	"1",0
		even
		ENDM
...
...
	XUICLASSNAME	picview


> Abgesehen davon..., Du weißt doch mit Sicherheit, dass Deine Konstanten immer ungerade sind, oder anders gesagt, Du kennst die Konstanten und müsstest ohnehin wissen, welche Werte keine sind, oder?

sie sind immer ungerade, das war die lösung des problems dass ich das höchste bit nicht verwenden darf.

kennen ja aber das nutzt nichts weil wenn die konstanten gerade wären dann könnten das auch addressen sein. eine ausnahme gibt es, nämlich die amiga konstanten TAG_END, TAG_MORE, TAG_IGNORE und TAG_SKIP. die werden so erkannt wie sie sind da ein classname niemals an addresse 0-3 stehen kann.

> Na ja, die logischen Vorgehensweise, für jeden Zweck auch eine Tag-ID zu vergeben, bleibt trotzdem die beste.

wenn tag_Data das feld ist in dem eine konstante oder eine addresse stehen kann, könnte ich verschiedne IDs verwenden. es ist aber so dass der unterschied für die ID selbst gillt ... ich will zwischen einer tag-id und einer addresse unterscheiden und das klappt jezt mit den strings über das macro super!
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 25.10.2009 um 17:49 Uhr geändert. ]

[ Dieser Beitrag wurde von AGSzabo am 25.10.2009 um 18:01 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

25.10.2009, 19:00 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
ich will zwischen einer tag-id und einer addresse unterscheiden

Ist Dir eigentlich klar, wieviel Zeit Du uns ersparen würdest, wenn Du so etwas einfach gleich sagen würdest?

Vermutlich nicht, sonst würdest Du das nicht immer wieder so machen.

Wenn Du sowie Tags benutzt, die zu den normalen Amiga-Tags nicht kompatibel sind, kannst Du auch gleich ein System benutzen, dass Deinen Zwecken dient. Dann kannst Du z.B. auch ein Tag-Item benutzen, das zwei IDs hat, eine Konstante und einen String. Oder etwas ganz anderes.
Zitat:
Zitat:
Man muss sich überhaupt nicht zwischen diesen beiden Dingen entscheiden.
tja, hm wenn das so ist dann habe ich wohl keine ahnung. also was ist das und wie ist das wirklich?
Es ist so, dass es zu jedem Problem mehr Lösungen gibt, als die, auf die Du nach fünf Sekunden nachdenken kommst. Und auch in diesem Fall gibt es mehr als zwei.

Ein einfaches Beispiel. Man definiert einen Basistag für den Root der Klassenhierarchie und einen Offset, den eine Unterklasse zum Basistag der direkten Superklasse addieren muss, um den eigenen Basistag zu bekommen. Die Größe des Offsets bestimmt, wieviel eigene Tags eine Klasse definieren kann (ohne sie an einer zentralen Stelle registrieren zu müssen), aber auch, wie tief die Klassenhierarchie werden kann, bevor es Konflikte geben kann.

Allerdings ist in 32 Bit genug Platz für z.B. eine Kombination von einer maximalen Hierarchietiefe von 10000 (mehr als 20 ist eigentlich schon absurd) und 100000 lokalen Tags (von denen man höchstens 200 braucht).

Dann können zwei Klassen, die nicht direkt voneinander erben, immer noch gleiche IDs mit unterschiedlicher Bedeutung belegen, aber verwenden aber immer die gleichen Tags für ihre gemeinsame Basisklasse.

Da jeder Entwickler einer Klasse immer die Superklasse kennen muss, weiß er auch, welches sein ID-Bereich ist, ohne sich irgendwo anmelden und ihn reservieren zu müssen.

Das war nur ein Beispiel für eine Lösung des "IDs ohne zentrale Registry"-Problems.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

25.10.2009, 19:21 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

> Ist Dir eigentlich klar, wieviel Zeit Du uns ersparen würdest, wenn Du so etwas einfach gleich sagen würdest?

ich dachte das hätte ich, ... selbstzitat: """"der tag ist dabei eine konstante welche eine der internen klassen bedeutet. für externe klassen wird statdessen der name der klasse gebraucht und das tag ist dabei ein zeiger auf einen string,""""

aber gut dass wirs jetzt klar haben.

> Dann kannst Du z.B. auch ein Tag-Item benutzen, das zwei IDs hat, eine Konstante und einen String. Oder etwas ganz anderes.

nein, ist ZU SEHR kompliziert und wird in 90% der fälle nicht benötigt (overhead). 10% gebe ich den externen kalssen mit ihren namensstrings. außerdem soll es von der technik her nicht ZU SEHR fremd sein.

> Ein einfaches Beispiel. Man definiert einen Basistag für den Root der Klassenhierarchie und einen Offset, den eine Unterklasse zum Basistag der direkten Superklasse addieren muss, um den eigenen Basistag zu bekommen ... ... Dann können zwei Klassen, die nicht direkt voneinander erben, immer noch gleiche IDs mit unterschiedlicher Bedeutung belegen, aber verwenden aber immer die gleichen Tags für ihre gemeinsame Basisklasse

hmmmm. ... peil ich nicht aber ich lese es mir nochmal durch. und dann vielleicht kansnt dus auch anders formulieren?

ps: hier ist ein beispiel wie man in OX ein fenster mit dem neu erstellten viewer definiert:



code:
pic_win		dc.l	xuiWA_title,.title
		dc.l	xuiWA_undermouse,TRUE
		dc.l	xuiWA_layout,TRUE
		dc.l	XUI_VERTGROUP,.picgroup
		dc.l	XUI_RELPTR,g_pic_window
		dc.l	TAG_END
.title		dc.b	"PIC MONITOR",0
		even

.picgroup	dc.l	XUI_TITLE,.pictitle
		dc.l	XUI_FRAME,.picframe
		dc.l	XUI_HORIZGROUP,.controls
		dc.l	xuiGA_vprop,TRUE
		dc.l	xuiGA_hprop,TRUE
		dc.l	TAG_END

.pictitle	dc.l	xuiTA_text,.pictitle_text
		dc.l	TAG_END
.pictitle_text	dc.b	"bitplane",0
		even

.picframe	dc.l	xuiFrA_framestyle,xuiFr_BEVEL
		dc.l	planeview,.picview
		dc.l	xuiFrA_hprop,TRUE
		dc.l	xuiFrA_vprop,TRUE
		dc.l	TAG_END

.picview	dc.l	XUI_RELPTR,g_picview
		dc.l	TAG_END

.controls	dc.l	XUI_CHECK,.zoom_check
		dc.l	XUI_LABEL,.zoom_label
		dc.l	xuiGA_spaceprop,FALSE
		dc.l	TAG_END

.zoom_label	dc.l	xuiLabA_text,.zoom_text
		dc.l	xuiLabA_linechar,1
		dc.l	TAG_END
.zoom_text	dc.b	"zoom",0
		even

.zoom_check	dc.l	xuiChkA_senschar,"z"
		dc.l	xuiChkA_hook,.zoom_hook
		dc.l	XUI_RELPTR,g_zoom_check
		dc.l	TAG_END

.zoom_hook	move.l	d0,d1
		move.l	g_picview(a4),a0
		move.l	#pvA_zoom,d0
		jmp	_LVOxuiSetAttr(a6)

	XUICLASSNAME	planeview


Und hier ein vielleicht zukünftiges Beispiel einer 'OXiGEN'-datei passend zu obigen strukturen, welche in geraumer zukunft vieleicht mit einem texteditor zu erstellen ist und welche dann vieleicht mit dem noch zu schreibenden OXiGEN tool in den assembler source umgewandelt wird:

code:
; oxIgen gui definition language for open external user interfaces 

WINDOW pic_win
	oxWA_title	.wintitle "PIC MONITOR"
	oxWA_undermouse	TRUE
	oxWA_layout	TRUE
	VERT		.picgroup
		TITLE 	.pictitle
			oxTA_text	.pictitle_text "bitplane"
		END
		FRAME .picframe
			oxFrA_framestyle	oxFr_BEVEL
			planeview .picview
				RELPTR	g_picview
			END
			oxFrA_hprop		TRUE
			oxFrA_vprop		TRUE
		END
		HORIZ .controls
			oxGA_spaceprop	FALSE
			CHECK .zoom_check
				oxChkA_senschar	$z
				oxChkA_hook	.zoom_hook
				RELPTR		g_zoom_check
			END
			LABEL	.zoom_label
				oxLabA_text	.zoom_text "zoom"
				oxLabA_linechar	1
			END
		END
	END	
	RELPTR		g_pic_window
END


--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ Dieser Beitrag wurde von AGSzabo am 26.10.2009 um 15:26 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

27.10.2009, 09:02 Uhr

AGSzabo
Posts: 1663
Nutzer
zurück zum thema:

inzwischen ist klar, dass es mit dem blitten der off-bitmap in den front rastport probelme gibt und es zu einer kurzen verzögerung kommt, WENN die off-bitmap weniger als 8 planes hat. unter os4.1 stimmen dann auch die farben nicht.


--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110

[ - Antworten - Zitieren - Direktlink - ]

27.10.2009, 11:41 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
hmmmm. ... peil ich nicht aber ich lese es mir nochmal durch. und dann vielleicht kansnt dus auch anders formulieren?

Einfaches Beispiel:

Du definierst eine Rootklasse mit Basistag TAG_USER+$10000, also ROOT_BASE=$80010000, und einen Offset von $10000, d.h. jede Klasse kann maximal $10000=65536 eigene Tags definieren.

Dann gilt: Deine Gadgetklasse ist eine direkte Unterklasse von Root, d.h. ihr Basistag ist GADGET_BASE=ROOT_BASE+$10000=$80020000.
Root kann die Tag-IDs von $80010000 bis $8001FFFF mit einer Bedeutung belegen, die Gadgetklasse definiert seine Tags im Bereich von $80020000 bis $8002FFFF.

Und Dein Button hätte als direkte Unterklasse von Gadget ein Basistag BUTTON_BASE=GADGET_BASE+$10000=$80030000.

Wenn jetzt ein Dritter beschließt, seine eigene Klasse FANCY_BUTTON zu implementieren, muss er sich entscheiden, ob er diese Klasse als Spezialisierung Deines Buttons oder als komplett eigenes Gadget implementiert. Ist Fancy-Button eine Unterklasse von Button, gilt FANCY_BUTTON_BASE=BUTTON_BASE+$10000=$80040000.

Wenn gleichzeitig jemand anderes wiederum ein String-Gadget implementieren würde, wäre sein Basistag: STRING_BASE=GADGET_BASE+$10000=$80030000.

Das bedeutet, String und Button belegen Tag-IDs in diesem Bereich mit unterschiedlicher Bedeutung, aber diese beiden Klassen erben auch nicht voneinander, somit gibt es auch keine Konflikte, wenn sie ihre Tag-Listen an die Superklasse weiter reichen. Für ihre gemeinsame Basisklasse Gadget und deren Basisklasse Root gelten dagegen bei beiden die gleichen Tag-IDs.

In diesem Beispiel wäre eine Hierarchietiefe von 32766, aber auf jeder Ebene beliebig viele Klassen möglich. Da man so eine Tiefe niemals braucht, könnte man z.B. auch den Bereich $C0000000 bis $CFFFFFFF für Sonderfälle reservieren, wie nachträglich eingefügte Klassen.

Entscheidend aber ist, darum ging es ja, dass niemand seine Tags an einer zentralen Stelle registrieren muss. Trotzdem weiß jeder, welche IDs er mit einer eigenen Bedeutung versehen darf.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > die alten gfx-ripper [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.