 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 20.02.2005, 19:24 Titel: Bildschirm inkl. Farben schnell auslesen? |
|
|
Also, mein Problem ist, dass ich den Bildschirm (SCREEN 0) auslesen will und in einer Variable speichern, so das ich ihn später wieder ausgeben kann
Das Problem ist aber, das der Bildschirm farbige Zeichen enthält, und dass das auslesen der 2000 Zeichen mit SCREEN(x, y, z) recht langsam ist und auch recht viel Speicher frisst ...
Gibt es nicht eine schnellere Methode, die z.B. direkt auf den Bildschirmspeicher zugreifft (Ich kenn ich da nicht so aus).
Danke für die Hilfe!
Zuletzt bearbeitet von gandro am 20.02.2005, 20:14, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 20.02.2005, 19:52 Titel: |
|
|
Das geht tatsächlich:
Code: |
DIM Bildschirm (79, 24, 1) AS INTEGER
'Array, in dem später dr bildschirm gespeichert wird.
DIM offset AS LONG
'Adresse, auf die zugegriffen wird.
DEF SEG=&HB800
'Greife auf Bildschirmspeicher zu
FOR spalte = 0 TO 79
FOR zeile = 0 TO 24
FOR typ = 0 TO 1
'typ bedeutet entweder farbe oder zeichen
offset = (zeile * 80 + spalte) * 2 + typ
Bildschirm (spalte, zeile, typ) = PEEK(offset)
NEXT
NEXT
NEXT
DEF SEG
'Standardsegment wiederherstellen - nicht wichtig, aber man sollte
'es trotzdem tun *g*
|
Ich weiß nicht sicher, ob das Array so ohne weiteres in den BASIC-Speicher passt... wennd du QB 4.5 oder höher hast, kannst du es mit dem parameter
QB /AH
Aufrufen, dann sollte es keine probleme haben.
Oder, du speicherst direkt in eine datei.
aber das bleibt dir mal überlassen *g*
Viel spaß damit! _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Quark48

