![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 18:19 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 显示256色bmp图片的汇编程序(带附件) |
| 可打印版本 2,204 / 6 |
| 第1楼 pick | 发表于 2006-06-19 16:14 |
| 新手上路 发帖 4 积分 16 | |
|
显示256色bmp图片的汇编程序(带附件) ;**************************************************************************************
; ; This Code Show a 256 Color bitmap file in 13h mode. Support negative ; coordinate and auto cut out. The 'Bitmap' function have there para: ; the pointer to bitmap file name, X coordinate and Y coordinate. The ; function can be called like this: ; ; push Y coordinate ; push X coordinate ; push offset ImageSrc ; call Bitmap ; ; Written By Nirvana ; email:[email protected] ; oicq :19820914 ;************************************************************************************** Stack Segment Stk db 65535 dup(?) Stack Ends Data Segment ImageBuffer db 65078 dup(?) ImageSrc db 'test.bmp',0 Eflag db ? OpenErrorMsg db 'open file error',24h Not256Color db 'Not a 256 color bitmap',24h handle dw ? Data Ends Code Segment Assume cs:Code,ds:Data,ss:Stack Start: mov ax,Data mov ds,ax mov di,-100 mov si,50 mov dx,offset ImageSrc push si push di push dx call Bitmap mov ax,0 int 16h mov ax,4c01h int 21h BitMap Proc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; =================== ; ; * Local Variable list * ; ; =================== ; ; ; ; (1) BmpWidth (:Word) ; ; (2) BmpOnScreenWidth (:Word) ; ; (3) BytePerRow (:Word) ; ; (4) LeftCutWidth (:Word) ; ; (5) BmpHeight (:Word) ; ; (6) BmpOnScreenHeight (:Word) ; ; (7) BytePerPixel (:Word) ; ; (8) PaletteOffset (:Word) ; ; (9) ImgDataOffset (:Word) ; ; (10) RowOffset (:Word) ; ; ; ; ; ;=========================================================================== push bp mov bp,sp sub sp,20 push ax push bx push cx push dx push si push di push es mov dx, mov ax,3d00h int 21h ;Open the bitmap file jnc OpenOk mov Eflag,0 Error: ;Show error message cmp Eflag,0 jz OpenError cmp Eflag,1 jz Not256 OpenError: mov dx,offset OpenErrorMsg jmp showtext Not256: mov dx,offset Not256Color jmp ShowText ShowText: mov ah,09h int 21h jmp exit OpenOk: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; Read first 4 byte of the file in order to get the file size ;;;;;;;;;;;; ; ; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; mov bx,ax ;; mov handle,bx ;; mov dx,offset ImageBuffer ;; mov cx,4 ;; mov ax,3f00h ;; int 21h ;Read the first 4 byte to memory ;; mov ax,3e00h ;; mov bx,handle ;; int 21h ;Close the bitmap file ;; ;; ;====================================================================================;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; Read The entire bitmap file to memory ;;;;;;;;;;;; ; ; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; mov si,2 ;; mov cx, ;Save the bitmap file entire size to CX Register ;; mov dx, ; ;; mov ax,3d00h ;; int 21h ;Open the bitmap file again ;; mov bx,ax ;; mov handle,bx ;; mov dx,offset ImageBuffer ;; mov ax,3f00h ;; int 21h ;Read the entire bitmap file to memory ;; mov ax,3e00h ;; mov bx,handle ;; int 21h ;Close the bitmap file ;; ;; ;====================================================================================;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; Save Information to local variable ;;;;;;;;;;;; ; ; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; mov si,012h ;; mov ax, ;; mov ,ax ;Save BmpWidth ;; mov ,ax ;Save BmpOnScreenWidth ;; mov ,ax ;Save BytePerRow ;; mov cl,4 ;; div cl ;; cmp ah,0 ;; jz NoDwAA ;No Dword align adjust ;; mov cl,4 ;; sub cl,ah ;; add ,cl ;; NoDwAA: ;; mov cx,0 ;; mov ,cx ;Save LeftCutWidth,Default = 0 ;; mov si,016h ;; mov ax, ;; mov ,ax ;Save BmpHeight ;; mov ,ax ;Save BmpOnScreenHeight ;; mov si,01ch ;; mov ax, ;; mov ,ax ;Save BitPerPixel ;; mov si,0eh ;; mov ax, ;Save bmpfileheader length ;; add ax,14 ;; mov ,ax ;Save PaletteOffset ;; mov si,0ah ;; mov ax, ;; mov ,ax ;Save ImgDataOffset ;; ;mov ,0 ;Save RowOffset ;; ;; ;====================================================================================;; ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> ; ; Seve the value to Local variable ; ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> jmp CoorDinateX exitzz: jmp exit CoordinateX: mov ax, ;X coordinate push ax and ah,80 pop ax jz PositiveX ;If X coordinate>=0,jump mov ax, push ax not ax inc ax mov ,ax ;Save LeftCutWidth pop ax add ax, ;X coordinate add BmpWidth jnc exitzz ;Exit if X coordinate add BmpWidth < 0 jz exitzz ;Exit if X coordinate add BmpWidth = 0 push ax mov cx,320 sub cx,ax mov ,cx ;Save RowOffset add ax, mov ,ax ;Save BmpOnScreenWidth + LeftCut pop ax mov cx,320 cmp cx,ax jnc NoWOverf ;No Width Overflow mov ax, add ax,320 mov ,ax ;Save BmpOnScreenWidth = 320 + LeftCutWidth mov ax,0 mov ,ax NoWOverf: mov ax,0 mov ,ax jmp CoordinateY PositiveX: cmp ax,320 jnc exitzz mov cx,320 sub cx, mov ,cx add ax, mov cx,320 cmp cx,ax jnc CoordinateY mov ax,320 sub ax, mov ,ax ;Save OnScreenWidth mov cx,320 sub cx,ax mov ,cx ;SaveRowOffset CoordinateY: mov ax, ;Y coordinate push ax and ah,80 pop ax jz PositiveY add ax, jnc exitzz1 jz exitzz1 mov ,ax ;Save BmpHeight mov ,ax ;Save OnScreenHeight mov cx,0 mov ,cx mov cx,200 cmp cx,ax jnc SetInt10 ;No Height Overflow mov cx,200 mov ,cx NoHOverf: jmp SetInt10 exitzz1: jmp exit PositiveY: cmp ax,200 jnc exitzz1 add ax, mov cx,200 cmp cx,ax jnc SetInt10 mov ax,200 sub ax, mov ,ax ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> ;************************************************************************************** ; ; Set the Palette register and copy image data to video buffer which ; address start at A000:0000. ; ;************************************************************************************** SetInt10: mov ax,013h int 10h ;Set Video Mode to 13h mov dx,03c6h mov ax,0ffh out dx,ax mov si, mov di,0 mov cx,256 SetPalette: mov dx,03c8h mov ax,di out dx,al mov dx,03c9h mov al,byte ptr push bx mov bl,63 mul bl mov bl,0ffh div bl pop bx out dx,al mov al,byte ptr push bx mov bl,63 mul bl mov bl,0ffh div bl pop bx out dx,al mov al,byte ptr push bx mov bl,63 mul bl mov bl,0ffh div bl pop bx out dx,al add si,4 inc di loop SetPalette Showbmp: mov ax,0a000h ;Video memory start address mov es,ax mov ax, mov cx,320 mul cx add ax, mov di,ax vertical: cmp word ptr,0 jz exit dec word ptr dec word ptr mov ax, mul word ptr mov bx,ax add bx, mov si,0 add si, horizon: cmp si,word ptr jz horizonend mov al, mov es:,al inc si inc di jmp horizon horizonend: add di, jmp Vertical ;************************************************************************************** exit: pop es pop di pop si pop dx pop cx pop bx pop ax add sp,20 pop bp ret 6 Bitmap endp Code Ends End Start [ Last edited by pick on 2006-6-19 at 16:16 ] 附件 bitmap.rar (31.04 KiB) |
|
| 第2楼 070 | 发表于 2006-06-19 18:27 |
| 高级用户 发帖 218 积分 663 来自 福建 | |
|
没办法退出
|
|
| 第3楼 6622186 | 发表于 2007-05-17 21:53 |
| 高级用户 发帖 411 积分 894 | |
|
这是源码?
|
|
| 第4楼 6622186 | 发表于 2007-05-17 22:02 |
| 高级用户 发帖 411 积分 894 | |
|
不懂汇编语言
|
|
| 第5楼 henrya2 | 发表于 2007-05-22 17:36 |
| 中级用户 发帖 171 积分 486 | |
|
在那里找到的,还是你自己写的?
|
|
| 第6楼 netwinxp | 发表于 2007-07-25 23:07 |
| 高级用户 发帖 366 积分 741 | |
|
只支持320x200及以下的图片,没有多大价值
|
|
| 第7楼 mendianbo | 发表于 2007-07-27 18:56 |
| 初级用户 发帖 6 积分 21 | |
|
DJGPP + ALEGRO可实现dos下显示位图。
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |