View difference between Paste ID: JFtUd6mi and zGTVyvpJ
SHOW: | | - or go back to the newest paste.
1
@include
2
;===============================================================================
3
; LazyHDMA by ExoticMatter
4
;
5-
; This libraryis a simple way to manage multiple HDMA effects without having
5+
; This library is a simple way to manage multiple HDMA effects without having
6
; to copy/paste a lot of code.
7
;
8
; To use LazyHDMA, incsrc lazyhdma.asm once from uberASM or levelASM. Then, use
9
; code such as the following:
10
;
11
; level105init:
12
;     %LazyInitEffect(MyGradient)
13
;     RTS
14
;
15
; MyGradient:
16
;     %LazyBGDouble(3, .RedGreen)
17
;     %LazyBGSingle(4, .Blue)
18
;     %LazyEnd()
19
;
20
; .RedGreen and .Blue are HDMA tables. Using sublabels is not required.
21
; To use a table that is in a different bank, use the _Long suffix. Otherwise,
22
; the table must be in the same bank as the descriptor.
23
;
24
; Make sure to apply IceMan's HDMA patch to prevent common HDMA problems
25
; including disappearing HDMA, flickering, and gradients that briefly appear
26
; when going through a pipe or door.
27
; http://www.smwcentral.net/?p=section&a=details&id=4176
28
;===============================================================================
29
; Main macros:
30
;
31
; %LazyInitEffect[_Tail](effect) - Initializes an HDMA effect.
32
;	This macro will set A, X, and Y to 8-bit and overwrite scratch RAM.
33
;	The _Tail suffix causes the subroutine to not return. This can only be
34
;	used where RTS can be used. (Or RTL, if !LongCall is nonzero.)
35
;	%LazyInitEffect only needs to be called once. Initializing an effect
36
;	that contains a scrolling gradient every frame will induce slowdown.
37
;
38
; %LazyRunEffect[_Tail](effect) - Runs an HDMA effect.
39
;	Like %LazyInitEffect, this macro sets A, X, and Y to 8-bit and overwrite
40
;	scratch RAM.
41
;	Only scrolling gradients need to be run every frame.
42
;	LazyHDMA does not update parallax effects at this point in time.
43
;===============================================================================
44
; Definition macros:
45
;
46
; %LazyBaseBG(color) - Defines the background color in BGR15 format.
47
;	Use rgb(r, g, b) to create a BGR15 color:
48
;	%LazyBaseBG(rgb(31,31,31))
49
;
50
; %LazyHDMA[_Long](channel, parameters, register, address) - Defines an HDMA
51
; 	channel with the specified properties.
52
;	<register> must be between $2100-$21FF, although $00-$FF are also
53
;	allowed.
54
;
55
; %LazyBGSingle[_Long](channel, address) - Defines a background HDMA channel
56
;	that writes once per scanline, i.e. transfer mode 0.
57
;
58
; %LazyBGDouble[_Long](channel, address) - Defines a background HDMA channel
59
;	that writes twice per scanline, i.e. transfer mode 2.
60
;
61
; %LazyCGRAM[_Long](channel, address) - Defines a palette HDMA channel that
62
;	writes to two registers twice per scanline, i.e. transfer mode 3.
63
;
64
; %LazyBrightness[_Long](channel, address) - Defines a brightness HDMA channel
65
;	that writes to one register once per scanline, i.e. transfer mode 0.
66
;
67
; %LazyScroll[_Long](channelAB, channelC, address) - Defines a scrolling
68
;	background HDMA gradient that is decompressed into memory.
69
;	For the scrolling to occur, you must call %Lazy
70
;
71
; %LazyEnd() - Marks the end of the effect.
72
;===============================================================================
73
; Configuration:
74
;
75
; !LongCall: If set to a nonzero value, LazyHDMA will use JSL/JSR, allowing
76
; LazyHDMA to be called from a different bank. Off by default.
77
;
78
; !IncludeScrollingGradientCode: If set to a nonzero value, the scrolling
79
; gradient routines will be included. Off by default.
80
;
81
; !ScrollingFreeRAM_(AB|C): The location to put decompressed scrolling gradient
82
; tables. By default, $7F:B260 and $7F:B830 are used, respectively.
83
;
84
; To configure LazyHDMA, set one or more of these defines before incsrc.
85
;===============================================================================
86
!LongCall ?= 0
87
!IncludeScrollingGradientCode ?= 0
88
89
!ScrollingFreeRAM_AB ?= $7FB260
90
!ScrollingFreeRAM_C ?= $7FB830
91
92
if !LongCall
93
	!LazyHDMA_Call = JSL : !LazyHDMA_CallS = "JSL "
