سلام
به این لینک هم یه سر بزنید.
من زبانم بده.
http://www.faqs.org/faqs/pc-hardware...a-programming/
سلام
به این لینک هم یه سر بزنید.
من زبانم بده.
http://www.faqs.org/faqs/pc-hardware...a-programming/
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
void setsvga(int);
void setpixel( int, int, unsigned char ) ;
void initgraph();
void closegraph();
void line(int,int,int,int,int);
void initgraph()
{
setsvga ( 0x101 ) ;
}
void closegraph()
{
setsvga ( 0x003 ) ;
}
void setsvga ( int m )
{
asm{
mov ax,0x4f02
mov bx,m
int 16
}
}
void set_vesa_seg ( int bank_number )
{
asm{
mov ax,0x4F05
mov bx,0
mov dx,bank_number
int 16;
}
}
unsigned short sp_curr_vesa_seg = 0xffff ;
const unsigned long sp_seg_size = 0xffff + 1L ;
unsigned short sp_vesa_seg,sp_vesa_offset ;
unsigned long sp_offset ;
void inline setpixel(int x, int y, unsigned char color )
{
if(color!=255&&!(x<0||y<0||x>=640||y>=480))
{
sp_offset = ( ( unsigned long ) y * ( unsigned long ) 640 + ( unsigned long ) x ) ;
sp_vesa_seg = (unsigned short) (sp_offset / sp_seg_size) ;
sp_vesa_offset = (unsigned short) (sp_offset % sp_seg_size) ;
if ( sp_vesa_seg != sp_curr_vesa_seg )
{
set_vesa_seg ( sp_vesa_seg ) ;
sp_curr_vesa_seg = sp_vesa_seg ;
}
pokeb ( 0xA000, ( unsigned ) sp_vesa_offset, color ) ;
}
}
int getpixel( int x, int y)
{
if(x<0||y<0||x>=640||y>=480)
return 0;
sp_offset = ( ( unsigned long ) y * ( unsigned long ) 640 + ( unsigned long ) x ) ;
sp_vesa_seg = (unsigned short) (sp_offset / sp_seg_size) ;
sp_vesa_offset = (unsigned short) (sp_offset % sp_seg_size) ;
if ( sp_vesa_seg != sp_curr_vesa_seg )
{
set_vesa_seg ( sp_vesa_seg ) ;
sp_curr_vesa_seg = sp_vesa_seg ;
}
return peekb ( 0xA000, ( unsigned ) sp_vesa_offset) ;
}
void line(int x1,int y1,int x2,int y2,int color)
{
register int t,dis;
int xe=0,ye=0,dx,dy;
int ix,iy;
dx=x2-x1;
dy=y2-y1;
if(dx>0)
ix=1;
else if(!dx)
ix=0;
else
ix=-1;
if(dy>0)
iy=1;
else if(!dy)
iy=0;
else
iy=-1;
dx=abs(dx);
dy=abs(dy);
if(dx>dy)
dis=dx;
else
dis=dy;
for(t=0;t<dis+1;t++)
{
setpixel(x1,y1,color);
xe+=dx;
ye+=dy;
if(xe>dis)
{
xe-=dis;
x1+=ix;
}
if(ye>dis)
{
ye-=dis;
y1+=iy;
}
}// end for
setpixel(x2,y2,color);
}
void box(int x1,int y1,int x2,int y2,int color)
{
line(x1,y1,x1,y2,color);
line(x1,y2,x2,y2,color);
line(x2,y2,x2,y1,color);
line(x2,y1,x1,y1,color);
}
void main()
{
initgraph();
box(50, 50, 100, 100, 15);
getch();
closegraph();
}
سلام
اینو ببینید.
یکی از دوستان همینجا فرستاده بود من کمی تغیرش دادم.
یعنی از حالت سر فایل به فایل نه چیز دیگه.
اما باز هم جواب نمیده.
میشه کمک کنید؟
Iran-Pc
بهتره که از
برای نشون دادن برنامه ات استفاده کنی اینجوری چیزی معلوم نیست !!CODE
/CODE
آخرین ویرایش به وسیله aakh1361 : پنج شنبه 17 آذر 1384 در 03:32 صبح
سلامنوشته شده توسط Iran-PC
مشکل اول که همون دلیلش پاک نشدن vram است و آقای Palize راهش رو گفتند. قالب ذخیره سازی پیکسلها در مودها معمولی (256 به پایین) فرقی با مدهای قدیمی نداره. مدهای HiColor=16 bits و TrueColor=24 bit هم داده هاشون به صورت خام ذخیره میشه یعنی برای حالت 24 بیت R , G , B پشت سر هم. در حالت 16 بیت هم چند روش مختلف وجود داره که متداولترینش 565 است یعنی 5 بیت از 16 بیت برای رنگ قرمز 6 بیت بعدی برای رنگ سبز و 5 بیت آخر برای رنگ آبی. اوون فایل رو حتما بخونید چون نمیشه همه مطلب رو توضیح داد. ضمنا از آخرین باری که اینکارا رو من کردم 4-5 سال میگذره به نظر میرسه آقای Palize بهتر به خاطر داشته باشند.
همونطور که توضیح داده شد مدهای Block برای انجام عملیات گرافیکی سریع مناسب نیستند مخصوصا برای کارهایی مثل نمایش اسپرایت (عملیات Bit Blitting). تغییر بلوک جاری کاری کند است. در حالت LFB که فکر کنم در VESA 2.0 باشه شما مثل مدهای قدیمی یک منطقه خطی در حافظه دارید که کل اطلاعات پیکسلهای گرافیکی به صورت پشت سر هم در اوون نوشته میشن. یعنی برای نوشتن یا خوندن پیکسلها فقط کافیه در آدرس مورد نظر در حافظه بنویسید یا ازش بخونید. فقط تا جایی که یادمه فکر کنم این حالت فقط در حالت Protected Mode قابل دسترسی است و در حالت عادی Real Mode که داس در اوون اجرا میشه نمیشه از این قابلیت استفاده کرد. یعنی اگر میخواهید از LFB استفاده کنید باید از کمپایلرهایی تحت داس استفاده کنید که Dos Extender دارن و کد 32 بیتی در حالت Protected Mode ایجاد میکنند. مانند Watcom C که من هم با اوون کار میکردم.
ممنون علی
سلام و خیلی ممنون.
یه سوال.
با استفاده از پورتها نمیشه به صورت سریع پیکسلها رو نمایش داد؟
اینو ببینید (نمونه مثال کتاب پی سی اینترن البته 256 رنگ)
فایل اسمبلیش
IGROUP group _text
DGROUP group const, _bss, _data
assume CS : IGROUP, DS : DGROUP, ES : DGROUP, SS : DGROUP
CONST segment word public 'CONST'
CONST ends
_BSS segment word public 'BSS'
_BSS ends
_DATA segment word public 'DATA'
_DATA ends
GC_INDEX = 3ceh
GC_READ_MAP = 4
GC_BIT_MASK = 8
GC_GRAPH_MODE = 5
_DATA segment word public 'DATA'
modeno db 6Ah, 58h, 29h, 54h, 16h, 79h
modenoend equ this byte
_DATA ends
_TEXT segment byte public 'CODE'
public _init800600
public _setpix
;---------------------------
_init800600 proc near
mov si, offset modeno
it1: xor ah, ah
mov al, [si]
int 10h
mov ah, 0fh
int 10h
cmp al, [si]
je it2
inc si
cmp si, offset modeno
jne it1
xor ax, ax
ret
it2:
mov ax, 1
ret
_init800600 endp
;--------------------------------
_setpix proc near
sframe struct
bp0 dw ?
ret_adr0 dw ?
x0 dw ?
y0 dw ?
pcolor dw ?
sframe ends
frame equ [bp - bp0]
push bp
mov bp, sp
mov ax, frame.y0
mov dx, 800/8
mul dx
mov bx, frame.x0
mov cl, bl
shr bx, 1
shr bx, 1
shr bx, 1
add bx, ax
and cl, 7
xor cl, 7
mov ah, 1
shl ah, cl
mov dx, GC_INDEX
mov al, GC_BIT_MASK
out dx, ax
mov ax, (02h shl 8) + GC_GRAPH_MODE
out dx, ax
mov ax, 0A000h
mov es, ax
mov al, es:[bx]
mov al, byte ptr frame.pcolor
mov es:[bx], al
mov ax, (0FFh shl 8) + GC_BIT_MASK
out dx, ax
mov ax, (00h shl 8) + GC_GRAPH_MODE
out dx, ax
pop bp
ret
_setpix endp
_TEXT ends
end
و فایل سی
#include <dos.h>
#include <stdarg.h>
#include <stdlib.h>
#include <io.h>
#include <conio.h>
#include <stdio.h>
#ifndef __TURBOC__
#define random(x) ( rand () % (x+1) )
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned char BYTE;
extern int init800600(void);
extern void setpix(int x, int y , unsigned char pcolor);
void main()
{
int i, j;
init800600();
for (i = 0; i <= 599; i++)
for (j = 0; j <= 799; j++)
setpix(j, i, random(255));
}
#ifdef __cplusplus
}
#endif
البته من تو این مثال با مشکل رو برو شدم.
کامپایلرم این ارور رو میده
Compiling SVGA.C:
Linking SVGA.EXE:
Linker Error: Undefined symbol _setpix in module SVGA.C
Linker Error: Undefined symbol _init800600 in module SVGA.C
میشه ببینید و کمک کنید.
دیگه داره کفریم میکنه.
اون مثالی که داشتید و گفتید به زبان پاسکال هست رو هم لطفا بفرستید.
شما فقط فایل سی رو کامپایل کردی
باید فایل اسمبلی هم کامپایل کنی بعدش هم فایل ابجکت سی و هم ابجکت اسمبلی رو باهم لینک کنی
LINK SVGA.OBJ + ASM.OBJ
اسمبلی رو چطور کامپایل کنم که بشه آبجکت؟
فرضا اگه با MASM کار میکنید اینطوری:اسمبلی رو چطور کامپایل کنم که بشه آبجکت؟
Masm myprog.asm;
اما توجه داشته باشید که مدل حافظه هر دو کد (سی و اسمبلی) باید یکسان باشه.
پالیز جان خیلی ممنون.
یه سوال دیگه.
من با مسم هم تست کردم
نمیدونم چرا نشد
میپرسه اسم فایل و آبجکت و یه سری دیگه رو اما آخر سر میبینم چیزی نساخته
مسم که سی رو ساپورت کنه با مسم معمولی فرقی میکنه؟