Initialize_Bunny: LD A, $05 LD $mem_bunny_x, A LD A, $04 LD $mem_bunny_y, A LD A, $08 LD $reg_viewport_x, A LD A, $08 LD $reg_viewport_y, A LD A, $50 LD $mem_bunny_x_px, A LD A, $40 LD $mem_bunny_y_px, A RET Move_Bunny: LD C, $00 ; (bit 0 = has_scrolled) LD A, $mem_moving_sprite_direction CP $00 JR NZ, =Move_Bunny.check_direction LD A, $mem_button_direction LD $mem_moving_sprite_direction, A CP $00 JP Z, =Move_Bunny.end Move_Bunny.check_direction: LD $mem_sprite_direction, A DEC A LD B, $01 BIT 0, A JR NZ, =Move_Bunny.check_direction_end LD B, $FF Move_Bunny.check_direction_end: BIT 1, A JR NZ, =Move_Bunny.vertical_px_move Move_Bunny.horizontal_px_move: LD A, $mem_bunny_x_px ADD B CP $30 JR C, =Move_Bunny.horizontal_px_move.scrolling_fallback CP $71 JR NC, =Move_Bunny.horizontal_px_move.scrolling_fallback LD $mem_bunny_x_px, A JP =Move_Bunny.check_end_of_movement Move_Bunny.horizontal_px_move.scrolling_fallback: SET 0, C LD A, $reg_viewport_x ADD B LD $reg_viewport_x, A JP =Move_Bunny.check_end_of_movement Move_Bunny.vertical_px_move: LD A, $mem_bunny_y_px ADD B CP $30 JR C, =Move_Bunny.vertical_px_move.scrolling_fallback CP $71 JR NC, =Move_Bunny.vertical_px_move.scrolling_fallback LD $mem_bunny_y_px, A JP =Move_Bunny.check_end_of_movement Move_Bunny.vertical_px_move.scrolling_fallback: SET 0, C LD A, $reg_viewport_y ADD B LD $reg_viewport_y, A JP =Move_Bunny.check_end_of_movement Move_Bunny.check_end_of_movement: LD A, $mem_moving_animation_step INC A AND $0f LD $mem_moving_animation_step, A JR NZ, =Move_Bunny.end LD $mem_moving_sprite_direction, A LD A, $mem_sprite_direction DEC A BIT 1, A JR NZ, =Move_Bunny.vertical_tile_move Move_Bunny.horizontal_tile_move: BIT 0, C JR Z, =Move_Bunny.horizontal_tile_move.move_viewport_end LD A, $mem_viewport_x ADD B LD $mem_viewport_x, A Move_Bunny.horizontal_tile_move.move_viewport_end: LD A, $mem_bunny_x ADD B LD $mem_bunny_x, A JP =Move_Bunny.end Move_Bunny.vertical_tile_move: BIT 0, C JR Z, =Move_Bunny.vertical_tile_move.move_viewport_end LD A, $mem_viewport_y ADD B LD $mem_viewport_y, A Move_Bunny.vertical_tile_move.move_viewport_end: LD A, $mem_bunny_y ADD B LD $mem_bunny_y, A Move_Bunny.end: RET Display_Bunny: ; X position in $81, Y position in $80 LD A, $mem_viewport_x LD HL, $9840 CALL =Print_8bit LD A, $mem_viewport_y LD HL, $9860 CALL =Print_8bit LD A, $mem_bunny_x_px LD B, A LD A, $mem_bunny_y_px LD C, A LD A, $mem_moving_animation_step SUB $08 BIT 7, A JR Z, =Display_Bunny.Hop_ABS1_end ; Adding hop animation to Y XOR $ff INC A Display_Bunny.Hop_ABS1_end: SUB $04 BIT 7, A JR Z, =Display_Bunny.Hop_ABS2_end XOR $ff INC A Display_Bunny.Hop_ABS2_end: ADD C LD C, A LD A, $mem_sprite_direction CP $enum_direction_left JR Z, =Display_Bunny.Left_Direction_sprite CP $enum_direction_right JR Z, =Display_Bunny.Right_Direction_sprite CP $enum_direction_up JR Z, =Display_Bunny.Up_Direction_sprite JP =Display_Bunny.Down_Direction_sprite Display_Bunny.Left_Direction_sprite: LD E, $01 LD D, $00 JP =Display_Bunny.Write_OBJ Display_Bunny.Right_Direction_sprite: LD E, $03 LD D, $20 JP =Display_Bunny.Write_OBJ Display_Bunny.Up_Direction_sprite: LD E, $05 LD D, $00 JP =Display_Bunny.Write_OBJ Display_Bunny.Down_Direction_sprite: LD E, $09 LD D, $00 JP =Display_Bunny.Write_OBJ Display_Bunny.Write_OBJ: ; First OBJ (left) LD HL, $FE00 LD A, C LD (HL+), A LD A, B LD (HL+), A LD A, E INC A LD (HL+), A LD A, D LD (HL+), A ; Second OBJ LD A, B ADD $08 LD B, A LD A, C LD (HL+), A LD A, B LD (HL+), A LD A, E XOR $02 INC A LD (HL+), A LD A, D LD (HL+), A RET