Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bilschirm auslesen - für MonsterFAQ

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 18.12.2005, 20:20    Titel: Bilschirm auslesen - für MonsterFAQ Antworten mit Zitat

Noch eine Restfrage für die QB-MonsterFAQ, die ich mir mal notiert hatte. Wer kennt eine Antwort?

Wie lese ich den Text-Bildschirm schneller als mit SCREEN aus?

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).
_________________
+++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 18.12.2005, 21:08    Titel: Antworten mit Zitat

Antwort:

Du musst auf den Textspeicher zugreifen. Das machst Du mit
Code:

DEF SEG = &HB800

Nun kannst du mit PEEK den Speicher auslesen. Hier eine Subroutine, die dir den Inhalt (Zeile für Zeile) in eine Textdatei schreibt:
Code:

SUB SaveScreen (Dateiname$, xres AS INTEGER, yres AS INTEGER)

 ' Variable für ein Zeichen
 DIM Zeichen AS STRING * 1
 DIM Zeile AS STRING

 ' Datei öffnen
 F = FREEFILE
 OPEN Dateiname$ FOR OUTPUT AS #F
 
 ' Segment setzen
 DEF SEG = &HB800

 ' Schleife über jedes Zeichen
 FOR Zeile = 1 TO yres STEP 1
 
  ' Zeile resetten
  Zeile = ""
 
  FOR Spalte = 1 TO xres STEP 1

   ' Aktuelles Zeichen isolieren
   Zeichen = CHR$(PEEK((Zeile - 1) * 160 + ((Spalte - 1) * 2)))

   ' Und zur Zeile hinzufügen:
   Zeile = Zeile + Zeichen
     

  NEXT Spalte

  ' Und in die Datei schreiben:
  PRINT #F, Zeile

 NEXT Zeile

 ' Segment wieder zurücksetzen
 DEF SEG

 ' Datei wieder schließen
 CLOSE #F 

END SUB


jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 18.12.2005, 23:15    Titel: Antworten mit Zitat

Hi jb!

Hast du mal einen Geschwindigkeitsvergleich gemacht? Würd mich mal interessieren, da beispielsweise Alternativen zu PSET bei mir immer langsamer waren als QB's PSET.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 20.12.2005, 21:14    Titel: Antworten mit Zitat

Ich hab's nicht getestet, hab's einfach mal so hingeschrieben...
Wie auch immer, QB schwankt bei XP sowieso, daher wären Messwerte wohl kaum gültig...

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 23.12.2005, 14:04    Titel: Antworten mit Zitat

Hallo Thomas!
Zitat:
Gibt es nicht eine schnellere Methode, die z.B. direkt auf den Bildschirmspeicher zugreifft (Ich kenn ich da nicht so aus).

Ich denke, dass diese Problemstellung mit QB-Bordmitteln nicht zufriedenstellend gelöst werden kann, sondern nur in Assembler. Die Einbindung von Assembler-Prozeduren wiederum bedingt die Beschäftigung mit der Erstellung/Einbindung von (Quick-)Libraries. Damit aber ist der typische QB-Anfänger (an den sich deine Monster-FAQ wohl primär wendet) sicher überfordert. Ich würde diese Fragestellung daher einfach ausklammern (oder im Rahmen einer "Monster-FAQ für Fortgeschrittene" berücksichtigen).

Wer den Aufwand nicht scheut, der sei an eine relativ einfache, aber sehr brauchbare Methode verwiesen, die QB-Guru Ethan Winer vor längerer Zeit veröffentlicht hat:
Code:
;********* MEMCOPY.ASM - copies a block of memory from here to there
;
;Copyright (c) 1991 Ethan Winer
;
;
;Usage:
;
; CALL MemCopy(SEG Type1, SEG Type2, NumBytes%)
;or
; CALL MemCopy(BYVAL Seg1%, BYVAL Adr1%, BYVAL Seg2%, BYVAL Adr2%, NumBytes%)


.Model Medium, Basic
.Code

MemCopy Proc Uses DS ES SI DI, FromAdr:DWord, ToAdr:DWord, NumBytes:Word

  Cld                  ;copy in the forward direction

  Mov  SI,NumBytes     ;get the address for NumBytes%
  Mov  CX,[SI]         ;put it into CX for copying below

  Les  DI,ToAdr        ;load ES:DI with the segmented destination address
  Lds  SI,FromAdr      ;load DS:SI with the segmented source address

  Shr  CX,1            ;copy words instead of bytes for speed
  Rep  Movsw           ;do the copy
  Adc  CX,CX           ;this will set CX to either 0 or 1
  Rep  Movsb           ;copy the odd byte if necessary

  Ret                  ;return to BASIC

MemCopy Endp
End

Konkretes Anwendungsbeispiel, um den Inhalt eines 80x25-Textbildschirms in eine Variable (VarSegment%/VarAdresse%) einzulesen:
Code:
DECLARE SUB MemCopy(BYVAL Seg1%, BYVAL Adr1%, BYVAL Seg2%, BYVAL Adr2%, NumBytes%)
CALL MemCopy(&HB800, 0, VarSegment%, VarAdresse%, 4000)

Sitzt, passt, hat Luft und ist mörderschnell!

Schöne Weihnachten!
_________________
lG
pinkpanther lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 23.12.2005, 17:09    Titel: Danke Antworten mit Zitat

Vilen Dank für die schnellen und kompetenten Antworten. Ich habe mir alles für die QB-MonsterFAQ vorgemerkt.
_________________
+++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz