rubygb 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +5 -0
- data/.travis.yml +20 -0
- data/CHANGELOG.md +6 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +23 -0
- data/MIT-LICENSE.txt +53 -0
- data/README.md +30 -0
- data/Rakefile +30 -0
- data/bin/rubygb +5 -0
- data/lib/galp/AND.GIF +0 -0
- data/lib/galp/ARROW.GIF +0 -0
- data/lib/galp/C.BAT +5 -0
- data/lib/galp/CHANGES.TXT +5 -0
- data/lib/galp/EXAMPLE.LNK +7 -0
- data/lib/galp/EXAMPLE1.TXT +266 -0
- data/lib/galp/GBHW.TXT +645 -0
- data/lib/galp/GBSPEC.TXT +1761 -0
- data/lib/galp/IBMPC1.TXT +2400 -0
- data/lib/galp/INDEX.HTM +23 -0
- data/lib/galp/INSTR.HTM +563 -0
- data/lib/galp/MEM1.HTM +199 -0
- data/lib/galp/MEMORY.TXT +160 -0
- data/lib/galp/OPCODES.HTM +351 -0
- data/lib/galp/OR.GIF +0 -0
- data/lib/galp/README.TXT +4 -0
- data/lib/galp/REGS.HTM +77 -0
- data/lib/galp/RL.GIF +0 -0
- data/lib/galp/RLC.GIF +0 -0
- data/lib/galp/RR.GIF +0 -0
- data/lib/galp/RRC.GIF +0 -0
- data/lib/galp/SETUP.BAT +7 -0
- data/lib/galp/SLA.GIF +0 -0
- data/lib/galp/SRA.GIF +0 -0
- data/lib/galp/SRL.GIF +0 -0
- data/lib/galp/START.HTM +24 -0
- data/lib/galp/SWAP.GIF +0 -0
- data/lib/galp/VID1.HTM +34 -0
- data/lib/galp/XOR.GIF +0 -0
- data/lib/rgbds/rgbasm +0 -0
- data/lib/rgbds/rgbfix +0 -0
- data/lib/rgbds/rgblink +0 -0
- data/lib/rubygb/cli.rb +11 -0
- data/lib/rubygb/rubygb.rb +15 -0
- data/lib/rubygb/version.rb +4 -0
- data/lib/rubygb.rb +7 -0
- data/rubygb.gemspec +23 -0
- data/scrap/basic.gb +0 -0
- data/scrap/basic.map +55 -0
- data/scrap/basic.obj +0 -0
- data/scrap/basic.s +176 -0
- data/scrap/basic.sym +8 -0
- data/spec/basic.s +176 -0
- data/spec/rubygb_spec.rb +19 -0
- metadata +129 -0
data/lib/galp/GBSPEC.TXT
ADDED
@@ -0,0 +1,1761 @@
|
|
1
|
+
============================================================================
|
2
|
+
Everything You Always Wanted To Know About GAMEBOY *
|
3
|
+
============================================================================
|
4
|
+
|
5
|
+
* but were afraid to ask
|
6
|
+
|
7
|
+
|
8
|
+
Pan of -ATX- Document Updated by contributions from:
|
9
|
+
Marat Fayzullin, Pascal Felber, Paul Robson, Martin Korth
|
10
|
+
|
11
|
+
Last update 11-Mar-98 by kOOPa
|
12
|
+
|
13
|
+
Forward: The following was typed up for informational purposes regarding
|
14
|
+
the inner workings on the hand-held game machine known as
|
15
|
+
GameBoy, manufactured and designed by Nintendo Co., LTD.
|
16
|
+
This info is presented to inform a user on how their Game Boy
|
17
|
+
works and what makes it "tick". GameBoy is copyrighted by
|
18
|
+
Nintendo Co., LTD. Any reference to copyrighted material is
|
19
|
+
not presented for monetary gain, but for educational purposes
|
20
|
+
and higher learning.
|
21
|
+
|
22
|
+
Terms
|
23
|
+
-----
|
24
|
+
|
25
|
+
GB = Original GameBoy
|
26
|
+
GBP = GameBoy Pocket/GameBoy Light
|
27
|
+
GBC = GameBoy Color
|
28
|
+
SGB = Super GameBoy
|
29
|
+
|
30
|
+
|
31
|
+
Game Boy Specs
|
32
|
+
--------------
|
33
|
+
|
34
|
+
CPU: 8-bit (Similar to the Z80 processor.)
|
35
|
+
Main RAM: 8K Byte
|
36
|
+
Video RAM: 8K Byte
|
37
|
+
Screen Size 2.6"
|
38
|
+
Resolution: 160x144 (20x18 tiles)
|
39
|
+
Max # of sprites: 40
|
40
|
+
Max # sprites/line: 10
|
41
|
+
Max sprite size: 8x16
|
42
|
+
Min sprite size: 8x8
|
43
|
+
Clock Speed: 4.194304 MHz (4.295454 SGB, 4.194/8.388MHz GBC)
|
44
|
+
Horiz Sync: 9198 KHz (9420 KHz for SGB)
|
45
|
+
Vert Sync: 59.73 Hz (61.17 Hz for SGB)
|
46
|
+
Sound: 4 channels with stereo sound
|
47
|
+
Power: DC6V 0.7W (DC3V 0.7W for GB Pocket)
|
48
|
+
|
49
|
+
|
50
|
+
Processor
|
51
|
+
---------
|
52
|
+
|
53
|
+
The GameBoy uses a computer chip similar to an Intel 8080.
|
54
|
+
It contains all of the instructions of an 8080 except there
|
55
|
+
are no exchange instructions. In many ways the processor is
|
56
|
+
more similar to the Zilog Z80 processor. Compared to the
|
57
|
+
Z80, some instructions have been added and some have been
|
58
|
+
taken away.
|
59
|
+
|
60
|
+
The following are added instructions:
|
61
|
+
|
62
|
+
ADD SP,nn ;nn = signed byte
|
63
|
+
LDI (HL),A ;Write A to (HL) and increment HL
|
64
|
+
LDD (HL),A ;Write A to (HL) and decrement HL
|
65
|
+
LDI A,(HL) ;Write (HL) to A and increment HL
|
66
|
+
LDD A,(HL) ;Write (HL) to A and decrement HL
|
67
|
+
LD A,($FF00+nn)
|
68
|
+
LD A,($FF00+C)
|
69
|
+
LD ($FF00+nn),A
|
70
|
+
LD ($FF00+C),A
|
71
|
+
LD (nnnn),SP
|
72
|
+
LD HL,(SP+nn) ;nn = signed byte
|
73
|
+
STOP ;Stop processor & screen until button press
|
74
|
+
SWAP r ;Swap high & low nibbles of r
|
75
|
+
|
76
|
+
The following instructions have been removed:
|
77
|
+
|
78
|
+
Any command that uses the IX or IY registers.
|
79
|
+
All IN/OUT instructions.
|
80
|
+
All exchange instructions.
|
81
|
+
All commands prefixed by ED (except remapped RETI).
|
82
|
+
All conditional jumps/calls/rets on parity/overflow and sign flag.
|
83
|
+
|
84
|
+
The following instructions have different opcodes:
|
85
|
+
|
86
|
+
LD A,[nnnn]
|
87
|
+
LD [nnnn],A
|
88
|
+
RETI
|
89
|
+
|
90
|
+
|
91
|
+
General Memory Map* Hardware Write Registers
|
92
|
+
------------------ ------------------------
|
93
|
+
|
94
|
+
Interrupt Enable Register
|
95
|
+
--------------------------- FFFF
|
96
|
+
Internal RAM
|
97
|
+
--------------------------- FF80
|
98
|
+
Empty but unusable for I/O
|
99
|
+
--------------------------- FF4C
|
100
|
+
I/O ports
|
101
|
+
--------------------------- FF00
|
102
|
+
Empty but unusable for I/O
|
103
|
+
--------------------------- FEA0
|
104
|
+
Sprite Attrib Memory (OAM)
|
105
|
+
--------------------------- FE00
|
106
|
+
Echo of 8kB Internal RAM
|
107
|
+
--------------------------- E000
|
108
|
+
8kB Internal RAM
|
109
|
+
--------------------------- C000 -------------------------
|
110
|
+
8kB switchable RAM bank / MBC1 ROM/RAM Select
|
111
|
+
--------------------------- A000 / ------------------------
|
112
|
+
8kB Video RAM / / RAM Bank Select
|
113
|
+
--------------------------- 8000 --/ / -----------------------
|
114
|
+
16kB switchable ROM bank 6000 ----/ / ROM Bank Select
|
115
|
+
--------------------------- 4000 ------/ ----------------------
|
116
|
+
16kB ROM bank #0 2000 --------/ RAM Bank enable
|
117
|
+
--------------------------- 0000 -------------------------------
|
118
|
+
|
119
|
+
* NOTE: b = bit, B = byte
|
120
|
+
|
121
|
+
|
122
|
+
Echo of 8kB Internal RAM
|
123
|
+
------------------------
|
124
|
+
|
125
|
+
The addresses E000-FE00 appear to access the internal RAM
|
126
|
+
the same as C000-DE00. (i.e. If you write a byte to address
|
127
|
+
E000 it will appear at C000 and E000. Similarly, writing a
|
128
|
+
byte to C000 will appear at C000 and E000.)
|
129
|
+
|
130
|
+
|
131
|
+
User I/O
|
132
|
+
--------
|
133
|
+
|
134
|
+
There are no empty spaces in the memory map for
|
135
|
+
implementing input ports except the switchable RAM bank
|
136
|
+
area (not an option on the Super Smart Card since it's
|
137
|
+
RAM bank is always enabled).
|
138
|
+
|
139
|
+
An output only port may be implemented anywhere between
|
140
|
+
A000-FDFF. If implemented in a RAM area care should be
|
141
|
+
taken to use an area of RAM not used for anything else.
|
142
|
+
(FE00 and above can't be used because the CPU doesn't
|
143
|
+
generate an external /WR for these locations.)
|
144
|
+
|
145
|
+
If you have a cart with an MBC1, a ROM 4Mbit or smaller,
|
146
|
+
and a RAM 8Kbyte or smaller (or no RAM) then you can use
|
147
|
+
pins 6 & 7 of the MBC1 for 2 digital output pins for
|
148
|
+
whatever purpose you wish. To use them you must first
|
149
|
+
put the MBC1 into 4MbitROM/32KbyteRAM mode by writing
|
150
|
+
01 to 6000. The two least significant bits you write
|
151
|
+
to 4000 will then be output to these pins.
|
152
|
+
|
153
|
+
|
154
|
+
Reserved Memory Locations
|
155
|
+
-------------------------
|
156
|
+
|
157
|
+
0000 Restart $00 Address (RST $00 calls this address.)
|
158
|
+
|
159
|
+
0008 Restart $08 Address (RST $08 calls this address.)
|
160
|
+
|
161
|
+
0010 Restart $10 Address (RST $10 calls this address.)
|
162
|
+
|
163
|
+
0018 Restart $18 Address (RST $18 calls this address.)
|
164
|
+
|
165
|
+
0020 Restart $20 Address (RST $20 calls this address.)
|
166
|
+
|
167
|
+
0028 Restart $28 Address (RST $28 calls this address.)
|
168
|
+
|
169
|
+
0030 Restart $30 Address (RST $30 calls this address.)
|
170
|
+
|
171
|
+
0038 Restart $38 Address (RST $38 calls this address.)
|
172
|
+
|
173
|
+
0040 Vertical Blank Interrupt Start Address
|
174
|
+
|
175
|
+
0048 LCDC Status Interrupt Start Address
|
176
|
+
|
177
|
+
0050 Timer Overflow Interrupt Start Address
|
178
|
+
|
179
|
+
0058 Serial Transfer Completion Interrupt Start Address
|
180
|
+
|
181
|
+
0060 High-to-Low of P10-P13 Interrupt Start Address
|
182
|
+
|
183
|
+
An internal information area is located at 0100-014F in
|
184
|
+
each cartridge. It contains the following values:
|
185
|
+
|
186
|
+
0100-0103 This is the begin code execution point in a
|
187
|
+
cart. Usually there is a NOP and a JP
|
188
|
+
instruction here but not always.
|
189
|
+
|
190
|
+
0104-0133 Scrolling Nintendo graphic:
|
191
|
+
CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D
|
192
|
+
00 08 11 1F 88 89 00 0E DC CC 6E E6 DD DD D9 99
|
193
|
+
BB BB 67 63 6E 0E EC CC DD DC 99 9F BB B9 33 3E
|
194
|
+
( PROGRAM WON'T RUN IF CHANGED!!!)
|
195
|
+
|
196
|
+
0134-0142 Title of the game in UPPER CASE ASCII. If it
|
197
|
+
is less than 16 characters then the remaining
|
198
|
+
bytes are filled with 00's.
|
199
|
+
|
200
|
+
0143 $80 = Color GB, $00 or other = not Color GB
|
201
|
+
|
202
|
+
0144 Ascii hex digit, high nibble of licensee code (new).
|
203
|
+
0145 Ascii hex digit, low nibble of licensee code (new).
|
204
|
+
(These are normally $00 if [$014B] <> $33.)
|
205
|
+
|
206
|
+
0146 GB/SGB Indicator (00 = GameBoy, 03 = Super GameBoy functions)
|
207
|
+
(Super GameBoy functions won't work if <> $03.)
|
208
|
+
|
209
|
+
0147 Cartridge type:
|
210
|
+
0 - ROM ONLY 12 - ROM+MBC3+RAM
|
211
|
+
1 - ROM+MBC1 13 - ROM+MBC3+RAM+BATT
|
212
|
+
2 - ROM+MBC1+RAM 19 - ROM+MBC5
|
213
|
+
3 - ROM+MBC1+RAM+BATT 1A - ROM+MBC5+RAM
|
214
|
+
5 - ROM+MBC 1B - ROM+MBC5+RAM+BATT
|
215
|
+
6 - ROM+MBC2+BATTERY 1C - ROM+MBC5+RUMBLE
|
216
|
+
8 - ROM+RAM 1D - ROM+MBC5+RUMBLE+SRAM
|
217
|
+
9 - ROM+RAM+BATTERY 1E - ROM+MBC5+RUMBLE+SRAM+BATT
|
218
|
+
B - ROM+MMM01 1F - Pocket Camera
|
219
|
+
C - ROM+MMM01+SRAM FD - Bandai TAMA5
|
220
|
+
D - ROM+MMM01+SRAM+BATT FE - Hudson HuC-3
|
221
|
+
F - ROM+MBC3+TIMER+BATT FF - Hudson HuC-1
|
222
|
+
10 - ROM+MBC3+TIMER+RAM+BATT
|
223
|
+
11 - ROM+MBC3
|
224
|
+
|
225
|
+
0148 ROM size:
|
226
|
+
0 - 256Kbit = 32KByte = 2 banks
|
227
|
+
1 - 512Kbit = 64KByte = 4 banks
|
228
|
+
2 - 1Mbit = 128KByte = 8 banks
|
229
|
+
3 - 2Mbit = 256KByte = 16 banks
|
230
|
+
4 - 4Mbit = 512KByte = 32 banks
|
231
|
+
5 - 8Mbit = 1MByte = 64 banks
|
232
|
+
6 - 16Mbit = 2MByte = 128 banks
|
233
|
+
$52 - 9Mbit = 1.1MByte = 72 banks
|
234
|
+
$53 - 10Mbit = 1.2MByte = 80 banks
|
235
|
+
$54 - 12Mbit = 1.5MByte = 96 banks
|
236
|
+
|
237
|
+
0149 RAM size:
|
238
|
+
0 - None
|
239
|
+
1 - 16kBit = 2kB = 1 bank
|
240
|
+
2 - 64kBit = 8kB = 1 bank
|
241
|
+
3 - 256kBit = 32kB = 4 banks
|
242
|
+
4 - 1MBit =128kB =16 banks
|
243
|
+
|
244
|
+
014A Destination code:
|
245
|
+
0 - Japanese
|
246
|
+
1 - Non-Japanese
|
247
|
+
|
248
|
+
014B Licensee code (old):
|
249
|
+
33 - Check 0144/0145 for Licensee code.
|
250
|
+
79 - Accolade
|
251
|
+
A4 - Konami
|
252
|
+
(Super GameBoy function won't work if <> $33.)
|
253
|
+
|
254
|
+
014C Mask ROM Version number (Usually $00)
|
255
|
+
|
256
|
+
014D Complement check
|
257
|
+
(PROGRAM WON'T RUN ON GB IF NOT CORRECT!!!)
|
258
|
+
(It will run on Super GB, however, if incorrect.)
|
259
|
+
|
260
|
+
014E-014F Checksum (higher byte first) produced by
|
261
|
+
adding all bytes of a cartridge except for two
|
262
|
+
checksum bytes and taking two lower bytes of
|
263
|
+
the result. (GameBoy ignores this value.)
|
264
|
+
|
265
|
+
|
266
|
+
Cartridge Types
|
267
|
+
---------------
|
268
|
+
|
269
|
+
The following define the byte at cart location 0147:
|
270
|
+
|
271
|
+
ROM ONLY
|
272
|
+
This is a 32kB (256kb) ROM and occupies 0000-7FFF.
|
273
|
+
|
274
|
+
MBC1 (Memory Bank Controller 1)
|
275
|
+
MBC1 has two different maximum memory modes:
|
276
|
+
16Mbit ROM/8KByte RAM or 4Mbit ROM/32KByte RAM.
|
277
|
+
|
278
|
+
The MBC1 defaults to 16Mbit ROM/8KByte RAM mode
|
279
|
+
on power up. Writing a value (XXXXXXXS - X = Don't
|
280
|
+
care, S = Memory model select) into 6000-7FFF area
|
281
|
+
will select the memory model to use. S = 0 selects
|
282
|
+
16/8 mode. S = 1 selects 4/32 mode.
|
283
|
+
|
284
|
+
Writing a value (XXXBBBBB - X = Don't cares, B =
|
285
|
+
bank select bits) into 2000-3FFF area will select an
|
286
|
+
appropriate ROM bank at 4000-7FFF. Values of 0 and 1
|
287
|
+
do the same thing and point to ROM bank 1. Rom bank 0
|
288
|
+
is not accessible from 4000-7FFF and can only be read
|
289
|
+
from 0000-3FFF.
|
290
|
+
|
291
|
+
If memory model is set to 4/32:
|
292
|
+
Writing a value (XXXXXXBB - X = Don't care, B =
|
293
|
+
bank select bits) into 4000-5FFF area will select an
|
294
|
+
appropriate RAM bank at A000-C000. Before you can
|
295
|
+
read or write to a RAM bank you have to enable it by
|
296
|
+
writing a XXXX1010 into 0000-1FFF area*. To disable
|
297
|
+
RAM bank operations write any value but XXXX1010
|
298
|
+
into 0000-1FFF area. Disabling a RAM bank probably
|
299
|
+
protects that bank from false writes during power
|
300
|
+
down of the GameBoy. (NOTE: Nintendo suggests values
|
301
|
+
$0A to enable and $00 to disable RAM bank!!)
|
302
|
+
|
303
|
+
If memory model is set to 16/8 mode:
|
304
|
+
Writing a value (XXXXXXBB - X = Don't care, B =
|
305
|
+
bank select bits) into 4000-5FFF area will set the
|
306
|
+
two most significant ROM address lines.
|
307
|
+
|
308
|
+
* NOTE: The Super Smart Card doesn't require this
|
309
|
+
operation because it's RAM bank is ALWAYS enabled.
|
310
|
+
Include this operation anyway to allow your code
|
311
|
+
to work with both.
|
312
|
+
|
313
|
+
MBC2 (Memory Bank Controller 2):
|
314
|
+
This memory controller works much like the MBC1
|
315
|
+
controller with the following exceptions:
|
316
|
+
|
317
|
+
MBC2 will work with ROM sizes up to 2Mbit.
|
318
|
+
|
319
|
+
Writing a value (XXXXBBBB - X = Don't cares, B =
|
320
|
+
bank select bits) into 2000-3FFF area will select an
|
321
|
+
appropriate ROM bank at 4000-7FFF.
|
322
|
+
|
323
|
+
RAM switching is not provided. Unlike the MBC1 which
|
324
|
+
uses external RAM, MBC2 has 512 x 4 bits of RAM which
|
325
|
+
is in the controller itself. It still requires an
|
326
|
+
external battery to save data during power-off though.
|
327
|
+
|
328
|
+
The least significant bit of the upper address byte
|
329
|
+
must be zero to enable/disable cart RAM. For example
|
330
|
+
the following addresses can be used to enable/disable
|
331
|
+
cart RAM:
|
332
|
+
0000-00FF, 0200-02FF, 0400-04FF, ..., 1E00-1EFF.
|
333
|
+
The suggested address range to use for MBC2 ram
|
334
|
+
enable/disable is 0000-00FF.
|
335
|
+
|
336
|
+
The least significant bit of the upper address byte
|
337
|
+
must be one to select a ROM bank. For example the
|
338
|
+
following addresses can be used to select a ROM bank:
|
339
|
+
2100-21FF, 2300-23FF, 2500-25FF, ..., 3F00-3FFF.
|
340
|
+
The suggested address range to use for MBC2 rom
|
341
|
+
bank selection is 2100-21FF.
|
342
|
+
|
343
|
+
MBC3 (Memory Bank Controller 3):
|
344
|
+
This controller is similar to MBC1 except it accesses
|
345
|
+
all 16mbits of ROM without requiring any writes to the
|
346
|
+
4000-5FFF area.
|
347
|
+
Writing a value (XBBBBBBB - X = Don't care, B =
|
348
|
+
bank select bits) into 2000-3FFF area will select an
|
349
|
+
appropriate ROM bank at 4000-7FFF.
|
350
|
+
|
351
|
+
Also, this MBC has a built-in battery-backed Real
|
352
|
+
Time Clock (RTC) not found in any other MBC. Some
|
353
|
+
MBC3 carts do not support it (WarioLand II non-color
|
354
|
+
version) but some do (Harvest Moon/Japanese version.)
|
355
|
+
|
356
|
+
MBC5 (Memory Bank Controller 5):
|
357
|
+
This controller is the first MBC that is guaranteed
|
358
|
+
to run in GameBoy Color double-speed mode but it
|
359
|
+
appears the other MBC's run fine in GBC double-speed
|
360
|
+
mode as well.
|
361
|
+
|
362
|
+
It is similar to the MBC3 (but no RTC) but can
|
363
|
+
access up to 64mbits of ROM and up to 1mbit of RAM.
|
364
|
+
The lower 8 bits of the 9-bit rom bank select is
|
365
|
+
written to the 2000-2FFF area while the upper bit
|
366
|
+
is written to the least significant bit of the
|
367
|
+
3000-3FFF area.
|
368
|
+
|
369
|
+
Also, this is the first MBC that allows rom bank 0
|
370
|
+
to appear in the 4000-7FFF range by writing $000
|
371
|
+
to the rom bank select.
|
372
|
+
|
373
|
+
HuC1 (Memory Bank / Infrared Controller):
|
374
|
+
This controller made by Hudson Soft appears to be
|
375
|
+
very similar to an MBC1 with the main difference
|
376
|
+
being that it supports infrared LED input / output.
|
377
|
+
The Japanese cart "Fighting Phoenix" (internal cart
|
378
|
+
name: SUPER B DAMAN) is known to contain this chip.
|
379
|
+
|
380
|
+
|
381
|
+
Power Up Sequence
|
382
|
+
-----------------
|
383
|
+
|
384
|
+
When the GameBoy is powered up, a 256 byte program
|
385
|
+
starting at memory location 0 is executed. This program
|
386
|
+
is located in a ROM inside the GameBoy. The first thing
|
387
|
+
the program does is read the cartridge locations from
|
388
|
+
$104 to $133 and place this graphic of a Nintendo logo
|
389
|
+
on the screen at the top. This image is then scrolled
|
390
|
+
until it is in the middle of the screen. Two musical
|
391
|
+
notes are then played on the internal speaker. Again,
|
392
|
+
the cartridge locations $104 to $133 are read but this
|
393
|
+
time they are compared with a table in the internal rom.
|
394
|
+
If any byte fails to compare, then the GameBoy stops
|
395
|
+
comparing bytes and simply halts all operations.
|
396
|
+
|
397
|
+
GB & GB Pocket:
|
398
|
+
Next, the GameBoy starts adding all of the bytes
|
399
|
+
in the cartridge from $134 to $14d. A value of 25
|
400
|
+
decimal is added to this total. If the least
|
401
|
+
significant byte of the result is a not a zero,
|
402
|
+
then the GameBoy will stop doing anything.
|
403
|
+
|
404
|
+
Super GB:
|
405
|
+
Even though the GB & GBP check the memory locations
|
406
|
+
from $134 to $14d, the SGB doesn't.
|
407
|
+
|
408
|
+
If the above checks pass then the internal ROM is
|
409
|
+
disabled and cartridge program execution begins at
|
410
|
+
location $100 with the following register values:
|
411
|
+
|
412
|
+
AF=$01-GB/SGB, $FF-GBP, $11-GBC
|
413
|
+
F =$B0
|
414
|
+
BC=$0013
|
415
|
+
DE=$00D8
|
416
|
+
HL=$014D
|
417
|
+
Stack Pointer=$FFFE
|
418
|
+
[$FF05] = $00 ; TIMA
|
419
|
+
[$FF06] = $00 ; TMA
|
420
|
+
[$FF07] = $00 ; TAC
|
421
|
+
[$FF10] = $80 ; NR10
|
422
|
+
[$FF11] = $BF ; NR11
|
423
|
+
[$FF12] = $F3 ; NR12
|
424
|
+
[$FF14] = $BF ; NR14
|
425
|
+
[$FF16] = $3F ; NR21
|
426
|
+
[$FF17] = $00 ; NR22
|
427
|
+
[$FF19] = $BF ; NR24
|
428
|
+
[$FF1A] = $7F ; NR30
|
429
|
+
[$FF1B] = $FF ; NR31
|
430
|
+
[$FF1C] = $9F ; NR32
|
431
|
+
[$FF1E] = $BF ; NR33
|
432
|
+
[$FF20] = $FF ; NR41
|
433
|
+
[$FF21] = $00 ; NR42
|
434
|
+
[$FF22] = $00 ; NR43
|
435
|
+
[$FF23] = $BF ; NR30
|
436
|
+
[$FF24] = $77 ; NR50
|
437
|
+
[$FF25] = $F3 ; NR51
|
438
|
+
[$FF26] = $F1-GB, $F0-SGB ; NR52
|
439
|
+
[$FF40] = $91 ; LCDC
|
440
|
+
[$FF42] = $00 ; SCY
|
441
|
+
[$FF43] = $00 ; SCX
|
442
|
+
[$FF45] = $00 ; LYC
|
443
|
+
[$FF47] = $FC ; BGP
|
444
|
+
[$FF48] = $FF ; OBP0
|
445
|
+
[$FF49] = $FF ; OBP1
|
446
|
+
[$FF4A] = $00 ; WY
|
447
|
+
[$FF4B] = $00 ; WX
|
448
|
+
[$FFFF] = $00 ; IE
|
449
|
+
|
450
|
+
It is not a good idea to assume the above values
|
451
|
+
will always exist. A later version GameBoy could
|
452
|
+
contain different values than these at reset.
|
453
|
+
Always set these registers on reset rather than
|
454
|
+
assume they are as above.
|
455
|
+
|
456
|
+
Please note that GameBoy internal RAM on power up
|
457
|
+
contains random data. All of the GameBoy emulators
|
458
|
+
tend to set all RAM to value $00 on entry.
|
459
|
+
|
460
|
+
Cart RAM the first time it is accessed on a real
|
461
|
+
GameBoy contains random data. It will only contain
|
462
|
+
known data if the GameBoy code initializes it to
|
463
|
+
some value.
|
464
|
+
|
465
|
+
Stop Mode
|
466
|
+
---------
|
467
|
+
|
468
|
+
The STOP command halts the GameBoy processor
|
469
|
+
and screen until any button is pressed. The GB
|
470
|
+
and GBP screen goes white with a single dark
|
471
|
+
horizontal line. The GBC screen goes black.
|
472
|
+
|
473
|
+
|
474
|
+
Low-Power Mode
|
475
|
+
--------------
|
476
|
+
|
477
|
+
It is recommended that the HALT instruction be used
|
478
|
+
whenever possible to reduce power consumption & extend
|
479
|
+
the life of the batteries. This command stops the
|
480
|
+
system clock reducing the power consumption of both
|
481
|
+
the CPU and ROM.
|
482
|
+
|
483
|
+
The CPU will remain suspended until an interrupt
|
484
|
+
occurs at which point the interrupt is serviced and
|
485
|
+
then the instruction immediately following the HALT
|
486
|
+
is executed. If interrupts are disabled (DI) then
|
487
|
+
halt doesn't suspend operation but it does cause
|
488
|
+
the program counter to stop counting for one
|
489
|
+
instruction on the GB,GBP, and SGB as mentioned below.
|
490
|
+
|
491
|
+
Depending on how much CPU time is required by a game,
|
492
|
+
the HALT instruction can extend battery life anywhere
|
493
|
+
from 5 to 50% or possibly more.
|
494
|
+
|
495
|
+
WARNING: The instruction immediately following the
|
496
|
+
HALT instruction is "skipped" when interrupts are
|
497
|
+
disabled (DI) on the GB,GBP, and SGB. As a result,
|
498
|
+
always put a NOP after the HALT instruction. This
|
499
|
+
instruction skipping doesn't occur when interrupts
|
500
|
+
are enabled (EI).
|
501
|
+
This "skipping" does not seem to occur on the
|
502
|
+
GameBoy Color even in regular GB mode. ($143=$00)
|
503
|
+
|
504
|
+
EXAMPLES from Martin Korth who documented this problem:
|
505
|
+
(assuming interrupts disabled for all examples)
|
506
|
+
|
507
|
+
1) This code causes the 'a' register to be incremented TWICE.
|
508
|
+
76 halt
|
509
|
+
3C inc a
|
510
|
+
|
511
|
+
2) The next example is a bit more difficult. The following code
|
512
|
+
76 halt
|
513
|
+
FA 34 12 ld a,(1234)
|
514
|
+
|
515
|
+
is effectively executed as
|
516
|
+
|
517
|
+
76 halt
|
518
|
+
FA FA 34 ld a,(34FA)
|
519
|
+
12 ld (de),a
|
520
|
+
|
521
|
+
3) Finally an interesting side effect
|
522
|
+
76 halt
|
523
|
+
76 halt
|
524
|
+
|
525
|
+
This combination hangs the cpu.
|
526
|
+
The first HALT causes the second HALT to be repeated, which
|
527
|
+
therefore causes the following command (=itself) to be
|
528
|
+
repeated - again and again.
|
529
|
+
Placing a NOP between the two halts would cause the NOP to
|
530
|
+
be repeated once, the second HALT wouldn't lock the cpu.
|
531
|
+
|
532
|
+
Below is suggested code for GameBoy programs:
|
533
|
+
|
534
|
+
; **** Main Game Loop ****
|
535
|
+
Main:
|
536
|
+
halt ; stop system clock
|
537
|
+
; return from halt when interrupted
|
538
|
+
nop ; (See WARNING above.)
|
539
|
+
|
540
|
+
ld a,(VblnkFlag)
|
541
|
+
or a ; V-Blank interrupt ?
|
542
|
+
jr z,Main ; No, some other interrupt
|
543
|
+
|
544
|
+
xor a
|
545
|
+
ld (VblnkFlag),a ; Clear V-Blank flag
|
546
|
+
|
547
|
+
call Controls ; button inputs
|
548
|
+
call Game ; game operation
|
549
|
+
|
550
|
+
jr Main
|
551
|
+
|
552
|
+
; **** V-Blank Interrupt Routine ****
|
553
|
+
Vblnk:
|
554
|
+
push af
|
555
|
+
push bc
|
556
|
+
push de
|
557
|
+
push hl
|
558
|
+
|
559
|
+
call SpriteDma ; Do sprite updates
|
560
|
+
|
561
|
+
ld a,1
|
562
|
+
ld (VblnkFlag),a
|
563
|
+
|
564
|
+
pop hl
|
565
|
+
pop de
|
566
|
+
pop bc
|
567
|
+
pop af
|
568
|
+
reti
|
569
|
+
|
570
|
+
|
571
|
+
Video
|
572
|
+
-----
|
573
|
+
|
574
|
+
The main GameBoy screen buffer (background) consists
|
575
|
+
of 256x256 pixels or 32x32 tiles (8x8 pixels each). Only
|
576
|
+
160x144 pixels can be displayed on the screen. Registers
|
577
|
+
SCROLLX and SCROLLY hold the coordinates of background to
|
578
|
+
be displayed in the left upper corner of the screen.
|
579
|
+
Background wraps around the screen (i.e. when part of it
|
580
|
+
goes off the screen, it appears on the opposite side.)
|
581
|
+
|
582
|
+
An area of VRAM known as Background Tile Map contains
|
583
|
+
the numbers of tiles to be displayed. It is organized as
|
584
|
+
32 rows of 32 bytes each. Each byte contains a number of
|
585
|
+
a tile to be displayed. Tile patterns are taken from the
|
586
|
+
Tile Data Table located either at $8000-8FFF or
|
587
|
+
$8800-97FF. In the first case, patterns are numbered with
|
588
|
+
unsigned numbers from 0 to 255 (i.e. pattern #0 lies at
|
589
|
+
address $8000). In the second case, patterns have signed
|
590
|
+
numbers from -128 to 127 (i.e. pattern #0 lies at address
|
591
|
+
$9000). The Tile Data Table address for the background
|
592
|
+
can be selected via LCDC register.
|
593
|
+
|
594
|
+
Besides background, there is also a "window" overlaying
|
595
|
+
the background. The window is not scrollable i.e. it is
|
596
|
+
always displayed starting from its left upper corner. The
|
597
|
+
location of a window on the screen can be adjusted via
|
598
|
+
WNDPOSX and WNDPOSY registers. Screen coordinates of the
|
599
|
+
top left corner of a window are WNDPOSX-7,WNDPOSY. The
|
600
|
+
tile numbers for the window are stored in the Tile Data
|
601
|
+
Table. None of the windows tiles are ever transparent.
|
602
|
+
Both the Background and the window share the same Tile
|
603
|
+
Data Table.
|
604
|
+
|
605
|
+
Both background and window can be disabled or enabled
|
606
|
+
separately via bits in the LCDC register.
|
607
|
+
|
608
|
+
If the window is used and a scan line interrupt disables
|
609
|
+
it (either by writing to LCDC or by setting WX > 166)
|
610
|
+
and a scan line interrupt a little later on enables it
|
611
|
+
then the window will resume appearing on the screen at the
|
612
|
+
exact position of the window where it left off earlier.
|
613
|
+
This way, even if there are only 16 lines of useful graphics
|
614
|
+
in the window, you could display the first 8 lines at the
|
615
|
+
top of the screen and the next 8 lines at the bottom if
|
616
|
+
you wanted to do so.
|
617
|
+
|
618
|
+
WX may be changed during a scan line interrupt (to either
|
619
|
+
cause a graphic distortion effect or to disable the window
|
620
|
+
(WX>166) ) but changes to WY are not dynamic and won't
|
621
|
+
be noticed until the next screen redraw.
|
622
|
+
|
623
|
+
The tile images are stored in the Tile Pattern Tables.
|
624
|
+
Each 8x8 image occupies 16 bytes, where each 2 bytes
|
625
|
+
represent a line:
|
626
|
+
|
627
|
+
Tile: Image:
|
628
|
+
|
629
|
+
.33333.. .33333.. -> 01111100 -> $7C
|
630
|
+
22...22. 01111100 -> $7C
|
631
|
+
11...11. 22...22. -> 00000000 -> $00
|
632
|
+
2222222. <-- digits 11000110 -> $C6
|
633
|
+
33...33. represent 11...11. -> 11000110 -> $C6
|
634
|
+
22...22. color 00000000 -> $00
|
635
|
+
11...11. numbers 2222222. -> 00000000 -> $00
|
636
|
+
........ 11111110 -> $FE
|
637
|
+
33...33. -> 11000110 -> $C6
|
638
|
+
11000110 -> $C6
|
639
|
+
22...22. -> 00000000 -> $00
|
640
|
+
11000110 -> $C6
|
641
|
+
11...11. -> 11000110 -> $C6
|
642
|
+
00000000 -> $00
|
643
|
+
........ -> 00000000 -> $00
|
644
|
+
00000000 -> $00
|
645
|
+
|
646
|
+
As it was said before, there are two Tile Pattern Tables
|
647
|
+
at $8000-8FFF and at $8800-97FF. The first one can be used
|
648
|
+
for sprites, the background, and the window display. Its
|
649
|
+
tiles are numbered from 0 to 255. The second table can be
|
650
|
+
used for the background and the window display and its tiles
|
651
|
+
are numbered from -128 to 127.
|
652
|
+
|
653
|
+
|
654
|
+
Sprites
|
655
|
+
------
|
656
|
+
|
657
|
+
GameBoy video controller can display up to 40 sprites
|
658
|
+
either in 8x8 or in 8x16 pixels. Because of a limitation
|
659
|
+
of hardware, only ten sprites can be displayed per scan
|
660
|
+
line. Sprite patterns have the same format as tiles, but
|
661
|
+
they are taken from the Sprite Pattern Table located at
|
662
|
+
$8000-8FFF and have unsigned numbering. Sprite
|
663
|
+
attributes reside in the Sprite Attribute Table (OAM
|
664
|
+
- Object Attribute Memory) at $FE00-FE9F. OAM is divided
|
665
|
+
into 40 4-byte blocks each of which corresponds to a sprite.
|
666
|
+
|
667
|
+
In 8x16 sprite mode, the least significant bit of the
|
668
|
+
sprite pattern number is ignored and treated as 0.
|
669
|
+
|
670
|
+
When sprites with different x coordinate values overlap,
|
671
|
+
the one with the smaller x coordinate (closer to the left)
|
672
|
+
will have priority and appear above any others.
|
673
|
+
|
674
|
+
When sprites with the same x coordinate values overlap,
|
675
|
+
they have priority according to table ordering. (i.e.
|
676
|
+
$FE00 - highest, $FE04 - next highest, etc.)
|
677
|
+
|
678
|
+
Please note that Sprite X=0, Y=0 hides a sprite. To
|
679
|
+
display a sprite use the following formulas:
|
680
|
+
|
681
|
+
SpriteScreenPositionX(Upper left corner of sprite) = SpriteX - 8
|
682
|
+
SpriteScreenPositionY(Upper left corner of sprite) = SpriteY - 16
|
683
|
+
|
684
|
+
To display a sprite in the upper left corner of the
|
685
|
+
screen set sprite X=8, Y=16.
|
686
|
+
|
687
|
+
Only 10 sprites can be displayed on any one line.
|
688
|
+
When this limit is exceeded, the lower priority sprites
|
689
|
+
(priorities listed above) won't be displayed. To keep
|
690
|
+
unused sprites from affecting onscreen sprites set their
|
691
|
+
Y coordinate to Y=0 or Y=>144+16. Just setting the X
|
692
|
+
coordinate to X=0 or X=>160+8 on a sprite will hide it
|
693
|
+
but it will still affect other sprites sharing the same
|
694
|
+
lines.
|
695
|
+
|
696
|
+
Blocks have the following
|
697
|
+
format:
|
698
|
+
|
699
|
+
Byte0 Y position on the screen
|
700
|
+
Byte1 X position on the screen
|
701
|
+
Byte2 Pattern number 0-255 (Unlike some tile
|
702
|
+
numbers, sprite pattern numbers are unsigned.
|
703
|
+
LSB is ignored (treated as 0) in 8x16 mode.)
|
704
|
+
Byte3 Flags:
|
705
|
+
|
706
|
+
Bit7 Priority
|
707
|
+
If this bit is set to 0, sprite is displayed
|
708
|
+
on top of background & window. If this bit
|
709
|
+
is set to 1, then sprite will be hidden behind
|
710
|
+
colors 1, 2, and 3 of the background & window.
|
711
|
+
(Sprite only prevails over color 0 of BG & win.)
|
712
|
+
Bit6 Y flip
|
713
|
+
Sprite pattern is flipped vertically if
|
714
|
+
this bit is set to 1.
|
715
|
+
Bit5 X flip
|
716
|
+
Sprite pattern is flipped horizontally if
|
717
|
+
this bit is set to 1.
|
718
|
+
Bit4 Palette number
|
719
|
+
Sprite colors are taken from OBJ1PAL if
|
720
|
+
this bit is set to 1 and from OBJ0PAL
|
721
|
+
otherwise.
|
722
|
+
|
723
|
+
|
724
|
+
Sprite RAM Bug
|
725
|
+
--------------
|
726
|
+
|
727
|
+
There is a flaw in the GameBoy hardware that causes
|
728
|
+
trash to be written to OAM RAM if the following commands
|
729
|
+
are used while their 16-bit content is in the range
|
730
|
+
of $FE00 to $FEFF:
|
731
|
+
|
732
|
+
inc xx (xx = bc,de, or hl)
|
733
|
+
dec xx
|
734
|
+
|
735
|
+
ldi a,(hl)
|
736
|
+
ldd a,(hl)
|
737
|
+
|
738
|
+
ldi (hl),a
|
739
|
+
ldd (hl),a
|
740
|
+
|
741
|
+
Only sprites 1 & 2 ($FE00 & $FE04) are not affected
|
742
|
+
by these instructions.
|
743
|
+
|
744
|
+
|
745
|
+
Sound
|
746
|
+
-----
|
747
|
+
|
748
|
+
There are two sound channels connected to the output
|
749
|
+
terminals SO1 and SO2. There is also a input terminal Vin
|
750
|
+
connected to the cartridge. It can be routed to either of
|
751
|
+
both output terminals. GameBoy circuitry allows producing
|
752
|
+
sound in four different ways:
|
753
|
+
|
754
|
+
Quadrangular wave patterns with sweep and envelope functions.
|
755
|
+
Quadrangular wave patterns with envelope functions.
|
756
|
+
Voluntary wave patterns from wave RAM.
|
757
|
+
White noise with an envelope function.
|
758
|
+
|
759
|
+
These four sounds can be controlled independantly and
|
760
|
+
then mixed separately for each of the output terminals.
|
761
|
+
|
762
|
+
Sound registers may be set at all times while producing
|
763
|
+
sound.
|
764
|
+
|
765
|
+
When setting the initial value of the envelope and
|
766
|
+
restarting the length counter, set the initial flag to 1
|
767
|
+
and initialize the data.
|
768
|
+
|
769
|
+
Under the following situations the Sound ON flag is
|
770
|
+
reset and the sound output stops:
|
771
|
+
|
772
|
+
1. When the sound output is stopped by the length counter.
|
773
|
+
2. When overflow occurs at the addition mode while sweep
|
774
|
+
is operating at sound 1.
|
775
|
+
|
776
|
+
When the Sound OFF flag for sound 3 (bit 7 of NR30) is
|
777
|
+
set at 0, the cancellation of the OFF mode must be done
|
778
|
+
by setting the sound OFF flag to 1. By initializing
|
779
|
+
sound 3, it starts it's function.
|
780
|
+
|
781
|
+
When the All Sound OFF flag (bit 7 of NR52) is set to 0,
|
782
|
+
the mode registers for sounds 1,2,3, and 4 are reset and
|
783
|
+
the sound output stops. (NOTE: The setting of each sounds
|
784
|
+
mode register must be done after the All Sound OFF mode
|
785
|
+
is cancelled. During the All Sound OFF mode, each sound
|
786
|
+
mode register cannot be set.)
|
787
|
+
|
788
|
+
NOTE: DURING THE ALL SOUND OFF MODE, GB POWER CONSUMPTION
|
789
|
+
DROPS BY 16% OR MORE! WHILE YOUR PROGRAMS AREN'T USING
|
790
|
+
SOUND THEN SET THE ALL SOUND OFF FLAG TO 0. IT DEFAULTS
|
791
|
+
TO 1 ON RESET.
|
792
|
+
|
793
|
+
These tend to be the two most important equations in
|
794
|
+
converting between Hertz and GB frequency registers:
|
795
|
+
(Sounds will have a 2.4% higher frequency on Super GB.)
|
796
|
+
|
797
|
+
gb = 2048 - (131072 / Hz)
|
798
|
+
|
799
|
+
Hz = 131072 / (2048 - gb)
|
800
|
+
|
801
|
+
|
802
|
+
Timer
|
803
|
+
-----
|
804
|
+
|
805
|
+
Sometimes it's useful to have a timer that interrupts at
|
806
|
+
regular intervals for routines that require periodic or
|
807
|
+
percise updates. The timer in the GameBoy has a selectable
|
808
|
+
frequency of 4096, 16384, 65536, or 262144 Hertz. This
|
809
|
+
frequency increments the Timer Counter (TIMA). When it
|
810
|
+
overflows, it generates an interrupt. It is then loaded
|
811
|
+
with the contents of Timer Modulo (TMA). The following
|
812
|
+
are examples:
|
813
|
+
|
814
|
+
;This interval timer interrupts 4096 times per second
|
815
|
+
|
816
|
+
ld a,-1
|
817
|
+
ld ($FF06),a ;Set TMA to divide clock by 1
|
818
|
+
ld a,4
|
819
|
+
ld ($FF07),a ;Set clock to 4096 Hertz
|
820
|
+
|
821
|
+
;This interval timer interrupts 65536 times per second
|
822
|
+
|
823
|
+
ld a,-4
|
824
|
+
ld ($FF06),a ;Set TMA to divide clock by 4
|
825
|
+
ld a,5
|
826
|
+
ld ($FF07),a ;Set clock to 262144 Hertz
|
827
|
+
|
828
|
+
|
829
|
+
Serial I/O
|
830
|
+
----------
|
831
|
+
|
832
|
+
The serial I/O port on the Gameboy is a very simple setup
|
833
|
+
and is crude compared to standard RS-232 (IBM-PC) or RS-485
|
834
|
+
(Macintosh) serial ports. There are no start or stop bits
|
835
|
+
so the programmer must be more creative when using this port.
|
836
|
+
|
837
|
+
During a transfer, a byte is shifted in at the same time
|
838
|
+
that a byte is shifted out. The rate of the shift is deter-
|
839
|
+
mined by whether the clock source is internal or external.
|
840
|
+
If internal, the bits are shifted out at a rate of 8192Hz
|
841
|
+
(122 microseconds) per bit. The most significant bit is
|
842
|
+
shifted in and out first.
|
843
|
+
|
844
|
+
When the internal clock is selected, it drives the clock
|
845
|
+
pin on the game link port and it stays high when not used.
|
846
|
+
During a transfer it will go low eight times to clock
|
847
|
+
in/out each bit.
|
848
|
+
|
849
|
+
A programmer initates a serial transfer by setting bit 7
|
850
|
+
of $FF02. This bit may be read and is automatically set
|
851
|
+
to 0 at the completion of transfer. After this bit is set,
|
852
|
+
an interrupt will then occur eight bit clocks later if the
|
853
|
+
serial interrupt is enabled.
|
854
|
+
If internal clock is selected and serial interrupt is
|
855
|
+
enabled, this interrupt occurs 122*8 microseconds later.
|
856
|
+
If external clock is selected and serial interrupt is
|
857
|
+
enabled, an interrupt will occur eight bit clocks later.
|
858
|
+
|
859
|
+
Initiating a serial transfer with external clock will
|
860
|
+
wait forever if no external clock is present. This allows
|
861
|
+
a certain amount of synchronization with each serial port.
|
862
|
+
|
863
|
+
The state of the last bit shifted out determines the
|
864
|
+
state of the output line until another transfer takes
|
865
|
+
place.
|
866
|
+
|
867
|
+
If a serial transfer with internal clock is performed
|
868
|
+
and no external GameBoy is present, a value of $FF will
|
869
|
+
be received in the transfer.
|
870
|
+
|
871
|
+
The following code causes $75 to be shifted out the
|
872
|
+
serial port and a byte to be shifted into $FF01:
|
873
|
+
|
874
|
+
ld a,$75
|
875
|
+
ld ($FF01),a
|
876
|
+
ld a,$81
|
877
|
+
ld ($FF02),a
|
878
|
+
|
879
|
+
|
880
|
+
Interrupt Procedure
|
881
|
+
-------------------
|
882
|
+
|
883
|
+
The IME (interrupt master enable) flag is reset by DI and
|
884
|
+
prohibits all interrupts. It is set by EI and acknowledges
|
885
|
+
the interrupt setting by the IE register.
|
886
|
+
|
887
|
+
1. When an interrupt is generated, the IF flag will be set.
|
888
|
+
2. If the IME flag is set & the corresponding IE flag is
|
889
|
+
set, the following 3 steps are performed.
|
890
|
+
3. Reset the IME flag and prevent all interrupts.
|
891
|
+
4. The PC (program counter) is pushed onto the stack.
|
892
|
+
5. Jump to the starting address of the interrupt.
|
893
|
+
|
894
|
+
Resetting of the IF register, which was the cause of the
|
895
|
+
interrupt, is done by hardware.
|
896
|
+
|
897
|
+
During the interrupt, pushing of registers to be used
|
898
|
+
should be performed by the interrupt routine.
|
899
|
+
|
900
|
+
Once the interrupt service is in progress, all the
|
901
|
+
interrupts will be prohibited. However, if the IME flag
|
902
|
+
and the IE flag are controlled, a number of interrupt
|
903
|
+
services can be made possible by nesting.
|
904
|
+
|
905
|
+
Return from an interrupt routine can be performed by
|
906
|
+
either RETI or RET instruction.
|
907
|
+
|
908
|
+
The RETI instruction enables interrupts after doing a
|
909
|
+
return operation.
|
910
|
+
|
911
|
+
If a RET is used as the final instruction in an interrupt
|
912
|
+
routine, interrupts will remain disabled unless a EI was
|
913
|
+
used in the interrupt routine or is used at a later time.
|
914
|
+
|
915
|
+
The interrupt will be acknowledged during opcode fetch
|
916
|
+
period of each instruction.
|
917
|
+
|
918
|
+
|
919
|
+
Interrupt Descriptions
|
920
|
+
----------------------
|
921
|
+
|
922
|
+
The following interrupts only occur if they have been
|
923
|
+
enabled in the Interrupt Enable register ($FFFF) and
|
924
|
+
if the interrupts have actually been enabled using the
|
925
|
+
EI instruction.
|
926
|
+
|
927
|
+
V-Blank -
|
928
|
+
|
929
|
+
The V-Blank interrupt occurs ~59.7 times a second
|
930
|
+
on a regular GB and ~61.1 times a second on a Super
|
931
|
+
GB (SGB). This interrupt occurs at the beginning of
|
932
|
+
the V-Blank period. During this period video hardware
|
933
|
+
is not using video ram so it may be freely accessed.
|
934
|
+
This period lasts approximately 1.1 milliseconds.
|
935
|
+
|
936
|
+
LCDC Status -
|
937
|
+
|
938
|
+
There are various reasons for this interrupt to occur
|
939
|
+
as described by the STAT register ($FF40). One very
|
940
|
+
popular reason is to indicate to the user when the
|
941
|
+
video hardware is about to redraw a given LCD line.
|
942
|
+
This can be useful for dynamically controlling the SCX/
|
943
|
+
SCY registers ($FF43/$FF42) to perform special video
|
944
|
+
effects.
|
945
|
+
|
946
|
+
Timer Overflow -
|
947
|
+
|
948
|
+
This interrupt occurs when the TIMA register ($FF05)
|
949
|
+
changes from $FF to $00.
|
950
|
+
|
951
|
+
Serial Transfer Completion -
|
952
|
+
|
953
|
+
This interrupt occurs when a serial transfer has
|
954
|
+
completed on the game link port.
|
955
|
+
|
956
|
+
High-to-Low of P10-P13 -
|
957
|
+
|
958
|
+
This interrupt occurs on a transition of any of the
|
959
|
+
keypad input lines from high to low. Due to the fact
|
960
|
+
that keypad "bounce"* is virtually always present,
|
961
|
+
software should expect this interrupt to occur one
|
962
|
+
or more times for every button press and one or more
|
963
|
+
times for every button release.
|
964
|
+
|
965
|
+
* - Bounce tends to be a side effect of any button
|
966
|
+
making or breaking a connection. During these
|
967
|
+
periods, it is very common for a small amount of
|
968
|
+
oscillation between high & low states to take place.
|
969
|
+
|
970
|
+
I/O Registers
|
971
|
+
-------------
|
972
|
+
|
973
|
+
FF00
|
974
|
+
Name - P1
|
975
|
+
Contents - Register for reading joy pad info
|
976
|
+
and determining system type. (R/W)
|
977
|
+
|
978
|
+
Bit 7 - Not used
|
979
|
+
Bit 6 - Not used
|
980
|
+
Bit 5 - P15 out port
|
981
|
+
Bit 4 - P14 out port
|
982
|
+
Bit 3 - P13 in port
|
983
|
+
Bit 2 - P12 in port
|
984
|
+
Bit 1 - P11 in port
|
985
|
+
Bit 0 - P10 in port
|
986
|
+
|
987
|
+
This is the matrix layout for register $FF00:
|
988
|
+
|
989
|
+
|
990
|
+
P14 P15
|
991
|
+
| |
|
992
|
+
P10-------O-Right----O-A
|
993
|
+
| |
|
994
|
+
P11-------O-Left-----O-B
|
995
|
+
| |
|
996
|
+
P12-------O-Up-------O-Select
|
997
|
+
| |
|
998
|
+
P13-------O-Down-----O-Start
|
999
|
+
| |
|
1000
|
+
|
1001
|
+
Example code:
|
1002
|
+
|
1003
|
+
Game: Ms. Pacman
|
1004
|
+
Address: $3b1
|
1005
|
+
|
1006
|
+
LD A,$20 <- bit 5 = $20
|
1007
|
+
LD ($FF00),A <- select P14 by setting it low
|
1008
|
+
LD A,($FF00)
|
1009
|
+
LD A,($FF00) <- wait a few cycles
|
1010
|
+
CPL <- complement A
|
1011
|
+
AND $0F <- get only first 4 bits
|
1012
|
+
SWAP A <- swap it
|
1013
|
+
LD B,A <- store A in B
|
1014
|
+
LD A,$10
|
1015
|
+
LD ($FF00),A <- select P15 by setting it low
|
1016
|
+
LD A,($FF00)
|
1017
|
+
LD A,($FF00)
|
1018
|
+
LD A,($FF00)
|
1019
|
+
LD A,($FF00)
|
1020
|
+
LD A,($FF00)
|
1021
|
+
LD A,($FF00) <- Wait a few MORE cycles
|
1022
|
+
CPL <- complement (invert)
|
1023
|
+
AND $0F <- get first 4 bits
|
1024
|
+
OR B <- put A and B together
|
1025
|
+
|
1026
|
+
LD B,A <- store A in D
|
1027
|
+
LD A,($FF8B) <- read old joy data from ram
|
1028
|
+
XOR B <- toggle w/current button bit
|
1029
|
+
AND B <- get current button bit back
|
1030
|
+
LD ($FF8C),A <- save in new Joydata storage
|
1031
|
+
LD A,B <- put original value in A
|
1032
|
+
LD ($FF8B),A <- store it as old joy data
|
1033
|
+
|
1034
|
+
|
1035
|
+
LD A,$30 <- deselect P14 and P15
|
1036
|
+
LD ($FF00),A <- RESET Joypad
|
1037
|
+
RET <- Return from Subroutine
|
1038
|
+
|
1039
|
+
The button values using the above method are such:
|
1040
|
+
$80 - Start $8 - Down
|
1041
|
+
$40 - Select $4 - Up
|
1042
|
+
$20 - B $2 - Left
|
1043
|
+
$10 - A $1 - Right
|
1044
|
+
|
1045
|
+
Let's say we held down A, Start, and Up.
|
1046
|
+
The value returned in accumulator A would be $94
|
1047
|
+
|
1048
|
+
|
1049
|
+
FF01
|
1050
|
+
Name - SB
|
1051
|
+
Contents - Serial transfer data (R/W)
|
1052
|
+
|
1053
|
+
8 Bits of data to be read/written
|
1054
|
+
|
1055
|
+
FF02
|
1056
|
+
Name - SC
|
1057
|
+
Contents - SIO control (R/W)
|
1058
|
+
|
1059
|
+
Bit 7 - Transfer Start Flag
|
1060
|
+
0: Non transfer
|
1061
|
+
1: Start transfer
|
1062
|
+
|
1063
|
+
Bit 0 - Shift Clock
|
1064
|
+
0: External Clock (500KHz Max.)
|
1065
|
+
1: Internal Clock (8192Hz)
|
1066
|
+
|
1067
|
+
Transfer is initiated by setting the
|
1068
|
+
Transfer Start Flag. This bit may be read
|
1069
|
+
and is automatically set to 0 at the end of
|
1070
|
+
Transfer.
|
1071
|
+
|
1072
|
+
Transmitting and receiving serial data is
|
1073
|
+
done simultaneously. The received data is
|
1074
|
+
automatically stored in SB.
|
1075
|
+
|
1076
|
+
FF04
|
1077
|
+
Name - DIV
|
1078
|
+
Contents - Divider Register (R/W)
|
1079
|
+
|
1080
|
+
This register is incremented 16384 (~16779
|
1081
|
+
on SGB) times a second. Writing any value
|
1082
|
+
sets it to $00.
|
1083
|
+
FF05
|
1084
|
+
Name - TIMA
|
1085
|
+
Contents - Timer counter (R/W)
|
1086
|
+
|
1087
|
+
This timer is incremented by a clock frequency
|
1088
|
+
specified by the TAC register ($FF07). The timer
|
1089
|
+
generates an interrupt when it overflows.
|
1090
|
+
|
1091
|
+
FF06
|
1092
|
+
Name - TMA
|
1093
|
+
Contents - Timer Modulo (R/W)
|
1094
|
+
|
1095
|
+
When the TIMA overflows, this data will be loaded.
|
1096
|
+
|
1097
|
+
FF07
|
1098
|
+
Name - TAC
|
1099
|
+
Contents - Timer Control (R/W)
|
1100
|
+
|
1101
|
+
Bit 2 - Timer Stop
|
1102
|
+
0: Stop Timer
|
1103
|
+
1: Start Timer
|
1104
|
+
|
1105
|
+
Bits 1+0 - Input Clock Select
|
1106
|
+
00: 4.096 KHz (~4.194 KHz SGB)
|
1107
|
+
01: 262.144 KHz (~268.4 KHz SGB)
|
1108
|
+
10: 65.536 KHz (~67.11 KHz SGB)
|
1109
|
+
11: 16.384 KHz (~16.78 KHz SGB)
|
1110
|
+
|
1111
|
+
FF0F
|
1112
|
+
Name - IF
|
1113
|
+
Contents - Interrupt Flag (R/W)
|
1114
|
+
|
1115
|
+
Bit 4: Transition from High to Low of Pin number P10-P13
|
1116
|
+
Bit 3: Serial I/O transfer complete
|
1117
|
+
Bit 2: Timer Overflow
|
1118
|
+
Bit 1: LCDC (see STAT)
|
1119
|
+
Bit 0: V-Blank
|
1120
|
+
|
1121
|
+
The priority and jump address for the above 5 interrupts are:
|
1122
|
+
|
1123
|
+
Interrupt Priority Start Address
|
1124
|
+
|
1125
|
+
V-Blank 1 $0040
|
1126
|
+
LCDC Status 2 $0048 - Modes 0, 1, 2
|
1127
|
+
LYC=LY coincide (selectable)
|
1128
|
+
Timer Overflow 3 $0050
|
1129
|
+
Serial Transfer 4 $0058 - when transfer is complete
|
1130
|
+
Hi-Lo of P10-P13 5 $0060
|
1131
|
+
|
1132
|
+
* When more than 1 interrupts occur at the same time
|
1133
|
+
only the interrupt with the highest priority can be
|
1134
|
+
acknowledged. When an interrupt is used a '0' should
|
1135
|
+
be stored in the IF register before the IE register
|
1136
|
+
is set.
|
1137
|
+
|
1138
|
+
|
1139
|
+
FF10
|
1140
|
+
Name - NR 10
|
1141
|
+
Contents - Sound Mode 1 register, Sweep register (R/W)
|
1142
|
+
|
1143
|
+
Bit 6-4 - Sweep Time
|
1144
|
+
Bit 3 - Sweep Increase/Decrease
|
1145
|
+
0: Addition (frequency increases)
|
1146
|
+
1: Subtraction (frequency decreases)
|
1147
|
+
Bit 2-0 - Number of sweep shift (n: 0-7)
|
1148
|
+
|
1149
|
+
Sweep Time: 000: sweep off - no freq change
|
1150
|
+
001: 7.8 ms (1/128Hz)
|
1151
|
+
010: 15.6 ms (2/128Hz)
|
1152
|
+
011: 23.4 ms (3/128Hz)
|
1153
|
+
100: 31.3 ms (4/128Hz)
|
1154
|
+
101: 39.1 ms (5/128Hz)
|
1155
|
+
110: 46.9 ms (6/128Hz)
|
1156
|
+
111: 54.7 ms (7/128Hz)
|
1157
|
+
|
1158
|
+
The change of frequency (NR13,NR14) at each shift
|
1159
|
+
is calculated by the following formula where
|
1160
|
+
X(0) is initial freq & X(t-1) is last freq:
|
1161
|
+
|
1162
|
+
X(t) = X(t-1) +/- X(t-1)/2^n
|
1163
|
+
|
1164
|
+
FF11
|
1165
|
+
Name - NR 11
|
1166
|
+
Contents - Sound Mode 1 register, Sound length/Wave pattern duty (R/W)
|
1167
|
+
|
1168
|
+
Only Bits 7-6 can be read.
|
1169
|
+
|
1170
|
+
Bit 7-6 - Wave Pattern Duty
|
1171
|
+
Bit 5-0 - Sound length data (t1: 0-63)
|
1172
|
+
|
1173
|
+
Wave Duty: 00: 12.5% ( _--------_--------_-------- )
|
1174
|
+
01: 25% ( __-------__-------__------- )
|
1175
|
+
10: 50% ( ____-----____-----____----- ) (default)
|
1176
|
+
11: 75% ( ______---______---______--- )
|
1177
|
+
|
1178
|
+
Sound Length = (64-t1)*(1/256) seconds
|
1179
|
+
FF12
|
1180
|
+
Name - NR 12
|
1181
|
+
Contents - Sound Mode 1 register, Envelope (R/W)
|
1182
|
+
|
1183
|
+
Bit 7-4 - Initial volume of envelope
|
1184
|
+
Bit 3 - Envelope UP/DOWN
|
1185
|
+
0: Attenuate
|
1186
|
+
1: Amplify
|
1187
|
+
Bit 2-0 - Number of envelope sweep (n: 0-7)
|
1188
|
+
(If zero, stop envelope operation.)
|
1189
|
+
|
1190
|
+
Initial volume of envelope is from 0 to $F.
|
1191
|
+
Zero being no sound.
|
1192
|
+
|
1193
|
+
Length of 1 step = n*(1/64) seconds
|
1194
|
+
|
1195
|
+
FF13
|
1196
|
+
Name - NR 13
|
1197
|
+
Contents - Sound Mode 1 register, Frequency lo (W)
|
1198
|
+
|
1199
|
+
Lower 8 bits of 11 bit frequency (x).
|
1200
|
+
Next 3 bit are in NR 14 ($FF14)
|
1201
|
+
|
1202
|
+
FF14
|
1203
|
+
Name - NR 14
|
1204
|
+
Contents - Sound Mode 1 register, Frequency hi (R/W)
|
1205
|
+
|
1206
|
+
Only Bit 6 can be read.
|
1207
|
+
|
1208
|
+
Bit 7 - Initial (when set, sound restarts)
|
1209
|
+
Bit 6 - Counter/consecutive selection
|
1210
|
+
Bit 2-0 - Frequency's higher 3 bits (x)
|
1211
|
+
|
1212
|
+
Frequency = 4194304/(32*(2048-x)) Hz
|
1213
|
+
= 131072/(2048-x) Hz
|
1214
|
+
|
1215
|
+
Counter/consecutive Selection
|
1216
|
+
0 = Regardless of the length data in NR11
|
1217
|
+
sound can be produced consecutively.
|
1218
|
+
1 = Sound is generated during the time period
|
1219
|
+
set by the length data in NR11. After this
|
1220
|
+
period the sound 1 ON flag (bit 0 of NR52)
|
1221
|
+
is reset.
|
1222
|
+
|
1223
|
+
FF16
|
1224
|
+
Name - NR 21
|
1225
|
+
Contents - Sound Mode 2 register, Sound Length; Wave Pattern Duty (R/W)
|
1226
|
+
|
1227
|
+
Only bits 7-6 can be read.
|
1228
|
+
|
1229
|
+
Bit 7-6 - Wave pattern duty
|
1230
|
+
Bit 5-0 - Sound length data (t1: 0-63)
|
1231
|
+
|
1232
|
+
Wave Duty: 00: 12.5% ( _--------_--------_-------- )
|
1233
|
+
01: 25% ( __-------__-------__------- )
|
1234
|
+
10: 50% ( ____-----____-----____----- ) (default)
|
1235
|
+
11: 75% ( ______---______---______--- )
|
1236
|
+
|
1237
|
+
Sound Length = (64-t1)*(1/256) seconds
|
1238
|
+
|
1239
|
+
FF17
|
1240
|
+
Name - NR 22
|
1241
|
+
Contents - Sound Mode 2 register, envelope (R/W)
|
1242
|
+
|
1243
|
+
Bit 7-4 - Initial volume of envelope
|
1244
|
+
Bit 3 - Envelope UP/DOWN
|
1245
|
+
0: Attenuate
|
1246
|
+
1: Amplify
|
1247
|
+
Bit 2-0 - Number of envelope sweep (n: 0-7)
|
1248
|
+
(If zero, stop envelope operation.)
|
1249
|
+
|
1250
|
+
Initial volume of envelope is from 0 to $F.
|
1251
|
+
Zero being no sound.
|
1252
|
+
|
1253
|
+
Length of 1 step = n*(1/64) seconds
|
1254
|
+
|
1255
|
+
FF18
|
1256
|
+
Name - NR 23
|
1257
|
+
Contents - Sound Mode 2 register, frequency lo data (W)
|
1258
|
+
|
1259
|
+
Frequency's lower 8 bits of 11 bit data (x).
|
1260
|
+
Next 3 bits are in NR 14 ($FF19).
|
1261
|
+
|
1262
|
+
FF19
|
1263
|
+
Name - NR 24
|
1264
|
+
Contents - Sound Mode 2 register, frequency hi data (R/W)
|
1265
|
+
|
1266
|
+
Only bit 6 can be read.
|
1267
|
+
|
1268
|
+
Bit 7 - Initial (when set, sound restarts)
|
1269
|
+
Bit 6 - Counter/consecutive selection
|
1270
|
+
Bit 2-0 - Frequency's higher 3 bits (x)
|
1271
|
+
|
1272
|
+
Frequency = 4194304/(32*(2048-x)) Hz
|
1273
|
+
= 131072/(2048-x) Hz
|
1274
|
+
|
1275
|
+
Counter/consecutive Selection
|
1276
|
+
0 = Regardless of the length data in NR21
|
1277
|
+
sound can be produced consecutively.
|
1278
|
+
1 = Sound is generated during the time period
|
1279
|
+
set by the length data in NR21. After this
|
1280
|
+
period the sound 2 ON flag (bit 1 of NR52)
|
1281
|
+
is reset.
|
1282
|
+
|
1283
|
+
FF1A
|
1284
|
+
Name - NR 30
|
1285
|
+
Contents - Sound Mode 3 register, Sound on/off (R/W)
|
1286
|
+
|
1287
|
+
Only bit 7 can be read
|
1288
|
+
|
1289
|
+
Bit 7 - Sound OFF
|
1290
|
+
0: Sound 3 output stop
|
1291
|
+
1: Sound 3 output OK
|
1292
|
+
|
1293
|
+
FF1B
|
1294
|
+
Name - NR 31
|
1295
|
+
Contents - Sound Mode 3 register, sound length (R/W)
|
1296
|
+
|
1297
|
+
Bit 7-0 - Sound length (t1: 0 - 255)
|
1298
|
+
|
1299
|
+
Sound Length = (256-t1)*(1/2) seconds
|
1300
|
+
|
1301
|
+
FF1C
|
1302
|
+
Name - NR 32
|
1303
|
+
Contents - Sound Mode 3 register, Select output level (R/W)
|
1304
|
+
|
1305
|
+
Only bits 6-5 can be read
|
1306
|
+
|
1307
|
+
Bit 6-5 - Select output level
|
1308
|
+
00: Mute
|
1309
|
+
01: Produce Wave Pattern RAM Data as it is
|
1310
|
+
(4 bit length)
|
1311
|
+
10: Produce Wave Pattern RAM data shifted once
|
1312
|
+
to the RIGHT (1/2) (4 bit length)
|
1313
|
+
11: Produce Wave Pattern RAM data shifted twice
|
1314
|
+
to the RIGHT (1/4) (4 bit length)
|
1315
|
+
|
1316
|
+
* - Wave Pattern RAM is located from $FF30-$FF3f.
|
1317
|
+
|
1318
|
+
FF1D
|
1319
|
+
Name - NR 33
|
1320
|
+
Contents - Sound Mode 3 register, frequency's lower data (W)
|
1321
|
+
|
1322
|
+
Lower 8 bits of an 11 bit frequency (x).
|
1323
|
+
|
1324
|
+
FF1E
|
1325
|
+
Name - NR 34
|
1326
|
+
Contents - Sound Mode 3 register, frequency's higher data (R/W)
|
1327
|
+
|
1328
|
+
Only bit 6 can be read.
|
1329
|
+
|
1330
|
+
Bit 7 - Initial (when set, sound restarts)
|
1331
|
+
Bit 6 - Counter/consecutive flag
|
1332
|
+
Bit 2-0 - Frequency's higher 3 bits (x).
|
1333
|
+
|
1334
|
+
Frequency = 4194304/(64*(2048-x)) Hz
|
1335
|
+
= 65536/(2048-x) Hz
|
1336
|
+
|
1337
|
+
Counter/consecutive Selection
|
1338
|
+
0 = Regardless of the length data in NR31
|
1339
|
+
sound can be produced consecutively.
|
1340
|
+
1 = Sound is generated during the time period
|
1341
|
+
set by the length data in NR31. After this
|
1342
|
+
period the sound 3 ON flag (bit 2 of NR52)
|
1343
|
+
is reset.
|
1344
|
+
|
1345
|
+
FF20
|
1346
|
+
Name - NR 41
|
1347
|
+
Contents - Sound Mode 4 register, sound length (R/W)
|
1348
|
+
|
1349
|
+
Bit 5-0 - Sound length data (t1: 0-63)
|
1350
|
+
|
1351
|
+
Sound Length = (64-t1)*(1/256) seconds
|
1352
|
+
|
1353
|
+
FF21
|
1354
|
+
Name - NR 42
|
1355
|
+
Contents - Sound Mode 4 register, envelope (R/W)
|
1356
|
+
|
1357
|
+
Bit 7-4 - Initial volume of envelope
|
1358
|
+
Bit 3 - Envelope UP/DOWN
|
1359
|
+
0: Attenuate
|
1360
|
+
1: Amplify
|
1361
|
+
Bit 2-0 - Number of envelope sweep (n: 0-7)
|
1362
|
+
(If zero, stop envelope operation.)
|
1363
|
+
|
1364
|
+
Initial volume of envelope is from 0 to $F.
|
1365
|
+
Zero being no sound.
|
1366
|
+
|
1367
|
+
Length of 1 step = n*(1/64) seconds
|
1368
|
+
|
1369
|
+
FF22
|
1370
|
+
Name - NR 43
|
1371
|
+
Contents - Sound Mode 4 register, polynomial counter (R/W)
|
1372
|
+
|
1373
|
+
Bit 7-4 - Selection of the shift clock frequency of the
|
1374
|
+
polynomial counter
|
1375
|
+
Bit 3 - Selection of the polynomial counter's step
|
1376
|
+
Bit 2-0 - Selection of the dividing ratio of frequencies
|
1377
|
+
|
1378
|
+
Selection of the dividing ratio of frequencies:
|
1379
|
+
000: f * 1/2^3 * 2
|
1380
|
+
001: f * 1/2^3 * 1
|
1381
|
+
010: f * 1/2^3 * 1/2
|
1382
|
+
011: f * 1/2^3 * 1/3
|
1383
|
+
100: f * 1/2^3 * 1/4
|
1384
|
+
101: f * 1/2^3 * 1/5
|
1385
|
+
110: f * 1/2^3 * 1/6
|
1386
|
+
111: f * 1/2^3 * 1/7 f = 4.194304 Mhz
|
1387
|
+
|
1388
|
+
Selection of the polynomial counter step:
|
1389
|
+
0: 15 steps
|
1390
|
+
1: 7 steps
|
1391
|
+
|
1392
|
+
Selection of the shift clock frequency of the polynomial
|
1393
|
+
counter:
|
1394
|
+
|
1395
|
+
0000: dividing ratio of frequencies * 1/2
|
1396
|
+
0001: dividing ratio of frequencies * 1/2^2
|
1397
|
+
0010: dividing ratio of frequencies * 1/2^3
|
1398
|
+
0011: dividing ratio of frequencies * 1/2^4
|
1399
|
+
: :
|
1400
|
+
: :
|
1401
|
+
: :
|
1402
|
+
0101: dividing ratio of frequencies * 1/2^14
|
1403
|
+
1110: prohibited code
|
1404
|
+
1111: prohibited code
|
1405
|
+
|
1406
|
+
FF23
|
1407
|
+
Name - NR 44
|
1408
|
+
Contents - Sound Mode 4 register, counter/consecutive; inital (R/W)
|
1409
|
+
|
1410
|
+
Only bit 6 can be read.
|
1411
|
+
|
1412
|
+
Bit 7 - Initial (when set, sound restarts)
|
1413
|
+
Bit 6 - Counter/consecutive selection
|
1414
|
+
|
1415
|
+
Counter/consecutive Selection
|
1416
|
+
0 = Regardless of the length data in NR41
|
1417
|
+
sound can be produced consecutively.
|
1418
|
+
1 = Sound is generated during the time period
|
1419
|
+
set by the length data in NR41. After this
|
1420
|
+
period the sound 4 ON flag (bit 3 of NR52)
|
1421
|
+
is reset.
|
1422
|
+
|
1423
|
+
FF24
|
1424
|
+
Name - NR 50
|
1425
|
+
Contents - Channel control / ON-OFF / Volume (R/W)
|
1426
|
+
|
1427
|
+
Bit 7 - Vin->SO2 ON/OFF
|
1428
|
+
Bit 6-4 - SO2 output level (volume) (# 0-7)
|
1429
|
+
Bit 3 - Vin->SO1 ON/OFF
|
1430
|
+
Bit 2-0 - SO1 output level (volume) (# 0-7)
|
1431
|
+
|
1432
|
+
Vin->SO1 (Vin->SO2)
|
1433
|
+
|
1434
|
+
By synthesizing the sound from sound 1
|
1435
|
+
through 4, the voice input from Vin
|
1436
|
+
terminal is put out.
|
1437
|
+
0: no output
|
1438
|
+
1: output OK
|
1439
|
+
|
1440
|
+
FF25
|
1441
|
+
Name - NR 51
|
1442
|
+
Contents - Selection of Sound output terminal (R/W)
|
1443
|
+
|
1444
|
+
Bit 7 - Output sound 4 to SO2 terminal
|
1445
|
+
Bit 6 - Output sound 3 to SO2 terminal
|
1446
|
+
Bit 5 - Output sound 2 to SO2 terminal
|
1447
|
+
Bit 4 - Output sound 1 to SO2 terminal
|
1448
|
+
Bit 3 - Output sound 4 to SO1 terminal
|
1449
|
+
Bit 2 - Output sound 3 to SO1 terminal
|
1450
|
+
Bit 1 - Output sound 2 to SO1 terminal
|
1451
|
+
Bit 0 - Output sound 1 to SO1 terminal
|
1452
|
+
|
1453
|
+
FF26
|
1454
|
+
Name - NR 52 (Value at reset: $F1-GB, $F0-SGB)
|
1455
|
+
Contents - Sound on/off (R/W)
|
1456
|
+
|
1457
|
+
Bit 7 - All sound on/off
|
1458
|
+
0: stop all sound circuits
|
1459
|
+
1: operate all sound circuits
|
1460
|
+
Bit 3 - Sound 4 ON flag
|
1461
|
+
Bit 2 - Sound 3 ON flag
|
1462
|
+
Bit 1 - Sound 2 ON flag
|
1463
|
+
Bit 0 - Sound 1 ON flag
|
1464
|
+
|
1465
|
+
Bits 0 - 3 of this register are meant to
|
1466
|
+
be status bits to be read. Writing to these
|
1467
|
+
bits does NOT enable/disable sound.
|
1468
|
+
|
1469
|
+
If your GB programs don't use sound then
|
1470
|
+
write $00 to this register to save 16% or
|
1471
|
+
more on GB power consumption.
|
1472
|
+
FF30 - FF3F
|
1473
|
+
Name - Wave Pattern RAM
|
1474
|
+
Contents - Waveform storage for arbitrary sound data
|
1475
|
+
|
1476
|
+
This storage area holds 32 4-bit samples
|
1477
|
+
that are played back upper 4 bits first.
|
1478
|
+
|
1479
|
+
FF40
|
1480
|
+
Name - LCDC (value $91 at reset)
|
1481
|
+
Contents - LCD Control (R/W)
|
1482
|
+
|
1483
|
+
Bit 7 - LCD Control Operation *
|
1484
|
+
0: Stop completely (no picture on screen)
|
1485
|
+
1: operation
|
1486
|
+
|
1487
|
+
Bit 6 - Window Tile Map Display Select
|
1488
|
+
0: $9800-$9BFF
|
1489
|
+
1: $9C00-$9FFF
|
1490
|
+
|
1491
|
+
Bit 5 - Window Display
|
1492
|
+
0: off
|
1493
|
+
1: on
|
1494
|
+
|
1495
|
+
Bit 4 - BG & Window Tile Data Select
|
1496
|
+
0: $8800-$97FF
|
1497
|
+
1: $8000-$8FFF <- Same area as OBJ
|
1498
|
+
|
1499
|
+
Bit 3 - BG Tile Map Display Select
|
1500
|
+
0: $9800-$9BFF
|
1501
|
+
1: $9C00-$9FFF
|
1502
|
+
|
1503
|
+
Bit 2 - OBJ (Sprite) Size
|
1504
|
+
0: 8*8
|
1505
|
+
1: 8*16 (width*height)
|
1506
|
+
|
1507
|
+
Bit 1 - OBJ (Sprite) Display
|
1508
|
+
0: off
|
1509
|
+
1: on
|
1510
|
+
|
1511
|
+
Bit 0 - BG Display
|
1512
|
+
0: off
|
1513
|
+
1: on
|
1514
|
+
|
1515
|
+
* - Stopping LCD operation (bit 7 from 1 to 0)
|
1516
|
+
must be performed during V-blank to work
|
1517
|
+
properly. V-blank can be confirmed when the
|
1518
|
+
value of LY is greater than or equal to 144.
|
1519
|
+
|
1520
|
+
FF41
|
1521
|
+
Name - STAT
|
1522
|
+
Contents - LCDC Status (R/W)
|
1523
|
+
|
1524
|
+
Bits 6-3 - Interrupt Selection By LCDC Status
|
1525
|
+
|
1526
|
+
Bit 6 - LYC=LY Coincidence (Selectable)
|
1527
|
+
Bit 5 - Mode 10
|
1528
|
+
Bit 4 - Mode 01
|
1529
|
+
Bit 3 - Mode 00
|
1530
|
+
0: Non Selection
|
1531
|
+
1: Selection
|
1532
|
+
|
1533
|
+
Bit 2 - Coincidence Flag
|
1534
|
+
0: LYC not equal to LCDC LY
|
1535
|
+
1: LYC = LCDC LY
|
1536
|
+
|
1537
|
+
Bit 1-0 - Mode Flag
|
1538
|
+
00: During H-Blank
|
1539
|
+
01: During V-Blank
|
1540
|
+
10: During Searching OAM-RAM
|
1541
|
+
11: During Transfering Data to LCD Driver
|
1542
|
+
|
1543
|
+
STAT shows the current status of the LCD controller.
|
1544
|
+
Mode 00: When the flag is 00 it is the H-Blank period
|
1545
|
+
and the CPU can access the display RAM
|
1546
|
+
($8000-$9FFF).
|
1547
|
+
|
1548
|
+
Mode 01: When the flag is 01 it is the V-Blank period
|
1549
|
+
and the CPU can access the display RAM
|
1550
|
+
($8000-$9FFF).
|
1551
|
+
|
1552
|
+
Mode 10: When the flag is 10 then the OAM is being
|
1553
|
+
used ($FE00-$FE9F). The CPU cannot access
|
1554
|
+
the OAM during this period
|
1555
|
+
|
1556
|
+
Mode 11: When the flag is 11 both the OAM and display
|
1557
|
+
RAM are being used. The CPU cannot access
|
1558
|
+
either during this period.
|
1559
|
+
|
1560
|
+
|
1561
|
+
The following are typical when the display is enabled:
|
1562
|
+
|
1563
|
+
Mode 0 000___000___000___000___000___000___000________________
|
1564
|
+
Mode 1 _______________________________________11111111111111__
|
1565
|
+
Mode 2 ___2_____2_____2_____2_____2_____2___________________2_
|
1566
|
+
Mode 3 ____33____33____33____33____33____33__________________3
|
1567
|
+
|
1568
|
+
|
1569
|
+
The Mode Flag goes through the values 0, 2,
|
1570
|
+
and 3 at a cycle of about 109uS. 0 is present
|
1571
|
+
about 48.6uS, 2 about 19uS, and 3 about 41uS. This
|
1572
|
+
is interrupted every 16.6ms by the VBlank (1).
|
1573
|
+
The mode flag stays set at 1 for about 1.08 ms.
|
1574
|
+
(Mode 0 is present between 201-207 clks, 2 about
|
1575
|
+
77-83 clks, and 3 about 169-175 clks. A complete
|
1576
|
+
cycle through these states takes 456 clks.
|
1577
|
+
VBlank lasts 4560 clks. A complete screen refresh
|
1578
|
+
occurs every 70224 clks.)
|
1579
|
+
|
1580
|
+
FF42
|
1581
|
+
Name - SCY
|
1582
|
+
Contents - Scroll Y (R/W)
|
1583
|
+
|
1584
|
+
8 Bit value $00-$FF to scroll BG Y screen
|
1585
|
+
position.
|
1586
|
+
|
1587
|
+
FF43
|
1588
|
+
Name - SCX
|
1589
|
+
Contents - Scroll X (R/W)
|
1590
|
+
|
1591
|
+
8 Bit value $00-$FF to scroll BG X screen
|
1592
|
+
position.
|
1593
|
+
|
1594
|
+
FF44
|
1595
|
+
Name - LY
|
1596
|
+
Contents - LCDC Y-Coordinate (R)
|
1597
|
+
|
1598
|
+
The LY indicates the vertical line to which
|
1599
|
+
the present data is transferred to the LCD
|
1600
|
+
Driver. The LY can take on any value between
|
1601
|
+
0 through 153. The values between 144 and 153
|
1602
|
+
indicate the V-Blank period. Writing will
|
1603
|
+
reset the counter.
|
1604
|
+
|
1605
|
+
FF45
|
1606
|
+
Name - LYC
|
1607
|
+
Contents - LY Compare (R/W)
|
1608
|
+
|
1609
|
+
The LYC compares itself with the LY. If the
|
1610
|
+
values are the same it causes the STAT to set
|
1611
|
+
the coincident flag.
|
1612
|
+
|
1613
|
+
FF46
|
1614
|
+
Name - DMA
|
1615
|
+
Contents - DMA Transfer and Start Address (W)
|
1616
|
+
|
1617
|
+
The DMA Transfer (40*28 bit) from internal ROM or RAM
|
1618
|
+
($0000-$F19F) to the OAM (address $FE00-$FE9F) can be
|
1619
|
+
performed. It takes 160 microseconds for the transfer.
|
1620
|
+
|
1621
|
+
40*28 bit = #140 or #$8C. As you can see, it only
|
1622
|
+
transfers $8C bytes of data. OAM data is $A0 bytes
|
1623
|
+
long, from $0-$9F.
|
1624
|
+
|
1625
|
+
But if you examine the OAM data you see that 4 bits are
|
1626
|
+
not in use.
|
1627
|
+
|
1628
|
+
40*32 bit = #$A0, but since 4 bits for each OAM is not
|
1629
|
+
used it's 40*28 bit.
|
1630
|
+
|
1631
|
+
It transfers all the OAM data to OAM RAM.
|
1632
|
+
|
1633
|
+
The DMA transfer start address can be designated every
|
1634
|
+
$100 from address $0000-$F100. That means $0000, $0100,
|
1635
|
+
$0200, $0300....
|
1636
|
+
|
1637
|
+
As can be seen by looking at register $FF41 Sprite RAM
|
1638
|
+
($FE00 - $FE9F) is not always available. A simple routine
|
1639
|
+
that many games use to write data to Sprite memory is shown
|
1640
|
+
below. Since it copies data to the sprite RAM at the appro-
|
1641
|
+
priate times it removes that responsibility from the main
|
1642
|
+
program.
|
1643
|
+
All of the memory space, except high ram ($FF80-$FFFE),
|
1644
|
+
is not accessible during DMA. Because of this, the routine
|
1645
|
+
below must be copied & executed in high ram. It is usually
|
1646
|
+
called from a V-blank Interrupt.
|
1647
|
+
|
1648
|
+
Example program:
|
1649
|
+
|
1650
|
+
org $40
|
1651
|
+
jp VBlank
|
1652
|
+
|
1653
|
+
org $ff80
|
1654
|
+
VBlank:
|
1655
|
+
push af <- Save A reg & flags
|
1656
|
+
ld a,BASE_ADRS <- transfer data from BASE_ADRS
|
1657
|
+
ld ($ff46),a <- put A into DMA registers
|
1658
|
+
ld a,28h <- loop length
|
1659
|
+
Wait: <- We need to wait 160 microseconds.
|
1660
|
+
dec a <- 4 cycles - decrease A by 1
|
1661
|
+
jr nz,Wait <- 12 cycles - branch if Not Zero to Wait
|
1662
|
+
pop af <- Restore A reg & flags
|
1663
|
+
reti <- Return from interrupt
|
1664
|
+
|
1665
|
+
|
1666
|
+
FF47
|
1667
|
+
Name - BGP
|
1668
|
+
Contents - BG & Window Palette Data (R/W)
|
1669
|
+
|
1670
|
+
Bit 7-6 - Data for Dot Data 11 (Normally darkest color)
|
1671
|
+
Bit 5-4 - Data for Dot Data 10
|
1672
|
+
Bit 3-2 - Data for Dot Data 01
|
1673
|
+
Bit 1-0 - Data for Dot Data 00 (Normally lightest color)
|
1674
|
+
|
1675
|
+
This selects the shade of grays to use for
|
1676
|
+
the background (BG) & window pixels. Since
|
1677
|
+
each pixel uses 2 bits, the corresponding
|
1678
|
+
shade will be selected from here.
|
1679
|
+
|
1680
|
+
FF48
|
1681
|
+
Name - OBP0
|
1682
|
+
Contents - Object Palette 0 Data (R/W)
|
1683
|
+
|
1684
|
+
This selects the colors for sprite palette 0.
|
1685
|
+
It works exactly as BGP ($FF47) except each
|
1686
|
+
each value of 0 is transparent.
|
1687
|
+
|
1688
|
+
FF49
|
1689
|
+
Name - OBP1
|
1690
|
+
Contents - Object Palette 1 Data (R/W)
|
1691
|
+
|
1692
|
+
This Selects the colors for sprite palette 1.
|
1693
|
+
It works exactly as OBP0 ($FF48).
|
1694
|
+
See BGP for details.
|
1695
|
+
|
1696
|
+
FF4A
|
1697
|
+
Name - WY
|
1698
|
+
Contents - Window Y Position (R/W)
|
1699
|
+
|
1700
|
+
0 <= WY <= 143
|
1701
|
+
|
1702
|
+
WY must be greater than or equal to 0 and
|
1703
|
+
must be less than or equal to 143 for
|
1704
|
+
window to be visible.
|
1705
|
+
|
1706
|
+
FF4B
|
1707
|
+
Name - WX
|
1708
|
+
Contents - Window X Position (R/W)
|
1709
|
+
|
1710
|
+
0 <= WX <= 166
|
1711
|
+
|
1712
|
+
WX must be greater than or equal to 0 and
|
1713
|
+
must be less than or equal to 166 for
|
1714
|
+
window to be visible.
|
1715
|
+
|
1716
|
+
WX is offset from absolute screen coordinates
|
1717
|
+
by 7. Setting the window to WX=7, WY=0 will
|
1718
|
+
put the upper left corner of the window at
|
1719
|
+
absolute screen coordinates 0,0.
|
1720
|
+
|
1721
|
+
|
1722
|
+
Lets say WY = 70 and WX = 87.
|
1723
|
+
The window would be positioned as so:
|
1724
|
+
|
1725
|
+
0 80 159
|
1726
|
+
______________________________________
|
1727
|
+
0 | |
|
1728
|
+
| | |
|
1729
|
+
| |
|
1730
|
+
| Background Display |
|
1731
|
+
| Here |
|
1732
|
+
| |
|
1733
|
+
| |
|
1734
|
+
70 | - +------------------|
|
1735
|
+
| | 80,70 |
|
1736
|
+
| | |
|
1737
|
+
| | Window Display |
|
1738
|
+
| | Here |
|
1739
|
+
| | |
|
1740
|
+
| | |
|
1741
|
+
143 |___________________|__________________|
|
1742
|
+
|
1743
|
+
|
1744
|
+
OBJ Characters (Sprites) can still enter the
|
1745
|
+
window. None of the window colors are
|
1746
|
+
transparent so any background tiles under the
|
1747
|
+
window are hidden.
|
1748
|
+
|
1749
|
+
FFFF
|
1750
|
+
Name - IE
|
1751
|
+
Contents - Interrupt Enable (R/W)
|
1752
|
+
|
1753
|
+
Bit 4: Transition from High to Low of Pin
|
1754
|
+
number P10-P13.
|
1755
|
+
Bit 3: Serial I/O transfer complete
|
1756
|
+
Bit 2: Timer Overflow
|
1757
|
+
Bit 1: LCDC (see STAT)
|
1758
|
+
Bit 0: V-Blank
|
1759
|
+
|
1760
|
+
0: disable
|
1761
|
+
1: enable
|