Example #1
0
void load_objects( void )
{
  FILE*                 fp;
  obj_clss_data*  obj_clss;
  oprog_data*        oprog;
  char              letter;
  int                    i;
  int                 vnum;

  echo( "Loading Objects ...\r\n" );
  vzero( obj_index_list, MAX_OBJ_INDEX );

  fp = open_file( AREA_DIR, OBJECT_FILE, "r", TRUE );

  if( strcmp( fread_word( fp ), "#OBJECTS" ) ) 
    panic( "Load_objects: header not found" );

  for( ; ; ) {
    letter = fread_letter( fp );

    if( letter != '#' ) 
      panic( "Load_objects: # not found." );

    if( ( vnum = fread_number( fp ) ) == 0 )
      break;
   
    if( vnum < 0 || vnum >= MAX_OBJ_INDEX ) 
      panic( "Load_objects: vnum out of range." );

    if( obj_index_list[vnum] != NULL ) 
      panic( "Load_objects: vnum %d duplicated.", vnum );

    obj_clss = new obj_clss_data;
 
    obj_index_list[vnum]  = obj_clss;
    obj_clss->vnum        = vnum;
    obj_clss->fakes       = vnum;

    obj_clss->singular         = fread_string( fp, MEM_OBJ_CLSS );
    obj_clss->plural           = fread_string( fp, MEM_OBJ_CLSS );
    obj_clss->before           = fread_string( fp, MEM_OBJ_CLSS );
    obj_clss->after            = fread_string( fp, MEM_OBJ_CLSS );
    obj_clss->long_s           = fread_string( fp, MEM_OBJ_CLSS );
    obj_clss->long_p           = fread_string( fp, MEM_OBJ_CLSS );
    obj_clss->prefix_singular  = fread_string( fp, MEM_OBJ_CLSS );
    obj_clss->prefix_plural    = fread_string( fp, MEM_OBJ_CLSS );
    obj_clss->creator          = fread_string( fp, MEM_OBJ_CLSS );
    obj_clss->last_mod         = fread_string( fp, MEM_OBJ_CLSS );      

    obj_clss->item_type       = fread_number( fp );
    obj_clss->fakes           = fread_number( fp );
    obj_clss->extra_flags[0]  = fread_number( fp );
    obj_clss->extra_flags[1]  = fread_number( fp );
    obj_clss->wear_flags      = fread_number( fp );
    obj_clss->anti_flags      = fread_number( fp );
    obj_clss->restrictions    = fread_number( fp );
    obj_clss->size_flags      = fread_number( fp );
    obj_clss->materials       = fread_number( fp );

    obj_clss->affect_flags[0] = fread_number( fp );
    obj_clss->affect_flags[1] = fread_number( fp );
    obj_clss->affect_flags[2] = fread_number( fp );
    obj_clss->layer_flags     = fread_number( fp );

    obj_clss->value[0]      = fread_number( fp );
    obj_clss->value[1]      = fread_number( fp );
    obj_clss->value[2]      = fread_number( fp );
    obj_clss->value[3]      = fread_number( fp );

    obj_clss->weight        = fread_number( fp );
    obj_clss->cost          = fread_number( fp );
    obj_clss->level         = fread_number( fp );
    obj_clss->limit         = fread_number( fp );
    obj_clss->repair        = fread_number( fp );
    obj_clss->durability    = fread_number( fp );
    obj_clss->blocks        = fread_number( fp );
    obj_clss->light         = fread_number( fp );

    obj_clss->date          = fread_number( fp );

    read_affects( fp, obj_clss ); 
    read_extra( fp, obj_clss->extra_descr );

    fread_letter( fp );

    for( ; ; ) {
      int number = fread_number( fp );

      if( number == -1 )
        break;

      oprog = new oprog_data;
      append( obj_clss->oprog, oprog );

      oprog->trigger  = number;
      oprog->obj_vnum = fread_number( fp );
      oprog->command  = fread_string( fp, MEM_OPROG );
      oprog->target   = fread_string( fp, MEM_OPROG );
      oprog->code     = fread_string( fp, MEM_OPROG );

      read_extra( fp, oprog->data );
      }       

    fix( obj_clss );
    }

  fclose( fp );

  for( i = 0; i < MAX_OBJ_INDEX; i++ ) 
    if( obj_index_list[i] != NULL )
      for( oprog = obj_index_list[i]->oprog; oprog != NULL;
        oprog = oprog->next )
        if( oprog->obj_vnum > 0 )
          oprog->obj_act = get_obj_index( oprog->obj_vnum );
 
  return;
}
Example #2
0
uint16_t fetch_data(CPU *cpu, unsigned char* memory)
{
	uint8_t data = 0;
	switch (addressing_mode[memory[cpu->PC]])
	{
	//IMPLIED
	case 0:
		return 0;
	//IMMEDIATE
	case 1:
		return memory[cpu->PC + 1];
	//ZP
	case 2:
		cpu->cycles++; 
		return cpu->memory[memory[cpu->PC + 1]];
	//ZP X
	case 3:
		cpu->cycles += 2;
		return cpu->memory[(uint8_t)(memory[cpu->PC + 1] + cpu->X)];
	//ZP Y
	case 4:
		cpu->cycles += 2;
		return cpu->memory[(uint8_t)(memory[cpu->PC + 1] + cpu->Y)];
	//IND X
	case 5:
		cpu->cycles += 4;
		read_extra(((uint16_t)(cpu->memory[0xFF & ((memory[cpu->PC + 1] + cpu->X + 1))]) << 8) | cpu->memory[0xFF & (memory[cpu->PC + 1] + cpu->X)], cpu);
		data = cpu->memory[((uint16_t)(cpu->memory[0xFF & ((memory[cpu->PC + 1] + cpu->X + 1))]) << 8) | cpu->memory[0xFF & (memory[cpu->PC + 1] + cpu->X)]];
		return data;
	//IND Y
	case 6:
		if (((uint16_t)(cpu->memory[memory[cpu->PC + 1] ])+ cpu->Y) & 0x100)
		{
			cpu->cycles += 4;
		}
		else
		{
			cpu->cycles += 3;
		}
		uint16_t addr = (((cpu->memory[ 0xFF&(memory[cpu->PC + 1] + 1)])) << 8) | cpu->memory[memory[cpu->PC + 1]];
		read_extra(0xFFFF & (addr + cpu->Y), cpu);
		data = cpu->memory[0xFFFF & (addr + cpu->Y)];
		return data;
	//ABS
	case 7:
		cpu->cycles += 2;
		read_extra(((memory[cpu->PC + 2]) << 8) | (memory[cpu->PC + 1]), cpu);
		data = cpu->memory[((memory[cpu->PC + 2]) << 8) | (memory[cpu->PC + 1])];
		return data;
	//ABS X
	case 8:
		if (((uint16_t)(memory[cpu->PC + 1]) + cpu->X) & 0x100)
		{
			cpu->cycles += 3;
		}
		else
		{
			cpu->cycles += 2;
		}
		read_extra((((memory[cpu->PC + 2]) << 8) | (memory[cpu->PC + 1])) + cpu->X, cpu);
		data = cpu->memory[(((memory[cpu->PC + 2]) << 8) | (memory[cpu->PC + 1])) + cpu->X];
		return data;
	//ABS Y
	case 9:
		if (((uint16_t)(memory[cpu->PC + 1]) + cpu->Y) & 0x100)
		{
			cpu->cycles += 3;
		}
		else
		{
			cpu->cycles += 2;
		}
		read_extra(0xFFFF & (((memory[cpu->PC + 2] << 8) | (memory[cpu->PC + 1])) + cpu->Y), cpu);
		data = cpu->memory[0xFFFF & (((memory[cpu->PC + 2] << 8) | (memory[cpu->PC + 1])) + cpu->Y)];
		return data;
	//IND
	case 10:
		cpu->cycles += 4;
		uint16_t indaddr = ((uint16_t)(memory[cpu->PC + 2]) << 8) | memory[cpu->PC + 1];
		uint16_t indaddr2 = (indaddr & 0xFF00) | ((indaddr + 1) & 0x00FF);
		return ((uint16_t)(cpu->memory[indaddr2])) << 8 | cpu->memory[indaddr];
	//REL
	case 11:
		return memory[cpu->PC + 1];
	//ZP ADDR
	case 12:
		cpu->cycles += 1;
		return memory[cpu->PC + 1];
	//ABS ADDR
	case 13:
		cpu->cycles += 2;
		return ((memory[cpu->PC + 2]) << 8) | (memory[cpu->PC + 1]);
	//ABSX ADDR
	case 14:
		cpu->cycles += 3;
		return (((memory[cpu->PC + 2]) << 8) | (memory[cpu->PC + 1])) + cpu->X;
	//ABSY ADDR
	case 15:
			cpu->cycles += 3;
		return (((memory[cpu->PC + 2]) << 8) | (memory[cpu->PC + 1])) + cpu->Y;
	//ZPX ADDR
	case 16:
		cpu->cycles += 2;
		return (uint8_t)(memory[cpu->PC + 1] + cpu->X);
	//ZPY ADDR
	case 17:
		cpu->cycles += 2;
		return (uint8_t)(memory[cpu->PC + 1] + cpu->Y);
	//INDX ADDR
	case 18:
		cpu->cycles += 4;
		return ((uint16_t)(cpu->memory[0xFF&((memory[cpu->PC + 1] + cpu->X) + 1)]) << 8) | cpu->memory[0xFF&(memory[cpu->PC + 1] + cpu->X)];
	//INDY ADDR
	case 19:	
		cpu->cycles += 4;
		uint16_t addr2 = (((cpu->memory[0xFF & (memory[cpu->PC + 1] + 1)])) << 8) | cpu->memory[memory[cpu->PC + 1]];
		return (addr2 + cpu->Y)&0xFFFF;
	default:
		return 0;
	}
}