rubygb 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +5 -0
  4. data/.travis.yml +20 -0
  5. data/CHANGELOG.md +6 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +23 -0
  8. data/MIT-LICENSE.txt +53 -0
  9. data/README.md +30 -0
  10. data/Rakefile +30 -0
  11. data/bin/rubygb +5 -0
  12. data/lib/galp/AND.GIF +0 -0
  13. data/lib/galp/ARROW.GIF +0 -0
  14. data/lib/galp/C.BAT +5 -0
  15. data/lib/galp/CHANGES.TXT +5 -0
  16. data/lib/galp/EXAMPLE.LNK +7 -0
  17. data/lib/galp/EXAMPLE1.TXT +266 -0
  18. data/lib/galp/GBHW.TXT +645 -0
  19. data/lib/galp/GBSPEC.TXT +1761 -0
  20. data/lib/galp/IBMPC1.TXT +2400 -0
  21. data/lib/galp/INDEX.HTM +23 -0
  22. data/lib/galp/INSTR.HTM +563 -0
  23. data/lib/galp/MEM1.HTM +199 -0
  24. data/lib/galp/MEMORY.TXT +160 -0
  25. data/lib/galp/OPCODES.HTM +351 -0
  26. data/lib/galp/OR.GIF +0 -0
  27. data/lib/galp/README.TXT +4 -0
  28. data/lib/galp/REGS.HTM +77 -0
  29. data/lib/galp/RL.GIF +0 -0
  30. data/lib/galp/RLC.GIF +0 -0
  31. data/lib/galp/RR.GIF +0 -0
  32. data/lib/galp/RRC.GIF +0 -0
  33. data/lib/galp/SETUP.BAT +7 -0
  34. data/lib/galp/SLA.GIF +0 -0
  35. data/lib/galp/SRA.GIF +0 -0
  36. data/lib/galp/SRL.GIF +0 -0
  37. data/lib/galp/START.HTM +24 -0
  38. data/lib/galp/SWAP.GIF +0 -0
  39. data/lib/galp/VID1.HTM +34 -0
  40. data/lib/galp/XOR.GIF +0 -0
  41. data/lib/rgbds/rgbasm +0 -0
  42. data/lib/rgbds/rgbfix +0 -0
  43. data/lib/rgbds/rgblink +0 -0
  44. data/lib/rubygb/cli.rb +11 -0
  45. data/lib/rubygb/rubygb.rb +15 -0
  46. data/lib/rubygb/version.rb +4 -0
  47. data/lib/rubygb.rb +7 -0
  48. data/rubygb.gemspec +23 -0
  49. data/scrap/basic.gb +0 -0
  50. data/scrap/basic.map +55 -0
  51. data/scrap/basic.obj +0 -0
  52. data/scrap/basic.s +176 -0
  53. data/scrap/basic.sym +8 -0
  54. data/spec/basic.s +176 -0
  55. data/spec/rubygb_spec.rb +19 -0
  56. metadata +129 -0
@@ -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