OUT ?, ?



  • Hier mal eine nette Erklärung zu ModeX (muß es nicht selber schreiben, puhh):

    Mode X:

    Mitunter ergibt sich die Notwendigkeit von mehreren Bildschirmseiten. Diese können einfach hintereinander im Bildschirmspeicher abgelegt werden und über Register 0Ch und 0Dh (Linear Starting Address) gewählt werden. Das Problem besteht beim Mode 13h jedoch darin, daß das ganze Bild bereits fast 64 KB (genau 64.000 Bytes) groß ist. Eine Bildschirmseite belegt also schon den gesamten im Hauptspeicher eingeblendeten Videospeicher (0A0000h - 0AFFFFh), was es der CPU unmöglich macht, die zweite Bildschirmseite anzusprechen. Modifikationen sind also nur über die Segmentselektoren des VGA möglich, die aber bei jedem Hersteller anders programmiert werden. Aus diesem Grund wurde der Mode X erdacht. Ursprünglich aus dem Hacker-Untergrund stammend, ist dieser Modus heute durchaus offiziell.

    Im Mode X werden bei einem Byte-Zugriff vier Pixel auf einmal kopiert, außerdem werden Read-Mode 0 und Write-Mode 1 verwendet, die weder aufwendige interne Adreßumwandlungen erfordern noch Daten an die CPU schicken, was den Geschwindigkeitsvorteil gegenüber 32-Bit-Zugriffen der CPU ausmacht.

    Zur Initialisierung wird der Chain-4-Mechanismus abgeschaltet, so daß wieder freier Zugriff auf einzelne Planes möglich ist, außerdem muß sichergestellt werden, daß der Odd/Even-Mode (Plane-Selektion durch unterstes Offset-Bit) ausgeschaltet ist, dazu muß nur im TS-Register 4 (Memory Mode) Bit 3 (Enable Chain4) gelöscht und Bit 2 (Odd/Even-Mode) gesetzt werden. Je nach Grafikkarte muß noch der Speicherzugriff auf Byte-Adressierung geschaltet werden, also zunächst Doubleword-Adressierung aus Bit 6 in CRTC-Register 14h (Underline Row Address) löschen und Bit 6 in CRTC-Register 17h (CRTC-Mode) setzen. Sinnvollerweise wird jetztnoch der Bildschirmspeicher gelöscht, weil an den vom Mode 13h unbenutzten Stellen, die jetzt sichtbar werden, noch Byte-Müll aus anderen Videomodi stehen kann. Am einfachsten erfolgt das über das Write Plane Mask Register 2 des Timing-Sequenzers, in dem alle Planes eingeschaltet werden, so daß 32.000 Word-Zugriffe oder 16.000 DWord-Zugriffe ausreichen, um alle vier Bildschirmseiten zu löschen. Ab nun muß man sich allerdings um alles selbst kümmern, da weder vom BIOS noch einer Hochsprache irgendwelche Unterstützung zu erwarten ist.

    In sämtlichen Plane-basierten Grafikmodi verbergen sich hinter einer Speicheradresse gleich 4 Byte, jeweils eins pro Plane. Die 4 Bytes liegen quasi übereinander an einer Adresse. Sie lassen sich einzeln ansprechen, werden aber parallel verwendet. Die Adressierung erfolgt allerdings gänzlich anders als in den 16-Farbenmodi. Die Punktnummer läßt sich im Mode X errechnen wie im Mode 13h, Plane und Offset lassen sich nach folgenden Formeln berechnen:

    Plane = X mod 4

    Offset = Y * 80 + X div 4

    Dieses Verfahren entspricht dem des Mode 13h, mit dem Unterschied, daß der Offset durch Shiften der Punktnummer um 2 Bit nach rechts statt durch Maskieren berechnet wird, so daß im Speicher keine Lücken zwischen den Punkten entstehen und somit vier Seiten in die 256 KB Video-RAM passen. Bei der Selektion der Plane im Mode X muß allerdings noch zwischen Schreib- und Lesezugriffen unterschieden werden: Beim Lesen wird die Plane-Nummer in Register 4 (Read Plane Select) des GDC geschrieben, beim Schreiben dagegen ist es möglich, mehrere Planes gleichzeitig anzusprechen. Daher wird eine Maske in Register 2 (Write Plane Mask) des TS gesetzt, die erst aus der Plane-Nummer erzeugt werden muß, nach folgender Formel:

    Maske = 1 shl Plane-Nummer

    Die byteweise Adressierung seitens der CPU ist notwendig aufgrund der vier Latches des VGA.

    Ich liebe Copy&Paste 😃



  • Puhh!! Das haut rein! Danke erstmal. Ich habe jetzt zwar noch nicht alles verstanden, aber es ergibt sich sicherlich einiges, wenn ich mir die Texte noch ein paarmal durchlese *g*.

    Hätte nie gedacht, dass Grafiken so kompliziert sind...

    ... gibt es im Netz vielleicht noch irgendwelche wissenswerte Lektüre in diese Richtung (Turorials, Docus, Foren, FAQ's, etc.) ?

    Vielen Dank!
    - healscar



  • Jetzt hab ich doch glatt schon wieder was ganz Wichtiges vergessen 😡

    Kannst du mir vielleicht noch ein bisschen über C64 und vor allem den alten Ninetendos(!!!) erzählen 😃 . Gibt es noch Möglichkeiten, spiele für Nintendos zu proggen? Die Schwierigkeit liegt wahrscheinlich eher darin, das Programm auf diese "Disketten" zu bekommen...

    Danke nochmal
    -healscar



  • Du meinst sicherlich Module. Das macht man mit 'nem EPROM-Brenner.
    Und sicherlich das Problem ist die Module zu erstellen, aber es gibt ja Emulatoren:
    http://www.zophar.net/utilities/snesutil.html

    Da gibt's noch tausende mehr, auch für den GameBoy... -> Google

    PS: Übrigens Nintendo und C64 benutzen Motorola Prozessoren, daß heißt du musst einen völlig neuen Assembler (Mnemonic)-Wortschatz lernen !!



  • Woran man erkennt, dass es BASIC und nicht Assembler ist

    2 Gründe:
    a) Die Darstellung &Hnnnn für hexadezimale Zahlen ist ausserhalb von BASIC völlig unüblich. Man findet oft $nnnn, nnnnh oder 0xnnnn.
    b) Es existiert schlicht und einfach kein Maschinenbefehl, der als Argument eine Portnummer > 256 (bzw. 0xFF) akzeptiert. Hat man einen solchen Port, muß die Nummer erst ins DX Register geschrieben werden:

    MOV DX, 3C8h
    OUT DX, 0
    


  • Hey!

    Also manche Leute (einschließlich mir) haben wohl den ganzen Tag nichts anderes zu tun, als hier im Forum auf Antworten zu warten 🙂 - das ist um Himmels willen nicht negativ gemeint *freu*

    @agrimm:

    Die Idee mit dem neuen Thema ist nicht schlecht! Vielleicht zeigt sich ja einer der Admins interessiert diesen Beitrag ins FAQ zu stellen.

    Also, zwei Kollegen besitzen noch diese alten Nintendos bzw. Super Nintendo. Das ist der Grund, warum ich frage. Was genau hast du eigentlich mit der Programmierung von Nintendo und Commondore 64 zu tun?

    @Bashar:

    Man unterscheidet in unserem Zeichensystem ja zwischen Alphabetisch, Numerisch und Alphanumerisch. Ist Hex-Code nun Numerisch oder Alphanumerisch?

    Gruß (an alle)
    - healscar



  • Das ist ewig her, seit ich das letzte mal mit den alten 8 und 16-Bittern rumgefuhrwerkt habe. Meinen C64 hab ich aber letztens wieder ausgepackt. Das geile am C64 ist das man da echt noch richtig geile Tricks machen kann, an die Commodore bei der Entwicklung nie gedacht hat. Übrigens ähnliche Tricks sind mit der VGA-Karte auch möglich.
    Ach die guten alten Zeiten ...



  • Tricks? Kannst du dass genauer erklären?



  • Wir kriegen von den Admins derbe auf's Maul, weils nicht um's Thema geht 😃

    Na gut: ein Trick beim C64 wahr beispielsweise das FLI (Flexible Line Interrupt), damit konnte man mehr als 4 Farben pro 8 x 8 Feld (alle 16, mehr hatte er nicht) benutzen. Ein weiterer war Sprite-Multiplexing: 8 waren theoretisch möglich, praktisch kann man mehr erzeugen, mit dem geschickten Trick eben..



  • Hm, hast recht; Wir sollten schnell wieder auf Assembler zurück kommen.

    Vielleicht mal was zur Soundkarte? Weisst du auch, wie es da mit den Registern aussieht?



  • Die meissten heutigen Onboard- und PCI-Soundkarten sind mit dem Soundblaster leider nicht mehr kompatibel. Es gibt zwar DOS-Treiber, die dann den Soundblaste emulieren, verlass dich darauf aber nicht. Die Programmierung ist damit also ziehmlich sinnlos!! 😞

    Es sei denn ...



  • Schade eigentlich. Dann wird das wohl heutzutage alles über DirectPlay geregelt? Das funzt nur so schlecht unter DOS 😞

    Vielleich nochmal zu Vesa-Mode?

    Was ich noch nicht ganz verstanden habe, ist die übergabe der Pixel an des Bildschirm.

    Man aktiviert also den Screenmode 0x12 und setzt das es auf 0xa000. Aber wie funktioniert das eigentliche Pixelmalen. 2 Pixel pro byte -> dann muss das ja umgerechnet werden und wenn ich eigentlich einen Pixel malen will, muss ich gleich zwei rendern (einen dann in der Farbe des Pixels, der schon dort war).
    So stelle ich mir das vor... Aber das macht wohl keinen Sinn ?!?

    Ich habe ein Programm von mir, dass eigentlich Mode 0x13 hat einfach auf 0x12 geändert - sah lustig aus 😡



  • Bei Sound DirectSound, bei Grafik DirectDraw/3D usw.

    Ihr benutzt ja SDL, so wie ich das gesehen hab!

    Ist ja auch logisch das das lustig aussieht, Mode 12 sind 16 Farben. Der Speicher wird dabei ganz anders ausgelesen !

    Im normalen 0x013 Mode geht Pixel setzen in C so:
    pixel = (char far )0xA0000000 + (y320) + x;
    pixel[0] = color;



  • Ähm, moment mal!

    Wen meinst du mit "ihr". Und wie kommst du auf SDL. Hab ich dir irgendwann meine Homepage gesagt 🙄 Kein Kommentar zu dem Datum

    Aber, ja - wir benutzen SDL. Es war nicht meine Entscheidung, da ich persönlich mehr auf pure OpenGL Grafik stehe. Und Direct X kannst du (was das Rendering betrifft) vergessen. Dann doch lieber Pixel mit int 10h in einem Dos-Fenster setzen 😉

    Dieser Beitrag hat natürlich nichts mit unserem Projekt zu tun. Ich interessiere mich für alte Spiele wie eben z.B. auf dem Nintendo oder DOS.

    Aber wie du von Project: SpaceBar erfahren hast, musst du mir nochmal genau erklären *ggg*



  • Klicke mal bei deinen Beiträgen rechts neben Datum und Uhrzeit das erste Icon an!!

    Ach ja besser direkt in den Speicher als mit int 0x10 :o

    [ Dieser Beitrag wurde am 17.10.2002 um 16:45 Uhr von agrimm editiert. ]



  • Original erstellt von agrimm:
    **Klicke mal bei deinen Beiträgen rechts neben Datum und Uhrzeit das erste Icon an!!
    **

    Argh! 😃

    [QB}

    Ach ja besser direkt in den Speicher als mit int 0x10 :o
    [/QB]

    Das meine ich ja -> besser int 10 als Direct X 😉 Direct X hängt manchmal hinterher. Ist aber nicht wirklich langsamer als int 10h 🙂

    Ich hoffe, dass mit dem Kommentar klappt jetzt ohne weiteres.

    Also, wie man in 13h Pixel malt, weiss ich. Aber was ist in 12h? Und ich verstehe ehrlich gesagt nicht, was es bringt, wenn man 4 Seiten für die Grafik benutzen kann (Mode X). Das verlangsamt doch höchstens noch das Rendering.

    Ich muss jetzt leider weg; also nicht wundern, wenn ich länger nicht antworte.

    Danke nochmal
    - healscar



  • Willst du ein 16 Farben Spiel programmieren ?

    Na ja bitte, ich hab die Details nicht mehr ganz im Kopf aber:
    Im mode 0x012 (640x480x4bpp) braucht man 4 Bildschirmseiten.

    In jedem Byte einer Bildschirmseite sind nun Daten über 8 (?, wie gesagt die Details hab ich nicht mehr ganz im Kopf 😞 ) Pixel gespeichert. Auf der ersten Seite das erste Bit, auf der zweiten das Zweite Bit und so fort. Um ein Pixel zu setzen, musst du nun das erste Bit auf die erste Seite schreiben, dann auf die zweite Plane schalten, das zweite Bit setzen usw. Also fast wie in ModeX.

    Die 4 Seiten nutzen schon was, Beispielsweise für Scrolling, das kannst du in ModeX dann ohne umkopieren erledigen!!



  • Oh, ich dachte 16 Bit! Welcher Mode ist denn sonst noch empfehlenswert? Ich denke keiner ist so einfach wie der 13h oder?

    Wie kommt es eigentlich, dass die Grafikkarte sich angesprochen fühlt, wenn man im RAM etwas zwischen a000h und aFFFh speichert? Werden die Pixel nicht in den Grafikkartenspeicher geladen?

    Vielleicht sollte ich mir einfach nochmal ein Tutorial über diese Segmente (z.B. es) durchlesen?!?

    Gruß
    - healscar



  • Der Grafikkartenspeicher wird hier so aehnlich, wie die I/O-Ports der Hardware im Nintendo in z.B. den Speicherbereich A0000h gemapt. Wenn Du da reinschreibst, gehen die Daten halt nicht an den normalen Speicher, sondern an die Grafikkarte.

    Sowas gibt es aber nicht nur bei Grafikkarten, sondern auch bei vielen anderen PCI-Steckkarten etc.

    Und: Die Grafikmodi ab 8Bit sind eigentlich alle einfach zu handhaben... Das dumme am 4Bit-Modus ist schliesslich nur, dass man 2 Pixel auf ein Byte quetschen muss.
    Bei den Modi ab 16Bit gibt es lediglich keine Palette mehr, wie bei den 8Bit-Modi... Jetzt werden direkt die Werte fuer Rot, Gruen und Blau in den Speicher geschrieben. Am einfachsten ist das natuerlich bei 24Bit, da steht je ein Byte fuer den Rot, Gruen und Blau-Anteil 😉
    Problem bei diesen hoeheren Modi ist aber, dass Sie nicht mehr zum eigentlichen VGA-Standard gehoeren und Du sie ohne VESA nicht mehr ueber den Speicherbereich A0000h steuern kannst.

    BTW: Was soll "es" fuer ein "Segment" sein? Falls Du den Segmentregister ES meinst, der kann lediglich auf ein Segment zeigen.

    [ Dieser Beitrag wurde am 18.10.2002 um 08:52 Uhr von Nobuo T editiert. ]



  • Aah! Das erklärt natürlich einiges 🙂

    Könnte vielleicht jemand mal nen kurzen source schreiben, der erklärt, wie man in einigen modis pixel in den Speicher schreibt?

    Danke!
    - healscar


Anmelden zum Antworten