PlanetSwitch Planet3DS PlanetVita PSP.de PlanetiPhone Classics Forum Handheld-Wiki

PGN-ID:[?] (Nicht eingeloggt)
Login
Registrieren
PlanetDS PlanetGameboy N-Page.de
portablegaming.de  

Zurück   portablegaming.de > Allgemeines Spielehandheldforum, GBA, N-Gage und Development > Development Abteilung


Development Abteilung Ihr wollt für euren Lieblingshandheld Spiele oder Tools entwickeln?
Bitte die Präfixe benutzen!

Antwort
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 15.02.2007, 17:42   #1
 
Benutzerbild von Dygera
 
Registriert seit: 07.02.2007
Ort: Hamburg
Alter: 33

Dygera wird schon bald berühmt werden

Dygera eine Nachricht über ICQ schicken Dygera eine Nachricht über MSN schicken
Standard Frage zu Registern/ allgemein

Hi, ich interessiere mich neuerdings für die GBA Programmierung. Ich hab schon viele Tutorials gelesen aber eine Grundsätzliche Frage wurde nie beantwortet. Was ich verstanden habe, ist, dass bestimmte gesetzte Bits an bestimmten Stellen in den Registern bestimmte Einstellungen aktivieren. Meine Frage betrifft das schreiben in diese Register. Normalerweise liest man in den Headers immer sowas wie: DISPCNT = 0x00400000 oder so ähnlich. Das DISPCNT ist der Pointername. Das danach ist also die Registeradresse. Was ich nciht verstehe ist warum da mal mehr und mal weniger Nullen am Ende stehen, würde ja immer ne andere Zahl ergeben (manchmal kommt auch sowas wie 0x04000:000 mit Doppelpunkt?). Außerdem ist das 0x04XXX ja eigentlich nur eine einfache Zahl. Das 0x heißt, es ist eine Hexzahl und alles was dahinter kommt ist die eigentliche Zahl. Woher weiß der GBA, dass mit dieser Zahl eine SPeicheradresse gemeint ist und nicht nur eine stinknormale Zahl? Wenn man was an dieses Register schickt, zb mit REG_DISPCNT=1, dann steht da doch strenggenommen nur hexzahl=1; vollkommen sinnlos.
Dygera ist offline   Mit Zitat antworten
Sponsored Links
Alt 15.02.2007, 20:50   #2
Moderator
 
Benutzerbild von europa
 
Registriert seit: 05.10.2003
Ort: Berlin
Spielt gerade: Eclipse Helios

europa ist ein Forengotteuropa ist ein Forengotteuropa ist ein Forengott
europa ist ein Forengotteuropa ist ein Forengotteuropa ist ein Forengotteuropa ist ein Forengotteuropa ist ein Forengotteuropa ist ein Forengotteuropa ist ein Forengotteuropa ist ein Forengott

europa eine Nachricht über ICQ schicken
Standard AW: Frage zu Registern/ allgemein

Du brauchst eine paar Grundlagen in Assembler, digitalen Zahlen (Binär, Hexadezimal) und Entscheidungsautomaten, wie z.B. die Turingmaschine.

Turingmaschine Turingmaschine

Ein Computer kann nicht zwischen einer Adresse oder Zahl unterscheiden, für diesen ist alles 0 und 1. Es ist der Kontext, worauf es ankommt. Führst Du einen Sprungbefehl aus, ist es eine Adresse. Machst Du Addition, ist es eine Zahl. Führst Du einen Sprungbefehl aus, aber übergibst irgendeine Zahl, hast Du ein Problem.

Speicherpointer verweisen auf irgendeinen Speicherplatz, den alle dann für eine Sache verwenden. Es gibt quasi ein Gebäude mit z.B. 3 Zimmern und ein Pointer ist nur ein Zeiger, das Aktion A in Zimmer 3 ausgeführt wird. Und das alle, die bei Aktion A mitmachen, ins Zimmer 3 gehen. Man kann aber den Zeiger für A auch auf Zimmer 1 umbiegen, vor beginnt der Aufgabe und falls das Zimmer 1 nicht schon belegt ist. Für manche Sachen (wie z.B. Bildschirm) sind feste Bereiche vorgesehen, deren Zeigerverbiegen keinen Sinn hat.

europa
__________________
"In der Informatik geht es genau so wenig um Computer, wie in der Astronomie um Teleskope" - Edsger W. Dijkstra
europa ist offline   Mit Zitat antworten
Alt 16.02.2007, 10:33   #3
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard AW: Frage zu Registern/ allgemein

Der GBA benutzt wie viele anderen System einen einzigen Adressraum fuer seine Register/Speicher/....

Das bedeutet soviel, dass z.B. fuer die Adressen 0x2000000 bis 0x203FFFF ein RAM liegt (also 256KByte), ab 0x4000000 einige Register (I/O Ports) fuer die Hardware.

