From: sparky4 Date: Mon, 5 May 2014 12:53:01 +0000 (-0500) Subject: deleted: 16/BANKBLIT.C X-Git-Url: http://4ch.mooo.com/gitweb/?a=commitdiff_plain;h=49c0ddf236338ef1ab63c77543bed47498057a8f;p=16.git deleted: 16/BANKBLIT.C deleted: 16/BANKBLIT.EXE modified: 16/Project 16.bfproject new file: 16/sauce/jstick.h new file: 16/sauce/keydrv.c new file: 16/sauce/keydrv.h new file: 16/sauce/sprite.c new file: 16/sauce/sprite.h new file: 16/sauce/tile.c new file: 16/sauce/tile.h new file: 16/sauce/vgabuff.c new file: 16/sauce/vgabuff.h new file: 16/sauce/vgautils.c new file: 16/sauce/vgautils.h --- diff --git a/16/BANKBLIT.C b/16/BANKBLIT.C deleted file mode 100644 index 306f6c45..00000000 --- a/16/BANKBLIT.C +++ /dev/null @@ -1,415 +0,0 @@ -/*---------------------------------------------------------------------------- -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 deleted file mode 100644 index 98f92de9..00000000 Binary files a/16/BANKBLIT.EXE and /dev/null differ diff --git a/16/Project 16.bfproject b/16/Project 16.bfproject index 25b9d51e..3410d4ff 100644 --- a/16/Project 16.bfproject +++ b/16/Project 16.bfproject @@ -1,13 +1,24 @@ c2e.convert_special: 0 e2c.convert_num: 0 -openfiles: /dos/z/16/16/dos_gfx.cpp:8340:8091:1: -openfiles: /dos/z/16/16/dos_gfx.h:941:268:0: +openfiles: /dos/z/16/16/dos_gfx.cpp:8341:8024:0: +openfiles: /dos/z/16/16/dos_gfx.h:941:208:0: openfiles: /dos/z/16/16/dos_kb.c:759:642:0: openfiles: /dos/z/16/16/dos_kb.h:179:0:0: openfiles: /dos/z/16/16/lib_com.cpp:164:0:0: openfiles: /dos/z/16/16/lib_com.h:0:0:0: openfiles: /dos/z/16/16/16.txt:0:0:0: openfiles: /dos/z/16/16/project16.txt:1755:1676:0: +openfiles: /dos/z/4x4_16/sauce/jstick.h:0:0:0: +openfiles: /dos/z/4x4_16/sauce/keydrv.h:0:601:0: +openfiles: /dos/z/4x4_16/sauce/sprite.h:590:35:0: +openfiles: /dos/z/4x4_16/sauce/tile.h:327:173:0: +openfiles: /dos/z/4x4_16/sauce/vgabuff.h:0:0:0: +openfiles: /dos/z/4x4_16/sauce/vgautils.h:0:0:0: +openfiles: /dos/z/4x4_16/sauce/keydrv.c:0:0:0: +openfiles: /dos/z/4x4_16/sauce/sprite.c:0:0:0: +openfiles: /dos/z/4x4_16/sauce/tile.c:304:55:1: +openfiles: /dos/z/4x4_16/sauce/vgabuff.c:0:0:0: +openfiles: /dos/z/4x4_16/sauce/vgautils.c:0:0:0: snr_recursion_level: 0 convertcolumn_horizontally: 0 adv_open_matchname: 0 @@ -19,10 +30,10 @@ view_left_panel: 0 default_mime_type: text/plain e2c.convert_xml: 1 c2e.convert_iso: 0 -opendir: file:///dos/z/4x4_16/tauron/C_SRC +opendir: file:///dos/z/4x4_16/sauce wrap_text_default: 0 bookmarks_filename_mode: 1 -ssearch_text: fmem +ssearch_text: 386 snr_casesens: 0 view_blocks: 1 name: project 16 @@ -60,19 +71,30 @@ recent_files: file:///dos/z/4x4_16/tauron/C_SRC/TESTS.CPP recent_files: file:///dos/z/4x4_16/tauron/C_SRC/MODES.CPP recent_files: file:///dos/z/4x4_16/tauron/C_SRC/FONT1.H recent_files: file:///dos/z/4x4_16/tauron/C_SRC/FONT2.H +recent_files: file:///dos/z/4x4_16/tile.c +recent_files: file:///dos/z/4x4_16/tile.h +recent_files: file:///dos/z/4x4_16/sauce/jstick.h +recent_files: file:///dos/z/4x4_16/sauce/keydrv.h +recent_files: file:///dos/z/4x4_16/sauce/sprite.h +recent_files: file:///dos/z/4x4_16/sauce/tile.h +recent_files: file:///dos/z/4x4_16/sauce/vgautils.h +recent_files: file:///dos/z/4x4_16/sauce/keydrv.c +recent_files: file:///dos/z/4x4_16/sauce/vgabuff.h +recent_files: file:///dos/z/4x4_16/sauce/sprite.c +recent_files: file:///dos/z/4x4_16/sauce/tile.c +recent_files: file:///dos/z/4x4_16/sauce/vgautils.c +recent_files: file:///dos/z/4x4_16/sauce/vgabuff.c snr_replacetype: 0 -savedir: file:///dos/z/16/16 +savedir: file:///dos/z/4x4_16/sauce spell_check_default: 1 spell_insert_entities: 0 last_filefilter: htmlbar_notebooktab: 0 view_blockstack: 1 snr_escape_chars: 0 -htmlbar_view: 1 +htmlbar_view: 0 spell_lang: en ssearch_dotmatchall: 0 -searchlist: put -searchlist: print searchlist: d put searchlist: print searchlist: tile @@ -86,6 +108,8 @@ searchlist: se searchlist: searchlist: rect searchlist: fmem +searchlist: vga +searchlist: 386 autocomplete: 1 outputb_show_all_output: 0 bookmarks_show_mode: 0 diff --git a/16/sauce/jstick.h b/16/sauce/jstick.h new file mode 100644 index 00000000..1c9cf777 --- /dev/null +++ b/16/sauce/jstick.h @@ -0,0 +1,46 @@ +#define JOYPORT 0x201 +#define J1B1 0x10 +#define J1B2 0x20 +#define J2B1 0x40 +#define J2B2 0x80 +#define J1 0x01 +#define J2 0x02 +#define J1X 0x01 +#define J1Y 0x02 + + +unsigned char joybutton(unsigned char button) { + outp(JOYPORT,0); + return ((unsigned char) (~inp(JOYPORT) &button)); +}//end joybutton + +int joy1b(int button); + #pragma aux joy1b = \ + "mov dx, 0x201" \ + "out dx, al" \ + "in al, dx" \ + "and ax, bx" \ + "xor ax, bx" \ + parm [bx] \ + modify[dx ax] \ + value[ax]; + +extern unsigned int joystick( unsigned char _stick ); + #pragma aux joystick = \ + "cli" \ + "mov ah,ch" \ + "xor al,al" \ + "xor cx,cx" \ + "mov dx,0x201" \ + "out dx,al" \ + "charged:" \ + "in al,dx" \ + "test al,ah" \ + "loopne charged" \ + "xor ax,ax" \ + "sub ax,cx" \ + "sti" \ + parm [ch] \ + modify [ax]; + + diff --git a/16/sauce/keydrv.c b/16/sauce/keydrv.c new file mode 100644 index 00000000..03ef6864 --- /dev/null +++ b/16/sauce/keydrv.c @@ -0,0 +1,64 @@ +#include +#include + +#include "keydrv.h" + +extern int pressed; +extern char keymap[]; + +static void (__interrupt __far * old9h ) () ; //holds dos key int + + + +void __interrupt __far Key_handler() { + int scan,cv; + + irenable(); + scan = inp(0x60); //read scan code + cv = inp(0x61); + outp( 0x61, cv | 0x80 ); + outp( 0x61, cv ); + outp(0x20, 0x20); //reset key int + + if(scan > 127) { //on break set keymap 0, dec pressed + keymap[(scan & 127)] = 0; + pressed -= 1; + } + else if(keymap[scan] == 0) { //on make set keymap 1, inc pressed + pressed += 1; //if not already set + keymap[scan] = 1; + } + +} + +void hook_keys() { + int i; + + for(i=0; i<128; i++) //set all keys to off + keymap[i] = 0; + pressed = 0; //set number keys pressed to 0 + + old9h = _dos_getvect ( 0x9 ); //save old key int + _dos_setvect ( 0x9 , Key_handler ); //set key int to new handler +} + +void release_keys() { + _dos_setvect ( 0x9 , old9h ) ; // Return to DOS keyboard driver +} + +void waitkey(int key) { + int temp = 0; + while(!temp) + if(keymap[key]) + temp = 1; +} + +void waitkeyup(int key) { + int temp = 0; + while(!temp) + if(!keymap[key]) + temp = 1; +}//end waitkeyup + + + diff --git a/16/sauce/keydrv.h b/16/sauce/keydrv.h new file mode 100644 index 00000000..3602dbca --- /dev/null +++ b/16/sauce/keydrv.h @@ -0,0 +1,51 @@ +/********************************************** + to use keydrv must include global variables: + int pressed; //globals for key driver (# keys pressed) + char keymap[128]; //map of all keys and their state +***********************************************/ + +#ifndef keydrv_h +#define keydrv_h + + +void irdisable(); +#pragma aux irdisable = \ + "cli"; + +void irenable(); +#pragma aux irenable = \ + "sti"; + +void hook_keys(); //installs keydrv,saves dos driver,0's out globals +void release_keys(); //reinstalls dos driver +void waitkey(int key); //waits for a key to be pressed then returns +void waitkeyup(int key); //waits for key specified by parameter + //to be released + +//scan code defines +#define ESC 1 +#define KEY1 2 +#define KEY2 3 +#define KEY3 4 +#define KEY4 5 +#define KEY5 6 +#define KEY6 7 +#define KEY7 8 +#define KEY8 9 +#define KEY9 10 +#define KEY0 11 +#define KEYQ 16 +#define KEYA 30 +#define KEYJ 36 +#define KEYL 38 +#define LSHIFT 42 +#define KEYZ 44 +#define SPACE 57 +#define UP 72 +#define LEFT 75 +#define RIGHT 77 +#define DOWN 80 + +#endif + + diff --git a/16/sauce/sprite.c b/16/sauce/sprite.c new file mode 100644 index 00000000..50aba741 --- /dev/null +++ b/16/sauce/sprite.c @@ -0,0 +1,245 @@ +#include +#include + +#include "sprite.h" + +extern unsigned char far* dbuffer; + +int sprcreate(sprite *spr, int width, int height, int frames, int trans) { + int i; //loop counter + int error = 0; + + spr->x_dim = width; + spr->y_dim = height; + spr->numimages = frames; + spr->state = 0; + spr->transparent = trans; + for(i=0; iimages[i] = (unsigned char far*)_fmalloc(width * height); + if(!spr->images[i]) + error = 1; + } + spr->background = (unsigned char far*)_fmalloc(width * height); + if(!spr->background) + error = 1; + + return error; +}//end sprcreate + +void sprclose(sprite *spr) { + int i; // loop counter + + for(i=0; inumimages; i++) + _ffree(spr->images[i]); + _ffree(spr->background); +}//end sprclose + +void sprload (sprite * spr) { + unsigned char far* dest; + unsigned char far* source; + int x_loc = 0, y_loc = 0; //frame coordinates in dbuffer + int i,j; //loop counters + + for(i=0; i < spr->numimages; i++) { + x_loc = i * (spr->x_dim + 1); + if (x_loc > (320 - spr->x_dim)) { + x_loc = 0; + y_loc += (spr->y_dim + 1); + }//endif + source = dbuffer + ((y_loc * 320) + x_loc); + dest = spr->images[i]; + for(j=0; j < spr->y_dim; j++) { + _fmemcpy(dest,source,spr->x_dim); + source += 320; + dest += spr->x_dim; + }//end for + }//end outer for + +}//end sprload + +void sprinit(sprite *spr,int x,int y,int fimage) { + spr->state = 1; + spr->x_loc = x; + spr->y_loc = y; + spr->curimage = fimage; + sprback(spr); +}//end sprinit + +void sprback(sprite * spr) { + int width = spr->x_dim; + int height = spr->y_dim; + int xloc = spr->x_loc; + int yloc = spr->y_loc; + unsigned char far* source = dbuffer; + unsigned char * dest = spr->background; + int i; //loop counter + + source += ((yloc << 8) + (yloc << 6) + xloc); + + for(i=0; i < height; i++) { + puturow(dest,source,width); + source += 320; + dest += width; + }//end for +}//end sprback + +void sprwrite(sprite *spr) { + unsigned char far* dest = dbuffer; + unsigned char * source = spr->images[spr->curimage]; + int height = spr->y_dim; + int width = spr->x_dim; + int i,x,y; //loop counters + + dest += ((spr->y_loc << 8) + (spr->y_loc << 6) + spr->x_loc); + + if(!(spr->transparent)) + for(i=0; i < height; i++) { + _fmemcpy(dest,source,width); + dest += 320; + source += width; + }//end for + else { + for(y=0; ybackground; + int height = spr->y_dim; + int width = spr->x_dim; + int i; //loop counter + + dest += ((spr->y_loc << 8) + (spr->y_loc << 6) + spr->x_loc); + + + for(i=0; ix_dim = source->x_dim; + dest->y_dim = source->y_dim; + dest->state = source->state; + dest->numimages = source->numimages; + dest->curimage = source->curimage; + dest->transparent = source->transparent; + for(i=0; inumimages; i++) + dest->images[i] = source->images[i]; + dest->background = (unsigned char far*)_fmalloc(source->x_dim * source->y_dim); +}//end copy + +/* + +sprcopy(sprite *dest, sprite *source) { + int i; //loop counter + + dest->x_dim = source->x_dim; + dest->y_dim = source->y_dim; + dest->numimages = source->numimages; + dest->curimage = source->curimage; + dest->transparent = source->transparent; + for(i=0; iimages[i] = source->images[i]; + dest->background = (unsigned char far*)_fmalloc(width * height); +}//end copy + +int collide(sprite * orig,sprite *check) { + if(orig->x_loc > check->x_loc) { + if((orig->x_loc - check->x_loc) >= check->x_dim) + return 0; + } + else if((check->x_loc - orig->x_loc) >= orig->x_dim) + return 0; + if(orig->y_loc > check->y_loc) { + if((orig->y_loc - check->y_loc) >= check->y_dim) + return 0; + } + else if((check->y_loc - orig->y_loc) >= orig->y_dim) + return 0; + return 1; +}//end collide + + + + + + +writesprclip(sprite * in,unsigned char far * dest) { + unsigned char far * source = in->images[in->curimage]; + + int sx,sy; + int width; + int bx = 0,by = 0, bwidth = 0,bheight = 0; + unsigned char pixel; + + width = in->x_dim; + bwidth = width; + bheight = in->y_dim; + sx = in->x_loc; + sy = in->y_loc; + + if(!(sx>319 || sy>199 || sx+width<1 || sy+bheight<1)) { + if(sx<0) { + bx = -sx; + sx = 0; + bwidth -= bx; + } + else if(sx+width >= 319) { + bx = 0; + bwidth = 319 -sx; + } + + if(sy<0) { + by = -sy; + sy = 0; + bheight -= by; + } + else if(sy+bheight>199) { + by = 0; + bheight = 199 - sy; + } + + dest = dest + (sy << 8) + (sy << 6) + sx; + in->preclip = (by * width) + bx; + source = source + in->preclip; + + if(in->transparent) { + for(int y = 0; y < bheight; y++) { + for(int x = 0; x < bwidth; x++) { + if((pixel=source[x])) + dest[x] = pixel; + }//end for x + dest +=320; + source+=width; + }//end for y + }//end if + else { + for(int y =0; y < bheight; y++) { + _fmemcpy(dest,source,bwidth); + dest += 320; + source += width; + }//end for y + }//end else + + in->x_clip = sx; + in->y_clip = sy; + in->x_dim_clip = bwidth; + in->y_dim_clip = bheight; + } + +}//end writesprclip + +*/ diff --git a/16/sauce/sprite.h b/16/sauce/sprite.h new file mode 100644 index 00000000..b6cd6733 --- /dev/null +++ b/16/sauce/sprite.h @@ -0,0 +1,40 @@ +#ifndef sprite_h +#define sprite_h + +#define NUMFRAME 11 //max # of frames per sprite + +typedef struct sprite_typ + { + int x_loc; + int y_loc; + int x_dim; + int y_dim; + short numimages; + short curimage; + short state; + short transparent; + unsigned char far * images[NUMFRAME]; + unsigned char far * background; + }sprite; + +int sprcreate(sprite *spr, int width, int height, int frames, int trans); +void sprclose(sprite *spr); +void sprload (sprite * spr); +void sprinit(sprite *spr,int x,int y,int fimage); +void sprback(sprite * spr); +void sprwrite(sprite *spr); +void sprwrite(sprite *spr); +void sprerase(sprite *spr); +void sprcopy(sprite *dest, sprite *source); + +void puturow(unsigned char far* dest, unsigned char far* source, int size); +#pragma aux puturow = \ + "mov bx, 0x3" \ + "and bx, cx" \ + "shr cx, 0x2" \ + "rep movsd" \ + "mov cx, bx" \ + "rep movsb" \ + parm [es di] [ds si] [cx] \ + modify [bx]; +#endif diff --git a/16/sauce/tile.c b/16/sauce/tile.c new file mode 100644 index 00000000..f33a9369 --- /dev/null +++ b/16/sauce/tile.c @@ -0,0 +1,152 @@ +#include "tile.h" +#include +#include + + +extern unsigned char far* dbuffer; + +//copy 16x16 tile to dest, loop unrolled 4 times +void putile(unsigned char far* dest, unsigned char far* source); +#pragma aux putile= \ + "mov bx, 0" \ + "marker:" \ + "mov cx, 4" \ + "rep movsb" \ + "add di, 304" \ + "mov cx, 4" \ + "rep movsb" \ + "add di, 304" \ + "mov cx, 4" \ + "rep movsb" \ + "add di, 304" \ + "mov cx, 4" \ + "rep movsb" \ + "add di, 304" \ + "add bx, 1" \ + "cmp bx, 4" \ + "jnz marker" \ + modify [cx bx] \ + parm [es di] [ds si]; + +int tilecreate(tile *ntile, int frames) { + int i; //loop counter + int error = 0; + + ntile->numimages = frames; + ntile->state = 0; + + for(i=0; iimages[i] = (unsigned char far*)_fmalloc(256); + if(!ntile->images[i]) + error = 1; + } + + return error; +}//end tilecreate + +void tileclose(tile *dtile) { + int i; // loop counter + + for(i=0; inumimages; i++) + _ffree(dtile->images[i]); +}//end sprclose + +void tileload (tile * in) { + unsigned char far* dest; + unsigned char far* source; + int x_loc = 0, y_loc = 0; //frame coordinates in dbuffer + int i,j; //loop counters + + for(i=0; i < in->numimages; i++) { + x_loc = i * (17); + if (x_loc > (304)) { + x_loc = 0; + y_loc += (17); + }//endif + source = dbuffer + ((y_loc * 320) + x_loc); + dest = in->images[i]; + for(j=0; j < 16; j++) { + _fmemcpy(dest,source,16); + source += 320; + dest += 16; + }//end for + }//end outer for + +}//end tileload + +writetile(tile *out, unsigned char far* dest) { + unsigned char far* source; + + dest += ((out->y_loc << 8) + (out->y_loc << 6) + out->x_loc); + source = out->images[out->curimage]; + + putile(dest,source); + return 0; + +}//end writetile + +int writetile_xclip(tile *out, unsigned char far* dest) { + int dx; //clipped starting x location + int dwidth; //clipped width of sprite + int i; + + unsigned char far * source = out->images[out->curimage]; + + + if(out->x_loc < 0) { + if(out->x_loc > -16) { + dx = 0; + // preclip = - out->x_loc; + source -= out->x_loc; + dwidth = 16 + out->x_loc; + } + else + return 0; //tile not visible + } + else if(out->x_loc > 303) { + if(out->x_loc < 320) { + // preclip = 0; + dx = out->x_loc; + dwidth = 320 - dx; + } + else + return 0; //tile not visible + } + else { + // preclip = 0; + dwidth = 16; + dx = out->x_loc; + } + + + dest= dest + (out->y_loc << 8) + (out->y_loc << 6) + dx; //find first pixel in dest + + for(i = 0; i < 16; i++) { + _fmemcpy(dest,source,dwidth); + source += 16; + dest += 320; + } + + // x_clip = dx; + // x_dim_clip = dwidth; + + return 1; +}//writetile_xclip + +/* not sure if this is working +*********************************************************** +sprite::writetile_prexclip(unsigned char far* dest) { + int dwidth = x_dim_clip; + unsigned char far * source = images[curimage]; + int i; + + dest= dest + (y_loc << 8) + (y_loc << 6) + x_clip; //find first pixel in dest + source += preclip; //set source at first visible pixel + + for(i = 0; i < 16; i++) { + _fmemcpy(dest,source,dwidth); + source += 16; + dest += 320; + } +} +***************************************************************/ diff --git a/16/sauce/tile.h b/16/sauce/tile.h new file mode 100644 index 00000000..04dfb2df --- /dev/null +++ b/16/sauce/tile.h @@ -0,0 +1,39 @@ +#ifndef tile_h +#define tile_h + + +#define NUMTIMAGE 10 // size of tile image array + +// all tiles are 16x16 images with no background scanning +typedef struct tile_typ + { + int x_loc; + int y_loc; + short numimages; + short curimage; + short state; + unsigned char far * images[NUMTIMAGE]; + }tile; + +//FUNCTIONS + +// allocate memory for a tile with images[frames] +// sets tile.state = 0; returns 1 if memory not allocated +int tilecreate(tile *ntile, int frames); + +//frees image memory used by tile +void tileclose(tile *dtile); + +// reads all tile images from double buffer +// images must be in double buffer b4 called +void tileload (tile * in); + +// writes tile to screen(dest points to upper left corner) +// at location (tile.x_loc,tile.y_loc) +writetile(tile *out, unsigned char far* dest); + +// writes tile to screen(dest) clipping the left or right +// edge if necessary, returns 0 if tile completely off screen +int writetile_xclip(tile *out, unsigned char far* dest); + +#endif diff --git a/16/sauce/vgabuff.c b/16/sauce/vgabuff.c new file mode 100644 index 00000000..3c9faa85 --- /dev/null +++ b/16/sauce/vgabuff.c @@ -0,0 +1,120 @@ +#include + +#include "vgautils.h" +#include "vgabuff.h" + +extern unsigned char far * dbuffer; +static FILE * fptr; //used to hold location in graphics file + +int vbinit(int height) { + height = height * 320; + dbuffer = (unsigned char far*)_fmalloc(height); + if(dbuffer) + return 1; + else + return 0; +}//initbuff + +vbclose() {_ffree(dbuffer);} + +int getpcximage(char fname[], int plt) +{ + int z,t; //loop counters + FILE * fptr; + rgbcolor_ptr tcolor; + unsigned int index = 0; + char temp; + int run; + + if ((fptr = fopen(fname,"rb")) == 0) { + return 0; + }//end if file not found + + if(!dbuffer) //if buff memory not allocated ret 0 + return 0; + + for(z=0; z<128; z++) + (char)getc(fptr); + while(index < 64000) { + temp = (char)getc(fptr); + if(temp>=192) { + run = temp - 192; + temp = (char)getc(fptr); + while ((run-- > 0) && (index < 64000)) + dbuffer[index++] = temp; + }//endif + else + dbuffer[index++] = temp; + }//end while + + if(plt) { + fseek(fptr,-768L,SEEK_END); + for(t=0; t<256; t++) { + tcolor->red = (unsigned char)(getc(fptr) >> 2); + tcolor->green = (unsigned char)(getc(fptr) >> 2); + tcolor->blue = (unsigned char)(getc(fptr) >> 2); + write_rgbcolor_reg(t,tcolor); + }//end for + }//end if + + fclose(fptr); + + return 1; +}//end getpcximage + +int pcxopen(char fname[]) +{ + int z; //loop counter + + if ((fptr = fopen(fname,"rb")) == 0) { + return 0; + }//end if file not found + + if(!dbuffer) //if buff memory not allocated ret 0 + return 0; + //read past header + for(z=0; z<128; z++) + (char)getc(fptr); + + pcxfadvance(); + + return 1; +}//end pcxopen + + +void pcxfadvance() +{ + unsigned int index = 0; + char temp; + int run; + + while(index < 64000) { + temp = (char)getc(fptr); + if(temp>=192) { + run = temp - 192; + temp = (char)getc(fptr); + while ((run-- > 0) && (index < 64000)) + dbuffer[index++] = temp; + }//endif + else + dbuffer[index++] = temp; + }//end while + +}//end pcxfadvance + +void pcxclose() +{ + int t; //loop counters + rgbcolor_ptr tcolor; + + fseek(fptr,-768L,SEEK_END); + for(t=0; t<256; t++) { + tcolor->red = (unsigned char)(getc(fptr) >> 2); + tcolor->green = (unsigned char)(getc(fptr) >> 2); + tcolor->blue = (unsigned char)(getc(fptr) >> 2); + write_rgbcolor_reg(t,tcolor); + }//end for + + fclose(fptr); + +}//end pcxclose diff --git a/16/sauce/vgabuff.h b/16/sauce/vgabuff.h new file mode 100644 index 00000000..fd7e4dd1 --- /dev/null +++ b/16/sauce/vgabuff.h @@ -0,0 +1,45 @@ +#ifndef vgabuff_h +#define vgabuff_h + +//allocates 320 * height bytes for buff +int vbinit(int height); + +//frees space held by buff +vbclose(); + +/********** dbtovga ***************************** +* function to copy from memory to vga +* dest = location in vga to start copying to +* size = source size / 4 (size mod 4 must = 0) +************************************************/ +void dbtovga(unsigned char far* dest, unsigned char far* source, int size); +#pragma aux dbtovga= \ + "rep movsd" \ + parm [es di] [ds si] [cx]; + +/************* getpcximage *********************************** +* function reads a 320x200x256 pcx file and outputs to screen +* if plt = 0 then the palette is not read +* returns 0 if file unopened or screen not allocated +*************************************************************/ +int getpcximage(char fname[], int plt); + +/*************************************************************** +* new pcx functions for single graphics file created 10/12/97 +* still use whole 320x200 for each sprite/tile - change soon! +* note: no error checking, yet +* functions should be moved to own file +***************************************************************/ + +//opens pcx file and reads first 320x200 image, no palette +//returns 0 if file not found, 1 otherwise +int pcxopen(char fname[]); + +//reads next 320x200 image in file opened by pcxopen +void pcxfadvance(); + +//reads the pallette into the vga registers and closes the file +void pcxclose(); + + +#endif diff --git a/16/sauce/vgautils.c b/16/sauce/vgautils.c new file mode 100644 index 00000000..11121205 --- /dev/null +++ b/16/sauce/vgautils.c @@ -0,0 +1,73 @@ +#include "vgautils.h" + +void setvgamode(int mode) +{ + union REGS inregs,outregs; + + inregs.h.ah = 0; //set video mode subfunction + inregs.h.al = (unsigned char)mode; //video mode to change to + int86(0x10, &inregs, &outregs); +}//end set_graphics_mode + +void write_rgbcolor_reg(int index, rgbcolor_ptr color) +{ + outp(COLOR_REGISTER_WR, index); //set register + outp(COLOR_DATA,color->red); + outp(COLOR_DATA,color->green); + outp(COLOR_DATA,color->blue); +}//end write_rgbcolor_reg + +rgbcolor_ptr read_rgbcolor_reg(int index, rgbcolor_ptr color) +{ + outp(COLOR_REGISTER_RD, index); + color->red = (unsigned char)inp(COLOR_DATA); + color->green = (unsigned char)inp(COLOR_DATA); + color->blue = (unsigned char)inp(COLOR_DATA); + return color; +}//emd read_rgbcolor_reg + +void read_palette(int start_reg,int end_reg,rgb_palette_ptr pal) +{ + int index; + rgbcolor color; + + for(index = start_reg; index<=end_reg; index++) + { + read_rgbcolor_reg(index,(rgbcolor_ptr)&color); + + pal->colors[index].red = color.red; + pal->colors[index].green = color.green; + pal->colors[index].blue = color.blue; + }//end for + + pal->start_reg = start_reg; + pal->end_reg = end_reg; +}//end read_palette + +void write_palette(int start_reg,int end_reg, rgb_palette_ptr pal) +{ + int index; + + for(index=start_reg; index <= end_reg; index++) + write_rgbcolor_reg(index,&(pal->colors[index])); +}//end write_palette + +void putchr(char out, int color, unsigned char far* dest) { + unsigned char far* chrs = (unsigned char far*)ROMCHRS; + int i,j; //loop counters + int mask; //bitmask to extract bits from character set + + chrs += (out << 3); //set romptr to char * 8 bytes per char + + for(i=0; i<8; i++) { + mask = 128; + for(j=0; j<8; j++) { + if(*chrs & mask) + dest[j] = color; + mask = mask >> 1; + } + chrs++; + dest += 320; + } +}//end putchr + diff --git a/16/sauce/vgautils.h b/16/sauce/vgautils.h new file mode 100644 index 00000000..77d16421 --- /dev/null +++ b/16/sauce/vgautils.h @@ -0,0 +1,48 @@ +#ifndef vgautils_h +#define vgautils_h + +#define MODE13 0x13 +#define TEXT 0x03 +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 200 + +#define COLOR_MASK 0x3c6 +#define COLOR_REGISTER_RD 0x3c7 +#define COLOR_REGISTER_WR 0x3c8 +#define COLOR_DATA 0x3c9 +#define VGACARD 0xA0000000 +#define ROMCHRS 0xF000FA6E + +#include +#include +#include +#include +#include + +typedef struct rgbcolor_typ + { + unsigned char red; + unsigned char green; + unsigned char blue; + }rgbcolor, *rgbcolor_ptr; + +typedef struct rgb_palette_typ + { + int start_reg; //starting register to save + int end_reg; // last register to save + rgbcolor colors[256]; // palette storage + }rgb_palette, *rgb_palette_ptr; + +void setvgamode(int mode); +void write_rgbcolor_reg(int index, rgbcolor_ptr color); +rgbcolor_ptr read_rgbcolor_reg(int index, rgbcolor_ptr color); +void read_palette(int start_reg,int end_reg,rgb_palette_ptr pal); +void write_palette(int start_reg,int end_reg, rgb_palette_ptr pal); +void putchr(char out, int color, unsigned char far* dest); + +/***** syncvr() *********************************** +* inline funtction that waits for verticle retrace +***************************************************/ +#define syncvr() while(inp(0x3da) & 0x08);while(!(inp(0x3da) & 0x08)); + +#endif