Files
Balsam_167/tests/gas167/check_image.py
T
Andrey f741741cf8 Сохранить русские комментарии и настройки проекта в UTF-8
Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
2026-10-12 12:24:48 +03:00

94 lines
8.6 KiB
Python

# Проверка gas167 на модели пк. Комментарии и исходный текст в UTF-8.
# Продолжает текущий вызов, список или выражение: """Validate the PM35 RAM-load SCI8 image against the selected EEPROM profile."""; порядок аргументов сохраняется.
"""Validate the PM35 RAM-load SCI8 image against the selected EEPROM profile."""
# Подключает модуль argparse для этой проверки или подготовки сборки.
import argparse
# Импортирует необходимые имена: from pathlib import Path.
from pathlib import Path
# Подключает модуль struct для этой проверки или подготовки сборки.
import struct
# Объявляет функцию check_image и её входные параметры.
def check_image(path, eeprom):
# Читает исходный файл или образ для последующей проверки и разбора.
data = path.read_bytes()
# Задаёт limit по выражению справа; значение используется последующими операциями.
limit = {"AT25256B": 32508, "M95M02": 261884}[eeprom]
# Проверяет условие if not 24 <= len(data) <= limit перед выполнением следующего блока.
if not 24 <= len(data) <= limit:
# Останавливает текущую операцию с исключением ValueError(f"Image size {len(data)} outside 24..{limit}").
raise ValueError(f"Image size {len(data)} outside 24..{limit}")
# Проверяет условие if struct.unpack_from("<H", data)[0] != 0x08AA перед выполнением следующего блока.
if struct.unpack_from("<H", data)[0] != 0x08AA:
# Останавливает текущую операцию с исключением ValueError("Not a SCI8 boot image").
raise ValueError("Not a SCI8 boot image")
# Задаёт high, low по выражению справа; значение используется последующими операциями.
high, low = struct.unpack_from("<HH", data, 18)
# Задаёт entry по выражению справа; значение используется последующими операциями.
entry = (high << 16) | low
# Задаёт position, blocks по выражению справа; значение используется последующими операциями.
position, blocks = 22, []
# Повторяет блок при выполнении True.
while True:
# Проверяет условие if position + 2 > len(data) перед выполнением следующего блока.
if position + 2 > len(data):
# Останавливает текущую операцию с исключением ValueError("Missing boot terminator").
raise ValueError("Missing boot terminator")
# Задаёт words по выражению справа; значение используется последующими операциями.
words = struct.unpack_from("<H", data, position)[0]
# Задаёт position + по выражению справа; значение используется последующими операциями.
position += 2
# Проверяет условие if not words перед выполнением следующего блока.
if not words:
# Проверяет условие if position != len(data) перед выполнением следующего блока.
if position != len(data):
# Останавливает текущую операцию с исключением ValueError("Trailing bytes after boot terminator").
raise ValueError("Trailing bytes after boot terminator")
# Продолжает текущий вызов, список или выражение: break; порядок аргументов сохраняется.
break
# Проверяет условие if position + 4 + words * 2 > len(data) перед выполнением следующего блока.
if position + 4 + words * 2 > len(data):
# Останавливает текущую операцию с исключением ValueError("Truncated boot block").
raise ValueError("Truncated boot block")
# Задаёт high, low по выражению справа; значение используется последующими операциями.
high, low = struct.unpack_from("<HH", data, position)
# Задаёт address по выражению справа; значение используется последующими операциями.
address = (high << 16) | low
# Задаёт end по выражению справа; значение используется последующими операциями.
end = address + words
# Проверяет условие if not 0x8000 <= address < end <= 0xD000 перед выполнением следующего блока.
if not 0x8000 <= address < end <= 0xD000:
# Останавливает текущую операцию с исключением ValueError(f"Boot destination {address:#x}..{end:#x} outside code RAM").
raise ValueError(f"Boot destination {address:#x}..{end:#x} outside code RAM")
# Проверяет условие if any(address < old_end and old_start < end for old_start, old_end in blocks) перед выполнением следующего блока.
if any(address < old_end and old_start < end for old_start, old_end in blocks):
# Останавливает текущую операцию с исключением ValueError("Overlapping boot blocks").
raise ValueError("Overlapping boot blocks")
# Продолжает текущий вызов, список или выражение: blocks.append((address, end)); порядок аргументов сохраняется.
blocks.append((address, end))
# Задаёт position + по выражению справа; значение используется последующими операциями.
position += 4 + words * 2
# Проверяет условие if not any(start <= entry < end for start, end in blocks) перед выполнением следующего блока.
if not any(start <= entry < end for start, end in blocks):
# Останавливает текущую операцию с исключением ValueError("Entry point not loaded by the boot table").
raise ValueError("Entry point not loaded by the boot table")
# Возвращает len(data), len(blocks), limit - len(data) вызывающему коду и завершает функцию.
return len(data), len(blocks), limit - len(data)
# Проверяет условие if __name__ == "__main__" перед выполнением следующего блока.
if __name__ == "__main__":
# Задаёт parser по выражению справа; значение используется последующими операциями.
parser = argparse.ArgumentParser(description=__doc__)
# Задаёт parser.add_argument("image", type по выражению справа; значение используется последующими операциями.
parser.add_argument("image", type=Path)
# Задаёт parser.add_argument("--eeprom", choices по выражению справа; значение используется последующими операциями.
parser.add_argument("--eeprom", choices=("AT25256B", "M95M02"), required=True)
# Задаёт args по выражению справа; значение используется последующими операциями.
args = parser.parse_args()
# Задаёт size, blocks, free по выражению справа; значение используется последующими операциями.
size, blocks, free = check_image(args.image, args.eeprom)
# Продолжает текущий вызов, список или выражение: print(f"PASS SCI8 {args.eeprom}: {size} bytes, {blocks} RAM blocks, {free} bytes free"); порядок аргументов сохраняется.
print(f"PASS SCI8 {args.eeprom}: {size} bytes, {blocks} RAM blocks, {free} bytes free")