#include #include "types.h" #include #include #include #include "bgraph.h" #include "memman.h" word *screen; word curcolor,charcolors[7] = {0x0000,RGB555(0,31,0),RGB555(0,28,0),RGB555(0,24,0),RGB555(0,20,0),0x0000,0x0000}; const word *curfont; word *writepos,writeposx; byte fontdsize=0; void (*showview)(word,word,word,word); char line480=0; int32_t screen_buffer_size=0; char screenstate=0; char __skip_change_line_test=0; char no_restore_mode=0; const void *mscursor; void *mssavebuffer=NULL; integer mscuroldx=0,mscuroldy=0; integer mscuroldxs=1,mscuroldys=1; char write_window=0; int32_t pictlen; // Tato promenna je pouze pouzita v BGRAPH1.ASM void text_mode(); void wait_retrace(); void line32(word x1,word y1, word x2, word y2) { line_32(x1,y1,(x2-x1),(y2-y1)); } void position(word x,word y) { writeposx=x; writepos=getadr32(x,y); } void rel_position_x(word x) { writeposx+=x; writepos+=x; } void outtext(const char *text) { byte pos; if (fontdsize) while (*text) { char2_32(writepos,curfont,*text); pos=(charsize(curfont,*text) & 0xff)<<1; writepos+=pos; writeposx+=pos;text++; } else while (*text) { char_32(writepos,curfont,*text); pos=charsize(curfont,*text) & 0xff; writepos+=pos; writeposx+=pos;text++; } } /*MODEinfo vesadata[3]; SVGAinfo svgadata[3]; int lastbank=0; int granuality=0; int gran_mask=0; word gr_page_end=0; int gr_end_screen=0; word *mapvesaadr(word *a); #pragma aux mapvesaadr parm [edi] value [edi] void write_vesa_info(int mode) { char c[20]; getsvgainfo(&svgadata); printf("VIDEO mem %5dKb\n" "Oem: %s\n\n", svgadata[0].memory*64, svgadata[0].oemstr); getmodeinfo(&vesadata,mode); if (vesadata[0].modeattr & MA_SUPP) { if (vesadata[0].modeattr & MA_LINEARFBUF) sprintf(c,"%8Xh",(int32_t)vesadata[0].linearbuffer); else strcpy(c,"None"); printf("Mode: %04X \n" "WinA %02X\n" "WinB %02X\n" "Granuality: %5dKB\n" "WinSize: %5dKB\n" "Xres: %5d\n" "Yres: %5d\n" "Bppix: %5d\n" "Lbuffer: %s\n\n", mode, vesadata[0].winaattr, vesadata[0].winbattr, vesadata[0].wingran, vesadata[0].winsize, vesadata[0].xres, vesadata[0].yres, vesadata[0].bppix, c); } else printf("Mode %04X not currently supported!!!\n\n"); // printf("--- Hit ENTER if values are correct or press CTRL+Break ---\n"); // getche(); delay(300); } */ void showview_dx(word x,word y,word xs,word ys); //void showview64b(word x,word y,word xs,word ys); /*void showview32b(word x,word y,word xs,word ys) { register longint a,b; if (x>640 || y>480) return; if (xs==0) xs=640; if (ys==0) ys=480; xs++;ys++; x&=~3; xs=(xs & ~3)+4; if (x+xs>640) xs=640-x; if (y+ys>480) ys=480-y; if (xs>550 && ys>400) { redraw32bb(screen,NULL,NULL); return; } a=(x<<1)+linelen*y; b=y*1280+x*2; redrawbox32bb(xs,ys,(void *)((char *)screen+a),(void *)b); } */ /* void set_scan_line(int newline); #pragma aux set_scan_line=\ "mov eax,4f06h"\ "xor ebx,ebx"\ "int 10h"\ parm [ecx] modify [eax ebx]; int get_scan_line(); #pragma aux get_scan_line=\ "mov eax,4f06h"\ "mov bh,01"\ "int 10h"\ modify[eax ebx] value[ecx]; void *create_hixlat() { word *s; word i; s=NewArr(word,32768); for (i=0;i<32768;i++) s[i]=((i & ~0x1f)<<1) | (i & 0x1f); return (byte *)s; } int initmode64b(void *paletefile) { int i; getmodeinfo(&vesadata,0x111); if (!(vesadata[0].modeattr & MA_SUPP)) return -1; //write_vesa_info(0x110); if (vesadata[0].winaattr & (WA_SUPP | WA_WRITE)) write_window=0; else if (vesadata[0].winbattr & (WA_SUPP | WA_WRITE)) write_window=1; else return -1; i=vesadata[0].wingran*1024; granuality=0;lastbank=0; while (i>>=1) granuality++; gran_mask=(1<>=1) granuality++; gran_mask=(1<>=1) granuality++; setvesamode(0x110,-1); set_scan_line(1024); if (get_scan_line()!=1024 && !__skip_change_line_test) { text_mode(); return -10; } lbuffer=(word *)0xa0000; screen=lbuffer; linelen=640*2; showview=showview32b; screen=(void *)malloc(screen_buffer_size); banking=1; screenstate=1; return 0; } word *mapvesaadr1(word *a) { word bank; bank=(int32_t)a>>16; if (bank!=lastbank) { lastbank=bank; bank=bank; { union REGS regs; regs.w.ax = 0x4f05; regs.w.bx = write_window; regs.w.dx = bank; int386 (0x10,®s,®s); // window A } } return (word *)(((int32_t)a & 0xffff)+0xa0000); } void switchvesabank(word bank) #pragma aux switchvesabank parm [eax] { union REGS regs; regs.w.ax = 0x4f05; regs.w.bx = 0; regs.w.dx = bank; int386 (0x10,®s,®s); // window A } */ int initmode(const INI_CONFIG_SECTION *display_config, const char *app_name) { if (!game_display_init(display_config, app_name)) return -1; showview=game_display_update_rect; screenstate=1; return 0; } /* int initmode256(void *paletefile) { MODEinfo data; getmodeinfo(&data,0x100+line480); if (!(data.modeattr & MA_SUPP)) return initmode256b(paletefile); if (!(data.modeattr & MA_LINEARFBUF)) return initmode256b(paletefile); //write_vesa_info(0x101); setvesamode(0x4101,-1); if (lbuffer==NULL)lbuffer=(word *)physicalalloc((int32_t)data.linearbuffer,screen_buffer_size>>1); screen=lbuffer; linelen=640*2; palmem=(char *)paletefile; xlatmem=palmem+768; setpal((void *)palmem); showview=showview256; screen=(void *)malloc(screen_buffer_size); screenstate=1; banking=0; return 0; } void showview256b(word x,word y,word xs,word ys) { register longint a,b; if (x>640 || y>480) return; if (xs==0) xs=640; if (ys==0) ys=480; xs++;ys++; x&=~3; xs=(xs & ~3)+4; y&=~1; ys=(ys & ~1)+2; if (x+xs>640) xs=640-x; if (y+ys>480) ys=480-y; if (xs>550 && ys>400) { redraw256b(screen,0,xlatmem); return; } a=(x<<1)+linelen*y; b=y*640+x; redrawbox256b(xs,ys,(void *)((char *)screen+a),(void *)b,xlatmem); } int initmode256b(void *paletefile) { int i; getmodeinfo(&vesadata,0x100); if (!(vesadata[0].modeattr & MA_SUPP)) return -1; //write_vesa_info(0x101); i=vesadata[0].wingran*1024; if (vesadata[0].winaattr & (WA_SUPP | WA_WRITE)) write_window=0; else if (vesadata[0].winbattr & (WA_SUPP | WA_WRITE)) write_window=1; else return -1; granuality=0;lastbank=0; while (i>>=1) granuality++; gran_mask=(1<640 || y>480) return; if (xs==0) xs=640; if (ys==0) ys=480; xs+=2;ys+=2; if (x+xs>640) xs=640-x; if (y+ys>480) ys=480-y; if (xs>550 && ys>400) { redraw64b(screen,NULL,xlatmem); return; } a=(x<<1)+linelen*y; redrawbox64b(xs,ys,(void *)((char *)screen+a),(void *)((char *)a),xlatmem); } void showview256(word x,word y,word xs,word ys) { register longint a; if (xs==0) xs=640; if (ys==0) ys=480; x&=0xfffe;y&=0xfffe;xs+=2;ys+=2; if (x>640 || y>480) return; if (x+xs>640) xs=640-x; if (y+ys>480) ys=480-y; if (xs>550 && ys>400) { redraw256(screen,lbuffer,xlatmem); return; } a=(x<<1)+linelen*y; redrawbox256(xs,ys,(void *)((char *)screen+a),(void *)((char *)lbuffer+(a>>1)),xlatmem); } void showview_lo(word x,word y,word xs,word ys) { register longint a,b; if (xs==0) xs=640; if (ys==0) ys=480; if (ys==0) ys=480; x&=0xfffe;y&=0xfffe;xs+=2;ys+=2; if (x+xs>640) xs=640-x; if (y+ys>480) ys=480-y; if (xs>550 && ys>400) { redraw_lo(screen,lbuffer,xlatmem); return; } a=(x<<1)+linelen*y; b=x+640*y; redrawbox_lo(xs,ys,(void *)((char *)screen+a),(void *)((char *)lbuffer+b),xlatmem); } */ void show_ms_cursor(integer x,integer y) { integer xs,ys; int mx = DxGetResX() - 1; int my = DxGetResY() - 1; if (x<0) x=0; if (x>mx) mx=639; if (y<0) y=0; if (y>my) my=479; xs=*(integer *)mscursor; ys=*((integer *)mscursor+1); get_picture(x,y,xs,ys,mssavebuffer); put_picture(x,y,mscursor); mscuroldx=x; mscuroldy=y; } void hide_ms_cursor() { put_picture(mscuroldx,mscuroldy,mssavebuffer); } void redraw_ms_cursor_on_screen(void) { if (mssavebuffer) { integer xs=*(integer *)mssavebuffer; integer ys=*((integer *)mssavebuffer+1); showview(mscuroldx,mscuroldy,xs,ys); } } void *register_ms_cursor(const void *cursor) { integer xs,ys; mscursor=cursor; xs=*(integer *)mscursor; ys=*((integer *)mscursor+1); if (mssavebuffer!=NULL) free(mssavebuffer); mssavebuffer=malloc(xs*ys*2+10);//5 bajtu pro strejcka prihodu return mssavebuffer; } void move_ms_cursor(integer newx,integer newy,char nodraw) { integer xs,ys; int mx = DxGetResX() - 1; int my = DxGetResY() - 1; static integer msshowx=0,msshowy=0; xs=*(integer *)mscursor; ys=*((integer *)mscursor+1); if (nodraw) { showview(msshowx,msshowy,xs,ys); msshowx=mscuroldx; msshowy=mscuroldy; return; } if (newx<0) newx=0; if (newy<0) newy=0; if (newx>mx) newx=mx; if (newy>my) newy=my; put_picture(mscuroldx,mscuroldy,mssavebuffer); show_ms_cursor(newx,newy); mscuroldx=newx;mscuroldy=newy; showview(msshowx,msshowy,mscuroldxs,mscuroldys); if (mscuroldx!=msshowx || mscuroldy!=msshowy)showview(mscuroldx,mscuroldy,mscuroldxs,mscuroldys); msshowx=newx;msshowy=newy; showview(msshowx,msshowy,xs,ys); mscuroldxs=xs; mscuroldys=ys; } int text_height(const char *text) { char max=0,cur; while (*text) if ((cur=charsize(curfont,*text++)>>8)>max) max=cur; return max<>1;break; case 2:x-=text_width(text);break; } switch (aligny) { case 1:y-=text_height(text)>>1;break; case 2:y-=text_height(text);break; } position(x,y); } void rectangle(int x1,int y1,int x2,int y2,int color) { curcolor=color; hor_line32(x1,y1,x2); hor_line32(x1,y2,x2); ver_line32(x1,y1,y2); ver_line32(x2,y1,y2); }