Графика и мышь в Turboc + Ассемблер

  • Автор темы XIII
  • Дата начала
Статус
Закрыто для дальнейших ответов.
X

XIII

#1
Здравствуйте.

Компилятор Turbo C 3.1 и встроенный ассемблер.

В программе необходимо использовать стандартные функции для работы с графикой [line, arc, rectangle и пр.] и в то же время работать с мышью [ничего другого, как написать обработчик на ассемблере, в голову не пришло].

При вызове этих функций выводится сообщение о том, что неинициализирован графический режим.
Если просто заменить SetVideoMode на initgraph, то курсор мыши отображается неверно, т.е. разноцветным квадратом.

Подскажите, пожалуйста, как можно заменить функцию SetVideoMode на initgraph [функция из graphics.h] или какие изменения в ассемблерном коде необходимо сделать для того, чтобы курсор мыши отображался корректно.

Файл main.c
Код:
#include <stdio.h>
#include "mouse.cpp"
#include <graphics.h>

int DoneFlag;

CursorShape new_cursor = {
0x0FFF, 0x07FF, 0x01FF, 0x007F, 0x801F, 0xC007,
0xC001, 0xE000, 0xE0FF, 0xF0FF, 0xF0FF, 0xF5FF,
0xF8FF, 0xFCFF, 0xFCFF, 0xFEFF, 0x0000, 0x6000,
0x7800, 0x3E00, 0x3F80, 0x1FE0, 0x1FF8, 0x0FFE,
0x0F00, 0x0700, 0x0700, 0x0300, 0x0300, 0x0100,
0x0100, 0x0000, 1,1
};

#pragma argsused

void WaitPress(int mask, int button, int x, int y)
{
if(mask & MOUSE_RBUTTON_PRESS)
DoneFlag = 1;
}

int main(void)
{
SetVideoMode(0x12);
ResetMouse();
ShowMouseCursor();
SetMouseShape(new_cursor);
SetMouseHandler(WaitPress);
// Do smth
HideMouseCursor();
RemoveMouseHandler();
SetVideoMode(3);

return 0;
}
Файл mouse.cpp
Код:
#include <alloc.h>
#include <conio.h>
#include <stdio.h>

#pragma inline
#define MOUSE_MOVE_MASK 	0x01
#define MOUSE_LBUTTON_PRESS 	0x02
#define MOUSE_LBUTTON_RELEASE 	0x04
#define MOUSE_RBUTTON_PRESS 	0x08
#define MOUSE_RBUTTON_RELEASE 	0x10
#define MOUSE_MBUTTON_PRESS 	0x20
#define MOUSE_MBUTTON_RELEASE 	0x40
#define MOUSE_ALL_EVENTS	 	0x7F

struct MouseState{
int x, y;
int buttons;
};

struct CursorShape{
unsigned AndMask [16];
unsigned XorMask [16];
int HotX, HotY;
};

typedef void (*MouseHandler)(int, int, int, int);
int ResetMouse(void);
void SetVideoMode(int);
void ShowMouseCursor(void);
void ReadMouseState(MouseState &);
void SetMouseShape(CursorShape &);
void SetMouseHandler(MouseHandler, int = MOUSE_ALL_EVENTS);
void RemoveMouseHandler(void);

static MouseHandler CurHandler = NULL;

int ResetMouse(void)
{
asm {
xor ax, ax
int 33h
}
return _AX==0xFFFF;
}

void ShowMouseCursor(void)
{
asm {
mov ax, 1
int 33h
}
}

void ReadMouseState(MouseState &s)
{
asm {
mov ax, 3
int 33h
}

#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
asm {
push es
push di
les di, dword ptr s
mov es:[di ], cx					// x
mov es:[di+2], dx					// y
mov es:[di+4], bx					// button
pop di
pop es
}
#else													// short address (without seg)
asm {
push di
mov di, word ptr s
mov [di ], cx
mov [di+2], dx
mov [di+4], bx
pop di
}
#endif
}

void SetMouseShape(CursorShape &c)
{
#if defined(__COMPACT ) || defined(__LARGE__) || defined(__HUGE__)
asm {
push es
push di
les di, dword ptr c
mov bx, es:[di+16]
mov cx, es:[di+18]
mov dx, di
mov ax, 9
int 33h 
pop di 
pop es 
}
#else
asm {
push di
mov di, word ptr c
mov bx, [di+16]
mov cx, [di+18]
mov dx, di
mov ax, 9
int 33h
pop di
}
#endif
}

static void far MouseStub(void)
{
asm {
push ds // preserve ds
push ax // preserve ax
mov ax, seg CurHandler
mov ds, ax
pop ax // restore ax
push dx // �
push cx // x
push bx // button state
push ax // event mask
call CurHandler
add sp, 8 // clear stack
pop ds
}
}

void SetMouseHandler(MouseHandler h, int mask)
{
void far *p = MouseStub;
CurHandler = h;
asm {
push es
mov ax, 0Ch
mov cx, mask
les dx, p
int 33h
pop es
}
}

void RemoveMouseHandler(void)
{
CurHandler = NULL;
asm {
mov ax, 0Ch
mov cx, 0
int 33h
}
}

void SetVideoMode(int mode)
{
asm {
mov ah, 0
mov al, mode
int 10h
}
}
 
Статус
Закрыто для дальнейших ответов.