94
	!LazyHDMA_Tail = JML : !LazyHDMA_TailS = "JML "
95
	!LazyHDMA_Return = RTL : !LazyHDMA_ReturnS = "RTL "
96
else
97
	!LazyHDMA_Call = JSR.w : !LazyHDMA_CallS = "JSR.w "
98
	!LazyHDMA_Tail = JMP.w : !LazyHDMA_TailS = "JMP.w "
99
	!LazyHDMA_Return = RTS : !LazyHDMA_ReturnS = "RTS "
100
endif
101
102
macro _LazyHDMA_LoadLong(effect)
103
	SEP #$30
104
	LDA.b #<effect>
105
	LDY.b #<effect>>>8
106
	LDX.b #<effect>>>16
107
endmacro
108
109
_LazyHDMA:
110
111
macro LazyInitEffect(effect)
112
	%_LazyHDMA_LoadLong(<effect>)
113-
	!LazyHDMA_Call .InitializeEffect
113+
	!LazyHDMA_Call _LazyHDMA_InitializeEffect
114
endmacro
115
116
macro LazyInitEffect_Tail(effect)
117
	%_LazyHDMA_LoadLong(<effect>)
118-
	!LazyHDMA_Tail .InitializeEffect
118+
	!LazyHDMA_Tail _LazyHDMA_InitializeEffect
119
endmacro
120
121
if !IncludeScrollingGradientCode
122
	macro LazyRunEffect(effect)
123
		%_LazyHDMA_LoadLong(<effect>)
124-
		!LazyHDMA_Call .RunEffect
124+
		!LazyHDMA_Call _LazyHDMA_RunEffect
125
	endmacro
126
127
	macro LazyRunEffect_Tail(effect)
128
		%_LazyHDMA_LoadLong(<effect>)
129-
		!LazyHDMA_Tail .RunEffect
129+
		!LazyHDMA_Tail _LazyHDMA_RunEffect
130
	endmacro
131
else
132
	macro LazyRunEffect(effect)
133
	endmacro
134
	macro LazyRunEffect_Tail(effect)
135
	endmacro