Anmeldungsdatum: 16.10.2004 Beiträge: 559 Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern
|
Verfasst am: 20.02.2005, 19:56 Titel: |
|
|
Hallo!
Der Bildschirmspeicher beginnt im Segment &HA000. Lies ihn mit DEF SEG und PEEK aus. Dann geht es deutlich schneller.
DEF SEG = &HA000
?? Tut mir leid, aber ih habe den Aufbau dieses Speichers mal gewusst, aber jetzt weiß ich ihn nicht mehr
Halt; schau mal auf www.east-power-soft.de in den Downloads nach; vielleicht ist da was, was du suchst... _________________ Grüßle, Stefan
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht!
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/ |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 20.02.2005, 19:58 Titel: |
|
|
Jaja, das VIDEO-Segment ist &hA000, aber screen 0 verwendet &hb800.
Ich denk mal, das tut zum video-modus-aufbau spar ich mir jetzt, davon gibts genug *g* _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 20.02.2005, 20:01 Titel: |
|
|
erstmal danke für die antworten ...
aber zum code von Dusky_Joe: Wie kann ich denn jetzt das Zeuges wieder ausgeben?
Ich hab leider gar keine Ahnung in solchen Sachen ...
Zuletzt bearbeitet von gandro am 20.02.2005, 20:14, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 20.02.2005, 20:07 Titel: |
|
|
Das is kein problem.
dazu POKEst du das Array einfach wieder:
Code: |
...
FOR spalte = 0 TO 79
FOR zeile = 0 TO 24
FOR typ = 0 TO 1
'typ bedeutet entweder farbe oder zeichen
offset = (zeile * 80 + spalte) * 2 + typ
POKE (offset), Bildschirm (spalte, zeile, typ)
NEXT
NEXT
NEXT
|
Ich kann dir übrigens nur die QB-Monster-FAQ empfehlen, da ist EXCELLENT erklärt, wie man mit DEF SEG, PEEK und POKE arbeitet.
(Kapitel direkter speichrzugriff, oder so *g*)
siehe: www.qbasic.de _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 20.02.2005, 20:10 Titel: |
|
|
also in der QB-MonFAQ hab ich gestern den ganzen Tag nach einer solchen Routine gesucht ...
Aber jetzt funktionierts
Danke vielmals ...  |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 20.02.2005, 20:16 Titel: |
|
|
Sicher, ne direkte routine wirste wohl nicht finden, aber wenn man sich des durchliest, sollte man zumindest (irgendwann *g*) verstehen, wie denn der ram so organisiert ist *g*
naja, is eigentlich ganz einach.
Du hast 1 MB ram. (von Dos aus gesehen, unabhängig, wie groß deine echte ram-karte ist *g*)
Wenn du jetzt von einer beliebigen stelle ein byte lesen oder schreiben willst, brauchst du eine adresse.
So eine adresse ist in ein segment und ein offset aufgeteilt. mit DEF SEG= setzt du das Segment, mit PEEK(offset) liest du von nem offset ein, und mit POKE offset, byte schreibst du an das offset.
wichtige segmente sind:
&HA000 => Speicher für grafikmodi
&HB800 => Speicher für Textmodi
&H0040 => Bios-Segment
Das meiste lernste dann durch rumprobieren.
Sei aber vorsichtig beim Bios-Segment!
Da kannste einiges kaputtmachen, wenn du einfach so rum-POKEst *g*
aber zum glück gibts auch dafür die qbmonfaq *g* _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 20.02.2005, 20:47 Titel: Ergänzung zu SCREEN 0: Videoseiten |
|
|
B800:0000 als Videospeicheradresse gilt speziell für
d.h. Videoseite 0
=> bei den übrigen Videoseiten gelten entsprechend höhere Adressen. Hierbei kommt es noch darauf an, ob man sich im 80- oder 40-Zeichenmodus befindet, ebenso, ob 25, 43 oder 50 Zeilen.
Bei 40x25 gilt der 2048-Byte-Sprung, bei 80x25 der 4096-Byte-Sprung. Bei 43 und 50 Zeilen hat es dagegen keine Lücken. Beispiele:
Code: | SCREEN 0
WIDTH 40, 25
SCREEN ,,3, 3
DEF SEG=&HB800
POKE 3*2048, 65 ' linke obere Ecke |
Code: | SCREEN 0
WIDTH 40, 43
SCREEN ,,1, 1
DEF SEG=&HB800
POKE 1*(40*43*2), 65 ' linke obere Ecke |
_________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
gandro

Anmeldungsdatum: 18.02.2005 Beiträge: 108 Wohnort: Schweiz
|
Verfasst am: 31.03.2005, 19:44 Titel: |
|
|
nun, hier bin ich wieder...
Nach einer Pause will ich jetzt wieder etwas QB proggen, steh aber wieder vor einem Problem:
Ich möchte jetzt hier nicht nur einen Bildschirm auslesen, sondern 7 (also eigentilch 7mal ). natürlich nicht hintereindander, sondern so, dass ich zwischen den Bildschirmen wechseln kann. Nun ist mein Problem wie ich das in eine Datei speichern kann (per Array ist das viel zu speicherfressend). Evtl. noch mit Zusatzinformationen in der Selben Datei z.B. aktulle Cursorposition und so...
Wäre kul wenn ihr ne Lösung finden würdet... |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 31.03.2005, 20:18 Titel: |
|
|
mach doch ein string-array:
Code: |
DIM Bildschirm (1 TO 25) AS STRING * 80
|
und dann machste halt
Code: |
MID$(Bildschirm(zeile), Spalte) = PEEK(...)
|
sollte schonender sein, weil dann wirklich nur 1 byte pro stelle gespeichert wird. _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Stormy

Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
|
|
Nach oben |
|
 |
Stephan

