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/font.s

      1         .include        "global.s"
      2 
      3         .title  "Font utilities"
      4         .module FontUtils
      5 
      6         .globl  .memset_small
      7         .globl  _font_ibm
      8         .globl  __current_1bpp_colors, .fg_colour, .bg_colour
      9         .globl  _set_native_tile_data, _set_tile_1bpp_data
     10 
     11         ; Structure offsets
     12         sfont_handle_sizeof     = 3
     13         sfont_handle_font       = 1
     14         sfont_handle_first_tile = 0
     15 
     16         ; Encoding types - lower 2 bits of font
     17         FONT_256ENCODING        = 0
     18         FONT_128ENCODING        = 1
     19         FONT_NOENCODING         = 2
     20 
     21         ; Other bits
     22         FONT_BCOMPRESSED        = 2
     23         
     24         ; Maximum number of fonts
     25         .MAX_FONTS              = 6
     26 
     27         .area   _DATA
     28         ; The current font
     29 font_current::
     30         .ds     sfont_handle_sizeof
     31         ; Cached copy of the first free tile
     32 font_first_free_tile:
     33         .ds     1
     34         ; Table containing descriptors for all of the fonts
     35 font_table:
     36         .ds     (sfont_handle_sizeof*.MAX_FONTS)
     37 
     38         .area   _HOME
     39 
     40 ; void vmemcpy (unsigned int dst, const void *src, unsigned int size) __z88dk_callee __preserves_regs(iyh,iyl);
     41 _font_init::
     42         xor a
     43         ld (font_first_free_tile), a
     44 
     45         ld hl, #font_table
     46         ld c, #(sfont_handle_sizeof*.MAX_FONTS)
     47         call .memset_small
     48 
     49         ret
     50 
     51 _font_set::
     52         pop de
     53         pop hl
     54         push hl
     55         push de
     56 
     57 font_set::
     58         ld de, #font_current
     59         ld bc, #sfont_handle_sizeof
     60         ldir
     61         ret
     62 
     63 _font_color::
     64         pop de
     65         ex (sp), hl
     66         push de
     67         ld (__current_1bpp_colors), hl
     68         ret
     69 
     70 font_load_ibm::
     71         ld hl, #_font_ibm
     72         jp font_load
     73 
     74 _font_load::
     75         pop de
     76         pop hl
     77         push hl
     78         push de
     79 
     80         ;; load font in HL to free slor
     81 font_load::
     82         push hl
     83         ; find free slot
     84         ld b, #.MAX_FONTS
     85         ld hl, #(font_table+sfont_handle_font)
     86 1$:
     87         ld a, (hl)
     88         inc hl
     89         or (hl)
     90         jr z, 2$        ; found
     91         inc hl
     92         inc hl
     93         dec b
     94         jr nz, 1$
     95 
     96         ld hl, #0       ; no free slot
     97         ret
     98 2$:
     99         ; fill free slot with passed pointer
    100         pop de
    101         ld (hl), d
    102         dec hl
    103         ld (hl), e
    104         ld a, (font_first_free_tile)
    105         dec hl
    106         ld (hl),a          
    107         
    108         push hl
    109         call font_set
    110 
    111         call load_font_tiles
    112 
    113         ld hl, (font_current+sfont_handle_font)
    114 
    115         inc hl          ; Number of tiles used
    116         ld a, (font_first_free_tile)
    117         add (hl)
    118         ld (font_first_free_tile), a
    119 
    120         pop hl          ; return handle in hl
    121         ret
    122 
    123 load_font_tiles:
    124         ld hl, (font_current+sfont_handle_font)
    125 
    126         inc hl
    127         ld e, (hl)
    128         ld d, #0
    129         
    130         dec hl
    131         ld a, (hl)              ; a = flags
    132         push af
    133         and #3
    134 
    135         ld bc, #128
    136         cp #FONT_128ENCODING    ; 0 for 256 char encoding table, 1 for 128 char
    137         jr z, 1$
    138 
    139         ld bc, #0
    140         cp #FONT_NOENCODING
    141         jr z, 1$
    142 
    143         ld bc, #256             ; Must be 256 element encoding
    144 1$:
    145         inc hl
    146         inc hl                  ; Points to the start of the encoding table
    147         add hl, bc           
    148 
    149         ld a,(font_current+sfont_handle_first_tile)
    150         ld c, a
    151         ld b, #0
    152 
    153         pop af                  ; Recover flags
    154         bit FONT_BCOMPRESSED, a ; Is this font compressed?
    155         jp z, 2$
    156 
    157         push hl
    158         ld hl, (__current_1bpp_colors)
    159         ex (sp), hl
    160         push hl
    161         push de
    162         push bc
    163         call _set_tile_1bpp_data
    164         ret 
    165 2$:
    166         push hl
    167         push de
    168         push bc 
    169         call _set_native_tile_data
    170         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.