136
endif
137
138-
!HDMA_ColorData = $2132
138+
; These registers can be written to by HDMA:
139-
!HDMA_Brightness = $2100
139+
140-
!HDMA_CGRAM = $2121
140+
!INIDISP	= $2100 ; Display Control 1
141
!OBSEL		= $2101 ; Object Size and Object Base
142
!OAMADDL	= $2102 ; OAM Address (lower 8bit)
143
!OAMADDH	= $2103 ; OAM Address (upper 1bit) and Priority Rotation
144
!OAMDATA	= $2104 ; OAM Data Write (write-twice)
145
!BGMODE		= $2105 ; BG Mode and BG Character Size
146
!MOSAIC		= $2106 ; Mosaic Size and Mosaic Enable
147
!BG1SC		= $2107 ; BG1 Screen Base and Screen Size
148
!BG2SC		= $2108 ; BG2 Screen Base and Screen Size
149
!BG3SC		= $2109 ; BG3 Screen Base and Screen Size
150
!BG4SC		= $210A ; BG4 Screen Base and Screen Size
151
!BG12NBA	= $210B ; BG Character Data Area Designation
152
!BG34NBA	= $210C ; BG Character Data Area Designation
153
!BG1HOFS	= $210D ; BG1 Horizontal Scroll (X) (write-twice) / M7HOFS
154
!BG1VOFS	= $210E ; BG1 Vertical Scroll (Y)   (write-twice) / M7VOFS
155
!BG2HOFS	= $210F ; BG2 Horizontal Scroll (X) (write-twice)
156
!BG2VOFS	= $2110 ; BG2 Vertical Scroll (Y)   (write-twice)
157
!BG3HOFS	= $2111 ; BG3 Horizontal Scroll (X) (write-twice)
158
!BG3VOFS	= $2112 ; BG3 Vertical Scroll (Y)   (write-twice)
159
!BG4HOFS	= $2113 ; BG4 Horizontal Scroll (X) (write-twice)
160
!BG4VOFS	= $2114 ; BG4 Vertical Scroll (Y)   (write-twice)
161
!VMAIN		= $2115 ; VRAM Address Increment Mode
162
!VMADDL		= $2116 ; VRAM Address (lower 8bit)
163
!VMADDH		= $2117 ; VRAM Address (upper 8bit)
164
!VMDATAL	= $2118 ; VRAM Data Write (lower 8bit)
165
!VMDATAH	= $2119 ; VRAM Data Write (upper 8bit)
166
!M7SEL		= $211A ; Rotation/Scaling Mode Settings
167
!M7A		= $211B ; Rotation/Scaling Parameter A & Maths 16bit operand
168
!M7B		= $211C ; Rotation/Scaling Parameter B & Maths 8bit operand
169
!M7C		= $211D ; Rotation/Scaling Parameter C         (write-twice)
170
!M7D		= $211E ; Rotation/Scaling Parameter D         (write-twice)
171
!M7X		= $211F ; Rotation/Scaling Center Coordinate X (write-twice)
172
!M7Y		= $2120 ; Rotation/Scaling Center Coordinate Y (write-twice)
173
!CGADD		= $2121 ; Palette CGRAM Address
174
!CGDATA		= $2122 ; Palette CGRAM Data Write             (write-twice)
175
!W12SEL		= $2123 ; Window BG1/BG2 Mask Settings
176
!W34SEL		= $2124 ; Window BG3/BG4 Mask Settings
177
!WOBJSEL	= $2125 ; Window OBJ/MATH Mask Settings
178
!WH0		= $2126 ; Window 1 Left Position (X1)
179
!WH1		= $2127 ; Window 1 Right Position (X2)
180
!WH2		= $2128 ; Window 2 Left Position (X1)
181
!WH3		= $2129 ; Window 2 Right Position (X2)
182
!WBGLOG		= $212A ; Window 1/2 Mask Logic (BG1-BG4)
183
!WOBJLOG	= $212B ; Window 1/2 Mask Logic (OBJ/MATH)
184
!TM		= $212C ; Main Screen Designation
185
!TS		= $212D ; Sub Screen Designation
186
!TMW		= $212E ; Window Area Main Screen Disable
187
!TSW		= $212F ; Window Area Sub Screen Disable
188
!CGWSEL		= $2130 ; Color Math Control Register A
189
!CGADSUB	= $2131 ; Color Math Control Register B
190
!COLDATA	= $2132 ; Color Math Sub Screen Backdrop Color
191
!SETINI		= $2133 ; Display Control 2
192
193
; These can be used as transfer modes:
194
195
!OneRegisterWriteOnce		= 0 ; 1 byte:  p
196
!TwoRegistersWriteOnce		= 1 ; 2 bytes: p, p+1
197
!OneRegisterWriteTwice		= 2 ; 2 bytes: p, p
198
!TwoRegistersWriteTwice		= 3 ; 4 bytes: p, p,   p+1, p+1
199
!FourRegistersWriteOnce		= 4 ; 4 bytes: p, p+1, p+2, p+3
200
!TwoRegistersWriteTwiceAlt	= 5 ; 4 bytes: p, p+1, p,   p+1
201
202
!HDMA_FixedPtr			= 8  ; Use a fixed CPU memory pointer
203
!HDMA_DecrementPtr		= 16 ; CPU memory pointer decreases
204
!HDMA_IndirectHDMA		= 64 ; The table uses pointers instead of data
205
206
!LazyHDMA_CommandMask = $1F
207
!LazyHDMA_ChannelMask = $E0
208
209
macro _LazyHDMA_LoadArgs()
210
	STA $00	; Descriptor pointer, LSB
