OUT ?, ?
-
Ja, wär nicht schlecht, wenn du die Registerbelegungen mal auflisten könntest. Aber was genau machen die Register denn? Das selbe wie die der CPU?
Danke
- healscar
-
Ach ja, noch was ganz wichtiges. Was ist eigentlich dieser "Mode X"? Genaus so war es im code kommentiert:
OUT &H3C4, &H4: OUT &H3C5, &H6 'Set Mode X (unchained mode)
OUT &H3D4, &H14: OUT &H3D5, &H0
OUT &H3D4, &H17: OUT &H3D5, &HE3cya
- healscar
-
Ob das nun bei VGA genauso organisiert ist wie bei der CPU kann ich dir nicht sagen. Übrigens das wird beim Sound und aller anderen eingebauten perepherie genauso gemacht! Das ist digitale Schaltungstechnik (und zwar sehr komplexe). Zu C64-Zeiten (das ist auch bei den älteren Nintendo-Konsolen so) wurden diese Register in den realen Speicher gemappt!
Die Register:
Einzelregister: Lesen Schreiben
Miscellaneous Output Register 3CCh 3C2h
Input Status Register 0 3C2h
Input Status Register 1 3DAh
Indizierte Register: Index-Register Daten-Register
Cathod Ray Tube Controller (CRTC) 3D4h 3D5h
CRTC-Register 0: Horizontal Total
CRTC-Register 1: Horizontal Display End
CRTC-Register 2: Horizontal Blank Start
CRTC-Register 3: Horizontal Blank End
CRTC-Register 4: Horizontal Sync Start
CRTC-Register 5: Horizontal Sync End
CRTC-Register 6: Vertical Total
CRTC-Register 7: Overflow
CRTC-Register 8: Initial Row Address
CRTC-Register 9: Maximum Row Address
CRTC-Register 0Ah: Cursor Start-Zeile
CRTC-Register 0Bh: Cursor End-Zeile
CRTC-Register 0Ch: Linear Starting Address High
CRTC-Register 0Dh: Linear Starting Address Low
CRTC-Register 0Eh: Cursor Address High
CRTC-Register 0Fh: Cursor Address Low
CRTC-Register 10h: Vertical Sync Start
CRTC-Register 11h: Vertical Sync End
CRTC-Register 12h: Vertical Display End
CRTC-Register 13h: Row Offset
CRTC-Register 14h: Underline Location
CRTC-Register 15h: Vertical Blank Start
CRTC-Register 16h: Vertical Blank End
CRTC-Register 17h: CRTC Mode
CRTC-Register 18h: Line Compare (Split Screen)
Timing Sequencer (TS) 3C4h 3C5h
TS-Register 0: Synchroner Reset
TS-Register 1: TS Mode
TS-Register 2: Write Plane Mask
TS-Register 3: Font Select
TS-Register 4: Memory Mode
Graphics Data Controller (GDC) 3CEh 3CFh
GDC-Register 0: Set/Reset
GDC-Register 1: Enable Set/Reset
GDC-Register 2: Color Compare
GDC-Register 3: Function Select
GDC-Register 4: Read Plane Select
GDC-Register 5: GDC Mode
GDC-Register 6: Miscellaneous
GDC-Register 7: Color Care
GDC-Register 8: Bit Mask
Attribute Controller (ATC)
Schreibzugriffe: 3C0h → Index/Data-Flip-Flop
Lesezugriff auf Input Status Register 1 → Index-Mode
Schreibzugriff: Index auf 3C0h, anschließend Daten-Byte auf gleichen Port
Lesezugriff: Index geschrieben, 3C1h → Daten-Byte (3C0h → Index)
ATC-Register: Index/Data
ATC-Register 0 - F: Palette Ram
ATC-Register 10h: Mode Control
ATC-Register 11h: Overscan Color
ATC-Register 12h: Color Plane Enable
ATC-Register 13h: Horizontal Pixel Panning
ATC-Register 14h: Color Select
Digital to Analog Converter (DAC)
Pixel Mask 3C6h
Pixel Write Address 3C8h
Pixel Read Address 3C7h
Pixel Color Value 3C9h
DAC State 3C7h
Die einzelnen Bits noch aufzuschreiben überfordert mich gerade. Musst mal googlen! Sorry,
[ Dieser Beitrag wurde am 17.10.2002 um 14:07 Uhr von agrimm editiert. ]
-
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.htmlDa 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?
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!!