⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tc005rot.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
字号:
/******************************************************************************//*                                                                            *//*                 tc0005rot: TAITO ROTATION LAYER (F2-SYSTEM)                *//*                                                                            *//******************************************************************************/#include "gameinc.h"#include "tc005rot.h"/*'tc0005rot' is a made up name, until someone can give me the more board info.Or this layer could be another part of tc0100scn (but I guess it isn't).TC0005ROT RAM---------------------------+---------------00000 - 01FFF | BG ROT RAM02000 - 0200F | SCROLL RAM--------------+---------------BG ROT RAM---------------+--------+---------------------Byte | Bit(s) | Info-----+76543210+---------------------  0  |xx......| Colour Bank  0  |..xxxxxx| Tile Number (high)  1  |xxxxxxxx| Tile Number (low)-----+--------+---------------------SCROLL RAM---------------+--------+---------------------Byte | Bit(s) | Info-----+76543210+---------------------  0  |.......x| ?  0  |......x.| ?  2  |......xx| BG0 Scroll X (high)  3  |xxxxxxxx| BG0 Scroll X (low)  4  |......xx| BG1 Scroll X (high)  5  |xxxxxxxx| BG1 Scroll X (low)  6  |......xx| BG0 Scroll Y (high)  7  |xxxxxxxx| BG0 Scroll Y (low)  8  |......xx| BG1 Scroll Y (high)  9  |xxxxxxxx| BG1 Scroll Y (low)-----+--------+---------------------0000.0000.000X.XXXXXXXX.xxxx.xxxx.xxxxSXXX.xxxx.xxxx.xxxxSXXX.xxxx.xxxx.xxxx0000.0000.000Y.YYYYYYYY.yyyy.yyyy.yyyySYYY.yyyy.yyyy.yyyySYYY.yyyy.yyyy.yyyyNot implemented:- Various things.- Priority with sprites.Normal Games:- Camel Try      - OKR180 Games:- Don Doko Don   - OKR270 Games:- Drift Out      - OK*/static UINT8 *RAM_BG;static UINT8 *RAM_SCR;static UINT8 *GFX_BG;static UINT8 rot_pens;static UINT8 rot_map[64];static BITMAP *pixel_bitmap;void init_tc0005rot(int mode){   int ta;   RAM_BG = tc0005rot.RAM;   RAM_SCR= tc0005rot.RAM_SCR;   GFX_BG = tc0005rot.GFX_ROT;   rot_pens = Reserve_Pens(64);   for(ta=0;ta<64;ta++){      rot_map[ta] = rot_pens+ta;   }   if(mode){      rot_map[0] = 255;      rot_map[16] = 255;      rot_map[32] = 255;      rot_map[48] = 255;   }   if(pixel_bitmap) destroy_bitmap(pixel_bitmap);   pixel_bitmap = create_bitmap_ex(8,512,512);   clear(pixel_bitmap);}static BITMAP *bitmap_store;void tc0005rot_set_bitmap(void){   bitmap_store = GameBitmap;   GameBitmap = pixel_bitmap;   init_spr8x8asm();}void tc0005rot_unset_bitmap(void){   GameBitmap = bitmap_store;   init_spr8x8asm();}void tc0005rot_bg0_ww(UINT32 address, UINT16 data){   if(ReadWord(&RAM_BG[address&0x1FFF])!=data){   // Update RAM   // ----------   WriteWord(&RAM_BG[address&0x1FFF],data);   // Update BG0 Buffer   // -----------------   if(RefreshBuffers==0){      Draw8x8_Mapped(&GFX_BG[(data&0x3FFF)<<6],(address&0x7E)<<2,((address&0x1F80)>>4),&rot_map[(data>>10)&0x30]);   }   }}void tc0005rot_refresh_buffer(void){   UINT32 address;   UINT16 data;   tc0005rot_set_bitmap();   for(address=0;address<0x2000;address+=2){      data = ReadWord(&RAM_BG[address]);      Draw8x8_Mapped(&GFX_BG[(data&0x3FFF)<<6],(address&0x7E)<<2,((address&0x1F80)>>4),&rot_map[(data>>10)&0x30]);   }   tc0005rot_unset_bitmap();}static UINT32 tmp_f1x,tmp_f1y,tmp_f1xd,tmp_f1yd,tmp_f2xd,tmp_f2yd;static UINT32 tmp_src,tmp_bit;static void RotateF2SystemBG0(fixed f1x, fixed f1y, fixed f1xd,fixed f1yd,fixed f2xd,fixed f2yd){#if !defined(RAINE_DOS) && !defined(RAINE_UNIX)  fixed f2x,f2y;  int dx,dy;  UINT8 ta;#endif     UINT8 *BIT;  UINT8 *SRC;   // Init Stuff   // ----------   f1x+=(16*f2xd);   f1y+=(16*f2yd);   f1x+=(16*f1xd);   f1y+=(16*f1yd);   BIT=GameViewBitmap->line[0];   SRC=pixel_bitmap->line[0];   // Draw the rotated data   // ---------------------#if !defined(RAINE_DOS) && !defined(RAINE_UNIX)   dy=224;   do{      dx=320;      f2x=f1x;      f2y=f1y;      do{         ta=SRC[((f2x>>16)&0x1FF)|((f2y>>7)&0x3FE00)];         if(ta!=255) *BIT=ta;         f2x+=f2xd;         f2y+=f2yd;         BIT++;      }while(--dx);      BIT+=(64);      f1x+=f1xd;      f1y+=f1yd;   }while(--dy);#else   tmp_f1x=f1x;   tmp_f1y=f1y;   tmp_f1xd=f1xd;   tmp_f1yd=f1yd;   tmp_f2xd=f2xd;   tmp_f2yd=f2yd;   tmp_src=(UINT32) &SRC[0];   tmp_bit=(UINT32) &BIT[0];   if(((tmp_f1yd>>5)==0x0800)&&((tmp_f1xd>>4)==0x0000)&&((tmp_f2yd>>5)==0x0000)&&((tmp_f2xd>>4)==0x1000)){     tmp_f1x=(tmp_f1x>>16)&0x1FF;     tmp_f1y=((tmp_f1y>>16)&0x1FF)<<9;        if((tmp_f1x&3)==0){#ifdef RAINE_DOS     asm("	pushl	%%ebp	movl	_tmp_f1x,%%eax	movl	_tmp_src,%%ebx	movl	%%eax,SMC4-4	movl	%%ebx,SMC5-4	movl	_tmp_f1y,%%ebx	movl	_tmp_bit,%%edi	movb	$255,%%ch	movl	$224,%%edx1:	movl	$320/4,%%ebp	movl	$0x2164334A,%%eaxSMC4:	movl	%%ebx,%%esi	addl	$0x2164334A,%%esiSMC5:2:	movl	(%%esi,%%eax),%%ecx	testl	%%ecx,%%ecx		\n// Skip Blank Lines	jz	5f        testb	$0x80,%%cl	jnz	8f	movb	%%cl,(%%edi)8:        testb	$0x80,%%ch	jnz	8f	movb	%%ch,1(%%edi)8:	roll	$16,%%ecx        testb	$0x80,%%cl	jnz	8f	movb	%%cl,2(%%edi)8:        testb	$0x80,%%ch	jnz	8f	movb	%%ch,3(%%edi)8:5:	addl	$4,%%eax	addl	$4,%%edi	andl	$0x001FF,%%eax	decl	%%ebp	jnz	2b	addl	$0x00200,%%ebx	addl	$(64),%%edi	andl	$0x3FE00,%%ebx	decl	%%edx	jnz	1b	popl	%%ebp	"	:	:	: "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" , "%ebp"   );#else // RAINE_UNIX     asm("	pushl	%%ebp	movl	tmp_f1y,%%ebx	movl	tmp_bit,%%edi	movb	$255,%%ch	movl	$224,%%edx1:	movl	$320/4,%%ebp        movl    (tmp_f1x),%%eax	movl	%%ebx,%%esi        addl    tmp_src,%%esi2:	movl	(%%esi,%%eax),%%ecx	testl	%%ecx,%%ecx		\n// Skip Blank Lines	jz	5f        testb	$0x80,%%cl	jnz	8f	movb	%%cl,(%%edi)8:        testb	$0x80,%%ch	jnz	8f	movb	%%ch,1(%%edi)8:	roll	$16,%%ecx        testb	$0x80,%%cl	jnz	8f	movb	%%cl,2(%%edi)8:        testb	$0x80,%%ch	jnz	8f	movb	%%ch,3(%%edi)8:5:	addl	$4,%%eax	addl	$4,%%edi	andl	$0x001FF,%%eax	decl	%%ebp	jnz	2b	addl	$0x00200,%%ebx	addl	$(64),%%edi	andl	$0x3FE00,%%ebx	decl	%%edx	jnz	1b	popl	%%ebp	"	:	:	: "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" , "%ebp"   );#endif          return;   }   else{#ifdef RAINE_DOS        asm("	pushl	%%ebp	movl	_tmp_f1x,%%eax	movl	_tmp_src,%%ebx	movl	%%eax,SMC1-4	movl	%%ebx,SMC2-4	movl	_tmp_f1y,%%ebx	movl	_tmp_bit,%%edi					// Mask colour is 255 (skip them)	movb	$255,%%ch					// Screen is 224 high	movl	$224,%%edx1:	movl	$320,%%ebp		\n// Screen is 320 wide	movl	$0x2164334A,%%eaxSMC1:	movl	%%ebx,%%esi	addl	$0x2164334A,%%esiSMC2:2:	movb	(%%esi,%%eax,1),%%cl	incl	%%eax        cmpb	%%ch,%%cl	jz	8f	movb	%%cl,(%%edi)8:	incl	%%edi	andl	$0x001FF,%%eax	decl	%%ebp	jnz	2b	addl	$0x00200,%%ebx	addl	$(64),%%edi	andl	$0x3FE00,%%ebx	decl	%%edx	jnz	1b	popl	%%ebp	"	:	:	: "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" , "%ebp"   );#else // RAINE_UNIX   asm("	pushl	%%ebp	movl	tmp_f1y,%%ebx	movl	tmp_bit,%%edi					// Mask colour is 255 (skip them)	movb	$255,%%ch					// Screen is 224 high	movl	$224,%%edx1:	movl	$320,%%ebp		\n// Screen is 320 wide	movl	(tmp_f1x),%%eax	movl	%%ebx,%%esi	addl	tmp_src,%%esi2:	movb	(%%esi,%%eax,1),%%cl	incl	%%eax        cmpb	%%ch,%%cl	jz	8f	movb	%%cl,(%%edi)8:	incl	%%edi	andl	$0x001FF,%%eax	decl	%%ebp	jnz	2b	addl	$0x00200,%%ebx	addl	$(64),%%edi	andl	$0x3FE00,%%ebx	decl	%%edx	jnz	1b	popl	%%ebp	"	:	:	: "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" , "%ebp"   );#endif      return;   }   }   else{#ifdef RAINE_DOS     asm("	pushl	%%ebp	movl	_tmp_f2xd,%%eax		\n// Poke in the data for the main loops	movl	_tmp_f2yd,%%ebx		\n// <self modifying code>	movl	%%eax,Hack1+1	movl	%%ebx,Hack2+2	movl	_tmp_f1xd,%%eax	movl	_tmp_f1yd,%%ebx	movl	%%eax,Hack3+1	movl	%%ebx,Hack4+2	movl	_tmp_src,%%eax		\n// source buffer (512 x 512 x 1byte/pixel)	movl	%%eax,Hack5+2	movl	$224,%%ebp		\n// dest size y	movl	_tmp_f1x,%%eax	movl	_tmp_f1y,%%ebx	movl	_tmp_bit,%%edi		\n// destination buffer1:	pushl	%%ebp	pushl	%%eax	pushl	%%ebx	movl	$320,%%ebp		\n// dest size x	movl	%%eax,%%ecx	movl	%%ebx,%%edx2:	shrl	$16,%%ecx	shrl	$7,%%edx	andl	$0x001FF,%%ecx		\n// wrap around source x	andl	$0x3FE00,%%edx		\n// wrap around source yHack1:	addl	$0x2164334A,%%eax	orl	%%edx,%%ecxHack2:	addl	$0x2164334A,%%ebxHack5:	movb	0x2164334A(%%ecx),%%dl	movl	%%eax,%%ecx        testb	$0x80,%%dl		\n// bit 7 used for transparent mask	jnz	8f	movb	%%dl,(%%edi)8:	movl	%%ebx,%%edx	incl	%%edi	decl	%%ebp	jnz	2b	popl	%%ebx	popl	%%eax	popl	%%ebp	addl	$(64),%%ediHack3:	addl	$0x2164334A,%%eaxHack4:	addl	$0x2164334A,%%ebx	decl	%%ebp	jnz	1b	popl	%%ebp	"	:	:	: "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp"   );#else     asm("	pushl	%%ebp	movl	$224,%%ebp		\n// dest size y	movl	tmp_f1x,%%eax	movl	tmp_f1y,%%ebx	movl	tmp_bit,%%edi		\n// destination buffer        movl    tmp_src,%%esi1:	pushl	%%ebp	pushl	%%eax	pushl	%%ebx	movl	$320,%%ebp		\n// dest size x	movl	%%eax,%%ecx	movl	%%ebx,%%edx2:	shrl	$16,%%ecx	shrl	$7,%%edx	andl	$0x001FF,%%ecx		\n// wrap around source x	andl	$0x3FE00,%%edx		\n// wrap around source y	addl	(tmp_f2xd),%%eax	orl	%%edx,%%ecx	addl	(tmp_f2yd),%%ebx	movb	(%%esi,%%ecx),%%dl	movl	%%eax,%%ecx        testb	$0x80,%%dl		\n// bit 7 used for transparent mask	jnz	8f	movb	%%dl,(%%edi)8:	movl	%%ebx,%%edx	incl	%%edi	decl	%%ebp	jnz	2b	popl	%%ebx	popl	%%eax	popl	%%ebp	addl	$(64),%%edi	addl	(tmp_f1xd),%%eax	addl	(tmp_f1yd),%%ebx	decl	%%ebp	jnz	1b	popl	%%ebp	"	:	:	: "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp"   );#endif        }#endif}static void RotateBG0(fixed f1x, fixed f1y, fixed f1xd,fixed f1yd,fixed f2xd,fixed f2yd){#if !defined(RAINE_DOS) && !defined(RAINE_UNIX)   fixed f2x,f2y;   int dx,dy;#endif   UINT8 *BIT;   UINT8 *SRC;   // Init Stuff   // ----------   f1x+=(319*f2xd);   f1y+=(319*f2yd);   BIT=GameViewBitmap->line[0];   SRC=pixel_bitmap->line[0];   // Draw the rotated data   // ---------------------#if !defined(RAINE_DOS) && !defined(RAINE_UNIX)   for(dy=0;dy<320;dy++){      f2x=f1x;      f2y=f1y;      for(dx=0;dx<224;dx++){         BIT[0]=SRC[((f2x>>16)&0x1FF)|((f2y>>7)&0x3FE00)];         f2x+=f1xd;         f2y+=f1yd;         BIT++;      }      BIT+=(64);      f1x-=f2xd;      f1y-=f2yd;   }#else   tmp_src=(UINT32) &SRC[0];   tmp_bit=(UINT32) &BIT[0];   tmp_f1xd=f1xd;   tmp_f1yd=f1yd;   tmp_f2xd=f2xd;   tmp_f2yd=f2yd;   tmp_f1x=f1x;   tmp_f1y=f1y;#ifdef RAINE_DOS   asm("	pushl	%%ebp	movl	_tmp_f1xd,%%eax		\n// Poke in the data for the main loops	movl	_tmp_f1yd,%%ebx		\n// <self modifying code>	movl	%%eax,Hck1+1	movl	%%ebx,Hck2+2	movl	_tmp_f2xd,%%eax	movl	_tmp_f2yd,%%ebx	movl	%%eax,Hck3+1	movl	%%ebx,Hck4+2	movl	_tmp_src,%%eax	movl	%%eax,Hck5+2	movl	$320,%%ebp	movl	_tmp_f1x,%%eax	movl	_tmp_f1y,%%ebx	movl	_tmp_bit,%%edi1:	pushl	%%ebp	pushl	%%eax	pushl	%%ebx	movl	$224,%%ebp2:	movl	%%eax,%%ecx	movl	%%ebx,%%edx	shrl	$16,%%ecx	shrl	$7,%%edx	andl	$0x001FF,%%ecx	andl	$0x3FE00,%%edx	orl	%%ecx,%%edxHck5:	movb	0x2164334A(%%edx),%%clHck1:	addl	$0x2164334A,%%eax	movb	%%cl,(%%edi)Hck2:	addl	$0x2164334A,%%ebx	incl	%%edi	decl	%%ebp	jnz	2b	popl	%%ebx	popl	%%eax	popl	%%ebp	addl	$(64),%%ediHck3:	subl	$0x2164334A,%%eaxHck4:	subl	$0x2164334A,%%ebx	decl	%%ebp	jnz	1b	popl	%%ebp	"	:	:	: "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp"   );#else // RAINE_UNIX   asm("	pushl	%%ebp	movl	$320,%%ebp	movl	tmp_f1x,%%eax	movl	tmp_f1y,%%ebx	movl	tmp_bit,%%edi        movl    tmp_src,%%esi1:	pushl	%%ebp	pushl	%%eax	pushl	%%ebx	movl	$224,%%ebp2:	movl	%%eax,%%ecx	movl	%%ebx,%%edx	shrl	$16,%%ecx	shrl	$7,%%edx	andl	$0x001FF,%%ecx	andl	$0x3FE00,%%edx	orl	%%ecx,%%edx	movb	(%%esi,%%edx),%%cl	addl	(tmp_f1xd),%%eax	movb	%%cl,(%%edi)	addl	(tmp_f1yd),%%ebx	incl	%%edi	decl	%%ebp	jnz	2b	popl	%%ebx	popl	%%eax	popl	%%ebp	addl	$(64),%%edi	subl	(tmp_f2xd),%%eax	subl	(tmp_f2yd),%%ebx	decl	%%ebp	jnz	1b	popl	%%ebp	"	:	:	: "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "%ebp"   );#endif   #endif}void tc0005rot_draw_rot_r270(int col_ofs){  //int x,y,zz;  fixed px,py,ang1,ang2,ang3,ang4;   /*if(RefreshBuffers){   zz=0;   for(y=512;y<1024;y+=8){      for(x=0;x<512;x+=8){         Draw8x8_Mapped(&GFX_BG[(ReadWord(&RAM_BG[zz])&0x3FFF)<<6],x,y,&rot_map[(ReadWord(&RAM_BG[zz])>>10)&0x30]);         zz+=2;      }   }   }*/   Set_Pens_15bit_xRGB(rot_pens, col_ofs<<4, 64);   // Copy and Rotate BG0   // -------------------   px=((ReadWord(&RAM_SCR[0x00])<<20)|(ReadWord(&RAM_SCR[0x02])<<4));   py=((ReadWord(&RAM_SCR[0x08])<<20)|(ReadWord(&RAM_SCR[0x0A])<<4));   ang2=ReadWord(&RAM_SCR[0x04]);	// -8000 to 7FF0 (?)   if((ang2&0x8000)!=0){ang2=0-(((ang2^0xFFFF)+1)<<4);}   else{ang2=ang2<<4;}   ang1=ReadWord(&RAM_SCR[0x06]);   if((ang1&0x8000)!=0){ang1=0-(((ang1^0xFFFF)+1)<<4);}   else{ang1=ang1<<4;}   ang4=ReadWord(&RAM_SCR[0x0C]);   if((ang4&0x8000)!=0){ang4=0-(((ang4^0xFFFF)+1)<<4);}   else{ang4=ang4<<4;}   ang3=ReadWord(&RAM_SCR[0x0E]);   if((ang3&0x8000)!=0){ang3=0-(((ang3^0xFFFF)+1)<<4);}   else{ang3=ang3<<4;}   RotateBG0(px,py,ang1,ang2,ang3,ang4);}void tc0005rot_draw_rot(int col_ofs){  //int x,y,zz;   fixed px,py,ang1,ang2,ang3,ang4;   /*if(RefreshBuffers){   zz=0;   for(y=512;y<1024;y+=8){      for(x=0;x<512;x+=8){         Draw8x8_Mapped(&GFX_BG[(ReadWord(&RAM_BG[zz])&0x3FFF)<<6],x,y,&rot_map[(ReadWord(&RAM_BG[zz])>>10)&0x30]);         zz+=2;      }   }   }*/   Set_Pens_12bit_RGBx(rot_pens, col_ofs<<4, 64);   // Copy and Rotate BG0   // -------------------   px=((ReadWord(&RAM_SCR[0x00])<<20)|(ReadWord(&RAM_SCR[0x02])<<4));   py=((ReadWord(&RAM_SCR[0x08])<<20)|(ReadWord(&RAM_SCR[0x0A])<<4));   ang2=ReadWord(&RAM_SCR[0x04]);	// -8000 to 7FF0 (?)   if((ang2&0x8000)!=0){ang2=0-(((ang2^0xFFFF)+1));}   ang1=ReadWord(&RAM_SCR[0x06]);   if((ang1&0x8000)!=0){ang1=0-(((ang1^0xFFFF)+1));}   ang4=ReadWord(&RAM_SCR[0x0C]);   if((ang4&0x8000)!=0){ang4=0-(((ang4^0xFFFF)+1));}   ang3=ReadWord(&RAM_SCR[0x0E]);   if((ang3&0x8000)!=0){ang3=0-(((ang3^0xFFFF)+1));}   RotateF2SystemBG0(px,py,ang1<<4,ang2<<5,ang3<<4,ang4<<5);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -