Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
minx
Anmeldungsdatum: 25.08.2012 Beiträge: 11
|
Verfasst am: 24.03.2013, 02:27 Titel: Paletten-Frage |
|
|
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
Anders gesagt: Wie würde denn die Palette nach diesem Schritt aussehen? |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 24.03.2013, 02:30 Titel: |
|
|
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, 02:35, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
minx
Anmeldungsdatum: 25.08.2012 Beiträge: 11
|
Verfasst am: 24.03.2013, 02:34 Titel: |
|
|
Aha! Vielen Dank für die Info . Was hat in diesem Fall das DEF SEG = &HA000 zu bedeuten? |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 24.03.2013, 02:37 Titel: |
|
|
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 |
|
|
minx
Anmeldungsdatum: 25.08.2012 Beiträge: 11
|
Verfasst am: 24.03.2013, 02:43 Titel: |
|
|
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 |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 24.03.2013, 19:59 Titel: |
|
|
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 |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 24.03.2013, 20:33 Titel: |
|
|
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 |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 24.03.2013, 22:25 Titel: |
|
|
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 |
|
|
minx
Anmeldungsdatum: 25.08.2012 Beiträge: 11
|
Verfasst am: 24.03.2013, 23:21 Titel: |
|
|
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])
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 |
|
|
|