//*******************************************************************************
//*	e(x,y) = b^2*x^2 + a^2*y^2 - a^2*b^2
//*	a	=	xRadius
//*	b	=	yRadius
//*******************************************************************************
void	dispFillEllipse(int xCenter, int yCenter, int xRadius, int yRadius)
{
int				xx		=	0;
int				yy		=	yRadius;
unsigned int	width	=	1;
long			a2		=	(long)xRadius * xRadius;
long			b2		=	(long)yRadius * yRadius;
long			crit1	=	-(a2 / 4 + xRadius % 2 + b2);
long			crit2	=	-(b2 / 4 + yRadius % 2 + a2);
long			crit3	=	-(b2/4 + yRadius % 2);
long			t		=	-a2 * yy; /* e(x+1/2,y-1/2) - (a^2+b^2)/4 */
long			dxt		=	2 * b2 * xx;
long			dyt		=	-2 * a2 * yy;
long			d2xt	=	2 * b2;
long			d2yt	=	2 * a2;

	while (yy >= 0 &&  xx <= xRadius)
	{
		if (t + b2 * xx <= crit1 ||	 /* e(x+1,y-1/2) <= 0 */
			t + a2 * yy <= crit3) 
		{
			/* e(x+1/2,y) <= 0 */
			incx();
			width	+=	2;
		}
		else if (t - a2 * yy > crit2) 
		{
			/* e(x+1/2,y-1) > 0 */
			//dispRectangle(xCenter - x, yCenter - y, width, 1);
			dispRectangle(xCenter - xx, yCenter - yy, width, 1);
			if (yy != 0)
			{
				//dispRectangle(xCenter- xx, yCenter + y, width, 1);
				dispRectangle(xCenter - xx, yCenter + yy, width, 1);
			}
			incy();
		}
		else
		{
			//dispRectangle(xCenter - xx, yCenter - y, width, 1);
			dispRectangle(xCenter - xx, yCenter - yy, width, 1);
			if (yy != 0)
			{
				//dispRectangle(xCenter - xx, yCenter + y, width, 1);
				dispRectangle(xCenter - xx, yCenter + yy, width, 1);
			}
			incx();
			incy();
			width	+=	2;
		}
	}
	if (yRadius == 0)
	{
		//dispRectangle(xCenter - xRadius, yCenter, 2 * xRadius + 1, 1);
		dispRectangle(xCenter - xRadius, yCenter, 2 * xRadius + 1, 1);
	}
} 
示例#2
0
文件: main.c 项目: Futame/cell
REAL totalCurrent(REAL time, struct State *S, struct State *Sn, REAL ht, struct Cpar *C, struct Is *I, struct Js *J, struct Buf *B, struct Buf *Bn)
{
    REAL IKtot, INatot, ICltot, ICatot;
    
    srflux(S, Sn, ht,  C, J);
    cabuf(S, Sn, ht, C, J, B, Bn);
    
    ical(S, Sn, ht, C, I);
    ibgca(S, Sn, ht, C, I);
    ipk(S, Sn, ht, C, I);
    ina(S, Sn, ht, C, I);
    ibgna(S, Sn, ht, C, I);
    incx(S, Sn, ht, C, I);
    inak(S, Sn, ht, C, I);
    ito(S, Sn, ht, C, I);
    ikr(time, S, Sn, ht, C, I);
    iks(S, Sn, ht, C, I);
    iki(time,S, Sn, ht, C, I);
    ikp(S, Sn, ht, C, I);
    iclca(S, Sn, ht, C, I);
    ibgcl(S, Sn, ht, C, I);
    
    caconc(S, Sn, ht, C, J, I);
    naconc(S, Sn, ht, C, J, I);
    
    INatot = (I->INaJunc + I->INaSl) + (I->INaBkJunc + I->INaBkSl) + 3.0 * (I->IncxJunc + I->IncxSl) + 3.0 * (I->INaKJunc + I->INaKSl) + (I->ICaNaJunc + I->ICaNaSl);
    IKtot = (I->ItoSlow + I->ItoFast) + (I->Ikr  + I->Iks) + I->Iki - 2.0 * (I->INaKJunc + I->INaKSl) + I->Ikp + I->ICaK;
    ICltot = I->IClCa + I->IBgCl;
    ICatot = I->ICaTotJunc + I->ICaTotSl;
    
    return INatot + IKtot + ICltot + ICatot;
}/** totalCurrent **/
void GeneticAlgorithm<EllipseData>::paint(uint individual,uint gene,Farbe ** renderbuffer)
{
    #define incx() x++, dxt += d2xt, t += dxt
    #define incy() y--, dyt += d2yt, t += dyt
    int xc = m_individuals[individual].gene[gene].midx,yc = m_individuals[individual].gene[gene].midy;
    //cout <<"Ellipsenposition: "<<xc<<" "<<yc<<endl;
    int a = m_individuals[individual].gene[gene].radiusx,b = m_individuals[individual].gene[gene].radiusy;
    Farbe col = (Farbe){m_individuals[individual].gene[gene].colr,m_individuals[individual].gene[gene].colr,m_individuals[individual].gene[gene].colr};
    if(!blackwhite)
    {
        col.b = m_individuals[individual].gene[gene].colb;
        col.g = m_individuals[individual].gene[gene].colg;
    }
    int x = 0, y = b;
    unsigned int width = 1;
    long a2 = (long)a*a, b2 = (long)b*b;
    long crit1 = -(a2/4 + a%2 + b2);
    long crit2 = -(b2/4 + b%2 + a2);
    long crit3 = -(b2/4 + b%2);
    long t = -a2*y; /* e(x+1/2,y-1/2) - (a^2+b^2)/4 */
    long dxt = 2*b2*x, dyt = -2*a2*y;
    long d2xt = 2*b2, d2yt = 2*a2;

    while (y>=0 && x<=a) {
        if (t + b2*x <= crit1 ||     /* e(x+1,y-1/2) <= 0 */
            t + a2*y <= crit3) {     /* e(x+1/2,y) <= 0 */
            incx();
            width += 2;
        }
        else if (t - a2*y > crit2) { /* e(x+1/2,y-1) > 0 */
            row(xc-x, yc-y, width,col,renderbuffer);
            if (y!=0)
                row(xc-x, yc+y, width,col,renderbuffer);
            incy();
        }
        else {
            row(xc-x, yc-y, width,col,renderbuffer);
            if (y!=0)
                row(xc-x, yc+y, width,col,renderbuffer);
            incx();
            incy();
            width += 2;
        }
    }
    if (b == 0)
        row(xc-a, yc, 2*a+1,col,renderbuffer);
}
int main(int argc, char const *argv[])
{
	/* applicative or normal order */
	foo(incw(), incx()); 
	s.st.z = '1';
	printf("here %ld\n", sizeof(super));
	return 0;
}
//*******************************************************************************
void	dispOutlineEllipse( int xCenter, int yCenter, int xRadius, int yRadius)
{
int		xx		=	0;
int		yy		=	yRadius;
long	a2		=	(long)xRadius * xRadius;
long	b2		=	(long)yRadius * yRadius;
long	crit1	=	-(a2 / 4 + xRadius % 2 + b2);
long	crit2	=	-(b2 / 4 + yRadius % 2 + a2);
long	crit3	=	-(b2 / 4 + yRadius % 2);
long	t		=	-a2 * yy; /* e(x+1/2,y-1/2) - (a^2+b^2)/4 */
long	dxt		=	2 * b2 * xx;
long	dyt		=	-2 * a2 * yy;
long	d2xt	=	2 * b2;
long	d2yt	=	2 * a2;

	while (yy >= 0 && xx <= xRadius)
	{
		dispPixel(xCenter	+ xx, yCenter + yy);
		if (xx != 0 || yy != 0)
		{
			dispPixel(xCenter - xx, yCenter - yy);
		}
		if (xx != 0 && yy != 0)
		{
			dispPixel(xCenter + xx, yCenter - yy);
			dispPixel(xCenter - xx, yCenter + yy);
		}
		if (t + b2 * xx <= crit1 ||	/* e(x+1,y-1/2) <= 0 */
			t + a2 * yy <= crit3)	 /* e(x+1/2,y) <= 0 */
		{
			incx();
		}
		else if (t - a2 * yy > crit2) /* e(x+1/2,y-1) > 0 */
		{
			incy();
		}
		else
		{
			incx();
			incy();
		}
	}
}
示例#6
0
void ShapeEllipse::draw()
{
    if (this->isSolid)
    {
        int x = 0, y = this->yrad;
        unsigned int width = 1;
        long a2 = (long)this->xrad * this->xrad, b2 = (long)this->yrad * this->yrad;
        long crit1 = -(a2 / 4 + this->xrad % 2 + b2);
        long crit2 = -(b2 / 4 + this->yrad % 2 + a2);
        long crit3 = -(b2 / 4 + this->yrad % 2);
        long t = -a2 * y;
        long dxt = 2 * b2 * x, dyt = -2 * a2 * y;
        long d2xt = 2 * b2, d2yt = 2 * a2;

        while (y >= 0 && x <= this->xrad)
        {
            if (t + b2*x <= crit1 ||
                    t + a2*y <= crit3)
            {
                incx();
                width += 2;
            }
            else if (t - a2*y > crit2)
            {
                drawBox(this->x - x, this->y - y, width, 1, color, ctype);
                if (y != 0)
                    drawBox(this->x - x, this->y + y, width, 1, color, ctype);
                incy();
            }
            else
            {
                drawBox(this->x - x, this->y - y, width, 1, color, ctype);
                if (y != 0)
                    drawBox(this->x - x, this->y + y, width, 1, color, ctype);
                incx();
                incy();
                width += 2;
            }
        }
        if (this->yrad == 0)
            drawBox(this->x - this->xrad, this->y, 2*this->xrad + 1, 1, color, ctype);
    }
    else
    {
        int x = this->xrad;
        int y = 0;
        int twoAsquare = 2 * this->xrad * this->xrad;
        int twoBsquare = 2 * this->yrad * this->yrad;
        int xchange = this->yrad * this->yrad * (1 - 2 * this->xrad);
        int ychange = this->xrad * this->xrad;
        int ellipseerror = 0;
        int stoppingX = twoBsquare * this->xrad;
        int stoppingY = 0;

        while (stoppingX >= stoppingY)
        {
            drawDot(this->x + x, this->y + y, color, ctype);
            drawDot(this->x - x, this->y + y, color, ctype);
            drawDot(this->x - x, this->y - y, color, ctype);
            drawDot(this->x + x, this->y - y, color, ctype);

            y++;
            stoppingY += twoAsquare;
            ellipseerror += ychange;
            ychange += twoAsquare;
            if ((2*  ellipseerror + xchange) > 0)
            {
                x--;
                stoppingX -= twoBsquare;
                ellipseerror += xchange;
                xchange += twoBsquare;
            }
        }
        x = 0;
        y = this->yrad;
        xchange = this->yrad * this->yrad;
        ychange = this->xrad * this->xrad * (1 - 2 * this->yrad);
        ellipseerror = 0;
        stoppingX = 0;
        stoppingY = twoAsquare * this->yrad;
        while (stoppingX <= stoppingY)
        {

            drawDot(this->x + x, this->y + y, color, ctype);
            drawDot(this->x - x, this->y + y, color, ctype);
            drawDot(this->x - x, this->y - y, color, ctype);
            drawDot(this->x + x, this->y - y, color, ctype);

            x++;
            stoppingX += twoBsquare;
            ellipseerror += xchange;
            xchange += twoBsquare;
            if ((2*  ellipseerror + ychange) > 0)
            {
                y--;
                stoppingY -= twoAsquare;
                ellipseerror += ychange;
                ychange += twoAsquare;
            }
        }
    }
}
示例#7
0
文件: Shape.cpp 项目: tinco/bwapi
  void drawEllipse(int posx, int posy, int xrad, int yrad, int color, bool isSolid)
  {
    if (isSolid)
    {
      int x = 0, y = yrad;
      unsigned int width = 1;
      long a2 = (long)xrad * (int)xrad, b2 = (long)yrad * yrad;
      long crit1 = -(a2 / 4 + xrad % 2 + b2);
      long crit2 = -(b2 / 4 + yrad % 2 + a2);
      long crit3 = -(b2 / 4 + yrad % 2);
      long t = -a2 * y;
      long dxt = 2 * b2 * x, dyt = -2 * a2 * y;
      long d2xt = 2 * b2, d2yt = 2 * a2;

      while (y >= 0 && x <= xrad)
      {
        if (t + b2*x <= crit1 ||
          t + a2*y <= crit3)
        {
          incx();
          width += 2;
        }
        else if (t - a2*y > crit2)
        {
          BW::drawScanLine(posx - x, posy - y, width, color);
          if (y != 0)
	          BW::drawScanLine(posx - x, posy + y, width, color);
          incy();
        }
        else
        {
          BW::drawScanLine(posx - x, posy - y, width, color);
          if (y != 0)
	          BW::drawScanLine(posx - x, posy + y, width, color);
          incx();
          incy();
          width += 2;
        }
      }
      if (yrad == 0)
        BW::drawScanLine(posx - xrad, posy, 2*xrad + 1, color);
    }
    else
    {
      int x = xrad;
      int y = 0;
      int twoAsquare = 2 * xrad * xrad;
      int twoBsquare = 2 * yrad * yrad;
      int xchange = yrad * yrad * (1 - 2 * xrad);
      int ychange = xrad * xrad;
      int ellipseerror = 0;
      int stoppingX = twoBsquare * xrad;
      int stoppingY = 0;

      while (stoppingX >= stoppingY)
      {
        BW::drawDot(posx + x, posy + y, color);
        BW::drawDot(posx - x, posy + y, color);
        BW::drawDot(posx - x, posy - y, color);
        BW::drawDot(posx + x, posy - y, color);

        y++;
        stoppingY += twoAsquare;
        ellipseerror += ychange;
        ychange += twoAsquare;
        if ((2*  ellipseerror + xchange) > 0)
        {
          x--;
          stoppingX -= twoBsquare;
          ellipseerror += xchange;
          xchange += twoBsquare;
        }
      }
      x = 0;
      y = yrad;
      xchange = yrad * yrad;
      ychange = xrad * xrad * (1 - 2 * yrad);
      ellipseerror = 0;
      stoppingX = 0;
      stoppingY = twoAsquare * yrad;
      while (stoppingX <= stoppingY)
      {
        BW::drawDot(posx + x, posy + y, color);
        BW::drawDot(posx - x, posy + y, color);
        BW::drawDot(posx - x, posy - y, color);
        BW::drawDot(posx + x, posy - y, color);

        x++;
        stoppingX += twoBsquare;
        ellipseerror += xchange;
        xchange += twoBsquare;
        if ((2*  ellipseerror + ychange) > 0)
        {
          y--;
          stoppingY -= twoAsquare;
          ellipseerror += ychange;
          ychange += twoAsquare;
        }
      }
    }
  }
