صفحه 2 از 2 اولاول 12
نمایش نتایج 41 تا 49 از 49

نام تاپیک: ترکیب Text Mode و Graphic Mode

  1. #41
    سلام
    به این لینک هم یه سر بزنید.
    من زبانم بده.

    http://www.faqs.org/faqs/pc-hardware...a-programming/

  2. #42


    #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();
    }



    سلام
    اینو ببینید.
    یکی از دوستان همینجا فرستاده بود من کمی تغیرش دادم.
    یعنی از حالت سر فایل به فایل نه چیز دیگه.
    اما باز هم جواب نمیده.
    میشه کمک کنید؟
    فایل های ضمیمه فایل های ضمیمه

  3. #43
    کاربر دائمی آواتار aakh1361
    تاریخ عضویت
    آبان 1383
    محل زندگی
    تهران - سه راه افسریه - شهرک کاروان
    پست
    380
    Iran-Pc
    بهتره که از
    CODE
    /CODE
    برای نشون دادن برنامه ات استفاده کنی اینجوری چیزی معلوم نیست !!
    آخرین ویرایش به وسیله aakh1361 : پنج شنبه 17 آذر 1384 در 02:32 صبح

  4. #44
    نقل قول نوشته شده توسط 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 که من هم با اوون کار میکردم.
    ممنون علی

  5. #45
    سلام و خیلی ممنون.
    یه سوال.
    با استفاده از پورتها نمیشه به صورت سریع پیکسلها رو نمایش داد؟
    اینو ببینید (نمونه مثال کتاب پی سی اینترن البته 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



    میشه ببینید و کمک کنید.
    دیگه داره کفریم میکنه.
    اون مثالی که داشتید و گفتید به زبان پاسکال هست رو هم لطفا بفرستید.

  6. #46
    کاربر دائمی آواتار aakh1361
    تاریخ عضویت
    آبان 1383
    محل زندگی
    تهران - سه راه افسریه - شهرک کاروان
    پست
    380

    Exclamation

    شما فقط فایل سی رو کامپایل کردی
    باید فایل اسمبلی هم کامپایل کنی بعدش هم فایل ابجکت سی و هم ابجکت اسمبلی رو باهم لینک کنی


    LINK SVGA.OBJ + ASM.OBJ

  7. #47
    اسمبلی رو چطور کامپایل کنم که بشه آبجکت؟

  8. #48
    اسمبلی رو چطور کامپایل کنم که بشه آبجکت؟
    فرضا اگه با MASM کار می‌کنید اینطوری:

    Masm myprog.asm;

    اما توجه داشته باشید که مدل حافظه هر دو کد (سی و اسمبلی) باید یکسان باشه.

  9. #49
    پالیز جان خیلی ممنون.
    یه سوال دیگه.
    من با مسم هم تست کردم
    نمیدونم چرا نشد
    میپرسه اسم فایل و آبجکت و یه سری دیگه رو اما آخر سر میبینم چیزی نساخته
    مسم که سی رو ساپورت کنه با مسم معمولی فرقی میکنه؟

صفحه 2 از 2 اولاول 12

تاپیک های مشابه

  1. مشکل BDI MODE در Grid های پیشرفته
    نوشته شده توسط Fardin_Lord در بخش برنامه نویسی در Delphi
    پاسخ: 7
    آخرین پست: چهارشنبه 09 اسفند 1391, 17:10 عصر
  2. استفاده از وقفه ها در protected mode
    نوشته شده توسط Delphi Coder در بخش توسعه‌ی هسته‌ی سیستم عامل
    پاسخ: 8
    آخرین پست: پنج شنبه 27 دی 1386, 17:20 عصر
  3. اجرا برنامه در Safe Mode
    نوشته شده توسط sabair در بخش برنامه نویسی در 6 VB
    پاسخ: 12
    آخرین پست: پنج شنبه 19 مهر 1386, 11:58 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •