用来在MEOS里抓取屏幕,不过这个版本并不完善。

在这个版本里,程序所用的方法是扫描屏幕上的点然后再写到缓存最后写到文件,这样就会导致速度很慢。

BMP格式文档可以去我的网络硬盘下载http://osdev.ys168.com

;=======================================

;    HotCats

;    Ver : 0.1

;    BLOG: http://hotheart.go.3322.org

;=======================================

bits 32

org    0x0

db 'MENUET01' ; 8 byte id

dd 0x01                        ; header version

dd START                        ; start of code

dd I_END                        ; size of image

dd 0x300000                    ; memory for app

dd 0xffff                        ; esp

dd 0x0 , 0x0                    ; I_Param , I_Icon

START:                                ; start of execution

mov eax,14                    ; 获取屏幕分辨率

int 0x40

xor ebx,ebx

mov bx,ax

shr eax,16

inc eax ; X size

inc ebx ; Y size

mov [scr_x],eax

mov [scr_y],ebx

mov [img_w],eax

mov [img_h],ebx

imul ebx

imul eax,3                    ; image data size

mov [img_s],eax

add eax,0x36                ; BMP header size

mov [imgf_s],eax

mov [f_s],eax

mov esi,bminfo                ; fill the header

mov edi,filestart

mov ecx,0x36/4

cld

repz movsd

call draw_window                ; draw the window

still:

mov eax,10                    ; wait here for event

int 0x40

cmp eax,1                    ; redraw request ?

je red

cmp eax,2                    ; key in buffer ?

je key

cmp eax,3                    ; button in buffer ?

je button

jmp still

red:                                ; redraw

call draw_window

jmp still

key:                                ; key

mov eax,2                    ; just read it and ignore

int 0x40

jmp still

button:                            ; button

mov eax,17                    ; get id

int 0x40

cmp ah,1                    ; button id=1 ?

jne .cmdcap

mov eax,-1                    ; close this program

int 0x40

.cmdcap:

cmp ah,cmdcap                ; is the Capture button ?

jne .cmdsave

call capall                    ; capture the whole screen

jmp still

.cmdsave:

cmp ah,cmdsave                ; is the save button

jne .end

call savefile                ; save the file

jmp still

.end:

jmp still

;   *********************************************

;   *******  WINDOW DEFINITIONS AND DRAW ********

;   *********************************************

draw_window:

mov eax,12                    ; function 12:tell os about windowdraw

mov ebx,1                    ; 1, start of draw

int 0x40

; DRAW WINDOW

mov eax,0

mov ebx,[scr_x]

sub ebx,win_w+5

imul ebx,65536

add ebx,win_w

mov ecx,[scr_y]

sub ecx,win_h+25

imul ecx,65536

add ecx,win_h

mov edx,0x03ffffff

mov esi,0x40ffffff

mov edi,0x00ffffff

int 0x40

; WINDOW LABEL

mov eax,4                    ; function 4 : write text to window

mov ebx,8*65536+8            ; [x start] *65536 + [y start]

mov ecx,0x10ddeeff            ; font 1 & color ( 0xF0RRGGBB )

mov edx,labelt                ; pointer to text beginning

mov esi,labellen-labelt        ; text length

int 0x40

; Button Capture

mov eax,8

mov ebx,10*65536+40

mov ecx,(win_h-10-14)*65536+14

mov edx,cmdcap

mov esi,0xaabbcc

int 0x40

; Button Save

mov eax,8

mov ebx,(10+40+10)*65536+40

mov ecx,(win_h-10-14)*65536+14

mov edx,cmdsave

mov esi,0xaabbcc

int 0x40

; Button Text

mov eax,4                        ; function 4 : write text to window

mov ebx,18*65536+(win_h-10-14+4); [x start] *65536 + [y start]

mov ecx,0x00444444                ; font 1 & color ( 0xF0RRGGBB )

mov edx,btext                    ; pointer to text beginning

mov esi,btexte-btext            ; text length

int 0x40

mov eax,12                    ; function 12:tell os about windowdraw

mov ebx,2                    ; 2, end of draw

int 0x40

ret

mov eax,47                    ; display the screen size

mov ebx,4*65536

mov ecx,[scr_x]

mov edx,120*65536+30

mov esi,0x0

int 0x40

mov eax,47

mov ebx,4*65536

mov ecx,[scr_y]

mov edx,120*65536+40

mov esi,0x0

int 0x40

capall:

mov edi,imgarea

mov ecx,[scr_y]

cld

.nextline:

mov ebx,ecx

dec ebx

imul ebx,[scr_x]

push ecx

mov ecx,[scr_x]

.capline:

push edi

push ebx

mov eax,35                    ; get pixel

int 0x40

stosd

pop ebx

pop edi

inc ebx

add edi,3

loop .capline

pop ecx

loop .nextline

.end:

ret

savefile:                            ; save the file

mov eax,58

mov ebx,fileinfo

int 0x40

ret

; DATA AREA

win_w        equ 250

win_h        equ 50

cmdcap        equ 2

cmdsave        equ 3

filestart    equ 0x20000

imgarea        equ filestart+0x36

scr_x    dd 0

scr_y    dd 0

zoom    dd 2

fileinfo:

dd 1                    ; 1=WRITE

dd 0x0                    ; not used

f_s  dd 800*600*3+0x36        ; bytes to write

dd filestart            ; source data pointer

dd 0x10000                ; work area for os - 16384 bytes

db '/HD/1/TEST.BMP',0    ; ASCIIZ dir & filename

btext:  db ' Cat     Save  '

btexte:

labelt:

db 'HotCats 0.1 - HotHeart HotWorks 2005'

labellen:

bminfo:

db 'BM' ; 0000-0001 位图标志

imgf_s    dd 800*600*3+0x36    ; 0002-0005 文件大小

dd 0x0                ; 0006-0009 保留

db 0x36,0x0,0x0,0x0; 000A-000D 文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)

dd 0x28            ; 000E-0011 图像描述信息块的大小,常为28H。

img_w    dd 800                ; 0012-0015    图像宽度。

img_h    dd 600                ; 0016-0019    图像高度。

dw 0x1                ; 001A-001B    图像的plane总数(恒为1)。

dw 24                ; 001C-001D    数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。

dd 0                ; 001E-0021    记录像素的位数,很重要的数值,图像的颜色数由该值决定。

img_s    dd 800*600*3        ; 0022-0025    图像区数据的大小。

dd 0x0                ; 0026-0029    水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。

dd 0x0                ; 002A-002D    垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。

dd 0x0                ; 002E-0031    此图像所用的颜色数,如值为0,表示所有颜色一样重要。

dd 0x0                ; 0032-0035 未用

I_END: