Okay thanks.
I'll be working strictly with uncompressed ROMs.
There's something strange going on with a couple of Award V4.50 386 BIOSes I downloaded. I cannot open them with modbin as it claims there is a file checksum error.
However, the ROM checksum seems to be correct. Apparently Award BIOSes that have been opened with awdbedit exhibit the same problem. Anyone know what the deal is there?
Is there already a thread about this problem, or should I start a new one?
Have any of you looked at HDD translation/autodetection for the 64k AMI BIOS versions?
I don't know how late the 64k AMI BIOSes were used on a given board. If any of them received an update for larger drive translation or an update to the autodetect function courtesy of AMI and a generous board manufacturer, a byte comparison between an older version to the newer version may help zero-in on the replacement code. From there, you'd have to update any jump addresses for the BIOS you want to update - unless AMI BIOSes followed a standard layout/address structure, I suppose.
I am just spitballing. Not new to hex editors or assembly, but the contents of an AMI BIOS? My knowledge is maybe a couple of days old.
Totally possible that there is a hard cut-off date from moving from 64k uncompressed to LHA'ed 128k (or whatever it is) in order for AMI to even consider updating their drive calculations.
CkRtechwrote on 2025-05-02, 04:16:Have any of you looked at HDD translation/autodetection for the 64k AMI BIOS versions? […] Show full quote
Have any of you looked at HDD translation/autodetection for the 64k AMI BIOS versions?
I don't know how late the 64k AMI BIOSes were used on a given board. If any of them received an update for larger drive translation or an update to the autodetect function courtesy of AMI and a generous board manufacturer, a byte comparison between an older version to the newer version may help zero-in on the replacement code. From there, you'd have to update any jump addresses for the BIOS you want to update - unless AMI BIOSes followed a standard layout/address structure, I suppose.
I am just spitballing. Not new to hex editors or assembly, but the contents of an AMI BIOS? My knowledge is maybe a couple of days old.
Totally possible that there is a hard cut-off date from moving from 64k uncompressed to LHA'ed 128k (or whatever it is) in order for AMI to even consider updating their drive calculations.
Yes, I have thought of this 😁
Here, the 10/16/94 one here does not have LBA, and the 01/09/95 one does: https://theretroweb.com/motherboards/s/efa-4dmu-hl3s#bios
But, everything is shifted around, they didn't just simply patch in the LBA support, unfortunately.
Here, the 10/16/94 one here does not have LBA, and the 01/09/95 one does: https://theretroweb.com/motherboards/s/efa-4dmu-hl3s#bios
But, everything is shifted around, they didn't just simply patch in the LBA support, unfortunately.
Yuck. Looks like they reclaimed some space above the $8000 BIOS copyright info and from the big block of $00 @ $DD42-$DFB1 and used it for some serious rewrite/replace under the BootSector Write/Possible Virus warning.
Okay thanks.
I'll be working strictly with uncompressed ROMs.
There's something strange going on with a couple of Award V4.50 386 BIOSes I downloaded. I cannot open them with modbin as it claims there is a file checksum error.
However, the ROM checksum seems to be correct. Apparently Award BIOSes that have been opened with awdbedit exhibit the same problem. Anyone know what the deal is there?
Is there already a thread about this problem, or should I start a new one?
That should read 'open and saved with awdbedit'. This is an issue I've known about for some time. Best to do all modding with Modbin rather than awdbedit, although awdbedit has that convenient PCI routing table open for editing and the ability to swap the Energy Star logo.
On another front, has anyone had success in adding PS/2 mouse support to old Phoenix BIOSes? I have one from 1994, rev. 4.03c which doesn't work with a KBC-PS/2 mouse mod. It's an ALi 1429 board - EXP4349.
Plan your life wisely, you'll be dead before you know it.
I also think an option to have the script modify the BIOS would be a nice to have. e.g. "do you want this programme to amend your BIOS with this information: Y or N?"
Finally your wish is fulfilled 😁 I got back here due to some AMI 286 BIOS tinkering.
Here's the new Python code for the AMI "color" BIOS checksum calculator script with auto-patching option for 64 kB BIOS-dump file - just as you suggested. It also have some basic checks if given BIOS-dump file exists and if it is exactly 64 kB in size. And don't worry, the script does not messes with the original BIOS-dump file, but creates a copy with corrected checksum bytes (with ".NEW" file extension):
Obsolete code
1#!/usr/bin/env python3 2# amichksumcalc v.2 3# loads ami color bios dump-file, calculates checksum (16-bit sequential) and values needed to validate (if checksum != 0), and patches file if chosen to 4 5import sys 6import os.path 7import shutil 8 9if len(sys.argv) != 2: 10 print(f'Usage: {sys.argv[0]} <64 kB BIOS ROM-dump file>') 11 sys.exit() 12 13bios_file_name = sys.argv[1] 14 15if not os.path.isfile(bios_file_name): 16 print(f'Error: "{bios_file_name}" file does not exist!') 17 sys.exit() 18 19if os.path.getsize(bios_file_name) !=65536: 20 print(f'Error: "{bios_file_name}" file is not 64 kB in size!') 21 sys.exit() 22 23try: 24 with open(bios_file_name, mode='rb') as file: 25 bios_data = file.read() 26 file.seek(65360, 0) 27 first_checksum_byte = file.read(1) 28 second_checksum_byte = file.read(1) 29 print(f'Checksum bytes read from "{bios_file_name}" file at address 0xFF50 (hex, LE): "{first_checksum_byte.hex().upper()} {second_checksum_byte.hex().upper()}".') 30except: 31 print(f'Error while reading "{bios_file_name}" file!') 32 sys.exit() 33 34block_count = int(len(bios_data) / 16) 35checksum = 0 36 37for block in range(0, block_count): 38 bios_block = bios_data[block * 16: block * 16 + 16] 39 block_checksum = 0 40 41 for byte_pair in range(0, 8): 42 byte_pair_hex = (bios_block[byte_pair * 2 + 1: byte_pair * 2 + 2].hex() + bios_block[byte_pair * 2:byte_pair * 2 + 1].hex()) 43 byte_pair_dec = int(byte_pair_hex, 16) 44 block_checksum += byte_pair_dec 45 46 block_checksum %= 65536 47 checksum += block_checksum 48 49checksum %= 65536 50 51if checksum == 0: 52 print(f'Checksum for "{bios_file_name}" file equals zero.') 53 print('No actions needed.') 54else: 55 print(f'Checksum for "{bios_file_name}" file does not equal zero!') 56 print(f'Current checksum (dec): {str(checksum)}; (hex, LE): "{int(checksum).to_bytes(2, "little").hex(" ").upper()}".') 57 58 two_byte_addition_strhex = int(65536 - checksum).to_bytes(2, "little").hex(" ").upper() 59 print(f'2 bytes addition to current checsum needed to validate it (hex, LE): "{two_byte_addition_strhex}".') 60
…Show last 37 lines
61 new_first_byte_sum_dec = int(bytearray.fromhex(two_byte_addition_strhex)[0] + int.from_bytes(first_checksum_byte, "little")) 62 correction_sum_strhex = new_first_byte_sum_dec.to_bytes(2, "little").hex(" ").upper() 63 new_second_byte_sum_dec = int(bytearray.fromhex(two_byte_addition_strhex)[1] + int(bytearray.fromhex(correction_sum_strhex)[1]) + int.from_bytes(second_checksum_byte, "little")) 64 65 new_first_byte_strhex = new_first_byte_sum_dec.to_bytes(2, "little").hex(" ").upper().split(" ")[0] 66 new_second_byte_strhex = new_second_byte_sum_dec.to_bytes(2, "little").hex(" ").upper().split(" ")[0] 67 68 choices = ('', 'n','y') 69 70 while True: 71 ch = input(f'Do you want to auto-patch the checksum bytes in "{bios_file_name}" file? Enter [y/N]: ') 72 if ch.lower() not in choices: 73 print(f'Error: Invalid choice "{ch}". Try again!') 74 continue 75 else: 76 break 77 78 if not ch or ch.lower() == 'n': 79 print('No actions taken.') 80 print(f'Manually hex-edit checksum bytes in "{bios_file_name}" file at address 0xFF50 with these values (hex, LE): "{new_first_byte_strhex} {new_second_byte_strhex}".') 81 else: 82 new_bios_file_name = bios_file_name.split('.')[0] + '.NEW' 83 shutil.copy(bios_file_name, new_bios_file_name) 84 print(f'Original "{bios_file_name}" file was copied to "{new_bios_file_name}".') 85 86 try: 87 with open(new_bios_file_name, mode='rb+') as file: 88 file.seek(65360, 0) 89 file.write(bytearray.fromhex(new_first_byte_strhex)) 90 file.write(bytearray.fromhex(new_second_byte_strhex)) 91 print(f'Checksum bytes replaced in "{new_bios_file_name}" file at address 0xFF50 with these values (hex, LE): "{new_first_byte_strhex} {new_second_byte_strhex}".') 92 except: 93 print(f'Error while writing "{new_bios_file_name}" file!') 94 sys.exit() 95 print(f'Original unmodified "{bios_file_name}" file is still intact.') 96 print(f'Now you can use freshly created "{new_bios_file_name}" file with corrected checksum bytes.')
The newest final version (added BIOS checksum check skip simple hack revert and other extras) of this script is HERE.
I think I tested everything in this script without problems.
Last edited by analog_programmer on 2025-06-22, 20:18. Edited 3 times in total.
The word Idiot refers to a person with many ideas, especially stupid and harmful ideas.
This world goes south since everything's run by financiers and economists.
This isn't voice chat, yet some people overusing online communications talk and hear voices.
For dozens of 286 through 386 boards, I have already modified my BIOSes with jake's process to skip the checksum. Does your script check for this condition and not skip the checksum? Or are users of this script needing to manually revert their checksum skip procedure?
Plan your life wisely, you'll be dead before you know it.
For dozens of 286 through 386 boards, I have already modified my BIOSes with jake's process to skip the checksum. Does your script check for this condition and not skip the checksum? Or are users of this script needing to manually revert their checksum skip procedure?
Nope, the script does not check for any BIOS executable code patching. It checks only if the given (path + ) filename exists as file and if there is such file it checks it's size. Then if the size of given file is exactly 64 kB the it proceeds - reads the two checksum bytes starting at address 0xFF50, calculates the checksum for the file and checks if it's equal to 0 - if not: asks to auto-correct the two checksum bytes (at same address 0xFF50) in a copy of the original given file (with file extension ".NEW").
P.S. I found the info needed for this patch in the first post of the thread. So, the byte "FA" that is patched to "EB" can be found by searching for "00 80 33 F6 2E AD 03 D8 E2 FA 74 06 BD 09 00" pattern. I need someone with more machine code reading skills to confirm if this pattern is suitable for searching (i.e. is it constant?) in all AMI "color" BIOSes, so I can try to implement the anti-bypassing-checksum-check-autopatch in the checksum correction script.
The word Idiot refers to a person with many ideas, especially stupid and harmful ideas.
This world goes south since everything's run by financiers and economists.
This isn't voice chat, yet some people overusing online communications talk and hear voices.
P.S. I found the info needed for this patch in the first post of the thread. So, the byte "FA" that is patched to "EB" can be found by searching for "00 80 33 F6 2E AD 03 D8 E2 FA 74 06 BD 09 00" pattern. I need someone with more machine code reading skills to confirm if this pattern is suitable for searching (i.e. is it constant?) in all AMI "color" BIOSes, so I can try to implement the anti-bypassing-checksum-check-autopatch in the checksum correction script.
The byte string 2E AD 03 D8 E2 FA 74 06 does not have any absolute addresses in it, and captures the "essence" of the 16-bit checksum calculation. I suggest you use that in your script to verify that what's being passed in is actually an AMIBIOS that uses this calculation, before doing the checksum change at ff50. And changing 74 to EB is the easiest, but not the only way to patch out the check, but since it's the one most openly discussed here, perhaps it's worth supporting.
The byte string 2E AD 03 D8 E2 FA 74 06 does not have any absolute addresses in it, and captures the "essence" of the 16-bit checksum calculation. I suggest you use that in your script to verify that what's being passed in is actually an AMIBIOS that uses this calculation, before doing the checksum change at ff50. And changing 74 to EB is the easiest, but not the only way to patch out the check, but since it's the one most openly discussed here, perhaps it's worth supporting.
Thanks for your response, jakethompson1.
Then I'll use "2E AD 03 D8 E2 FA EB 06" bytes pattern to check if the dump-file was patched with the simplest possible checksum checking bypass hack which is described in this thread, and if found - the "EB" byte will be reverted back to "74". Probably there is a possibility for patching the BIOS function checksum calculating to return always 0, but the primary goal of the checksum calculator was not to remove the BIOS executable code patches. This "simple checksum bypass patch" check and depatching when restoring a valid checksum will be a bonus 😉
I didn't bother to think for some complex checking if the processed file is a real AMI "color" BIOS, 'cause I don't believe that someone sane will use it on 64 kB Award dump-file expecting to achieve something usable out of it. And in the end the original processed file remains unchanged. But if you have some clue on what to check for - for example some exact string or some other constant thing that is unique and can be found only in all of this AMI "color" BIOSes, I'm open for suggestions to improve the script reliability.
The word Idiot refers to a person with many ideas, especially stupid and harmful ideas.
This world goes south since everything's run by financiers and economists.
This isn't voice chat, yet some people overusing online communications talk and hear voices.
That's my suggestion, to require that the input file have 2E AD 03 D8 E2 FA 74 06 in it somewhere, and if so, you presume there is a 16-bit checksum stored at FF50. This is better than trying to do it based on the copyright message or BIOS date IMO.
That's my suggestion, to require that the input file have 2E AD 03 D8 E2 FA 74 06 in it somewhere, and if so, you presume there is a 16-bit checksum stored at FF50. This is better than trying to do it based on the copyright message or BIOS date IMO.
So the check for a real AMI "color" BIOS-dump file will be If the file contains one of these two patterns: "2E AD 03 D8 E2 FA 74 06" (for unpatched) or "2E AD 03 D8 E2 FA EB 06" (for patched). And of course the 64 kb length check. As simple as that. And if the second pattern is found, then the file will be first de-patched (before any checksum calculations).
Tomorrow will be a good day for new script version 😉
The word Idiot refers to a person with many ideas, especially stupid and harmful ideas.
This world goes south since everything's run by financiers and economists.
This isn't voice chat, yet some people overusing online communications talk and hear voices.
Thanks for adding code to revert the previous'skip checksum' mod. Looks like I will have a lengthy upgrade project for my 286-386 systems. They all have been retro-fitted with PS/2 headers.
Plan your life wisely, you'll be dead before you know it.
Thanks for adding code to revert the previous'skip checksum' mod. Looks like I will have a lengthy upgrade project for my 286-386 systems. They all have been retro-fitted with PS/2 headers.
As I promised yesterday the final Python script for the amichksumcalc v.3. is ready.
The code is rewritten so it can be more readable and reusable. The script now checks if given file is real AMI "color" BIOS and also reverts the well known simple hack for BIOS checksum check bypass if found - as suggested by jakethompson1 . The script works with a copy of the original given file - a temporary .TMP file and if all the auto-patching process is completed successfully renames the temp file to one with .PCH extension (for the final fully patched file), otherwise the temporary file remains, if process is interrupted by some reason. The original given BIOS-dump file is never altered.
Just read the messages carefully when using the script!
It took me a couple of hours to test and adjust everything, and here is the new code:
1#!/usr/bin/env python3 2# amichksumcalc v.3 by analog_programmer, based on ahyeadude's AMI "color" BIOS checksum algorithm 3# Thanks to ahyeadude, jakethompson1, feipoa and Anonymous Coward from vogons.org 4 5import sys 6import os 7import shutil 8 9def checksum_calc(bytes_data): 10 block_count = len(bytes_data) // 16 11 checksum = 0 12 for block in range(0, block_count): 13 bios_block = bytes_data[block * 16:block * 16 + 16] 14 block_checksum = 0 15 for byte_pair in range(0, 8): 16 byte_pair_hex = bios_block[byte_pair * 2 + 1:byte_pair * 2 + 2].hex() + bios_block[byte_pair * 2:byte_pair * 2 + 1].hex() 17 byte_pair_dec = int(byte_pair_hex, 16) 18 block_checksum += byte_pair_dec 19 block_checksum %= 65536 20 checksum += block_checksum 21 checksum %= 65536 22 return checksum 23 24def confirm_choice(question): 25 choices = ('', 'n','y') 26 while True: 27 choice = input(f'{question} Enter [y/N]: ') 28 if choice.lower() not in choices: 29 print(f'Error: Invalid choice "{choice}". Try again!') 30 continue 31 else: 32 break 33 if not choice or choice.lower() == 'n': 34 return False 35 return True 36 37def hex_str2byte(hex_str): 38 return bytearray.fromhex(hex_str) 39 40def hex_str2int(hex_str): 41 return int.from_bytes(bytearray.fromhex(hex_str), "little") 42 43def int2hex_str(int_num, idx=None): 44 if idx or idx == 0: 45 return int_num.to_bytes(2, "little").hex(" ").upper().split(" ")[idx] 46 return int_num.to_bytes(2, "little").hex(" ").upper() 47 48def byte2int(bytes_data): 49 return int.from_bytes(bytes_data, "little") 50 51def byte2hex_str(bytes_data): 52 return bytes_data.hex().upper() 53 54def print_no_further_actions(): 55 print('No further actions will be taken.') 56 57def file_op_error(file_name, action): 58 print(f'Error while {action} "{file_name}" file!') 59 sys.exit() 60
…Show last 160 lines
61def check_file_exists(file_name): 62 if os.path.isfile(file_name): 63 return True 64 return False 65 66def file_delete(file_name): 67 if check_file_exists(file_name): 68 try: 69 print(f'Deleting "{file_name}"...') 70 os.remove(file_name) 71 print(f'"{file_name}" file was deleted.') 72 except: 73 file_op_error(file_name, 'deleting') 74 75def file_copy(file_name1, file_name2): 76 if check_file_exists(file_name2): 77 print(f'Warning: "{file_name2}" file already exists!') 78 if not confirm_choice(f'Do you want to overwrite "{file_name2}" file with "{file_name1}"?'): 79 print_no_further_actions() 80 sys.exit() 81 try: 82 print(f'Copying "{file_name1}" file to "{file_name2}" file...') 83 shutil.copy(file_name1, file_name2) 84 print(f'"{file_name1}" file was copied to "{file_name2}" file.') 85 return file_name2 86 except: 87 file_op_error(file_name2, 'creating') 88 89def file_rename(file_name1, file_name2): 90 if check_file_exists(file_name2): 91 file_copy(file_name1, file_name2) 92 if check_file_exists(file_name1): 93 file_delete(file_name1) 94 return file_name2 95 else: 96 try: 97 print(f'Renaming "{file_name1}" file to "{file_name2}"...') 98 os.rename(file_name1, file_name2) 99 print(f'Original "{file_name1}" file was renamed to "{file_name2}".') 100 return file_name2 101 except: 102 file_op_error(file_name1, 'renaming') 103 104def write_file_single_byte(file_name, byte_position, byte_data): 105 try: 106 with open(file_name, mode='rb+') as file: 107 file.seek(byte_position, 0) 108 file.write(byte_data) 109 except: 110 file_op_error(file_name, 'writing') 111 112def read_file_single_byte(file_name, byte_position): 113 try: 114 with open(file_name, mode='rb') as file: 115 file.seek(byte_position, 0) 116 return file.read(1) 117 except: 118 file_op_error(file_name, 'reading') 119 120def read_file_binary_contents(file_name): 121 try: 122 with open(file_name, mode='rb') as file: 123 return file.read() 124 except: 125 file_op_error(file_name, 'reading') 126 127def check_ami(file_name): 128 global hacked 129 file_bytes_data = read_file_binary_contents(file_name) 130 idx = 0 131 # search for unpatched string "2E AD 03 D8 E2 FA 74 06" 132 idx = file_bytes_data.find(b'\x2e\xad\x03\xd8\xe2\xfa\x74\x06', idx) 133 if idx != -1: 134 print(f'"{file_name}" file seems like authentic 64 kB AMI "color" BIOS.') 135 return True 136 idx = 0 137 # search for patched string "2E AD 03 D8 E2 FA EB 06" 138 idx = file_bytes_data.find(b'\x2e\xad\x03\xd8\xe2\xfa\xeb\x06', idx) 139 if idx != -1: 140 hacked = True 141 print(f'"{file_name}" file seems like hacked 64 kB AMI "color" BIOS.') 142 print(f'Restoring "{file_name}" file to authentic 64 kB AMI "color" BIOS...') 143 # restoring unpatched string "2E AD 03 D8 E2 FA 74 06" 144 file_address = idx + 6 145 byte4patch = read_file_single_byte(file_name, file_address) 146 write_file_single_byte(file_name, file_address, b'\x74') 147 print(f'Byte "{byte2hex_str(byte4patch)}" replaced in "{file_name}" file at address 0x{hex(file_address)[2:].upper()} with this value (hex): "74".') 148 print(f'"{file_name}" file restored to authentic 64 kB AMI "color" BIOS.') 149 return True 150 return False 151 152# main code: 153# check CL parameters 154if len(sys.argv) != 2: 155 print(f'Usage: {sys.argv[0]} <64 kB BIOS ROM-dump file>') 156 sys.exit() 157 158# gets BIOS ROM-dump file name 159bios_file_name = sys.argv[1] 160 161# check if BIOS ROM-dump file exists 162if not check_file_exists(bios_file_name): 163 print(f'Error: "{bios_file_name}" file does not exist!') 164 sys.exit() 165 166# check if BIOS ROM-dump file is 64 kB in size 167if os.path.getsize(bios_file_name) !=65536: 168 print(f'Error: "{bios_file_name}" file is not 64 kB in size!') 169 sys.exit() 170print(f'"{bios_file_name}" file is 64 kB in size!') 171 172# copy BIOS ROM-dump file to BIOS ROM-dump file with ".TMP" extension 173new_bios_file_name = bios_file_name.split('.')[0] + '.TMP' 174print(f'Original "{bios_file_name}" will be copied to "{new_bios_file_name}" file.') 175file_copy(bios_file_name, new_bios_file_name) 176 177# check if BIOS ROM-dump file is genuine AMI "color" BIOS or hacked AMI "color" BIOS 178hacked = False 179if not check_ami(new_bios_file_name): 180 print(f'Error: "{new_bios_file_name}" file is not AMI "color" BIOS ROM-dump!') 181 file_delete(new_bios_file_name) 182 print_no_further_actions() 183 sys.exit() 184 185# print two checksum bytes from BIOS ROM-dump file at address 0xFF50 186first_checksum_byte = read_file_single_byte(new_bios_file_name, 65360) 187second_checksum_byte = read_file_single_byte(new_bios_file_name, 65361) 188print(f'Checksum bytes read from "{new_bios_file_name}" file at address 0xFF50 (hex, LE): "{byte2hex_str(first_checksum_byte)} {byte2hex_str(second_checksum_byte)}".') 189 190# calculating BIOS ROM-dump file checksum 191bios_file_checksum = checksum_calc(read_file_binary_contents(new_bios_file_name)) 192 193# validating BIOS ROM-dump file checksum 194if bios_file_checksum != 0: 195 print(f'Checksum for "{new_bios_file_name}" file does not equals zero.') 196 print(f'Current checksum (dec): {bios_file_checksum}; (hex, LE): "{int2hex_str(bios_file_checksum):}".') 197 # calculating addition sum for correction 198 two_byte_addition = 65536 - bios_file_checksum 199 print(f'2 bytes addition to current checksum needed to validate it (dec) {two_byte_addition}; (hex, LE): "{int2hex_str(two_byte_addition)}".') 200 # calculating two new checksum bytes for BIOS ROM-dump file 201 new_first_checksum_byte = hex_str2int(int2hex_str(two_byte_addition, 0)) + byte2int(first_checksum_byte) 202 correction = hex_str2int(int2hex_str(new_first_checksum_byte, 1)) 203 new_second_checksum_byte = hex_str2int(int2hex_str(two_byte_addition, 1)) + byte2int(second_checksum_byte) + correction 204 # ask to proceed with auto-patching of BIOS ROM-dump file 205 if confirm_choice(f'Do you want to auto-patch the checksum bytes in "{new_bios_file_name}" file?'): 206 write_file_single_byte(new_bios_file_name, 65360, hex_str2byte(int2hex_str(new_first_checksum_byte, 0))) 207 write_file_single_byte(new_bios_file_name, 65361, hex_str2byte(int2hex_str(new_second_checksum_byte, 0))) 208 patched_bios_file_name = file_rename(new_bios_file_name, bios_file_name.split('.')[0] + '.PCH') 209 print(f'Checksum bytes replaced in "{patched_bios_file_name}" file at address 0xFF50 with these values (hex, LE): "{int2hex_str(new_first_checksum_byte, 0)} {int2hex_str(new_second_checksum_byte, 0)}".') 210 print(f'Original unmodified "{bios_file_name}" file is still intact.') 211 print(f'Now you can use freshly created "{patched_bios_file_name}" file with corrected checksum bytes{" and removed checksum hack" if hacked else ""}.') 212 else: 213 print_no_further_actions() 214 print(f'Manually hex-edit checksum bytes in "{new_bios_file_name}" file{" with removed checksum hack" if hacked else ""} at address 0xFF50 with these values (hex, LE): "{int2hex_str(new_first_checksum_byte, 0)} {int2hex_str(new_second_checksum_byte, 0)}".') 215else: 216 print(f'Checksum for "{new_bios_file_name}" file equals zero.') 217 file_delete(new_bios_file_name) 218 print('No actions needed.') 219 print(f'Original unmodified "{bios_file_name}" file is still intact.')
I'm waiting for your feedback...
UPDATE: Attached "amichksumcalc3.py" script in zip-archive:
The attachment amichksumcalc3.zip is no longer available
There will be no further updates to the script as there's zero feedback as it seems useless and of no interest to anyone. I've already lost enough time in writing and testing it, so this is the final version and if in the future someone decides to use it - it's still here.
Last edited by analog_programmer on 2025-07-10, 15:04. Edited 1 time in total.
The word Idiot refers to a person with many ideas, especially stupid and harmful ideas.
This world goes south since everything's run by financiers and economists.
This isn't voice chat, yet some people overusing online communications talk and hear voices.
If you're waiting for me, I won't have time to do any computer work until the Fall. I'm in summer home repair mode and have lots going on.
I'm waiting for someone to test the script and give some feedback, 'cause there's always a possibility that I've missed or messed something.
The word Idiot refers to a person with many ideas, especially stupid and harmful ideas.
This world goes south since everything's run by financiers and economists.
This isn't voice chat, yet some people overusing online communications talk and hear voices.