···11;*
22-;* Gameboy Hardware definitions
22+;* Game Boy Hardware definitions
33+;* https://github.com/gbdev/hardware.inc
34;*
45;* Based on Jones' hardware.inc
56;* And based on Carsten Sorensen's ideas.
77+;*
88+;* To the extent possible under law, the authors of this work have
99+;* waived all copyright and related or neighboring rights to the work.
1010+;* See https://creativecommons.org/publicdomain/zero/1.0/ for details.
1111+;*
1212+;* SPDX-License-Identifier: CC0-1.0
613;*
714;* Rev 1.1 - 15-Jul-97 : Added define check
815;* Rev 1.2 - 18-Jul-97 : Added revision check macro
···2633;* Rev 2.9 - 28-Feb-20 : Added utility rP1 constants
2734;* Rev 3.0 - 27-Aug-20 : Register ordering, byte-based sizes, OAM additions, general cleanup (Blitter Object)
2835;* Rev 4.0 - 03-May-21 : Updated to use RGBDS 0.5.0 syntax, changed IEF_LCDC to IEF_STAT (Eievui)
3636+;* Rev 4.1 - 16-Aug-21 : Added more flags, bit number defines, and offset constants for OAM and window positions (rondnelson99)
3737+;* Rev 4.2 - 04-Sep-21 : Added CH3- and CH4-specific audio registers flags (ISSOtm)
3838+;* Rev 4.3 - 07-Nov-21 : Deprecate VRAM address constants (Eievui)
3939+;* Rev 4.4 - 11-Jan-22 : Deprecate VRAM CART_SRAM_2KB constant (avivace)
4040+;* Rev 4.5 - 03-Mar-22 : Added bit number definitions for OCPS, BCPS and LCDC (sukus)
4141+;* Rev 4.6 - 15-Jun-22 : Added MBC3 registers and special values
4242+;* Rev 4.7.0 - 27-Jun-22 : Added alternate names for some constants
4343+;* Rev 4.7.1 - 05-Jul-22 : Added RPB_LED_ON constant
4444+;* Rev 4.8.0 - 25-Oct-22 : Changed background addressing constants (zlago)
4545+;* Rev 4.8.1 - 29-Apr-23 : Added rOPRI (rbong)
4646+;* Rev 4.9.0 - 24-Jun-23 : Added definitions for interrupt vectors (sukus)
4747+;* Rev 4.9.1 - 11-Sep-23 : Added repository link and CC0 waiver notice
4848+;* Rev 4.9.2 - 18-Aug-24 : Corrected CART_ROM_MBC5_BAT to CART_ROM_MBC5_RAM (DevEd)
4949+5050+5151+; NOTE: REVISION NUMBER CHANGES MUST BE REFLECTED
5252+; IN `rev_Check_hardware_inc` BELOW!
29533054IF __RGBDS_MAJOR__ == 0 && __RGBDS_MINOR__ < 5
3155 FAIL "This version of 'hardware.inc' requires RGBDS version 0.5.0 or later."
···3660 IF !DEF(HARDWARE_INC)
3761DEF HARDWARE_INC EQU 1
38626363+; Usage: rev_Check_hardware_inc <min_ver>
6464+; Examples: rev_Check_hardware_inc 4.1.2
6565+; rev_Check_hardware_inc 4.1 (equivalent to 4.1.0)
6666+; rev_Check_hardware_inc 4 (equivalent to 4.0.0)
3967MACRO rev_Check_hardware_inc
4040-;NOTE: REVISION NUMBER CHANGES MUST BE ADDED
4141-;TO SECOND PARAMETER IN FOLLOWING LINE.
4242- IF \1 > 4.0 ;PUT REVISION NUMBER HERE
4343- WARN "Version \1 or later of 'hardware.inc' is required."
6868+ DEF CUR_VER equs "4,9,2" ; ** UPDATE THIS LINE WHEN CHANGING THE REVISION NUMBER **
6969+7070+ DEF MIN_VER equs STRRPL("\1", ".", ",")
7171+ DEF INTERNAL_CHK equs """MACRO ___internal
7272+ IF \\1 != \\4 || \\2 < \\5 || (\\2 == \\5 && \\3 < \\6)
7373+ FAIL "Version \\1.\\2.\\3 of 'hardware.inc' is incompatible with requested version \\4.\\5.\\6"
4474 ENDC
7575+\nENDM"""
7676+ INTERNAL_CHK
7777+ ___internal {CUR_VER}, {MIN_VER},0,0
7878+ PURGE CUR_VER, MIN_VER, INTERNAL_CHK, ___internal
4579ENDM
46808181+8282+;***************************************************************************
8383+;*
8484+;* General memory region constants
8585+;*
8686+;***************************************************************************
8787+4788DEF _VRAM EQU $8000 ; $8000->$9FFF
4848-DEF _VRAM8000 EQU _VRAM
4949-DEF _VRAM8800 EQU _VRAM+$800
5050-DEF _VRAM9000 EQU _VRAM+$1000
5189DEF _SCRN0 EQU $9800 ; $9800->$9BFF
5290DEF _SCRN1 EQU $9C00 ; $9C00->$9FFF
5391DEF _SRAM EQU $A000 ; $A000->$BFFF
···5896DEF _AUD3WAVERAM EQU $FF30 ; $FF30->$FF3F
5997DEF _HRAM EQU $FF80 ; $FF80->$FFFE
60986161-; *** MBC5 Equates ***
9999+100100+;***************************************************************************
101101+;*
102102+;* MBC registers
103103+;*
104104+;***************************************************************************
105105+106106+; *** Common ***
621076363-DEF rRAMG EQU $0000 ; $0000->$1fff
6464-DEF rROMB0 EQU $2000 ; $2000->$2fff
6565-DEF rROMB1 EQU $3000 ; $3000->$3fff - If more than 256 ROM banks are present.
6666-DEF rRAMB EQU $4000 ; $4000->$5fff - Bit 3 enables rumble (if present)
108108+; --
109109+; -- RAMG ($0000-$1FFF)
110110+; -- Controls whether access to SRAM (and the MBC3 RTC registers) is allowed (W)
111111+; --
112112+DEF rRAMG EQU $0000
113113+114114+DEF CART_SRAM_ENABLE EQU $0A
115115+DEF CART_SRAM_DISABLE EQU $00
116116+117117+118118+; --
119119+; -- ROMB0 ($2000-$3FFF)
120120+; -- Selects which ROM bank is mapped to the ROMX space ($4000-$7FFF) (W)
121121+; --
122122+; -- The range of accepted values, as well as the behavior of writing $00,
123123+; -- varies depending on the MBC.
124124+; --
125125+DEF rROMB0 EQU $2000
126126+127127+; --
128128+; -- RAMB ($4000-$5FFF)
129129+; -- Selects which SRAM bank is mapped to the SRAM space ($A000-$BFFF) (W)
130130+; --
131131+; -- The range of accepted values varies depending on the cartridge configuration.
132132+; --
133133+DEF rRAMB EQU $4000
134134+135135+136136+; *** MBC3-specific registers ***
137137+138138+; Write one of these to rRAMG to map the corresponding RTC register to all SRAM space
139139+DEF RTC_S EQU $08 ; Seconds (0-59)
140140+DEF RTC_M EQU $09 ; Minutes (0-59)
141141+DEF RTC_H EQU $0A ; Hours (0-23)
142142+DEF RTC_DL EQU $0B ; Lower 8 bits of Day Counter ($00-$FF)
143143+DEF RTC_DH EQU $0C ; Bit 7 - Day Counter Carry Bit (1=Counter Overflow)
144144+ ; Bit 6 - Halt (0=Active, 1=Stop Timer)
145145+ ; Bit 0 - Most significant bit of Day Counter (Bit 8)
146146+147147+148148+; --
149149+; -- RTCLATCH ($6000-$7FFF)
150150+; -- Write $00 then $01 to latch the current time into the RTC registers (W)
151151+; --
152152+DEF rRTCLATCH EQU $6000
153153+154154+155155+; *** MBC5-specific register ***
156156+157157+; --
158158+; -- ROMB1 ($3000-$3FFF)
159159+; -- A 9th bit that "extends" ROMB0 if more than 256 banks are present (W)
160160+; --
161161+; -- Also note that rROMB0 thus only spans $2000-$2FFF.
162162+; --
163163+DEF rROMB1 EQU $3000
164164+165165+166166+; Bit 3 of RAMB enables the rumble motor (if any)
167167+DEF CART_RUMBLE_ON EQU 1 << 3
671686816969170;***************************************************************************
70171;*
7171-;* Custom registers
172172+;* Memory-mapped registers
72173;*
73174;***************************************************************************
74175···103204; --
104205DEF rSC EQU $FF02
105206207207+DEF SCF_START EQU %10000000 ; Transfer Start Flag (1=Transfer in progress, or requested)
208208+DEF SCF_SPEED EQU %00000010 ; Clock Speed (0=Normal, 1=Fast) ** CGB Mode Only **
209209+DEF SCF_SOURCE EQU %00000001 ; Shift Clock (0=External Clock, 1=Internal Clock)
210210+211211+DEF SCB_START EQU 7
212212+DEF SCB_SPEED EQU 1
213213+DEF SCB_SOURCE EQU 0
106214107215; --
108216; -- DIV ($FF04)
···137245DEF TACF_16KHZ EQU %00000011
138246DEF TACF_65KHZ EQU %00000010
139247DEF TACF_262KHZ EQU %00000001
248248+249249+DEF TACB_START EQU 2
140250141251142252; --
···256366DEF rNR30 EQU $FF1A
257367DEF rAUD3ENA EQU rNR30
258368369369+DEF AUD3ENA_OFF EQU %00000000
370370+DEF AUD3ENA_ON EQU %10000000
371371+259372260373; --
261374; -- AUD3LEN/NR31 ($FF1B)
···279392; --
280393DEF rNR32 EQU $FF1C
281394DEF rAUD3LEVEL EQU rNR32
395395+396396+DEF AUD3LEVEL_MUTE EQU %00000000
397397+DEF AUD3LEVEL_100 EQU %00100000
398398+DEF AUD3LEVEL_50 EQU %01000000
399399+DEF AUD3LEVEL_25 EQU %01100000
282400283401284402; --
···338456DEF rNR43 EQU $FF22
339457DEF rAUD4POLY EQU rNR43
340458459459+DEF AUD4POLY_15STEP EQU %00000000
460460+DEF AUD4POLY_7STEP EQU %00001000
461461+341462342463; --
343464; -- AUD4GO/NR44 ($FF23)
344465; --
345345-; -- Bit 7 - Inital
466466+; -- Bit 7 - Initial (when set, sound restarts)
346467; -- Bit 6 - Counter/consecutive selection
347468; --
348469DEF rNR44 EQU $FF23
···353474; -- AUDVOL/NR50 ($FF24)
354475; -- Channel control / ON-OFF / Volume (R/W)
355476; --
356356-; -- Bit 7 - Vin->SO2 ON/OFF (Vin??)
357357-; -- Bit 6-4 - SO2 output level (volume) (# 0-7)
358358-; -- Bit 3 - Vin->SO1 ON/OFF (Vin??)
359359-; -- Bit 2-0 - SO1 output level (volume) (# 0-7)
477477+; -- Bit 7 - Vin->SO2 ON/OFF (left)
478478+; -- Bit 6-4 - SO2 output level (left speaker) (# 0-7)
479479+; -- Bit 3 - Vin->SO1 ON/OFF (right)
480480+; -- Bit 2-0 - SO1 output level (right speaker) (# 0-7)
360481; --
361482DEF rNR50 EQU $FF24
362483DEF rAUDVOL EQU rNR50
···369490; -- AUDTERM/NR51 ($FF25)
370491; -- Selection of Sound output terminal (R/W)
371492; --
372372-; -- Bit 7 - Output sound 4 to SO2 terminal
373373-; -- Bit 6 - Output sound 3 to SO2 terminal
374374-; -- Bit 5 - Output sound 2 to SO2 terminal
375375-; -- Bit 4 - Output sound 1 to SO2 terminal
376376-; -- Bit 3 - Output sound 4 to SO1 terminal
377377-; -- Bit 2 - Output sound 3 to SO1 terminal
378378-; -- Bit 1 - Output sound 2 to SO1 terminal
379379-; -- Bit 0 - Output sound 0 to SO1 terminal
493493+; -- Bit 7 - Output channel 4 to SO2 terminal (left)
494494+; -- Bit 6 - Output channel 3 to SO2 terminal (left)
495495+; -- Bit 5 - Output channel 2 to SO2 terminal (left)
496496+; -- Bit 4 - Output channel 1 to SO2 terminal (left)
497497+; -- Bit 3 - Output channel 4 to SO1 terminal (right)
498498+; -- Bit 2 - Output channel 3 to SO1 terminal (right)
499499+; -- Bit 1 - Output channel 2 to SO1 terminal (right)
500500+; -- Bit 0 - Output channel 1 to SO1 terminal (right)
380501; --
381502DEF rNR51 EQU $FF25
382503DEF rAUDTERM EQU rNR51
···422543DEF LCDCF_WIN9C00 EQU %01000000 ; Window Tile Map Display Select
423544DEF LCDCF_WINOFF EQU %00000000 ; Window Display
424545DEF LCDCF_WINON EQU %00100000 ; Window Display
425425-DEF LCDCF_BG8800 EQU %00000000 ; BG & Window Tile Data Select
426426-DEF LCDCF_BG8000 EQU %00010000 ; BG & Window Tile Data Select
546546+DEF LCDCF_BLK21 EQU %00000000 ; BG & Window Tile Data Select
547547+DEF LCDCF_BLK01 EQU %00010000 ; BG & Window Tile Data Select
427548DEF LCDCF_BG9800 EQU %00000000 ; BG Tile Map Display Select
428549DEF LCDCF_BG9C00 EQU %00001000 ; BG Tile Map Display Select
429550DEF LCDCF_OBJ8 EQU %00000000 ; OBJ Construction
···432553DEF LCDCF_OBJON EQU %00000010 ; OBJ Display
433554DEF LCDCF_BGOFF EQU %00000000 ; BG Display
434555DEF LCDCF_BGON EQU %00000001 ; BG Display
556556+557557+DEF LCDCB_ON EQU 7 ; LCD Control Operation
558558+DEF LCDCB_WIN9C00 EQU 6 ; Window Tile Map Display Select
559559+DEF LCDCB_WINON EQU 5 ; Window Display
560560+DEF LCDCB_BLKS EQU 4 ; BG & Window Tile Data Select
561561+DEF LCDCB_BG9C00 EQU 3 ; BG Tile Map Display Select
562562+DEF LCDCB_OBJ16 EQU 2 ; OBJ Construction
563563+DEF LCDCB_OBJON EQU 1 ; OBJ Display
564564+DEF LCDCB_BGON EQU 0 ; BG Display
435565; "Window Character Data Select" follows BG
436566437567···452582DEF STATF_LCD EQU %00000011 ; Both OAM and VRAM used by system
453583DEF STATF_BUSY EQU %00000010 ; When set, VRAM access is unsafe
454584585585+DEF STATB_LYC EQU 6
586586+DEF STATB_MODE10 EQU 5
587587+DEF STATB_MODE01 EQU 4
588588+DEF STATB_MODE00 EQU 3
589589+DEF STATB_LYCF EQU 2
590590+DEF STATB_BUSY EQU 1
455591456592; --
457593; -- SCY ($FF42)
···542678; --
543679DEF rWX EQU $FF4B
544680681681+DEF WX_OFS EQU 7 ; add this to a screen position to get a WX position
682682+545683546684; --
547685; -- SPEED ($FF4D)
···604742605743DEF HDMA5F_MODE_GP EQU %00000000 ; General Purpose DMA (W)
606744DEF HDMA5F_MODE_HBL EQU %10000000 ; HBlank DMA (W)
745745+DEF HDMA5B_MODE EQU 7 ; DMA mode select (W)
607746608747; -- Once DMA has started, use HDMA5F_BUSY to check when the transfer is complete
609748DEF HDMA5F_BUSY EQU %10000000 ; 0=Busy (DMA still in progress), 1=Transfer complete (R)
···621760DEF RPF_WRITE_HI EQU %00000001
622761DEF RPF_WRITE_LO EQU %00000000
623762763763+DEF RPB_LED_ON EQU 0
764764+DEF RPB_DATAIN EQU 1
765765+624766625767; --
626626-; -- BCPS ($FF68)
627627-; -- Background Color Palette Specification (R/W)
768768+; -- BCPS/BGPI ($FF68)
769769+; -- Background Color Palette Specification (aka Background Palette Index) (R/W)
628770; --
629771DEF rBCPS EQU $FF68
772772+DEF rBGPI EQU rBCPS
630773631774DEF BCPSF_AUTOINC EQU %10000000 ; Auto Increment (0=Disabled, 1=Increment after Writing)
775775+DEF BCPSB_AUTOINC EQU 7
776776+DEF BGPIF_AUTOINC EQU BCPSF_AUTOINC
777777+DEF BGPIB_AUTOINC EQU BCPSB_AUTOINC
632778633779634780; --
635635-; -- BCPD ($FF69)
636636-; -- Background Color Palette Data (R/W)
781781+; -- BCPD/BGPD ($FF69)
782782+; -- Background Color Palette Data (aka Background Palette Data) (R/W)
637783; --
638784DEF rBCPD EQU $FF69
785785+DEF rBGPD EQU rBCPD
639786640787641788; --
642642-; -- OCPS ($FF6A)
643643-; -- Object Color Palette Specification (R/W)
789789+; -- OCPS/OBPI ($FF6A)
790790+; -- Object Color Palette Specification (aka Object Background Palette Index) (R/W)
644791; --
645792DEF rOCPS EQU $FF6A
793793+DEF rOBPI EQU rOCPS
646794647795DEF OCPSF_AUTOINC EQU %10000000 ; Auto Increment (0=Disabled, 1=Increment after Writing)
796796+DEF OCPSB_AUTOINC EQU 7
797797+DEF OBPIF_AUTOINC EQU OCPSF_AUTOINC
798798+DEF OBPIB_AUTOINC EQU OCPSB_AUTOINC
648799649800650801; --
651651-; -- OCPD ($FF6B)
652652-; -- Object Color Palette Data (R/W)
802802+; -- OCPD/OBPD ($FF6B)
803803+; -- Object Color Palette Data (aka Object Background Palette Data) (R/W)
653804; --
654805DEF rOCPD EQU $FF6B
806806+DEF rOBPD EQU rOCPD
807807+808808+809809+; --
810810+; -- OPRI ($FF6C)
811811+; -- Object Priority Mode (R/W)
812812+; -- CGB Only
813813+814814+; --
815815+; -- Priority can be changed only from the boot ROM
816816+; --
817817+DEF rOPRI EQU $FF6C
818818+819819+DEF OPRI_OAM EQU 0 ; Prioritize objects by location in OAM (CGB Mode default)
820820+DEF OPRI_COORD EQU 1 ; Prioritize objects by x-coordinate (Non-CGB Mode default)
821821+655822656823657824; --
···695862DEF IEF_TIMER EQU %00000100 ; Timer Overflow
696863DEF IEF_STAT EQU %00000010 ; STAT
697864DEF IEF_VBLANK EQU %00000001 ; V-Blank
865865+866866+DEF IEB_HILO EQU 4
867867+DEF IEB_SERIAL EQU 3
868868+DEF IEB_TIMER EQU 2
869869+DEF IEB_STAT EQU 1
870870+DEF IEB_VBLANK EQU 0
698871699872700873;***************************************************************************
···731904; -- Can be used with AUD1HIGH, AUD2HIGH, AUD3HIGH
732905; -- See AUD1HIGH for more info
733906; --
734734-735907DEF AUDHIGH_RESTART EQU %10000000
736908DEF AUDHIGH_LENGTH_ON EQU %01000000
737909DEF AUDHIGH_LENGTH_OFF EQU %00000000
···744916;***************************************************************************
745917746918DEF BOOTUP_A_DMG EQU $01 ; Dot Matrix Game
747747-DEF BOOTUP_A_CGB EQU $11 ; Color GameBoy
748748-DEF BOOTUP_A_MGB EQU $FF ; Mini GameBoy (Pocket GameBoy)
919919+DEF BOOTUP_A_CGB EQU $11 ; Color Game Boy
920920+DEF BOOTUP_A_MGB EQU $FF ; Mini Game Boy (Pocket Game Boy)
749921750922; if a=BOOTUP_A_CGB, bit 0 in b can be checked to determine if real CGB or
751923; other system running in GBC mode
···755927756928;***************************************************************************
757929;*
758758-;* Cart related
930930+;* Interrupt vector addresses
759931;*
760932;***************************************************************************
761933762762-; $0143 Color GameBoy compatibility code
934934+DEF INT_HANDLER_VBLANK EQU $0040
935935+DEF INT_HANDLER_STAT EQU $0048
936936+DEF INT_HANDLER_TIMER EQU $0050
937937+DEF INT_HANDLER_SERIAL EQU $0058
938938+DEF INT_HANDLER_JOYPAD EQU $0060
939939+940940+941941+;***************************************************************************
942942+;*
943943+;* Header
944944+;*
945945+;***************************************************************************
946946+947947+;*
948948+;* Nintendo scrolling logo
949949+;* (Code won't work on a real Game Boy)
950950+;* (if next lines are altered.)
951951+MACRO NINTENDO_LOGO
952952+ DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D
953953+ DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99
954954+ DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E
955955+ENDM
956956+957957+; $0143 Color Game Boy compatibility code
763958DEF CART_COMPATIBLE_DMG EQU $00
764959DEF CART_COMPATIBLE_DMG_GBC EQU $80
765960DEF CART_COMPATIBLE_GBC EQU $C0
766961767767-; $0146 GameBoy/Super GameBoy indicator
962962+; $0146 Game Boy/Super Game Boy indicator
768963DEF CART_INDICATOR_GB EQU $00
769964DEF CART_INDICATOR_SGB EQU $03
770965···786981DEF CART_ROM_MBC3_RAM EQU $12
787982DEF CART_ROM_MBC3_RAM_BAT EQU $13
788983DEF CART_ROM_MBC5 EQU $19
789789-DEF CART_ROM_MBC5_BAT EQU $1A
984984+DEF CART_ROM_MBC5_RAM EQU $1A
790985DEF CART_ROM_MBC5_RAM_BAT EQU $1B
791986DEF CART_ROM_MBC5_RUMBLE EQU $1C
792987DEF CART_ROM_MBC5_RAM_RUMBLE EQU $1D
···8151010; $0149 SRAM size
8161011; these are kilobytes
8171012DEF CART_SRAM_NONE EQU 0
818818-DEF CART_SRAM_2KB EQU 1 ; 1 incomplete bank
8191013DEF CART_SRAM_8KB EQU 2 ; 1 bank
8201014DEF CART_SRAM_32KB EQU 3 ; 4 banks
8211015DEF CART_SRAM_128KB EQU 4 ; 16 banks
822822-823823-DEF CART_SRAM_ENABLE EQU $0A
824824-DEF CART_SRAM_DISABLE EQU $00
82510168261017; $014A Destination code
8271018DEF CART_DEST_JAPANESE EQU $00
···8601051;***************************************************************************
86110528621053DEF SCRN_X EQU 160 ; Width of screen in pixels
863863-DEF SCRN_Y EQU 144 ; Height of screen in pixels
10541054+DEF SCRN_Y EQU 144 ; Height of screen in pixels. Also corresponds to the value in LY at the beginning of VBlank.
8641055DEF SCRN_X_B EQU 20 ; Width of screen in bytes
8651056DEF SCRN_Y_B EQU 18 ; Height of screen in bytes
8661057···8791070; OAM attributes
8801071; each entry in OAM RAM is 4 bytes (sizeof_OAM_ATTRS)
8811072RSRESET
882882-DEF OAMA_Y RB 1 ; y pos
883883-DEF OAMA_X RB 1 ; x pos
10731073+DEF OAMA_Y RB 1 ; y pos plus 16
10741074+DEF OAMA_X RB 1 ; x pos plus 8
8841075DEF OAMA_TILEID RB 1 ; tile id
8851076DEF OAMA_FLAGS RB 1 ; flags (see below)
8861077DEF sizeof_OAM_ATTRS RB 0
10781078+10791079+DEF OAM_Y_OFS EQU 16 ; add this to a screen-relative Y position to get an OAM Y position
10801080+DEF OAM_X_OFS EQU 8 ; add this to a screen-relative X position to get an OAM X position
88710818881082DEF OAM_COUNT EQU 40 ; number of OAM entries in OAM RAM
8891083···9051099DEF OAMB_BANK1 EQU 3 ; Bank number; 0,1 (GBC)
90611009071101908908-;*
909909-;* Nintendo scrolling logo
910910-;* (Code won't work on a real GameBoy)
911911-;* (if next lines are altered.)
912912-MACRO NINTENDO_LOGO
913913- DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D
914914- DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99
915915- DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E
916916-ENDM
917917-9181102; Deprecated constants. Please avoid using.
91911039201104DEF IEF_LCDC EQU %00000010 ; LCDC (see STAT)
11051105+DEF _VRAM8000 EQU _VRAM
11061106+DEF _VRAM8800 EQU _VRAM+$800
11071107+DEF _VRAM9000 EQU _VRAM+$1000
11081108+DEF CART_SRAM_2KB EQU 1 ; 1 incomplete bank
11091109+DEF LCDCF_BG8800 EQU %00000000 ; BG & Window Tile Data Select
11101110+DEF LCDCF_BG8000 EQU %00010000 ; BG & Window Tile Data Select
11111111+DEF LCDCB_BG8000 EQU 4 ; BG & Window Tile Data Select
9211112922922- ENDC ;HARDWARE_INC11131113+11141114+ ENDC ;HARDWARE_INC
-158
gb/hello-world.asm
···11-INCLUDE "hardware.inc"
22-33-SECTION "Header", ROM0[$100]
44-55- jp EntryPoint
66-77- ds $150 - @, 0 ; Make room for the header
88-99-EntryPoint:
1010- ; Shut down audio circuitry
1111- ld a, 0
1212- ld [rNR52], a
1313-1414- ; Do not turn the LCD off outside of VBlank
1515-WaitVBlank:
1616- ld a, [rLY]
1717- cp 144
1818- jp c, WaitVBlank
1919-2020- ; Turn the LCD off
2121- ld a, 0
2222- ld [rLCDC], a
2323-2424- ; Copy the tile data
2525- ld de, Tiles
2626- ld hl, $9000
2727- ld bc, TilesEnd - Tiles
2828-CopyTiles:
2929- ld a, [de]
3030- ld [hli], a
3131- inc de
3232- dec bc
3333- ld a, b
3434- or a, c
3535- jp nz, CopyTiles
3636-3737- ; Copy the tilemap
3838- ld de, Tilemap
3939- ld hl, $9800
4040- ld bc, TilemapEnd - Tilemap
4141-CopyTilemap:
4242- ld a, [de]
4343- ld [hli], a
4444- inc de
4545- dec bc
4646- ld a, b
4747- or a, c
4848- jp nz, CopyTilemap
4949-5050- ; Turn the LCD on
5151- ld a, LCDCF_ON | LCDCF_BGON
5252- ld [rLCDC], a
5353-5454- ; During the first (blank) frame, initialize display registers
5555- ld a, %11100100
5656- ld [rBGP], a
5757-5858-Done:
5959- jp Done
6060-6161-6262-SECTION "Tile data", ROM0
6363-6464-Tiles:
6565- db $00,$ff, $00,$ff, $00,$ff, $00,$ff, $00,$ff, $00,$ff, $00,$ff, $00,$ff
6666- db $00,$ff, $00,$80, $00,$80, $00,$80, $00,$80, $00,$80, $00,$80, $00,$80
6767- db $00,$ff, $00,$7e, $00,$7e, $00,$7e, $00,$7e, $00,$7e, $00,$7e, $00,$7e
6868- db $00,$ff, $00,$01, $00,$01, $00,$01, $00,$01, $00,$01, $00,$01, $00,$01
6969- db $00,$ff, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00
7070- db $00,$ff, $00,$7f, $00,$7f, $00,$7f, $00,$7f, $00,$7f, $00,$7f, $00,$7f
7171- db $00,$ff, $03,$fc, $00,$f8, $00,$f0, $00,$e0, $20,$c0, $00,$c0, $40,$80
7272- db $00,$ff, $c0,$3f, $00,$1f, $00,$0f, $00,$07, $04,$03, $00,$03, $02,$01
7373- db $00,$80, $00,$80, $7f,$80, $00,$80, $00,$80, $7f,$80, $7f,$80, $00,$80
7474- db $00,$7e, $2a,$7e, $d5,$7e, $2a,$7e, $54,$7e, $ff,$00, $ff,$00, $00,$00
7575- db $00,$01, $00,$01, $ff,$01, $00,$01, $01,$01, $fe,$01, $ff,$01, $00,$01
7676- db $00,$80, $80,$80, $7f,$80, $80,$80, $00,$80, $ff,$80, $7f,$80, $80,$80
7777- db $00,$7f, $2a,$7f, $d5,$7f, $2a,$7f, $55,$7f, $ff,$00, $ff,$00, $00,$00
7878- db $00,$ff, $aa,$ff, $55,$ff, $aa,$ff, $55,$ff, $fa,$07, $fd,$07, $02,$07
7979- db $00,$7f, $2a,$7f, $d5,$7f, $2a,$7f, $55,$7f, $aa,$7f, $d5,$7f, $2a,$7f
8080- db $00,$ff, $80,$ff, $00,$ff, $80,$ff, $00,$ff, $80,$ff, $00,$ff, $80,$ff
8181- db $40,$80, $00,$80, $7f,$80, $00,$80, $00,$80, $7f,$80, $7f,$80, $00,$80
8282- db $00,$3c, $02,$7e, $85,$7e, $0a,$7e, $14,$7e, $ab,$7e, $95,$7e, $2a,$7e
8383- db $02,$01, $00,$01, $ff,$01, $00,$01, $01,$01, $fe,$01, $ff,$01, $00,$01
8484- db $00,$ff, $80,$ff, $50,$ff, $a8,$ff, $50,$ff, $a8,$ff, $54,$ff, $a8,$ff
8585- db $7f,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80
8686- db $ff,$00, $ff,$00, $ff,$00, $ab,$7e, $d5,$7e, $ab,$7e, $d5,$7e, $ab,$7e
8787- db $ff,$01, $fe,$01, $ff,$01, $fe,$01, $ff,$01, $fe,$01, $ff,$01, $fe,$01
8888- db $7f,$80, $ff,$80, $7f,$80, $ff,$80, $7f,$80, $ff,$80, $7f,$80, $ff,$80
8989- db $ff,$00, $ff,$00, $ff,$00, $aa,$7f, $d5,$7f, $aa,$7f, $d5,$7f, $aa,$7f
9090- db $f8,$07, $f8,$07, $f8,$07, $80,$ff, $00,$ff, $aa,$ff, $55,$ff, $aa,$ff
9191- db $7f,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80, $ff,$80, $7f,$80, $ff,$80
9292- db $d5,$7f, $aa,$7f, $d5,$7f, $aa,$7f, $d5,$7f, $aa,$7f, $d5,$7f, $aa,$7f
9393- db $d5,$7e, $ab,$7e, $d5,$7e, $ab,$7e, $d5,$7e, $ab,$7e, $d5,$7e, $eb,$3c
9494- db $54,$ff, $aa,$ff, $54,$ff, $aa,$ff, $54,$ff, $aa,$ff, $54,$ff, $aa,$ff
9595- db $7f,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80, $00,$ff
9696- db $d5,$7e, $ab,$7e, $d5,$7e, $ab,$7e, $d5,$7e, $ab,$7e, $d5,$7e, $2a,$ff
9797- db $ff,$01, $fe,$01, $ff,$01, $fe,$01, $ff,$01, $fe,$01, $ff,$01, $80,$ff
9898- db $7f,$80, $ff,$80, $7f,$80, $ff,$80, $7f,$80, $ff,$80, $7f,$80, $aa,$ff
9999- db $ff,$00, $ff,$00, $ff,$00, $ff,$00, $ff,$00, $ff,$00, $ff,$00, $2a,$ff
100100- db $ff,$01, $fe,$01, $ff,$01, $fe,$01, $fe,$01, $fe,$01, $fe,$01, $80,$ff
101101- db $7f,$80, $ff,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80, $7f,$80, $00,$ff
102102- db $fe,$01, $fe,$01, $fe,$01, $fe,$01, $fe,$01, $fe,$01, $fe,$01, $80,$ff
103103- db $3f,$c0, $3f,$c0, $3f,$c0, $1f,$e0, $1f,$e0, $0f,$f0, $03,$fc, $00,$ff
104104- db $fd,$03, $fc,$03, $fd,$03, $f8,$07, $f9,$07, $f0,$0f, $c1,$3f, $82,$ff
105105- db $55,$ff, $2a,$7e, $54,$7e, $2a,$7e, $54,$7e, $2a,$7e, $54,$7e, $00,$7e
106106- db $01,$ff, $00,$01, $01,$01, $00,$01, $01,$01, $00,$01, $01,$01, $00,$01
107107- db $54,$ff, $ae,$f8, $50,$f0, $a0,$e0, $60,$c0, $80,$c0, $40,$80, $40,$80
108108- db $55,$ff, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00
109109- db $55,$ff, $6a,$1f, $05,$0f, $02,$07, $05,$07, $02,$03, $03,$01, $02,$01
110110- db $54,$ff, $80,$80, $00,$80, $80,$80, $00,$80, $80,$80, $00,$80, $00,$80
111111- db $55,$ff, $2a,$1f, $0d,$07, $06,$03, $01,$03, $02,$01, $01,$01, $00,$01
112112- db $55,$ff, $2a,$7f, $55,$7f, $2a,$7f, $55,$7f, $2a,$7f, $55,$7f, $00,$7f
113113- db $55,$ff, $aa,$ff, $55,$ff, $aa,$ff, $55,$ff, $aa,$ff, $55,$ff, $00,$ff
114114- db $15,$ff, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00
115115- db $55,$ff, $6a,$1f, $0d,$07, $06,$03, $01,$03, $02,$01, $03,$01, $00,$01
116116- db $54,$ff, $a8,$ff, $54,$ff, $a8,$ff, $50,$ff, $a0,$ff, $40,$ff, $00,$ff
117117- db $00,$7e, $2a,$7e, $d5,$7e, $2a,$7e, $54,$7e, $ab,$76, $dd,$66, $22,$66
118118- db $00,$7c, $2a,$7e, $d5,$7e, $2a,$7e, $54,$7c, $ff,$00, $ff,$00, $00,$00
119119- db $00,$01, $00,$01, $ff,$01, $02,$01, $07,$01, $fe,$03, $fd,$07, $0a,$0f
120120- db $00,$7c, $2a,$7e, $d5,$7e, $2a,$7e, $54,$7e, $ab,$7e, $d5,$7e, $2a,$7e
121121- db $00,$ff, $a0,$ff, $50,$ff, $a8,$ff, $54,$ff, $a8,$ff, $54,$ff, $aa,$ff
122122- db $dd,$62, $bf,$42, $fd,$42, $bf,$40, $ff,$00, $ff,$00, $f7,$08, $ef,$18
123123- db $ff,$00, $ff,$00, $ff,$00, $ab,$7c, $d5,$7e, $ab,$7e, $d5,$7e, $ab,$7e
124124- db $f9,$07, $fc,$03, $fd,$03, $fe,$01, $ff,$01, $fe,$01, $ff,$01, $fe,$01
125125- db $d5,$7e, $ab,$7e, $d5,$7e, $ab,$7e, $d5,$7e, $ab,$7e, $d5,$7e, $ab,$7c
126126- db $f7,$18, $eb,$1c, $d7,$3c, $eb,$3c, $d5,$3e, $ab,$7e, $d5,$7e, $2a,$ff
127127- db $ff,$01, $fe,$01, $ff,$01, $fe,$01, $ff,$01, $fe,$01, $ff,$01, $a2,$ff
128128- db $7f,$c0, $bf,$c0, $7f,$c0, $bf,$e0, $5f,$e0, $af,$f0, $57,$fc, $aa,$ff
129129- db $ff,$01, $fc,$03, $fd,$03, $fc,$03, $f9,$07, $f0,$0f, $c1,$3f, $82,$ff
130130- db $55,$ff, $2a,$ff, $55,$ff, $2a,$ff, $55,$ff, $2a,$ff, $55,$ff, $00,$ff
131131- db $45,$ff, $a2,$ff, $41,$ff, $82,$ff, $41,$ff, $80,$ff, $01,$ff, $00,$ff
132132- db $54,$ff, $aa,$ff, $54,$ff, $aa,$ff, $54,$ff, $aa,$ff, $54,$ff, $00,$ff
133133- db $15,$ff, $2a,$ff, $15,$ff, $0a,$ff, $15,$ff, $0a,$ff, $01,$ff, $00,$ff
134134- db $01,$ff, $80,$ff, $01,$ff, $80,$ff, $01,$ff, $80,$ff, $01,$ff, $00,$ff
135135-TilesEnd:
136136-137137-SECTION "Tilemap", ROM0
138138-139139-Tilemap:
140140- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
141141- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
142142- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
143143- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
144144- db $00, $00, $01, $02, $03, $01, $04, $03, $01, $05, $00, $01, $05, $00, $06, $04, $07, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
145145- db $00, $00, $08, $09, $0a, $0b, $0c, $0d, $0b, $0e, $0f, $08, $0e, $0f, $10, $11, $12, $13, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
146146- db $00, $00, $14, $15, $16, $17, $18, $19, $1a, $1b, $0f, $14, $1b, $0f, $14, $1c, $16, $1d, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
147147- db $00, $00, $1e, $1f, $20, $21, $22, $23, $24, $22, $25, $1e, $22, $25, $26, $22, $27, $1d, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
148148- db $00, $00, $01, $28, $29, $2a, $2b, $2c, $2d, $2b, $2e, $2d, $2f, $30, $2d, $31, $32, $33, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
149149- db $00, $00, $08, $34, $0a, $0b, $11, $0a, $0b, $35, $36, $0b, $0e, $0f, $08, $37, $0a, $38, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
150150- db $00, $00, $14, $39, $16, $17, $1c, $16, $17, $3a, $3b, $17, $1b, $0f, $14, $3c, $16, $1d, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
151151- db $00, $00, $1e, $3d, $3e, $3f, $22, $27, $21, $1f, $20, $21, $22, $25, $1e, $22, $40, $1d, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
152152- db $00, $00, $00, $41, $42, $43, $44, $30, $33, $41, $45, $43, $41, $30, $43, $41, $30, $33, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
153153- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
154154- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
155155- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
156156- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
157157- db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, 0,0,0,0,0,0,0,0,0,0,0,0
158158-TilemapEnd:
+18
gb/main.asm
···11+INCLUDE "hardware.inc"
22+33+SECTION "Header", ROM0[$100]
44+55+ jp EntryPoint
66+77+ ds $150 - @, 0 ; Make room for the header
88+99+EntryPoint:
1010+ ; Do not turn the LCD off outside of VBlank
1111+WaitVBlank:
1212+ ld a, [rLY]
1313+ cp 144
1414+ jp c, WaitVBlank
1515+1616+ ; Turn the LCD off
1717+ ld a, 0
1818+ ld [rLCDC], a