Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите написать драйвер видеоадаптера CGA на ассемблре  (Прочитано 7401 раз)
0 Пользователей и 1 Гость смотрят эту тему.
_Alex_
Гость
« : 13-01-2004 08:45 » 

Нужно написать драйвер видеоадаптера CGA (только текстовый режим) и драйвер клавиатуры. Подскажите, где можно качнуть информацию по этой теме. Если есть готовые контрольные, это ещё лучше, пишите, плииииииззззз. Сессия скоро. Горю!!!!!

allex_99@ngs.ru
Записан
maaaaaad
Гость
« Ответ #1 : 13-01-2004 14:52 » 

под что? под дос?
у меня валялся драйвер клавы. а видео - можно взять из биос.

Сессия уже прошла.
Записан
_Alex_
Гость
« Ответ #2 : 14-01-2004 00:53 » 

да, под дос. если встретиш свой драйвер клавы сбрось мне пожалуста.
обьясни, как взять из биоса видео? просто я этим не занимался раньше.
заранее благодарю.

p.s.
я студент ТМЦ ДО слышал про дистанционное обучение? сессия у нас начнётся
3-го февраля (ни как у людей).
Записан
maaaaaad
Гость
« Ответ #3 : 14-01-2004 08:09 » 

Все по кускам. Все вместе входит в очень большую прогу.
1. Установка обработчика (таймера) пример
2. Процедура обработки прерывания от клавы.
к сожалению готовинького нет.
насчет видео. там прерывание 10h - посмотри сегмент (сегмент биос), смещение, сдампь его на диск и поработай идачкой.
Есть хорошая книжка "Самоучит. по сист. функц. msdos" Финогенов=))
Эх, были времена....

; replaceing timer service
;CODE SEGMENT
text    segment 'code'
   org   100h
   assume cs:text, ds:text
main   proc   ;
   push   cs
   pop   ds

   mov   ah,35h      ;
   mov   al,08h      ;vector
   int   21h      ;*Save vector

   mov   word ptr o8v,bx   ;copy vector to old_08
   mov   word ptr o8v+2,es   ;
   ;mov   v8es,es
   ;mov   v8bx,bx

   mov   ah,25h      ;
   mov   al,08h      ;
   mov   dx,offset   new_08   ;it's new service
   int   21h      ;

   mov   ah,01h
   int   21h      ;wait for keydown

   ;mov   ds,v8es
   ;mov   dx,v8bx   
   lds   dx,o8v
   mov   ah,25h
   mov   al,08h
   int   21h      ;*Restore saved vector
   
   mov   ah,4Ch
   int   21h      ;*closeing of programm

main   endp

new_08   proc         ;IT'S  NEW SERVICE
   push   AX      ;save using registry AX
   push   ES      ;save using registry ES
   push   di
   
   mov   ax,0B800h   ;is address of 1-st video page
   mov   es,ax
      
   mov   al,177
   mov   ah,16h      ;symbol color
   mov   di,CS:symp
   mov   es:[di],ax   ;print symbol
   
   add   CS:symp,2   ;inc symp
   cmp   CS:symp,3996
   jne   retme
   mov   CS:symp,2000      ;move position to 0
retme:
   mov   al,20h
   out   20h,al      ;SEND 'END OF INTERRUPTION' to port 20h

   pop   di
   pop   ES      ;restore saved register ES
   pop   AX      ;restore saved register AX
   iret         ;return
new_08   endp
            ;===
;define data
   o8v   dd   0   ;Old vector 08h
   symp   dw   2000   ;position of input
   symc   db   16h   ;background color   

   v8es   dw   0   ;
   v8bx   dw   0   ;

text   ends
   end   main








;
; Обработчик прерывания от клавиатуры
;
   
vec009   proc
   pushad
   
   ; читаем введенный символ
   in   al,60h
   
   ; проверка кода
   cmp   al,127
   jbe   CheckEnter      ; меньше или равно?
v009_e:   mov   al,DEBUG
      cmp   al,1
      je   @DEBUG_2
      mov   al,20h
      out   20h,al      ; End of interrupt
@DEBUG_2:
      jmp   v009_exit
CheckEnter:
   cmp   al,28      ; Enter
   je   INPUTENTER
   
CheckLSHIFT_DOWN:
   cmp   al,42
   mov   byte ptr offset LShiftState,1
   je   v009_e ;far INPUTLSHIFT_DOWN

CheckLSHIFT_UP:
   cmp   al,170
   mov   byte ptr offset LShiftState,0
   je   v009_e ;INPUTLSHIFT_UP
         
   LEA   BX,EnCodeTableL
   XLAT               ; конвертируем полученный код
   
