;---------------------------------------------------------------------
; 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