AFAICT the firmware consists of 4 modules:
PW338.bin
offset size description
------ ----- ---------------------------------------------------------
0 200 0x200 byte header for firmware download (checksum = 0x00)
200 f000 BOOT Generic - 0x100 byte header + code
f200 1000 BOOT Generic - 0x100 byte header + boot code
10200 4b3d0 FILE Ingrasys USHA - 0x100 byte header + code
5b5d0 4f800 MAIN ConnectUPS - 0x100 byte header + code
aadcf end of firmware payload
flash_contents.bin
offset size description
------ ----- ---------------------------------------------------------
0 a0000 FILE Ingrasys USHA - 0x100 byte header + code
a0000 50000 MAIN ConnectUPS - 0x100 byte header + code
f0000 f000 BOOT Generic - 0x100 byte header + code
ff000 1000 BOOT Generic - 0x100 byte header + boot code
fffff end of flash
The firmware payload file (PW338.bin) has a 0x200-byte header which appears to define the destination location and size of each component, but I haven't been able to determine how this is done. This would explain why the modules appear to be out of order. There is a single checksum byte at the end of the header (offset 0x1FF, value 0xB8). This byte is chosen so that the sum of all 0x200 bytes in the header is 0x00.
The BOOT block appears to be in the right place for an Intel x86 processor architecture. An Intel CPU begins executing at FFFF:0.
Offset(h) 00 04 08 0C
000FFFF0 EA000100 FFFFFFFF 30362F32 322F3032 ........06/22/02
If you disassemble the code at this point, it executes a JMP instruction which sends it to the first instruction after the 0x100-byte header of the "BOOT Generic" block (FF00:0100).
C:\>debug
-e 100
1262:0100 EA.ea 00.00 01.01 42.00 A0.ff
-u 100
1262:0100 EA000100FF JMP FF00:0100
This JMP behaviour is consistent with PC BIOS.
If we now extract each of the 4 components from the flash.bin dump, using the size in the payload, we find that the firmware update aborted part way through the final module, "MAIN ConnectUPS", at offset 0xE8000 in the flash. All other modules match up (apart from a mysterious 4-byte parameter). ISTM that you just need to patch the flash by adding the rest of the "MAIN ConnectUPS" module at 0xE8000. I can do this for you if you can't understand what I'm suggesting.
The only query I have is in regard to the meaning of those mysterious 4 bytes in the headers of each of the 4 modules.
For example ...
PW338.bin
Offset(h) 00 04 08 0C
0005B5D0 5A3F0000 00C02603 00000600 00000A00 Z?..............
0005B5E0 08000110 FFFFFFFF 4D41494E 00000000 ........MAIN....
^^^^^^^^
0005B5F0 436F6E6E 65637455 50530000 00000000 ConnectUPS......
flash_contents.bin
Offset(h) 00 04 08 0C
000A0000 5A3F0000 00C02603 00000600 00000A00 Z?..............
000A0010 08000110 2EC48C9E 4D41494E 00000000 ........MAIN....
^^^^^^^^
000A0020 436F6E6E 65637455 50530000 00000000 ConnectUPS......