Возникло несколько вопросов к уважаемым гуру...
Вопросы касаются 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
Параметры - 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 заполняется