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; }
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; } }