Понесу свой крест.
Не-а, милок. Как проктолог проктологу :
pDWdest^ := ( pDWdest^ and 16#FFFF_0000 ) or ( ( pDWsour^ + 1 ) and 16#0000_FFFF );
Именно pDWdest.
Прежде чем что-то влить по адресу pDWdest^, а там ведь своё - только первое слово, ведь :
pDWdest := ADR(W4)) ,
а вливаться по pDWdest^ := будет дабл-слово,
И чтоб не запороть там чужие данные ( (pDWdest+2)^ ), надоть оттуды их выковырнуть (старшее слово) :
( pDWdest^ and 16#FFFF_0000 )....
А опосля, впихнуть его без изменений во вновь образуемое дабл-слово, похерив возможное переполнение первого слова в :
pDWsour^ + 1
т.е. :
.... or ( ( pDWsour^ + 1 ) and 16#0000_FFFF );
(Ессно, or можно поменять на +, характер образуемых здесь битовых полей никогда не приведет к переполнению)
PS
Пока незачот.
Остальное посмотрю попозже. Щас спешу.