k.yar
k.yar

Reputation: 21

how to get mouse position in assembly (TASM)

i try to do a calculator in assembly (TASM) and for this i need to get the mouse position (Location). i see in anther question that someone wrote that the horizonal position (x) is in cx and the vertical position (y) is in dx but when i Running my software i dont see difference between 2 mouse position (in cx and dx). someone know why? and another question - how i Determines Location of text? thank you

this is the code:

IDEAL
MODEL small
STACK 1000h
DATASEG

; --------------------------
; Your variables here

;black dw 0
color1 db 12
    ;1-blue ,2-green ,3-azure ,4-red ,5-pink ,6-orange ,7-white ,8-gray ,9-purple
filename db 'test.bmp',0
filehandle dw ?
Header db 54 dup (0)
Palette db 256*4 dup (0)
ScrLine db 320 dup (0)
ErrorMsg db 'Error', 13, 10,'$'

; --------------------------
CODESEG
proc OpenFile
; Open file
mov ah, 3Dh
xor al, al
mov dx, offset filename
int 21h
jc openerror
mov [filehandle], ax

ret
openerror:
mov dx, offset ErrorMsg
mov ah, 9h
int 21h
ret
endp OpenFile

proc ReadHeader
; Read  BMP file header, 54 bytes
mov ah,3fh
mov bx, [filehandle]
mov cx,54
mov dx,offset Header
int 21h
ret
endp ReadHeader

proc ReadPalette
; Read BMP file color palette, 256 colors * 4 bytes (400h)
mov ah,3fh
mov cx,400h
mov dx,offset Palette
int 21h
ret
endp ReadPalette

proc CopyPal
; Copy the colors palette to the video memory registers
; The number of the first color should be sent to port 3C8h
; The palette is sent to port 3C9h
mov si,offset Palette
mov cx,256
mov dx,3C8h
mov al,0
; Copy starting color to port 3C8h
out dx,al
; Copy palette itself to port 3C9h
inc dx
PalLoop:
; Note: Colors in a BMP file are saved as BGR values rather than RGB.
mov al,[si+2] ; Get red value.
shr al,2 ; Max. is 255, but video palette maximal
; value is 63. Therefore dividing by 4.
out dx,al ; Send it.
mov al,[si+1] ; Get green value.
shr al,2
out dx,al ; Send it.
mov al,[si] ; Get blue value.
shr al,2
out dx,al ; Send it.
add si,4 ; Point to next color.
; (There is a null chr. after every color.)

loop PalLoop
ret
endp CopyPal

proc CopyBitmap
; BMP graphics are saved upside-down.
; Read the graphic line by line (200 lines in VGA format),
; displaying the lines from bottom to top.
mov ax, 0A000h
mov es, ax
mov cx,200
PrintBMPLoop:
push cx
; di = cx*320, point to the correct screen line
mov di,cx
shl cx,6
shl di,8
add di,cx
; Read one line
mov ah,3fh
mov cx,320
mov dx,offset ScrLine
int 21h
; Copy one line into video memory
cld ; Clear direction flag, for movsb
mov cx,320
mov si,offset ScrLine

rep movsb ; Copy line to the screen
;rep movsb is same as the following code:
;mov es:di, ds:si
;inc si
;inc di
;dec cx
;loop until cx=0
pop cx
loop PrintBMPLoop
ret
endp CopyBitmap

;----------------------------------------
start:
    mov ax, @data
    mov ds, ax
; --------------------------
; Your code here
; -----------------------
; Graphic mode
mov ax, 13h
int 10h
; Process BMP file
call OpenFile
call ReadHeader
call ReadPalette
call CopyPal
call CopyBitmap

;Show mouse
mov ax,1h
int 33h
;mov ax, 0003h
;int 33h
; Loop until mouse click
MouseLP:
mov ax,3h
int 33h
cmp bx, 01h ; check left mouse click
mov ax, 0003h
int 33h
jne MouseLP

; Press any key to continue
mov ah,00h
int 16h
; Text mode
mov ax,3h
int 10h
    ; return to text mode
    ;mov ah, 0
    ;mov al, 2
    ;int 10h


exit:

mov ax, 4c00h
int 21h
END start

Upvotes: 1

Views: 2992

Answers (1)

Sep Roland
Sep Roland

Reputation: 39166

You should never presume that the mouse is available! Under emulators it often isn't.

Prudent programmers first check if the interrupt vector 33h points to somewhere and then reset the mouse driver using function AX=0000h.

  ...
  mov  ax, 0000h  ; reset mouse
  int  33h        ; -> AX BX
  cmp  ax, FFFFh
  jne  NoMouse
  mov  ax, 0001h  ; show mouse
  int  33h
MouseLP:
  mov  ax, 0003h  ; get mouse position and buttonstatus
  int  33h        ; -> BX CX DX
  test bx, 1      ; check left mouse click
  jz   MouseLP    ; Loop until mouse click
  ...

Here you can start using the X and Y positions from CX and DX.

Beware: eventhough you're working on a 320x200 screen the mouse coords are returned relative 640x200. You need to adjust the X position by writing shr cx, 1.

Upvotes: 2

Related Questions