git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

commit 7125a65ad1fe5a893fcc6b757873066f9b88fce2
parent 4734ad44d98f5fa5791195c55e3e248b57478a8d
Author: Toxa <untoxa@mail.ru>
Date:   Tue,  9 Jun 2026 18:24:49 +0300

GB: use the new register definitions and other minor improvements in crt0

Diffstat:
Mgbdk-lib/libc/targets/sm83/gb/crt0.s206++++++++++++++++++++++++++++++++++++++++----------------------------------------
1 file changed, 103 insertions(+), 103 deletions(-)

diff --git a/gbdk-lib/libc/targets/sm83/gb/crt0.s b/gbdk-lib/libc/targets/sm83/gb/crt0.s @@ -124,10 +124,10 @@ _refresh_OAM:: _set_interrupts:: DI - LDH (.IE),A + LDH (rIE),A XOR A EI - LDH (.IFL),A ; Clear pending interrupts + LDH (rIF),A ; Clear pending interrupts RET ;; Copy OAM data to OAM RAM @@ -136,7 +136,7 @@ _set_interrupts:: OR A RET Z .start_refresh_OAM_DMA: - LDH (.DMA),A ; Put A into DMA registers + LDH (rDMA),A ; Put A into DMA registers LD A,#0x28 ; We need to wait 160 ns 1$: DEC A @@ -155,53 +155,44 @@ _set_interrupts:: ;; Nintendo logo .org 0x104 - .byte 0xCE,0xED,0x66,0x66 - .byte 0xCC,0x0D,0x00,0x0B - .byte 0x03,0x73,0x00,0x83 - .byte 0x00,0x0C,0x00,0x0D - .byte 0x00,0x08,0x11,0x1F - .byte 0x88,0x89,0x00,0x0E - .byte 0xDC,0xCC,0x6E,0xE6 - .byte 0xDD,0xDD,0xD9,0x99 - .byte 0xBB,0xBB,0x67,0x63 - .byte 0x6E,0x0E,0xEC,0xCC - .byte 0xDD,0xDC,0x99,0x9F - .byte 0xBB,0xB9,0x33,0x3E + .db 0xCE,0xED,0x66,0x66,0xCC,0x0D,0x00,0x0B,0x03,0x73,0x00,0x83,0x00,0x0C,0x00,0x0D + .db 0x00,0x08,0x11,0x1F,0x88,0x89,0x00,0x0E,0xDC,0xCC,0x6E,0xE6,0xDD,0xDD,0xD9,0x99 + .db 0xBB,0xBB,0x67,0x63,0x6E,0x0E,0xEC,0xCC,0xDD,0xDC,0x99,0x9F,0xBB,0xB9,0x33,0x3E ;; Title of the game .org 0x134 .asciz "Title" .org 0x144 - .byte 0,0,0 + .db 0,0,0 ;; Cartridge type is ROM only .org 0x147 - .byte 0 + .db 0 ;; ROM size is 32kB .org 0x148 - .byte 0 + .db 0 ;; RAM size is 0kB .org 0x149 - .byte 0 + .db 0 ;; Maker ID .org 0x14A - .byte 0x00,0x00 + .db 0x00,0x00 ;; Version number .org 0x14C - .byte 0x01 + .db 0x01 ;; Complement check .org 0x14D - .byte 0x00 + .db 0x00 ;; Checksum .org 0x14E - .byte 0x00,0x00 + .db 0x00,0x00 ;; **************************************** .org 0x150 @@ -215,9 +206,16 @@ _reset:: ;; Initialization code .code_start:: - DI ; Disable interrupts - LD D, A ; Store CPU type in D - LD E, B ; Store GBA flag in E + DI ; Disable interrupts + + ;; switch off background, sprites and window + LD HL, #rLCDC + LD (HL), #LCDCF_ON + + ;; preserve regs for the system detection + LD D, A ; Store CPU type in D + LD E, B ; Store GBA flag in E + ;; Initialize the stack LD SP, #.STACK @@ -239,61 +237,63 @@ _reset:: 1$: XOR A -; LD (.mode),A ; Clearing (.mode) is performed when clearing RAM - ;; Initialize the display - LDH (.SCY),A - LDH (.SCX),A - LDH (.STAT),A - LDH (.WY),A - LD A,#0x07 - LDH (.WX),A + LDH (rSCY), A + LDH (rSCX), A + LDH (rSTAT), A + LDH (rWY), A + LD A, #.MINWNDPOSX + LDH (rWX), A ;; Copy refresh_OAM routine to HRAM - LD DE,#.start_refresh_OAM ; source - LD HL,#.refresh_OAM ; dest - LD C,#(.end_refresh_OAM - .start_refresh_OAM) ; size + LD DE, #.start_refresh_OAM ; source + LD HL, #.refresh_OAM ; dest + LD C, #(.end_refresh_OAM - .start_refresh_OAM) ; size RST 0x30 ; call .MemcpySmall ;; Clear the OAM by calling refresh_OAM CALL .refresh_OAM ;; Install interrupt routines - LD DE,#.std_vbl + LD DE, #.std_vbl CALL .add_VBL - ;; Standard color palettes - LD A,#0b11100100 ; Grey 3 = 11 (Black) - ; Grey 2 = 10 (Dark grey) - ; Grey 1 = 01 (Light grey) - ; Grey 0 = 00 (Transparent) - LDH (.BGP),A - LDH (.OBP0),A - LD A,#0b00011011 - LDH (.OBP1),A + ;; Standard color palettes + LD A, #0b11100100 ; Grey 3 = 11 (Black) + ; Grey 2 = 10 (Dark grey) + ; Grey 1 = 01 (Light grey) + ; Grey 0 = 00 (Transparent) + LDH (rBGP), A + LDH (rOBP0), A + LD A, #0b00011011 + LDH (rOBP1), A ;; Turn the screen on - LD A,#(LCDCF_ON | LCDCF_WIN9C00 | LCDCF_WINOFF | LCDCF_BG8800 | LCDCF_BG9800 | LCDCF_OBJ8 | LCDCF_OBJOFF | LCDCF_BGOFF) - LDH (.LCDC),A + LD A, #(LCDCF_ON | LCDCF_WIN9C00 | LCDCF_WINOFF | LCDCF_BG8800 | LCDCF_BG9800 | LCDCF_OBJ8 | LCDCF_OBJOFF | LCDCF_BGOFF) + LDH (rLCDC), A - LD A,#.VBL_IFLAG ; switch on VBlank interrupt only - LDH (.IE),A + LD A, #.VBL_IFLAG ; switch on VBlank interrupt only + LDH (rIE), A XOR A - LDH (.IFL),A + LDH (rIF), A - LD HL,#.sys_time - LD (HL+),A - LD (HL),A + LDH (rAUDENA), A ; Turn sound off - LDH (.NR52),A ; Turn sound off + ;; set default .mode (performed when clearing RAM) +; LD (.mode), A + + ;; zero system time counter (performed when clearing RAM) +; LD HL,#.sys_time +; LD (HL+), A +; LD (HL), A INC A - LDH (__current_bank),A ; current bank is 1 at startup + LDH (__current_bank), A ; current bank is 1 at startup CALL gsinit - EI ; Enable interrupts + EI ; Enable interrupts ;; Call the main function CALL _main @@ -301,64 +301,64 @@ _exit:: 99$: HALT NOP - JR 99$ ; Wait forever + JR 99$ ; Wait forever ;; Wait for VBL interrupt to be finished .wait_vbl_done:: _wait_vbl_done:: _vsync:: ;; Check if the screen is on - LDH A,(.LCDC) + LDH A, (rLCDC) AND #LCDCF_ON - RET Z ; Return if screen is off + RET Z ; Return if screen is off XOR A - LDH (.vbl_done),A ; Clear any previous sets of vbl_done + LDH (.vbl_done), A ; Clear any previous sets of vbl_done 1$: - HALT ; Wait for any interrupt - NOP ; HALT sometimes skips the next instruction - LDH A,(.vbl_done) ; Was it a VBlank interrupt? + HALT ; Wait for any interrupt + NOP ; HALT sometimes skips the next instruction + LDH A, (.vbl_done) ; Was it a VBlank interrupt? ;; Warning: we may lose a VBlank interrupt, if it occurs now OR A - JR Z,1$ ; No: back to sleep! + JR Z, 1$ ; No: back to sleep! RET ;; Remove interrupt routine in DE from the VBL interrupt list ;; falldown to .remove_int _remove_VBL:: .remove_VBL:: - LD HL,#.int_0x40 + LD HL, #.int_0x40 ;; Remove interrupt DE from interrupt list HL if it exists ;; Abort if a 0000 is found (end of list) .remove_int:: 1$: - LD A,(HL+) - LD C,A - LD A,(HL+) - LD B,A + LD A, (HL+) + LD C, A + LD A, (HL+) + LD B, A OR C - RET Z ; No interrupt found + RET Z ; No interrupt found - LD A,E + LD A, E CP C - JR NZ,1$ - LD A,D + JR NZ, 1$ + LD A, D CP B - JR NZ,1$ + JR NZ, 1$ - LD B,H - LD C,L + LD B, H + LD C, L DEC BC DEC BC ;; Now do a memcpy from here until the end of the list 2$: - LD A,(HL+) - LD (BC),A + LD A, (HL+) + LD (BC), A INC BC - LD D,A - LD A,(HL+) - LD (BC),A + LD D, A + LD A, (HL+) + LD (BC), A INC BC OR D JR NZ, 2$ @@ -368,20 +368,20 @@ _remove_VBL:: ;; falldown to .add_int _add_VBL:: .add_VBL:: - LD HL,#.int_0x40 + LD HL, #.int_0x40 ;; Add interrupt routine in DE to the interrupt list in HL .add_int:: 1$: - LD A,(HL+) + LD A, (HL+) OR (HL) - JR Z,2$ + JR Z, 2$ INC HL JR 1$ 2$: - LD A,D - LD (HL-),A - LD (HL),E + LD A, D + LD (HL-), A + LD (HL), E RET ;; **************************************** @@ -485,7 +485,7 @@ gsinit:: SRL B RR C - JR NC,3$ + JR NC, 3$ LD A, (HL+) LD (DE), A INC DE @@ -502,28 +502,28 @@ gsinit:: INC DE 2$: DEC C - JR NZ,1$ + JR NZ, 1$ DEC B - JR NZ,1$ + JR NZ, 1$ 4$: RET .display_off:: _display_off:: ;; Check if the screen is on - LDH A,(.LCDC) + LDH A, (rLCDC) AND #LCDCF_ON - RET Z ; Return if screen is off -1$: ; We wait for the *NEXT* VBL - LDH A,(.LY) - CP #0x92 ; Smaller than or equal to 0x91? - JR NC,1$ ; Loop until smaller than or equal to 0x91 + RET Z ; Return if screen is off +1$: ; We wait for the *NEXT* VBL + LDH A, (rLY) + CP #0x92 ; Smaller than or equal to 0x91? + JR NC,1$ ; Loop until smaller than or equal to 0x91 2$: - LDH A,(.LY) - CP #0x91 ; Bigger than 0x90? - JR C,2$ ; Loop until bigger than 0x90 + LDH A, (rLY) + CP #0x91 ; Bigger than 0x90? + JR C, 2$ ; Loop until bigger than 0x90 - LDH A,(.LCDC) + LDH A, (rLCDC) AND #~LCDCF_ON - LDH (.LCDC),A ; Turn off screen + LDH (rLCDC),A ; Turn off screen RET

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.