git.y1.nz

gbdk-2020

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

gbdk-lib/libc/targets/z80/gg/crt0.s

      1         .include        "global.s"
      2 
      3         .title  "Runtime"
      4         .module Runtime
      5 
      6         .ez80
      7 
      8         .area   _HEADER (ABS)
      9 
     10         .globl  .OUTI32
     11 
     12         .org    0x00            ; Reset 00h
     13         di                      ; disable interrupt
     14         im 1                    ; interrupt mode 1 (this won't change)
     15         jp .init
     16 
     17 ;        .org    0x08            ; --profile handler
     18 
     19         .org    0x10            ; RST 0x10: VDP_WRITE_CMD
     20 
     21 _WRITE_VDP_CMD::
     22         VDP_WRITE_CMD h, l
     23         ret
     24 
     25 ;        .org    0x18            ; unusable
     26 
     27         .org    0x20            ; RST 0x20: VDP_WRITE_DATA
     28 
     29 _WRITE_VDP_DATA::
     30         VDP_WRITE_DATA h, l
     31         ret
     32 
     33 ;       .org    0x28             ; unusable
     34 
     35         .org    0x30            ; RST 0x30: call HL
     36 .call_hl::
     37         jp      (HL)
     38 
     39         .org    0x38            ; handle IRQ
     40         jp _INT_ISR
     41 
     42         .org    0x66            ; handle NMI
     43         jp _NMI_ISR
     44 
     45         .org    0x80
     46 
     47 .init::
     48         ld sp, #.STACK          ; set stack pointer at end of RAM
     49 
     50         ld a, (#.BIOS)
     51         push af
     52 
     53         xor a
     54         ld bc, #l__DATA
     55         ld hl, #s__DATA
     56         call .memset_simple     ; initialize veriables in RAM with zero
     57 
     58         pop af
     59         ld (#__BIOS), a         ; save BIOS value
     60 
     61         ld hl, #_shadow_OAM
     62         ld de, #(_shadow_OAM + 1)
     63         ld bc, #64
     64         ld (hl), #0xc0
     65         ldir
     66         ld (hl), #0
     67         ld bc, #(128 - 1)
     68         ldir
     69 
     70         ld hl,#0x0000           ; initialize mappers
     71         ld (#.RAM_CONTROL),hl   ; [.RAM_CONTROL]=$00, [.MAP_FRAME0]=$00
     72         ld hl,#0x0201
     73         ld (#.MAP_FRAME1),hl    ; [.MAP_FRAME1]=$01, [.MAP_FRAME2]=$02
     74 
     75         ; Initialise global variables
     76         call .gsinit
     77 
     78         ; Clear VRAM and Initialize VDP
     79 
     80         ld hl, #((.VDP_R1 << 8) | (.R1_DEFAULT | .R1_DISP_OFF))
     81         ld c, #.VDP_CMD
     82         out (c), l
     83         out (c), h
     84 
     85         ; clear VRAM
     86         call .clear_VRAM
     87 
     88         ; set default palette
     89         call .set_default_palette
     90 
     91         ; set VDP registers
     92         ld c, #.VDP_CMD
     93         ld b, #(.shadow_VDP_end - .shadow_VDP)
     94         ld hl,#(.shadow_VDP_end - 1)
     95 1$:
     96         outd
     97 
     98         ld a, b
     99         or #.VDP_REG_MASK
    100         out (c), a
    101 
    102         ld a, b
    103         or a
    104         jr nz, 1$
    105 
    106         ; detect PAL/NTSC
    107         in a, (.GG_STATE)
    108         and #.GGSTATE_NNTS
    109         jr nz, 2$
    110         ld a, #.SYSTEM_NTSC
    111         jr 3$
    112 2$:
    113         ld a, #.SYSTEM_PAL
    114 3$:
    115         ld (#__SYSTEM), a
    116 
    117         VDP_CANCEL_INT
    118 
    119         ei                      ; re-enable interrupts before going to main()
    120 
    121         call _main
    122 10$:
    123         halt
    124         jr 10$
    125 
    126         ; Ordering of segments for the linker.
    127         .area   _HOME
    128         .area   _BASE
    129         .area   _CODE
    130         .area   _CODE_0
    131         .area   _LIT
    132         .area   _INITIALIZER
    133         .area   _GSINIT
    134         .area   _GSFINAL
    135 
    136         .area   _DATA
    137         .area   _INITIALIZED
    138         .area   _BSEG
    139         .area   _BSS
    140         .area   _HEAP
    141         .area   _HEAP_END
    142 
    143         .area   _CODE
    144         .area   _GSINIT
    145 .gsinit::
    146         ; initialize static storage variables
    147         ld bc, #l__INITIALIZER
    148         ld hl, #s__INITIALIZER
    149         ld de, #s__INITIALIZED
    150         call .memcpy_simple
    151 
    152         .area   _GSFINAL
    153         ret
    154 
    155         .area   _HOME
    156 
    157 .clear_VRAM:
    158         ld hl, #.VDP_VRAM
    159         ld c, #.VDP_CMD
    160         out (c), l
    161         out (c), h
    162         xor a
    163         ld bc, #0x4101
    164         jr 6$
    165 5$:
    166         out (.VDP_DATA), a
    167 6$:
    168         dec c
    169         jr nz, 5$
    170         dec b
    171         jr nz, 5$
    172         ret
    173 
    174 .set_default_palette:
    175         ld hl, #.VDP_CRAM
    176         ld c, #.VDP_CMD
    177         out (c), l
    178         out (c), h
    179         ld c, #.VDP_DATA
    180         ld hl, #.CRT_DEFAULT_PALETTE
    181         call .OUTI32
    182         ld hl, #.CRT_DEFAULT_PALETTE
    183         jp .OUTI32
    184 
    185 .CRT_DEFAULT_PALETTE::
    186         .dw 0b0000111111111111
    187         .dw 0b0000100010001000
    188         .dw 0b0000010001000100
    189         .dw 0b0000000000000000
    190         .dw 0b0000000000001000
    191         .dw 0b0000000010000000
    192         .dw 0b0000100000000000
    193         .dw 0b0000000010001000
    194         .dw 0b0000100010000000
    195         .dw 0b0000100000001000
    196         .dw 0b0000000000001111
    197         .dw 0b0000000011110000
    198         .dw 0b0000111100000000
    199         .dw 0b0000000011111111
    200         .dw 0b0000111111110000
    201         .dw 0b0000111100001111
    202 
    203         ; fills memory at HL of length BC with A, clobbers DE
    204         ; falls through into the .memcpy_simple
    205 .memset_simple::
    206         ld e, a
    207         ld a, c
    208         or b
    209         ret z
    210         ld (hl), e
    211         dec bc
    212         ld d, h
    213         ld e, l
    214         inc de
    215 
    216         ; copies BC bytes from HL into DE
    217 .memcpy_simple::
    218         ld a, c
    219         or b
    220         ret z
    221         ldir
    222         ret
    223 
    224         ; Wait for VBL interrupt to be finished
    225 .wait_vbl_done::
    226 _wait_vbl_done::
    227 _vsync::
    228         ld  a, (_shadow_VDP_R1)
    229         and #.R1_DISP_ON
    230         ret z
    231 
    232         xor a
    233         ld (.vbl_done), a
    234 1$:
    235         halt
    236         ld a, (.vbl_done)
    237         or a
    238         jr z, 1$
    239         ret
    240 
    241         .area   _DATA
    242 
    243 .start_crt_globals:
    244 __BIOS::
    245         .ds     0x01            ; GB type (GB, PGB, CGB)
    246 __SYSTEM::
    247         .ds     0x01            ; PAL/NTSC
    248 .end_crt_globals:
    249 
    250         .area _INITIALIZED
    251 .shadow_VDP:
    252 _shadow_VDP_R0::
    253         .ds     0x01
    254 _shadow_VDP_R1::
    255         .ds     0x01
    256 _shadow_VDP_R2::
    257         .ds     0x01
    258 _shadow_VDP_R3::
    259         .ds     0x01
    260 _shadow_VDP_R4::
    261         .ds     0x01
    262 _shadow_VDP_R5::
    263         .ds     0x01
    264 _shadow_VDP_R6::
    265         .ds     0x01
    266 _shadow_VDP_R7::
    267 _shadow_VDP_RBORDER::
    268         .ds     0x01
    269 _shadow_VDP_R8::
    270 _shadow_VDP_RSCX::
    271         .ds     0x01
    272 _shadow_VDP_R9::
    273 _shadow_VDP_RSCY::
    274         .ds     0x01
    275 _shadow_VDP_R10::
    276         .ds     0x01
    277 .shadow_VDP_end::
    278 
    279 .sys_time::
    280 _sys_time::
    281         .ds     0x02
    282 .vbl_done::
    283 __vbl_done::
    284         .ds     0x01
    285 _VDP_ATTR_SHIFT::
    286 .vdp_shift::
    287         .ds     0x01
    288 __shadow_OAM_base::
    289         .ds     0x01
    290 __shadow_OAM_OFF::
    291         .ds     0x01
    292 __sprites_OFF::
    293         .ds     0x01
    294 .mode::
    295         .ds     0x01            ; Current mode
    296 
    297         .area _INITIALIZER
    298 
    299         .db .R0_DEFAULT
    300         .db #(.R1_DEFAULT | .R1_DISP_ON | .R1_IE)       ; VBLANK
    301         .db .R2_MAP_0x1800                              ; .R2_MAP_0x3800
    302         .db 0xFF
    303         .db 0xFF
    304         .db .R5_SAT_0x1F00                              ; .R5_SAT_0x3F00
    305         .db .R6_DATA_0x2000
    306         .db #(0 | .R7_COLOR_MASK)
    307         .db 0                   ; SCX
    308         .db 0                   ; SCY
    309         .db .R10_INT_OFF
    310         .dw 0x0000              ; .sys_time
    311         .db 0                   ; .vbl_done
    312         .db 0                   ; _VDP_ATTR_SHIFT
    313         .db #>_shadow_OAM       ; __shadow_OAM_base
    314         .db 0                   ; __shadow_OAM_OFF
    315         .db 0                   ; __sprites_OFF
    316         .db .T_MODE_INOUT       ; .mode

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