211
	STY $01	; Descriptor pointer, MSB 
212
	STX $02	; Descriptor pointer, Bank
213
;	STX $03	; Other address bank (initialization only)
214
215
 	;   $04	; HDMA index (channel << 4)
216
	;   $05	; second HDMA index (scrolling gradients only)
217
endmacro
218
219
.InitializeEffect
220
	%_LazyHDMA_LoadArgs()
221
	STX $03
222
223
 -	SEP #$30	; 8-bit A, X, Y
224
	LDA [$00]
225
	AND #!LazyHDMA_CommandMask
226
	BEQ +
227
	ASL
228
	TAX
229
	LDA [$00]
230-
	LDA.w #!HDMA_ColorData<<8
230+
231
	LSR
232
	STA $04
233
234
	REP #$20	; 16-bit A
235
	INC $00
236
	JSR (.Subroutines-2, X)
237
	BRA -
238
239
 +	!LazyHDMA_Return
240
241
!_LazySubroutine = 1
242
!_LazySubroutineSizes = 1
243
244
macro _LazySubroutine(name, size)
245
	assert !_LazySubroutine <= !LazyHDMA_CommandMask
246
	!LazyHDMA_<name> #= !_LazySubroutine
247
	!_LazySubroutine #= !_LazySubroutine+1
248
	!_LazySubroutineSizes += ,<size>
249
	dw .Set<name>
250
endmacro
251
252-
	LDA.w #(!HDMA_ColorData<<8)|2
252+
253
	dw $0000
254
	!_LazySubroutine #= !_LazySubroutine+1
255-
	LDA.w #(!HDMA_CGRAM<<8)|3
255+
256
endmacro
257
258-
	LDA.w #!HDMA_Brightness<<8
258+
259
	%_LazySubroutine(LongPtr, 2)
260
	%_LazySubroutine(BG, 3)
261
	%_LazySubroutine(BGDouble, 3)
262
	%_LazySubroutine(CGRAM, 3)
263
	%_LazySubroutine(Brightness, 3)
264
if !IncludeScrollingGradientCode
265
	%_LazySubroutine(ScrollGradient, 4)
266
else
267
	%_LazySkip(4)
268
endif
269
	%_LazySubroutine(HDMA, 5)
270
	%_LazySubroutine(BGFill, 3)
271
272
if !IncludeScrollingGradientCode
273-
	STX $05		; /
273+
274
endif
275-
	LDA $04		; \
275+
276-
	PHA		; |
276+
277-
	LDX $02		; |
277+
278
.SetLongPtr
279-
	LDA $00		; | Preserve scratch RAM
279+
280
	LDA [$00]	; | \ Set the source bank number
281
	STA $03		; | /
282
	REP #$20	; / 16-bit A
283-
	PHA		; /
283+
284
	RTS
285
286-
	LDX $03 	; \
286+
287
	LDA [$00]
288
	STA $0701
289
	INC $00
290
	INC $00
291-
	STA $02
291+
292
293
.SetBG
294
	LDA.w #!COLDATA<<8
295-
	STA $06
295+
296
	LDX $04
297-
	STA $08
297+
298
	LDA [$00]
299-
	STA $0A
299+
300
	SEP #$20 ; 8-bit A
301-
	STA $0D
301+
302
	STA $4304,X
303
	TXA
304-
	STA $0C
304+
305
	TAX
306
	LDA .Bits,X
307
	TSB $0D9F
308-
	STA $0F
308+
309
	INC $00
310
	INC $00
311-
	STA $00
311+
312
	STX $03	; / to the same bank as the descriptor
313
	RTS
314
315
.SetBGDouble
316
	LDA.w #(!COLDATA<<8)|!OneRegisterWriteTwice
317
	BRA .SimpleCommon
318
.SetCGRAM
319
	LDA.w #(!CGADD<<8)|!TwoRegistersWriteTwice
320
	BRA .SimpleCommon
321
.SetBrightness
322
	LDA.w #!INIDISP<<8
323
	BRA .SimpleCommon
324-
	INC $0A
324+
325-
	INC $0A
325+
326-
	INC $0A
326+
327-
	INC $0D
327+
328-
	INC $0D
328+
329
330-
	DEC $00
330+
331
332
if !IncludeScrollingGradientCode
333-
	LDA $02
333+
334
	LDY #$02	; \
335
	LDA [$00],Y	; | Load the second HDMA channel
336-
	STA $02
336+
337
	STX  $05	; /
338
339
	PEI ($04)	; \
340-
	STA $06
340+
	LDX  $02	; | Preserve scratch RAM
341
	PHX		; |
342-
	STA $08
342+
	PEI ($00)	; /
343
	LDA [$00]	; Load table pointer
344
	PHB		; Preserve data bank
345
	LDX  $03	; \
346
	PHX		; | Set data bank
347
	PLB		; /
348
349
	REP #$30	; 16-bit A, X, Y
350
	STA  $02
351-
	PLX		; |
351+
352-
	STX $02		; | Restore scratch RAM
352+
	STA  $04
353
	INC
354
	STA  $06
355
	INC
356
	STA  $08
357
	LDA.w #!ScrollingFreeRAM_AB
358
	STA  $0A
359
	LDA.w #!ScrollingFreeRAM_C
360-
	LDA.w #(!HDMA_ColorData<<8)|2	; \
360+
	STA  $0D
361
	SEP #$20	; 8-bit A
362-
	LDA.w #!HDMA_ColorData<<8	; |
362+
363
	STA  $0C
364
if !ScrollingFreeRAM_AB>>16 != !ScrollingFreeRAM_C>>16
365
	LDA #!ScrollingFreeRAM_C>>16
366
endif
367
	STA  $0F
368
-	LDA ($02)
369
	BEQ +
370
	STA  $00
371
--	LDA #$01
372
	STA [$0A]
373
	STA [$0D]
374
	LDY #$0001
375
	LDA ($04)
376
	STA [$0A],y
377
	LDA ($08)
378
	STA [$0D],y
379-
	LDA $20		; \ Load the Y-position of BG2
379+
380-
	LDX $1414	; | \ Check how much the gradient should be shifted upward
380+
381
	STA [$0A],y
382
	REP #$20
383
	INC  $0A
384
	INC  $0A
385
	INC  $0A
386
	INC  $0D
387
	INC  $0D
388
	SEP #$20
389
	DEC  $00
390
	BPL --
391
	REP #$20
392
	LDA  $02
393
	CLC
394
	ADC #$0004
395
	STA  $02
396
	INC
397
	STA  $04
398
	INC
399
	STA  $06
400
	INC
401
	STA  $08
402
	SEP #$20
403
	BRA -
404
405
+	PLB		; Restore previous data bank number
406
	SEP #$10	; Restore 8-bit X, Y
407
	REP #$20	; Restore 16-bit A
408
	PLA		; \
409
	INC A		; | \
410
	INC A		; | | Advance the command pointer
411
	INC A		; | /
412
	STA $00		; |
413
	PLX		; | Restore scratch RAM
414
	STX $02		; |
415
	STX $03		; | | Restore the data source bank
416
	PLA		; |
417
	STA $04		; /
418
419
	TAX		; \ Load the HDMA indexes
420
	LDY $05		; /
421
422
	LDA.w #(!COLDATA<<8)|2		; \
423
	STA $4300,X			; | Set HDMA channel types
424
	LDA.w #!COLDATA<<8		; |
425
	STA $4300,Y			; /
426
427
	SEP #$20	; 8-bit A
428
	TXA		; \
429
	LSR #4		; |
430
	TAX		; | Enable gradient A
431
	LDA .Bits,X	; |
432
	TSB $0D9F	; /
433
	TYA		; \
434
	LSR #4		; |
435
	TAX		; | Enable gradient B
436
	LDA .Bits,X	; |
437
	TSB  $0D9F	; /
438
	REP #$20	; 16-bit A
439
440
.ScrollGradient:
441
	LDA  $20	; \ Load the Y-position of BG2
442
	LDX  $1414	; | \ Check how much the gradient should be shifted upward
443
	CPX #$01	; | | \
444
	BEQ .Const	; | | / #$01: Constant
445
	CPX #$02	; | | \
446
	BEQ .Var	; | | / #$02: Variable
447
	CPX #$03	; | | \
448
	BEQ .Slow	; | | / #$03: Slow
449
			; | |
450-
	ADC $00
450+
451-
	STA $00
451+
452
	SBC #$00C0	; | | | shift 192 pixels downward
453
	BRA .Const	; | | / Continue
454
			; | |
455
.Slow			; | | \ Slow scrolling (consider using fixed HDMA)
456
	SEC		; | | |
457
	SBC #$00A8	; | | | shift 168 pixels downward
458
	BRA .Const	; | | /
459
			; | |
460
.Var			; | | \ Variable scrolling
461
	SEC		; | | |
462
	SBC #$0060	; | | / shift 96 pixels downward
463
			; | |
464
.Const			; | / < Constant scrolling (BG2:Camera = 1:1)
465
			; |
466
			; | \ Put an LSR/ASL or two here to change the rate at which
467
			; | / the gradient scrolls.
468
			; |
469
	STA $06		; / and store it to scratch RAM.
470
471
	LDX $04		; \ Load the HDMA indexes
472
	LDY $05		; /
473
474
	LDA $06
475
	ASL		; \
476
	CLC		; | This transforms the Y-pos of BG2
477
	ADC $06		; | into the address at which the HDMA
478
	CLC		; | gradient should start
479
	ADC.w #!ScrollingFreeRAM_AB
480
	STA $4302,X	; HDMA Channel A table starting address.
481
482
	LDA $06		; \
483
	ASL		; | Y-pos of BG2 to
484
	CLC		; | HDMA table offset
485-
	assert <params> >= 0 && <params> < $100, "Invalid HDMA parameters"
485+
486
	STA $4302,Y	; HDMA Channel B table starting address.
487
488
	SEP #$20	; 8-bit A
489
	LDA.b #!ScrollingFreeRAM_AB>>16
490
	STA $4304,X
491
if !ScrollingFreeRAM_AB>>16 != !ScrollingFreeRAM_C>>16
492
	LDA.b #!ScrollingFreeRAM_C>>16
493
endif
494
	STA $4304,Y
495
496
	RTS
497
498
.RunEffect:
499
	%_LazyHDMA_LoadArgs()
500
501
 -	SEP #$30	; 8-bit A, X, Y
502
	LDA [$00]
503
	AND #!LazyHDMA_CommandMask
504
	BEQ +
505
	CMP.b #!LazyHDMA_ScrollGradient
506
	BEQ ++
507
	TAX
508
	LDA .SubroutineSizes,X
509
	CLC
510
	REP #$20	; 16-bit A
511
	AND #$00FF
512
	ADC  $00
513
	STA  $00
514
	BRA -		; Repeat
515
516
 ++	LDA [$00]
517
	AND #!LazyHDMA_ChannelMask
