All the advice people have been giving you is good stuff, but I was trying to get you to just take a small step because I realized you are just starting out.
The small step method of solving the problem is to write your own delay loop that includes a scan of the input. When the input comes true, you bail out of the loop and take your action.
delaycounter = 0
loop:
inc delaycounter
if delaycounter = 193
jmp to endloop // standard delay has completed, no button
if input_but = true
set buttflag
jmp to endloop // bail out with memory that a button press was seen
endloop:
if buttflag = true
do whatever you want for this condition
When you are writing your code, start out with a plain language description of where you are going. The fact that you know a high level language helps a lot. The description above is called pseudocode and it allows you to focus on the structure of the problem rather than the syntax of the language you will use. Then once the structure seems right, you look at your language and figure out how to impliment it.
Writing a program is often like creating a shopping list of things to do. List the things that need to be done, throw in the details of the logic structure, and then fill in the code later. When you see that your shopping list has the same thing happening over and over again, it should be encapsuated into a substructure, such as a function, subroutine, or procedure, or whatever the common terminology is of the language you are using. Sometimes you will want to create a subroutine out of something that is not called often, and it it just to get that ugly blob of code out of your main line code to keep the main code clean to read. That's called complexity hiding. The main code should be clean and readable so you can continue to grow it later on.
Interrupts are an abstraction for you right now, and you can solve this using interrupts if you want to learn something new now, but you have the skills already to solve it with straightline code by creating your own delay function.