예제 #1
0
int main(int argc, char **argv) {
    /*
     * L'utilisation de volatile empêche le compilateur
     * d'optimiser (i.e. supprimer) les variables.
     *
     * (void) var; évite l'avertissement concernant une variable non-utilisée
     *
     */

    /*
     * Variables sur la pile (stack)
     */
    volatile int cafe1 = 0x1111CAFE; (void) cafe1;
    volatile int cafe2 = 0x2222CAFE; (void) cafe2;
    volatile int cafe3[2] = { 0x3333CAFE, 0x4444CAFE }; (void) cafe3;

    /*
     * Variables sur le monceau (heap)
     */
    volatile int *beef1 = malloc(sizeof(int)); (void) beef1;
    volatile int *beef2 = malloc(sizeof(int)); (void) beef2;
    volatile int *beef3 = malloc(2 * sizeof(int)); (void) beef3;
    *beef1 = 0x1111BEEF;
    *beef2 = 0x2222BEEF;
    beef3[0] = 0x3333BEEF;
    beef3[1] = 0x4444BEEF;

    save_page("beef.page", (void *)beef1);
    save_page("cafe.page", (void *)&cafe1);
        
    return 0;
}
예제 #2
0
/*=========================================================================*
 * function save_snapshot
 * parameters: save to an Atari++ snapshot
 *
 * this functions creates an Atari++ snapshot based on a snapshot template
 *=========================================================================*/