518
	LSR
519
	STA $04
520
521
	LDY #$04	; \
522
	LDA [$00],Y	; | Load the second channel number
523
	STA $05		; /
524
525
	REP #$20	; 16-bit A
526
	INC  $00
527
	JSR .ScrollGradient
528
	REP #$20	; 16-bit A
529
	INC  $00
530
	INC  $00
531
	INC  $00
532
	BRA -
533
534
 +	!LazyHDMA_Return
535
endif
536
537
macro LazyBaseBG(color)
538
	assert <color> >= 0 && <color> < $8000, "Invalid color"
539
	db !LazyHDMA_BGFill
540
	dw <color>
541
endmacro
542
543
function rgb(r, g, b) = r|(g<<5)|(b<<10)
544
545
macro LazyHDMA(channel, params, register, address)
546
	assert <channel> >= 0 && <channel> < 8, "Invalid HDMA channel"
547
	assert <params> >= 0 && <params> < $80, "Invalid HDMA parameters"
548
	if <register> >= $00 && <register> < $100
549
	elseif <register> >= $2100 && <register> < $2200
550
	else
551
		error "Invalid HDMA target register"
552
	endif
553
	db !LazyHDMA_HDMA|(<channel><<5)
554
	db <params>, <register>
555
	dw <address>
556
endmacro
557
558
macro LazyHDMA_Long(channel, params, register, address)
559
	db !LazyHDMA_LongPtr, (<address>>>16)
560
	%LazyHDMA(channel, params, register, address)
561
endmacro
562
563
macro LazySimple(type, channel, address)
564
	assert <type> > 0 && <type> < !LazyHDMA_Invalid, "Invalid channel type"
565
	assert <channel> >= 0 && <channel> < 8, "Invalid HDMA channel"
566
	db <type>|(<channel><<5)
567
	dw <address>
568
endmacro
569
570
macro LazyBGSingle(channel, address)
571
	%LazySimple(!LazyHDMA_BG, <channel>, <address>)
572
endmacro
573
macro LazyBGDouble(channel, address)
574
	%LazySimple(!LazyHDMA_BGDouble, <channel>, <address>)
575
endmacro
576
macro LazyCGRAM(channel, address)
577
	%LazySimple(!LazyHDMA_CGRAM, <channel>, <address>)
578
endmacro
579
macro LazyBrightness(channel, address)
580
	%LazySimple(!LazyHDMA_Brightness, <channel>, <address>)
581
endmacro
582
583
macro LazySimple_Long(type, channel, address)
584
	db !LazyHDMA_LongPtr, (<address>>>16)
585
	%LazySimple(<type>, <channel>, <address>)
586
endmacro
587
588
macro LazyBGSingle_Long(channel, address)
589
	%LazySimple_Long(!LazyHDMA_BG, <channel>, <address>)
590
endmacro
591
macro LazyBGDouble_Long(channel, address)
592
	%LazySimple_Long(!LazyHDMA_BGDouble, <channel>, <address>)
593
endmacro
594
macro LazyCGRAM_Long(channel, address)
595
	%LazySimple_Long(!LazyHDMA_CGRAM, <channel>, <address>)
596
endmacro
597
macro LazyBrightness_Long(channel, address)
598
	%LazySimple_Long(!LazyHDMA_Brightness, <channel>, <address>)
599
endmacro
600
601
if !IncludeScrollingGradientCode
602
	macro LazyScroll(channel, secondchannel, address)
603
		%LazySimple(!LazyHDMA_ScrollGradient, <channel>, <address>)
604
		db <secondchannel><<4
605
	endmacro
606
	macro LazyScroll_Long(channel, secondchannel, address)
607
		%LazySimple_Long(!LazyHDMA_ScrollGradient, <channel>, <address>)
608
		db <secondchannel><<4
609
	endmacro
610
endif
611
612
macro LazyEnd()
613
	db $00
614
endmacro