|
|
View Message | Back to Messages |
rel Tue Mar 21 2006 at 10:12 am yo plaz need help(asm)
can you tell me why this crashes? It loads the BMP anbd sets the pal but stays as is.
[code]
;************************************* ****************************
; 8 bit bmp loader
; Assemble with TASM
; TASM loadbmp.ASM
; Tlink loadbmp.Obj
;
; Http://Rel.Betterwebber.com
;*********************************** ******************************
.Model medium
.Stack 200h ;512 bytes of stack
.386 ;don't tell you're still using a 286
BMPHeaderType struc
ID dw ? ;BM
FileSize dd ? ;Wid*Hei+Header
Reserved1 dw ?
Reserved2 dw ?
OffBits dd ? ;1078
HSize dd ?
Wid dd ?
Hei dd ?
Planes dw ? ;1
Bpp dw ? ;8
Compression dd ? ;0
SizeImage dd ? ;W*H
Xres dd ? ;3790
Yres dd ? ;ditto
ClrUsed dd ?
ClrImportant dd ?
BMPHeaderType ends
;Pal'Order=Blue*4, Green*4, Red*4, 0 * 4
.data
BmpHeader BmpHeaderType <>
Bytes db ?
filename db "crystal.bmp"
pal db 769 dup(0)
x dw 10
y dw 10
SwitchPal dw 1
.Code ;start code seg
;************************************* ****************************
PrintChar Macro aschar
pusha
mov al, aschar
mov ah, 0ah
mov bh, 00
mov cx, 1
int 10h
popa
EndM PrintChar
;************************************* ****************************
;reads the keyboad buffer
Input Macro
;needs ax to be unused
;returns in AH the scancode
;returns in AL the asciicode
mov ah, 10h ; check for input
int 16h
EndM Input
ReadByte MACRO ByteToRead
push ax
push cx
push dx
mov dx, Offset ByteToRead
mov ax, @data
mov ds, ax
mov cx,1
mov ah, 3fh
int 21h
pop dx
pop cx
pop ax
EndM ReadByte
LoadBmp Proc
Local Hite: Word
Local DSSave: Word
Mov ax,0a000h ;Vga seg
mov es, ax ;for blitting
Mov ax, Y ;calc offset
xchg al,ah ;*256
mov di,ax ;save
shr di,2 ;256/4=64
add di,ax ;64+256=320
add di,x ;offset=Y*320+X
;;
;; Int 21h
;; ah = 3dh
;; al = 0 for read only
;; DS:DX=Filename
mov ax, @data
mov ds, ax ;for filename
mov fs, ax ;for pal
mov dx, offset filename
mov ah,3dh
xor al,al
int 21h
jc @CheckError ;carry flag set so error error in AX!!!
;;
;; Return: AX=FileHandle(should be moved to BX)
;;3fh=Read bytes
;;Bx=Handle
;;cx=Bytes to read
;;dx=Offset where to put 'em. Variable or Array
mov bx,ax ;Int 21h needs BX instead of AX
;mov ax, seg BmpHeader
;mov ds, ax
mov dx, offset BmpHeader ;Offset
mov cx, Size BmpHeader ;ByteLength
mov ah,3fh
xor al,al
Int 21h
jc @CheckError ;carry flag set so error error in AX!!!
;offset now in Pal
;;;
;;;Check for validity of file
cmp BmpHeader.Id, 19778 ;"BM"
jne @BmpNotSupported
cmp BmpHeader.Planes,1
jne @BmpNotSupported
cmp BmpHeader.Bpp, 8 ;Only screen 13
jne @BmpNotSupported
cmp BmpHeader.Compression,0 ;should be 0
jne @BmpNotSupported
;;;;
;;;;Load Pal
mov cx,256 ;256 colors 8Bpp
mov si, offset Pal
@BmpLoadPal:
ReadByte Bytes
jc @CheckError
;;;;BLUE
mov al, Bytes
shr al,2 ;div by 4
mov fs:[si+2],al
;;;;GREEN
ReadByte Bytes
jc @CheckError
mov al, Bytes
shr al,2 ;div by 4
mov fs:[si+1],al
;;;;RED
ReadByte Bytes
jc @CheckError
mov al, Bytes
shr al,2 ;div by 4
mov fs:[si],al
ReadByte Bytes ;Padding
jc @CheckError
add si,3
dec cx
jnz @BmpLoadPal
;;;Switch Pal
Cmp SwitchPal,0
jne @BMPSwitchPal
@PostBMPSwitchPal:
;;
Mov ecx,BmpHeader.Wid
mov eax,ecx
and eax,3
jz @MulOfFour
sub ecx,eax ;make it a multiple of four
add ecx,4 ;make up for lost pixels
@MulOfFour:
mov BmpHeader.Wid,ecx
;;
;;;
;; calc start offset
;; BMP's are stored backwards (nasty developers)
mov eax,BmpHeader.Hei
dec ax
xchg ah,al ;H*256
mov cx,ax ;save
shr cx,2 ;256/4=64
add cx,ax ;64+256=320
add di,cx ;Ylayer offset+ BmpHeight
mov ecx,BmpHeader.Hei ;loop counter
Mov Hite,cx
@BmpYloop:
Mov DSSave, Ds
;;
;; Ds:si=Layer for direct from file write
;; ECX=Wid of one scanline
Mov ecx, BmpHeader.Wid
Mov ax,es ;layer
mov ds,ax ;fileseg
mov dx,di ;layer offset
mov ah, 3fh ;read
int 21h
jc @CheckError
mov ds,DsSave
sub di,320 ;next scanline
dec Hite
Jnz @BmpYLoop
mov ah, 3eh ;Close file
int 21h
xor ax, ax ;No error
jmp @exitLoadBmp
@BmpNotSupported:
mov ah, 3eh
int 21h
mov ax, 1 ;Unknown ver
@ExitLoadBmp:
ret
;/=======Subs======
@BMPSwitchPal:
;;;
;;;Fs:si PalSeg:PalOff
;;;Out =Dx:Port Addy, al color
;;; 3c8h=port WriteMode
;;; 3c9h=Dac
mov ax, @data
mov fs,ax
mov si, offset pal
xor cx,cx ;start from zero
@BmpColorLoop:
mov dx, 3c8h
mov ax, cx
xor ah, ah
out dx, al ;color index
;;;;
;;;;RED
mov dx, 3c9h
mov al, fs:[si]
out dx, al
;;;;
;;;;GREEN
mov dx, 3c9h
mov al, fs:[si+1]
out dx, al
;;;;
;;;;BLUE
mov dx, 3c9h
mov al, fs:[si+2]
out dx, al
add si,3 ;next 3 colors
inc cx
cmp cx,256
jne @BmpColorLoop
Jmp @PostBmpSwitchPal
@CheckError:
mov ah, 3eh ;Close File
int 21h
or ax,ax
jnz @ExitLoadBmp
Mov ax,255 ;unknown error
Jmp @ExitLoadBmp
LoadBmp Endp
;************************************* ****************************
;Initializes the screen to VGA 320x200x256
init13h proc
mov ax, 0a000h ;load VGA segment(can't load
;directly to segment registers
mov es, ax ; es now points to the vga
mov ah, 00h ; set video mode
mov al, 13h ; mode 13h
int 10h ; we are now in 320x200x256
ret
init13h endp
;************************************* ****************************
textmode proc
mov ah, 00h ;set video mode
mov al, 03h ;mode 03h
int 10h ;enter 80x25x16 mode
ret
textmode endp
;************************************* ****************************
;this waits for screen retrace/refresh or our demo being in ASM
;would as fast as an x-wing on steroids. :*)
waitretrace proc
mov dx,03dah ;0x3da9 vertical retrace port
wret:
in al,dx
and al,08h ; is vga in retrace?
jnz wret
wref:
in al,dx
and al,08h ;is retrace finished?
jz wref
ret
waitretrace endp
;************************************* ****************************
;************************************* ****************************
;************************************* ****************************
zzzzzzztart: ;too much pocket books
call init13h ;set to 320*200*256
Mov ax,0a000h ;Vga seg
mov es, ax ;for blitting
Mov ax,@data
mov ds, ax ;data seg
mov fs, ax
call loadbmp
input
mov ah, 4ch
mov al, 00h
int 21h ; return to dos
END zzzzzzztart
[/code]
|
|