void negexpr(void) { if(tokeq("!")) { scan(); compexpr(0); g_pop_ax(); g_or_ax_ax(); g_jz(+3); g_xor_ax_ax(); g_dec_ax(); g_label(); g_inc_ax(); g_push_ax(); } else if(tokeq("?")) { scan(); compexpr(0); g_pop_ax(); g_xor_bx_bx(); g_or_ax_ax(); g_jz(+1); g_inc_bx(); g_label(); g_push_bx(); } else { compexpr(0); } }
void g_label(int v, int join, int edge, queue<int>& outer) { if(v == join) return; if(label[v] == -1) outer.push(v); label[v] = edge; type[v] = 1; first[v] = join; g_label(first[label[mate[v]]], join, edge, outer); }
static void show_color(MBLOCK *mblk, int col_id) { int save_win_id; char *label; int colornamecount; char **arraydata; int win_id = mblk->info->colorwin_id; int block_id = mblk->info->colorblock_id; int array_id = mblk->info->colorarray_id; g_push_gc(); save_win_id=g_get_windownr(); g_select_window(win_id); g_delete_object(mblk->spar[S_COLORMAP].obj_id+1); g_open_object(mblk->spar[S_COLORMAP].obj_id+1); g_select_viewport(mblk->spar[S_COLORMAP].vp_id); g_set_foreground(col_id); g_fillrectangle(0,MAXROW,MAXCOLUMN,MAXROW+1); g_moveto(0.2,MAXROW+0.2); if (col_id == G_WHITE ) g_set_foreground(G_BLACK); else g_set_foreground(G_WHITE); g_set_font(G_FONT_HELVETICA_BOLD,G_RELATIVE_FONTSCALING); g_set_charsize(1.0); arraydata = psnd_get_colornames(&colornamecount); label = psnd_sprintf_temp("Block%d:%s:Color=%d", block_id+1, arraydata[array_id], col_id); g_label(label); g_close_object(mblk->spar[S_COLORMAP].obj_id+1); g_call_object(mblk->spar[S_COLORMAP].obj_id+1); g_flush(); g_pop_gc(); g_select_window(save_win_id); }
/* * Integrate peaks */ void psnd_integrate1d(MBLOCK *mblk, float x1, float x2) { int i; int i1 = round(x1); int i2 = round(x2); int lim1 = min(i1, i2); int lim2 = max(i1, i2); int xmin, xmax; float sum0, sum1, sum, ymin, ymax, yrange,xx; char *label; POPUP_INFO *popinf = mblk->popinf + POP_INT1D; lim1 = max(1, lim1); lim2 = max(1, lim2); lim1 = min(DAT->isize, lim1); lim2 = min(DAT->isize, lim2); mblk->int1dinf->left = min(lim1,lim2); mblk->int1dinf->right = max(lim1,lim2); update_labels(mblk); lim1 = mblk->int1dinf->left; lim2 = mblk->int1dinf->right; /* * ... determine integral over visible area (and min and max) */ for (i=0,sum0=0;i<DAT->isize;i++) sum0 += DAT->xreal[i]; if (sum0 == 0) sum0 = 1; /* * * ... determine integral over selected area (and min and max) * ... and draw the intensity lines * */ g_append_object(mblk->spar[S_REAL].obj_id); g_set_foreground(mblk->spar[S_REAL].color); for (i=lim1,sum=0,xmin=lim1,xmax=lim1;i<=lim2;i++) { sum += DAT->xreal[i-1]; g_moveto((float) i, DAT->xreal[i-1]); g_lineto((float) i, 0.0); } /* * * ... calc integral * */ g_set_foreground(mblk->spar[S_REAL].color3); minmax(DAT->xreal,DAT->isize,&(DAT->ylimit[0]),&(DAT->ylimit[1])); sum1=0; yrange = (DAT->ylimit[1] - DAT->ylimit[0])/ sum0; for (i=lim1;i<lim2;i++) { sum1 += yrange * DAT->xreal[i-1]; DAT->work1[i-1] = sum1; } /* * Try to move integral on top of peak */ xx=DAT->ylimit[0]; for (i=lim1;i<lim2;i++) { if (xx < (DAT->xreal[i-1]-DAT->work1[i-1])) xx = DAT->xreal[i-1]-DAT->work1[i-1]; } /* * But not outside window */ if (DAT->work1[lim2-2]+xx>DAT->ylimit[1]) xx -= -DAT->ylimit[1] + (DAT->work1[lim2-2] + xx); xx += (DAT->ylimit[1] - DAT->ylimit[0])/100; for (i=lim1;i<lim2;i++) { DAT->work1[i-1] += xx; } /* * Draw integral */ g_moveto((float) lim1, DAT->work1[lim1-1]); for (i=lim1;i<lim2;i++) { g_lineto((float)i, DAT->work1[i-1]); } /* * Print label */ g_moveto((float) lim1, DAT->work1[lim1-1]+(DAT->work1[lim2-2]-DAT->work1[lim1-1])/2); label = psnd_sprintf_temp("%.2e", sum); /* g_set_motif_realtextrotation(1); g_set_textdirection(90);*/ g_label(label); /* g_set_textdirection(0);*/ g_set_foreground(mblk->spar[S_REAL].color); g_close_object(mblk->spar[S_REAL].obj_id); g_plotall(); /* g_set_motif_realtext rotation(0);*/ mblk->int1dinf->sum = sum; if (popinf->visible) add_integral(mblk); psnd_printf(mblk," Range: %6d%6d Area: %g\n", lim1, lim2, sum); }
void fullmoonfever(void) { int ok = 1; while(ok) { if(tokeq("ILLGOL") || tokeq("Illgola2") || tokeq("Illberon") || tokeq("Illgol##")) { scan(); block(); } else if(tokeq("GO")) { scan(); boolexpr(); boolexpr(); g_pop_ax(); g_pop_dx(); g_mov_dh_al(); g_mov_ah(2); g_xor_bx_bx(); g_int(0x10); } else if(tokeq("PRINT")) { scan(); boolexpr(); g_mov_ah(0x0e); g_pop_si(); g_label(); g_mov_al_SI(); g_or_al_al(); g_jz(12); g_mov_bx_I(caddr(pencolor)); g_xor_bh_bh(); g_int(16); g_inc_si(); g_jmp(-18); g_label(); } else if(tokeq("CENTRE")) { int l = 0; scan(); l = (80-(strlen(token)-1)) >> 1; boolexpr(); boolexpr(); g_pop_ax(); g_mov_dx(l); g_mov_dh_al(); g_mov_ah(2); g_xor_bx_bx(); g_int(0x10); g_mov_ah(0x0e); g_pop_si(); g_label(); g_mov_al_SI(); g_or_al_al(); g_jz(12); g_mov_bx_I(caddr(pencolor)); g_xor_bh_bh(); g_int(16); g_inc_si(); g_jmp(-18); g_label(); } else if(tokeq("PAUSE"))
void compexpr(int findvar) { char x, y; if (findvar) { if(tokeq("*")) { scan(); shouldsym = name(1); } else { shouldsym = name(0); } g_pop_bx(); g_push_BX(); } else { addexpr(); } while(tokeq("=") || tokeq("<>") || tokeq(">") || tokeq(">=") || tokeq("<") || tokeq("<=")) { x = token[0]; y = token[1]; scan(); addexpr(); if(x == '=') { g_pop_ax(); g_pop_dx(); g_sub_ax_dx(); g_jz(+3); g_xor_ax_ax(); g_dec_ax(); g_label(); g_inc_ax(); g_push_ax(); } if(x == '<' && y == '>') { g_pop_ax(); g_pop_dx(); g_xor_cx_cx(); g_sub_ax_dx(); g_jz(+1); g_inc_cx(); g_label(); g_push_cx(); } if(x == '<' && y == 0) { g_pop_dx(); g_pop_ax(); g_xor_cx_cx(); g_cmp_ax_dx(); g_jge(+1); g_inc_cx(); g_label(); g_push_cx(); } if(x == '>' && y == 0) { g_pop_dx(); g_pop_ax(); g_xor_cx_cx(); g_cmp_ax_dx(); g_jle(+1); g_inc_cx(); g_label(); g_push_cx(); } if(x == '<' && y == '=') { g_pop_dx(); g_pop_ax(); g_xor_cx_cx(); g_cmp_ax_dx(); g_jg(+1); g_inc_cx(); g_label(); g_push_cx(); } if(x == '>' && y == '=') { g_pop_dx(); g_pop_ax(); g_xor_cx_cx(); g_cmp_ax_dx(); g_jl(+1); g_inc_cx(); g_label(); g_push_cx(); } } }
void primitive(void) { int ptr = 0; if(tokeq("call")) { byte * b = m; int l; int c; int v; int a = 0; int i; scan(); boolexpr(); if(tokeq("(")) { scan(); a++; boolexpr(); g_pop_ax(); g_pop_bx(); g_push_ax(); g_push_bx(); while (tokeq(",")) { scan(); a++; boolexpr(); g_pop_ax(); g_pop_bx(); g_push_ax(); g_push_bx(); } if(tokeq(")")) { scan(); } else { error("Missing )"); } } g_pop_bx(); g_push_bp(); g_mov_ax_sp(); g_add_ax(a << 1); g_mov_bp_ax(); g_call_bx(); g_pop_dx(); g_pop_bp(); for(i=0;i<a;i++) { g_pop_ax(); } g_push_dx(); return; } if(tokeq("poll")) { scan(); if(tokeq("tty")) { scan(); g_mov_ah(11); g_int(0x21); g_xor_ah_ah(); g_push_ax(); return; } error("You can only poll the tty"); return; } if(tokeq("Ypush")) { scan(); if(tokeq("(")) { scan(); boolexpr(); if(tokeq(")")) { g_xor_ax_ax(); g_push_ax(); scan(); return; } if(tokeq(",")) { scan(); boolexpr(); if(tokeq(")")) { scan(); return; } } } error("Usage is Ypush(boolexpr[,boolexpr]) in function"); return; } if(tokeq("Ypop")) { scan(); if(tokeq("(")) { scan(); if(tokeq(")")) { scan(); return; } } error("Usage would be Ypop() in function"); return; } if(tokeq("eof")) { scan(); g_mov_bx(caddr(eofflag)); g_push_BX(); g_xor_ax_ax(); g_mov_BX_ax(); return; } if(tokeq("gpos")) { scan(); if(tokeq("(")) { scan(); boolexpr(); if (tokeq(",")) { scan(); boolexpr(); g_xor_cx_cx(); g_pop_dx(); g_mov_ax(0x4201); g_pop_bx(); g_int(0x21); g_push_ax(); if (tokeq(")")) { scan(); return; } } } error("Malformed way to use 'gpos'"); } if(tokeq("sin")) { runtime_trig(); scan(); boolexpr(); g_pop_ax(); g_mov_bx(caddr(sin_routine)); g_call_bx(); g_push_cx(); return; } if(tokeq("cos")) { runtime_trig(); scan(); boolexpr(); g_pop_ax(); g_mov_bx(caddr(cos_routine)); g_call_bx(); g_push_cx(); return; } if(tokeq("abs")) { scan(); boolexpr(); g_pop_ax(); g_and_ax(0x7fff); g_push_ax(); return; } if(tokeq("asc")) { scan(); boolexpr(); g_pop_ax(); g_and_ax(0x007f); g_push_ax(); return; } if(tokeq("low")) { scan(); boolexpr(); g_pop_ax(); g_and_ax(0x00ff); g_push_ax(); return; } if(tokeq("med")) { scan(); boolexpr(); g_pop_ax(); g_mov_cl(4); g_shr_ax_cl(); g_and_ax(0x00ff); g_push_ax(); return; } if(tokeq("fix")) { scan(); boolexpr(); g_pop_ax(); g_mov_ah_al(); g_xor_al_al(); g_push_ax(); return; } if(tokeq("int") || tokeq("hig")) { scan(); boolexpr(); g_pop_ax(); g_mov_al_ah(); g_xor_ah_ah(); g_push_ax(); return; } if(tokeq("fre")) { scan(); boolexpr(); g_pop_ax(); g_mov_ax_I(caddr(d)-2); g_neg_ax(); g_push_ax(); return; } if(tokeq("rnd")) { symbol * q = NULL; scan(); if(tokeq("(")) { scan(); q = name(0); if(tokeq(")")) { scan(); } else error("Missing )"); } else { error("Need identifier in rnd()"); } g_pop_bx(); g_mov_ax_BX(); g_mov_dx(58653U); g_imul_dx(); g_mov_dx(13849U); g_add_ax_dx(); g_mov_BX_ax(); g_push_ax(); if (q != NULL && q->hook_addr != NULL) { g_mov_ax(caddr(q->hook_addr)); g_call_ax(); } return; } if(tokeq("stu")) { scan(); boolexpr(); g_pop_ax(); g_mov_bx(caddr(sbuffer + 14)); g_label(); g_xor_dx_dx(); g_mov_cx(10); g_idiv_cx(); g_add_dx('0'); g_mov_BX_dl(); g_dec_bx(); g_or_ax_ax(); g_jnz(-18); g_inc_bx(); g_push_bx(); return; } if(tokeq("str")) { scan(); boolexpr(); g_pop_ax(); g_push_ax(); g_cmp_ax(0); g_jg(+2); g_neg_ax(); g_label(); g_mov_bx(caddr(sbuffer + 14)); g_label(); g_xor_dx_dx(); g_mov_cx(10); g_idiv_cx(); g_add_dx('0'); g_mov_BX_dl(); g_dec_bx(); g_or_ax_ax(); g_jnz(-18); g_pop_ax(); g_cmp_ax(0); g_jge(+5); g_mov_al('-'); g_mov_BX_al(); g_dec_bx(); g_label(); g_inc_bx(); g_push_bx(); return; } if(tokeq("sif")) { scan(); boolexpr(); g_pop_ax(); g_push_ax(); g_xor_ah_ah(); g_mov_dx(39); g_imul_dx(); /* g_mov_al_ah(); g_mov_ah_dl(); */ g_mov_bx(caddr(sbuffer + 14)); g_mov_cx(10); g_label(); g_xor_dx_dx(); g_idiv_cx(); g_add_dx('0'); g_mov_BX_dl(); g_dec_bx(); g_cmp_bx(caddr(sbuffer + 10)); g_jnz(-17); g_mov_dx('.'); g_mov_BX_dl(); g_dec_bx(); g_pop_ax(); g_mov_al_ah(); g_xor_ah_ah(); g_label(); g_xor_dx_dx(); g_idiv_cx(); g_add_dx('0'); g_mov_BX_dl(); g_dec_bx(); g_or_ax_ax(); g_jnz(-15); g_inc_bx(); g_push_bx(); return; } if(tokeq("nameof")) { char * q; byte * b; scan(); if(tokeq("(")) { scan(); q = (token+1); b = stalloc(strlen(q)+1); name(0); if(tokeq(")")) { scan(); strcpy((char *)b, q); g_mov_ax(caddr(b)); g_push_ax(); } else error("Missing ("); } else error("Missing )"); return; } if(tokeq("^")) { scan(); ptr = 1; } if(tokeq("#")) { scan(); if (tokeq("(")) { scan(); boolexpr(); if (tokeq(")")) { scan(); g_pop_ax(); g_shl_ax_1(); g_neg_ax(); g_xchg_si_ax(); g_mov_ax_BP_SI(); g_push_ax(); return; } error("Missing )"); return; } g_mov_ax_BP(-2 * member()); g_push_ax(); return; } if(sym_exists(token)) { symbol * q = NULL; q = name(0); if (!ptr) { g_pop_bx(); g_push_BX(); if (tokeq("++")) { scan(); g_mov_ax_BX(); g_inc_ax(); g_mov_BX_ax(); if (q != NULL && q->hook_addr != NULL) { g_mov_ax(caddr(q->hook_addr)); g_call_ax(); } } if (tokeq("--")) { scan(); g_mov_ax_BX(); g_dec_ax(); g_mov_BX_ax(); if (q != NULL && q->hook_addr != NULL) { g_mov_ax(caddr(q->hook_addr)); g_call_ax(); } } } return; } if (ptr) { error("Identifier should follow ^"); } if(token[0] >= '0' && token[0] <= '9') { int v = atoi(token); g_mov_ax(v); g_push_ax(); scan(); if (tokeq(".")) { scan(); while(strlen(token) < 4) { strcat(token, "0"); } v = atoi(token) / 39; scan(); if (v > 255) v = 255; g_pop_ax(); g_mov_ah_al(); g_mov_al(v & 0xff); g_push_ax(); } return; } if(token[0] == '"') { char * q = (token+1); byte * b = stalloc(strlen(q)+1); strcpy((char *)b, q); g_mov_ax(caddr(b)); g_push_ax(); scan(); while(token[0] == '"') { char * q = (token+1); byte * b; stretract(); b = stalloc(strlen(q)+1); strcpy((char *)b, q); scan(); } return; } if(tokeq("{")) { byte * l; byte * q; int c=0; int v=0; int lc; scan(); l = m; g_label(); g_nop(); assignments(); if (tokeq("}")) { scan(); g_ret(); q = stalloc(m - l); memcpy(q, l, m - l); m = l; g_mov_ax(caddr(q)); g_push_ax(); return; } error("Missing }"); return; } if(tokeq("INLINE")) { byte * l; byte * q; int c=0; int v=0; int lc; scan(); if(tokeq("{")) scan(); l = m; g_label(); g_nop(); while(tokne("}")) { GEN(atoi(token)); scan(); } scan(); g_ret(); q = stalloc(m - l); memcpy(q, l, m - l); m = l; g_mov_ax(caddr(q)); g_push_ax(); return; } if(tokeq("(")) { scan(); boolexpr(); if (tokeq(")")) { scan(); return; } error("Missing )"); return; } if(tokeq("*")) { scan(); boolexpr(); g_mov_bx(260); g_mov_ax_BX(); g_pop_dx(); g_push_ax(); g_add_ax_dx(); g_mov_BX_ax(); return; } error("Unrecognized primitive"); }
int g_cmp_bx(word i) { GEN(0x81); GEN(0xFB); GENW(i); g_label(); DID(4); }
int g_mov_es_I(word i) { GEN(142); GEN(6); GENW(i); g_label(); DID(4); }
int g_mov_I_ax(word i) { GEN(163); GENW(i); g_label(); DID(3); }
int g_mov_ax_I(word i) { GEN(161); GENW(i); g_label(); DID(3); }
int g_mov_I_bx(sword w) { GEN(0x89); GEN(0x1E); GENW(w); g_label(); DID(4); }
int g_mov_bx_I(sword w) { GEN(0x8B); GEN(0x1E); GENW(w); g_label(); DID(4); }
int g_and_ax(sword w) { GEN(0x25); GENW(w); g_label(); DID(3); }
int g_add_bx(sword w) { GEN(0x81); GEN(0xC3); GENW(w); g_label(); DID(4); }
int g_cmp_ax(word i) { GEN(0x3D); GENW(i); g_label(); DID(3); }
int gabow(int n) { memset(mate, -1, sizeof mate); memset(first, -1, sizeof first); int ret = 0; for(int z = 0; z < n; ++z) { if(mate[z] != -1) continue; memset(label, -1, sizeof label); memset(type, -1, sizeof type); memset(g_souter, 0, sizeof g_souter); label[z] = -1; type[z] = 0; queue<int> outer; outer.push(z); bool done = false; while(!outer.empty()) { int x = outer.front(); outer.pop(); if(g_souter[x]) continue; g_souter[x] = true; for(int i = last_edge[x]; i != -1; i = prev_edge[i]) { if(mate[w[i]] == -1 && w[i] != z) { mate[w[i]] = x; g_augment(x, w[i]); ++ret; done = true; break; } if(type[w[i]] == -1) { int v = mate[w[i]]; if(type[v] == -1) { type[v] = 0; label[v] = x; outer.push(v); first[v] = w[i]; } continue; } int r = first[x], s = first[w[i]]; if(r == s) continue; memset(g_flag, 0, sizeof g_flag); g_flag[r] = g_flag[s] = true; while(r != -1 || s != -1) { if(s != -1) swap(r, s); r = first[label[mate[r]]]; if(r == -1) continue; if(g_flag[r]) break; g_flag[r] = true; } g_label(first[x], r, i, outer); g_label(first[w[i]], r, i, outer); for(int c = 0; c < n; ++c) if(type[c] != -1 && first[c] != -1 && type[first[c]] != -1) first[c] = r; } if(done) break; } } return ret; }
/* * Display the color map in a window */ void psnd_show_colormap(MBLOCK *mblk, int numcol) { float x0,y0,dx,dy,box_height,box_width; int nx,ny,win_id, save_win_id,bar_id; char string[5]; int i,ix,iy,color=0; int colornamecount; char **arraydata; if (mblk->info->colorwin_id) { g_raise_window(mblk->info->colorwin_id); return; } arraydata = psnd_get_colornames(&colornamecount); box_width = 60.0; box_height = 30.0; nx = sqrt(numcol); if (nx>MAXCOLUMN) nx=MAXCOLUMN; ny = numcol/nx; if (nx*ny < numcol) ny++; x0 = 0.0; y0 = 0.0; dx = box_width*(nx); dy = box_height*(ny); g_push_gc(); save_win_id=g_get_windownr(); mblk->info->colorwin_id = g_open_window(G_SCREEN, x0, y0, dx, dy, "Colormap", G_WIN_BUFFER| G_WIN_BUTTONBAR2); /* g_popup_follow_cursor(TRUE); */ g_delete_object(mblk->spar[S_COLORMAP].obj_id); g_open_object(mblk->spar[S_COLORMAP].obj_id); g_set_viewport(mblk->spar[S_COLORMAP].vp_id, 0, 0, 1, 1); g_set_world(mblk->spar[S_COLORMAP].vp_id, 0, 0, nx+0.01, 1+ny+0.01); g_select_viewport(mblk->spar[S_COLORMAP].vp_id); g_set_clipping(FALSE); g_set_font(G_FONT_HELVETICA_BOLD,G_RELATIVE_FONTSCALING); g_set_charsize(1.0); for (iy=0;iy<ny;iy++) { for(ix=0;ix<nx;ix++) { g_set_foreground(color); g_fillrectangle(ix,ny-iy-1,ix+1,ny-iy); g_moveto((float)ix+0.25,(float)(ny-iy-1)+0.25); if ((color%(numcol)) == G_WHITE ) g_set_foreground(G_BLACK); else g_set_foreground(G_WHITE); sprintf(string,"%d",color); g_label(string); color++; } } g_close_object(mblk->spar[S_COLORMAP].obj_id); g_call_object(mblk->spar[S_COLORMAP].obj_id); bar_id = g_menu_create_buttonbox2(mblk->info->colorwin_id, 1); mblk->info->colorbar_id = bar_id; g_menu_append_button(bar_id, "Quit", COL_QUIT); g_menu_append_button(bar_id, "Reset", COL_DEF); g_menu_append_button(bar_id, "Save", COL_WRITE); g_menu_append_button(bar_id, "Retrieve", COL_READ); #ifdef _WIN32 g_menu_append_button(bar_id, "Item", COL_ITEM); #else { char *data[MAX_BLOCK] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" }; assert(mblk->info->colorblock_id <= 12); g_menu_append_optionmenu(bar_id, "Block", COL_BLOCK, MAXBLK, mblk->info->colorblock_id, data); } g_menu_append_optionmenu(bar_id, "Item", COL_ARRAY, colornamecount, mblk->info->colorarray_id, arraydata); #endif g_menu_create_buttonbox2(mblk->info->colorwin_id, -1); g_flush(); g_pop_gc(); g_select_window(save_win_id); color = psnd_get_colorvalue(mblk,mblk->info->colorarray_id, mblk->info->colorblock_id); show_color(mblk, color); }