Load Bitmaps (16-bit ASM)
Bitmap loading source code
;--------------------------------------------------------------------- ; Programmed by GLEN QUINN 1998 ; TO BE USED FOR EDUCATIONAL PURPOSES OR WHAT EVER ; THIS SOURCE CODE CAN BE CHANGED TO SUIT THE NEEDS OF PEOPLE ; CAN RUN ON A 16-bit machine ; COMPILE USE TASM with the /ml option ; The resulting executabile file takes up about 1KB (small eh) ; From the people of TORONTO Canada, I am going back over to that ; great place again!! ;--------------------------------------------------------------------- .model small .stack 100h _DATA segment word public 'DATA' filename db 'C:\bmp\UNITS.BMP',0 ; insert the name and location GLEN db 'Programmed by Glen Quinn, BINARY SOFTWARE' ; of the bitmap here db '$' handle dw ? ; handle is used to store the file pointer X dw ? ; X and Y is used to fill the screen with pixels Y dw ? col db 640 dup(?) ; col is used as a buffer to do a screen line ; at a time buff dw 0 dw 0 dw 0 dw 0 multi dw 6 dw 4 dw 0 dw 0 num dw 0 y dw 409 ; y is used to store where the banks break up dw 408 dw 307 dw 306 dw 204 dw 203 dw 102 dw 101 BMPHEAD struc ; This is the bitmap structure id db 2 dup(?) filesize dw 2 dup(?) reserved dw 2 dup(?) headersize dw 2 dup(?) infosize dw 2 dup(?) width dw 2 dup(?) depth dw 2 dup(?) biplanes dw ? bits dw ? bicomp dw 2 dup(?) bisizeim dw 2 dup(?) bixpels dw 2 dup(?) biypels dw 2 dup(?) biclrused dw 2 dup(?) biclrimp dw 2 dup(?) BMPHEAD ends RGBQUAD struc ; This is how the bitmap stores its colours blue db ? green db ? red db ? fill db ? RGBQUAD ends params BMPHEAD <> ; assigning the structures to these values param RGBQUAD <> _DATA ends .code start: mov ax,@data ; moving all data into required memory position mov ds,ax call loadbmp ; calls a procedure called loadbmp mov ah,00h ; waits for a key to be pressed int 16h mov ah,00h ; changes the video mode to the normal setting mov al,02h int 10h mov ah,09h ; Prints out a message on the screen mov dx,offset GLEN int 21h mov ah,4ch ; ends the program mov al,0 int 21h putpixel proc near ; this procedure is for putting a single pixel any ; where on the display plane ; The linear address of the display plane is=y*640+x mov ax,Y ; calculating linear=y*640 in 16-bit mul multi mov buff,ax ; first 16-bit calculation mov ax,100 mul buff mov buff,ax mov buff+2,dx mov ax,Y ; secound 16-bit calculation mul multi+2 mov buff+4,ax mov ax,10 mul buff+4 mov buff+4,ax mov buff+6,dx mov ax,buff ; now adding the two 16-bit values add ax,buff+4 mov buff,ax mov ax,buff+2 adc ax,buff+6 mov buff+2,ax mov ax,X ; now adding x to the expression add buff,ax adc buff+2,0 ; expression is now lin=y*640+x mov ax,buff mov dx,buff+2 mov cx,16 ; calculating bank number F1: sar dx,1 rcr ax,1 loop F1 mov num,ax mov ax,y ; testing each of the bank boundaries cmp ax,Y je pass mov ax,y+2 cmp ax,Y je pass mov ax,y+4 cmp ax,Y je pass mov ax,y+6 cmp ax,Y je pass mov ax,y+8 cmp ax,Y je pass mov ax,y+10 cmp ax,Y je pass mov ax,y+12 cmp ax,Y je pass mov ax,y+14 cmp ax,Y jne bypass pass: mov ah,4fh ; adjusting the bank mov al,05h mov bh,00h mov bl,00h mov dx,num int 10h bypass: mov ax,0A000h ;writing a single pixel to the display mov es,ax mov ax,buff mov di,ax mov al,[si] stosb ; writing pixel ends inc si ret endp loadbmp proc near ;this procedure is for loading in the bitmap mov ah,4fh ; set mode to SVGA (101h i.e 640X480 in 256 colours mov al,02h mov bx,101h int 10h mov ah,4fh mov al,05h mov bh,00h mov bl,00h mov dx,4 int 10h mov ah,3dh ; file open mov al,00 mov dx,offset filename int 21h ; file open end mov handle,ax mov ah,3fh ; file read mov bx,handle mov cx,54 mov dx,offset params int 21h ; file read end mov col,0 ; reading in the palette G1: mov ah,3fh mov bx,handle mov cx,4 mov dx,offset param int 21h mov al,col mov dx,3c8h out dx,al mov al,param.red shr al,2 mov dx,3c9h out dx,al mov al,param.green shr al,2 out dx,al mov al,param.blue shr al,2 out dx,al cmp col,255 inc col jne G1 ; palette read ends mov Y,479 mov X,0 A1: mov ah,3fh ; file read mov bx,handle mov cx,640 mov dx,offset col int 21h ; file read end ; writing a single pixel to the display in SVGA mov si,offset col A2: call putpixel inc X cmp X,640 jne A2 mov X,0 dec Y cmp Y,-1 jne A1 mov ah,3eh mov bx,handle int 21h ret loadbmp endp end start
Related Tutorials
Balancing Game Development and Creative Direction in Indie Production
A practical look at how indie developers can balance creative direction with hands-on game development. This article co…
My Unreal Engine Development Process: From Core Idea to Playable Build
A practical overview of my Unreal Engine development process, covering how I move from a core game idea to a playable b…
Introducing LaneGraph: The Ultimate Road Network Solution for Unity
Discover the power of LaneGraph, a lightweight and flexible lane-based navigation system for Unity. LaneGraph makes it…
Retargeting Mixamo Characters with Root Motion In Unreal Engine 5.4.
I have always found Retargeting Mixamo Characters To have Root Motion is a serious lengthy Tast, Recently I stumbled up…
How To Make A SIMPLE Main Menu In Unity
In this tutorial for unity, i go over how to make a simple main menu for unity, it's an unlisted video because i do not…
Guide to Gameplay Balance
A perspective on competitive gameplay balance, from a background of "shooter" sandbox design.
Discussion
More from Glen Quinn
Comparing Shadow Mapping Techniques with Shadow Explorer
New Incentives and a Whole New Platform From The Intel AppUp developer program
The final installment in this series on Intel's AppUp program details additional incentives and opportunities for devel…
The Game Maker
This book excerpt contains the first chapter of the book that introduces beginning game developers to the Game Maker pr…
Discussion