205 lines
2.9 KiB
NASM
205 lines
2.9 KiB
NASM
INCLUDE "hardware.inc"
|
|
INCLUDE "utils.inc"
|
|
|
|
SPRITE_ANIM_DELAY EQU 12
|
|
|
|
Section "Edit memory", HRAM
|
|
SelectX: ds 1
|
|
SelectY: ds 1
|
|
SpriteAnimation: ds 1
|
|
SpriteDelay: ds 1
|
|
|
|
EXPORT InitEdit
|
|
SECTION "Init edit", ROM0
|
|
InitEdit:
|
|
ld a, 20
|
|
ldh [SelectX], a
|
|
ld a, 18
|
|
ldh [SelectY], a
|
|
ret
|
|
|
|
EXPORT EditOldBuffer
|
|
SECTION "Edit old buffer", ROM0
|
|
EditOldBuffer:
|
|
; check start has been pressed
|
|
ldh a, [JoypadDown]
|
|
and a, JOYPAD_START
|
|
ret z
|
|
|
|
; wait v-blank
|
|
halt
|
|
|
|
; show sprites
|
|
ldh a, [rLCDC]
|
|
or a, LCDCF_OBJON
|
|
ldh [rLCDC], a
|
|
|
|
; init sprite animation
|
|
xor a
|
|
ldh [SpriteAnimation], a
|
|
ld a, SPRITE_ANIM_DELAY
|
|
ldh [SpriteDelay], a
|
|
|
|
.loop
|
|
; clear interrupts
|
|
xor a
|
|
ldh [rIF], a
|
|
|
|
; compute cursor X position
|
|
ldh a, [SelectX]
|
|
sla a
|
|
sla a
|
|
add a, 8
|
|
ld b, a
|
|
|
|
; compute cursor Y position
|
|
ldh a, [SelectY]
|
|
sla a
|
|
sla a
|
|
add a, 16
|
|
ld c, a
|
|
|
|
; update and load sprite animation
|
|
ldh a, [SpriteDelay]
|
|
dec a
|
|
ldh [SpriteDelay], a
|
|
jr nz, .same
|
|
ldh a, [SpriteAnimation]
|
|
inc a
|
|
and a, 3
|
|
ldh [SpriteAnimation], a
|
|
ld a, SPRITE_ANIM_DELAY
|
|
ldh [SpriteDelay], a
|
|
.same
|
|
ldh a, [SpriteAnimation]
|
|
ld d, a
|
|
|
|
; update sprite in OAM
|
|
SetSprite 0, b, c, d, 0
|
|
|
|
call UpdateJoypad
|
|
|
|
; check A button has been pressed
|
|
ldh a, [JoypadDown]
|
|
and a, JOYPAD_A
|
|
call nz, ToggleCell
|
|
|
|
; check start has been pressed
|
|
ldh a, [JoypadDown]
|
|
and a, JOYPAD_START
|
|
jr nz, .exit
|
|
|
|
; check left direction
|
|
ldh a, [JoypadDown]
|
|
and a, JOYPAD_LEFT
|
|
jr z, .endLeft
|
|
ldh a, [SelectX]
|
|
and a
|
|
jr z, .endLeft
|
|
dec a
|
|
ldh [SelectX], a
|
|
.endLeft
|
|
|
|
; check up direction
|
|
ldh a, [JoypadDown]
|
|
and a, JOYPAD_UP
|
|
jr z, .endUp
|
|
ldh a, [SelectY]
|
|
and a
|
|
jr z, .endUp
|
|
dec a
|
|
ldh [SelectY], a
|
|
.endUp
|
|
|
|
; check right direction
|
|
ldh a, [JoypadDown]
|
|
and a, JOYPAD_RIGHT
|
|
jr z, .endRight
|
|
ldh a, [SelectX]
|
|
cp a, 39
|
|
jr nc, .endRight
|
|
inc a
|
|
ldh [SelectX], a
|
|
.endRight
|
|
|
|
; check down direction
|
|
ldh a, [JoypadDown]
|
|
and a, JOYPAD_DOWN
|
|
jr z, .endDown
|
|
ldh a, [SelectY]
|
|
cp a, 35
|
|
jr nc, .endDown
|
|
inc a
|
|
ldh [SelectY], a
|
|
.endDown
|
|
|
|
; wait v-blank
|
|
halt
|
|
|
|
jp .loop
|
|
|
|
.exit
|
|
|
|
; hide sprites
|
|
ldh a, [rLCDC]
|
|
and a, ~LCDCF_OBJON
|
|
ldh [rLCDC], a
|
|
|
|
ret
|
|
|
|
Section "Value to flag", ROM0, ALIGN[8]
|
|
Flag: db 1, 2, 4, 8
|
|
|
|
; \1: horizontal stride
|
|
ToggleInTargetBuffer: MACRO
|
|
; move pointer to 2x2 cell group
|
|
ldh a, [SelectY]
|
|
sra a
|
|
jr z, .addX\@
|
|
ld c, a
|
|
ld de, \1
|
|
.mul\@
|
|
add hl, de
|
|
dec c
|
|
jr nz, .mul\@
|
|
.addX\@
|
|
xor a
|
|
ld d, a
|
|
ldh a, [SelectX]
|
|
sra a
|
|
ld e, a
|
|
add hl, de
|
|
|
|
; compute cell number in 2x2 cell group
|
|
ldh a, [SelectX]
|
|
and a, 1
|
|
ld b, a
|
|
ldh a, [SelectY]
|
|
and a, 1
|
|
sla a
|
|
or a, b
|
|
|
|
; transform cell number to bit offset in 2x2 cell
|
|
ld d, HIGH(Flag)
|
|
ld e, a
|
|
ld a, [de]
|
|
ld b, a
|
|
|
|
ld a, [hl]
|
|
xor a, b
|
|
ld [hl], a
|
|
ENDM
|
|
|
|
ToggleCell:
|
|
ldh a, [Video]
|
|
ld l, a
|
|
ldh a, [Video + 1]
|
|
xor a, %100 ; change to displayed video buffer
|
|
ld h, a
|
|
ToggleInTargetBuffer 32
|
|
ldh a, [Progress]
|
|
ld l, a
|
|
ldh a, [Old]
|
|
ld h, a
|
|
ToggleInTargetBuffer 20
|
|
ret |