| 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
 |