Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 25.07.2006, 20:38 Titel: Speicherbereich Grafikkarte |
|
|
Weiß jemand zufällig aus welchem Speicherbereich sich die Grafikkarte die Bildinformationen holt und wieviel davon ein Pixel belegt?
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 25.07.2006, 21:56 Titel: |
|
|
Hi,
das kommt immer drauf an.
Die Grafikkarte selber hat ein OnBoard-Ram in dem alle Grafiken gespeichert werden.
Ein Ausschnitt dieses Speichers auf der Grafikkarte wird im normalen RAM gespiegelt an Adresse A000:0000 (64Kb).
Und wieviel Byte nun ein Pixel belegt ist von der Farbtiefe abhängig.
Bei 256 sinds 1 Byte pro Pixel, bei 16,7Mc sinds 3 Byte.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 26.07.2006, 20:11 Titel: |
|
|
Wie greif ich mit PEEK darauf zu, denn A000:0000 kann ich ja so nicht in die PEEk-Anweisung eingeben
Du hast geschrieben das in diesem Speicherbereich nur ein Teil des Bildes gespeichert wird. Ich benötige allerdings den ganzen Bildschirminhalt... Also brauche ich eigentlich den Bereich OnBoard, oder hab ich das falsch verstanden?
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 26.07.2006, 20:17 Titel: |
|
|
Wenn ich mich recht erinnere nennt es sich Bank Switching. Das heißt, das immer nur ein 64-Kilobyte-Fenster für dich sichtbar ist. Dieses Fenster kannst du verschieben, sodass du auch auf die anderen Stellen zugreifen kannst, die momentan nicht nach 0xA000 gemappt sind.
Ich glaube, auf A.K.'s Seite hab' ich sowas gesehen. Wenn du allerdings in Mode 13h bist, dann kannst du auf das ganze Bild zugreifen, da 320*200 = 64 Kilobyte. Achja, das stimmt nur, solange die Farbanzahl bei 256 bleibt, damit du die in 8 Bit (1 Byte) unterbringen kannst. Ändert sich die Auflösung oder die Farbtiefe, dann wirst du wahrscheinlich um Bank Switching nicht herum kommen.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 26.07.2006, 20:21 Titel: |
|
|
Hi,
Elvis hat Folgendes geschrieben: | Wie greif ich mit PEEK darauf zu, denn A000:0000 kann ich ja so nicht in die PEEk-Anweisung eingeben
|
Unter QB greifst du per Segment und Offset auf Speicherstellen zu.
Die dazugehörigen Befehle sind PEEK/POKE.
Um den allerersten Pixel direkt in den Speicher zu schreiben kannst du folgendes Programm benutzen:
Code: |
SCREEN 13
DEF SEG = &HA000
farbe%=10
POKE 0,farbe%
|
Elvis hat Folgendes geschrieben: |
Du hast geschrieben das in diesem Speicherbereich nur ein Teil des Bildes gespeichert wird. Ich benötige allerdings den ganzen Bildschirminhalt... Also brauche ich eigentlich den Bereich OnBoard, oder hab ich das falsch verstanden?
|
Für den Grafikmodus 13 aus Qbasic werden nur 64000Byte benötigt. Diese wiederum passen locker in den RAM-Abschnitt A000:0000.
Wenn du den ganzen Speicher nutzen möchtest würde ich dir die (meist) standardisierte VESA-Schnittstelle vorschlagen. Hier ein Tutorial dazu wo du alles findest was du benötigst:
http://www.iconsoft.de/index.php?show=tutorial_svga
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 27.07.2006, 20:44 Titel: |
|
|
Danke für die Hilfe, hab's (glaube ich ) gut kapiert...
Noch eine Frage:
Dass PEEK und POKE sehr schnell ist, weiß ich.
Aber was ist mit der Geschwindigkeit von Variablenzuweisungen in Arrays und anschließendem Eintrag in eine Datei.
=> Der Grund ist, ich will einen Screenshot machen... Dieser sollte eben nach Möglichkeit so schnell sein, dass man nichts davon merkt... Geht das?
Der Plan: Einlesen per PEEK des Bildschirminhalts.
Speicherung der Informationen in ein Array.
Speicherung in eine Datei (hängt die Geschwindigkeit der Speicherung vom Modus ab?).
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 27.07.2006, 21:35 Titel: |
|
|
Hi,
also mit PEEK und POKE wirst du aus Geschwindigkeitsgründen nicht glücklich werden.
Da würd ich dir ein wenig Interrupttechnik empfehlen.
http://www.iconsoft.de/index.php?show=tutorial_int
Der Dos-Interrupt &H21 stellt direkte Funktionen zum Dateihandling zur Verfügung.
die erste Funktion; Datei erstellen.
Bitte dazu die Register wie im Int-Tutorial TYPE'en und DIM'en.
Code: |
datei$="datei.dat" + CHR$(0)
reg.ax=&H3C00
reg.cx = fileattribut%
reg.ds=varseg(datei$)
reg.dx=sadd(datei$)
CALL INTERRUPTX (&H21,reg,reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
filehandle%=reg.ax
|
2. Datei öffnen
Code: |
datei$="datei.dat" + CHR$(0)
reg.ax=&H3D01 '01 = write-only
reg.ds=varseg(datei$)
reg.dx=sadd(datei$)
CALL INTERRUPTX (&H21,reg,reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
filehandle%=reg.ax
|
3. Datei "beschreiben"
Code: |
reg.ax=&H4000
reg.bx = filehandle%
reg.cx = anzahlbytes%
reg.ds=&HA000 ' VideoRam als Quelle angeben
reg.dx=0 '
CALL INTERRUPTX (&H21,reg,reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
|
4. Datei schließen
Code: |
reg.ax=&H3E00
reg.bx = filehandle%
CALL INTERRUPTX (&H21,reg,reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
|
MFG A.K.
EDIT:
Bei "Datei beschreiben" noch die Anzahl der Bytes hinzugefügt. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 28.07.2006, 13:40 Titel: |
|
|
Hi,
Ich hab' im QBasic Index noch folgendes Programm entdeckt:
Code: |
'Ruft eine Routine auf, die den Bildschirminhalt auf dem Drucker druckt.
DIM a%(2)
DEF SEG = VARSEG(a%(0))
FOR i% = 0 TO 2
READ d%
POKE VARPTR(a%(0)) + i%, d%
NEXT i%
DATA 205, 5, 203 : ' int 5 retf 'Code in Maschinensprache
'zum Drucken des Bildschirminhalts.
CALL ABSOLUTE(VARPTR(a%(0)))
DEF SEG
|
Eigentlich müsste man das ja dann auch in eine Datei drucken können, oder ist dieses Programm wegen POKE usw. zu langsam?
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 28.07.2006, 15:05 Titel: |
|
|
Hi,
also die Routine die du da hast kannst du dafür nicht einsetzen.
In diesem Programm wird der Interrupt 5h verwendet der einfach nur den Bildschirminhalt an den Drucker sendet. Dieser Interrupt wird übrigens auch von der Taste "Druck S-Abf" oder "Print Screen" aufgerufen. Bei Windows steckt hinter der "Druck"-Tasten-Abfrage ein anderes Programm; von wegen Zwischenablage und so. Ist also für deine Zweck nicht einsetzbar.
Wie gesagt, am besten die ganz oben beschriebenen Interrupte fürs Dateihandling benutzen
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 29.07.2006, 18:09 Titel: |
|
|
Der Code funktioniert irgendwie nicht (zumindest steht nichts in der erstellten Datei). Habs auf zwei PC's ausprobiert...
Code: |
REM $INCLUDE: 'C:\QB.BI'
DIM SHARED reg AS regtypex
datei$ = "datei.txt" + CHR$(0)
reg.ax = &H3C00
reg.cx = fileattribut%
reg.ds = VARSEG(datei$)
reg.dx = SADD(datei$)
CALL INTERRUPTX(&H21, reg, reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
filehandle% = reg.ax
datei$ = "datei.txt" + CHR$(0)
reg.ax = &H3D01 '01 = write-only
reg.ds = VARSEG(datei$)
reg.dx = SADD(datei$)
CALL INTERRUPTX(&H21, reg, reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
filehandle% = reg.ax
reg.ax = &H4000
reg.bx = filehandle%
reg.cx = anzahlbytes%
reg.ds = &HA000 ' VideoRam als Quelle angeben
reg.dx = 0 '
CALL INTERRUPTX(&H21, reg, reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
reg.ax = &H3E00
reg.bx = filehandle%
CALL INTERRUPTX(&H21, reg, reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
|
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
raph ael
Anmeldungsdatum: 12.04.2006 Beiträge: 472
|
Verfasst am: 29.07.2006, 18:12 Titel: |
|
|
Wegen INT 05h:
Man kann sich in den Interrupt einklinken, und ihn so verändern, dass er den Bildschirminhalt in eine Datei "Druckt".
Siehe Adok's ASM- Kurs, letzter Teil. _________________
Zitat: | 1000 Yottabytes sind absurd. 640 Yottabytes sollten genug für jeden sein. |
|
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 29.07.2006, 18:15 Titel: |
|
|
Hi!
Ich hätte jetzt eher einen Verweis auf einen Thread im QB-Forum gepostet, da schauen denk ich mal mehr Leute rein, oder?
Liegt deine QB.BI auch im Laufwerk C: auf unterster Ebene?
Ich glaube, ich weiß worans liegt: Du hast den Typ "regtypex" nicht deklariert (sofern der nicht in der QB.BI steht).
Dann würde ein einfaches:
Code: |
TYPE regtypex
AX AS INTEGER
BX AS INTEGER
CX AS INTEGER
DX AS INTEGER
SI AS INTEGER
DI AS INTEGER
ES AS INTEGER
DS AS INTEGER
CS AS INTEGER
Flags AS INTEGER
END TYPE
|
Unter der Include-Anweisung das mal einfügen und ausprobieren. Desweiteren wär's hilfreich zu wissen, was nicht funktioniert.
PS: Ich weiß, dass ich bestimmte Register hätte nicht in den Typ mit 'reinnehmen müssen. Manche BIOS-Ints erfordern sie aber.
Grüße,
Mao _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 30.07.2006, 10:41 Titel: |
|
|
Wenn ich das einfüge ist es eine doppelte Definition...
Ich hab QB.BI in die unterste Ebene gemacht, weil ich zu faul bin, auch noch einen Haufen Ordnerangaben zu machen...
Gibt sowieso meistens Fehler...
Zitat: |
Desweiteren wär's hilfreich zu wissen, was nicht funktioniert.
|
Ich hab' geschrieben, dass in der erstellten Datei nichts steht...
Vielleicht hab ichs auch schlecht erklärt... :
Das Programm ist dazu da, den Bildschirminhalt in eine Datei zu schreiben. Das Problem ist, dass nichts in der Datei steht.
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 30.07.2006, 20:53 Titel: |
|
|
Sorry jetzt für die dumme Frage, aber: hast du vorher auch was auf den Bildschirm geschrieben bzw. im Programm gemacht? Wenn ja, zeig mal den restlichen Code.
Ich kanns halt nicht ausprobieren, da ich allgemein ernsthafte Probleme mit ntvdm + meinem Keyboard hab, die ich auch durch Neuinstallation nicht lösen konnte.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Elvis

Anmeldungsdatum: 01.06.2006 Beiträge: 818 Wohnort: Deutschland, BW
|
Verfasst am: 31.07.2006, 18:25 Titel: |
|
|
Also eigentlich steht immer was auf dem Bildschirm, denn ich hab' ins Programm kein CLS eingebaut, sodass noch die Bildschirmausgaben von der MS-DOS Eingabeaufforderung zu sehen sind.
Code: |
REM $INCLUDE: 'C:\QB.BI'
DIM SHARED reg AS regtypex
datei$ = "datei.txt" + CHR$(0)
reg.ax = &H3C00
reg.cx = fileattribut%
reg.ds = VARSEG(datei$)
reg.dx = SADD(datei$)
CALL INTERRUPTX(&H21, reg, reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
filehandle% = reg.ax
datei$ = "datei.txt" + CHR$(0)
reg.ax = &H3D01 '01 = write-only
reg.ds = VARSEG(datei$)
reg.dx = SADD(datei$)
CALL INTERRUPTX(&H21, reg, reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
filehandle% = reg.ax
reg.ax = &H4000
reg.bx = filehandle%
reg.cx = anzahlbytes%
reg.ds = &HA000 ' VideoRam als Quelle angeben
reg.dx = 0 '
CALL INTERRUPTX(&H21, reg, reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
reg.ax = &H3E00
reg.bx = filehandle%
CALL INTERRUPTX(&H21, reg, reg)
'Wenn das Carryflag nicht gesetzt wird hats geklappt
|
Grüße, Elvis _________________ Geforce 7300GT (256MB GDDR3, Gainward) -- 2x 512MB (DDR2 800, MDT) -- AMD Athlon64 X2 EE 3800+ -- Asrock ALiveNF5-eSATA2+ |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 31.07.2006, 21:22 Titel: |
|
|
Elvis hat Folgendes geschrieben: | Also eigentlich steht immer was auf dem Bildschirm, denn ich hab' ins Programm kein CLS eingebaut, sodass noch die Bildschirmausgaben von der MS-DOS Eingabeaufforderung zu sehen sind.
|
Hi,
ja wenn du natürlich Text (Text <> Grafik ) meinst den du speichern willst dann sieht das ein wenig anders aus. Denn der liegt nicht bei &HA000 im Ram sondern bei &HB800 im Ram und hat eine Länge von 2000 Byte (&H7D0). Versuch die Adresse mal bitte.
Ansonsten würd mich noch interessieren welche Größe die angelegte Datei hat.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 01.08.2006, 21:11 Titel: |
|
|
...kurze Zwischenfrage; mich interessiert folgendes, was ich noch nie gesehen habe:
reg.cx = fileattribut%
reg.ds=varseg(datei$)
ist das unter FB oder QB? Eine andere Art um Assemblerbefehle einzubinden oder Registerinhalte zu verändern?
QB habe ich erst heute mal kurz angeschaut. Kann man dort Programme nur aus QB selbst starten, nachdem QB geöffnet wurde?
Danke  _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 01.08.2006, 21:15 Titel: |
|
|
So kann nur QB mit Interrupts umgehen.
Einen Inline-Assembler gibt es in QB nicht, du kannst nur mittels eines selbstdefinierten Register-Typs Interrupts aufrufen (über CallInterruptX oder so ähnlich ).
So gesehen ist es eine Art Registerinhalte zu verändern, jedoch werden nicht die echten Register des Prozessors verändert, sondern diese, die du in deinem Array angegeben hast. Dieses Array wird beim Interruptaufruf über CallInterruptX mit übergeben.
Alle Ein- und Ausgaben erfolgen über diesen selbstdefinierten Register-Typ.
Assembler musst du in QB erst assemblieren (mit einem Assembler) und den erzeugten Hex-Code (flat binary) in QB kopieren. Frag mich nicht, wie das genau geht, ich weiß es nicht - ich hab's noch nie gebraucht.
Aber du kannst mal auf A.K.'s Site unter "Tutorials" nachsehen, da sollte das erklärt werden - viel besser und viel genauer, als ich das jetzt kann (eben darum, weil ich's noch nie gebraucht hab - jedenfalls nicht in QB).
Grüße,
Mao _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 02.08.2006, 06:40 Titel: |
|
|
Ach so geht das!
QB ist ja ein Interpreter, hat keinen Compiler... So muss man um Programme zu starten jedesmal QB öffnen? _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 02.08.2006, 19:07 Titel: |
|
|
c.m.obrecht hat Folgendes geschrieben: | Ach so geht das!
QB ist ja ein Interpreter, hat keinen Compiler... So muss man um Programme zu starten jedesmal QB öffnen? |
...
...
Schon mal was von QuickBasic 4.5 oder QuickBasic 7.1 gehört? _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
|