 |
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 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 18.12.2005, 20:20 Titel: Bilschirm auslesen - für MonsterFAQ |
|
|
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 |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 18.12.2005, 21:08 Titel: |
|
|
Antwort:
Du musst auf den Textspeicher zugreifen. Das machst Du mit
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 20.12.2005, 21:14 Titel: |
|
|
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 |
|
 |
pinkpanther

Anmeldungsdatum: 28.05.2005 Beiträge: 79 Wohnort: Wien
|
Verfasst am: 23.12.2005, 14:04 Titel: |
|
|
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  |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 23.12.2005, 17:09 Titel: Danke |
|
|
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 |
|
 |
|
|
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.
|
|