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() 17 + bios_block[byte_pair * 2:byte_pair * 2 + 1].hex()) 18 byte_pair_dec = int(byte_pair_hex, 16) 19 block_checksum += byte_pair_dec 20 block_checksum %= 65536 21 checksum += block_checksum 22 checksum %= 65536 23 return checksum 24 25def confirm_choice(question): 26 choices = ('', 'n','y') 27 while True: 28 choice = input(f'{question} Enter [y/N]: ') 29 if choice.lower() not in choices: 30 print(f'Error: Invalid choice "{choice}". Try again!') 31 continue 32 else: 33 break 34 if not choice or choice.lower() == 'n': 35 return False 36 return True 37 38def hex_str2byte(hex_str): 39 return bytearray.fromhex(hex_str) 40 41def hex_str2int(hex_str): 42 return int.from_bytes(bytearray.fromhex(hex_str), "little") 43 44def int2hex_str(int_num, idx=None): 45 if idx or idx == 0: 46 return int_num.to_bytes(2, "little").hex(" ").upper().split(" ")[idx] 47 return int_num.to_bytes(2, "little").hex(" ").upper() 48 49def byte2int(bytes_data): 50 return int.from_bytes(bytes_data, "little") 51 52def byte2hex_str(bytes_data): 53 return bytes_data.hex().upper() 54 55def file_op_error(file_name, action): 56 print(f'Error while {action} "{file_name}" file!') 57 sys.exit() 58 59def check_file_exists(file_name): 60 if os.path.isfile(file_name):
…Show last 170 lines
61 return True 62 return False 63 64def print_no_further_actions(): 65 print('No further actions will be taken.') 66 67def file_delete(file_name): 68 if check_file_exists(file_name): 69 try: 70 print(f'Deleting "{file_name}"...') 71 os.remove(file_name) 72 print(f'"{file_name}" file was deleted.') 73 except: 74 file_op_error(file_name, 'deleting') 75 76def file_copy(file_name1, file_name2): 77 if check_file_exists(file_name2): 78 print(f'Warning: "{file_name2}" file already exists!') 79 if not confirm_choice(f'Do you want to overwrite "{file_name2}" file with "{file_name1}"?'): 80 print_no_further_actions() 81 sys.exit() 82 try: 83 print(f'Copying "{file_name1}" file to "{file_name2}" file...') 84 shutil.copy(file_name1, file_name2) 85 print(f'"{file_name1}" file was copied to "{file_name2}" file.') 86 return file_name2 87 except: 88 file_op_error(file_name2, 'creating') 89 90def file_rename(file_name1, file_name2): 91 if check_file_exists(file_name2): 92 file_copy(file_name1, file_name2) 93 if check_file_exists(file_name1): 94 file_delete(file_name1) 95 return file_name2 96 else: 97 try: 98 print(f'Renaming "{file_name1}" file to "{file_name2}"...') 99 os.rename(file_name1, file_name2) 100 print(f'Original "{file_name1}" file was renamed to "{file_name2}".') 101 return file_name2 102 except: 103 file_op_error(file_name1, 'renaming') 104 105def write_file_single_byte(file_name, byte_position, byte_data): 106 try: 107 with open(file_name, mode='rb+') as file: 108 file.seek(byte_position, 0) 109 file.write(byte_data) 110 except: 111 file_op_error(file_name, 'writing') 112 113def read_file_single_byte(file_name, byte_position): 114 try: 115 with open(file_name, mode='rb') as file: 116 file.seek(byte_position, 0) 117 return file.read(1) 118 except: 119 file_op_error(file_name, 'reading') 120 121def read_file_binary_contents(file_name): 122 try: 123 with open(file_name, mode='rb') as file: 124 return file.read() 125 except: 126 file_op_error(file_name, 'reading') 127 128def check_ami(file_name): 129 global hacked 130 file_bytes_data = read_file_binary_contents(file_name) 131 idx = 0 132 # search for unpatched string "2E AD 03 D8 E2 FA 74 06" 133 idx = file_bytes_data.find(b'\x2e\xad\x03\xd8\xe2\xfa\x74\x06', idx) 134 if idx != -1: 135 print(f'"{file_name}" file seems like authentic 64 kB AMI "color" BIOS.') 136 return True 137 idx = 0 138 # search for patched string "2E AD 03 D8 E2 FA EB 06" 139 idx = file_bytes_data.find(b'\x2e\xad\x03\xd8\xe2\xfa\xeb\x06', idx) 140 if idx != -1: 141 hacked = True 142 print(f'"{file_name}" file seems like hacked 64 kB AMI "color" BIOS.') 143 print(f'Restoring "{file_name}" file to authentic 64 kB AMI "color" BIOS...') 144 # restoring unpatched string "2E AD 03 D8 E2 FA 74 06" 145 file_address = idx + 6 146 byte4patch = read_file_single_byte(file_name, file_address) 147 write_file_single_byte(file_name, file_address, b'\x74') 148 print(f'Byte "{byte2hex_str(byte4patch)}" replaced in "{file_name}" file at address 0x' 149 f'{hex(file_address)[2:].upper()} with this value (hex): "74".') 150 print(f'"{file_name}" file restored to authentic 64 kB AMI "color" BIOS.') 151 return True 152 return False 153 154# main code: 155# check CL parameters 156if len(sys.argv) != 2: 157 print(f'Usage: {sys.argv[0]} <64 kB BIOS ROM-dump file>') 158 sys.exit() 159 160# gets BIOS ROM-dump file name 161bios_file_name = sys.argv[1] 162 163# check if BIOS ROM-dump file exists 164if not check_file_exists(bios_file_name): 165 print(f'Error: "{bios_file_name}" file does not exist!') 166 sys.exit() 167 168# check if BIOS ROM-dump file is 64 kB in size 169if os.path.getsize(bios_file_name) !=65536: 170 print(f'Error: "{bios_file_name}" file is not 64 kB in size!') 171 sys.exit() 172print(f'"{bios_file_name}" file is 64 kB in size!') 173 174# copy BIOS ROM-dump file to BIOS ROM-dump file with ".TMP" extension 175new_bios_file_name = bios_file_name.split('.')[0] + '.TMP' 176print(f'Original "{bios_file_name}" will be copied to "{new_bios_file_name}" file.') 177file_copy(bios_file_name, new_bios_file_name) 178 179# check if BIOS ROM-dump file is genuine AMI "color" BIOS or hacked AMI "color" BIOS 180hacked = False 181if not check_ami(new_bios_file_name): 182 print(f'Error: "{new_bios_file_name}" file is not AMI "color" BIOS ROM-dump!') 183 file_delete(new_bios_file_name) 184 print_no_further_actions() 185 sys.exit() 186 187# print two checksum bytes from BIOS ROM-dump file at address 0xFF50 188first_checksum_byte = read_file_single_byte(new_bios_file_name, 65360) 189second_checksum_byte = read_file_single_byte(new_bios_file_name, 65361) 190print(f'Checksum bytes read from "{new_bios_file_name}" file at address 0xFF50 (hex, LE): ' 191 f'"{byte2hex_str(first_checksum_byte)} ' 192 f'{byte2hex_str(second_checksum_byte)}".') 193 194# calculating BIOS ROM-dump file checksum 195bios_file_checksum = checksum_calc(read_file_binary_contents(new_bios_file_name)) 196 197# validating BIOS ROM-dump file checksum 198if bios_file_checksum != 0: 199 print(f'Checksum for "{new_bios_file_name}" file does not equals zero.') 200 print(f'Current checksum (dec): {bios_file_checksum}; (hex, LE): "{int2hex_str(bios_file_checksum):}".') 201 # calculating addition sum for correction 202 two_byte_addition = 65536 - bios_file_checksum 203 print(f'2 bytes addition to current checksum needed to validate it (dec) {two_byte_addition}; (hex, LE): ' 204 f'"{int2hex_str(two_byte_addition)}".') 205 # calculating two new checksum bytes for BIOS ROM-dump file 206 new_first_checksum_byte = hex_str2int(int2hex_str(two_byte_addition, 0)) + byte2int(first_checksum_byte) 207 correction = hex_str2int(int2hex_str(new_first_checksum_byte, 1)) 208 new_second_checksum_byte = (hex_str2int(int2hex_str(two_byte_addition, 1)) + byte2int(second_checksum_byte) + 209 correction) 210 # ask to proceed with auto-patching of BIOS ROM-dump file 211 if confirm_choice(f'Do you want to auto-patch the checksum bytes in "{new_bios_file_name}" file?'): 212 write_file_single_byte(new_bios_file_name, 65360, hex_str2byte(int2hex_str(new_first_checksum_byte, 0))) 213 write_file_single_byte(new_bios_file_name, 65361, hex_str2byte(int2hex_str(new_second_checksum_byte, 0))) 214 patched_bios_file_name = file_rename(new_bios_file_name, bios_file_name.split('.')[0] + '.PCH') 215 print(f'Checksum bytes replaced in "{patched_bios_file_name}" file at address 0xFF50 with these values (hex, LE): ' 216 f'"{int2hex_str(new_first_checksum_byte, 0)} {int2hex_str(new_second_checksum_byte, 0)}".') 217 print(f'Original unmodified "{bios_file_name}" file is still intact.') 218 print(f'Now you can use freshly created "{patched_bios_file_name}" file with corrected checksum bytes' 219 f'{" and removed checksum hack" if hacked else ""}.') 220 else: 221 print_no_further_actions() 222 print(f'Manually hex-edit checksum bytes in "{new_bios_file_name}" ' 223 f'file{" with removed checksum hack" if hacked else ""} at address 0xFF50 with these values (hex, LE): ' 224 f'"{int2hex_str(new_first_checksum_byte, 0)} {int2hex_str(new_second_checksum_byte, 0)}".') 225else: 226 print(f'Checksum for "{new_bios_file_name}" file equals zero.') 227 file_delete(new_bios_file_name) 228 print('No actions needed.') 229 print(f'Original unmodified "{bios_file_name}" file is still intact.')
If the new code is approved, I'll attach the script file in zip-archive later.
I'm waiting for your feedback...
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.