-
Notifications
You must be signed in to change notification settings - Fork 0
/
step1-helloworld.asm
129 lines (107 loc) · 3.85 KB
/
step1-helloworld.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
; defines
PPUCTRL EQU $2000
PPUMASK EQU $2001
PPUSTATUS EQU $2002
PPUADDR EQU $2006
PPUDATA EQU $2007
ENUM $0000 ; Les variables "rapides"
vbl_cnt DS.B 1 ; Compteur de VBL (50 Hz)
vbl_flag DS.B 1 ; Mis à 1 par la VBL
pointer DS.W 1 ; Un pointeur pour le remplissage des "nametables"
ENDE
; header de 16o pour les emulateurs
DC.B "NES", $1a
DC.B 1 ; 1 boitier de 16Ko de rom cpu
DC.B 1 ; 1 boitier de 8Ko de rom ppu
DC.B 1 ; type de cartouche
DS.B 9, $00 ; 9 zeros pour completer les 16o
; debut de la partie code du programme
BASE $C000
RESET:
; remise a zero du compteur de vbl et du controle & du mask du ppu, ainsi que de l apu
LDA #0 ; 0 dans l'accumulateur A
STA vbl_cnt ; le contenu de A (ici 0) va à l'adresse vbl_count -> 1ere frame
STA PPUCTRL ; du Controle du PPU
STA PPUMASK ; du Mask du PPU
STA $4010 ; et de
LDA #$40 ; tout
STA $4017 ; l'APU
LDX #$ff ; Initialise X à 255
TXS ; met x dans la pile -> transfer x to stack pointer
; on attend que le ppu soit pret
BIT PPUSTATUS ; si ppu est prêt, ppustatus sera à 1 et met le bit de zero flag à 1
- BIT PPUSTATUS
BPL - ; loop sur - le plus proche si PPUSTATUS n est pas a 1 -> BNE branche si zero flag = 0 (branch if not equal)
; on remet a zero la ram (2Ko)
LDA #0
TAX ; Transfer A to X donc X = 0
- STA $0000,X ; 0 a l adresse 0 + x
STA $0100,X ; 256 + x
STA $0200,X ; 512 + x
STA $0300,X ; 768 + x
STA $0400,X ; 1024 + x
STA $0500,X ; 1280 + x
STA $0600,X ; 1536 + x
STA $0700,X ; 1792 + x
INX ; incremente x donc boucle suivante sera sur $0001, $0101, etc
BNE - ; si x != 0 loop sur - (permet de loop x sur 1 octet pour parcourir toutes les adresses puis x revient à 0)
; On attend encore un peu le PPU, au cas où
LDA PPUSTATUS
; on ne peut déplacer que 1 octet à la fois dans PPUADDR, sur nes on doit donc déplacer 2 octets en 2 opérations
; Chargement de la palette de couleurs
; les palettes de 16 couleurs chacunes sont stockées aux adresses $3F00 à $3F1F
; on veut déplacer ici #$3F00, la premiere palette
LDA #$3F ; On positionne le registre -> ici poids fort
STA PPUADDR ; d'adresse du PPU
LDA #$00 ; à la valeur $3F00 -> poids faible
STA PPUADDR
; faire chargement de la palette ici
; Effaçage des attributs
;(les inforamations de coleurs du bg en fonction de bloc de 16x16)
LDA PPUSTATUS ; On se resynchronise
LDA #$23 ; Le registre d'adresse PPU
STA PPUADDR ; est chargé avec la valeur
LDA #$C0 ; $23C0
STA PPUADDR ; (attributs de la nametable 0)
LDA #0 ; Initialise A
TAX ; et X à zéro
- STA PPUDATA ; 0 est envoyé au PPU
INX ; Et on boucle
CPX #64 ; 64 fois
BNE -
; on remplit la ram du ppu avec les donnees
;; Affichage du fond (nametable_)
LDA PPUSTATUS ; Resynchronisation
LDA #$20 ; On copie maintenant
STA PPUADDR ; vers l'adresse $2000
LDA #$00
STA PPUADDR
; charger la nametable
BIT PPUSTATUS ; Resynchronisation
- BIT PPUSTATUS ; On attend une dernière fois
BPL -
; Avant de rebrancher le PPU
LDA #%10010000 ; Réactivation, avec les tuiles de fond en $1000
STA PPUCTRL
LDA #%00011110 ; On veut montrer le fond au moins
STA PPUMASK
JMP mainloop
VBL:
PHA ; push de a vers la pile
LDA #1
STA vbl_flag
INC vbl_cnt
PLA ; pull de la pile vers a
RTI ; interruption
;; La boucle principale du programme
mainloop:
- LDA vbl_flag ; On a attend que la VBL ait lieu
BEQ -
LDA #0 ; et on réinitialise le drapeau
STA vbl_flag
JMP mainloop
; vecteurs d interruptions du 6502, la nes possède 3 vecteurs d'interruptions, on ne se servira que de RESET et de VBL ici
ORG $FFFA
DC.W VBL ; a chaque debut d image
DC.W RESET ; au lancement
DC.W $00 ; inutilisé