OSDev

для всех
Текущее время: 29 апр 2024, 11:47

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Работа на реальном железе
СообщениеДобавлено: 05 фев 2013, 22:30 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Подход изначально неправильный. Лучше переустанавливать видеорежим полностью. Для этого и возврат в RM может понадобиться.

Но раз решили делать именно так, попробуйте читать/писать регистр 10h в режиме записи в палитру, а потом включить контроллер (установкой бита 5 адресного регистра). На всякий случай привожу полный код инициализации регистров "контроллера атрибутов":
Код:
VIDEO_AOR equ 0x3C0
...
VIDEO_ISR1 equ 0x3DA
...
VIDEO_MAXATTR equ 0x14

  ...
  mov esi,video.regvaltab

  mov edx,VIDEO_ISR1
  in al,dx

  mov dl,VIDEO_AOR and 0xFF
  mov al,VIDEO_MAXATTR

@@:
  out dx,al
  outsb
  dec al
  cmp al,0x10
  jae @b

@@:
  out dx,al
  out dx,al
  sub al,1
  jnc @b

  mov al,0x20
  out dx,al
  ...

video.regvaltab:
  db 0x00 ; 14
  db 0x08 ; 13
  db 0x0F ; 12
  db 0x00 ; 11
  db 0x04 ; 10


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа на реальном железе
СообщениеДобавлено: 06 фев 2013, 07:46 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Наверно стоит посмотреть исходные коды биоса к примеру вот:
http://code.coreboot.org/p/seabios/sour ... ios.c#L624
http://code.coreboot.org/p/seabios/sour ... dvga.c#L76
http://code.coreboot.org/p/seabios/sour ... aio.c#L132


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа на реальном железе
СообщениеДобавлено: 06 фев 2013, 09:49 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Вот нашел исходник из биоса. Должен работать 99,99%, crtc_addr установить как 3D4h
Код:
ATC_INDEX               equ     03C0h
crtc_addr       dw      ?               ; I/O address of CRTC (3D4h or 3B4h)

;----------------------------------------------------------------------
;       GetIndexRegister - Read the value of an indexed register
;
;       Entry:  DX = I/O port
;               AL = Index to read
;       Exit:   AH = Data read
;
;       DX and AL are preserved
;----------------------------------------------------------------------

        public  GetIndexRegister
GetIndexRegister        proc    near
        assume  ds:nothing, es:nothing
        out     dx,al
        mov     ah,al
        inc     dx
        in      al,dx
        dec     dx
        xchg    al,ah
        ret
GetIndexRegister        endp

;       Subfunction 003h:
;       ToggleIntensityBlinkBit - Set the intensity or blinking bit in the ATC mode register
;
;       Entry:  DS = Seg0
;               BL = Toggle state:
;                 0: Enable intensity
;                 1: Enable blinking
;       Exit:   None
;
        public  ToggleIntensityBlinkBit
ToggleIntensityBlinkBit proc    near
        assume  ds:Seg0, es:nothing
        push    dx
        mov     dx,[crtc_addr]
        add     dl,6
        cli            
        in  al,dx
        mov     dl,ATC_INDEX and 0ffh
        mov     al,030h
        call    GetIndexRegister        ; This leaves ATC in data state
        mov     al,bl
        and     al,1
        shl     al,3
        and     ah,0F7h
        or      al,ah
        out     dx,al
        mov     al,20h
        out     dx,al
        sti
        pop     dx
        ret
ToggleIntensityBlinkBit endp




Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа на реальном железе
СообщениеДобавлено: 06 фев 2013, 20:36 

Зарегистрирован: 23 ноя 2012, 13:02
Сообщения: 27
pavia писал(а):
Вот нашел исходник из биоса. Должен работать 99,99%, crtc_addr установить как 3D4h
Код:
ATC_INDEX               equ     03C0h
crtc_addr       dw      ?               ; I/O address of CRTC (3D4h or 3B4h)

;----------------------------------------------------------------------
;       GetIndexRegister - Read the value of an indexed register
;
;       Entry:  DX = I/O port
;               AL = Index to read
;       Exit:   AH = Data read
;
;       DX and AL are preserved
;----------------------------------------------------------------------

        public  GetIndexRegister
GetIndexRegister        proc    near
        assume  ds:nothing, es:nothing
        out     dx,al
        mov     ah,al
        inc     dx
        in      al,dx
        dec     dx
        xchg    al,ah
        ret
GetIndexRegister        endp

;       Subfunction 003h:
;       ToggleIntensityBlinkBit - Set the intensity or blinking bit in the ATC mode register
;
;       Entry:  DS = Seg0
;               BL = Toggle state:
;                 0: Enable intensity
;                 1: Enable blinking
;       Exit:   None
;
        public  ToggleIntensityBlinkBit
ToggleIntensityBlinkBit proc    near
        assume  ds:Seg0, es:nothing
        push    dx
        mov     dx,[crtc_addr]
        add     dl,6
        cli            
        in  al,dx
        mov     dl,ATC_INDEX and 0ffh
        mov     al,030h
        call    GetIndexRegister        ; This leaves ATC in data state
        mov     al,bl
        and     al,1
        shl     al,3
        and     ah,0F7h
        or      al,ah
        out     dx,al
        mov     al,20h
        out     dx,al
        sti
        pop     dx
        ret
ToggleIntensityBlinkBit endp




Спасибо большое, код оказался на 100% рабочий, все получилось!) Большое спасибо все заработало, экран перестал мигать и цвета встали на место! :D


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB