From a1fbf46bbb19827c9bec7fe3db49414cc364f800 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Sat, 3 May 2014 20:46:19 -0500 Subject: [PATCH] new file: 16/BANKBLIT.C new file: 16/BANKBLIT.EXE modified: 16/DOS_GFX.EXE modified: 16/Project 16.bfproject new file: 16/Q.BAT modified: 16/dos_gfx.cpp modified: 16/dos_gfx.h --- 16/BANKBLIT.C | 415 ++++++++++++++++++++++++++++++++++++++++ 16/BANKBLIT.EXE | Bin 0 -> 11366 bytes 16/DOS_GFX.EXE | Bin 27392 -> 27972 bytes 16/Project 16.bfproject | 75 +++++++- 16/Q.BAT | 5 + 16/W | 5 + 16/dos_gfx.cpp | 153 +++++++++++---- 16/dos_gfx.h | 9 +- 8 files changed, 618 insertions(+), 44 deletions(-) create mode 100644 16/BANKBLIT.C create mode 100644 16/BANKBLIT.EXE create mode 100644 16/Q.BAT create mode 100644 16/W diff --git a/16/BANKBLIT.C b/16/BANKBLIT.C new file mode 100644 index 00000000..306f6c45 --- /dev/null +++ b/16/BANKBLIT.C @@ -0,0 +1,415 @@ +/*---------------------------------------------------------------------------- +blit() function for VBE 1.x banked framebuffer +Chris Giese http://my.execpc.com/~geezer/ +This code is public domain (no copyright). +You can do whatever you want with it. + +Compile with any of the following DOS compilers: +- Turbo C++ 1.0 +- Borland C++ 3.1 +- 16-bit Watcom C +- DJGPP + +April 4, 2008 +- Initial release + +More notes: +- The 'BPP' macro can be changed to 2, 3, or 4 to work with color + depths 16, 24, and 32, respectively. BPP can also be a run- + time variable; letting you use the same blit() function for + various color depths. +- Some video boards (Intel i810 integrated video) report compliance + with VBE 2.x but _still_ do not support a linear framebuffer +- Left as an exercise for the reader: it should be easy to convert + blit_mem_to_fb() to blit_fb_to_mem() +- Left as an exercise for the reader: it should be easy to convert + blit_mem_to_fb() to blot_fb(); a function that draws a solid + filled rectangle. (Hint: replace MEMCPY()s with MEMSET()s) +- To handle arbitrary blitting in a system with a banked framebuffer, + you need four functions: blit_mem_to_mem(), blit_mem_to_fb(), + blit_fb_to_mem(), and blit_fb_to_fb() +----------------------------------------------------------------------------*/ +#include /* memset(), [_f]memcpy() */ +/* EOF, FILE, fopen(), fwrite(), fputc(), fclose(), remove(), printf() */ +#include +#include /* getch(), outp[ortb]() */ +/* union REGS, struct SREGS, int86(), int86x() */ +#include /* FP_SEG(), FP_OFF(), MK_FP() */ +#if 0 +/* C99 fixed-width types */ +#include +#else +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned long uint32_t; +#endif + +#if defined(__TURBOC__) +#if __TURBOC__==0x401 +#error Sorry, 'huge' is broken in Turbo C++ 3.0 +#endif + +/* This code exposes some bugs in Borland C++ 3.1, so... */ +#if __TURBOC__==0x410 +#pragma option -Od /* ...disable all optimizations */ +#endif + +#define HUGE huge +#define MEMCPY(D,S,N) _fmemcpy(D,S,N) +#define MEMSET(D,C,N) _fmemset(D,C,N) + +#elif defined(__WATCOMC__)&&!defined(__386__) +#define outportb(P,V) outp(P,V) +#define HUGE huge +#define MEMCPY(D,S,N) _fmemcpy(D,S,N) +#define MEMSET(D,C,N) _fmemset(D,C,N) + +#elif defined(__DJGPP__) +/* __djgpp_conventional_base, __djgpp_nearptr_enable() */ +#include +#include /* __dpmi_regs, __dpmi_int(), __dpmi_allocate_dos_memory() */ +#include /* _CRT0_FLAG_NEARPTR, _crt0_startup_flags */ + +#define __386__ 1 +#define HUGE /* nothing */ +#define MEMCPY(D,S,N) memcpy(D,S,N) +#define MEMSET(D,C,N) memset(D,C,N) + +#else +#error Sorry, unsupported compiler +#endif + +#define MIN(X,Y) (((X) < (Y)) ? (X) : (Y)) + +/* structure used by INT 10h AX=4F01h */ +#pragma pack(1) +typedef struct +{ + uint16_t mode_attrib; /* b5=1 for non-VGA mode */ + uint8_t win_a_attrib; + uint8_t win_b_attrib; + uint16_t k_per_gran; + uint16_t win_size; + uint16_t win_a_seg; + uint16_t win_b_seg; + char reserved1[4]; +/* this is not always the expected value; +rounded up to the next power of 2 for some video boards: */ + uint16_t bytes_per_row; +/* OEM modes and VBE 1.2 only: */ + uint16_t wd; + uint16_t ht; + uint8_t char_wd; + uint8_t char_ht; + uint8_t planes; + uint8_t depth; + uint8_t banks; + uint8_t memory_model; + uint8_t k_per_bank; + uint8_t num_pages; /* ? */ + char reserved2; +/* VBE 1.2 only */ + uint8_t red_width; + uint8_t red_shift; + uint8_t green_width; + uint8_t green_shift; + uint8_t blue_width; + uint8_t blue_shift; + char reserved3[3]; + uint32_t lfb_adr; + char reserved4[212]; +} vbe_mode_info_t; + +typedef struct +{ + unsigned wd, ht; + unsigned long bytes_per_row; + unsigned char HUGE *raster; +} img_t; + +typedef struct +{ + int src_x, src_y, dst_x, dst_y; + unsigned wd, ht; +} clip_t; + +static img_t g_fb; +static unsigned g_use_win_a, g_gran_per_64k; +/***************************************************************************** +no _fmemcpy() in Turbo C++ 1.0 +*****************************************************************************/ +#if defined(__TURBOC__) +#if __TURBOC__<0x300 +void far * far _fmemcpy(void far *dst_ptr, const void far *src_ptr, + unsigned n) +{ + unsigned char huge *dst = dst_ptr; + unsigned char huge *src = src_ptr; + + for(; n != 0; n--) + { + *dst = *src; + dst++; + src++; + } + return dst_ptr; +} +#endif +#endif +/***************************************************************************** +*****************************************************************************/ +static void set_bank(unsigned b) +{ + static unsigned curr_bank = -1u; +/**/ + union REGS regs; + + if(b == curr_bank) + return; + curr_bank = b; + regs.x.ax = 0x4F05; +/* g_use_win_a and g_gran_per_64k were set by INT 10h AX=4F01h */ + regs.x.bx = g_use_win_a ? 0x0000 : 0x0001; + regs.x.dx = b * g_gran_per_64k; + int86(0x10, ®s, ®s); +} +/***************************************************************************** +If using Borland C, compile this without optimizations. +Even without optimizations, it probably won't work with Turbo C++ 3.0 +*****************************************************************************/ +#define BPP 1 /* bytes per pixel */ +static void blit_mem_to_fb(img_t *src_img, clip_t *clip) +{ + unsigned bank, y, row_with_bank_switch, max_y; + unsigned char HUGE *src; + unsigned long off32; + uint16_t off16, i; + + src = src_img->raster + + src_img->bytes_per_row * clip->src_y + clip->src_x * BPP; +/* calculate 32-bit offset into framebuffer corresponding to +(clip->dst_x, clip->dst_y) */ + off32 = g_fb.bytes_per_row * clip->dst_y + clip->dst_x * BPP; +/* use low 16 bits for offset into 64K bank; use top 16 bits for bank */ + off16 = (uint16_t)off32; + off32 >>= 16; + bank = (uint16_t)off32; +/* set bank and increment bank number */ + set_bank(bank); + bank++; + for(y = clip->dst_y; ; ) + { +/* in which row does the next bank-switch occur? */ + off32 = bank; + off32 <<= 16; + row_with_bank_switch = (unsigned) + (off32 / g_fb.bytes_per_row); +/* blit until we reach that row or until we reach (clip->dst_y + clip->ht) */ + max_y = MIN(clip->dst_y + clip->ht, row_with_bank_switch); + for(; y < max_y; y++) + { + MEMCPY(g_fb.raster + off16, src, clip->wd * BPP); + off16 += g_fb.bytes_per_row; + src += src_img->bytes_per_row; + } +/* exit now if done */ + if(y >= clip->dst_y + clip->ht) + break; +/* else it's a row with bank switch. There are 3 possibilities: +line of pixels in this row starts AFTER bank switch */ + if(off16 < g_fb.bytes_per_row) /* overflowed 64K (clever!) */ + { + set_bank(bank); + MEMCPY(g_fb.raster + off16, src, clip->wd * BPP); + } +/* line of pixels in this row ends BEFORE bank switch */ + else if(off16 + (unsigned long)clip->wd * BPP <= 0x10000L) + { + MEMCPY(g_fb.raster + off16, src, clip->wd * BPP); + set_bank(bank); + } +/* line of pixels in this row STRADDLES bank switch */ + else + { + i = (uint16_t)(0x10000uL - off16); + MEMCPY(g_fb.raster + off16, src + 0, + i); + set_bank(bank); + MEMCPY(g_fb.raster + 0 , src + i, + clip->wd * BPP - i); + } + off16 += g_fb.bytes_per_row; + src += src_img->bytes_per_row; + bank++; + y++; + } +} +/***************************************************************************** +*****************************************************************************/ +int main(void) +{ + static const unsigned vbe_mode_num = 0x101; /* 640x480x256 */ +/* 14x14 test bitmap */ + static unsigned char raster[] = + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D" + "\x01\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D" + "\x02\x02\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D" + "\x03\x03\x03\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D" + "\x04\x04\x04\x04\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D" + "\x05\x05\x05\x05\x05\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D" + "\x06\x06\x06\x06\x06\x06\x06\x07\x08\x09\x0A\x0B\x0C\x0D" + "\x07\x07\x07\x07\x07\x07\x07\x07\x08\x09\x0A\x0B\x0C\x0D" + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x09\x0A\x0B\x0C\x0D" + "\x09\x09\x09\x09\x09\x09\x09\x09\x09\x09\x0A\x0B\x0C\x0D" + "\x0A\x0A\x0A\x0A\x0A\x0A\x0A\x0A\x0A\x0A\x0A\x0B\x0C\x0D" + "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0C\x0D" + "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0D" + "\x0D\x0D\x0D\x0D\x0D\x0D\x0D\x0D\x0D\x0D\x0D\x0D\x0D\x0D"; +/**/ + union REGS regs; + unsigned i; + clip_t clip; + img_t img; + +#if !defined(__386__) + static vbe_mode_info_t vbe_mode_info; + struct SREGS sregs; + +/* get info for VBE mode */ + regs.x.ax = 0x4F01; + regs.x.cx = vbe_mode_num; + sregs.es = FP_SEG(&vbe_mode_info); + regs.x.di = FP_OFF(&vbe_mode_info); + int86x(0x10, ®s, ®s, &sregs); + if(regs.x.ax != 0x004F) + { + printf("Error getting info for VBE mode 0x%X\n", + vbe_mode_num); + return 1; + } +/* init g_fb */ + g_fb.wd = vbe_mode_info.wd; + g_fb.ht = vbe_mode_info.ht; + g_fb.bytes_per_row = vbe_mode_info.bytes_per_row; + g_gran_per_64k = 64 / vbe_mode_info.k_per_gran; + if(vbe_mode_info.win_a_attrib == 7) + { + g_fb.raster = (unsigned char HUGE *) + MK_FP(vbe_mode_info.win_a_seg, 0); + g_use_win_a = 1; + } + else if(vbe_mode_info.win_b_attrib == 7) + { + g_fb.raster = (unsigned char HUGE *) + MK_FP(vbe_mode_info.win_b_seg, 0); + g_use_win_a = 0; + } + else + { + printf("Error locating banked framebuffer " + "for VBE mode 0x%X\n", vbe_mode_num); + return -1; + } +#else /* if defined(__DJGPP__) */ + vbe_mode_info_t *vbe_mode_info; + int conv_mem_seg, conv_mem_sel; + __dpmi_regs dregs; + +/* turn off data segment limit, for nearptr access */ + if(!(_crt0_startup_flags & _CRT0_FLAG_NEARPTR)) + { + if(!__djgpp_nearptr_enable()) + { + printf("Error: can't enable near pointer " + "access to framebuffer (WinNT/2k/XP?)\n"); + return 1; + } + } +/* allocate conventional memory for INT 10h AX=4F01h buffer */ + conv_mem_seg = __dpmi_allocate_dos_memory(256 / 16, &conv_mem_sel); + if(conv_mem_seg == -1) + { + printf("Error: can't allocate conventional memory\n"); + return 1; + } + vbe_mode_info = (vbe_mode_info_t *) + (conv_mem_seg * 16uL + __djgpp_conventional_base); +printf("vbe_mode_info: sel=0x%X, real-mode seg=0x%X, linear=0x%lX, near=0x%p\n", + conv_mem_sel, conv_mem_seg, conv_mem_seg * 16uL, vbe_mode_info); +/* get info for VBE mode */ + dregs.x.ax = 0x4F01; + dregs.x.cx = vbe_mode_num; + dregs.x.es = conv_mem_seg; + dregs.x.di = 0; + __dpmi_int(0x10, &dregs); + if(dregs.x.ax != 0x004F) + { + printf("Error getting info for VBE mode 0x%X\n", + vbe_mode_num); + return 1; + } +/* init g_fb */ + g_fb.wd = vbe_mode_info->wd; + g_fb.ht = vbe_mode_info->ht; + g_fb.bytes_per_row = vbe_mode_info->bytes_per_row; + g_gran_per_64k = 64 / vbe_mode_info->k_per_gran; + if(vbe_mode_info->win_a_attrib == 7) + { + g_fb.raster = (unsigned char HUGE *) + (vbe_mode_info->win_a_seg * 16uL + + __djgpp_conventional_base); + g_use_win_a = 1; + } + else if(vbe_mode_info->win_b_attrib == 7) + { + g_fb.raster = (unsigned char HUGE *) + (vbe_mode_info->win_b_seg * 16uL + + __djgpp_conventional_base); + g_use_win_a = 0; + } + else + { + printf("Error locating banked framebuffer " + "for VBE mode 0x%X\n", vbe_mode_num); + return -1; + } +#endif +/* init img */ + img.wd = 14; + img.ht = 14; + img.bytes_per_row = img.wd; + img.raster = raster; +/* init clip_t */ + clip.wd = img.wd; + clip.ht = img.ht; + clip.src_x = 0; + clip.src_y = 0; +/* set graphics mode */ + regs.x.bx = vbe_mode_num; + regs.x.ax = 0x4F02; + int86(0x10, ®s, ®s); +/* green palette */ +#define VGA_DAC_WRITE_INDEX 0x3C8 +#define VGA_DAC_DATA 0x3C9 + outportb(VGA_DAC_WRITE_INDEX, 0); + for(i = 0; i < 16; i++) + { + outportb(VGA_DAC_DATA, /* red= */0 >> 2); + outportb(VGA_DAC_DATA, /* green= */i * 3); + outportb(VGA_DAC_DATA, /* blue= */0 >> 2); + } +/* test banked blit function */ + clip.dst_y = 0; + for(; clip.dst_y + clip.ht < g_fb.ht; clip.dst_y += clip.ht) + { + clip.dst_x = 0; + for(; clip.dst_x + clip.wd < g_fb.wd; clip.dst_x += clip.wd) + blit_mem_to_fb(&img, &clip); + } + if(getch() == 0) + (void)getch(); +/* set text mode */ + regs.x.ax = 0x0003; + int86(0x10, ®s, ®s); + return 0; +} diff --git a/16/BANKBLIT.EXE b/16/BANKBLIT.EXE new file mode 100644 index 0000000000000000000000000000000000000000..98f92de975b9402fb45e579690fb0cadc511182c GIT binary patch literal 11366 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 literal 0 HcmV?d00001 diff --git a/16/DOS_GFX.EXE b/16/DOS_GFX.EXE index bbd903d70e6c01ac04ab7536b1b7ef5340068b49..1cdab2127cd3011d68964db88afab1ceecbaf207 100644 GIT binary patch delta 9065 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 LwH5N=7()IJfBuhM delta 8487 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 ay ) + { + d = ay - (ax >> 1); + while( x != x2 ) + { + putPixel_X( x, y, col ); + if( d >= 0 ) + { + y += sy; + d -= ax; + } + x += sx; + d += ay; + } + } + else + { + d = ax - (ay >> 1); + while( y != y2 ) + { + putPixel_X( x, y, col ); + if( d >= 0 ) + { + x += sx; + d -= ay; + } + y += sy; + d += ax; + } + } + return; +} + +void drawrect(int x1, int y1, int x2, int y2, char color) +{ + drawline(x1,y1,x2,y1,color); + drawline(x1,y2,x2,y2,color); + drawline(x1,y1,x1,y2,color); + drawline(x2,y1,x2,y2+1,color); +} /*-----------XXXX-------------*/ @@ -379,8 +438,9 @@ int ding(int q){ int d3y; //++++ if(q <= 4 && q!=2 && gq == BONK-1) coor = rand()%HGQ; - if((q == 2 - ||q==4 + if((q == 2 + ||q==4 + ||q==16 ) && gq == BONK-1){ if(coor < HGQ && coor < LGQ) coor = LGQ; if(coor < HGQ-1){ @@ -408,7 +468,7 @@ int ding(int q){ gq++; }else gq = LGQ; } - if(q<5 && gq1){ - xx++; - } - if(!bakay){ - yy--; - }else if(bakay>1){ - yy++; + if(q==16) + { + if(!bakax){ + xx--;//=TILEWH; + }else if(bakax>0){ + xx++;//=TILEWH; + } + if(!bakay){ + yy--;//=TILEWH; + }else if(bakay>0){ + yy++;//=TILEWH; + } + }else{ + if(!bakax){ + xx-=TILEWH; + }else if(bakax>1){ + xx+=TILEWH; + } + if(!bakay){ + yy-=TILEWH; + }else if(bakay>1){ + yy+=TILEWH; + } } } // fixer - /*if(xx<0) xx=width; - if(yy<0) yy=height; - if(xx>width) xx=0; - if(yy>height) yy=0;*/ + if(q!=16){ + if(xx<0) xx=width; + if(yy<0) yy=height; + if(xx>width) xx=0; + if(yy>height) yy=0; + } + +//interesting effects + if(q==16) + { + int tx=0,ty=0; + tx+=xx+16; + ty+=yy+16; + putPixel_X(tx, ty, coor); + //drawrect(tx, ty, tx+TILEWH, ty+TILEWH, coor); + //printf("%d %d %d %d %d %d\n", xx, yy, tx, ty, TILEWH); // plot the pixel //---- ppf(xx, yy, coor, vga); - putPixel_X(xx, yy, coor); +//++++0000 putPixel_X(xx, yy, coor); + }else drawrect(xx, yy, xx+TILEWH-1, yy+TILEWH-1, coor); //---- if(q==2) ppf(rand()%, rand()%height, 0, vga); - if(q==2) putPixel_X(rand()%width, rand()%height, 0); - if(q==2||q==4){ bakax = rand()%3; bakay = rand()%3; } + if(q==2||q==16) putPixel_X(rand()%width, rand()%height, 0); + if(q==2||q==4||q==16){ bakax = rand()%3; bakay = rand()%3; } gq++; //if(xx<0||xx>320||yy<0||yy>240) // printf("%d %d %d %d %d %d\n", xx, yy, coor, bakax, bakay, getPixel_X(xx,yy)); @@ -489,38 +576,38 @@ void doTest(void) int p, x, y, pages; /* This is the way to calculate the number of pages available. */ - pages = 65536L/(widthBytes*height); // apparently this takes the A000 address + pages = 65536L/(widthBytes*height); // apparently this takes the A000 address + + printf("%d\n", pages); - printf("%d\n", pages); - for (p = 0; p <= pages; ++p) { setActivePage(p); /* On each page draw a single colored border, and dump the palette - onto a small square about the middle of the page. */ - + onto a small square about the middle of the page. */ + //{ for (x = 0; x <= width; ++x) { putPixel_X(x, 0, p+1); - if(p!=pages) putPixel_X(x, height-1, p+1); + if(p!=pages) putPixel_X(x, height-1, p+1); else putPixel_X(x, 99-1, p+1); } for (y = 0; y <= height; ++y) { putPixel_X(0, y, p+1); - if(p!=pages) putPixel_X(width-1, y, p+1); + if(p!=pages) putPixel_X(width-1, y, p+1); else putPixel_X(width-1, y, p+1); } for (x = 0; x < 16; ++x) for (y = 0; y < 16; ++y) putPixel_X(x+(p+2)*16, y+(p+2)*16, x + y*16); - //} - - drawText(0, 0, 15, p); + //} + + drawText(0, 0, 15, p); } @@ -528,7 +615,7 @@ void doTest(void) through all the pages by pressing a key. */ for (p = 0; p <= pages; ++p) { - setVisiblePage(p); + setVisiblePage(p); //drawText(0, 240, 15, "bakapi"); getch(); } @@ -574,9 +661,9 @@ int main(void) } }*/ // else off while(!kbhit()){ // conditions of screen saver - ding(4); - } - //end of screen savers + ding(4); + } + //end of screen savers doTest(); setvideo(0); puts("Where to next? It's your move! wwww"); diff --git a/16/dos_gfx.h b/16/dos_gfx.h index 08908b04..b95f0159 100644 --- a/16/dos_gfx.h +++ b/16/dos_gfx.h @@ -9,7 +9,10 @@ //static hgq=NUM_COLORS/(1/8) #define BONK 400 #define LGQ 32 -#define HGQ 56 +#define HGQ 56 +#define TILEWH 16 +#define ABS(a) ((a < 0) ? -a : a) +#define SGN(a) ((a < 0) ? -1 : 1) //#define VMEM 0xA000 // = vga //int width = 320; //int height = 240; @@ -22,7 +25,9 @@ void setvideo(/*byte mode, */int vq); void cls(byte color, byte *Where); //void clearscr(); //void plotpixel(int x, int y, byte color, byte *Where); -//void plotpixelfast(int x, int y, byte color, byte *Where); +//void plotpixelfast(int x, int y, byte color, byte *Where); +void putPixel_X(int x, int y, byte color); +void putTile(int x, int y, byte color); //void BlockMove(); //void eraseplayer(int x, int y); //void drawplayer(int x, int y, int color); -- 2.39.5