; Macros to delay a specific number of instruction cycles. ; Specify the number of cycles and scratch registers to use. ; Larger cycle counts require more scratch registers. delay macro cycles if (cycles > 0) nop delay (cycles) / 2 delay (cycles - 1) / 2 endif endm delay macro cycles, x0 if (cycles < 4) delay cycles else $x0_loops == ((cycles - 2) / 2) delay cycles - (2 + 2 * $x0_loops) mov A, @$x0_loops mov x0, A $delay_loop: djz x0 jmp $delay_loop endif endm delay macro cycles, x0, x1 if (cycles <= 2 + 2 * 0xFF) delay cycles, x0 else $x1_loops == (cycles - 8) / 0x202 + 1 ; round up $x0_cycles == cycles - 4 - 2 - 0x202 * ($x1_loops - 1) if ($x0_cycles >= 0x200) $x0_loops == 0x100 $x0 == 0 else $x0_loops == $x0_cycles / 2 $x0 == $x0_loops endif ; residual delay cycles - 4 - 2 * $x0_loops - 2 - 0x202 * ($x1_loops - 1) mov A, @$x1_loops mov x1, A mov A, @$x0 mov x0, A $delay_loop: djz x0 jmp $delay_loop djz x1 jmp $delay_loop endif endm delay macro cycles, x0, x1, x2 if (cycles <= 4 + 0x202 * 0xFF) delay cycles, x0, x1 else $x2_loops == (cycles - 12) / (0x20202) + 1 ; round up $x1_cycles == cycles - 6 - 2 - 0x20202 * ($x2_loops - 1) if (($x1_cycles - 4) >= 0x202 * 0xFF) $x1_loops == 0x100 $x1 == 0 else $x1_loops == ($x1_cycles - 4) / 0x202 + 1 ; round up $x1 == $x1_loops endif $x0_cycles == $x1_cycles - 2 - ($x1_loops - 1) * 0x202 if ($x0_cycles >= 0x200) $x0_loops == 0x100 $x0 == 0 else $x0_loops == $x0_cycles / 2 $x0 == $x0_loops endif ; residual delay cycles - 6 - 2 * $x0_loops - 2 - 0x202 * ($x1_loops - 1) - 2 - 0x20202 * ($x2_loops - 1) mov A, @$x2_loops mov x2, A mov A, @$x1 mov x1, A mov A, @$x0 mov x0, A $delay_loop: djz x0 jmp $delay_loop djz x1 jmp $delay_loop djz x2 jmp $delay_loop endif endm