Возникло несколько вопросов к уважаемым гуру... Вопросы касаются ROMSCAN,

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

Экзотика NEC не хочет принимать видеокарту