; Baguette is tasty nomnom 🥖(๑ᵔ⤙ᵔ๑) memcpy: ; src = DE, dest = HL, n = BC .loop: LD A, (DE) LD (HL+), A INC DE DEC BC XOR A CP B JR NZ =.loop CP C JR NZ =.loop RET tilemap_memcpy: ; src = DE, dest = HL, n = C .loop: LD A, (DE) LD (HL), A LD A, L INC A AND $1f LD B, A LD A, L AND $e0 OR B LD L, A INC DE DEC C XOR A CP C JR NZ =.loop RET bzero: ; dest = HL, n = BC LD A, $00 .loop: LD (HL+), A INC DE DEC BC CP B JR NZ =.loop CP C JR NZ =.loop RET bff: ; dest = HL, n = BC LD A, $ff .loop: LD (HL+), A INC DE DEC BC CP B JR NZ =.loop CP C JR NZ =.loop RET .MACRODEF ABS BIT 7, A JR Z, =$end XOR $ff INC A $end: .END .MACRODEF CALL_DE LD BC, =$end PUSH BC PUSH DE RET $end: .END .MACRODEF JUMP_TABLE ; Jump table pointer in BC, index in A, also overwrites DE LD E, A LD D, $00 SLA E RL D SLA E RL D LD A, E ADD C LD E, A LD A, D ADC B LD D, A .CALL_DE .END .MACRODEF ADD_MOVING_ANIMATION_OFFSET ; Add current moving animation offset to BC, also overwrites A LD A, $mem_map_loading_flags BIT 3, A JR Z, =$end LD A, $mem_bunny_direction BIT 3, A JR Z, =$end PUSH DE DEC A XOR $01 INC A LD D, A LD A, $mem_bunny_flags BIT 0, A LD A, $mem_moving_animation_step JR Z, =$skip_double SLA A $skip_double: .ADD_A_TO_DIRECTION_BC POP DE $end: .END Print_8bit: ; Number in A, Memory Tilemap position in HL PUSH AF PUSH BC LD C, A SWAP A ; We start by the highest nibble AND $0f OR $80 LD (HL+), A LD A, C AND $0f ; Then the lowest OR $80 LD (HL+), A POP BC POP AF RET Print_8bit_Thin: ; Number in A, Memory Tilemap position in HL PUSH AF PUSH BC LD C, A SWAP A ; We start by the highest nibble AND $0f OR $b0 LD (HL+), A LD A, C AND $0f ; Then the lowest OR $b0 LD (HL+), A POP BC POP AF RET Print_str: ; Memory Tilemap position in HL, Text address in BC, FF ended PUSH AF PUSH BC .loop: LD A, (BC) CP $ff JR Z, =.end LD (HL+), A INC BC JR =.loop .end: POP BC POP AF RET strlen: ; Text address in HL, FF ended. Result in A PUSH HL PUSH BC LD B, $00 .loop: LD A, (HL+) CP $FF JR Z, =.end INC B JR =.loop .end: LD A, B POP BC POP HL RET MUL: ; B x C => EA XOR A LD E, $00 BIT 7, B JR Z, =.bit7 ADD C .bit7: SLA A RL E BIT 6, B JR Z, =.bit6 ADD C .bit6: SLA A RL E BIT 5, B JR Z, =.bit5 ADD C .bit5: SLA A RL E BIT 4, B JR Z, =.bit4 ADD C .bit4: SLA A RL E BIT 3, B JR Z, =.bit3 ADD C .bit3: SLA A RL E BIT 2, B JR Z, =.bit2 ADD C .bit2: SLA A RL E BIT 1, B JR Z, =.bit1 ADD C .bit1: SLA A RL E BIT 0, B JR Z, =.bit0 ADD C .bit0: RET RRx: ; B is the number to rotate, A & 7 is how many bits to rotate it AND $07 CP $04 CALL NC, =.swap CP $00 RET Z RRC B DEC A RET Z RRC B DEC A RET Z RRC B DEC A RET .swap: SWAP B SUB $04 RET VBlank_Wait: PUSH AF LD A, $reg_lcd_controller BIT 7, A JR Z, =.End .loop: LD A, $reg_lcd_status AND $03 CP $01 JR NZ, =.loop .End: POP AF RET .MACRODEF CHANGE_BANK_TO_A LD $reg_rom_bank, A LD $saved_rom_bank, A .END .MACRODEF LOAD_BANK_OF =addr .ASSERT bank(.) $00 LD A, bank(=addr) .CHANGE_BANK_TO_A .END .MACRODEF BANK_CALL =addr .ASSERT bank(.) $00 PUSH AF LD A, bank(=addr) .CHANGE_BANK_TO_A POP AF CALL ptr(=addr) .END .MACRODEF COPY_4BYTES dest src LD A, ($src) LD ($dest), A LD A, ($src+1) LD ($dest+1), A LD A, ($src+2) LD ($dest+2), A LD A, ($src+3) LD ($dest+3), A .END .MACRODEF COPY_2BYTES dest src LD A, ($src) LD ($dest), A LD A, ($src+1) LD ($dest+1), A .END