Moustap
21-01-2014, 23:25
Код разделен на три части: 1). void setpointer()
2). void clock_p_s
3). void retpointer().
Что делается в каждой из частей?
_TEXT segment byte public 'CODE'
_TEXT ends
DGROUP group _DATA,_BSS
assume cs:_TEXT,ds:DGROUP
_DATA segment word public 'DATA'
_off_1ch equ 1ch*4
_maskf db 7
_position dw 0
_DATA ends
_BSS segment word public 'BSS'
_oldoffset1c dw ?
_oldsegemnt1c dw ?
_BSS ends
_DATA segment word public 'DATA'
_counttakts dw 0
_timeend dw 20
_oldsec dw 0
_DATA ends
_TEXT segment byte public 'CODE'
; ************************************************************************
; void setpointer()
; ************************************************************************
assume cs:_TEXT
@setpointer$qv proc near
cli
mov ax,0
mov es,ax ;таблица находится в 0м сегменте
mov bx,_off_1ch ;засылаем в bx смещение
mov ax,[es:bx] ;засылаем в аккумулятор значение по ардесу es:bx смещение
;(первые 2 байта адреса системного обработчика)
mov _oldoffset1c,ax ;засылаем в oldoffset1c cмещение ...
mov ax,[es:bx+2] ;аналогично, только сегмент
mov _oldsegemnt1c, ax
;записать новый вектор в таблицу векторов прерываний
mov ax, offset @clock_p_s$qv;смещение нового обработчика в ax
mov bx,_off_1ch
mov [es:bx],ax
push cs
pop ax ;настройка ax на cs
mov [es:bx+2],ax ;запись сегмента
mov ax, 0b800h
mov es, ax
mov cx, 3838
mov ax,32+7*256
m0:
mov bx, cx
mov [es:bx],ax
dec cx
loop m0
sti
ret
@setpointer$qv endp
; ************************************************************************
; void clock_p_s()
; ************************************************************************
assume cs:_TEXT
@clock_p_s$qv proc near
;сохранение в стеке используемых регистров
push ax
push bx
push dx ;dx портит imul и idiv
push es
push ds
; настройка ds на cs
push cs
pop ds
inc _counttakts ;инкремент counttakts
mov ax,_counttakts
mov dx,10
imul dx
mov bx,182
idiv bx
cmp ax,_oldsec
jz endprog
mov _oldsec,ax
sub ax,_timeout
jl endprog
dec _timeend
mov ax,2Ah
;запись в es адреса начала видеопамяти - B800:0000
mov bx, 0b800h
mov es, bx
mov bx, _position ;позицию на экране - в bx
mov ah, _maskf ;маску вывода - в ah
mov es:[bx],ax ;вывод символа в центр экрана
;восстановление используемых регистров:
inc _position
inc _position
endprog:
pop ds
pop es
pop dx
pop bx
pop ax
iret
@clock_p_s$qv endp
; ************************************************************************
; void retpointer()
; ************************************************************************
assume cs:_TEXT
@retpointer$qv proc near
cli
;восстановление вектора прерывания от таймера
;запрет аппаратных прерываний
xor ax, ax ;снова настройка es на начало таблицы
mov es, ax ;векторов прерываний
mov ax, _oldoffset1c ;запись в таблицу смещения старого
mov bx,_off_1ch
mov [es:bx],ax ;обработчика прерывания от таймера
mov ax,_oldsegemnt1c ;запись сегмента
mov [es:bx+2], ax
sti ;разрешение аппаратных прерываний
ret
@retpointer$qv endp
_TEXT ends
_DATA segment word public 'DATA'
_DATA ends
_TEXT segment byte public 'CODE'
_TEXT ends
public @clock_p_s$qv
public @retpointer$qv
public @setpointer$qv
extrn _timeout:word
public _oldsec
public _timeend
public _counttakts
public _oldsegemnt1c
public _oldoffset1c
public _position
public _maskf
public _off_1ch
end
2). void clock_p_s
3). void retpointer().
Что делается в каждой из частей?
_TEXT segment byte public 'CODE'
_TEXT ends
DGROUP group _DATA,_BSS
assume cs:_TEXT,ds:DGROUP
_DATA segment word public 'DATA'
_off_1ch equ 1ch*4
_maskf db 7
_position dw 0
_DATA ends
_BSS segment word public 'BSS'
_oldoffset1c dw ?
_oldsegemnt1c dw ?
_BSS ends
_DATA segment word public 'DATA'
_counttakts dw 0
_timeend dw 20
_oldsec dw 0
_DATA ends
_TEXT segment byte public 'CODE'
; ************************************************************************
; void setpointer()
; ************************************************************************
assume cs:_TEXT
@setpointer$qv proc near
cli
mov ax,0
mov es,ax ;таблица находится в 0м сегменте
mov bx,_off_1ch ;засылаем в bx смещение
mov ax,[es:bx] ;засылаем в аккумулятор значение по ардесу es:bx смещение
;(первые 2 байта адреса системного обработчика)
mov _oldoffset1c,ax ;засылаем в oldoffset1c cмещение ...
mov ax,[es:bx+2] ;аналогично, только сегмент
mov _oldsegemnt1c, ax
;записать новый вектор в таблицу векторов прерываний
mov ax, offset @clock_p_s$qv;смещение нового обработчика в ax
mov bx,_off_1ch
mov [es:bx],ax
push cs
pop ax ;настройка ax на cs
mov [es:bx+2],ax ;запись сегмента
mov ax, 0b800h
mov es, ax
mov cx, 3838
mov ax,32+7*256
m0:
mov bx, cx
mov [es:bx],ax
dec cx
loop m0
sti
ret
@setpointer$qv endp
; ************************************************************************
; void clock_p_s()
; ************************************************************************
assume cs:_TEXT
@clock_p_s$qv proc near
;сохранение в стеке используемых регистров
push ax
push bx
push dx ;dx портит imul и idiv
push es
push ds
; настройка ds на cs
push cs
pop ds
inc _counttakts ;инкремент counttakts
mov ax,_counttakts
mov dx,10
imul dx
mov bx,182
idiv bx
cmp ax,_oldsec
jz endprog
mov _oldsec,ax
sub ax,_timeout
jl endprog
dec _timeend
mov ax,2Ah
;запись в es адреса начала видеопамяти - B800:0000
mov bx, 0b800h
mov es, bx
mov bx, _position ;позицию на экране - в bx
mov ah, _maskf ;маску вывода - в ah
mov es:[bx],ax ;вывод символа в центр экрана
;восстановление используемых регистров:
inc _position
inc _position
endprog:
pop ds
pop es
pop dx
pop bx
pop ax
iret
@clock_p_s$qv endp
; ************************************************************************
; void retpointer()
; ************************************************************************
assume cs:_TEXT
@retpointer$qv proc near
cli
;восстановление вектора прерывания от таймера
;запрет аппаратных прерываний
xor ax, ax ;снова настройка es на начало таблицы
mov es, ax ;векторов прерываний
mov ax, _oldoffset1c ;запись в таблицу смещения старого
mov bx,_off_1ch
mov [es:bx],ax ;обработчика прерывания от таймера
mov ax,_oldsegemnt1c ;запись сегмента
mov [es:bx+2], ax
sti ;разрешение аппаратных прерываний
ret
@retpointer$qv endp
_TEXT ends
_DATA segment word public 'DATA'
_DATA ends
_TEXT segment byte public 'CODE'
_TEXT ends
public @clock_p_s$qv
public @retpointer$qv
public @setpointer$qv
extrn _timeout:word
public _oldsec
public _timeend
public _counttakts
public _oldsegemnt1c
public _oldoffset1c
public _position
public _maskf
public _off_1ch
end