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/mos6502/nes/metasprites.s

      1     .include    "global.s"
      2 
      3     .title  "Metasprites"
      4     .module Metasprites
      5 
      6     .area	GBDKOVR (PAG, OVR)
      7     ___move_metasprite_PARM_2:: .ds 2
      8     ___move_metasprite_PARM_3:: .ds 2
      9     ___current_metasprite::     .ds 2
     10     ___current_base_tile::      .ds 1
     11     ___current_base_prop::      .ds 1
     12 
     13     .area   _HOME
     14 
     15 .define xPos  "___move_metasprite_PARM_2"
     16 .define yPos  "___move_metasprite_PARM_3"
     17 
     18 ; uint8_t __move_metasprite(uint8_t id, int16_t x, int16_t y)
     19 
     20 ___move_metasprite::
     21     jsr .move_metasprite_prologue
     22 ___move_metasprite_loop:
     23     lda [*___current_metasprite],y      ; dy
     24     bmi ___move_metasprite_dyNeg
     25     clc
     26     adc *yPos
     27     sta *yPos
     28     bcc 1$
     29     inc *yPos+1
     30 1$:
     31 ___move_metasprite_loop_writePosY:
     32     sta _shadow_OAM+OAM_POS_Y,x
     33     lda *yPos+1
     34     bne ___move_metasprite_outsideY
     35     iny
     36     lda [*___current_metasprite],y      ; dx
     37     bmi ___move_metasprite_dxNeg
     38     clc
     39     adc *xPos
     40     sta *xPos
     41     bcc 2$
     42     inc *xPos+1
     43 2$:
     44 ___move_metasprite_loop_writePosX:
     45     sta _shadow_OAM+OAM_POS_X,x
     46     lda *xPos+1
     47     bne ___move_metasprite_outsideX
     48     iny
     49     lda [*___current_metasprite],y      ; tile index
     50     iny
     51     clc
     52     adc *___current_base_tile
     53     sta _shadow_OAM+OAM_TILE_INDEX,x
     54     lda [*___current_metasprite],y      ; props
     55     adc *___current_base_prop
     56     iny
     57     sta _shadow_OAM+OAM_ATTRIBUTES,x
     58     inx
     59     inx
     60     inx
     61     inx
     62     bne ___move_metasprite_loop
     63 ___move_metasprite_end:
     64     jmp .move_metasprite_epilogue
     65 
     66 ___move_metasprite_dxNeg:
     67     clc
     68     adc *xPos
     69     sta *xPos
     70     bcs 1$
     71     dec *xPos+1
     72 1$:
     73     jmp ___move_metasprite_loop_writePosX
     74 
     75 ___move_metasprite_dyNeg:
     76     cmp #0x80
     77     beq ___move_metasprite_end
     78     clc
     79     adc *yPos
     80     sta *yPos
     81     bcs 1$
     82     dec *yPos+1
     83 1$:
     84     jmp ___move_metasprite_loop_writePosY
     85 
     86 ___move_metasprite_outsideY:
     87     iny
     88     lda [*___current_metasprite],y      ; dx
     89     bmi ___move_metasprite_outsideY_dxNeg
     90     clc
     91     adc *xPos
     92     sta *xPos
     93     bcc ___move_metasprite_outsideX
     94     inc *xPos+1
     95 ___move_metasprite_outsideX:
     96     iny
     97     ; Skip tile index / props
     98     iny
     99     iny
    100     lda #0xF0
    101     sta _shadow_OAM+OAM_POS_Y,x
    102     jmp ___move_metasprite_loop
    103 
    104 ___move_metasprite_outsideY_dxNeg:
    105     clc
    106     adc *xPos
    107     sta *xPos
    108     bcs 1$
    109     dec *xPos+1
    110 1$:
    111     jmp ___move_metasprite_outsideX

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