21,458
社区成员
发帖
与我相关
我的任务
分享
.model small
.code
dot8x11 db 11*11 dup('8x11.dot')
oldint1ch dd ?
count db 0
dark db ?
bright db ?
clkstr db 'hh:mm:ss',0
oldnumofwin dw ?
granularity dw ?
xoff = 0
yoff = 0
numofwin = 0 ;((yoff*640+xoff)>>16)*(64/granularity)
addr = 0 ;(yoff*640+xoff)&0x0000ffffL
;--------------------------------------------------------
getcolor:
xor ax,ax
mov si,ax ;max r+g+b
mov bl,al ;bl=color
mov cx,ax ;ch=bright cl=dark
dec ax
mov di,ax ;min r+g+b
xor ah,ah
$gc1:
xor bp,bp
mov dx,3c7h
mov al,bl
out dx,al ;color
mov dx,3c9h
in al,dx ;r
add bp,ax
in al,dx ;g
add bp,ax
in al,dx ;b
add bp,ax
cmp bp,si ;r+g+b > max r+g+b
jb $gc2
mov si,bp
mov ch,bl
jmp $nextcolor
$gc2:
cmp bp,di ;r+g+b < min r+g+b
jae $nextcolor
mov di,bp
mov cl,bl
$nextcolor:
inc bl
cmp bl,0
je $gcend
jmp $gc1
$gcend:
mov bright,ch
mov dark,cl
retn
;--------------------------------------------------------
getclkstr:
mov ah,2
int 1ah
mov al,dh ;ss
and al,0fh
or al,'0'
mov clkstr[7],al
mov al,dh
shr al,1
shr al,1
shr al,1
shr al,1
or al,'0'
mov clkstr[6],al
mov al,cl ;mm
and al,0fh
or al,'0'
mov clkstr[4],al
mov al,cl
shr al,1
shr al,1
shr al,1
shr al,1
or al,'0'
mov clkstr[3],al
mov al,ch ;hh
and al,0fh
or al,'0'
mov clkstr[1],al
mov al,ch
shr al,1
shr al,1
shr al,1
shr al,1
or al,'0'
mov clkstr[0],al
retn
;--------------------------------------------------------
showclkstr:
lea si,clkstr
mov dx,-1
$shnext:
inc dx ;char count
lodsb
cmp al,0
je $shend
sub al,'0'
mov bl,8*11
mul bl
mov bx,ax ;offset of dot
mov di,addr
mov ax,dx
shl ax,1
shl ax,1
shl ax,1
add di,ax ;addr+char_count*8
mov cx,11
$shchar:
push cx
mov cx,8
$shline:
mov al,dot8x11[bx]
cmp al,1
jne $sh0
mov al,bright
jmp $sh2
$sh0:
mov al,dark
$sh2:
stosb
inc bx
loop $shline
add di,640-8
pop cx
loop $shchar
jmp $shnext
$shend:
retn
;--------------------------------------------------------
getnumofwin:
mov ax,4f05h
mov bx,100h
int 10h
retn
;--------------------------------------------------------
setnumofwin:
mov ax,4f05h
mov bx,0
int 10h
retn
;--------------------------------------------------------
main:
mov ax,4f03h
int 10h
cmp ax,004fh
jne $mend ;not VESA
cmp bx,101h
jne $mend ;not 640x480x256 mode
push cs
pop ds
call getcolor
call getclkstr
call getnumofwin
mov oldnumofwin,dx
mov dx,numofwin
call setnumofwin
mov ax,0a000h
mov es,ax ;video buffer seg
call showclkstr
mov dx,oldnumofwin
call setnumofwin
$mend:
retn
;--------------------------------------------------------
int1ch:
cmp cs:count,18
je $into
inc cs:count
jmp cs:oldint1ch
$into:
mov cs:count,0
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
push bp
call main
pop bp
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
jmp cs:oldint1ch
;--------------------------------------------------------
db 'Copyright ZZ Inc.'
buf dw 128 dup(?)
start:
mov ax,4f01h
push cs
pop es
push cs
pop ds
lea di,buf
mov cx,101h
int 10h
mov bx,buf[4]
mov granularity,bx
mov ax,351ch
int 21h
mov word ptr cs:oldint1ch,bx
mov word ptr cs:oldint1ch+2,es
mov ax,251ch
push cs
pop ds
lea dx,int1ch
int 21h
lea dx,start
add dx,110h
shr dx,1
shr dx,1
shr dx,1
shr dx,1
mov ax,3100h
int 21h
;--------------------------------------------------------
end start