if (bytes_remaining)
        {
                uint8_t last_word[4] = {0xff, 0xff, 0xff, 0xff};
-               int i = 0;
 
-               while (bytes_remaining > 0)
-               {
-                       last_word[i++] = *(buffer + bytes_written);
-                       bytes_remaining--;
-                       bytes_written++;
-               }
+               /* copy the last remaining bytes into the write buffer */
+               memcpy(last_word, buffer+bytes_written, bytes_remaining);
 
                if (!(address & 0xff))
                        LOG_DEBUG("0x%" PRIx32 "", address);
 
 
        if (bytes_remaining)
        {
-               uint32_t value = 0;
-               for (int i = 0; i < 4; i++)
-               {
-                       if (bytes_remaining)
-                       {
-                               value += (buffer[i] << (8 * i));
-                               bytes_remaining--;
-                       }
-               }
+               uint8_t last_word[4] = {0xff, 0xff, 0xff, 0xff};
 
-               retval = target_write_u32(target, address, value);
+               /* copy the last remaining bytes into the write buffer */
+               memcpy(last_word, buffer+bytes_written, bytes_remaining);
+
+               retval = target_write_buffer(target, address, 4, last_word);
                if (retval != ERROR_OK)
                        return retval;
 
 
        if (bytes_remaining)
        {
                uint8_t last_dword[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-               i = 0;
 
-               while (bytes_remaining > 0)
-               {
-                       last_dword[i++] = *(buffer + bytes_written);
-                       bytes_remaining--;
-                       bytes_written++;
-               }
+               /* copy the last remaining bytes into the write buffer */
+               memcpy(last_dword, buffer+bytes_written, bytes_remaining);
 
                /* command */
                cmd = FLASH_DWPG;
 
        if (bytes_remaining)
        {
                uint8_t last_halfword[2] = {0xff, 0xff};
-               i = 0;
 
-               while (bytes_remaining > 0)
-               {
-                       last_halfword[i++] = *(buffer + bytes_written);
-                       bytes_remaining--;
-                       bytes_written++;
-               }
+               /* copy the last remaining bytes into the write buffer */
+               memcpy(last_halfword, buffer+bytes_written, bytes_remaining);
 
                bank_adr = address & ~0x03;
 
 
        if (bytes_remaining)
        {
                uint8_t last_dword[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
-               i = 0;
 
-               while (bytes_remaining > 0)
-               {
-                       last_dword[i++] = *(buffer + bytes_written);
-                       bytes_remaining--;
-                       bytes_written++;
-               }
+               /* copy the last remaining bytes into the write buffer */
+               memcpy(last_dword, buffer+bytes_written, bytes_remaining);
 
                str9xpec_set_instr(tap, ISC_PROGRAM, TAP_IRPAUSE);