OUT ?, ?
-
Hi!
Ich habe mir den Sourcecode für eine DOS-Grafikanwendung mal angesehen und festgestellt, dass dort einige OUT Prozeduren ausgeführt werden. Ich liste sie erstmal hier auf:
out &h3c8, 0
out &h3c9, 0
out &h3c4, &h4
out &h3c5, &h6
out &h3d4, &h14
out &h3d5, &hE3Es wäre toll, wenn mir jemand den Zweck zu jedem OUT-Befehl erklären kann. Bisher kenne ich nur "OUT &h3c9, wert" (zum ändern der Grafik-Palette). Doch wohin wirt der Wert eigentlich geschickt? In den Speicher oder so??? Ich weiss nur, dass &h3c9 irgendein Port ist.
Gruß
- healscar
-
Hab leider mein EGA/VGA-Buch grad verliehen, sonst könnt ichs dir verraten. Also folgendes zu den Befehlen allgemein:
Sämtliche Komponenten des PCs kommunizieren mit der CPU über den Bus. Selbiger besteht aus ein paar Adressleitungen, ein paar Datenleitungen, und einigen Steuerleitungen. Wenn du z.B. einen Lesezugriff auf den Speicher machen willst, legst du die Steuerleitung RW (read/write) auf 0 für lesen, die Adresse auf den Adressbus, und wartest einen Taktzyklus (stark vereinfacht ;)). Der Speicher bemerkt, dass die Adresse ihm gehört (es könnte z.B. auch ein Stück Grafikspeicher sein, dann würde sich die Grafikkarte angesprochen fühlen) und legt den Inhalt der entsprechenden Speicherstellen auf den Bus. Soviel zum grundsätzlichen Mechanismus.
IN/OUT greifen auf "Ports" zu (der Name scheint historisch bedingt zu sein). Das unterscheidet sich im Prinzip vom Speicherzugriff nur darin, dass die Steuerleitung IO aktiviert wird, so daß jetzt der Speicher weghört und diverse andere Komponenten (Festplattencontroller, Interruptcontroller, Echtzeituhr, Einsteckkarten ...) im Rechner die Adresse auf dem Adressbuch mit ihren eigenen vergleichen und reagieren, falls sie übereinstimmt. Die Port-Adressen, die du aufzählst, gehören zur VGA-Karte (alle PC-Grafikkarten sind heute noch VGA-kompatibel, und daran wird sich vermutlich auch nichts ändern), und bewirken die Änderung irgendwelcher Registerinhalte. 3c9/3c8 waren soweit ich mich recht erinnere für den DAC zuständig, um dort Paletteneinstellungen vorzunehmen.Übrigens ist dein Code kein Assembler, sondern BASIC
Kannst ja mal auf nem Flohmarkt gucken, ob du ein älteres "PC Intern" (Version 2 oder 3) oder "Die EGA/VGA-Karte" findest ...
-
Hi healscar,
out &h3c8, 0 ; Farbe 0 ändern (DAC der VGA-Karte)
out &h3c9, 0 ; schreiben
out &h3c4, &h4 ; Time Sequencer (der VGA-Karte) Register 4
out &h3c5, &h6 ; Chain 4 - Odd/Even-Mode - Extended Memory (256k)
out &h3d4, &h14 ; CRTC (der VGA-Karte) Register $14 - Underline Location
out &h3d5, &hE3 ; Double-Word-Addressing - Linear Adress Count by 4CRTC - Cathod Ray Tube Controller (Damit kann man den Monitor kaputtmachen
)
Ich denke, daß das dein Programm den sog. ModeX einschaltet. Bin mir aber nicht sicher, da du zuwenig Code mitgegeben hast. Auf 3c9 musst du 3 Mal schreiben (RGB!!).
Der Out-Befehl ist für die CPU das gleiche wie ein Speicherzugriff. Dieser wird aber nicht an die Pins des Speichers gelegt, sonder an den Bus. Deine ganzen Befehle schreiben Werte in die Register der VGA-Karte, im direkten Weg.[ Dieser Beitrag wurde am 17.10.2002 um 10:10 Uhr von agrimm editiert. ]
-
Hey Super!
Eure Antworten sind echt ausführlich, klingen kompetent und das Beste - sie sind gut verständlich - DANKE!
Man merkt, dass in diesem Forum viele Hacker sind. Wie genau funktioniert dass den mit dem Bildschirm zerstören?
Sonst habe ich nachher nen Virus, der hübsche Grafiken ausgibt und ein Grafikprogramm, welches den Monitor in die Fritten haut
Was mich noch interessiert, sind diese Grafikkarten Register. Wieso hat eine Grafikkarte ein Register? Sind diese in etwa vergleichbar mit den CPU Registern? Welche Rechner Komponenten verfügen ausserdem noch über Register?
Der Code aus dem die Befehle stammen, ist tatsächlich ein Basiccode. Ich hätte nicht gedacht, dass man sie unterscheiden kann und dachte, das Thema würde am besten in die Assembler Ecke passen; denn ein OUT-Befehl steuert doch die Maschine - also: Maschinensprache
Gruß
- healscar
-
Veillecht sollte ich noch anmerken: Der source stammt von Ken Silverman; dem Programmierer der Build Engine, welche unter anderem Duke Nukem 3D "ist". Der Source ist zur Vereinfachung des Algorithmus gedacht.
-
Dafür gibt es das Protection-Bit, sperrt die Register 0 bis 7.
Das musst du erstmal löschen:
In normal asm:mov dx, 0x03d4 ; stimmt ja , wie peinlich out dx, 0x011 ; Register $11 mov dx, 0x03d5 in al, dx ; lesen xor al, %01111111 ; hab keinen Bock in hex umzurechnen (Bit 7 löschen) mov dx, 0x03d4 out dx, 0x011 mov dx, 0x03d5 out dx, al
Jetzt musst du wild irgendwelche Werte in die Register 0 bis 7 schreiben, vielleicht klappts !
Aber ohne diese Anweisungen kann nichts passieren.
Wenn du wissen willst wie die ganzen Register belegt sind sag bescheid!!Aber denk dran: Anderer Leute Monitor vorsätzlich kaputtmachen ist strafbar!!
[ Dieser Beitrag wurde am 17.10.2002 um 12:27 Uhr von agrimm editiert. ]
[ Dieser Beitrag wurde am 17.10.2002 um 12:29 Uhr von agrimm editiert. ]
[ Dieser Beitrag wurde am 17.10.2002 um 15:43 Uhr von agrimm editiert. ]
-
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 ...