Anmeldungsdatum: 05.10.2004 Beiträge: 358 Wohnort: Hessen - 20km Nördlich von Frankfurt am Main
|
Verfasst am: 31.03.2005, 20:28 Titel: |
|
|
Vielleicht schonender, aber nicht schneller,
das dieses String <-> Integer hin und her gewurschtel zeit kostet.
Code: |
MID$(Bildschirm(zeile), Spalte) = PEEK(...)
|
Fehlt da nicht unter anderem ein STR$() _________________ 'Wir schätzen die Zeit erst, wenn uns nicht mehr viel davon geblieben ist.'
Leo Tolstoi |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 31.03.2005, 21:12 Titel: |
|
|
Sicher, sicher, aber es sollte genügen. ansonsten kannst es ja mit direktem speicherzugriff versuchen:
Code: |
DIM Bildschirmpuffer (1 TO 25) AS STRING * 80
Segment = VARSEG(Bildschirmpuffer())
Offset = VARPTR(Bildschirmpuffer())
DEF SEG = Segment
|
Funzt, aber dann haste wieder das selbe, wie beim einmaligen auslesen.
Tip:
Verwende einfach mehrere Bildschirmseiten:
SCREEN 0, , 1
und du hast nen völlig leeren bildschirm, aber der alte is immer noch gespeichert. den bekommst du mit
SCREEN 0, , 0 zurück.
kann sein, dass ein komma zu wenig da is.... _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 31.03.2005, 22:09 Titel: |
|
|
gandro hat Folgendes geschrieben: | Nun ist mein Problem wie ich das in eine Datei speichern kann (per Array ist das viel zu speicherfressend). |
Nichts Leichteres als das: BSAVE und BLOAD bieten Dir exakt das an, z.B.
Code: | ' Bildschirm speichern
DEF SEG=&HB800
BSAVE "BILDSCH.DAT", 0, 4000
' Bildschirm wiederherstellen
DEF SEG=&HB800
BLOAD "BILDSCH.DAT", 0 |
Zur Cursorposition: Auslesen geht mit POS(0) und CSRLIN, Setzen mit LOCATE, z.B.
Code: | ' Position sichern
x% = POS(0)
y% = CSRLIN
' Position wiederherstellen
LOCATE y%, x% |
_________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 31.03.2005, 23:12 Titel: |
|
|
... oder auch im BIOS-Seg:
DEF SEG=&H0040
col = PEEK(&H50)
row = PEEP(&H52)
Aber warum kompliziert, wenns auch einfach geht. Nimm lieber dreaels Lösung.
Wollte nur alle Möglichkteiten Anbieten *g*
Übrigens bin ich mir bei den Adressen gar ned ganz sicher. Wenn du's so machen willst, schau am besten in die QBMonFAQ. _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 01.04.2005, 15:25 Titel: |
|
|
Dusky_Joe hat Folgendes geschrieben: |
|
Vor allen Dingen PEEP.
jb |
|
Nach oben |
|
 |
Quark48

Anmeldungsdatum: 16.10.2004 Beiträge: 559 Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern
|
Verfasst am: 01.04.2005, 15:33 Titel: |
|
|
Hallo!
Mach dich nicht drüber lustich im Internet ist es fast schon normal dass man sich vesrhcriebt  _________________ Grüßle, Stefan
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht!
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/ |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 01.04.2005, 15:41 Titel: |
|
|
Quark48 hat Folgendes geschrieben: |
im Internet ist es fast schon normal dass man sich vesrhcriebt
|
Jaja. Schon OK.
Aber wenn's nun mal lustig ist...
So war's doch nicht gemeint.
jb |
|
Nach oben |
|
 |
Quark48

Anmeldungsdatum: 16.10.2004 Beiträge: 559 Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern
|
Verfasst am: 01.04.2005, 15:48 Titel: |
|
|
Hallo!
Aber trozdem sollte man den Leuten ein bisschen SPaß nicht vorenthalten
PIEP anstatt POINT...
Oder anstelle von PRINT GRINT
Na egal  _________________ Grüßle, Stefan
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht!
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/ |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|