Wenn du nun auf Adresse 0x2000000 (oder 0x2000004, ... ) schreibst gehen die Daten in das RAM, wenn du auf Adresse 0x4000000 schreibst wird eine interne Logik irgend was machen (z.B. Bildschirm anschalten,...) davon abhängigen was du geschrieben hast.

Diese Register sind fuer den GBA Dokumentiert ( Specifications )

Also wenn du z.B. 5 (ist ein Wert) in die (Adresse) 0x4000000 schreibst, aktivierst du z.B. Den 160x128 15Bit Grafikmodus.
goldmomo ist offline   Mit Zitat antworten
Alt 16.02.2007, 16:53   #4
 
Benutzerbild von Dygera
 
Registriert seit: 07.02.2007
Ort: Hamburg
Alter: 33

Dygera wird schon bald berühmt werden

Dygera eine Nachricht über ICQ schicken Dygera eine Nachricht über MSN schicken
Standard AW: Frage zu Registern/ allgemein

Zitat:
Zitat von europa Beitrag anzeigen
Ein Computer kann nicht zwischen einer Adresse oder Zahl unterscheiden, für diesen ist alles 0 und 1.
Da stimme ich voll und ganz zu.
Zitat:
Zitat von europa Beitrag anzeigen
Es ist der Kontext, worauf es ankommt. Führst Du einen Sprungbefehl aus, ist es eine Adresse. Machst Du Addition, ist es eine Zahl.
Wie unterscheidet sich ein Sprungbefehl von einer Zahl? Ist jede Zahl, die in Hexadezimaler Form geschrieben ist ein Sprungbefehl für den GBA? (Z.B. wenn ich etwas an Registerplatz 20 schicken will. In dezimaler Form: 20=1; (schwachsinn klar aber ich will damit mein Verstandnisproblem klarmachen) In hex Form: 0x14=1; //Geht das hier? Ist doch eigentlich egal ob man Pointername oder gleich die Adresse sagt?!?)
Zitat:
Zitat von europa Beitrag anzeigen
Speicherpointer verweisen auf irgendeinen Speicherplatz,
Ich glaube mir ist ein Licht aufgegangen. Ist meine letzte Bemerkung etwa falsch und es kommt auf den Pointer an? (Ich muss dazu sagen, pointer hatten wir nie in der Schule. Ich habe dazu nur einige Tuts überflogen und ich denke es sind quasi Referencen ohne Funktion. Richtig? Ist das vielleicht der Schlüssel, dass alle Zahlen Adressen sind, die mit einem Pointer verknüpft sind? (bezüglich "Speicherpointer": Sind das spezielle Pointer? Ich bin bisher davon ausgegangen, dass es nur eine Art Pointer gibt.)


EDIT (autom. Beitragszusammenführung) :

Zitat:
Zitat von goldmomo Beitrag anzeigen
Wenn du nun auf Adresse 0x2000000 (oder 0x2000004, ... ) schreibst gehen die Daten in das RAM, wenn du auf Adresse 0x4000000 schreibst wird eine interne Logik irgend was machen (z.B. Bildschirm anschalten,...) davon abhängigen was du geschrieben hast.
Ja wie die Register funktionieren habe ich verstanden. Die CPU "guckt" also alle Register durch und jedes Bit steht für eine bestimmte Einstellung. Was ich noch nicht verstanden habe ist, woran der GBA erkennt, dass eine Zahl jetzt eine Registeradresse ist und keine "Zahl". Ich habe eine neue Frage, die mich auch schon Tagelang beschäftigt: Es geht um die Pointerschreibweisen. Was ich bisher weiß, ist wie man Pointer deklariert (mit *), wie man sie einer Variablen zuordnet(mit &) und schließlich wie die Dereferenzierung funktioniert (*%PName%=%Wert%). In sogut wie jedem GBA_Programming Tutorial bin ich aber auf folgende Schreibweisen gestoßen: (u18*) 0x04000000 *(u18*) 0x04000000 Was ist das? Meiner Meinung nach wird hier kein Pointer deklariert und auch nicht dereferenziert. Außerdem taucht diese Klammer mit Typendefinition (u18 ist glaub ich unsigned short) und Stern auch gerne mal bei einer Dereferenzierung auf. Was macht diese Klammer?

Geändert von Dygera (16.02.2007 um 16:53 Uhr) Grund: Antwort auf eigenen Beitrag innerhalb von 24 Stunden!
Dygera ist offline   Mit Zitat antworten
Alt 18.02.2007, 13:18   #5
 
Benutzerbild von Dygera
 
Registriert seit: 07.02.2007
Ort: Hamburg
Alter: 33

Dygera wird schon bald berühmt werden

Dygera eine Nachricht über ICQ schicken Dygera eine Nachricht über MSN schicken
Standard AW: Frage zu Registern/ allgemein

Kann mir keiner helfen?
Dygera ist offline   Mit Zitat antworten
Alt 19.02.2007, 10:15   #6
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard AW: Frage zu Registern/ allgemein

Also eine Adresse und Wert sind natruelich Zahlen.
Aber wenn ich einen Wert in eine Adresse schreibe zeigt sich ja der Unterschied, es wird kein Wert ueber einen Adresse geschrieben (wuerde auch nicht gehen, da konstant), sondern ein Wert in den Inhalt einer Adresse.

Zu deinem C Pointer Problem.

bei Variablen ist es recht ein fach einen Pointer fuer sie zu erzeugen.
z.B.:

int bla = 7:
int *blaPointer;

blaPointer = &bla; // im pointer steht die adresse von bla
*blaPoiner = 2; // in die adresse welche in blaPointer steht wird 2 geschrieben

Genauso geht es fuer den GBA mit Registern

volatile unsigned int *pointer = ( unsigned int * ) 0x400000; // pointer auf 0x400000
*pointer = 1; // schreibe 1 in 0x400000

oder so

*((volatile unsigned int * ) 0x400000) = 1;

Geändert von goldmomo (19.02.2007 um 10:18 Uhr)
goldmomo ist offline   Mit Zitat antworten
Alt 19.02.2007, 16:48   #7
 
Benutzerbild von Dygera
 
Registriert seit: 07.02.2007
Ort: Hamburg
Alter: 33

Dygera wird schon bald berühmt werden

Dygera eine Nachricht über ICQ schicken Dygera eine Nachricht über MSN schicken
Standard AW: Frage zu Registern/ allgemein

Hi,
erstmal danke für die Antwort.
Mein Problem liegt eher in der C++ Syntax.

Den logischen Ablauf habe ich schon verstanden, mich verwirrt nur folgende Schreibweise:


Zitat:
Zitat von goldmomo Beitrag anzeigen
volatile unsigned int *pointer = ( unsigned int * ) 0x400000;

*((volatile unsigned int * ) 0x400000) = 1;
In der zweiten Zeile wird, so wie ich das sehe, ein Zwischenschritt gespart, indem die Deklaration gleichzeitig mit der Definition in einem Schritt gemacht wird. (so wie z.B. int c=0; richtig??)

Den ersteren Weg kann ich bis auf eines nachvollziehen; nämlich "( unsigned int * )" diese Klammer hier. Was tut sie?

In der zweiten Zeile vermisse ich den Pointernamen (wenn meine obere Theorie richtig ist).

Als letztes weiß ich nicht was das volatile macht. Ich habe darüber schon mal gegoogled aber ich habe nicht mehr rausbekommen, als dass das volatile dem Compiler sagen soll, dass die Variable (hier Register) acuh noch von anderer Stelle verändert werden kann. Wenn man ihm das nicht sagen würde, würde der Compiler versuchen etwas zu verbessern, was aber nach hinten losginge. (ist das ungefähr richtig??)
Dygera ist offline   Mit Zitat antworten
Alt 19.02.2007, 17:02   #8
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard AW: Frage zu Registern/ allgemein

Du kannst auch den Cast ( unsigned int * ) bei einigen Compilern weglassen.

volatile unsigned int *pointer = ( unsigned int * ) 0x400000;

Bei der zweiten Version wird halt gesagt

( unsigned int * ) 0x400000 ist ein Pointer
und *( ... ) = 1 ich will in den Inhalt der Adresse die im Pointers liegt reinschreiben.

Aber such im Wikipedia oder such C(++) Tutorials.

------------

Das volatile sagt den Compiler, dass er diese Variable nach aussen schreiben (auf io/register ) muss (also auch die cpu nicht Cachen) und nicht weg optimiert (je nach Anwendung). Das ist beim GBA relative egal, da er keinen CPU-Cache hat, aber auf anderen System muss man es verwenden.
goldmomo ist offline   Mit Zitat antworten
Antwort

  portablegaming.de > Allgemeines Spielehandheldforum, GBA, N-Gage und Development > Development Abteilung

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zockertreffen in NRW (Allgemein) ChrisC1 Zockertreffen Forum 26 30.10.2005 22:49
Britpop (britische Musik allgemein) Vivi Medien 20 14.02.2005 12:47
Olympia 2004 (allgemein) Tigerlilly Sonstiges 86 29.09.2004 15:47
finalfantasytactics - allgemein Konfurzius Final Fantasy Tactics (GBA) 18 12.09.2003 18:13
Tactics Ogre: TKoL -Allgemein- Dji_Cantos Tactics Ogre (GBA) 144 12.02.2003 13:07


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:58 Uhr.


Powered by vBulletin® Version 3.8.9 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0
Template-Modifikationen durch TMS
PortableGaming.de © bk 2000 - 2010

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231