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.