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
|