示例#8
0
文件: m6805.c 项目: dinkc64/mame
/* execute instructions on this CPU until icount expires */
void m6805_base_device::execute_run()
{
	UINT8 ireg;

	S = SP_ADJUST( S );     /* Taken from CPU_SET_CONTEXT when pointer'afying */

	do
	{
		if (m_pending_interrupts != 0)
		{
			interrupt();
		}

		debugger_instruction_hook(this, PC);

		ireg=M_RDOP(PC++);

		switch( ireg )
		{
			case 0x00: brset(0x01); break;
			case 0x01: brclr(0x01); break;
			case 0x02: brset(0x02); break;
			case 0x03: brclr(0x02); break;
			case 0x04: brset(0x04); break;
			case 0x05: brclr(0x04); break;
			case 0x06: brset(0x08); break;
			case 0x07: brclr(0x08); break;
			case 0x08: brset(0x10); break;
			case 0x09: brclr(0x10); break;
			case 0x0A: brset(0x20); break;
			case 0x0B: brclr(0x20); break;
			case 0x0C: brset(0x40); break;
			case 0x0D: brclr(0x40); break;
			case 0x0E: brset(0x80); break;
			case 0x0F: brclr(0x80); break;
			case 0x10: bset(0x01); break;
			case 0x11: bclr(0x01); break;
			case 0x12: bset(0x02); break;
			case 0x13: bclr(0x02); break;
			case 0x14: bset(0x04); break;
			case 0x15: bclr(0x04); break;
			case 0x16: bset(0x08); break;
			case 0x17: bclr(0x08); break;
			case 0x18: bset(0x10); break;
			case 0x19: bclr(0x10); break;
			case 0x1a: bset(0x20); break;
			case 0x1b: bclr(0x20); break;
			case 0x1c: bset(0x40); break;
			case 0x1d: bclr(0x40); break;
			case 0x1e: bset(0x80); break;
			case 0x1f: bclr(0x80); break;
			case 0x20: bra(); break;
			case 0x21: brn(); break;
			case 0x22: bhi(); break;
			case 0x23: bls(); break;
			case 0x24: bcc(); break;
			case 0x25: bcs(); break;
			case 0x26: bne(); break;
			case 0x27: beq(); break;
			case 0x28: bhcc(); break;
			case 0x29: bhcs(); break;
			case 0x2a: bpl(); break;
			case 0x2b: bmi(); break;
			case 0x2c: bmc(); break;
			case 0x2d: bms(); break;
			case 0x2e: bil(); break;
			case 0x2f: bih(); break;
			case 0x30: neg_di(); break;
			case 0x31: illegal(); break;
			case 0x32: illegal(); break;
			case 0x33: com_di(); break;
			case 0x34: lsr_di(); break;
			case 0x35: illegal(); break;
			case 0x36: ror_di(); break;
			case 0x37: asr_di(); break;
			case 0x38: lsl_di(); break;
			case 0x39: rol_di(); break;
			case 0x3a: dec_di(); break;
			case 0x3b: illegal(); break;
			case 0x3c: inc_di(); break;
			case 0x3d: tst_di(); break;
			case 0x3e: illegal(); break;
			case 0x3f: clr_di(); break;
			case 0x40: nega(); break;
			case 0x41: illegal(); break;
			case 0x42: illegal(); break;
			case 0x43: coma(); break;
			case 0x44: lsra(); break;
			case 0x45: illegal(); break;
			case 0x46: rora(); break;
			case 0x47: asra(); break;
			case 0x48: lsla(); break;
			case 0x49: rola(); break;
			case 0x4a: deca(); break;
			case 0x4b: illegal(); break;
			case 0x4c: inca(); break;
			case 0x4d: tsta(); break;
			case 0x4e: illegal(); break;
			case 0x4f: clra(); break;
			case 0x50: negx(); break;
			case 0x51: illegal(); break;
			case 0x52: illegal(); break;
			case 0x53: comx(); break;
			case 0x54: lsrx(); break;
			case 0x55: illegal(); break;
			case 0x56: rorx(); break;
			case 0x57: asrx(); break;
			case 0x58: aslx(); break;
			case 0x59: rolx(); break;
			case 0x5a: decx(); break;
			case 0x5b: illegal(); break;
			case 0x5c: incx(); break;
			case 0x5d: tstx(); break;
			case 0x5e: illegal(); break;
			case 0x5f: clrx(); break;
			case 0x60: neg_ix1(); break;
			case 0x61: illegal(); break;
			case 0x62: illegal(); break;
			case 0x63: com_ix1(); break;
			case 0x64: lsr_ix1(); break;
			case 0x65: illegal(); break;
			case 0x66: ror_ix1(); break;
			case 0x67: asr_ix1(); break;
			case 0x68: lsl_ix1(); break;
			case 0x69: rol_ix1(); break;
			case 0x6a: dec_ix1(); break;
			case 0x6b: illegal(); break;
			case 0x6c: inc_ix1(); break;
			case 0x6d: tst_ix1(); break;
			case 0x6e: illegal(); break;
			case 0x6f: clr_ix1(); break;
			case 0x70: neg_ix(); break;
			case 0x71: illegal(); break;
			case 0x72: illegal(); break;
			case 0x73: com_ix(); break;
			case 0x74: lsr_ix(); break;
			case 0x75: illegal(); break;
			case 0x76: ror_ix(); break;
			case 0x77: asr_ix(); break;
			case 0x78: lsl_ix(); break;
			case 0x79: rol_ix(); break;
			case 0x7a: dec_ix(); break;
			case 0x7b: illegal(); break;
			case 0x7c: inc_ix(); break;
			case 0x7d: tst_ix(); break;
			case 0x7e: illegal(); break;
			case 0x7f: clr_ix(); break;
			case 0x80: rti(); break;
			case 0x81: rts(); break;
			case 0x82: illegal(); break;
			case 0x83: swi(); break;
			case 0x84: illegal(); break;
			case 0x85: illegal(); break;
			case 0x86: illegal(); break;
			case 0x87: illegal(); break;
			case 0x88: illegal(); break;
			case 0x89: illegal(); break;
			case 0x8a: illegal(); break;
			case 0x8b: illegal(); break;
			case 0x8c: illegal(); break;
			case 0x8d: illegal(); break;
			case 0x8e: illegal(); break;
			case 0x8f: illegal(); break;
			case 0x90: illegal(); break;
			case 0x91: illegal(); break;
			case 0x92: illegal(); break;
			case 0x93: illegal(); break;
			case 0x94: illegal(); break;
			case 0x95: illegal(); break;
			case 0x96: illegal(); break;
			case 0x97: tax(); break;
			case 0x98: CLC; break;
			case 0x99: SEC; break;
#if IRQ_LEVEL_DETECT
			case 0x9a: CLI; if (m_irq_state != CLEAR_LINE) m_pending_interrupts |= 1 << M6805_IRQ_LINE; break;
#else
			case 0x9a: CLI; break;
#endif
			case 0x9b: SEI; break;
			case 0x9c: rsp(); break;
			case 0x9d: nop(); break;
			case 0x9e: illegal(); break;
			case 0x9f: txa(); break;
			case 0xa0: suba_im(); break;
			case 0xa1: cmpa_im(); break;
			case 0xa2: sbca_im(); break;
			case 0xa3: cpx_im(); break;
			case 0xa4: anda_im(); break;
			case 0xa5: bita_im(); break;
			case 0xa6: lda_im(); break;
			case 0xa7: illegal(); break;
			case 0xa8: eora_im(); break;
			case 0xa9: adca_im(); break;
			case 0xaa: ora_im(); break;
			case 0xab: adda_im(); break;
			case 0xac: illegal(); break;
			case 0xad: bsr(); break;
			case 0xae: ldx_im(); break;
			case 0xaf: illegal(); break;
			case 0xb0: suba_di(); break;
			case 0xb1: cmpa_di(); break;
			case 0xb2: sbca_di(); break;
			case 0xb3: cpx_di(); break;
			case 0xb4: anda_di(); break;
			case 0xb5: bita_di(); break;
			case 0xb6: lda_di(); break;
			case 0xb7: sta_di(); break;
			case 0xb8: eora_di(); break;
			case 0xb9: adca_di(); break;
			case 0xba: ora_di(); break;
			case 0xbb: adda_di(); break;
			case 0xbc: jmp_di(); break;
			case 0xbd: jsr_di(); break;
			case 0xbe: ldx_di(); break;
			case 0xbf: stx_di(); break;
			case 0xc0: suba_ex(); break;
			case 0xc1: cmpa_ex(); break;
			case 0xc2: sbca_ex(); break;
			case 0xc3: cpx_ex(); break;
			case 0xc4: anda_ex(); break;
			case 0xc5: bita_ex(); break;
			case 0xc6: lda_ex(); break;
			case 0xc7: sta_ex(); break;
			case 0xc8: eora_ex(); break;
			case 0xc9: adca_ex(); break;
			case 0xca: ora_ex(); break;
			case 0xcb: adda_ex(); break;
			case 0xcc: jmp_ex(); break;
			case 0xcd: jsr_ex(); break;
			case 0xce: ldx_ex(); break;
			case 0xcf: stx_ex(); break;
			case 0xd0: suba_ix2(); break;
			case 0xd1: cmpa_ix2(); break;
			case 0xd2: sbca_ix2(); break;
			case 0xd3: cpx_ix2(); break;
			case 0xd4: anda_ix2(); break;
			case 0xd5: bita_ix2(); break;
			case 0xd6: lda_ix2(); break;
			case 0xd7: sta_ix2(); break;
			case 0xd8: eora_ix2(); break;
			case 0xd9: adca_ix2(); break;
			case 0xda: ora_ix2(); break;
			case 0xdb: adda_ix2(); break;
			case 0xdc: jmp_ix2(); break;
			case 0xdd: jsr_ix2(); break;
			case 0xde: ldx_ix2(); break;
			case 0xdf: stx_ix2(); break;
			case 0xe0: suba_ix1(); break;
			case 0xe1: cmpa_ix1(); break;
			case 0xe2: sbca_ix1(); break;
			case 0xe3: cpx_ix1(); break;
			case 0xe4: anda_ix1(); break;
			case 0xe5: bita_ix1(); break;
			case 0xe6: lda_ix1(); break;
			case 0xe7: sta_ix1(); break;
			case 0xe8: eora_ix1(); break;
			case 0xe9: adca_ix1(); break;
			case 0xea: ora_ix1(); break;
			case 0xeb: adda_ix1(); break;
			case 0xec: jmp_ix1(); break;
			case 0xed: jsr_ix1(); break;
			case 0xee: ldx_ix1(); break;
			case 0xef: stx_ix1(); break;
			case 0xf0: suba_ix(); break;
			case 0xf1: cmpa_ix(); break;
			case 0xf2: sbca_ix(); break;
			case 0xf3: cpx_ix(); break;
			case 0xf4: anda_ix(); break;
			case 0xf5: bita_ix(); break;
			case 0xf6: lda_ix(); break;
			case 0xf7: sta_ix(); break;
			case 0xf8: eora_ix(); break;
			case 0xf9: adca_ix(); break;
			case 0xfa: ora_ix(); break;
			case 0xfb: adda_ix(); break;
			case 0xfc: jmp_ix(); break;
			case 0xfd: jsr_ix(); break;
			case 0xfe: ldx_ix(); break;
			case 0xff: stx_ix(); break;
		}
		m_icount -= m_cycles1[ireg];
	} while( m_icount > 0 );
}
示例#9
0
/* Generate interrupts */
static void Interrupt(void)
{
	/* the 6805 latches interrupt requests internally, so we don't clear */
	/* pending_interrupts until the interrupt is taken, no matter what the */
	/* external IRQ pin does. */

#if (1) //HAS_HD63705)
	if( (m6805.pending_interrupts & (1<<HD63705_INT_NMI)) != 0)
	{
		PUSHWORD(m6805.pc);
		PUSHBYTE(m6805.x);
		PUSHBYTE(m6805.a);
		PUSHBYTE(m6805.cc);
        SEI;
		/* no vectors supported, just do the callback to clear irq_state if needed */
		if (m6805.irq_callback)
			(*m6805.irq_callback)(0);

		RM16( 0x1ffc, &pPC);
		change_pc(PC);
		m6805.pending_interrupts &= ~(1<<HD63705_INT_NMI);

		m6805_ICount -= 11;

	}
	else if( (m6805.pending_interrupts & ((1<<M6805_IRQ_LINE)|HD63705_INT_MASK)) != 0 ) {
		if ( (CC & IFLAG) == 0 ) {
#else
	if( (m6805.pending_interrupts & (1<<M6805_IRQ_LINE)) != 0 ) {
		if ( (CC & IFLAG) == 0 ) {
#endif
	{
        /* standard IRQ */
//#if (HAS_HD63705)
//      if(SUBTYPE!=SUBTYPE_HD63705)
//#endif
//          PC |= ~AMASK;
		PUSHWORD(m6805.pc);
		PUSHBYTE(m6805.x);
		PUSHBYTE(m6805.a);
		PUSHBYTE(m6805.cc);
        SEI;
		/* no vectors supported, just do the callback to clear irq_state if needed */
		if (m6805.irq_callback)
			(*m6805.irq_callback)(0);


//#if (HAS_HD63705)
		if(SUBTYPE==SUBTYPE_HD63705)
		{
			/* Need to add emulation of other interrupt sources here KW-2/4/99 */
			/* This is just a quick patch for Namco System 2 operation         */

			if((m6805.pending_interrupts&(1<<HD63705_INT_IRQ1))!=0)
			{
				m6805.pending_interrupts &= ~(1<<HD63705_INT_IRQ1);
				RM16( 0x1ff8, &pPC);
				change_pc(PC);
			}
			else if((m6805.pending_interrupts&(1<<HD63705_INT_IRQ2))!=0)
			{
				m6805.pending_interrupts &= ~(1<<HD63705_INT_IRQ2);
				RM16( 0x1fec, &pPC);
				change_pc(PC);
			}
			else if((m6805.pending_interrupts&(1<<HD63705_INT_ADCONV))!=0)
			{
				m6805.pending_interrupts &= ~(1<<HD63705_INT_ADCONV);
				RM16( 0x1fea, &pPC);
				change_pc(PC);
			}
			else if((m6805.pending_interrupts&(1<<HD63705_INT_TIMER1))!=0)
			{
				m6805.pending_interrupts &= ~(1<<HD63705_INT_TIMER1);
				RM16( 0x1ff6, &pPC);
				change_pc(PC);
			}
			else if((m6805.pending_interrupts&(1<<HD63705_INT_TIMER2))!=0)
			{
				m6805.pending_interrupts &= ~(1<<HD63705_INT_TIMER2);
				RM16( 0x1ff4, &pPC);
				change_pc(PC);
			}
			else if((m6805.pending_interrupts&(1<<HD63705_INT_TIMER3))!=0)
			{
				m6805.pending_interrupts &= ~(1<<HD63705_INT_TIMER3);
				RM16( 0x1ff2, &pPC);
				change_pc(PC);
			}
			else if((m6805.pending_interrupts&(1<<HD63705_INT_PCI))!=0)
			{
				m6805.pending_interrupts &= ~(1<<HD63705_INT_PCI);
				RM16( 0x1ff0, &pPC);
				change_pc(PC);
			}
			else if((m6805.pending_interrupts&(1<<HD63705_INT_SCI))!=0)
			{
				m6805.pending_interrupts &= ~(1<<HD63705_INT_SCI);
				RM16( 0x1fee, &pPC);
				change_pc(PC);
			}
		}
		else
//#endif
		{
			RM16( 0xffff - 5, &pPC );
			change_pc(PC);
		}

		}	// CC & IFLAG
			m6805.pending_interrupts &= ~(1<<M6805_IRQ_LINE);
		}
		m6805_ICount -= 11;
	}
}

static void m6805_reset()
{
	int (*save_irqcallback)(int) = m6805.irq_callback;
	memset(&m6805, 0, sizeof(m6805));
	m6805.irq_callback = save_irqcallback;
	/* Force CPU sub-type and relevant masks */
	m6805.subtype	= SUBTYPE_M6805;
	SP_MASK = 0x07f;
	SP_LOW	= 0x060;
	/* Initial stack pointer */
	S = SP_MASK;
	/* IRQ disabled */
    SEI;
	RM16( 0xfffe , &pPC );
	change_pc(PC);
}

void m6805Reset() {
	m6805_reset();
}

//static void m6805_init(int ) //int (*irqcallback)(int))
//{
//	m6805.irq_callback = irqcallback;
//}

//static void m6805_exit(void)
//{
//	/* nothing to do */
//}


void m6805SetIrqLine(int , int state)
{
	/* Basic 6805 only has one IRQ line */
	/* See HD63705 specific version     */
	if (m6805.irq_state[0] == state) return;

	m6805.irq_state[0] = state;
	if (state != CLEAR_LINE)
		m6805.pending_interrupts |= 1<<M6805_IRQ_LINE;
}


#include "6805ops.c"


/* execute instructions on this CPU until icount expires */
int m6805Run(int cycles)
{
	UINT8 ireg;
	m6805_ICount = cycles;

	do
	{
		if (m6805.pending_interrupts != 0)
		{
			if (SUBTYPE==SUBTYPE_M68705)
			{
				m68705_Interrupt();
			}
			else
			{
				Interrupt();
			}
		}

		ireg=M_RDOP(PC++);

		switch( ireg )
		{
			case 0x00: brset(0x01); break;
			case 0x01: brclr(0x01); break;
			case 0x02: brset(0x02); break;
			case 0x03: brclr(0x02); break;
			case 0x04: brset(0x04); break;
			case 0x05: brclr(0x04); break;
			case 0x06: brset(0x08); break;
			case 0x07: brclr(0x08); break;
			case 0x08: brset(0x10); break;
			case 0x09: brclr(0x10); break;
			case 0x0A: brset(0x20); break;
			case 0x0B: brclr(0x20); break;
			case 0x0C: brset(0x40); break;
			case 0x0D: brclr(0x40); break;
			case 0x0E: brset(0x80); break;
			case 0x0F: brclr(0x80); break;
			case 0x10: bset(0x01); break;
			case 0x11: bclr(0x01); break;
			case 0x12: bset(0x02); break;
			case 0x13: bclr(0x02); break;
			case 0x14: bset(0x04); break;
			case 0x15: bclr(0x04); break;
			case 0x16: bset(0x08); break;
			case 0x17: bclr(0x08); break;
			case 0x18: bset(0x10); break;
			case 0x19: bclr(0x10); break;
			case 0x1a: bset(0x20); break;
			case 0x1b: bclr(0x20); break;
			case 0x1c: bset(0x40); break;
			case 0x1d: bclr(0x40); break;
			case 0x1e: bset(0x80); break;
			case 0x1f: bclr(0x80); break;
			case 0x20: bra(); break;
			case 0x21: brn(); break;
			case 0x22: bhi(); break;
			case 0x23: bls(); break;
			case 0x24: bcc(); break;
			case 0x25: bcs(); break;
			case 0x26: bne(); break;
			case 0x27: beq(); break;
			case 0x28: bhcc(); break;
			case 0x29: bhcs(); break;
			case 0x2a: bpl(); break;
			case 0x2b: bmi(); break;
			case 0x2c: bmc(); break;
			case 0x2d: bms(); break;
			case 0x2e: bil(); break;
			case 0x2f: bih(); break;
			case 0x30: neg_di(); break;
			case 0x31: illegal(); break;
			case 0x32: illegal(); break;
			case 0x33: com_di(); break;
			case 0x34: lsr_di(); break;
			case 0x35: illegal(); break;
			case 0x36: ror_di(); break;
			case 0x37: asr_di(); break;
			case 0x38: lsl_di(); break;
			case 0x39: rol_di(); break;
			case 0x3a: dec_di(); break;
			case 0x3b: illegal(); break;
			case 0x3c: inc_di(); break;
			case 0x3d: tst_di(); break;
			case 0x3e: illegal(); break;
			case 0x3f: clr_di(); break;
			case 0x40: nega(); break;
			case 0x41: illegal(); break;
			case 0x42: illegal(); break;
			case 0x43: coma(); break;
			case 0x44: lsra(); break;
			case 0x45: illegal(); break;
			case 0x46: rora(); break;
			case 0x47: asra(); break;
			case 0x48: lsla(); break;
			case 0x49: rola(); break;
			case 0x4a: deca(); break;
			case 0x4b: illegal(); break;
			case 0x4c: inca(); break;
			case 0x4d: tsta(); break;
			case 0x4e: illegal(); break;
			case 0x4f: clra(); break;
			case 0x50: negx(); break;
			case 0x51: illegal(); break;
			case 0x52: illegal(); break;
			case 0x53: comx(); break;
			case 0x54: lsrx(); break;
			case 0x55: illegal(); break;
			case 0x56: rorx(); break;
			case 0x57: asrx(); break;
			case 0x58: aslx(); break;
			case 0x59: rolx(); break;
			case 0x5a: decx(); break;
			case 0x5b: illegal(); break;
			case 0x5c: incx(); break;
			case 0x5d: tstx(); break;
			case 0x5e: illegal(); break;
			case 0x5f: clrx(); break;
			case 0x60: neg_ix1(); break;
			case 0x61: illegal(); break;
			case 0x62: illegal(); break;
			case 0x63: com_ix1(); break;
			case 0x64: lsr_ix1(); break;
			case 0x65: illegal(); break;
			case 0x66: ror_ix1(); break;
			case 0x67: asr_ix1(); break;
			case 0x68: lsl_ix1(); break;
			case 0x69: rol_ix1(); break;
			case 0x6a: dec_ix1(); break;
			case 0x6b: illegal(); break;
			case 0x6c: inc_ix1(); break;
			case 0x6d: tst_ix1(); break;
			case 0x6e: illegal(); break;
			case 0x6f: clr_ix1(); break;
			case 0x70: neg_ix(); break;
			case 0x71: illegal(); break;
			case 0x72: illegal(); break;
			case 0x73: com_ix(); break;
			case 0x74: lsr_ix(); break;
			case 0x75: illegal(); break;
			case 0x76: ror_ix(); break;
			case 0x77: asr_ix(); break;
			case 0x78: lsl_ix(); break;
			case 0x79: rol_ix(); break;
			case 0x7a: dec_ix(); break;
			case 0x7b: illegal(); break;
			case 0x7c: inc_ix(); break;
			case 0x7d: tst_ix(); break;
			case 0x7e: illegal(); break;
			case 0x7f: clr_ix(); break;
			case 0x80: rti(); break;
			case 0x81: rts(); break;
			case 0x82: illegal(); break;
			case 0x83: swi(); break;
			case 0x84: illegal(); break;
			case 0x85: illegal(); break;
			case 0x86: illegal(); break;
			case 0x87: illegal(); break;
			case 0x88: illegal(); break;
			case 0x89: illegal(); break;
			case 0x8a: illegal(); break;
			case 0x8b: illegal(); break;
			case 0x8c: illegal(); break;
			case 0x8d: illegal(); break;
			case 0x8e: illegal(); break;
			case 0x8f: illegal(); break;
			case 0x90: illegal(); break;
			case 0x91: illegal(); break;
			case 0x92: illegal(); break;
			case 0x93: illegal(); break;
			case 0x94: illegal(); break;
			case 0x95: illegal(); break;
			case 0x96: illegal(); break;
			case 0x97: tax(); break;
			case 0x98: CLC; break;
			case 0x99: SEC; break;
#if IRQ_LEVEL_DETECT
			case 0x9a: CLI; if (m6805.irq_state != CLEAR_LINE) m6805.pending_interrupts |= 1<<M6805_IRQ_LINE; break;
#else
			case 0x9a: CLI; break;
#endif
			case 0x9b: SEI; break;
			case 0x9c: rsp(); break;
			case 0x9d: nop(); break;
			case 0x9e: illegal(); break;
			case 0x9f: txa(); break;
			case 0xa0: suba_im(); break;
			case 0xa1: cmpa_im(); break;
			case 0xa2: sbca_im(); break;
			case 0xa3: cpx_im(); break;
			case 0xa4: anda_im(); break;
			case 0xa5: bita_im(); break;
			case 0xa6: lda_im(); break;
			case 0xa7: illegal(); break;
			case 0xa8: eora_im(); break;
			case 0xa9: adca_im(); break;
			case 0xaa: ora_im(); break;
			case 0xab: adda_im(); break;
			case 0xac: illegal(); break;
			case 0xad: bsr(); break;
			case 0xae: ldx_im(); break;
			case 0xaf: illegal(); break;
			case 0xb0: suba_di(); break;
			case 0xb1: cmpa_di(); break;
			case 0xb2: sbca_di(); break;
			case 0xb3: cpx_di(); break;
			case 0xb4: anda_di(); break;
			case 0xb5: bita_di(); break;
			case 0xb6: lda_di(); break;
			case 0xb7: sta_di(); break;
			case 0xb8: eora_di(); break;
			case 0xb9: adca_di(); break;
			case 0xba: ora_di(); break;
			case 0xbb: adda_di(); break;
			case 0xbc: jmp_di(); break;
			case 0xbd: jsr_di(); break;
			case 0xbe: ldx_di(); break;
			case 0xbf: stx_di(); break;
			case 0xc0: suba_ex(); break;
			case 0xc1: cmpa_ex(); break;
			case 0xc2: sbca_ex(); break;
			case 0xc3: cpx_ex(); break;
			case 0xc4: anda_ex(); break;
			case 0xc5: bita_ex(); break;
			case 0xc6: lda_ex(); break;
			case 0xc7: sta_ex(); break;
			case 0xc8: eora_ex(); break;
			case 0xc9: adca_ex(); break;
			case 0xca: ora_ex(); break;
			case 0xcb: adda_ex(); break;
			case 0xcc: jmp_ex(); break;
			case 0xcd: jsr_ex(); break;
			case 0xce: ldx_ex(); break;
			case 0xcf: stx_ex(); break;
			case 0xd0: suba_ix2(); break;
			case 0xd1: cmpa_ix2(); break;
			case 0xd2: sbca_ix2(); break;
			case 0xd3: cpx_ix2(); break;
			case 0xd4: anda_ix2(); break;
			case 0xd5: bita_ix2(); break;
			case 0xd6: lda_ix2(); break;
			case 0xd7: sta_ix2(); break;
			case 0xd8: eora_ix2(); break;
			case 0xd9: adca_ix2(); break;
			case 0xda: ora_ix2(); break;
			case 0xdb: adda_ix2(); break;
			case 0xdc: jmp_ix2(); break;
			case 0xdd: jsr_ix2(); break;
			case 0xde: ldx_ix2(); break;
			case 0xdf: stx_ix2(); break;
			case 0xe0: suba_ix1(); break;
			case 0xe1: cmpa_ix1(); break;
			case 0xe2: sbca_ix1(); break;
			case 0xe3: cpx_ix1(); break;
			case 0xe4: anda_ix1(); break;
			case 0xe5: bita_ix1(); break;
			case 0xe6: lda_ix1(); break;
			case 0xe7: sta_ix1(); break;
			case 0xe8: eora_ix1(); break;
			case 0xe9: adca_ix1(); break;
			case 0xea: ora_ix1(); break;
			case 0xeb: adda_ix1(); break;
			case 0xec: jmp_ix1(); break;
			case 0xed: jsr_ix1(); break;
			case 0xee: ldx_ix1(); break;
			case 0xef: stx_ix1(); break;
			case 0xf0: suba_ix(); break;
			case 0xf1: cmpa_ix(); break;
			case 0xf2: sbca_ix(); break;
			case 0xf3: cpx_ix(); break;
			case 0xf4: anda_ix(); break;
			case 0xf5: bita_ix(); break;
			case 0xf6: lda_ix(); break;
			case 0xf7: sta_ix(); break;
			case 0xf8: eora_ix(); break;
			case 0xf9: adca_ix(); break;
			case 0xfa: ora_ix(); break;
			case 0xfb: adda_ix(); break;
			case 0xfc: jmp_ix(); break;
			case 0xfd: jsr_ix(); break;
			case 0xfe: ldx_ix(); break;
			case 0xff: stx_ix(); break;
		}
		m6805_ICount -= cycles1[ireg];
		m6805.nTotalCycles += cycles1[ireg];
	} while( m6805_ICount > 0 );

	return cycles - m6805_ICount;
}
示例#10
0
int main() {
  ofstream myfile; 
  ifstream input;
  int filecnt = 0; 

  std::default_random_engine gen;
  std::bernoulli_distribution incx(0.3);
  std::bernoulli_distribution incy(0.5);
  std::bernoulli_distribution decx(0.7);
  std::bernoulli_distribution decy(0.7);
  bool prod = false; 
  // GRID 
  Block2* grid = new Block2({0, 0, 0}, {1.0, 1.0, 0}, 5, 5);
  //  Block2* grid2 = new Block2({0, 0, 0}, {1.0, 1.0, 0}, 3, 3);
  // grid->adaptCriteria(); 

  auto u = grid->getVar("u"); 
  auto v = grid->getVar("v"); 

  for (auto pass = 0; pass < 4; ++pass) {
    std::string flname="op"+std::to_string(pass)+".dat"; 
    if (prod) {
      myfile.open(flname); 
      for (auto c : grid->listCell) {
	c->adapt[0] = 0; 
	c->adapt[1] = 0; 
	if (incx(gen) && c->level[0] != grid->levelHighBound[0]) { c->adapt[0]=1;}
	if (incy(gen) && c->level[1] != grid->levelHighBound[1]) { c->adapt[1]=1;}
	if (c->adapt[0] == 0 && c->adapt[1] == 0) {
	  if (decx(gen) && c->level[0] != grid->levelLowBound[0]) { c->adapt[0]=-1;}
	  if (decy(gen) && c->level[1] != grid->levelLowBound[1]) { c->adapt[1]=-1;}
	}
	myfile << c->adapt[0] << " " << c->adapt[1] << endl; 
      }
      myfile.close();  
    } else {
      input.open(flname); 
      if (input.is_open()) {
	for (auto c : grid->listCell) {
	  input >> c->adapt[0];
	  input >> c->adapt[1];
	  // c->adapt[0] = max(short(0), c->adapt[0]); 
	  // c->adapt[1] = max(short(0), c->adapt[1]); 
	}
      input.close();
      } else {
	cout << "cannot read data"<< endl; 
	exit(1); 
      }
    }

    cout << filecnt << " pass: "******" random " << endl; 
    flname="grid"+std::to_string(filecnt++)+".vtk"; 
    myfile.open(flname); 
    myfile << grid << endl;
    myfile.close();  


    for (auto i = 0; i < grid->listCell.size(); ++i) { 
      grid->listCell[i]->checkNgbrLevel(0); 
      grid->listCell[i]->checkNgbrLevel(1);
      grid->listCell[i]->checkNgbrLevel(2);
    } 

    cout << filecnt << " pass: "******" corrected " << endl; 
    flname="grid"+std::to_string(filecnt++)+".vtk"; 
    myfile.open(flname); 
    myfile << grid << endl;
    myfile.close();  
    

    grid->refine2();
    // auto lmin = **(std::min_element(&(grid->levelMin), &(grid->levelMin)+3)); 
    // auto lmax = **(std::max_element(&(grid->levelMax), &(grid->levelMax)+3)); 
    // for (auto j = 0; j < 2; ++j) {
    //   for (auto l = grid->levelMin[j]; l < grid->levelMax[j]+1; ++l) {
    // 	auto nCell = grid->listCell.size();
    // 	for (auto i = 0; i < nCell; ++i) {
    // 	  auto c = grid->listCell[i]; 
    // 	  if (c->level[j] != l) continue;
    // 	  if (c->adapt[j] == 0) continue;
    // 	  c->refine(j); 
    // 	  // if (j == 0) 
    // 	  //   c->convertToSimpleBlock({2,1});
    // 	  // else 
    // 	  //   c->convertToSimpleBlock({1,2});
    // 	  // c->adapt[j]--; c->level[j]++;
    // 	  // for (auto k=0; k< 2; ++k) {
    // 	  //   grid->listCell[k]->adapt.assign(c->adapt.begin(), c->adapt.end()); 
    // 	  //   grid->listCell[k]->level.assign(c->level.begin(), c->level.end()); 
    // 	  // } 
    // 	}
    // 	grid->setCurrentLevels();
    // 	cout << "("<<grid->levelMin[0] << "-"<< grid->levelMax[0] <<")-"; 
    // 	cout << "("<<grid->levelMin[1] << "-"<< grid->levelMax[1] <<")"; 
    // 	cout << filecnt << " pass: "******" l: " << l << " dir: "<< j << endl; 
    // 	for (auto i = 0; i<grid->listCell.size(); ++i) {
    // 	  u->set(i, grid->listCell[i]->adapt[0]); 
    // 	  v->set(i, grid->listCell[i]->adapt[1]);
    // 	} 
    // 	flname="grid"+std::to_string(filecnt++)+".vtk"; 
    // 	myfile.open(flname); 
    // 	myfile << grid << endl;
    // 	myfile.close();  
    //   } 
    // }
    flname="grid"+std::to_string(filecnt++)+".vtk"; 
    myfile.open(flname); 
    myfile << grid << endl;
    myfile.close();      
  }