diff --git a/alarm64.asm b/alarm64.asm
index 266b771..9d48258 100644
--- a/alarm64.asm
+++ b/alarm64.asm
@@ -27,6 +27,16 @@ STD_OUTPUT_HANDLE   EQU -11
 MaxSize             EQU 64
 VK_ESCAPE           EQU 1Bh                 ; Escape key code for GetAsyncKeyState
 
+; WriteFile macro for static buffers.
+mWriteFile  MACRO   buffer:REQ
+    mov     rcx, [stdout]                   ; Arg 1 = hFile (value)
+    lea     rdx, buffer                     ; Arg 2 = lpBuffer (pointer)
+    mov     r8, SIZEOF buffer               ; Arg 3 = nNumberOfBytesToWrite (value)
+    lea     r9, nbwr                        ; Arg 4 = lpNumberOfBytesWritten (pointer)
+    mov     QWORD PTR [rsp+32], 0           ; Arg 5 = lpOverlapped (NULL pointer on stack)
+    call    WriteFile
+ENDM
+
 ; SYSTEMTIME structure populated by GetLocalTime.
 SYSTEMTIME STRUCT
     wYear           WORD ?
@@ -78,29 +88,13 @@ Start   PROC    USES rbx rsi rdi r12
         call    GetStdHandle
         mov     [stdout], rax               ; Store handle for use with WriteFile
 
-        ; Display header.
-        mov     rcx, [stdout]               ; Arg 1 = hFile (value)
-        lea     rdx, header                 ; Arg 2 = lpBuffer (pointer)
-        mov     r8, SIZEOF header           ; Arg 3 = nNumberOfBytesToWrite (value)
-        lea     r9, nbwr                    ; Arg 4 = lpNumberOfBytesWritten (pointer)
-        mov     QWORD PTR [rsp+32], 0       ; Arg 5 = lpOverlapped (NULL pointer on stack)
-        call    WriteFile
-
-        mov     rcx, [stdout]
-        lea     rdx, separator
-        mov     r8, SIZEOF separator
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
+        ; Write header and separator.
+        mWriteFile  header
+        mWriteFile  separator
 
-        ; Prompt and read input.
+        ; Write prompt and read input.
 time_prompt:
-        mov     rcx, [stdout]
-        lea     rdx, prompt
-        mov     r8, SIZEOF prompt
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
+        mWriteFile  prompt
 
         mov     rcx, [stdin]                ; Arg 1 = hFile (value)
         lea     rdx, buffer                 ; Arg 2 = lpBuffer (pointer)
@@ -211,12 +205,7 @@ consume_separator:
         jmp     minute_first_digit
 
 time_invalid:
-        mov     rcx, [stdout]
-        lea     rdx, error
-        mov     r8d, SIZEOF error
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
+        mWriteFile  error
         jmp     time_prompt
 time_valid:
 
@@ -236,20 +225,9 @@ str_to_int_loop:
         jnz     str_to_int_loop
         mov     [alarm_time], eax           ; Store alarm time in 'alarm_time'
 
-        ; Alarm is set; print set time.
-        mov     rcx, [stdout]
-        lea     rdx, quit
-        mov     r8, SIZEOF quit
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
-
-        mov     rcx, [stdout]
-        lea     rdx, lbl_alarm
-        mov     r8, SIZEOF lbl_alarm
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
+        ; Alarm is set; write quit message and set time.
+        mWriteFile  quit
+        mWriteFile  lbl_alarm
 
         mov     r10d, [nbrd]                ; R10D = number of bytes written to buffer
         mov     eax, [num_wspace]           ; EAX = number of white spaces to skip in the buffer
@@ -314,21 +292,10 @@ compare_loop:
         mov     [rdi], dl
         inc     r12d
 
-        ; Print local time label and local time string.
+        ; Write local time label and local time string.
         ; 'lbl_local' begins with CR to overwrite the current line on each update.
-        mov     rcx, [stdout]
-        lea     rdx, lbl_local
-        mov     r8, SIZEOF lbl_local
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
-
-        mov     rcx, [stdout]
-        lea     rdx, str_local
-        mov     r8d, r12d
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
+        mWriteFile  lbl_local
+        mWriteFile  str_local
 
         ; Compare current time to alarm set time.
         movzx   eax, SysTime.wHour
@@ -344,13 +311,7 @@ compare_loop:
 
         ; Sound the alarm!
 alarm:
-        mov     rcx, [stdout]
-        lea     rdx, dblsp
-        mov     r8, SIZEOF dblsp
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
-
+        mWriteFile  dblsp                   ; Write double space
         mov     ebx, 400                    ; EBX = number of alarm cycles (400 = 10 minutes)
 beep_loop:
         mov     ecx, VK_ESCAPE
@@ -362,21 +323,12 @@ beep_loop:
         mov     edx, 1000                   ; dwDuration (ms)
         call    Beep
 
-        mov     rcx, [stdout]
-        lea     rdx, blank
-        mov     r8, SIZEOF blank
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile                   ; Write blank message
+        mWriteFile  blank                   ; Write blank message
 
         mov     ecx, 500                    ; Sleep 500 ms
         call    Sleep
-        mov     rcx, [stdout]
-        lea     rdx, wake
-        mov     r8, SIZEOF wake
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile                   ; Write 'Alarm!' message
+
+        mWriteFile  wake                    ; Write 'Alarm!' message
 
         dec     ebx                         ; Decrement cycles
         test    ebx, ebx
@@ -384,20 +336,10 @@ beep_loop:
         jmp     beep_loop
 
 exit_esc:
-        mov     rcx, [stdout]
-        lea     rdx, esc_done
-        mov     r8, SIZEOF esc_done
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
+        mWriteFile  esc_done                ; Write ESC alarm termination message
         jmp     exit
 exit_done:
-        mov     rcx, [stdout]
-        lea     rdx, done
-        mov     r8, SIZEOF done
-        lea     r9, nbwr
-        mov     QWORD PTR [rsp+32], 0
-        call    WriteFile
+        mWriteFile  done                    ; Write alarm completed message
 exit:
         xor     ecx, ecx                    ; uExitCode
         call    ExitProcess