The code works by executing a series of NOPs, and then a jump (which is encoded as a C3, followed by the two-byte destination address - most-significant byte first).
In this manner, the Z80 will begin executing, then jump to $001e, which is another jump instruction, this time back to $0000, at which point we'll go around the loop again,
infinitely.
You then watch your logic analyser, in particular the address lines. You should see it fetching instructions from memory locations incrementally until it strikes the jump
instruction, at which point it'll change its programme counter (and where it'll fetch its next instruction), and then immediate jump back. The code, in memory, looks something
like this:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f $0000 00 00 00 00 c3 1e 00 00 00 00 00 00 00 00 00 00 $0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c3 00 $0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Your stream of bytes from the logic analyser should look something like this, where 'Address' is the value on the address bus, and 'Data' is the value on the data bus,
ignoring the random things in-between processor cycles (like the DRAM refresh and the junk on the bus while the Z80 is executing the instruction). I've also included
the decoded instruction next to it for clarity:
Address: Data: (Instruction) $0000 00 NOP $0001 00 NOP $0002 00 NOP $0003 00 NOP $0004 C3 $0005 1E $0006 00 JMP $001e $001e C3 $001f 00 $0020 00 JMP $0000 $0000 00 NOP $0001 00 NOP $0002 00 NOP $0003 00 NOP $0004 C3 $0005 1E $0006 00 JMP $001e $001e C3 $001f 00 $0020 00 JMP $0000Wash, rinse and repeat.