Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
94 lines
8.6 KiB
Python
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")
|