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:

Paletten-Frage

 
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
minx



Anmeldungsdatum: 25.08.2012
Beiträge: 11

BeitragVerfasst am: 24.03.2013, 01:27    Titel: Paletten-Frage Antworten mit Zitat

Hiho.

Ich habe mich mal bei QBCM über dem Umgang mit der Palette belesen und stehe jetzt in einem Source-Code vor einem Problem:

Code:
SCREEN 13
    DEF SEG = &HA000
    OUT &H3C8, 0'
    FOR n = 0 TO 127
        OUT &H3C9, 0
        OUT &H3C9, INT(n / 4)
        OUT &H3C9, INT(n / 2)
    NEXT
    FOR n = 0 TO 127
        OUT &H3C9, INT(n / 2)
        OUT &H3C9, INT(31 + n / 4)
        OUT &H3C9, 63
    NEXT


Ist das nicht irgendwie sinnlos? Am Anfang wird der Slot mit OUT &H3C8, 0' auf 0 gesetzt und nicht mehr geändert. Das heißt doch, dass später nur dieser Slot immer wieder (127 mal) überschrieben wird verwundert

Anders gesagt: Wie würde denn die Palette nach diesem Schritt aussehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 24.03.2013, 01:30    Titel: Antworten mit Zitat

Nein, diese "Befehle" sind in der VGA-Hardware schon sinnvoll implementiert, d.h. wenn an Adresse 3C8 kein neuer Paletteneintrag ankommt, wird nach dem Schreiben eines Paletteneintrags einfach der nächste gewählt. Sprich, in diesem Beispiel werden tatsächlich alle 256 Farben neu konfiguriert. Das ist ein bisschen wie der Running Status bei MIDI - wenn der neue und der alte Befehlstyp derselbe sind (in diesem Fall: Farbeintrag setzen), lässt man ihn einfach weg und sendet nur die Parameter (die RGB-Werte).
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.


Zuletzt bearbeitet von Jojo am 24.03.2013, 01:35, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
minx



Anmeldungsdatum: 25.08.2012
Beiträge: 11

BeitragVerfasst am: 24.03.2013, 01:34    Titel: Antworten mit Zitat

Aha! Vielen Dank für die Info zwinkern . Was hat in diesem Fall das DEF SEG = &HA000 zu bedeuten?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 24.03.2013, 01:37    Titel: Antworten mit Zitat

Gar nichts, das ist in diesem Beispiel unnötig. Hast du den Code nur unvollständig kopiert? DEF SEG gibt einfach nur das Speichersegment für folgende PEEK- und POKE-Befehl an. Segment A000 ist die Startadresse des VGA-Video-RAM, und mit POKE kann man da Pixel schneller reinschreiben als mit QBs eigenem PSET-Befehl. Vermutlich würde also danach noch Code folgen, der ein paar Pixel setzt, und dafür bräuchte man dann das DEF SEG.
_________________
» 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
minx



Anmeldungsdatum: 25.08.2012
Beiträge: 11

BeitragVerfasst am: 24.03.2013, 01:43    Titel: Antworten mit Zitat

Ja, ich versuche wie immer ein altes Programm zu übersetzen, diesmal dieses Raytracer-Beispiel: http://pastebin.com/uim7Ggdf

Darauf folgen verschiedene PEEK / POKE Anweisungen. Gut, dann kann ich das wie von PSET gewohnt übersetzen happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 24.03.2013, 18:59    Titel: Antworten mit Zitat

Nur zur Info: Farbpalette setzen ist auch ohne OUT möglich, da es speziell den PALETTE-Befehl dafür gibt, für eine ganze Gruppe von Farben sogar PALETTE USING. Hat den Vorteil, Dein Programm von irgendwelchen hardwarespezifischen Merkmalen besser zu entkoppeln (der dahinterliegende VGA-BIOS-Aufruf wird dann ähnlich den Treibern in Windows schlussendlich richtig übersetzt), was Dir den Weg für eine Portierung von QB nach FreeBasic ebnen hilft.

Umgekehrt gelten mittlerweilen diverse I/O-Adressen auch schon soweit als "Well Known"-Ports, dass sogar Microsofts NTVDM und DOS-Box diese Adressen simulieren, womit ein Commodore 64-mässiger Programmierstil (=alles mit PEEK() und POKE mangels Bibliotheken/spezialisierte Befehle) möglich ist.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


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

BeitragVerfasst am: 24.03.2013, 19:33    Titel: Antworten mit Zitat

Wenn ich mich recht erinnere, wollte er alte QB-Programme nach AutoIt übersetzen, nicht FreeBASIC. QBasic hat kein PALETTE USING, AutoIt höchstwahrscheinlich auch nicht. FreeBASIC kann (oder konnte) zudem die alten OUT-Befehle "übersetzen", diese würden also in FB gar nicht an die Hardware gesendet werden.
_________________
» 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
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 24.03.2013, 21:25    Titel: Antworten mit Zitat

Jojo hat Folgendes geschrieben:
QBasic hat kein PALETTE USING

GW-BASIC hatte PALETTE USING noch nicht, dagegen QuickBasic 4.5 und QBasic 1.1 kennen PALETTE USING.

Jojo hat Folgendes geschrieben:
FreeBASIC kann (oder konnte) zudem die alten OUT-Befehle "übersetzen", diese würden also in FB gar nicht an die Hardware gesendet werden.

Stimmt sogar gemäss

http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgOut

Von der Code-Lesbarkeit her würde ich OUTs dennoch möglichst komplett eliminieren (in diesem Fall mit PALETTE problemlos möglich) ähnlich einem GOTO-Befehl. FB erlaubt mit PALETTE GET sogar das Auslesen (=der berühmte Fall in QB, wo ich mit CALL INTERRUPT direkt aufs VGA-BIOS gehen musste, vermutlich aber auch INP() analog dem hier diskutierten OUT anwenden könnte).
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
minx



Anmeldungsdatum: 25.08.2012
Beiträge: 11

BeitragVerfasst am: 24.03.2013, 22:21    Titel: Antworten mit Zitat

Ja es geht um AutoIt. Um den PALETTE Befehl weiß ich auch (steht ja auch im verlinkten Artikel).

In "meiner" Sprache lässt sich die Palette recht leicht durch ein Array emulieren:

$aPalette[256]

Die speichert dann einfach Hex-Farben:

$aPalette[i] = "0x" & Hex(Rot) & Hex(Grün) & Hex(Blau)

Also Pseudo-Code. Wenn dann später ein Aufruf getätigt wird, dann wird aus

PSET npos, col

einfach:

PSET($npos, aPalette[$col])

zwinkern


Natürlich gibt es die Funktion PSET nicht nativ in dieser Sprache. In diesem Fall wird einfach eine Struct der Größe w*h Bytes erstellt und deren Pointer per Compatible DC zur Bitmap gemacht. So kann einfach npos aus PSET als npos in der Struct angenommen werden.

Die Struct wird später einfach per BitBlt aufs DC einer Win GUI geschrieben. Dadurch, dass auf keine Zeichenfunktionen der WinAPI zugegriffen wird (wie GDI(+), DirectX o.ä.) hängt das Zeichnen direkt an dem Speed der verwendeten Sprache und kann so leichter gesteuert werden.
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 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