.386
.model MEDIUM,C
.code
start:
mov ax,13h
int 10h
ret
end start
Непонятки с прерываниями
Итак суть проблемы в том что на MASM32 пишу вот это
Код:
затем компилю в exe. НО! при запуске, программа сразу же вылетает на строке где вызываю прерывание int 10h , в чем проблема не знаю( я новичок в низкоуровневом программированиии ), вроде в регистр все правильно засовываю (режим VGA 320*240*256). Подскажите пожалуйста чё делать. Плиз очень надо
заранее спасибо
Цитата: mrDIMAS
Написал графический движок на VC++, а GDI'шные функции винды работают как черепахи, вот и решил взять MASM32 и написать функции работы с графикой(вывод точек,линий ), но не тут-то было.
Итак суть проблемы в том что на MASM32 пишу вот это
.386
.model MEDIUM,C
.code
start:
mov ax,13h
int 10h
ret
end start
затем компилю в exe. НО! при запуске, программа сразу же вылетает на строке где вызываю прерывание int 10h , в чем проблема не знаю( я новичок в низкоуровневом программированиии ), вроде в регистр все правильно засовываю (режим VGA 320*240*256). Подскажите пожалуйста чё делать. Плиз очень надо
заранее спасибо
Итак суть проблемы в том что на MASM32 пишу вот это
.386
.model MEDIUM,C
.code
start:
mov ax,13h
int 10h
ret
end start
затем компилю в exe. НО! при запуске, программа сразу же вылетает на строке где вызываю прерывание int 10h , в чем проблема не знаю( я новичок в низкоуровневом программированиии ), вроде в регистр все правильно засовываю (режим VGA 320*240*256). Подскажите пожалуйста чё делать. Плиз очень надо
заранее спасибо
EXE собирай как DOS приложение, в винде такие прерывания не работают.
может быть тупой вопрос но как указать чтобы exe собиралось как dos приложение( вроде с расширением com ) ?
Цитата: mrDIMAS
может быть тупой вопрос но как указать чтобы exe собиралось как dos приложение( вроде с расширением com ) ?
И exe может запускаться с под доса. Для начала, на твоем бы месте, я бы сменил masm на tasm и почитай вот эту статейку http://wasm.ru/article.php?article=1022003
Спасиб чувак, очень помог.
Цитата: mrDIMAS
Написал графический движок на VC++, а GDI'шные функции винды работают как черепахи, вот и решил взять MASM32 и написать функции работы с графикой(вывод точек,линий ), но не тут-то было.
Итак суть проблемы в том что на MASM32 пишу вот это
затем компилю в exe. НО! при запуске, программа сразу же вылетает на строке где вызываю прерывание int 10h , в чем проблема не знаю( я новичок в низкоуровневом программированиии ), вроде в регистр все правильно засовываю (режим VGA 320*240*256). Подскажите пожалуйста чё делать. Плиз очень надо
заранее спасибо
Итак суть проблемы в том что на MASM32 пишу вот это
Код:
.386
.model MEDIUM,C
.code
start:
mov ax,13h
int 10h
ret
end start
.model MEDIUM,C
.code
start:
mov ax,13h
int 10h
ret
end start
заранее спасибо
А не проще, как альтернатива, создать битовую карту с прямым доступом к пикселам?
Код:
HDC NewBitMap(BYTE **buf, HBITMAP *bmp)
{
HDC dc;
BYTE i, data[2000]={0};
BITMAPINFOHEADER *bh=(BITMAPINFOHEADER*)data;
RGBQUAD *pal=(RGBQUAD*)(data+sizeof(*bh));
bh->biSize=sizeof(*bh);
bh->biWidth=640; // Ширина
bh->biHeight=480; // Высота
bh->biPlanes=1;
bh->biBitCount=4; // Кол-во бит на пиксел. Здесь режим EGA
bh->biClrUsed=bh->biClrImportant=16;
for(i=0; i<16; // Настройка палитры
pal.rgbRed=(i>7?0xFF:0x7F)*((i>>2)&1),
pal.rgbGreen=(i>7?0xFF:0x7F)*((i>>1)&1),
pal[i++].rgbBlue=(i>7?0xFF:0x7F)*(i&1));
*bmp=CreateDIBSection(0,(BITMAPINFO*)bh,DIB_RGB_COLORS,(void**)buf,NULL,0);
dc=CreateCompatibleDC(0); SelectObject(dc,*bmp);
return dc;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
case WM_TIMER:
hdc = GetDC(hWnd);
BitBlt(hdc, 0, 0, 640, 480, DisplayDC, 0, 0, SRCCOPY);
ReleaseDC(hWnd, hdc);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc, 0, 0, 640, 480, DisplayDC, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
if(DisplayDC) DeleteDC(DisplayDC);
if(DisplayBmp) DeleteObject(DisplayBmp);
KillTimer(hWnd, hTimer);
PostQuitMessage(0);
break;
case WM_CREATE:
DisplayDC = NewBitMap(&DisplayBits, &DisplayBmp);
for(long i = 0; i < 640 * 480 / 2; DisplayBits[i ++] = 0);
hTimer = SetTimer(hWnd, 1, 40, NULL);
// Где:
// int hTimer;
// HBITMAP DisplayBmp;
// HDC DisplayDC;
// BYTE *DisplayBits; // Сюда и будем строить всю графику прямой записью в память
{
HDC dc;
BYTE i, data[2000]={0};
BITMAPINFOHEADER *bh=(BITMAPINFOHEADER*)data;
RGBQUAD *pal=(RGBQUAD*)(data+sizeof(*bh));
bh->biSize=sizeof(*bh);
bh->biWidth=640; // Ширина
bh->biHeight=480; // Высота
bh->biPlanes=1;
bh->biBitCount=4; // Кол-во бит на пиксел. Здесь режим EGA
bh->biClrUsed=bh->biClrImportant=16;
for(i=0; i<16; // Настройка палитры
pal.rgbRed=(i>7?0xFF:0x7F)*((i>>2)&1),
pal.rgbGreen=(i>7?0xFF:0x7F)*((i>>1)&1),
pal[i++].rgbBlue=(i>7?0xFF:0x7F)*(i&1));
*bmp=CreateDIBSection(0,(BITMAPINFO*)bh,DIB_RGB_COLORS,(void**)buf,NULL,0);
dc=CreateCompatibleDC(0); SelectObject(dc,*bmp);
return dc;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
case WM_TIMER:
hdc = GetDC(hWnd);
BitBlt(hdc, 0, 0, 640, 480, DisplayDC, 0, 0, SRCCOPY);
ReleaseDC(hWnd, hdc);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc, 0, 0, 640, 480, DisplayDC, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
if(DisplayDC) DeleteDC(DisplayDC);
if(DisplayBmp) DeleteObject(DisplayBmp);
KillTimer(hWnd, hTimer);
PostQuitMessage(0);
break;
case WM_CREATE:
DisplayDC = NewBitMap(&DisplayBits, &DisplayBmp);
for(long i = 0; i < 640 * 480 / 2; DisplayBits[i ++] = 0);
hTimer = SetTimer(hWnd, 1, 40, NULL);
// Где:
// int hTimer;
// HBITMAP DisplayBmp;
// HDC DisplayDC;
// BYTE *DisplayBits; // Сюда и будем строить всю графику прямой записью в память