Académique Documents
Professionnel Documents
Culture Documents
Game BoyMC
Manuel du processeur
Sources par : Pan d'Anthrox, GABY, Marat Fayzullin,
Pascal Felber, Paul Robson, Martin Korth, kOOPa, Bowser
Contenu:
Commandes en langage d'assemblage, minutages et opcodes, et tout
ce que vous avez toujours voulu savoir sur GB mais que vous aviez
peur de demander.
CE DOCUMENT EST IMPRIMÉ SUR DU PAPIER AU FORMAT DIN
A5 (148 mm x 210 mm) !
Remarque : Game BoyTM, Game Boy PocketTM, Super Game BoyTM et Game Boy
ColorTM sont des marques déposées de Nintendo CO., LTD. © 1989 à
1999 par Nintendo CO., LTD.
Version : 1.01 par DP
Machine Translated by Google
1. Avantpropos Manuel du processeur Game BoyTM
Table des matières
1. Avantpropos............................................4
2. Spécifications matérielles........................5 2.1. Vers l'avant :.......................................5 2.2.
Termes..................................................5 2.3. Spécifications du Game Boy..............6 2.4.
Processeur..............................................6 2.5. Carte mémoire..............................8 2.5.1.
Carte mémoire générale..................8 2.5.2. Écho de la RAM interne de 8 Ko.................9
2.5.3. E/S utilisateur..................................9 2.5.4. Emplacements de mémoire
réservés.................10 2.6. Types de cartouches.................................13 2.7. Modes
spéciaux.................................17 2.7.1. Séquence de mise sous tension..........17
2.7.2. Mode Arrêt..................................19 2.7.3. Mode basse consommation.................19
2.8. Vidéo..........................................22 2.8.1. Tuiles..........................................22
2.8.2. Lutins..................................25 2.8.3. Bogue de la RAM des sprites.................27
2.9. Son ..................................................28 2.10. Minuterie..................................30 2.11.
E/S série ..................................31 2.12. Interruptions.................................32 2.12.1.
Procédure d'interruption.................32 2.12.2. Descriptions des interruptions.................34
2.13. Registres spéciaux..................................35 2.13.1. Registres d'E/S..............35
Page 2 Version 1.01
Machine Translated by Google
Manuel du processeur Game BoyTM 1. Avantpropos
3. Vue d'ensemble des commandes de la Game Boy............61 3.1. Avant
propos..................................61 3.2. Registres du
CPU..................................61 3.2.1. Généralement..................................61
3.2.2. Registre des drapeaux..................62 3.2.3. Compteur de
programme..............63 3.2.4. Pointeur de pile..............................63
3.3. Commandes..................................65 3.3.1. Charges 8
bits.................................65 3.3.2. Chargements 16 bits..............76
3.3.3. ALU 8 bits.................................80 3.3.4. Arithmétique 16
bits..................90 3.3.5. Divers.................................94 3.3.6. Rotations
et décalages..................99 3.3.7. Opcodes de bits..............108 3.3.8.
Sauts..................................111 3.3.9. Appels..................................114
3.3.10. Redémarrages............................116 3.3.11.
Retours..................................117
4. Commandes Super Game Boy..................119 4.1. Avant
propos..................................119 4.2. Palettes..................................119
4.3. Frontière SGB..................................120 4.4. Fenêtre d'action
principale..............121 4.5. Commandes.................................122
5. Annexe A................................................134 5.1. Remarques sur
l'émulateur.............134 5.2. Chronogramme type.................................137
par DP Page 3
Machine Translated by Google
1. Avantpropos Manuel du processeur Game BoyTM
1. Avantpropos
Ce document a été conçu pour vous aider à programmer la Game Boy™
Classic, la Game Boy™ Pocket, la Super Game Boy™ et la Game Boy™
Color (bases vous aurez besoin de documents supplémentaires pour la
programmation spécifique à GBC). Il devait s'agir d'un manuel complet pour
commencer tout de suite à coder pour le matériel. Les documents se
composent de trois grandes parties.
Le premier est le 'GBSpec.txt' (également connu sous le nom de Pan
Document) de Pan of Anthrox, Marat Fayzullin, Pascal Felber, Paul
Robson, Martin Korth, kOOPa. On le trouvera au paragraphe 1.
Le second est un mélange de plusieurs documents de
'Game Boy Assembly Language Primer (GALP) V1.0' par GABY (GAmeBoY).
Il contient les opcodes, la durée et les drapeaux affectés par commande
ASM et le. Cela se trouve au paragraphe 2.
Le troisième est un résumé des spécifications et des commandes pour la
programmation spécifique de Nintendo Super Game Boy par kOOPa et
Bowser. Voir paragraphe 3.
Des informations sur la façon d'exécuter les programmes éprouvés
de votre émulateur sur une vraie Game Boy se trouvent dans l'annexe
(merci à kOOPa). En outre, un chronogramme d'une opération typique de
lecture et d'écriture sur le bus GB classique peut être trouvé ici (merci à
Philippe Pouliquen).
Sur la dernière page, une référence rapide des commandes ASM est
inclus.
Amusezvous!
DP
Page 4 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2. Spécifications matérielles
2. Spécifications matérielles
2.1. Avant:
Ce qui suit a été tapé à des fins d'information concernant le fonctionnement
interne de la machine de jeu portable connue sous le nom de Game Boy,
fabriquée et conçue par Nintendo Co., LTD. Cette information est présentée pour
informer un utilisateur sur le fonctionnement de sa Game Boy et sur ce qui la
fait "cocher". GameBoy est la propriété de Nintendo Co., LTD.
Toute référence à du matériel protégé par le droit d'auteur n'est pas présentée
pour un gain monétaire, mais à des fins éducatives et d'enseignement
supérieur.
2.2. Conditions
Go = GameBoy d'origine (GameBoy Classic)
EUR = GameBoy Pocket/GameBoy Light
GBC = Couleur GameBoy
SGB = Super GameBoy
par DP Page 5
Machine Translated by Google
2.3. Spécifications Game Boy Manuel du processeur Game Boy™
2.3. Spécifications Game Boy
ï CPU : 8 bits (similaire au processeur Z80.) ï RAM principale : 8K octets ï
RAM vidéo : 8K octets ï Taille de
l'écran 2,6" ï Résolution : 160x144
(20x18 tuiles) ï Max # de
sprites : 40 ï Max # sprites /ligne : 10 ï Taille max. du sprite :
8x16 ï Taille min. du sprite : 8x8 ï
Vitesse d'horloge : 4,194304 MHz
(4,295454 SGB, 4,194/8,388 MHz GBC)
ï Horiz Sync : 9198 KHz (9420 KHz
pour SGB) ï Vert Sync : 59,73 Hz (61,17 Hz
pour SGB) ï Son : 4 canaux avec son stéréo ï Alimentation :
DC6V 0,7W (DC3V 0,7W pour GB Pocket)
Les documents Nintendo décrivent la vitesse du processeur et des instructions en
cycles de machine tandis que ce document les décrit en cycles d'horloge. Voici la traduction :
1 cycle machine = 4 cycles d'horloge Go Vitesse CPU
NOP Instruction 1.05MHz 1 cycle 4.19MHz 4 cycles
Cycles de machines
Cycles d'horloge
2.4. Processeur
Le GameBoy utilise une puce informatique similaire à un Intel 8080. Il contient toutes les
instructions d'un 8080 sauf qu'il n'y a pas d'instructions d'échange. À bien des égards, le
processeur ressemble davantage au processeur Zilog Z80. Par rapport au Z80,
quelques instructions
Page 6 Version 1.01
Machine Translated by Google
Manuel du processeur Game BoyTM 2.4. Processeur
ont été ajoutés et certains ont été supprimés.
Les instructions suivantes sont ajoutées :
AJOUTER PS, nn ;nn = octet signé
ILD (HL),A ;Écrire A dans (HL) et incrémenter HL
LDD (HL),A ;Écrire A dans (HL) et décrémenter HL
ILD A,(HL) ;Écrire (HL) dans A et incrémenter HL
LDD A,(HL) ;Écrire (HL) dans A et décrémenter HL
LD A,($FF00+nn)
LD A,($FF00+C)
LD ($FF00+nn),A
LD ($FF00+C),A
LD (nnnn),SP
LD HL,SP+nn ;nn = octet signé
ARRÊT ; Arrêter le processeur et l'écran jusqu'à ce
que le bouton appuie
SWAP r ;Swap haut et bas quartets de r
Les instructions suivantes ont été supprimées :
Toute commande utilisant les registres IX ou IY.
Toutes les instructions IN/OUT.
Toutes les instructions d'échange.
Toutes les commandes précédées de ED (sauf RETI remappé).
Tous les sauts/appels/rets conditionnels sur parité/débordement et indicateur de
signe.
Les instructions suivantes ont des opcodes différents :
LD A,[nnnn]
LD [nnnn],A
RETI
par DP Page 7
Machine Translated by Google
2.5. Carte mémoire Manuel du processeur Game BoyTM
2.5. Carte mémoire
2.5.1. Carte mémoire générale
Registre d'activation d'interruption
FFFF
RAM interne
FF80
Vide mais inutilisable pour les E/S
FF4C
Ports d'E/S
FF00
Vide mais inutilisable pour les E/S
FEA0
Mémoire d'attribution de sprite (OAM)
FE00
Écho de 8 Ko de RAM interne
E000
8 Ko de RAM interne
Banque de RAM commutable
C000 8kB
A000 8 Ko de RAM vidéo
8000 |
Banque de ROM commutable
de 16 Ko 4000 |= 32 Ko Cartrigbe Banque de
ROM de 16 Ko #0 | 0000
* REMARQUE : b = bit, B = octet
Page 8 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.5.2. Écho de 8 Ko de RAM interne
2.5.2. Écho de 8 Ko de RAM interne
Les adresses E000FE00 semblent accéder à la RAM interne de la même
manière que C000DE00. (Par exemple, si vous écrivez un octet à l'adresse E000,
il apparaîtra à C000 et E000.
De même, l'écriture d'un octet dans C000 apparaîtra à C000 et E000.)
2.5.3. E/S utilisateur
Il n'y a pas d'espaces vides dans la carte mémoire pour la mise en
œuvre des ports d'entrée, à l'exception de la zone de banque de RAM commutable
(ce n'est pas une option sur la Super Smart Card car sa banque de RAM est
toujours activée). Un port de sortie uniquement peut être implémenté n'importe
où entre A000 et FDFF. S'il est implémenté dans une zone RAM, il faut veiller à
utiliser une zone de RAM non utilisée pour autre chose. (FE00 et supérieur
ne peuvent pas être utilisés car le CPU ne génère pas de /WR externe pour
ces emplacements.)
Si vous avez un chariot avec un MBC1, une ROM de 4 Mbit ou moins
et une RAM de 8 Ko ou moins (ou pas de RAM), vous pouvez utiliser les
broches 6 et 7 du MBC1 pour 2 broches de sortie numérique à toutes fins que
vous souhaitez. Pour les utiliser, vous devez d'abord mettre le MBC1 en
mode 4MbitROM/32KbyteRAM en écrivant 01 à 6000. Les deux bits les moins
significatifs que vous écrivez à 4000 seront alors sortis sur ces broches.
par DP Page 9
Machine Translated by Google
2.5.4. Emplacements de mémoire réservés Manuel du processeur Game BoyTM
2.5.4. Emplacements de mémoire réservés
0000 Redémarrez l'adresse $00
(RST $00 appelle cette adresse.)
0008 Redémarrez l'adresse $08
(RST $08 appelle cette adresse.)
0010 Restart $10 Address (RST $10
appelle cette adresse.)
0018 Redémarrez l'adresse $18
(RST $18 appelle cette adresse.)
0020 Restart $20 Address (RST $20
appelle cette adresse.)
0028 Redémarrez l'adresse $28
(RST $28 appelle cette adresse.)
0030 Restart $30 Address (RST $30
appelle cette adresse.)
0038 Redémarrez l'adresse $38
(RST $38 appelle cette adresse.)
0040 Adresse de début d'interruption verticale vierge
0048 Adresse de début d'interruption d'état LCDC
0050 Adresse de début d'interruption de dépassement de temporisateur
0058 Interruption de fin de transfert en série
Adresse de départ
0060 Haut à bas de l'interruption P10P13
Adresse de départ
Une zone d'information interne est située à 0100014F dans chaque cartouche. Il contient
les valeurs suivantes :
01000103 Il s'agit du point de début d'exécution du code dans un
Chariot. Habituellement, il y a une instruction NOP et une
instruction JP ici, mais pas toujours.
Page 10 Version 1.01
Machine Translated by Google
Manuel du processeur Game BoyTM 2.5.4. Mémoire réservée
Emplacements
01040133 Défilement graphique Nintendo :
CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D 00 08 11 1F 88 89 00
0E DC CC 6E E6 DD DD D9 99 BB BB 67 63 6E 0E EC CC DD DC 99 9F BB
B9 33 3E ( PROGRAMME NE FONCTIONNERA PAS SI MODIFIÉ !!!)
01340142 Titre du jeu en MAJUSCULES ASCII. Si ça
contient moins de 16 caractères, les octets restants sont
remplis de 00.
0143 80 $ = Go de couleur, 00 $ ou autre = pas de Go de couleur
0144 Chiffre hexadécimal Ascii, quartet haut du code du titulaire de
licence (nouveau).
0145 Chiffre hexadécimal Ascii, petit quartet du code du titulaire de
licence (nouveau). (Il s'agit normalement de 00 $ si [$014B]
<> 33 $.)
0146 Indicateur GB/SGB (00 = GameBoy, 03 = fonctions Super GameBoy)
(Les fonctions Super GameBoy ne fonctionneront pas si
<> $03.) 0147
Type de cartouche : 0ROM UNIQUEMENT
1ROM+MBC1 12ROM+MBC3+RAM
2 13ROM+MBC3+RAM+BATTERIE
ROM+MBC1+RAM 3 19ROM+MBC5
ROM+MBC1+RAM+BATT 5 1AROM+MBC5+RAM
ROM+MBC2 6 1BROM+MBC5+RAM+BATTERIE
ROM+MBC2+BATTERIE 8 1CROM+MBC5+RUMBLE
ROM+RAM 9 1DROM+MBC5+RUMBLE+SRAM
ROM+RAM+BATTERIE B 1EROM+MBC5+RUMBLE+SRAM+BATT
ROM+MMM01 C Appareil photo de poche 1F
ROM+MMM01+SRAM D FDBandai TAMA5
ROM+MMM01+SRAM+BATT FE Hudson HuC3
par DP Page 11
Machine Translated by Google
2.5.4. Emplacements de mémoire réservés Manuel du processeur Game BoyTM
FROM+MBC3+TIMER+BATT FF Hudson HuC1
10ROM+MBC3+MINUTERIE+RAM+BATT
11ROM+MBC3
0148 Taille ROM :
0 256Kbit = 32KByte = 2 banques 1 512Kbit =
64KByte = 4 banques 2 1Mbit = 128KByte = 8 banques
3 2Mbit = 256KByte = 16 banques 4 4Mbit = 512KByte
= 32 banques 5 8Mbit = 1MByte = 64 banques 6
16Mbit = 2MByte = 128 banques $52 9Mbit = 1.1MByte
= 72 banques $53 10Mbit = 1.2MByte = 80 banques
$54 12Mbit = 1.5MByte = 96 banques
0149 Taille de la RAM :
0 Aucun 1
16kBit = 2kB = 1 banc 2 64kBit = 8kB = 1
banc 3 256kBit = 32kB = 4 bancs 4
1MBit =128kB =16 banques
014A Code destinataire :
0 Japonais
1 Non japonais
014B Code du titulaire (ancien) : 33
Vérifiez 0144/0145 pour le code du titulaire.
79 Accolade A4
Konami (la
fonction Super GameBoy ne fonctionnera pas si <> $33.)
014C Numéro de version de la ROM du masque (généralement 00 $)
Page 12 Version 1.01
Machine Translated by Google
Manuel du processeur Game BoyTM 2.5.4. Mémoire réservée
Emplacements
014D Vérification complémentaire (LE
PROGRAMME NE FONCTIONNERA PAS SUR GB SI CE N'EST PAS CORRECT !!!)
(Il fonctionnera sur Super GB, cependant, s'il est
incorrect.)
014E014F Somme de contrôle (octet supérieur en premier) produite par
en ajoutant tous les octets d'une cartouche à l'exception de
deux octets de somme de contrôle et en prenant deux
octets inférieurs du résultat. (GameBoy ignore cette valeur.)
2.6. Types de cartouches
Les éléments suivants définissent l'octet à l'emplacement du panier 0147 :
ï ROM UNIQUEMENT
Il s'agit d'une ROM de 32 Ko (256 Ko) et occupe 00007FFF.
ï MBC1 (contrôleur de banque de mémoire 1)
MBC1 a deux modes de mémoire maximum différents : 16 Mbit
ROM/8 Ko de RAM ou 4 Mbit ROM/32 Ko de RAM.
Le MBC1 utilise par défaut le mode 16Mbit ROM/8KByte RAM à la
mise sous tension. L'écriture d'une valeur (XXXXXXXS X = Indifférent,
S = Sélection du modèle de mémoire) dans la zone 60007FFF
sélectionnera le modèle de mémoire à utiliser. S = 0 sélectionne le mode
16/8. S = 1 sélectionne le mode 4/32.
L'écriture d'une valeur (XXXBBBBB X = ne s'en soucie pas, B = bits
de sélection de banque) dans la zone 20003FFF sélectionnera une
banque ROM appropriée à 40007FFF. Les valeurs 0 et 1 font la même
chose et pointent vers la banque ROM 1.
par DP Page 13
Machine Translated by Google
2.6. Types de cartouches Manuel du processeur Game BoyTM
La banque Rom 0 n'est pas accessible à partir de 40007FFF et ne peut être lue
qu'à partir de 00003FFF.
Si le modèle de mémoire est réglé sur 4/32 :
L'écriture d'une valeur (XXXXXXBB X = Indifférent, B = bits de sélection
de banque) dans la zone 40005FFF sélectionnera une banque de RAM
appropriée à A000C000. Avant de pouvoir lire ou écrire dans une banque
de RAM, vous devez l'activer en écrivant un XXXX1010 dans la zone
00001FFF*. Pour désactiver les opérations de banque de RAM, écrivez
n'importe quelle valeur sauf XXXX1010 dans la zone 00001FFF. La
désactivation d'une banque de RAM protège probablement cette banque des
fausses écritures lors de la mise hors tension de la GameBoy.
(REMARQUE : Nintendo suggère des valeurs de 0 $ pour activer et de 00 $
pour désactiver la banque de RAM !)
Si le modèle de mémoire est réglé sur le mode 16/8 :
L'écriture d'une valeur (XXXXXXBB X = Indifférent, B = bits de sélection
de banque) dans la zone 40005FFF définira les deux lignes d'adresse ROM
les plus significatives.
* REMARQUE : La Super Smart Card ne nécessite pas cette opération car
sa banque de RAM est TOUJOURS activée.
Incluez quand même cette opération pour permettre à votre code de
fonctionner avec les deux.
ï MBC2 (Memory Bank Controller 2) : Ce contrôleur
de mémoire fonctionne un peu comme le contrôleur MBC1 avec les
exceptions suivantes : MBC2 fonctionnera avec des tailles de
ROM jusqu'à 2Mbit.
L'écriture d'une valeur (XXXXBBBB X = ne s'en soucie pas, B = bits de
sélection de banque) dans la zone 20003FFF sélectionnera une banque
ROM appropriée à 40007FFF.
La commutation de RAM n'est pas fournie. Contrairement au MBC1 qui
utilise une RAM externe, le MBC2 possède 512 x 4 bits de
Page 14 Version 1.01
Machine Translated by Google
Manuel du processeur Game BoyTM 2.6. Types de cartouches
RAM qui se trouve dans le contrôleur luimême. Cependant, il nécessite
toujours une batterie externe pour enregistrer les données pendant la mise
hors tension.
Le bit le moins significatif de l'octet d'adresse supérieur doit être zéro
pour activer/désactiver la RAM du chariot. Par exemple, les adresses
suivantes peuvent être utilisées pour activer/désactiver la RAM du
chariot : 000000FF, 020002FF,
040004FF, ..., activer/désactiver est 000000FF. La 1E001EFF.
plage d'adresses suggérée à utiliser pour la RAM MBC2 Le bit le moins
significatif de l'octet d'adresse supérieur
doit être un pour sélectionner une banque ROM. Par exemple, les
adresses suivantes peuvent être utilisées pour sélectionner une banque ROM :
210021FF, 230023FF, 250025FF, ..., 3FFF. La plage d'adresses suggérée à
utiliser pour la sélection de banque de ROM MBC2 est 210021FF. 3F00
ï MBC3 (contrôleur de banque de mémoire 3) : ce
contrôleur est similaire au MBC1, sauf qu'il accède à tous les 16 mbits
de ROM sans nécessiter d'écriture dans la zone 40005FFF.
L'écriture d'une valeur (XBBBBBBB X = Indifférent, B = bits de sélection
de banque) dans la zone 20003FFF sélectionnera une banque ROM
appropriée à 40007FFF.
En outre, ce MBC dispose d'une horloge en temps réel (RTC) intégrée,
sauvegardée par batterie, que l'on ne trouve dans aucun autre MBC. Certains
chariots MBC3 ne le supportent pas (version WarioLand II non couleur)
mais certains le font (Harvest Moon/version japonaise).
ï MBC5 (Memory Bank Controller 5): Ce contrôleur
est le premier MBC qui est garanti pour fonctionner en mode double vitesse
GameBoy Color, mais il semble que les autres MBC fonctionnent également
bien en mode GBC double vitesse.
par DP Page 15
Machine Translated by Google
2.6. Types de cartouches Manuel du processeur Game BoyTM
Il est similaire au MBC3 (mais pas de RTC) mais peut accéder jusqu'à
64 Mbits de ROM et jusqu'à 1 Mbit de RAM.
Les 8 bits inférieurs de la sélection de banque ROM 9 bits sont écrits dans
la zone 20002FFF tandis que le bit supérieur est écrit dans le bit le moins
significatif de la zone 30003FFF.
L'écriture d'une valeur (XXXXBBBB X = Indifférent, B = bits de sélection
de banque) dans la zone 40005FFF sélectionnera une banque de RAM
appropriée à A000BFFF si le chariot contient de la RAM. Les tailles de
RAM sont de 64kbit, 256kbit et 1mbit.
De plus, c'est le premier MBC qui autorise la banque rom 0
pour apparaître dans la gamme 40007FFF en écrivant 000 $ à la sélection
de la banque rom.
ï Rumble Carts : les
chariots Rumble utilisent un contrôleur de banque de mémoire MBC5.
Les chariots Rumble ne peuvent avoir que jusqu'à 256 kbits de RAM.
La ligne d'adresse RAM la plus élevée qui autorise 1 Mbit de RAM sur les
chariots sans grondement MBC5 est utilisée comme moteur marche/arrêt
pour le chariot de grondement.
L'écriture d'une valeur (XXXXMBBB X = Indifférent, M = moteur, B = bits
de sélection de banque) dans la zone 40005FFF sélectionnera une banque
de RAM appropriée à A000BFFF si le chariot contient de la RAM. Les
tailles de RAM sont de 64kbit ou 256kbits. Pour allumer le moteur de
grondement, réglez M = 1, M = 0 l'éteint.
ï HuC1 (Banque Mémoire / Contrôleur Infrarouge):
Ce contrôleur fabriqué par Hudson Soft semble être très similaire à un MBC1
à la différence principale qu'il prend en charge l'entrée/sortie LED infrarouge.
Le chariot japonais "Fighting Phoenix" (nom interne du chariot : SUPER B
DAMAN) est connu pour contenir cette puce.
Page 16 Version 1.01
Machine Translated by Google
Manuel du processeur Game BoyTM 2.7. Mode spécial
2.7. Mode spécial
2.7.1. Séquence de mise sous tension
Lorsque la GameBoy est mise sous tension, un programme de 256 octets
commençant à l'emplacement mémoire 0 est exécuté. Ce programme
est situé dans une ROM à l'intérieur du GameBoy. La première chose que
fait le programme est de lire les emplacements des cartouches de 104 $
à 133 $ et de placer ce graphique d'un logo Nintendo sur l'écran en haut. Cette
image défile ensuite jusqu'à ce qu'elle soit au milieu de l'écran. Deux notes
de musique sont alors jouées sur le hautparleur interne. Encore une
fois, les emplacements de cartouche $104 à $133 sont lus mais cette
fois ils sont comparés à une table dans la rom interne.
Si un octet ne se compare pas, alors le GameBoy arrête de comparer les
octets et arrête simplement toutes les opérations.
Poche Go & Go :
Ensuite, le GameBoy commence à ajouter tous les octets de la
cartouche de 134 $ à 14 d$. Une valeur de 25 décimales est ajoutée à
ce total. Si l'octet le moins significatif du résultat n'est pas un
zéro, la GameBoy cessera de faire quoi que ce soit.
Super GB :
même si le GB et le GBP vérifient les emplacements de
mémoire de 134 $ à 14 d$, le SGB ne le fait pas.
Si les vérifications cidessus réussissent, la ROM interne est désactivée
et l'exécution du programme de la cartouche commence à l'emplacement
$100 avec les valeurs de registre suivantes :
AF=$01GB/SGB, $FFGBP, $11GBC
F =$B0
par DP Page 17
Machine Translated by Google
2.7.1. Séquence de mise sous tension Manuel du processeur Game BoyTM
BC=$0013
DE=$00D8
HL=$014D
Pointeur de pile=$FFFE
[$FF05] = $00 ; TIMA
[$FF06] = $00 ; TMA
[$FF07] = $00 ; TAC
[$FF10] = $80 ; NR10
[$FF11] = $BF ; NR11
[$FF12] = $F3 ; NR12
[$FF14] = $BF ; NR14
[$FF16] = $3F ; NR21
[$FF17] = $00 ; NR22
[$FF19] = $BF ; NR24
[$FF1A] = $7F ; NR30
[$FF1B] = $FF ; NR31
[$FF1C] = $9F ; NR32
[$FF1E] = $BF ; NR33
[$FF20] = $FF ; NR41
[$FF21] = $00 ; NR42
[$FF22] = $00 ; NR43
[$FF23] = $BF ; NR30
[$FF24] = 77$ ; NR50
[$FF25] = $F3 ; NR51
[$FF26] = $F1GB, $F0SGB ; NR52
[$FF40] = $91 ; LLCM
[$FF42] = $00 ; SCY
[$FF43] = $00 ; SCX
[$FF45] = $00 ; LYC
[$FF47] = $FC ; BGP
[$FF48] = $FF ; OBP0
[$FF49] = $FF ; OBP1
[$FF4A] = $00 ; Wyoming
[$FF4B] = $00 ; WX
[$FFFF] = $00 ; C'EST À DIRE
Page 18 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.7.1. Séquence de mise sous tension
Ce n'est pas une bonne idée de supposer que les valeurs cidessus
existeront toujours. Une version ultérieure de GameBoy pourrait contenir
des valeurs différentes de cellesci lors de la réinitialisation.
Définissez toujours ces registres sur la réinitialisation plutôt que de
supposer qu'ils sont comme cidessus.
Veuillez noter que la RAM interne du GameBoy à la mise sous tension
contient des données aléatoires. Tous les émulateurs GameBoy ont
tendance à définir toute la RAM sur une valeur de 00 $ à l'entrée.
Cart RAM la première fois qu'il est accédé sur un vrai GameBoy contient
des données aléatoires. Il ne contiendra des données connues que si le
code GameBoy l'initialise à une certaine valeur.
2.7.2. Mode d'arrêt
La commande STOP arrête le processeur et l'écran GameBoy
jusqu'à ce qu'un bouton soit enfoncé. L'écran GB et GBP devient
blanc avec une seule ligne horizontale sombre. L'écran GBC
devient noir.
2.7.3. Mode basse consommation
Il est recommandé d'utiliser l'instruction HALT autant que possible pour
réduire la consommation d'énergie et prolonger la durée de vie des batteries.
Cette commande arrête l'horloge système en réduisant la consommation
d'énergie du CPU et de la ROM.
Le CPU restera suspendu jusqu'à ce qu'une interruption se produise, à
quel point l'interruption est traitée, puis l'instruction suivant immédiatement
l'ARRÊT
par DP Page 19
Machine Translated by Google
2.7.3. Mode basse consommation Manuel du processeur Game Boy™
est exécuté. Si les interruptions sont désactivées (DI), l'arrêt ne
suspend pas l'opération, mais le compteur de programme arrête
de compter pour une instruction sur le GB, le GBP et le
SGB, comme mentionné cidessous.
Selon le temps CPU requis par un jeu, l'instruction HALT peut prolonger
la durée de vie de la batterie de 5 à 50% ou éventuellement plus.
AVERTISSEMENT : L'instruction qui suit immédiatement l'instruction
HALT est « ignorée » lorsque les interruptions sont désactivées
(DI) sur le GB, le GBP et le SGB. Par conséquent, mettez toujours
un NOP après l'instruction HALT. Ce saut d'instruction ne se produit
pas lorsque les interruptions sont activées (EI).
Ce "saut" ne semble pas se produire sur la GameBoy Color,
même en mode GB normal. (143 $ = 00 $)
EXEMPLES de Martin Korth qui a documenté ceci
problème :
(en supposant que les interruptions sont désactivées pour tous les exemples)
1) Ce code provoque l'incrémentation du registre 'a'
DEUX FOIS. 76 halte
3C inc a
2) L'exemple suivant est un peu plus difficile.
Le code suivant 76 stop
FA 34 12 ld a,(1234)
est effectivement exécuté comme
76 arrêt
Page 20 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.7.3. Mode basse consommation
FA FA 34 ld a,(34FA) 12 ld (de),a
3) Enfin un effet secondaire intéressant stop stop
76
76
Cette combinaison bloque le processeur.
Le premier HALT provoque la répétition du second HALT, ce
qui entraîne donc la répétition de la commande suivante (= elle
même) encore et encore.
Placer un NOP entre les deux arrêts entraînerait la répétition du NOP une
fois, le deuxième HALT ne verrouillerait pas le processeur.
Vous trouverez cidessous un code suggéré pour les programmes Game Boy :
**** Boucle de jeu principale **** ;
Principal:
arrêt ; arrêter l'horloge système ;
revenir de halte quand ;
interrompu ; (Voir
non AVERTISSEMENT cidessus.)
ld a,(VblnkFlag)
ou un ; Interruption VBlanc ?
jr z, principal ; Non, un autre ;
interrompre
xor un
ld (VblnkFlag),a ; Effacer le drapeau VBlank
jr Principal
par DP Page 21
Machine Translated by Google
2.7.3. Mode basse consommation Manuel du processeur Game Boy™
**** Routine d'interruption VBlank **** ;
Vblnk :
pousser af
pousser bc
pousser de
pousser hl
ld un,1
ld (VblnkFlag),a
pop hl
pop de
pop bc
pop af
reti
2.8. Vidéo
2.8.1. Carrelage
Le tampon d'écran principal GameBoy (arrièreplan) se compose de 256x256 pixels
ou de 32x32 tuiles (8x8 pixels chacune).
Seuls 160x144 pixels peuvent être affichés à l'écran.
Les registres SCROLLX et SCROLLY contiennent les coordonnées du fond à afficher
dans le coin supérieur gauche de l'écran. L'arrièreplan s'enroule autour de l'écran (c'est
àdire qu'une partie de celuici sort de l'écran, il apparaît sur le côté opposé.)
Une zone de VRAM appelée Background Tile Map contient le nombre de tuiles à
afficher. Il est organisé en 32 lignes de 32 octets chacune. Chaque octet contient un
Page 22 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.8.1. Carrelage
numéro d'une vignette à afficher. Les motifs de tuiles sont tirés du tableau
de données de tuiles situé soit à 80008FFF ou à 880097FF. Dans le
premier cas, les motifs sont numérotés avec des nombres non signés de 0 à
255 (c'estàdire que le motif n° 0 se trouve à l'adresse $8000). Dans le second
cas, les motifs ont des nombres signés de 128 à 127 (c'estàdire que le motif
n° 0 se trouve à l'adresse $9000). L'adresse Tile Data Table pour l'arrière
plan peut être sélectionnée via le registre LCDC.
Outre l'arrièreplan, il existe également une "fenêtre" recouvrant
l'arrièreplan. La fenêtre n'est pas déroulante, c'estàdire qu'elle
est toujours affichée à partir de son coin supérieur gauche. L'emplacement
d'une fenêtre sur l'écran peut être ajusté via les registres WNDPOSX et
WNDPOSY. Les coordonnées d'écran du coin supérieur gauche
d'une fenêtre sont WNDPOSX7,WNDPOSY. Les numéros de mosaïque de
la fenêtre sont stockés dans la table de données de mosaïque. Aucun des
carreaux de fenêtres n'est jamais transparent. L'arrièreplan et la fenêtre
partagent la même table de données de mosaïque.
L'arrièreplan et la fenêtre peuvent être désactivés ou activés séparément via
des bits dans le registre LCDC.
Si la fenêtre est utilisée et qu'une interruption de ligne de balayage la
désactive (soit en écrivant dans LCDC, soit en réglant WX > 166) et qu'une
interruption de ligne de balayage un peu plus tard l'active, la fenêtre réapparaîtra
à l'écran à la position exacte de la fenêtre où il s'est arrêté plus tôt. Ainsi,
même s'il n'y a que 16 lignes de graphiques utiles dans la fenêtre, vous
pourrez afficher les 8 premières lignes en haut de l'écran et les 8 lignes
suivantes en bas si vous le souhaitez.
par DP Page 23
Machine Translated by Google
2.8.1. Carrelage Manuel du processeur Game Boy™
WX peut être modifié pendant une interruption de ligne de balayage (pour
provoquer un effet de distorsion graphique ou pour désactiver la fenêtre
(WX>166) ) mais les modifications apportées à WY ne sont pas
dynamiques et ne seront remarquées qu'au prochain rafraîchissement de
l'écran.
Les images de tuiles sont stockées dans les tables de motifs de
tuiles. Chaque image 8x8 occupe 16 octets, où chaque 2 octets représente une
ligne :
Tuile: Image:
.33333.. .33333.. > 01111100 > $7C 01111100
22...22. > $7C 22...22. >
11...11. 00000000 > $00 11000110 > $C6
2222222. < chiffres 11...11. > 11000110
33...33. représentent 22...22. > $C6 00000000 > $00 2222222. >
couleur 11...11. Nombres 00000000 > $00
11111110 > $FE 33...33. > 11000110
........ > $C6 11000110 >
$C6 22...22. > 00000000 > $00
11000110 > $C6
11...11. > 11000110 > $C6 00000000
> $00 > 00000000
> $00 00000000 > $00
........
Comme il a été dit précédemment, il existe deux tables de modèles de
tuiles à 80008FFF et à 880097FF. Le premier peut être utilisé pour les sprites,
l'arrièreplan et l'affichage de la fenêtre. Ses tuiles sont numérotées de
0 à 255.
La deuxième table peut être utilisée pour le fond et l'affichage de la fenêtre
et ses tuiles sont numérotées de 128 à 127.
Page 24 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.8.2. Lutins
2.8.2. Lutins
Le contrôleur vidéo GameBoy peut afficher jusqu'à 40 sprites en 8x8 ou
en 8x16 pixels. En raison d'une limitation matérielle, seuls
dix sprites peuvent être affichés par ligne de balayage. Les
motifs de sprite ont le même format que les tuiles, mais ils sont tirés du
tableau des motifs de sprite situé à 80008FFF et ont une numérotation
non signée. Les attributs de sprite résident dans la table d'attributs de
sprite (OAM Object Attribute Memory) à $FE00FE9F. OAM est
divisé en 40 blocs de 4 octets dont chacun correspond à un sprite.
En mode sprite 8x16, le bit le moins significatif du numéro de modèle
de sprite est ignoré et traité comme 0.
Lorsque des sprites avec des valeurs de coordonnées x
différentes se chevauchent, celui avec la plus petite coordonnée x (plus
proche de la gauche) aura la priorité et apparaîtra audessus de tous
les autres.
Lorsque des sprites avec les mêmes valeurs de coordonnées
x se chevauchent, ils ont la priorité selon l'ordre du tableau.
(c'estàdire $FE00 le plus élevé, $FE04 le plus élevé suivant, etc.)
Veuillez noter que Sprite X=0, Y=0 cache un sprite. Pour afficher un
sprite, utilisez les formules suivantes :
SpriteScreenPositionX (Coin supérieur gauche du sprite)
= SpriteX 8
SpriteScreenPositionY (Coin supérieur gauche du sprite)
= SpriteY 16
par DP Page 25
Machine Translated by Google
2.8.2. Lutins Manuel du processeur Game Boy™
Pour afficher un sprite dans le coin supérieur gauche de l'écran, définissez
le sprite X=8, Y=16.
Seuls 10 sprites peuvent être affichés sur une même ligne.
Lorsque cette limite est dépassée, les sprites de priorité inférieure
(priorités listées cidessus) ne seront pas affichés.
Pour empêcher les sprites inutilisés d'affecter les sprites à l'écran, définissez
leur coordonnée Y sur Y = 0 ou Y => 144 + 16. Le simple fait de
définir la coordonnée X sur X = 0 ou X => 160 + 8 sur un sprite le
masquera, mais cela affectera toujours les autres sprites partageant les
mêmes lignes.
Les blocs ont le format suivant :
Byte0 Position Y sur l'écran
Byte1 Position X sur l'écran
Byte2 Numéro de modèle 0255 (contrairement à certaines tuiles
nombres, les numéros de motif de sprite ne sont pas signés.
LSB est ignoré (traité comme 0) en mode 8x16.)
Indicateurs d'octet 3 :
Priorité Bit7 Si ce
bit est défini sur 0, le sprite est affiché audessus
de l'arrièreplan et de la fenêtre.
Si ce bit est défini sur 1, le sprite sera caché derrière
les couleurs 1, 2 et 3 de l'arrièreplan et de la fenêtre.
(Sprite ne prévaut que sur la couleur 0 de BG & win.)
Bit6 Y flip Le
motif de Sprite est inversé verticalement si ce bit est
défini sur 1.
Le motif Bit5 X
flip Sprite est inversé horizontalement si ce bit est
défini sur 1.
Page 26 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.8.2. Lutins
Numéro de palette Bit4
Les couleurs des sprites sont extraites de OBJ1PAL si ce bit est
mis à 1 et de OBJ0PAL sinon.
2.8.3. Bogue de la RAM des sprites
Il existe une faille dans le matériel GameBoy qui provoque l'écriture de corbeille
dans la RAM OAM si les commandes suivantes sont utilisées alors que leur
contenu 16 bits est compris entre $FE00 et $FEFF :
inc xx déc (xx = bc,de ou hl)
xx
ldi a,(hl) ldd a,
(hl)
ldi (hl),a ldd (hl),a
Seuls les sprites 1 & 2 ($FE00 & $FE04) ne sont pas concernés par ces instructions.
par DP Page 27
Machine Translated by Google
2.9. Son Manuel du processeur Game Boy™
2.9. Son
Deux canaux audio sont connectés aux bornes de sortie SO1 et SO2. Il y
a également une borne d'entrée Vin connectée à la cartouche. Il peut être
acheminé vers l'une ou l'autre des deux bornes de sortie. Les circuits
GameBoy permettent de produire du son de quatre manières différentes :
Modèles d'ondes quadrangulaires avec fonctions de balayage et
d'enveloppe. Modèles d'ondes quadrangulaires avec fonctions
d'enveloppe. Modèles d'ondes volontaires à partir de la RAM d'ondes.
Bruit blanc avec une fonction d'enveloppe.
Ces quatre sons peuvent être contrôlés indépendamment puis mixés
séparément pour chacune des bornes de sortie.
Les registres sonores peuvent être réglés à tout moment pendant
la production du son.
Lors de la définition de la valeur initiale de l'enveloppe et du redémarrage
du compteur de longueur, définissez le drapeau initial sur 1 et initialisez les
données.
Dans les situations suivantes, le drapeau Sound ON est réinitialisé et la
sortie audio s'arrête :
1. Lorsque la sortie du son est arrêtée par la longueur
comptoir.
2. Lorsqu'un débordement se produit en mode addition alors que le
balayage fonctionne au son 1.
Lorsque le flag Sound OFF pour le son 3 (bit 7 de NR30) est mis à 0,
l'annulation du mode OFF doit se faire en mettant le flag son OFF à 1. En
initialisant le son 3, il démarre sa fonction.
Page 28 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.9. Son
Lorsque le drapeau All Sound OFF (bit 7 de NR52) est défini sur 0, les registres
de mode pour les sons 1, 2, 3 et 4 sont réinitialisés et la sortie du son
s'arrête. (REMARQUE : Le réglage de chaque registre de mode sonore doit
être effectué après l'annulation du mode All Sound OFF. Pendant le mode
All Sound OFF, chaque registre de mode sonore ne peut pas être réglé.)
REMARQUE : PENDANT LE MODE ALL SOUND OFF, LA CONSOMMATION
D'ÉLECTRICITÉ EN GO CHUTE DE 16 % OU PLUS ! PENDANT QUE VOS PROGRAMMES
N'UTILISENT PAS LE SON, PLACEZ LE DRAPEAU ALL SOUND OFF SUR 0. IL EST PAR
DÉFAUT SUR 1 SUR LA RÉINITIALISATION.
Ce sont généralement les deux équations les plus importantes dans la
conversion entre les registres de fréquence Hertz et GB : (les sons auront
une fréquence supérieure de 2,4 % sur Super GB.)
Go = 2048 (131072 / Hz)
Hz = 131072 / (2048 Go)
par DP Page 29
Machine Translated by Google
2.10. Minuteur Manuel du processeur Game Boy™
2.10. Minuteur
Parfois, il est utile d'avoir une minuterie qui s'interrompt à intervalles réguliers
pour les routines qui nécessitent des mises à jour périodiques ou
précises. La minuterie du GameBoy a une fréquence sélectionnable de 4096,
16384, 65536 ou 262144 Hertz. Cette fréquence incrémente le compteur de
minuterie (TIMA). Lorsqu'il déborde, il génère une interruption. Il est
ensuite chargé avec le contenu du Timer Modulo (TMA). Voici des
exemples :
;Cette minuterie d'intervalle interrompt 4096 fois par seconde
ld a,1 ld
($FF06),a ld a,4 ld ;Définit TMA pour diviser l'horloge par 1
($FF07),a
;Régler l'horloge sur 4096 Hertz
;Cette minuterie d'intervalle interrompt 65536 fois par seconde
ld a,4 ld
($FF06),a ld a,5 ld ;Régler TMA pour diviser l'horloge par 4
($FF07),a
;Régler l'horloge sur 262144 Hertz
Page 30 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.11. E/S série
2.11. E/S série
Le port d'E/S série de la Gameboy est une configuration très simple et
grossière par rapport aux ports série standard RS232 (IBMPC) ou RS485
(Macintosh). Il n'y a pas de bits de démarrage ou d'arrêt, le programmeur doit
donc être plus créatif lors de l'utilisation de ce port.
Lors d'un transfert, un octet est décalé en même temps qu'un octet est
décalé. Le taux de décalage est déterminé par le fait que la source d'horloge
est interne ou externe. S'ils sont internes, les bits sont décalés à
une vitesse de 8192 Hz (122 microsecondes) par bit. Le bit le plus
significatif est déplacé vers l'intérieur et vers l'extérieur en premier.
Lorsque l'horloge interne est sélectionnée, elle pilote la broche d'horloge
sur le port de liaison du jeu et elle reste élevée lorsqu'elle n'est pas utilisée.
Pendant un transfert, il passera huit fois à l'état bas pour synchroniser chaque
bit.
Un programmeur lance un transfert série en définissant le bit 7 de $FF02. Ce
bit peut être lu et est automatiquement mis à 0 à la fin du transfert. Une fois ce
bit défini, une interruption se produira huit horloges de bit plus tard si l'interruption
série est activée.
Si l'horloge interne est sélectionnée et que l'interruption série est activée, cette
interruption se produit 122*8 microsecondes plus tard.
Si l'horloge externe est sélectionnée et que l'interruption série est activée, une
interruption se produira huit horloges de bit plus tard.
Le lancement d'un transfert série avec une horloge externe attendra
indéfiniment si aucune horloge externe n'est présente. Ce
par DP Page 31
Machine Translated by Google
2.11. E/S série Manuel du processeur Game Boy™
permet une certaine synchronisation avec chaque port série.
L'état du dernier bit décalé détermine l'état de la ligne de sortie jusqu'à ce
qu'un autre transfert ait lieu.
Si un transfert série avec horloge interne est effectué et qu'aucune GameBoy
externe n'est présente, une valeur de $FF sera reçue lors du transfert.
Le code suivant provoque le décalage de 75 $ vers le port série et le
décalage d'un octet vers $FF01 :
ld a,75 $ ld
($FF01),a ld a,81
$ ld ($FF02),a
2.12. Interruptions
2.12.1. Procédure d'interruption
Le drapeau IME (interrupt master enable) est réinitialisé par DI et interdit
toutes les interruptions. Il est défini par EI et acquitte le paramètre
d'interruption par le registre IE.
1. Lorsqu'une interruption est générée, le drapeau IF sera
ensemble.
2. Si l'indicateur IME est défini et que l'indicateur IE correspondant est défini,
les 3 étapes suivantes sont effectuées.
3. Réinitialisez l'indicateur IME et empêchez toutes les interruptions.
4. Le PC (compteur de programme) est poussé sur la pile.
5. Sauter à l'adresse de début de l'interruption.
Page 32 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.12.1. Procédure d'interruption
La réinitialisation du registre IF, qui était la cause de l'interruption, est
effectuée par le matériel.
Pendant l'interruption, la poussée des registres à utiliser doit être effectuée par
la routine d'interruption.
Une fois le service d'interruption en cours, toutes les interruptions seront
interdites. Cependant, si le drapeau IME et le drapeau IE sont contrôlés,
un certain nombre de services d'interruption peuvent être rendus
possibles par l'imbrication.
Le retour à partir d'une routine d'interruption peut être effectué par l'instruction
RETI ou RET.
L'instruction RETI active les interruptions après avoir effectué une opération
de retour.
Si un RET est utilisé comme instruction finale dans une routine
d'interruption, les interruptions resteront désactivées à moins qu'un EI ait
été utilisé dans la routine d'interruption ou soit utilisé ultérieurement.
L'interruption sera acquittée pendant la période d'extraction de
l'opcode de chaque instruction.
par DP Page 33
Machine Translated by Google
2.12.2. Descriptions des interruptions Manuel du processeur Game Boy™
2.12.2. Descriptions des interruptions
Les interruptions suivantes ne se produisent que si elles ont été activées dans le
registre Interrupt Enable ($FFFF) et si les interruptions ont effectivement été
activées à l'aide de l'instruction EI.
1. VBlanc
L'interruption VBlank se produit ~ 59,7 fois par seconde sur un Go normal et ~
61,1 fois par seconde sur un Super GB (SGB). Cette interruption se produit au
début de la période VBlank. Pendant cette période, le matériel vidéo n'utilise pas
de RAM vidéo, il peut donc être librement accessible. Cette période
dure environ 1,1 ms.
2. Statut du LLCM
Il existe diverses raisons pour que cette interruption se produise, comme
décrit par le registre STAT ($FF40). Une raison très populaire est d'indiquer à
l'utilisateur quand le matériel vidéo est sur le point de redessiner une ligne LCD
donnée. Cela peut être utile pour contrôler dynamiquement les registres SCX/
SCY ($FF43/$FF42) afin d'effectuer des effets vidéo spéciaux.
3. Débordement de la minuterie
Cette interruption se produit lorsque le registre TIMA ($FF05) passe de $FF à $00.
4. Achèvement du transfert en série
Cette interruption se produit lorsqu'un transfert série est terminé sur le port
de liaison du jeu.
Page 34 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.12.2. Descriptions des interruptions
5. Élevé à faible de P10P13
Cette interruption se produit lors d'une transition de l'une des lignes d'entrée
du clavier de haut en bas. En raison du fait que le "rebond"* du clavier est
pratiquement toujours présent, le logiciel doit s'attendre à ce que cette
interruption se produise une ou plusieurs fois pour chaque pression sur un
bouton et une ou plusieurs fois pour chaque relâchement d'un bouton.
*
Le rebond a tendance à être un effet secondaire de tout bouton
établissant ou rompant une connexion. Pendant ces périodes, il
est très courant qu'une petite oscillation entre les états haut et bas se
produise.
2.13. Registres spéciaux
2.13.1. Registres d'E/S
1. FF00 (P1)
Nom Contenu P1
Enregistrezvous pour lire les informations sur la manette et
déterminer le type de système. (L/E)
Bit 7 Non utilisé
Bit 6 Non utilisé
Bit 5 Port de sortie P15
Bit 4 Port de sortie P14
Bit 3 P13 dans le port
Bit 2 P12 dans le port
Bit 1 P11 dans le port
Bit 0 P10 dans le port
par DP Page 35
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
Voici la disposition matricielle du registre $FF00 :
P14 P15
| |
P10ODroitOA
| |
P11OGaucheOB
| |
P12OUpOSelect |
|
P13ODownOStart
| |
Exemple de code :
Jeu : Mme Pacman
Adresse : $3b1
LD A, 20 $ < bit 5 = 20 $
LD ($FF00),A < sélectionner P14 en le réglant bas
LD A,($FF00)
LD A,($FF00) < attendre quelques cycles
CPL < complément A
AND $0F < n'obtient que les 4 premiers bits
SWAP A < échangezle
LD B,A < stocker A dans B
LD A, 10 $
LD ($FF00),A < sélectionner P15 en le réglant bas
LD A,($FF00)
LD A,($FF00)
LD A,($FF00)
LD A,($FF00)
LD A,($FF00)
LD A,($FF00) < Attendez quelques cycles de PLUS
Page 36 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
CPL < complément (inversé)
ET $0F < obtenir les 4 premiers bits
OU B < mettre A et B ensemble
LD B,A < stocker A dans D
LD A,($FF8B) < lire les anciennes données de joie de la RAM
XOR B < bascule avec le bit de bouton actuel
ET B < récupère le bit de bouton actuel
LD ($FF8C),A < enregistrer dans le nouveau stockage Joydata
LD A,B < mettre la valeur d'origine dans A
LD ($FF8B),A < le stocker en tant qu'anciennes données de joie
LD A,$30 < désélectionner P14 et P15
LD ($FF00),A < RESET Joypad
RET < Retour du sousprogramme
Les valeurs des boutons utilisant la méthode cidessus sont telles :
80 $ Début 8 $ Vers le bas
40 $ Sélectionner 4 $ Jusqu'à
20 $ B $2 Gauche
10 $ Un $1 Droit
Disons que nous avons maintenu A, Start et Up enfoncés. La valeur
renvoyée dans l'accumulateur A serait de 94 $.
2. FF01 (SB)
Nom SB
Contenu Données de transfert série (R/W)
8 bits de données à lire/écrire
3. FF02 (SC)
Nom SC
Contenu Contrôle SIO (R/W)
par DP Page 37
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
Bit 7 Indicateur de début de transfert
0 : Pas de transfert
1 : Démarrer le transfert
Bit 0 Décalage de l'horloge
0 : Horloge externe (500 kHz max.)
1 : Horloge interne (8 192 Hz)
Le transfert est lancé en définissant l'indicateur de
début de transfert. Ce bit peut être lu et est automatiquement
mis à 0 en fin de transfert.
La transmission et la réception de données série se font
simultanément. Les données reçues sont automatiquement
stockées dans SB.
4. FF04 (DIV)
Nom DIV
Contenu Registre diviseur (R/W)
Ce registre est incrémenté de 16384 (~16779
sur SGB) fois par seconde. L'écriture de n'importe quelle
valeur la définit sur 00 $.
5. FF05 (TIMA)
Nom TIMA
Contenu Compteur de minuterie (R/W)
Ce temporisateur est incrémenté d'une fréquence
d'horloge spécifiée par le registre TAC ($FF07). Le
temporisateur génère une interruption lorsqu'il déborde.
Page 38 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
6. FF06 (TMA)
Nom TMA
Contenu Minuterie Modulo (R/W)
Lorsque le TIMA déborde, ces données seront chargées.
7. FF07 (TAC)
Nom TAC
Contenu Contrôle de la minuterie (R/W)
Bit 2 Arrêt du temporisateur
0 : Arrêter la minuterie
1 : Démarrer la minuterie
Bits 1+0 Sélection de l'horloge d'entrée
00 : 4,096 KHz (~4,194 KHz SGB)
01 : 262,144 kHz (~268,4 kHz SGB)
10 : 65,536 KHz (~67,11 KHz SGB)
11 : 16,384 KHz (~16,78 KHz SGB)
8. FF0F (SI)
Nom SI
Contenu Indicateur d'interruption (R/W)
Bit 4 : Transition de haut à bas du numéro de broche P10
P13
Bit 3 : transfert d'E/S série terminé
Bit 2 : dépassement de temporisateur
Bit 1 : LCDC (voir STAT)
Bit 0 : VBlanc
La priorité et l'adresse de saut pour les 5 cidessus
par DP Page 39
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
les interruptions sont :
* Lorsque plusieurs interruptions se produisent en même temps, seule
l'interruption avec la priorité la plus élevée peut être acquittée. Lorsqu'une
interruption est utilisée, un '0' doit être stocké dans le registre IF avant que le
registre IE ne soit défini.
9. FF10 (NR 10)
Nom NR 10
Contenu Registre Mode Son 1,
Registre de balayage (R/W)
Bit 64 Temps de balayage
Bit 3 Augmentation/diminution du balayage
0 : Addition (la fréquence augmente)
1 : Soustraction (la fréquence diminue)
Bit 20 Nombre de décalage de balayage (n : 07)
Temps de
balayage : 000 : balayage désactivé pas de
changement de fréquence 001 :
7,8 ms (1/128 Hz) 010 : 15,6 ms
(2/128 Hz) 011 : 23,4 ms (3/128 Hz)
Page 40 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
100 : 31,3 ms (4/128 Hz) 101 :
39,1 ms (5/128 Hz) 110 : 46,9
ms (6/128 Hz) 111 : 54,7 ms
(7/128 Hz)
Le changement de fréquence (NR13,NR14) à chaque
décalage est calculé par la formule suivante où X(0) est la
fréquence initiale et X(t 1) est la dernière fréquence :
X(t) = X(t1) +/ X(t1)/2^n
10. FF11 (NR 11)
Nom NR 11
Contenu Registre du mode sonore 1, durée du son/taux d'onde (R/W)
Seuls les bits 76 peuvent être lus.
Bit 76 Service de modèle de vague
Bit 50 Données de durée du son (t1 : 063)
Utilisation des vagues : (par
défaut : 10) 00 : 12,5 % ( ___ ) 01 : 25 %
( __ ____ ) 10 : 50 % ( ________
____ ) 11 : 75 % ( __________________ )
Durée du son = (64t1)*(1/256) secondes
par DP Page 41
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
11. FF12 (NR12)
Nom NR 12
Contenu Registre Mode Son 1, Enveloppe (R/W)
Bit 74 Volume initial de l'enveloppe Bit 3 Enveloppe UP/
DOWN 0 : Atténuation 1 : Amplification Bit
20 Nombre de
balayages
d'enveloppe (n : 07) (Si zéro, arrête l'opération
d'enveloppe.)
Le volume initial de l'enveloppe est de 0 à $F. Zéro étant pas de
son.
Durée de 1 pas = n*(1/64) secondes
12. FF13 (NR 13)
Nom NR 13
Contenu Registre Mode sonore 1, Fréquence lo (W)
8 bits inférieurs de fréquence 11 bits (x).
Les 3 bits suivants sont dans NR 14 ($FF14)
13. FF14 (NR 14)
Nom NR 14
Contenu Registre Mode Son 1, Fréquence haute (R/W)
Seul le bit 6 peut être lu.
Bit 7 Initial (lorsqu'il est défini, le son redémarre)
Bit 6 Compteur/sélection consécutive
Page 42 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
Bit 20 3 bits supérieurs de la fréquence (x)
Fréquence = 4194304/(32*(2048x)) Hz
= 131072/(2048x)Hz
Sélection compteur/consécutive
0 = Indépendamment de la longueur, les données du
son NR11 peuvent être produites
consécutivement.
1 = Le son est généré pendant la période définie par les
données de longueur dans NR11. Après cette
période, le drapeau son 1 ON (bit 0 de NR52) est
réinitialisé.
14. FF16 (NR 21)
Nom NR 21
Contenu Registre Sound Mode 2, Sound Length; Vague
Service de modèle (R/W)
Seuls les bits 76 peuvent être lus.
Bit 76 Service de modèle d'onde
Bit 50 Données de durée du son (t1 : 063)
Utilisation des vagues : (par
défaut : 10) 00 : 12,5 % ( ___ ) 01 : 25 %
( __ ____ ) 10 : 50 % ( ________
____ ) 11 : 75 % ( __________________ )
Durée du son = (64t1)*(1/256) secondes
par DP Page 43
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
15. FF17 (NR 22)
Nom NR 22
Contenu Registre Mode sonore 2, enveloppe (R/W)
Bit 74 Volume initial de l'enveloppe Bit 3
Enveloppe UP/DOWN 0 : Atténuation
1 : Amplification
Bit 20
Nombre de balayages d'enveloppe (n : 07) (Si
zéro, arrête l'opération
d'enveloppe.)
Le volume initial de l'enveloppe est de 0 à $F. Zéro étant
pas de son.
Durée de 1 pas = n*(1/64) secondes
16. FF18 (NR 23)
Nom NR 23
Contenu Registre du mode sonore 2, données de fréquence
lo (W)
Les 8 bits inférieurs de la fréquence des données 11
bits (x). Les 3 bits suivants sont dans NR 14 ($FF19).
17. FF19 (NR 24)
Nom NR 24
Contenu Registre du mode sonore 2, données de fréquence
hautes (R/W)
Seul le bit 6 peut être lu.
Bit 7 Initial (lorsqu'il est activé, le son
Page 44 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
redémarre)
Bit 6 Compteur/sélection consécutive
Bit 20 3 bits supérieurs de la fréquence (x)
Fréquence = 4194304/(32*(2048x)) Hz
= 131072/(2048x)Hz
Sélection compteur/consécutive
0 = Indépendamment de la longueur, les données
dans le son NR21 peuvent être
produites consécutivement.
1 = Le son est généré pendant la période définie par
les données de longueur dans NR21. Après
cette période, le drapeau son 2 ON (bit 1 de NR52)
est réinitialisé.
18. FF1A (NR 30)
Nom NR 30
Contenu Registre du mode sonore 3, son activé/désactivé (R/W)
Seul le bit 7 peut être lu
Bit 7 Son désactivé
0 : arrêt de la sortie du son 3
1 : Sortie son 3 OK
19. FF1B (NR 31)
Nom NR 31
Contenu Registre Sound Mode 3, durée du son (R/W)
Bit 70 Durée du son (t1 : 0 255)
Durée du son = (256t1)*(1/2) secondes
par DP Page 45
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
20. FF1C (NR 32)
Nom NR 32
Contenu Registre du mode sonore 3, sélection du niveau de sortie
(R/W)
Seuls les bits 65 peuvent être lus
Bit 65 Sélectionner le niveau de sortie
00 : Muet
01 : Produire de la RAM de modèle d'onde
Données telles qu'elles sont (longueur de 4 bits)
10 : Produire de la RAM de modèle d'onde
données déplacées une fois vers le
DROITE (1/2) (longueur de 4 bits)
11: Produire des données RAM Wave
Pattern décalées deux fois vers le
DROITE (1/4) (longueur de 4 bits)
* La RAM Wave Pattern est située entre $FF30 et $FF3f.
21. FF1D (NR 33)
Nom NR 33
Contenu Registre du mode sonore 3, données inférieures de la
fréquence (W)
8 bits inférieurs d'une fréquence de 11 bits (x).
22. FF1E (NR 34)
Nom NR 34
Contenu Registre du mode sonore 3, données supérieures de la
fréquence (R/W)
Seul le bit 6 peut être lu.
Page 46 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
Bit 7 Initial (lorsqu'il est défini, le son redémarre)
Bit 6 Compteur/drapeau consécutif Bit 20
Les 3 bits supérieurs de la fréquence (x).
Fréquence = 4194304/(64*(2048x)) Hz
= 65536/(2048x)Hz
Sélection compteur/consécutive
0 = Indépendamment de la longueur, les données
dans le son NR31 peuvent être
produites consécutivement.
1 = Le son est généré pendant la période définie par
les données de longueur dans NR31. Après
cette période, le drapeau son 3 ON (bit 2 de NR52)
est réinitialisé.
23. FF20 (NR 41)
Nom NR 41
Contenu Registre Sound Mode 4, durée du son (R/W)
Bit 50 Données de durée du son (t1 : 063)
Durée du son = (64t1)*(1/256) secondes
24. FF21 (NR 42)
Nom NR 42
Contenu Registre Sound Mode 4, enveloppe (R/W)
Bit 74 Volume initial de l'enveloppe
Bit 3 Enveloppe HAUT/BAS
0 : Atténuer
1 : Amplifier
par DP Page 47
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
Bit 20 Nombre de balayages d'enveloppe (n : 07) (Si
zéro, arrête l'opération d'enveloppe.)
Le volume initial de l'enveloppe est de 0 à $F. Zéro étant pas de
son.
Durée de 1 pas = n*(1/64) secondes
25. FF22 (NR 43)
Nom NR 43
Contenu Registre Sound Mode 4, compteur polynomial (R/W)
Bit 74 Sélection de l'horloge de décalage
fréquence du polynôme
comptoir
Bit 3 Sélection du pas du compteur polynomial Bit 20
Sélection du rapport de
division des fréquences : 000 : f * 1/2^3 * 2 001 : f * 1/2^3 * 1 010 : f *
1/ 2^3 * 1/2 011 : f *
1/2^3 * 1/3 100 : f * 1/2^3 * 1/4
101 : f * 1/2^3 * 1/5 110 : f *
1/2^3 * 1/6 111 : f * 1/2^3 * 1/7 f
= 4,194304 Mhz
Sélection du pas du compteur polynomial : 0 : 15 pas 1 : 7 pas
Page 48 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
Sélection de la fréquence d'horloge de décalage du compteur
polynomial :
0000 : rapport de division des fréquences * 1/2 0001 : rapport de
division des fréquences * 1/2^2 0010 : rapport de division des fréquences
* 1/2^3 0011 : rapport de division des fréquences * 1/2^4
: :
: :
: :
0101 : rapport de division des fréquences * 1/2^14 1110 : code interdit
1111 : code interdit
26. FF23 (NR 44)
Nom NR 44
Contenu Registre Sound Mode 4,
compteur/consécutif ; initiale (R/W)
Seul le bit 6 peut être lu.
Bit 7 Initial (lorsqu'il est défini, le son redémarre)
Bit 6 Compteur/sélection consécutive
Compteur/Sélection consécutive 0 =
Indépendamment de la longueur, les données dans le son NR41
peuvent être produites consécutivement.
1 = Le son est généré pendant le temps
période définie par les données de longueur dans NR41.
Après cette période, le drapeau sonore 4 ON (bit 3 de NR52)
est réinitialisé.
par DP Page 49
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
27. FF24 (NR 50)
Nom NR 50
Contenu Contrôle des canaux / ONOFF / Volume (R/W)
Bit 7 Vin>SO2 ON/OFF
Bit 64 Niveau de sortie SO2 (volume) (# 07)
Bit 3 Vin>SO1 ON/OFF
Bit 20 Niveau de sortie SO1 (volume) (# 07)
Vin>SO1 (Vin>SO2)
En synthétisant le son des sons 1 à 4, l'entrée vocale
de la borne Vin est éteinte. 0 : pas de sortie 1 :
sortie OK
28. FF25 (NR 51)
Nom NR 51
Contenu Sélection de la borne de sortie audio (R/W)
Bit 7 Son de sortie 4 vers la borne SO2
Bit 6 Son de sortie 3 vers la borne SO2
Bit 5 Son de sortie 2 vers la borne SO2
Bit 4 Son de sortie 1 vers la borne SO2
Bit 3 Son de sortie 4 vers la borne SO1
Bit 2 Son de sortie 3 vers la borne SO1
Bit 1 Son de sortie 2 vers la borne SO1
Bit 0 Son de sortie 1 vers la borne SO1
Page 50 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
29. FF26 (NR 52)
Nom NR 52 (Valeur au reset : $F1GB, $F0SGB)
Contenu Son activé/désactivé (R/W)
Bit 7 Tous les sons activés/désactivés
0 : arrêter tous les circuits sonores 1 :
activer tous les circuits sonores
Bit 3 Drapeau Son 4 ON
Bit 2 Indicateur Son 3 ON
Bit 1 Indicateur Son 2 ON
Bit 0 Son 1 indicateur ON
Les bits 0 à 3 de ce registre sont censés être des bits d'état
à lire. L'écriture sur ces bits n'active/désactive PAS le
son.
Si vos programmes GB n'utilisent pas de son, écrivez 00 $
dans ce registre pour économiser 16 % ou plus sur la
consommation d'énergie en GB.
30. FF30 FF3F (RAM à motif d'onde)
Nom RAM à motif d'onde
Contenu Stockage de forme d'onde pour des données sonores arbitraires
Cette zone de stockage contient 32 échantillons de 4 bits
qui sont lus d'abord les 4 bits supérieurs.
31. FF40 (LCDC)
Nom LCDC (valeur 91$ à la réinitialisation)
Contenu Contrôle LCD (R/W)
Bit 7 Fonctionnement de la commande LCD *
par DP Page 51
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
0 : arrêt complet (pas d'image à l'écran) 1 : fonctionnement
Bit 6 Sélection de l'affichage de la carte des tuiles de fenêtre
0 : 9 800 $ à 9 BFF
1 : 9 000 $ à 9 FFF
Bit 5 Affichage de la fenêtre 0 :
désactivé
1 : activé
Bit 4 Sélection de données BG et fenêtre Tile
0 : 8 800 $ à 97 FF
1 : 8 000 $ 8 FFF $ < Même zone que OBJ
Bit 3 Sélection de l'affichage de la carte des tuiles BG
0 : 9 800 $ à 9 BFF
1 : 9 000 $ à 9 FFF
Bit 2 OBJ (Sprite) Taille 0 : 8*8 1 : 8*16
(largeur*hauteur)
Bit 1 Affichage OBJ (Sprite) 0 : désactivé 1 :
activé
Bit 0 Affichage de la glycémie et de la fenêtre 0 :
désactivé
1 : activé
*
L'arrêt du fonctionnement LCD (bit 7 de 1 à 0) doit
être effectué pendant Vblank pour fonctionner correctement. V blank peut
être confirmé lorsque la valeur de LY est supérieure ou égale à 144.
32. FF41 (STATIQUE)
Nom STAT
Contenu Statut LCDC (R/W)
Bits 63 Sélection d'interruption par état LCDC
Page 52 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
Bit 6 Coïncidence LYC=LY (sélectionnable)
Bit 5 Mode 10
Bit 4 Mode 01
Bit 3 Mode 00
0 : Non sélection
1 : Sélection
Bit 2 Indicateur de coïncidence
0 : LYC différent de LCDC LY
1 : LYC = LCDC LY
Bit 10 Indicateur de mode
00 : Pendant HBlanc
01 : Pendant VBlank
10 : Pendant la recherche OAMRAM
11 : Pendant le transfert de données vers
Pilote LCD
STAT indique l'état actuel du contrôleur LCD.
Mode 00 : Lorsque le drapeau est 00, c'est le HBlank
période et le CPU peut accéder à la RAM d'affichage (8 000
$ 9 FFF).
Mode 01 : Lorsque le drapeau est 01, c'est le VBlank
période et le CPU peut accéder à la RAM d'affichage (8 000
$ 9 FFF).
Mode 10 : Lorsque le drapeau est 10, l'OAM est utilisé ($FE00$FE9F). La
CPU ne peut pas accéder à l'OAM pendant cette période
Mode 11 : Lorsque le drapeau est 11,
l'OAM et
la RAM d'affichage est utilisée. La CPU ne peut accéder ni à
l'un ni à l'autre pendant cette période.
Les éléments suivants sont typiques lorsque l'affichage est activé :
par DP Page 53
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
Mode 0 :
000___000___000___000___000___000___000________________
Modalité
1 : _________________________________________11111111111111__
Mode 2 :
___2_____2_____2_____2_____2_____2___________________2_
Mode 3 :
____33____33____33____33____33____33__________________3
Le drapeau de mode passe par les valeurs 0, 2 et 3 à un cycle
d'environ 109uS. 0 est présent à environ 48,6 uS, 2 à environ 19 uS
et 3 à environ 41 uS.
Celleci est interrompue toutes les 16.6ms par le VBlank (1). Le
drapeau de mode reste à 1 pendant environ 1,08 ms. (Le mode 0 est
présent entre 201207 clics, 2 environ 7783 clics et 3 environ 169175
clics. Un cycle complet à travers ces états prend 456 clics. VBlank
dure 4560 clics. Un rafraîchissement complet de l'écran se produit
toutes les 70224 clics. )
33. FF42 (SCY)
Nom SCY
Contenu Défilement Y (R/W)
Valeur 8 bits $00$FF pour faire défiler la position de l'écran
BG Y.
Page 54 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
34. FF43 (SCX)
Nom SCX
Contenu Défilement X (R/W)
Valeur 8 bits $00$FF pour faire défiler la position de l'écran
BG X.
35. FF44 (LY)
Nom LY
Table des matières LCDC Coordonnée Y (R)
Le LY indique la ligne verticale sur laquelle les données actuelles
sont transférées au pilote LCD. Le LY peut prendre n'importe
quelle valeur entre 0 et 153. Les valeurs entre 144 et
153 indiquent la période VBlank.
L'écriture réinitialisera le compteur.
36. FF45 (LYC)
Nom LYC
Contenu Comparaison LY (R/W)
Le LYC se compare au LY. Si les valeurs sont les mêmes, cela
amène le STAT à définir l'indicateur de coïncidence.
37. FF46 (DMA)
Nom DMA
Contenu Transfert DMA et adresse de début (W)
Le transfert DMA (40*28 bits) depuis la ROM interne ou
RAM ($0000$F19F) vers l'OAM (adresse $FE00$FE9F)
par DP Page 55
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
peut être effectuée. Il faut 160 microsecondes pour le transfert.
40*28 bits = #140 ou #$8C. Comme vous pouvez le constater, il ne transfère que
8 000 $ d'octets de données. Les données OAM ont une longueur de $A0 octets,
de $0 à $9F.
Mais si vous examinez les données OAM, vous voyez que 4 bits ne sont pas
utilisés.
40*32 bits = #$A0, mais puisque 4 bits pour chaque OAM ne sont pas utilisés,
c'est 40*28 bits.
Il transfère toutes les données OAM vers la RAM OAM.
L'adresse de début de transfert DMA peut être désignée tous les 100 $ à
partir de l'adresse $0000$F100. Cela signifie 0000 $, 0100 $, 0200 $,
0300 $...
Comme on peut le voir en regardant le registre $FF41 Sprite RAM ($FE00
$FE9F) n'est pas toujours disponible. Une routine simple que de nombreux
jeux utilisent pour écrire des données dans la mémoire Sprite est illustrée ci
dessous. Puisqu'il copie les données dans la RAM du sprite aux moments
appropriés, il supprime cette responsabilité du programme principal.
Tout l'espace mémoire, à l'exception de la RAM élevée ($FF80
$FFFE), n'est pas accessible pendant le DMA. Pour cette raison, la routine ci
dessous doit être copiée et exécutée en mémoire vive. Il est généralement appelé
à partir d'une interruption Vblank.
Exemple de programme :
org $40 jp
VBlank
Page 56 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
org $ff80
VBlank :
push af ld < Save A reg & flags
a,BASE_ADRS < transfert de données depuis BASE_ADRS ld ($ff46),a <
place A dans les registres DMA ld a,28h < longueur de la boucle
Attendre : < Nous devons attendre 160 ms. dec
a < 4 cycles diminuer A de 1 jr nz,Wait < 12 cycles branche si Pas
zéro à Attendre pop af reti
< Restaurer un registre et des drapeaux
< Retour d'interruption
38. FF47 (BGP)
Nom BGP
Table des matières BG & Window Palette Data (R/W)
Bit 76 Données pour les données de points 11
(Normalement la couleur la plus foncée)
Bit 54 Données pour les données de points 10
Bit 32 Données pour les données de point 01
Bit 10 Données pour les données de points 00
(Normalement la couleur la plus claire)
Cela sélectionne la nuance de gris à utiliser pour l'arrièreplan
(BG) et les pixels de la fenêtre.
Étant donné que chaque pixel utilise 2 bits, la nuance
correspondante sera sélectionnée à partir d'ici.
par DP Page 57
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
39. FF48 (OBP0)
Nom OBP0
Contenu Palette d'objets 0 Données (R/W)
Cela sélectionne les couleurs pour la palette de
sprites 0. Cela fonctionne exactement comme
BGP ($FF47) sauf que chaque valeur de 0 est
transparente.
40. FF49 (OBP1)
Nom OBP1
Contenu Données de la palette d'objets 1 (R/W)
Cela sélectionne les couleurs pour la palette de
sprites 1. Cela fonctionne exactement comme
OBP0 ($FF48). Voir BGP pour plus de détails.
41. FF4A (WY)
Nom WY
Contenu Position Y de la fenêtre (R/W)
0 <= WY <= 143
WY doit être supérieur ou égal à 0 et doit être inférieur ou
égal à 143 pour que la fenêtre soit visible.
42. FF4B (WX)
Nom WX
Contenu Position de la fenêtre X (R/W)
0 <= WX <= 166
WX doit être supérieur ou égal à 0 et
Page 58 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 2.13.1. Registres d'E/S
doit être inférieur ou égal à 166 pour que la fenêtre soit
visible.
WX est décalé de 7 par rapport aux coordonnées
absolues de l'écran. Régler la fenêtre sur WX=7, WY=0 placera
le coin supérieur gauche de la fenêtre aux coordonnées absolues
de l'écran 0,0.
Disons WY = 70 et WX = 87.
La fenêtre serait positionnée comme suit :
0 80 159
______________________________________
0 | | | |
Affichage en arrièreplan
Ici
| | | 70 | | | | | | | | | | +|
| 80,70 | | |
| Vitrine | |
Ici | | | | | 143 |
___________________|
| | | | __________________|
Les personnages OBJ (Sprites) peuvent toujours entrer dans la
fenêtre. Aucune des couleurs de la fenêtre n'est
transparente, donc toutes les tuiles d'arrièreplan sous la fenêtre sont
masquées.
par DP Page 59
Machine Translated by Google
2.13.1. Registres d'E/S Manuel du processeur Game Boy™
43. FFFF (IE)
Nom C'EST À DIRE
Contenu Interrupt Enable (R/W)
Bit 4 : Transition de Haut à Bas du numéro de broche P10
P13.
Bit 3 : Transfert d'E/S série terminé Bit 2 :
Débordement du temporisateur
Bit 1 : LCDC (voir STAT)
Bit 0 : VBlanc
0 : désactiver
1 : activer
page 60 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3. Présentation des commandes Game Boy
3. Présentation des commandes Game Boy
3.1. Avantpropos
Étant donné que les livres sur le Z80 deviennent de plus en plus difficiles à
trouver, j'espère que les informations ici pourraient être utiles à ceux qui
essaient de comprendre le langage d'assemblage spécifique à
GameBoy.
3.2. Registres du processeur
3.2.1. En général
Le GameBoy a des instructions et des registres similaires aux microprocesseurs
Intel 8080, Intel 8085 et Zilog Z80. Il possède huit registres 8 bits A, B, C, D, E, F,
H, L et deux registres 16 bits SP & PC :
15..8 7..0
UN F
B C
D E
H L
PS
PC
Cependant, certaines instructions vous permettent d'utiliser les registres
A, B, C, D, E, H et L comme registres 16 bits en les associant de la
manière suivante : AF, BC, DE et HL. Le registre F est indirectement accessible
par le
par DP Page 61
Machine Translated by Google
3.2.1. En général Manuel du processeur Game Boy™
programmeur et est utilisé pour stocker les résultats de diverses opérations
mathématiques. Le registre PC, ou Program Counter, pointe vers la
prochaine instruction à exécuter dans la mémoire de la Game Boy. Le
registre SP, ou Stack Pointer, pointe vers la position actuelle de la pile.
3.2.2. Registre des drapeaux
Le registre Fleg se compose des bits suivants :
7 6 5 4 3 2 1 0
ZNHC 0 0 0 0
• Zero Flag (Z) : ce
bit est défini lorsque le résultat d'une opération mathématique est zéro
ou que deux valeurs correspondent lors de l'utilisation de
l'instruction CP.
ï Indicateur de soustraction
(N) : ce bit est défini si une soustraction a été effectuée dans la dernière
instruction mathématique.
ï Half Carry Flag (H):
Ce bit est défini si un report s'est produit à partir du quartet inférieur
lors de la dernière opération mathématique.
ï Porter le drapeau (C) :
Ce bit est défini si un report s'est produit à partir de la dernière
opération mathématique ou si le registre A est la plus petite valeur lors
de l'exécution de l'instruction CP.
Page 62 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.2.3. Compteur de programme
3.2.3. Compteur de programme
À la mise sous tension, le compteur de programme GameBoy
est initialisé à 100 $ (100 hex) et l'instruction trouvée à cet emplacement dans la
ROM est exécutée.
Le compteur de programme à partir de ce point est contrôlé, indirectement, par
les instructions de programme ellesmêmes qui ont été générées par le
programmeur du chariot ROM.
3.2.4. Pointeur de pile
Une grande clé pour comprendre la programmation en langage assembleur
sur GameBoy est de comprendre le concept de pointeur de pile. Une familiarité
avec le langage d'assemblage pour d'autres processeurs aide grandement car
les concepts sont les mêmes.
Le GameBoy Stack Pointer est utilisé pour garder une trace du haut de la "pile".
La pile est utilisée pour enregistrer des variables, enregistrer des
adresses de retour, transmettre des arguments à des sousprogrammes et
diverses autres utilisations pouvant être conçues par le programmeur individuel.
Les instructions CALL, PUSH et RST placent toutes des
informations sur la pile. Les instructions POP, RET et RETI retirent toutes des
informations de la pile.
(Les interruptions placent une adresse de retour sur la pile et la suppriment
également à leur achèvement.)
Au fur et à mesure que les informations sont placées sur la pile, la pile grandit
vers le bas dans la mémoire RAM. Par conséquent, le pointeur de pile doit
toujours être initialisé à l'emplacement le plus élevé de l'espace RAM qui a été
alloué pour être utilisé par la pile.
Par exemple, si un programmeur souhaite localiser le pointeur de pile en
haut d'un espace RAM faible ($C000$DFFF), il définira le pointeur de pile sur
$E000 en utilisant le
par DP Page 63
Machine Translated by Google
3.2.4. Pointeur de pile Manuel du processeur Game Boy™
commande LDSP,$E000. (Le pointeur de pile décrémente automatiquement avant de
mettre quelque chose sur la pile, il est donc parfaitement acceptable de lui attribuer une
valeur qui pointe vers une adresse mémoire située un emplacement après la fin de la
RAM disponible.)
Le pointeur de pile GameBoy est initialisé à $FFFE à la mise sous tension, mais un
programmeur ne doit pas se fier à ce paramètre et doit plutôt définir explicitement
sa valeur.
Page 64 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3. Commandes
3.3. Commandes
Le processeur GameBoy est basé sur un sousensemble du microprocesseur
Z80. Un résumé de ces commandes est donné cidessous.
Si 'Flagsaffected' n'est pas donné pour une commande alors aucun n'est
affecté.
3.3.1. Charges 8 bits
1. LD nn,n
Description :
Mettre la valeur nn dans n.
Utiliser
avec : nn = B,C,D,E,H,L,BC,DE,HL,SP n
= valeur immédiate 8 bits
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD B,n 06 8
LD C,n 0E 8 16 8
LD D,n
LD E,n 1E 8 26 8
LD H,n
LD L,n 2E 8
par DP Page 65
Machine Translated by Google
3.3.1. Charges 8 bits Manuel du processeur Game Boy™
2. LD r1,r2
Description :
Mettre la valeur r2 dans r1.
Utiliser avec:
r1,r2 = A,B,C,D,E,H,L,(HL)
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD Un, un 7F 4 78 4 79 4
LD UN B
LD Un,C
LD PUBLICITÉ 7A 4
LD Un,E 7B 4
LD Un, H 7C 4
LD AL 7D 4
LD A,(HL) 7E 8 40 4 41 4 42 4
LD B,B 43 4 44 4 45 4 46 8
LD AVANT JC 48 4 49 4
LD B,D
LD ÊTRE
LD B,H
LD B,L
LD B,(HL)
LD C,B
LD C,C
LD CD 4A 4
LD C,E 4B 4
LD C,H 4C 4
LD C,L 4D 4
LD C,(HL) 4E 8 50 4 51 4
LD D,B
LD D,C
Page 66 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.1. Charges 8 bits
par DP Page 67
Machine Translated by Google
3.3.1. Charges 8 bits Manuel du processeur Game Boy™
3. LD A,n
Description : Mettez
la valeur n dans A.
Utiliser avec:
n = A,B,C,D,E,H,L,(BC),(DE),(HL),(nn),# nn = valeur immédiate de
deux octets. (L'octet LS en premier.)
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD Un, un 7F 4 78 4 79 4
LD UN B
LD Un,C
LD PUBLICITÉ 7A 4
LD Un,E 7B 4
LD Un, H 7C 4
LD AL 7D 4
LD ABC) 0A 8
LD A,(DE) 1A 8
LD A,(HL) 7E 8
LD A,(nn) FA 16
LD UN,# 3E 8
Page 68 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.1. Charges 8 bits
4. LD n,A
Description : Mettre
la valeur A dans n.
Utiliser avec:
n = A,B,C,D,E,H,L,(BC),(DE),(HL),(nn) nn = valeur immédiate
de deux octets. (L'octet LS en premier.)
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD Un, un 7F 4 47 4
LD B,A
LD CALIFORNIE 4F 4 57 4
LD D,A
LD E,A 5F 4 67 4
LD HA
LD LA 6F 4 02 8 12 8 77 8
LD (C.B.),A
LD (BRIGADE DES STUPÉFIANTS
LD (HL),A
LD (nn),A EA 16
par DP Page 69
Machine Translated by Google
3.3.1. Charges 8 bits Manuel du processeur Game Boy™
5. LD A,(C)
Description :
Mettre la valeur à l'adresse $FF00 + registre C dans A.
Identique à : LD A,($FF00+C)
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD A,(C) F2 8
6. LD (C),A
Description :
Mettez A dans l'adresse $FF00 + registre C.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD ($FF00+C),A E2 8
Page 70 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.1. Charges 8 bits
7. LD A,(HLD)
Description : Identique à : LDD A,(HL)
8. LD A,(HL)
Description : Identique à : LDD A,(HL)
9. LDD A,(HL)
Description :
Mettre la valeur à l'adresse HL dans A. Décrémenter HL.
Identique à : LD A,(HL) DEC HL
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD A,(DHN) 3A 8
LD A,(HL) 3A 8
LDD A,(HL) 3A 8
par DP Page 71
Machine Translated by Google
3.3.1. Charges 8 bits Manuel du processeur Game Boy™
10. LD (HLD),A
Description : Identique à : LDD (HL),A
11. LD (HL),A
Description : Identique à : LDD (HL),A
12. LDD (HL),A
Description :
Mettez A dans l'adresse mémoire HL. Décrémenter HL.
Identique à : LD (HL),A DEC HL
Opcodes :
Paramètres d'instructions Cycles de code opération
LD (DHN),A 32 8 32 8 32 8
LD (HL),A
LDD (HL),A
Page 72 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.1. Charges 8 bits
13. LD A,(HLI)
Description : Identique à : LDI A,(HL)
14. LD A,(HL+)
Description : Identique à : LDI A,(HL)
15. ILD A,(HL)
Description :
Mettre la valeur à l'adresse HL dans A. Incrémenter HL.
Identique à : LD A,(HL) INC HL
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD A,(HLI) 2A 8
LD A,(HL+) 2A 8
LDI A,(HL) 2A 8
par DP Page 73
Machine Translated by Google
3.3.1. Charges 8 bits Manuel du processeur Game Boy™
16. LD (HLI),A
Description : Identique à : LDI (HL),A
17. LD (HL+),A
Description : Identique à : LDI (HL),A
18. LDI (HL),A
Description :
Mettez A dans l'adresse mémoire HL. Incrémenter HL.
Identique à : LD (HL),A INC HL
Opcodes :
Paramètres d'instructions Cycles de code opération
LD (HLI),A 22 8 22 8 22 8
LD (HL+),A
LDI (HL),A
Page 74 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.1. Charges 8 bits
19. LDH (n),A
Description :
placez A dans l'adresse mémoire $FF00+n.
À utiliser
avec : n = valeur immédiate d'un octet.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD ($FF00+n),A E0 12
20. LDH A,(n)
Description :
Mettre l'adresse mémoire $FF00+n dans A.
À utiliser
avec : n = valeur immédiate d'un octet.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD A,($FF00+n) F0 12
par DP Page 75
Machine Translated by Google
3.3.2. Charges 16 bits Manuel du processeur Game Boy™
3.3.2. Charges 16 bits
1. LD n, nn
Description :
Mettre la valeur nn dans n.
Utiliser
avec : n =
BC,DE,HL,SP nn = valeur immédiate 16 bits
Opcodes :
Paramètres d'instructions Cycles de code opération
LD C.B., nn 01 12 11 12 21 12 31
LD DE, nn 12
LD HL,nn
LD SP, nn
2. SP LD, HL
Description :
placez HL dans le pointeur de pile (SP).
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LD PS,HL F9 8
Page 76 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.2. Charges 16 bits
3. LD HL,SP+n
Description : Identique à : LDHL SP,n.
4. SP LDHL,n
Description:
Mettez SP + n adresse effective dans HL.
Utiliser avec:
n = valeur immédiate signée d'un octet.
Drapeaux concernés :
Z Reset.
N Réinitialiser.
H Réglage ou remise à zéro selon fonctionnement.
C Réglage ou remise à zéro selon fonctionnement.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
LDHL SP,n F8 12
par DP Page 77
Machine Translated by Google
3.3.2. Charges 16 bits Manuel du processeur Game Boy™
5. LD (nn),SP
Description : Placez
le pointeur de pile (SP) à l'adresse n.
Utiliser avec:
nn = adresse immédiate à deux octets.
Opcodes :
Paramètres d'instructions Cycles d'opcodes 08 20
LD (nn),SP
6. APPUYER nn
Description : Poussez
la paire de registres nn sur la pile.
Décrémenter le pointeur de pile (SP) deux fois.
Utiliser avec:
nn = AF, BC, DE, HL
Opcodes :
Paramètres d'instructions Cycles d'opcodes
POUSSER UN F F5 16
POUSSER avant JC C5 16
POUSSER DE D5 16
POUSSER HL E5 16
Page 78 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.2. Charges 16 bits
7. POP nn
Description : éjecter
deux octets de la pile dans la paire de registres nn.
Incrémentez le pointeur de pile (SP) deux fois.
Utiliser avec:
nn = AF, BC, DE, HL
Opcodes :
Paramètres d'instructions Cycles d'opcodes
POPULAIRE UN F F1 12
POPULAIRE avant JC C1 12
POPULAIRE DE D1 12
POPULAIRE HL E1 12
par DP Page 79
Machine Translated by Google
3.3.3. ALU 8 bits Manuel du processeur Game Boy™
3.3.3. ALU 8 bits
1. AJOUTER A,n
Description : Ajouter n
à A.
Utiliser avec:
n = A,B,C,D,E,H,L,(HL),#
Drapeaux affectés : Z Défini
si le résultat est zéro.
N Réinitialiser.
H Activé si report du bit 3.
C Activé si report du bit 7.
Opcodes :
Paramètres d'instructions Cycles de code opération
AJOUTER Un, un 87 4 80 4 81 4 82 4 83
AJOUTER UN B 4 84 4 85 4 86 8
AJOUTER Un,C
AJOUTER PUBLICITÉ
AJOUTER Un,E
AJOUTER Un, H
AJOUTER AL
AJOUTER A,(HL)
AJOUTER UN,# C6 8
Page 80 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.3. ALU 8 bits
2. CAN A,n
Description :
Ajoutez n + Carry flag à A.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL),#
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
H Activé si report du bit 3.
C Activé si report du bit 7.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
ADC Un, un 8F 4 88 4 89 4
ADC UN B
ADC Un,C
ADC PUBLICITÉ 8A 4
ADC Un,E 8B 4
ADC Un, H 8C 4
ADC AL 8D 4
ADC A,(HL) 8E 8
ADC UN,# CE 8
par DP Page 81
Machine Translated by Google
3.3.3. ALU 8 bits Manuel du processeur Game Boy™
3. SOUS n
Description :
Soustraire n de A.
Utiliser avec:
n = A,B,C,D,E,H,L,(HL),#
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Ensemble.
H Défini si aucun emprunt du bit 4.
C Définir si aucun emprunt.
Opcodes :
Paramètres d'instructions Cycles de code opération
SOUS UN 97 4 90 4 91 4 92 4
SOUS B 93 4 94 4 95 4 96 8
SOUS C
SOUS D
SOUS E
SOUS H
SOUS L
SOUS (HL) #
SOUS D6 8
Page 82 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.3. ALU 8 bits
4. CCS A,n
Description :
Soustraire n + Carry flag de A.
Utiliser avec:
n = A,B,C,D,E,H,L,(HL),#
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Ensemble.
H Défini si aucun emprunt du bit 4.
C Définir si aucun emprunt.
Opcodes :
Paramètres d'instructions Cycles de code opération
CCS Un, un 9F 4 98 4 99 4 9A 4
CCS UN B 9B 4 9C 4 9D 4 9E
CCS Un,C 8 ?? ?
CCS PUBLICITÉ
CCS Un,E
CCS Un, H
CCS AL
CCS A,(HL)
CCS UN,#
par DP Page 83
Machine Translated by Google
3.3.3. ALU 8 bits Manuel du processeur Game Boy™
5. ET n
Description : ET
logiquement n avec A, donne A.
Utiliser avec:
n = A,B,C,D,E,H,L,(HL),#
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HEnsemble.
C Réinitialiser.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
ET UN A7 4
ET B A0 4
ET C A1 4
ET D A2 4
ET E A3 4
ET H A4 4
ET L A5 4
ET (HL) A6 8
ET # E6 8
Page 84 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.3. ALU 8 bits
6. OU n
Description : OU
logique n avec le registre A, résultat A.
Utiliser avec:
n = A,B,C,D,E,H,L,(HL),#
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Réinitialiser.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
OU UN B7 4
OU B B0 4
OU C B1 4
OU D B2 4
OU E B3 4
OU H B4 4
OU L B5 4
OU (HL) B6 8
OU # F6 8
par DP Page 85
Machine Translated by Google
3.3.3. ALU 8 bits Manuel du processeur Game Boy™
7. OU exclusif n
Description : OU
exclusif logique n avec le registre A, résultat en A.
Utiliser avec:
n = A,B,C,D,E,H,L,(HL),#
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Réinitialiser.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
XOR UN AF 4
XOR B A8 4
XOR C A9 4
XOR D AA 4
XOR E AB 4
XOR H CA 4
XOR L AD 4
XOR (HL) EA 8
XOR * EE 8
Page 86 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.3. ALU 8 bits
8. CP n
Description :
Comparez A avec n. Il s'agit essentiellement d'une instruction de
soustraction A n mais les résultats sont jetés
loin.
Utiliser avec:
n = A,B,C,D,E,H,L,(HL),#
Drapeaux affectés : Z
Défini si le résultat est zéro. (Défini si A = n.)
N Ensemble.
H Défini si aucun emprunt du bit 4.
C Set pour aucun emprunt. (Définir si A < n.)
Opcodes :
Paramètres d'instructions Cycles d'opcodes
CP UN BF 4
CP B B8 4
CP C B9 4
CP D BA 4
CP E BB 4
CP H BC 4
CP L BD 4
CP (HL) ÊTRE 8
CP # FE 8
par DP Page 87
Machine Translated by Google
3.3.3. ALU 8 bits Manuel du processeur Game Boy™
9. INC n
Description :
Registre d'incrémentation n.
Utiliser
avec : n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés :
Z Défini si le résultat est zéro.
N Réinitialiser.
H Activé si report du bit 3.
C Non affecté.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
Inc UN 3C 4 04 4
Inc B
Inc C 0C 4 14 4
Inc D
Inc E 1C 4 24 4
Inc H
Inc L 2C 4 34 12
Inc (HL)
Page 88 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.3. ALU 8 bits
10. DEC n
Description :
Décrémenter le registre n.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés : Z
Défini si reselt est égal à zéro.
N Ensemble.
H Défini si aucun emprunt du bit 4.
C Non affecté.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
DÉC UN 3D 4 05 4
DÉC B
DÉC C 0D 4 15 4
DÉC D
DÉC E 1D 4 25 4
DÉC H
DÉC L 2D 4 35 12
DÉC (HL)
par DP Page 89
Machine Translated by Google
3.3.4. Arithmétique 16 bits Manuel du processeur Game Boy™
3.3.4. Arithmétique 16 bits
1. AJOUTER HL,n
Description : Ajouter
n à HL.
Utiliser avec :
n = BC,DE,HL,SP
Drapeaux affectés : Z
Non affecté.
N Réinitialiser.
H Activé si report du bit 11.
C Activé si report du bit 15.
Opcodes :
Paramètres d'instructions Cycles d'opcodes 09 8
AJOUTER HL, C.B. 19 8 29 8 39 8
AJOUTER HL, DE
AJOUTER HL, HL
AJOUTER HL,SP
Page 90 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.4. Arithmétique 16 bits
2. AJOUTER SP,n
Description :
Ajouter n au pointeur de pile (SP).
Utiliser avec:
n = valeur immédiate signée d'un octet (#).
Drapeaux concernés :
Z Reset.
N Réinitialiser.
H Réglage ou remise à zéro selon fonctionnement.
C Réglage ou remise à zéro selon fonctionnement.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
AJOUTER PS,# E8 16
par DP Page 91
Machine Translated by Google
3.3.4. Arithmétique 16 bits Manuel du processeur Game Boy™
3. INC nn
Description :
Incrémenter le registre nn.
Utiliser avec:
nn = BC, DE, HL, SP
Drapeaux concernés :
aucun.
Opcodes :
Paramètres d'instructions Cycles de code opération
Inc avant JC 03 8 13 8 23 8 33 8
Inc DE
Inc HL
Inc PS
Page 92 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.4. Arithmétique 16 bits
4. DEC nn
Description :
Décrémenter le registre nn.
Utiliser avec:
nn = BC, DE, HL, SP
Drapeaux concernés :
aucun.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
DÉC avant JC 0B 8
DÉC DE 1B 8
DÉC HL 2B 8
DÉC PS 3B 8
par DP Page 93
Machine Translated by Google
3.3.5. Divers Manuel du processeur Game Boy™
3.3.5. Divers
1. SWAP n
Description :
Échangez les nibles supérieurs et inférieurs de n.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Réinitialiser.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
ÉCHANGER UN CB 37 8
ÉCHANGER B CB 30 8
ÉCHANGER C CB 31 8
ÉCHANGER D CB 32 8
ÉCHANGER E CB 33 8
ÉCHANGER H CB 34 8
ÉCHANGER L CB 35 8
ÉCHANGER (HL) CB 36 16
Page 94 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.5. Divers
2. DAA
Description :
Registre de réglage décimal A.
Cette instruction ajuste le registre A de sorte que la représentation
correcte du décimal codé binaire (BCD) soit obtenue.
Indicateurs
concernés : Z Activé si le registre A est à zéro.
N Non affecté.
HRéinitialiser.
C Réglage ou remise à zéro selon fonctionnement.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
DAA / 27 4
3. CPL
Description :
Compléter un registre. (Retournez tous les bits.)
Drapeaux affectés :
Z Non affecté.
N Ensemble.
HEnsemble.
C Non affecté.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
PCL / 2F 4
par DP Page 95
Machine Translated by Google
3.3.5. Divers Manuel du processeur Game Boy™
4. CCF
Description :
Complément portedrapeau.
Si le drapeau C est défini, réinitialisezle.
Si le drapeau C est réinitialisé, réglezle.
Drapeaux concernés :
Z Non affecté.
N Réinitialiser.
HRéinitialiser.
C Complétée.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
FCC / 3F 4
5. FCS
Description : Set
Carry flag.
Drapeaux concernés :
Z Non affecté.
N Réinitialiser.
HRéinitialiser.
C Ensemble.
Opcodes :
Paramètres d'instructions Cycles d'opcodes 37
FCS / 4
Page 96 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.5. Divers
6. NON
Description :
Aucune opération.
Opcodes :
Paramètres d'instructions Cycles de code opération
NON / 00 4
7. ARRÊT
Description :
éteignez la CPU jusqu'à ce qu'une interruption se produise. Utilisezle chaque
fois que possible pour réduire la consommation d'énergie.
Opcodes :
Paramètres d'instructions Cycles d'opcodes 76
ARRÊT / 4
8. ARRÊTER
Description :
arrête l'affichage CPU et LCD jusqu'à ce que le bouton soit enfoncé.
Opcodes :
Paramètres d'instructions Cycles de code
ARRÊT / opération 10 00 4
par DP Page 97
Machine Translated by Google
3.3.5. Divers Manuel du processeur Game Boy™
9. DI
Description :
cette instruction désactive les interruptions, mais pas immédiatement.
Les interruptions sont désactivées après l'exécution de
l'instruction après DI.
Drapeaux concernés :
aucun.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
DI / F3 4
10. AE
Description :
Activer les interruptions. Cette instruction active les interruptions mais pas
immédiatement. Les interruptions sont activées après l'exécution de
l'instruction après EI.
Drapeaux concernés :
aucun.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
IE / FB 4
Page 98 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.6. Rotation et décalages
3.3.6. Rotation et décalages
1. RLCA
Description :
Rotation A vers la gauche. Ancien bit 7 pour porter le drapeau.
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 7.
Opcodes :
Paramètres d'instructions Cycles d'opcodes 07
RLCA / 4
2. RLA
Description :
Tourner A à gauche en portant le drapeau.
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 7.
Opcodes :
Paramètres d'instructions Cycles d'opcodes 17
RLA / 4
par DP Page 99
Machine Translated by Google
3.3.6. Rotation et décalages Manuel du processeur Game Boy™
3. CRR
Description : Faites
pivoter A vers la droite. Ancien bit 0 pour Porter le drapeau.
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 0.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
RRCA / 0F 4
4. RRA
Description : Faites
pivoter A jusqu'au bout Portez le drapeau.
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 0.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
RRA / 1F 4
Page 100 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.6. Rotation et décalages
5. RLC n
Description :
Rotation n vers la gauche. Ancien bit 7 pour porter le drapeau.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 7.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
RLC UN CB 07 8
RLC B CB 00 8
RLC C CB 01 8
RLC D CB 02 8
RLC E CB 03 8
RLC H CB 04 8
RLC L CB 05 8
RLC (HL) CB 06 16
par DP Page 101
Machine Translated by Google
3.3.6. Rotation et décalages Manuel du processeur Game Boy™
6. RL n
Description :
Rotation n vers la gauche via Porter le drapeau.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 7.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
RL UN CB 17 8
RL B CB 10 8
RL C CB 11 8
RL D CB 12 8
RL E CB 13 8
RL H CB 14 8
RL L CB 15 8
RL (HL) CB 16 16
Page 102 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.6. Rotation et décalages
7. CRR n
Description :
Rotation vers la droite. Ancien bit 0 pour Porter le drapeau.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 0.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
CRR UN CB 0F 8
CRR B CB 08 8
CRR C CB 09 8
CRR D Disjoncteur 0A 8
CRR E CB 0B 8
CRR H CB 0C 8
CRR L CB 0D 8
CRR (HL) CB 0E 16
par DP Page 103
Machine Translated by Google
3.3.6. Rotation et décalages Manuel du processeur Game Boy™
8. RR n
Description : Faites
pivoter n vers la droite Portez le drapeau.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 0.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
RR UN CB 1F 8
RR B CB 18 8
RR C CB 19 8
RR D Disjoncteur 1A 8
RR E CB 1B 8
RR H CB 1C 8
RR L CB 1D 8
RR (HL) CB 1E 16
Page 104 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.6. Rotation et décalages
9. SLA n
Description : Maj n
vers la gauche dans Carry. LSB de n mis à 0.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 7.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
SLA UN CB 27 8
SLA B CB 20 8
SLA C CB 21 8
SLA D CB 22 8
SLA E CB 23 8
SLA H CB 24 8
SLA L CB 25 8
SLA (HL) CB 26 16
par DP Page 105
Machine Translated by Google
3.3.6. Rotation et décalages Manuel du processeur Game Boy™
10. SRA n
Description : Shift
n à droite dans Carry. MSB ne change pas.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 0.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
SRA UN CB 2F 8
SRA B CB 28 8
SRA C CB 29 8
SRA D CB 2A 8
SRA E CB 2B 8
SRA H CB 2C 8
SRA L CB 2D 8
SRA (HL) CB 2E 16
Page 106 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.6. Rotation et décalages
11. SRL n
Description : Shift
n à droite dans Carry. MSB mis à 0.
Utiliser avec :
n = A,B,C,D,E,H,L,(HL)
Drapeaux affectés : Z
Défini si le résultat est zéro.
N Réinitialiser.
HRéinitialiser.
C Contient les anciennes données du bit 0.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
SRL UN CB 3F 8
SRL B CB 38 8
SRL C CB 39 8
SRL D CB 3A 8
SRL E CB 3B 8
SRL H CB 3C 8
SRL L CB 3D 8
SRL (HL) CB 3E 16
par DP Page 107
Machine Translated by Google
3.3.7. Opcodes binaires Manuel du processeur Game Boy™
3.3.7. Opcodes binaires
1. TBI b,r
Description :
test du bit b dans le registre r.
Utiliser
avec : b = 0 7, r = A,B,C,D,E,H,L,(HL)
Drapeaux
concernés : Z Activé si le bit b du registre r est à 0.
N Réinitialiser.
HEnsemble.
C Non affecté.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
BIT b,A CB 47 8
BIT b,B CB 40 8
BIT b,C CB 41 8
BIT b,D CB 42 8
BIT b,E CB 43 8
BIT b,H CB 44 8
BIT b,L CB 45 8
BIT b,(HL) CB 46 16
Page 108 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.7. Opcodes binaires
2. RÉGLER b,r
Description : Définir
le bit b dans le registre r.
Utiliser avec:
b = 0 7, r = A,B,C,D,E,H,L,(HL)
Drapeaux concernés :
aucun.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
ENSEMBLE b,A CB C7 8
ENSEMBLE b,B CB C0 8
ENSEMBLE b,C DJ C1 8
ENSEMBLE b,D CB C2 8
ENSEMBLE b,E CB C3 8
ENSEMBLE b,H CB C4 8
ENSEMBLE b,L b, CB C5 8
ENSEMBLE (HL) CB C6 16
par DP Page 109
Machine Translated by Google
3.3.7. Opcodes binaires Manuel du processeur Game Boy™
3. SER b,r
Description :
Réinitialise le bit b dans le registre r.
Utiliser avec:
b = 0 7, r = A,B,C,D,E,H,L,(HL)
Drapeaux concernés :
aucun.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
RES b,A CB 87 8
RES b,B CB 80 8
RES b,C CB 81 8
RES b,D CB 82 8
RES b,E CB 83 8
RES b,H CB 84 8
RES b,L CB 85 8
RES b,(HL) CB 86 16
Page 110 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.8. sauts
3.3.8. sauts
1. JP nn
Description :
Sauter à l'adresse nn.
Utiliser avec:
nn = valeur immédiate de deux octets. (L'octet LS en premier.)
Opcodes :
Paramètres d'instructions Cycles d'opcodes
JP nn C3 12
2. JP cc, nn
Description :
Sauter à l'adresse n si la condition suivante est vraie : cc = NZ, Sauter si le
drapeau Z est réinitialisé. cc = Z, sauter si le
drapeau Z est défini. cc = NC, sauter si le
drapeau C est réinitialisé. cc = C, sauter si le
drapeau C est défini.
Utiliser avec:
nn = valeur immédiate de deux octets. (L'octet LS en premier.)
Opcodes :
Paramètres d'instructions Cycles d'opcodes
JP NouvelleZélande, nn C2 12
JP Z,nn CA 12
JP NC,nn D2 12
JP C,nn AD 12
par DP Page 111
Machine Translated by Google
3.3.8. sauts Manuel du processeur Game Boy™
3. JP (HL)
Description :
Aller à l'adresse contenue dans HL.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
JP (HL) E9 4
4. JR n
Description :
Ajoutez n à l'adresse actuelle et sautezy.
Utiliser avec:
n = valeur immédiate signée d'un octet
Opcodes :
Paramètres d'instructions Cycles d'opcodes 18
JR n 8
Page 112 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.8. sauts
5. JR cc,n
Description:
Si la condition suivante est vraie, ajoutez n à l'adresse actuelle et sautez
dessus :
Utiliser avec:
n = valeur immédiate signée d'un octet cc = NZ,
sauter si le drapeau Z est réinitialisé. cc = Z,
sauter si le drapeau Z est défini. cc = NC,
sauter si le drapeau C est réinitialisé. cc = C,
sauter si le drapeau C est défini.
Opcodes :
Paramètres d'instructions Cycles de code opération
JR NouvelleZélande,* 20 8 28 8 30 8 38 8
JR Z,*
JR NC,*
JR C,*
par DP Page 113
Machine Translated by Google
3.3.9. Appels Manuel du processeur Game Boy™
3.3.9. Appels
1. APPELER nn
Description :
Pousser l'adresse de l'instruction suivante sur la pile puis sauter à l'adresse nn.
Utiliser avec:
nn = valeur immédiate de deux octets. (L'octet LS en premier.)
Opcodes :
Paramètres d'instructions Cycles d'opcodes
APPEL nn CD 12
Page 114 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.9. Appels
2. APPELER cc,nn
Description : Appeler
l'adresse n si la condition suivante est vraie : cc = NZ, Appeler si le drapeau Z est
réinitialisé. cc = Z, appel si le drapeau Z est défini. cc = NC,
appel si le drapeau C est réinitialisé. cc = C, appel si
l'indicateur C est défini.
Utiliser avec:
nn = valeur immédiate de deux octets. (L'octet LS en premier.)
Opcodes :
Paramètres d'instructions Cycles d'opcodes
APPEL NouvelleZélande, nn C4 12
APPEL Z,nn CC 12
APPEL NC,nn D4 12
APPEL C,nn DD 12
par DP Page 115
Machine Translated by Google
3.3.10. Redémarre Manuel du processeur Game Boy™
3.3.10. Redémarre
1. TVD n
Description :
Pousser l'adresse actuelle sur la pile.
Aller à l'adresse $0000 + n.
Utiliser avec:
n = 00 $, 08 $, 10 $, 18 $, 20 $, 28 $, 30 $, 38 $
Opcodes :
Paramètres d'instructions Cycles d'opcodes
TVD 00H C7 32
TVD 08H FC 32
TVD 10H D7 32
TVD 18H DF 32
TVD 20H E7 32
TVD 28H EF 32
TVD 30H F7 32
TVD 38H FF 32
Page 116 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 3.3.11. Retour
3.3.11. Retour
1. RET
Description :
extraire deux octets de la pile et accéder à cette adresse.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
RET / C9 8
2. RET cc
Description:
Renvoie si la condition suivante est vraie :
Utiliser avec:
cc = NZ, retour si le drapeau Z est réinitialisé. cc = Z,
Retourne si le drapeau Z est défini. cc = NC, retour
si le drapeau C est réinitialisé. cc = C, Retourne si
l'indicateur C est défini.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
RET NouvelleZélande C0 8
RET Z C8 8
RET NC J0 8
RET C D8 8
par DP Page 117
Machine Translated by Google
3.3.11. Retour Manuel du processeur Game Boy™
3. RETI
Description :
Popez deux octets de la pile et accédez à cette adresse, puis activez les
interruptions.
Opcodes :
Paramètres d'instructions Cycles d'opcodes
RETI / D9 8
Page 118 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 4. Commandes Super Game Boy
4. Commandes Super Game Boy
4.1. Avantpropos
Commandes Super GameBoy, extraites par kOOPa, 15 février 1998
Dernière mise à jour par : Bowser, 13 juin 1998
Mises à jour:
Codes de contrôle du mode Zone de blocage ($04) mis à jour
Mode ligne ($05) écrit
Mode de division ($06) écrit
Mode 1CHR ($07) écrit
Un transfert de commande SGB est de 128 bits + un bit zéro. Les cinq premiers bits du
premier octet constituent l'octet de commande.
Les 3 derniers bits du premier octet représentent le nombre de paquets de 128 bits à
envoyer. Les bits inutilisés dans un transfert de commande SGB doivent être définis sur
0.
La plupart des commandes répertoriées cidessous ne transfèrent qu'un seul package.
Les octets de commande cidessous sont précédés du caractère # pour vous rappeler qu'ils
doivent être décalés trois fois vers la gauche avant d'être utilisés.
4.2. Palettes
Il existe plusieurs types de palettes dans le SGB. Un type est la palette de couleurs
système. C'est une palette virtuelle plutôt qu'une palette matérielle. La palette de
couleurs matérielles est affichée au bas de ce document et contient ce qu'on appelle
les palettes de couleurs SGB ainsi que la palette de bordure SGB.
En ce qui concerne les couleurs à l'écran SGB, il y a
vraiment deux types de palettes : les palettes de couleurs SGB et
par DP Page 119
Machine Translated by Google
4.2. Palettes Manuel du processeur Game Boy™
la palette de bordure SGB.
La palette de bordure SGB est configurée à l'aide de la commande $14.
Il y a 64 couleurs dans cette palette.
Les palettes de couleurs SGB peuvent être définies directement à l'aide
des commandes $00$03. Il y a un total de quatre de ces palettes et
elles déterminent quelles couleurs sont utilisées dans la fenêtre d'action
principale du jeu. La couleur du bit 00 sera la même pour toutes les palettes
de couleurs SGB.
La couleur la plus récemment stockée dans le bit 00 sera utilisée.
Les palettes de couleurs SGB peuvent être définies indirectement à l'aide
des palettes de couleurs système à l'aide des commandes $0a$0b.
Il y a un total de 512 de ces palettes.
4.3. Frontière SGB
La bordure SGB est souvent affichée sous forme de graphiques colorés qui
entourent la fenêtre d'action principale du jeu. La vérité est que la bordure SGB
couvre en fait tout l'écran de visualisation et a la priorité de visualisation la plus
élevée. La raison pour laquelle il semble n'être qu'une "bordure" autour de la plupart
des jeux est due au fait qu'une boîte de 160x144 pixels de large est généralement
dessinée au centre de la "bordure" SGB en utilisant la couleur 0.
Étant donné que cette couleur est transparente, la fenêtre d'action principale du
jeu en dessous est visible.
La création d'un programme pour convertir un GIF 16 couleurs en bordure SGB
est relativement simple et a été réalisée pour DOS. (iegif2sopt.exe) Ce qui
n'est pas si facile, c'est de convertir un GIF 64 couleurs en bordure SGB car
chaque tuile n'a accès qu'à 16 couleurs. La palette de 16 couleurs à laquelle la
vignette a accès est déterminée par l'octet d'attribut de vignette.
L'octet d'attribut de tuile est décrit dans la commande 'Transfert d'image' ($14)
cidessous.
Page 120 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 4.4. Fenêtre d'action principale
4.4. Fenêtre d'action principale
La cartouche SGB qui se branche sur la SNES contient un processeur GB.
Le SNES est capable de capturer la sortie vidéo de ce processeur GB et de
l'afficher à l'écran en tant que fenêtre d'action principale du jeu. Étant donné
que le SNES ne fait qu'une capture vidéo brute, il ne connaît qu'environ 4
niveaux de gris provenant du processeur GB. Afin d'ajouter plus de 4 couleurs à
la fenêtre d'action principale du jeu, le logiciel SGB vous permet d'attribuer 1
des 4 palettes de couleurs SGB pour chaque position de tuile 8x8 dans cette
fenêtre.
"Bloc"($4), "Ligne"($5), "Divide"($6), "1Chr"($7) et "Set Attr from ATF"($15)
sont tous des moyens différents pour définir les palettes pour chaque tuile 8x8
emplacement.
Lors de la réinitialisation, chaque position de mosaïque 8x8 est définie par défaut sur
la palette de couleurs SGB 0.
Les commandes $4$7 sont diverses méthodes pour paramétrer en bloc les
palettes de couleurs des tuiles 8x8. Le "Set Attr from ATF" (15 $) vous permet
de sélectionner 1 des 45 "fichiers ATtribute".
Chaque "fichier ATtribute" contient 90 octets (20x18x2 bits).
En sélectionnant un "fichier ATtribute", vous pouvez sélectionner
exactement 1 des 4 palettes de couleurs SGB pour chaque emplacement
de tuile 8x8 car ces fichiers contiennent 2 bits d'informations pour chaque
emplacement de tuile 8x8.
par DP Page 121
Machine Translated by Google
4.5. Commandes Manuel du processeur Game Boy™
4.5. Commandes
1. Définir les palettes de couleurs SGB
0 & 1 (00 $, données) Télécharger les palettes de couleurs 0 &
1 2 & 3 (01 $, données) Télécharger les palettes de couleurs 2
& 3 0 & 3 (02 $, données) Télécharger les palettes de couleurs
0 & 3 1 & 2 (03 $) ,data) Télécharger les palettes de couleurs 1 & 2
Voici des exemples de données pour définir les palettes de
couleurs SGB 0 et 1 :
;Palette 0
DW $7c00 ;bit 01 couleur ;bit
DW $03e0 10 couleur ;bit 11
DW 0000 $ ;bleu ;vert ;noir couleur
;Palette 1
DW $03ff ;bit 01 couleur ;bit
DW $001f 10 couleur ;bit 11
DW 0000 $ ;jaune ;rouge ;noircouleur
Veuillez noter que les quatre palettes de couleurs SGB partagent la même
couleur bit 00. La couleur la plus récemment stockée dans le bit 00 sera
utilisée.
Les informations pour le calcul de la valeur de couleur DW sont
données plus loin dans ce texte.
Lors de l'utilisation des quatre commandes Palette Direct Set suivantes,
l'image GameBoy sera modifiée (couleurs modifiées) même si vous avez
utilisé la commande GameBoy Window Mask pour figer l'écran. Utilisez
donc des arguments
Page 122 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 4.5. Commandes
noir ou blanc avec la commande Window Mask avant d'utiliser les quatre
commandes suivantes. Si vous souhaitez figer l'écran, envoyez les données de
la palette avec le fichier d'attributs ATF0ATF44. Si vous modifiez l'écran en envoyant des
données d'attribut et des données de couleur en même temps, utilisez la commande
Set SGB Palette Indirect.
2. Mode de désignation de zone "bloc" (04 $)
(autres données présentées cidessous)
$00 %00100xxx xxx =
nombre de paquets
$01 %///xxxxx
xxxxx = # d'ensembles de données Un ensemble de données est le code de
contrôle, la désignation de la palette de couleurs et les coordonnées.
$02 %/////xxx xxx =
Code de contrôle
000 = ne s'en soucie pas
001 = set pal (à l'intérieur du bloc + environnant
ligne de bloc) à 'zz' de $03 010 = définir le
pal de la ligne de bloc environnante sur 'yy' de $03 011 = définir le pal
à l'intérieur du
bloc sur 'yy' et la ligne de bloc environnante sur 'yy' 100 =
définir le pal à l'extérieur du bloc sur ' xx' 101 =
définir pal à l'intérieur de 'zz' et à l'extérieur du
bloc à 'xx' 110 =
définir pal à l'extérieur du bloc à 'xx' 111 = définir pal à l'intérieur
du bloc tp 'zz' + ligne environnante à 'yy' + à l'extérieur du
bloc
à 'xx'
par DP Page 123
Machine Translated by Google
4.5. Commandes Manuel du processeur Game Boy™
$03 %//xxyyzz
Désignation de la palette de couleurs
xx = palette de couleurs à l'extérieur de la zone entourée yy =
palette de couleurs sur la ligne de bloc environnante zz = palette de
couleurs à l'intérieur de la zone entourée
$04 %///xxxxx xxxxx = point de départ H $05 %///xxxxx
xxxxx = point de départ V $06 %///xxxxx xxxxx = point final
H $07 %///xxxxx xxxxx = point final V
$08$0d Répétition des données $02$07 si nombre d'ensembles de données > 1.
Si le nombre de paquets est 1, définissez $0e & $0f sur $00.
3. Mode de désignation de zone "Ligne" (05 $)
$00 %00101xxx
xxx = # paquets
$01 %xxxxxxxx
nombre d'ensembles de données ($1 $6E), un ensemble de
données contrôle : code, désignation de la palette de couleurs et
coordonnées.
$02 %xyyzzzzz code
de contrôle 1er ensemble de données
X = Mode (0 = Ligne horizontale, 1 = Ligne verticale) yy = Numéro de
palette zzzzz = Numéro de ligne
Un jeu de données est de 1 octet tout comme $02. Si # ensembles de données = 1,
remplissez avec des 0 jusqu'à $0F.
Page 124 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 4.5. Commandes
4. Mode de désignation de zone "Diviser" (06 $)
$00 %00101001
(le nombre de paquets doit être 1)
$01 %/vxxyyzz code
de contrôle
v = Mode (0 = diviser horizontalement,
1 = Diviser verticalement)
xx = Palette de couleurs sur la ligne de division
aa = Palette de couleurs AUDESSUS ET À GAUCHE de la
zz division = Palette de couleurs AUDESSUS ET À DROITE de la division
$02 %///xxxxx xxxxx =
Numéro de la ligne de caractères à diviser au remplissage avec
0 à 0 $ F
5. Mode de désignation de zone "1CHR" (07 $)
$00 %00111xxx
xxx = nombre de paquets ($01 $06)
$01 %///xxxxx
Coordonnée X de début
$02 %///aaaaa
Coordonnée Y de début
$03 %xxxxxxxx
Nombre de jeux de données, 2 bits = 1 jeu de données
$04 %///////x
MSB de données dans $03. Nombre maximal = 360.
05 $ %///////x
par DP Page 125
Machine Translated by Google
4.5. Commandes Manuel du processeur Game Boy™
Style d'écriture ( 0 = Gauche > droite, 1 = haut > bas)
$06 %vvxxyyzz data vv = pal
pour le jeu de données 1 xx = pal
pour le jeu de données 2 yy = pal
pour le jeu de données 3 zz = pal
pour le jeu de données 4
$07 %vvxxyyzz données
etc...
6. Son marche/arrêt (08 $)
7. Transférer le son PRG/DATA (09 $)
Cela transfère les données de votre score (au format .GAK).
Définir la palette SGB indirecte ($0a)
Page 126 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 4.5. Commandes
8. Définir les données de la palette de couleurs du système ($0b)
9. Activer/désactiver le mode d'attraction ($0c)
10. Fonction de vitesse ($0d)
11. Fonction SGB (0e $)
12. Transfert Super NES WRAM 1 (0f $)
13. Transfert Super NES WRAM 2 (10 $)
14. Demande du contrôleur 2 (#11) (00 $) Demande 1 jeu
15. Demande de contrôleur 2 (#11) ($01) Demande de jeu 2
Est utilisé pour déterminer si le système est SGB ou GB normal.
16. Réglez le compteur de programme (12 $)
17. Transfert de jeu de caractères (13 $)
(%00000xyy) (x=Type de caractère : 0=BG,1=OBJ y=CharSet
Plage : 0=007f,1=80ff)
Les tuiles téléchargées sur le SNES pour la bordure sont des tuiles GB
régulières qui ont été modifiées pour des couleurs supplémentaires. Chaque tuile
se compose de 32 octets. Le format est :
16 octets Jeu de caractères GB 4 couleurs standard 16 octets
Informations de couleur étendues
De la même manière que Go utilise deux octets pour transmettre 8 pixels
et les 4 couleurs pour chaque pixel, la couleur étendue
par DP Page 127
Machine Translated by Google
4.5. Commandes Manuel du processeur Game Boy™
info utilise la même technique pour déterminer les couleurs étendues. Cela indique au SNES
quelle palette de couleurs utiliser pour afficher chaque pixel. Cela permet un total de 16
couleurs par tuile. Étant donné que les bordures SGB prennent en charge jusqu'à 64 couleurs,
l'accès aux autres couleurs est obtenu en modifiant le numéro de la palette principale dans la
carte de mosaïque de transfert d'image.
Page 128 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 4.5. Commandes
18. Transfert d'images (14 $) Téléchargez la bordure sur SNES.
La bordure (ou carte de tuiles) qui est téléchargée est de 32x28 tuiles ou
256x224 pixels. L'écran GB standard s'adapte en plein milieu comme ceci :
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXX....................XXXXXX
XXXXXX....................XXXXXX
XXXXXX ....................XXXXXX
XXXXXX..................XXXXXX
XXXXXX...... ..............XXXXXX
XXXXXX..............XXXXXX
XXXXXX............ ........XXXXXX
XXXXXX..................XXXXXX
XXXXXX.................. ..XXXXXX
XXXXXX..................XXXXXX
XXXXXX..................XXXXXX
XXXXXX.. ..................XXXXXX
XXXXXX..................XXXXXX
XXXXXX........ ............XXXXXX
XXXXXX..................XXXXXX
XXXXXX.............. ......XXXXXX
XXXXXX..................XXXXXX XXXXXX..................
XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
par DP Page 129
Machine Translated by Google
4.5. Commandes Manuel du processeur Game Boy™
La carte de tuiles se compose d'un octet de numéro de tuile et d'un octet
d'attribut de tuile à chaque position sur la carte. Un total de 32 lignes sont
téléchargées même si les 4 dernières lignes ne sont pas visibles. Cela
équivaudrait à 64 octets par ligne et à un total de 2048 octets par carte.
Ensuite, une palette de couleurs de 64 x 2 octets pour la carte est
téléchargée. La première couleur d'entrée de la palette est
transparente. Utilisez cette couleur pour afficher l'écran GB normal en
dessous.
Le numéro de vignette vient avant l'attribut de vignette de chaque
position. Il peut y avoir jusqu'à 1024 tuiles parmi lesquelles sélectionner. Le
SGB ne prend en charge que 256, donc les bits 0 et 1 de l'attribut de tuile
doivent être définis sur 0. Voici les attributs de tuile que je comprends
jusqu'à présent :
Bit 7 Tuile à retournement vertical
Bit 6 Tuile à retournement horizontal
Bit 5 Ne fait rien (Réglé sur 0.)
Bit 4 Sélectionner la palette majeure MSB (généralement défini sur 1.)
Bit 3 Sélectionner la palette principale
Bit 2 Sélectionner la palette principale LSB
Bit 1 Mosaïque # MSB (Bit le plus significatif) (Réglé sur 0.)
Bit 0 Tile # NSB (Prochain bit le plus significatif) (Réglé sur
0.)
Ceci est souvent appelé la bordure SGB, mais en fait, il couvre tout
l'écran SNES. La sélection de la palette majeure a 8 réglages différents.
Seuls les 4 à 7 derniers sont normalement utilisés pour accéder aux
64 couleurs transférées avec cmd (#14).
(REMARQUE : Si vous utilisez 'gif2sopt.exe' pour générer une bordure,
la plage des sélections de palette est de 1 à 8, sélectionnez donc la
palette 5 car ce programme n'autorise que 16 couleurs maximum.)
Page 130 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 4.5. Commandes
19. Définir l'attribut de l'ATF (15 $)
Les données de 45 fichiers d'attributs sont transférées avec cette commande.
Chaque fichier ATtribute fait 90 octets, donc 90x45 ou 4050 octets de
données sont transférés. Chaque fichier d'attributs utilise 5 octets par
ligne horizontale 8x8 (20 x 4 caractères/octet x 2 bits/palette) pour
décrire les palettes de couleurs d'une ligne.
Exemple de données ATF :
DB $ff,$00,$00,$00,$02 ; Ligne 1
DB $ff,$00,$00,$00,$02 ; Ligne 2
DB $ff,$00,$00,$00,$02 ; Ligne #3
.....
DB $ff,$00,$00,$00,$02 ; Ligne #18
Le fichier ATtribute cidessus définirait la sélection de la palette de
couleurs SGB sur 3 pour les 4 premières colonnes de la fenêtre
d'action principale du jeu. La dernière colonne aurait la palette de
couleurs SGB 2 sélectionnée. Toutes les autres colonnes auraient la
palette 0 sélectionnée.
20. Définir les données de l'ATF (16 $) (données)
Transférer le fichier ATtribute spécifié vers la fenêtre GameBoy.
données : %/
xyyyyyy x 0 = Pas de changement, 1 = Annuler le masque après transfert
ATF yyyyyy = Numéro de fichier ATtribute ($00$2c)
21. Masque de fenêtre GameBoy (17 $) (données)
données : $00
= Désactivé $01 = Transfère la VRAM vers SNES jusqu'à annulation.
par DP Page 131
Machine Translated by Google
4.5. Commandes Manuel du processeur Game Boy™
$02 = Masque pour que tous les codes de couleur dans SGB
la palette de couleurs est noire.
$03 = Masque pour que tous les codes de couleur dans SBG
la palette de couleurs est blanche.
22. Mode Super NES OBJ (18 $)
23. Informations sur la palette de couleurs SNES
La Nintendo Super Famicom est capable d'afficher 256 couleurs à partir d'une
palette de 32 768. Ces 256 couleurs sont réparties en 16 palettes de 16 couleurs
chacune. Seules 8 de ces palettes sont accessibles par la SGB.
Les données de couleur sont composées de 3 composantes (Rouge, Vert, Bleu)
chacune de 5 bits (L'Amiga utilise exactement le même système, mais en utilisant
seulement 4 bits par composante).
00000 00000 00000 \ / \ / \ /
\ / \ / \ /
B g R
Exemples :
00000 10111 11100
11111 00000 00000 = $7C00 (Bleu Vif)
00000 11111 00000 = $03E0 (vert vif)
00000 00000 11111 = $001F (rouge vif)
00000 00000 00000 = 0000 $ (noir)
11111 11111 11111 = 7 FFF (Blanc)
Page 132 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 4.5. Commandes
24. Sélection de la palette SGB
Il n'y a en fait qu'une seule palette de couleurs dans le SNES mais elle est divisée en
plusieurs sections pour différentes fonctions SGB. Ces sections sont
appelées sections majeures (M) 07. Certaines fonctions SGB ont même divisé certaines de
ces sections en sections. Ces sections sont appelées sections mineures (m). Les
grands blocs cidessous représentent les sections ou palettes majeures et les plus
petits en dessous représentent les palettes mineures.
Il y a 4 couleurs par palette mineure et 16 couleurs par palette majeure :
+++++++++
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+++++++++
^ ^
|0123|
++ | |
^ ^ +++
+++
| | |
Définir avec des commandes Ensemble avec 64 couleurs dans l'image
#00, #01, #02, & #03 Transfert (#14)
(contient les couleurs SGB Border)
par DP Page 133
Machine Translated by Google
5. Annexe A Manuel du processeur Game Boy™
5. Annexe A
5.1. Remarques sur l'émulateur
Notes pour obtenir des programmes en langage assembleur qui s'exécutent sur un
émulateur pour qu'ils s'exécutent sur un vrai Go (par kOOPa, 2Jan98)
1. Les émulateurs ont tendance à régler toute la RAM sur 00 $ à la mise sous tension.
Les vrais Go n'initialisent PAS la RAM à la mise sous tension. La RAM est
remplie de valeurs aléatoires à la mise sous tension. Vous devez l'effacer vous
même si vous souhaitez qu'il soit réglé sur une valeur connue.
2. Le vrai matériel se moque de la ROM
somme de contrôle ($14e, $14f) mais la vérification du complément ($14d)
DOIT être correct ou les programmes se "verrouilleront" après avoir fait
défiler le logo Nintendo.
Utilisez RGBFIX V dans le système de développement RGBDS pour définir la
somme de contrôle et l'octet de complément après chaque compilation de
code source. Peu importe que vous programmiez en C ou en assembleur, ce
programme le résoudra.
3. Le graphique de défilement Nintendo de 104 $ à 133 $ doit être exact. Si un octet
est modifié, vos programmes se "verrouilleront" après avoir fait défiler ce logo
graphique.
4. Lorsque l'écran LCD est éteint (bit 7 de $ff40 réglé sur 0), vous pouvez écrire dans la
mémoire vidéo à tout moment sans restriction. Tant qu'il est activé, vous ne
pouvez écrire dans la mémoire vidéo que pendant HBlank et VBlank. Un code
similaire à celuici fonctionnera :
; Écrire B dans l'emplacement de la RAM vidéo HL
WriteVRAM : di
; désactiver les interruptions
Page 134 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 5.1. Remarques sur l'émulateur
Write1 :
ldh a,[$41] et 2 ;lire $ff41
jr
nz,Write1 ld [hl],b
ei
; activer les interruptions
ret
Il ne devrait pas y avoir beaucoup d'instructions entre le "jr nz" et l'écriture en
mémoire "ld [hl],b". Un pire cas de 64 cycles d'horloge CPU est disponible pour
accéder à la mémoire vidéo principale (pas OAM !) Suite à la commande
"jr nz".
Les commandes "di" et "ei" cidessus ne sont requises que si vous utilisez
des interruptions série, minuterie ou Hi2Lo.
5. L'écran LCD est allumé à la réinitialisation (bit 7 de $ff40 réglé sur bit 7 de $ff40
réglé sur 1). Avant que l'écran LCD puisse être éteint, vous devez attendre V
Blank. Une façon populaire de le faire est la suivante :
; Éteindre l'écran LCD
LCDOff :
ldh a,[$44h] cp ; $ff44=Pos Y LCDC ; 90 $
$90 jr et plus = en VBL
nz,LCDOff ; Boucle jusqu'à = 90 $
xou un
ldh [$41], un ret ; Éteindre l'écran LCD
Notez que vous devez désactiver les interruptions, si elles sont activées,
avant d'exécuter le code cidessus, sinon le test de $ff44 pourrait s'avérer
invalide.
L'activation de l'écran LCD peut être effectuée à tout moment.
par DP Page 135
Machine Translated by Google
5.1. Remarques sur l'émulateur Manuel du processeur Game Boy™
6. Si vous utilisez des sprites, vous ne devez pas utiliser les commandes
suivantes lorsque leur contenu de registre est compris entre $fe00 et
$feff.
inc bc
inc de
inc hl
déc bc
déc de
déc hl
Si vous ne suivez pas cette règle, la corbeille de sprite sous la forme
d'un "clignotement" de sprite affectera vos sprites de manière
aléatoire.
7. Normalement, vous ne devriez apporter des modifications à Sprite
RAM que pendant VBlank, sauf si vous êtes un expert et savez
exactement ce que vous faites. La manière courante de procéder
consiste à utiliser le registre GB DMA ($ff46) pour effectuer une
copie rapide de votre table de sprites dans la RAM vers $fE00$fe9f.
A. Vous avez besoin d'une table de sprites en RAM avec un
adresse de XX00 $ et d'une longueur de 160 $a0. Beaucoup utilisent
souvent $c000$c09f à cette fin, mais n'importe où dans la RAM
commençant par $XX00 convient.
B. Vous devez créer une routine d'interruption VBlank qui
contient la commande DMA, suivie d'un court délai pour permettre au
DMA de se terminer, et copie cette routine dans la mémoire vive
élevée ($ff00$fffe). La commande DMA NE FONCTIONNERA PAS
dans la ROM ou la RAM faible car elles sont désactivées pendant
le DMA.
C. Après avoir copié cette routine dans une RAM élevée, vous devez
ensuite activer l'interruption VBLANK, puis activer les
interruptions.
Page 136 Version 1.01
Machine Translated by Google
Manuel du processeur Game Boy™ 5.2. Chronogramme typique
5.2. Chronogramme type
(Basé sur un email de Philippe Pouliquen)
Le graphique montre une écriture suivie de deux lectures (mesurées
sur une GameBoy normale) :
Horaire:
a : 0ns
c'est le point auquel CLK passe à l'état haut, à partir duquel les autres temps
sont mesurés.
b : 140ns
point auquel /RD montera avant une écriture. C'est également le point auquel
l'adresse sur le bus d'adresse change. c : 240ns
point auquel /CS passe au niveau bas (c'est la broche 5 du connecteur)
d : 480ns
point auquel CLK devient bas. C'est également le point auquel /WR passe
au niveau bas pour une écriture et le GameBoy commence à piloter le
bus de données.
e : 840ns
par DP Page 137
Machine Translated by Google
5.2. Chronogramme type Manuel du processeur Game Boy™
point auquel /WR passe à l'état haut après une écriture. f :
960ns
point auquel CLK devient élevé. C'est également le point auquel /CS
monte et le GameBoy arrête de piloter le bus de données. g :
point de 990 ns auquel /RD
passe à
l'état bas pour une lecture (30 ns après que CLK passe à l'état haut).
(Mesures arrondies à la dizaine de ns la plus proche)
"Certains appareils (comme les puces de contrôleur de disque) exigent que
l'adresse soit valide avant d'y accéder (avec une impulsion de lecture
ou d'écriture).
Le problème est que /RD ne monte pas entre les lectures
consécutives, et le deuxième problème est que lorsque /RD effectue une
transition, il le fait en même temps (ou avant) que l'adresse change.
Le résultat est que du point de vue de l'appareil, une transition d'adresse
ressemble à un tas de lectures à partir d'adresses aléatoires. Ces fausses
lectures sont correctes pour la RAM et la ROM, mais peuvent vraiment
gâcher les choses pour les appareils dotés de tampons internes, car ils
peuvent être trompés en pensant que vous avez lu plus de données
que vous n'en avez réellement.
La façon de résoudre ce problème est de faire passer CLK et /RD par
une porte OU. L'inconvénient est que cela raccourcit votre temps de
lecture autorisé.
Page 138 Version 1.01
Machine Translated by Google
COMMANDANT X Manuel du processeur Game Boy™
par DP Page 139