//******************************************************************************* //* 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); } }
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(); } } }
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; } } } }
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; } } } }
/* 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 ); }
/* 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; }
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(); }