Before creating your disk protection system, we should be aware of the difference between debug's "T" and "P". "T" is the trace instruction, which tells it to follow instructions step by step. That also means that in LOOP or REP instruction, the trace will patiently go through the loop until finished. Also, during CALL instructions, trace will go into the call and execute the instructions pointed to by the call instruction. The "P" command is similar to the "T" but with the difference in that it traces over instructions. That means that if it use a LOOP or REP, it will quickly finish up the loop and point to the next instruction. With a CALL, the "P" (proceed) will not go into the subroutine. Instead, it will just execute the procedure, then point to the next instruction.
But where should you place your protection within an executable? Run your careful note of when things happen. You should notice (if you have used) an intro screen, then the music pops up, then the menu comes out. Decide with extreme caution where to put your protection. Use the most peculiar part of your application to do this.
Notice this so you will know where you are in your program using the unassembler. Once you have done that, you can begin debugging your program. When you are just about to execute the step, try to remember the segment and offset of the instruction. The segment is the number to the left of the colon while the offset is the number to the right. There are basically two different methods to engage your protection system:
It is not tough to accomplish this using even Debug. For example type in "RIP {enter}". Then type in the address of the next instruction. Then execute the do or die instruction, "G". If you fail, you could try using the "T" command once and start using "P" again.
Is it safe? No. You could easily fool it around with this carry. INT 13h copy protections are usually simple enough for you to just change the carry flag to allow the program to bypass the copy protection.