Возникло несколько вопросов к уважаемым гуру...
Вопросы касаются ROMSCAN, а точнее той части что копирует код из микросхемки в основную память
Вот сам ROMSCAN
Параметры - BX=Очередной адрес ROM (С000-С800 или C800-E000 или E000-E800)
ROMSCAN:
cli Запрет прерываний
cld Прямое направление
push ds Сохраняем DS
mov ds, bx Загрузка адреса ROM
xor si, si si=0 начало ROM
lodsw Загрузка сигнатуры
xor ax, AA55 Сигнатура 55AA ??
jne NO_SIGN Если НЕТ - выход для поиска в след. 512
mov cx, 0080 По умолчанию размер ROM = 80x200 = 64K
cmp bx, E000 Адрес ROM=E0000 ?
je DEFSIZE Если ДА - оставим 64К
lodsb НЕТ - загружаем реальный размер
mov cx, ax Размер (в блоках х512) в CX
DEFSIZE:
shl cx, 05 Умножаем CX*32
add bx, cx И переносим в BX
shl cx, 04 Домножаем на 16 - CX теперь реальный размер в байтах
xor si, si si=0 - Начало ROM
CHECKSUM:
lodsb Загружаем байт в AL
add ah, al AH = AH + AL - Подсчет CRC по модулю 256
loop CHECKSUM Повторяем для всего ROM
jne CRCFAIL CRC=0 ? Если НЕТ - выход
sti Разрешаем прерывания
push es Сохраняем ES-BX-BP
push bx
push bp
push cs Создаем точку возврата из ROM - сегмент
push ROM_RET И смещение
push ds Создаем искуственный переход в ROM - сегмент
push 0003 И смещение
call PREPARE Подготовка к переходу
retf Передача управления в ROM
ROM_RET:
cli Возврат из ROM - Запрет прерываний
cld Прямое направление
pop bp Восстанавливаем ES-BX-BP
pop bx
pop es
pop ds Восстанавливаем DS
cmp sp, sp Стек сбалансирован?
ret Выход
NO_SIGN:
add bx, 0080 Сигнатура не найдена - прибавляем 512 байт и ищем дальше
CRCFAIL:
pop ds Восстанавливаем DS
ret Выход
Вот непонятная процедура проверки
PREPARE:
push ds Сохраняем регистры
push es
push ax
push bx
push cx
push dx
push si
push di
mov ax, ds В AX - Адрес ROM
cmp ax, C000 Видео-ROM ?
jne EXIT Если НЕТ - выход
mov ax, cs Перегружаем CS->DS
mov ds, ax
mov cx, cs:[3BF6] Загружаем счетчик (в прошивке = 4)
mov si, 3AC2 Смещение
CYCLE:
lea bx, [si+09] Загружаем Адрес //?????
cmp word ptr[bx],FFFF По Адресу слово = FFFF ?
je CONTINUE Если ДА - продолжаем цикл
cmp byte ptr[bx+0B],03 По Адресу+И байт = 3 ?
je EXITERR Если ДА - Выходим с ошибкой
CONTINUE:
add si, 004D Смещение + 4D
loop CYCLE Продолжаем цикл
call COPYROM Копирование ROM в основную память
EXIT:
pop di Восстанавливаем регистры
pop si
pop dx
pop cx
pop bx
pop ax
pop es
pop ds
ret Выход
EXITERR:
mov ah, 00 В AH=0
mov al , [si+04] В AL=?
pop di Восстанавливаем регистры
pop si
pop dx
pop cx
pop bx
pop es
pop es
pop ds
ret Выход
А вот и само копирование
COPYROM:
push ds Сохраняем регистры
push es
pushad
mov ax, C000 Загружаем адрес видео-ROM в AX
mov ds, ax И перегружаем его в DS
mov es, ax И в ES
mov bx, 0000 Смещение = 0 - начало ROM
cmp word ptr [bx], AA55 Проверяем сигнатуру
jne SIG_ERR Неверная сигнатура - выход
mov bx, 0002 Смещение = 2 - размер ROM (x512)
mov al , [bx] Загружаем размер
cmp al, 20 Размер больше 20 (16K) ?
ja ABOVE20 Если ДА - сравниваем со следуюшим
mov cx, 2000 Округляем размер до 16K
mov bx, FC01 В BX - непонятные флаги
jmp SIZEOK Размер определен
ABOVE20:
cmp al, 40 Размер больше 40 (32K) ?
ja ABOVE40 Если ДА - сравниваем со следующим
mov cx, 4000 Округлям размер до 32K
mov bx, F005 В BX - непонятные флаги
jmp SIZEOK Размер определен
ABOVE40:
cmp al, 60 Размер больше 60 (48K) ?
ja ABOVE60 Если ДА - к следующему
mov cx, 6000 Округляем размер до 48K
mov bx, C015 В BX - непонятные флаги
jmp SIZEOK Размер определен
ABOVE60
mov cx, 8000 Округляем размер до 64K
mov bx, 0055 В BX - непонятные флаги
SIZEOK: Размер определен
mov al, 1C Шаманство с флагами и портами E0\E1
out E0, al
in al, E1
and al , bh
or bl , al
mov al, 1C
out E0, al
mov al , bl
mov ah, 1C
xchg ah, al
out E0, ax
Начинаем копирование
mov si, 0000 Индекс источника = 0
mov di, 0000 Индекс приемника = 0
cld Прямое направление
repz Повтор по размеру ROM
movsw Копирование
mov al, 1C Шаманство с флагами и портами E0\E1
out E0, al
in al, E1
and al , bh
not bx
and bl , bh
or bl , al
mov al, 1C
out E0, al
mov al , bl
mov ah, 1C
xchg ah, al
out E0, ax
SIG_ERR:
popad Восстанавливаем регистры
pop es
pop ds
ret Выход
Непонятен сам механизм
К какому устройству относятся порты E0,E1 ?
И что можно перенастроить таким образом, чтобы обычная пересылка из области памяти в саму себя превратилась вдруг в копирование из памяти устройства на шине в системную память??
Добавлено спустя 21 час 20 минут 13 секунд:
Я неправильно интерпретировал процедуру PREPARE - то что я считал ошибкой на самом деле - успешное выполнение
Должно быть так
mov cx, cs:[3BF6] Загружаем количество слотов PCI (в прошивке = 4)
mov si, 3AC2 Смещение на область конфигурации
CYCLE:
lea bx, [si+09] Загружаем адрес конф. пространства слота
cmp word ptr[bx],FFFF По Смещение 0 - VendorID - есть устройство в слоте?
je CONTINUE Если НЕТ - продолжаем опрос
cmp byte ptr[bx+0B],03 Смещение B - Base Class - устройство видеоадаптер (3)?
je EXITOK Если ДА - Выходим, нашли видеоадаптер
CONTINUE:
add si, 004D Смещение + 4D к следующему слоту
loop CYCLE Продолжаем цикл
call COPYROM Копирование ROM в основную память
.
.
.
.
EXITОК:
Параметры для процедуры ROMINIT :
mov ah, 00 В AH - номер шины - 0=шина PCI
mov al , [si+04] В AL=номер устройства:функции (5:3)
Получается копирование вызывается если в PCI не найден видеоадаптер, а значит это не мой случай
Все предыдущие вопросы пока сняты
Надо искать, где область 3AC2 заполняется
Возникло несколько вопросов к уважаемым гуру...
Вопросы касаются ROMSCAN, а точнее той части что копирует код из микросхемки в основную память
Вот сам ROMSCAN
Вот непонятная процедура проверки
А вот и само копирование
Непонятен сам механизм
К какому устройству относятся порты E0,E1 ?
И что можно перенастроить таким образом, чтобы обычная пересылка из области памяти в саму себя превратилась вдруг в копирование из памяти устройства на шине в системную память??
Добавлено спустя 21 час 20 минут 13 секунд:
Я неправильно интерпретировал процедуру PREPARE - то что я считал ошибкой на самом деле - успешное выполнение
Должно быть так
Получается копирование вызывается если в PCI не найден видеоадаптер, а значит это не мой случай
Все предыдущие вопросы пока сняты
Надо искать, где область 3AC2 заполняется