--- /dev/null
+; tiktok.asm
+; ASM dialect is for crasm/z80, producing Intel HEX.
+; Compile using "crasm -o tiktok.hex tiktok.asm" and transfer
+; to CP/M system for final conversion to COM file using LOAD.COM
+;
+; A sample program that uses a busy-waiting spinloop
+; to produce 1ms delays. 5*200 iterations of calls to
+; the delay loop is made, to provide a 1sec delay per "Tick".
+; 60 iterations of printint "Tick" to the console is done
+; for a full minute of waiting time.
+; Console output is done using CP/M BDOS call 9 (C_WRITRSTR)
+
+CPU Z80
+OUTPUT HEX
+
+; CP/M constants used
+STROUT EQU 9
+BDOS EQU 5
+
+; Start COM file at TPA start (Origin 0x100)
+* = $100
+START LD DE, STARTMSG
+ LD C, STROUT
+ CALL BDOS
+
+ LD A, 60
+LOOP PUSH AF
+
+ LD DE, MESSAGE
+ LD C, STROUT
+ CALL BDOS
+
+ LD B, 5 ; 5 * 200 msec = 1000ms = 1 sec :P
+SEC LD A, 200
+ CALL DELAY
+ DEC B
+ JR NZ, SEC
+
+ POP AF
+ DEC A
+ JR NZ, LOOP
+
+ LD DE, STOPMSG
+ LD C, STROUT
+ CALL BDOS
+
+ RET
+
+; Delay routine, A register contains number of Delay iterations.
+; Does not clobber, but A is reduced to zero on completion
+; Values tried (may be good) for 7.3728MHz: C=13, B=44
+DELAY PUSH BC ; Save B and C registers
+DLY_START LD C, 13 ; Coarse factor
+DLY_LOOPO LD B, 44 ; Fine factor
+DLY_LOOPI DJNZ DLY_LOOPI ; Decrement B until BZero
+ DEC C ; Decrement C ..
+ JR NZ, DLY_LOOPO ; .. until zero
+ DEC A ; Do next main iteration
+ JR NZ, DLY_START ; until given numer is zero
+ POP BC ; Restore B and C registers
+ RET ; Return from delay.
+
+; String constants here, to avoid having them clobber $100H
+; Note CP/M BDOS call 9 format, $ is string terminator.
+STARTMSG ASC "Timertest\r\n$"
+MESSAGE ASC "Tick\r\n$"
+STOPMSG ASC "Done\r\n$"