;   mov   cl,byte ptr offset LShiftState
;   cmp   cl,0
   ;cmp   byte ptr offset LShiftState,0
;   je   notshift
;   sub   al,32
   
;notshift:

   mov   ah,09h      ; выводим симнол AL с атриб.,с повт., в текущ. позиц.
   
   ; записываем символ в буфер
   push   si
   mov   si,offset keybuf   ; смещение буфепа клавиатуры
   add   si,word ptr offset keypos   ; добавляем текущ. позицию
   mov   byte ptr cs:[si],al   ; записываем введенный символ по этому адресу
   mov   si,word ptr offset keypos
   inc   si
   mov   word ptr offset keypos,si
   pop   si
   
   mov   bx,000000000111b
   xor   cx,cx
   inc   cx
   int   10h
   
   ; получаем позицию курсора  DH = строка  DL = столбец
   mov   ah,03h
   mov   bh,0   
   int   10h

   cmp   dl,79      ; последний столбец?
   jne   NotLastCol
   cmp   dh,24      ; последний ряд?
   jne   NotLastRow
      ; прокручиваем окно
      mov   ah,06h
      mov   al,1      ; прокрутить окно на 1 вверх
      mov   bh,00000111b
      mov   cx,0000h   ; (0,0)
      ;mov   cl,0
      mov   dh,24
      mov   dl,79
      int   10h
      ; устанавливаем курсор (24,0)
      mov   dh,24
      mov   dl,0
      mov   ah,02h
      mov   bh,0
      int   10h      
      jmp   v009_exit

NotLastRow:
   inc   dh
   xor   dl,dl
   ; устанавливаем позицию курсора  DH = row  DL = col
   mov   ah,02h
   mov   bh,0
   int   10h
   jmp   v009_exit
      
NotLastCol:
   ; устанавливаем позицию курсора  DH = строка  DL = столбец
   mov   ah,02h
   mov   bh,0
   inc   dl
   int   10h
   jmp   v009_exit
   
   ;*****************************************************************
INPUTENTER: ; новая строка + вызов коммандного процессора        window(80x25)

   ; записываем нолик по адресу keybuf[keypos+1]
   mov   si,offset keybuf         ; смещение буфепа клавиатуры
   add   si,word ptr offset keypos   ; добавляем текущ. позицию
   mov   byte ptr cs:[si],0         ; записываем нолик по этому адресу

   ; получаем позицию курсора  DH = строка  DL = столбец
   mov   ah,03h
   mov   bh,0   
   int   10h
   
   cmp   dh,24      ; последний ряд?
   jne   NotLastRow2
      ; прокручиваем окно
      mov   ah,06h
      mov   al,1      ; прокрутить окно на 1 вверх
      mov   bh,00000111b
      mov   cx,0000h   ; (0,0)
      ;mov   cl,0
      mov   dh,24
      mov   dl,79
      int   10h
      ; устанавливаем курсор (24,0)
      mov   dh,24
      mov   dl,0
      mov   ah,02h
      mov   bh,0
      int   10h      
      jmp   v009_command

NotLastRow2:
   inc   dh
   xor   dl,dl
   ; устанавливаем позицию курсора  DH = row  DL = col
   mov   ah,02h
   mov   bh,0
   int   10h
      
v009_command:

   cmp  keypos,0
   je   scipexec   

   call   CommandProc ;exec
   ; сбрасываем индекс буфера
   mov   word ptr offset keypos,0
   ; записываем первый элемент буфера - ноль
   mov   si,offset keybuf         ; смещение буфепа клавиатуры
   mov   byte ptr cs:[si],0         ; записываем ноль по этому адресу

scipexec:
   call   Splash
   jmp   v009_exit
   
INPUTBACKS:

   jmp   v009_exit
   
INPUTLSHIFT_UP:

   jmp   v009_exit

INPUTLSHIFT_DOWN:

   jmp   v009_exit
   
INPUTRSHIFT_UP:

   jmp   v009_exit
   
INPUTRSHIFT_DOWN:

   jmp   v009_exit
   
INPUTLCTRL_UP:

   jmp   v009_exit

INPUTLCTRL_DOWN:

   jmp   v009_exit
      
INPUTRCTRL_UP:

   jmp   v009_exit

INPUTRCTRL_DOWN:

   jmp   v009_exit
   
v009_exit:
   mov   al,DEBUG   
   cmp   al,1
   je   @DEBUG_1
   mov   al,20h
   out   20h,al      ; End of interrupt
@DEBUG_1:
   popad
   iret            ;return
vec009   endp
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines