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:

grafik mit asm unter freebasic

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



Anmeldungsdatum: 18.05.2007
Beiträge: 43

BeitragVerfasst am: 28.05.2007, 10:21    Titel: grafik mit asm unter freebasic Antworten mit Zitat

wer kann mir mal zeigen, wie man eine grafikroutine die in freebasic vorhanden (zb line) ist über einen asm befehl ansprechen kann?

oder wie sieht eine routine aus um zb nur einen pixel in asm zu setzen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 28.05.2007, 14:08    Titel: Antworten mit Zitat

Den Bildschirm voll Pixeln:

Code:
Define ScrWid 320
#Define ScrHei 240
#Define ScrBpp 4

ScreenRes ScrWid, ScrHei, ScrBpp * 8

Dim As Integer x, y, c
Dim As Integer Ptr scrP


ScreenLock
scrP = ScreenPtr
For y = 0 To ScrHei - 1
   For x = 0 To ScrWid - 1
      c = RGB( Rnd * 255, Rnd * 255, Rnd * 255 )
      Asm
         mov            eax , [scrP]
         mov            ebx , [c]
         mov dword ptr [eax], ebx
      End Asm
      scrP += 1
   Next
Next
ScreenUnLock
GetKey


Du musst dir halt jedes mal die Adresse des Pixels selbst berechnen.

Adresse = ScreenPtr + (y * xMax) + x

ScreenPtr ist eine FB-Funktion, siehe Referenz.
x und y sind deine Koordinaten.
xMax ist die Bildschirmbreite.

Vor dem ASM-Zugriff ScreenLock, sonst geht gar nix. Und danach mit ScreenUnlock entsperren, sonst wird das ganze zwar in den Speicher geschrieben, aber man sieht nix.


Have a nice day
Ciao
Dusky_Joe
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 28.05.2007, 14:49    Titel: Antworten mit Zitat

dusky_joe, sicher dass das noch so ohne weiteres geht? das neue puffer-format von freeBASIC füllt die puffer ja immer so, dass die länge einer zeile durch 4 teilbar ist. wobei, SCREENs sind ja von natur aus durch 4 teilbar...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 28.05.2007, 15:54    Titel: Antworten mit Zitat

Screen hat keine header, die Daten liegen direkt am ScreenPTR.
Somit sollte es auf diese Art gehen happy
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 28.05.2007, 19:07    Titel: Antworten mit Zitat

DAS weiß ich auch - aber soviel ich weiß, müssen die horizontalen pixeldaten immer durch 4 teilbar sein...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 01.06.2007, 22:50    Titel: Antworten mit Zitat

Jojo hat schon recht - es gab mal diese Meldung, dass die Pixeldaten an Div-by-Four-Offsets liegen müssen. Ich denke aber, dass sich das nur auf ImageCreate-Puffer bezieht; wäre aber trotzdem einen Test wert....

Ja, auch folgendes Programm funktioniert:
Code:
#Define ScrWid 303
#Define ScrHei 240
#Define ScrBpp 1

ScreenRes ScrWid, ScrHei, ScrBpp * 8

Dim As Integer x, y, c
Dim As Byte Ptr scrP


ScreenLock
scrP = ScreenPtr
For y = 0 To ScrHei - 1
   For x = 0 To ScrWid - 100
      c = Rnd * 255
      Asm
         mov           eax , [scrP]
         mov           ebx , [c]
         mov byte ptr [eax], ebx
      End Asm
      scrP = ScreenPtr + (y * ScrWid) + x
   Next
Next
ScreenUnLock
GetKey


Und hier sind die Parameter so gelegt, dass es sich eben nicht um vierer-Offsets handelt.

Danke fürs Probelesen zwinkern

Have a nice day
Ciao
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 02.06.2007, 10:39    Titel: Antworten mit Zitat

auch nicht langsamer:
Code:
#Define ScrWid 303
#Define ScrHei 240
Screenres ScrWid, ScrHei, 8
Dim As Integer x, y, pitch
Dim As Byte Ptr scrP
'pitch hat immer die richtige Zeilenbreite in Byte
Screeninfo ,,,,pitch

Screenlock
scrP = Screenptr
For y = 0 To ScrHei - 1
  For x = 0 To ScrWid - 1
    scrP[x] = y * x
  Next
  scrP += pitch
Next
Screenunlock
Getkey

viel Spass damit.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
robbifan



Anmeldungsdatum: 18.05.2007
Beiträge: 43

BeitragVerfasst am: 02.06.2007, 13:57    Titel: Antworten mit Zitat

kannste die for-schleife auch mal in asm packen.
vielleicht wird es dann noch schneller.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 02.06.2007, 20:38    Titel: Antworten mit Zitat

Ich würd meinen, **** mach's selbst. Zunge rausstrecken
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

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

bringt auch nichts, FBC schreibt schon guten ASM-code.
Das kann man, mit der Option -r, selber in der ASM-Datei nachprüfen.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 03.06.2007, 15:19    Titel: Antworten mit Zitat

ASM...END ASM ist ja eh nur dazu eingebaut, um hochspezielle Berechnungen zu optimieren - wenn man bei zwei verschachtelten FOR-NEXT schon viel optimieren könnte, dann wäre FB sicher nicth so erfolgreich.
In diesem Fall ließe sich höchstens eines machen: Da sowiso der ganze Bildschirm gefüllt wird, kann man schreiben
FOR i = 0 To (ScrWid * ScrHei) - 1
Dann muss man aber anders auf die Farbwerte kommen.


Anyway, back to topic:
Um mit ASM zu zeichnen, musst du direkt in den Bildschirmpuffer schreiben. Dazu...
    Musst du erst mal den Bildschirm sperren - SCREENLOCK
    Das Offset deines Pixels manuell berechnen - siehe Formel ein paar Posts weiter oben
    Das Start-Offset von Pixel (0, 0) bekommst du über SCREENPTR
    An das berechnete Offset schreibst du den Farbwert. Das geht mit mov.
    Nach dem Schreibvorgang gibst du den Bildschirm wieder frei, damit etwas angezeigt wird. Das geht mit SCREENUNLOCK.

Effektiv wird ASM erst, wenn du viele Speicherzugriffe zwischen SCREENLOCK und -UNLOCK hast. Beispiel: Du willst dir eine einege PUT-Routine schreiben. Wenn du jeden Pixel mit PSET anzeigst, ist es so, als würdest du für jeden Pixel einzeln S.Lock und S.Unlock aufrufen. kostet Zeit, und man kann dem Bildaufbau direkt zusehen. Wenn du dagegen erst lockst, dan die Pixel in den speicher schreibst, und dann unlockst, kannst du einiges an Zeit rausholen.
Jedenfalls gegenüber der Pset-Methode - die FB-eigene PUT-Routine ist noch mal ne ecke weiter optimiert, da sie z.T. prozessorspezifische Funktionen benutzt - Stichwort MMX.

Anyway, viel Spaß an diesem Themengebiet


Have a nice day
Ciao
Dusky_Joe
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
robbifan



Anmeldungsdatum: 18.05.2007
Beiträge: 43

BeitragVerfasst am: 04.06.2007, 18:43    Titel: Antworten mit Zitat

ja, gute einweisung, habe wieder viel dazugelernt mit asm und freebasic.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. 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