int save_snapshot(char *fin, char *fout) {
  FILE *in, *out;
  char *buf;
  unsigned char *page;
  int pageNum;
  int okay;

  in=fopen(fin,"rt");
  if (!in) {
    fprintf(stderr,"Could not open template state file '%s'.\n",fin);
    return 0;
  }
  buf=(char *)malloc(512);
  if (!buf) {
    fprintf(stderr,"Could not allocate work space.\n");
    return 0;
  }
  page=(unsigned char *)malloc(256);
  if (!page) {
    fprintf(stderr,"Could not allocate work space.\n");
    return 0;
  }
  /* try to see if we are really an atari++ state file */
  okay=0;
  while(!feof(in)) {
    buf[0]=0;
    fgets(buf,512,in);
    if (!strncmp("+RAM::",buf,6)) {
      okay=1;
      break;
    }
  }
  if (!okay) {
    fprintf(stderr,"Template snapshot '%s' not an Atari++ snapshot.\n",fin);
    fclose(in);
    free(buf);
    free(page);
    return 0;
  }

  out=fopen(fout,"wt");
  if (!out) {
    fprintf(stderr,"Cannot open snapshot '%s' for writing.\n",fout);
    free(buf);
    free(page);
    return 0;
  }

  pageNum=0;
  in=fopen(fin,"rt");
  if (in) {
    while(!feof(in)) {
      buf[0]=0;
      fgets(buf,512,in);
      if (!strncmp("+RAM::",buf,6)) {
        fprintf(out,"%s",buf);
        if (!read_page(in,buf,page)) {
          fprintf(stderr,"Error reading template Atari++ snapshot.\n");
          fclose(in);
          fclose(out);
          free(buf);
          free(page);
          return 0;
        }
        merge_page(pageNum,page);
        save_page(out,page);
        pageNum++;
      } else {
        fprintf(out,"%s",buf);
      }
    }
  }
  fclose(in);
  fclose(out);
  free(buf);
  free(page);
  fprintf(stderr,"Created Atari++ snapshot file '%s'\n",fout);
  return 1;
}
예제 #3
0
파일: win-sym.cpp 프로젝트: gogonkt/gcin
static gboolean read_syms()
{
  FILE *fp;
  static char symbol_table[] = "symbol-table";
  static time_t file_modify_time;

  if ((fp=watch_fopen(symbol_table, &file_modify_time))==NULL)
    return FALSE;

  skip_utf8_sigature(fp);

  int pg;
  for(pg=0; pg < pagesN; pg++) {
    syms = pages[pg].syms;
    symsN = pages[pg].symsN;

    int i;
    for(i=0; i < symsN; i++) {
      int j;
      for(j=0; j < syms[i].symN; j++)
        if (syms[i].sym[j])
          free(syms[i].sym[j]);
    }
    free(syms);
  }
  pagesN = 0; pages = NULL;
  syms = NULL; symsN = 0;


  while (!feof(fp)) {
    char tt[1024];

    bzero(tt, sizeof(tt));
    myfgets(tt, sizeof(tt), fp);
//    dbg("%d] %s\n",strlen(tt), tt);
    int len=strlen(tt);

#if 0
    if (!len)
      continue;

    if (tt[len-1]=='\n') {
      tt[len-1]=0;
    }
#endif

    if (tt[0]==0)
      save_page();

    if (tt[0]=='#')
      continue;

    char *p=tt;

    syms=trealloc(syms, SYM_ROW, symsN+1);
    SYM_ROW *psym = &syms[symsN++];
    bzero(psym, sizeof(SYM_ROW));


    while (*p) {
      char *n = p;

      while (*n && *n!='\t')
        n++;

      *n = 0;

      psym->sym=trealloc(psym->sym, char *, psym->symN+1);
      psym->sym[psym->symN++] = strdup(p);

      p = n + 1;
    }

    if (!psym->symN) {
      free(syms);
      syms=NULL;
      symsN=0;
    }
  }

  if (symsN)
    save_page();

  fclose(fp);

  idx = 0;
  syms = pages[idx].syms;
  symsN = pages[idx].symsN;

  return TRUE;
}
예제 #4
0
파일: arr.c 프로젝트: koder77/NanoVM
void *get_vmvarlib (struct varlist *varlist, S4 vind, S8 ind, U1 access, struct vm_mem *vm_mem)
{
	// get address of array variable index
	
    U1 type, cache_hit = 0;
	S8 i ALIGN;
	S8 addr ALIGN;
	S8 hits ALIGN;
	S8 page ALIGN;
	S8 read_ind ALIGN;
	S8 new_ind ALIGN;
	
    U1 *new_s_memptr;
    S2 *new_i_memptr;
    S4 *new_li_memptr;
    S8 *new_q_memptr;
    F8 *new_d_memptr;

    void *ret_memptr = NULL;

    vm_mem->error = FALSE;

    type = varlist[vind].type;
	
	if (!varlist[vind].vm)
    {
        /* variable not in virtual memory, read from normal array */

        if (varlist[vind].size > 0)
        {
            /* array variable allocated, get pointer */

            switch (type)
            {
                case INT_VAR:
                    new_i_memptr = varlist[vind].i_m;
                    new_i_memptr = new_i_memptr + ind;
                    ret_memptr = (S2 *) new_i_memptr;
                    break;

                case LINT_VAR:
                    new_li_memptr = varlist[vind].li_m;
                    new_li_memptr = new_li_memptr + ind;
                    ret_memptr = (S4 *) new_li_memptr;
                    break;

                case QINT_VAR:
                    new_q_memptr = varlist[vind].q_m;
                    new_q_memptr = new_q_memptr + ind;
                    ret_memptr = (S8 *) new_q_memptr;
                    break;

                case DOUBLE_VAR:
                    new_d_memptr = varlist[vind].d_m;
                    new_d_memptr = new_d_memptr + ind;
                    ret_memptr = (F8 *) new_d_memptr;
                    break;

                case BYTE_VAR:
                    new_s_memptr = varlist[vind].s_m;
                    new_s_memptr = new_s_memptr + ind;
                    ret_memptr = (U1 *) new_s_memptr;
                    break;
            }
        }
        else
        {
            /* array variable is deallocated, set error flag */
            vm_mem->error = TRUE;
            return (NULL);
        }
    }
    else
    {
		/* variable is in virtual memory */
		
		for (i = 0; i < MAXVMPAGES; i++)
		{
			/*
			printf ("get_vmvarlib: page_hits: %lli\n", varlist[vind].vm_pages.page_hits[i]);
			printf ("get_vmvarlib: page_start_addr: %lli\n", varlist[vind].vm_pages.page_start_addr[i]);
			printf ("get_vmvarlib: page_end_addr: %lli\n", varlist[vind].vm_pages.page_end_addr[i]);
			*/
			if ((varlist[vind].vm_pages.page_end_addr[i] != 0) && (ind >= varlist[vind].vm_pages.page_start_addr[i] && ind <= varlist[vind].vm_pages.page_end_addr[i]))
			{
				// found page
			
				cache_hit = 1;
				
				/* correct index */
					
				new_ind = ind - varlist[vind].vm_pages.page_start_addr[i];
				
				/* DEBUG */
				/*
				if (new_ind > varlist[vind].vmcachesize - 1)
				{
					vm_mem->error = TRUE;
				
					printf ("get_vmvarlib: FATAL ERROR: page index out of range! [cache hit]\n");
					return (NULL);
				}
				*/
				
				switch (type)
				{
					case INT_VAR:
						new_i_memptr = (S2 *) (varlist[vind].vm_pages.pages[i] + (new_ind * sizeof (S2)));
						ret_memptr = (S2 *) new_i_memptr;
						break;

					case LINT_VAR:
						new_li_memptr = (S4 *) (varlist[vind].vm_pages.pages[i] + (new_ind * sizeof (S4)));
						ret_memptr = (S4 *) new_li_memptr;
						break;

					case QINT_VAR:
						new_q_memptr = (S8 *) (varlist[vind].vm_pages.pages[i] + (new_ind * sizeof (S8)));
						ret_memptr = (S8 *) new_q_memptr;
						break;

					case DOUBLE_VAR:
						new_d_memptr = (F8 *) (varlist[vind].vm_pages.pages[i] + (new_ind * sizeof (F8)));
						ret_memptr = (F8 *) new_d_memptr;
						break;
			
					case BYTE_VAR:
						new_s_memptr = (U1 *) (varlist[vind].vm_pages.pages[i] + (new_ind * sizeof (U1)));
						ret_memptr = (U1 *) new_s_memptr;
						break;
				}
				varlist[vind].vm_pages.page_hits[i]++;
				if (access == VM_WRITE)
				{
					varlist[vind].vm_pages.page_mod[i] = PAGE_MODIFIED;		// set page modified flag
				}
				
				break;		/* BREAK for  and continue */
			}
		}
	
		if (cache_hit == 0)
		{
			/* no cache hit, search page memory to load */
		
			hits = varlist[vind].vm_pages.page_hits[0]; page = 0;
		
			for (i = 1; i < MAXVMPAGES; i++)
			{
				// printf ("page hits: page %lli, hits %lli\n", i, varlist[vind].vm_pages.page_hits[i]);
				
				if (varlist[vind].vm_pages.page_hits[i] < hits)
				{
					hits = varlist[vind].vm_pages.page_hits[i]; page = i;
				}
			}
		
			if (varlist[vind].vm_pages.page_mod[page] == PAGE_MODIFIED)
			{
				if (save_page (varlist, vind, page) == FALSE)
				{
					vm_mem->error = TRUE;

					return (NULL);
				}
			}
		
			if (ind + varlist[vind].vmcachesize > varlist[vind].size - 1)
			{
				/* correct page read position */
			
				read_ind = varlist[vind].size - varlist[vind].vmcachesize;

				if (load_page (varlist, vind, page, read_ind) == FALSE)
				{
					vm_mem->error = TRUE;

					return (NULL);
				}
			}
			else
			{
				if (load_page (varlist, vind, page, ind) == FALSE)
				{
					vm_mem->error = TRUE;

					return (NULL);
				}
			}
			
			varlist[vind].vm_pages.page_mod[page] = PAGE_READ;
			new_ind = ind - varlist[vind].vm_pages.page_start_addr[page];
			
			/* DEBUG */
			/*
			if (new_ind > varlist[vind].vmcachesize - 1)
			{
				vm_mem->error = TRUE;
				
				printf ("get_vmvarlib: FATAL ERROR: page index out of range! [cache load]\n");
				return (NULL);
			}
			*/
			
			switch (type)
			{
				case INT_VAR:
					new_i_memptr = (S2 *) (varlist[vind].vm_pages.pages[page] + (new_ind * sizeof (S2)));
					ret_memptr = (S2 *) new_i_memptr;
					break;

				case LINT_VAR:
					new_li_memptr = (S4 *) (varlist[vind].vm_pages.pages[page] + (new_ind * sizeof (S4)));
					ret_memptr = (S4 *) new_li_memptr;
					break;

				case QINT_VAR:
					new_q_memptr = (S8 *) (varlist[vind].vm_pages.pages[page] + (new_ind * sizeof (S8)));
					ret_memptr = (S8 *) new_q_memptr;
					break;

				case DOUBLE_VAR:
					new_d_memptr = (F8 *) (varlist[vind].vm_pages.pages[page] + (new_ind * sizeof (F8)));
					ret_memptr = (F8 *) new_d_memptr;
					break;
			
				case BYTE_VAR:
					new_s_memptr = (U1 *) (varlist[vind].vm_pages.pages[page] + (new_ind * sizeof (U1)));
					ret_memptr = (U1 *) new_s_memptr;
					break;
			}
			
			if (access == VM_WRITE)
			{
				varlist[vind].vm_pages.page_mod[page] = PAGE_MODIFIED;		// set page modified flag
			}
		}
	}
	return (ret_memptr);
}
예제 #5
0
FilerSave::~FilerSave() {
    save_page(true);
    m_valid = false;
    if (m_node_p)
        save_node(0);
}