memcpy: ; src = DE, dest = HL, n = BC memcpy.loop: LD A, (DE) LD (HL+), A INC DE DEC BC XOR A CP B JR NZ =memcpy.loop CP C JR NZ =memcpy.loop RET bzero: ; dest = HL, n = BC LD A, $00 bzero.loop: LD (HL+), A INC DE DEC BC CP B JR NZ =bzero.loop CP C JR NZ =bzero.loop RET .MACRODEF ABS BIT 7, A JR Z, =$end XOR $ff INC A $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 LD BC, =$end PUSH BC PUSH DE RET $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_str: ; Memory Tilemap position in HL, Text address in BC, FF ended PUSH AF PUSH BC Print_str.loop: LD A, (BC) CP $ff JR Z, =Print_str.end LD (HL+), A INC BC JR =Print_str.loop Print_str.end: POP BC POP AF RET MUL: ; B x C => EA XOR A LD E, $00 BIT 7, B JR Z, =MUL.bit7 ADD C MUL.bit7: SLA A RL E BIT 6, B JR Z, =MUL.bit6 ADD C MUL.bit6: SLA A RL E BIT 5, B JR Z, =MUL.bit5 ADD C MUL.bit5: SLA A RL E BIT 4, B JR Z, =MUL.bit4 ADD C MUL.bit4: SLA A RL E BIT 3, B JR Z, =MUL.bit3 ADD C MUL.bit3: SLA A RL E BIT 2, B JR Z, =MUL.bit2 ADD C MUL.bit2: SLA A RL E BIT 1, B JR Z, =MUL.bit1 ADD C MUL.bit1: SLA A RL E BIT 0, B JR Z, =MUL.bit0 ADD C MUL.bit0: RET VBlank_Wait: PUSH AF LD A, $reg_lcd_controller BIT 7, A JR Z, =VBlank_Wait.End VBlank_Wait.loop: LD A, $reg_lcd_status AND $03 CP $01 JR NZ, =VBlank_Wait.loop VBlank_Wait.End: POP AF RET