static int amd_flash_write_cfibuffer(struct flash_info *info, unsigned long dest,
		const u8 *cp, int len)
{
	flash_sect_t sector;
	int cnt;
	void *src = (void *)cp;
	void *dst = (void *)dest;
	cfiword_t cword;

	sector = find_sector (info, dest);

	flash_unlock_seq(info);
	flash_make_cmd (info, AMD_CMD_WRITE_TO_BUFFER, &cword);
	flash_write_word(info, cword, (void *)dest);

	if (bankwidth_is_1(info)) {
		cnt = len;
		flash_write_cmd(info, sector, 0, (u32)cnt - 1);
		while (cnt-- > 0) {
			flash_write8(flash_read8(src), dst);
			src += 1, dst += 1;
		}
	} else if (bankwidth_is_2(info)) {
		cnt = len >> 1;
		flash_write_cmd(info, sector, 0, (u32)cnt - 1);
		while (cnt-- > 0) {
			flash_write16(flash_read16(src), dst);
			src += 2, dst += 2;
		}
	} else if (bankwidth_is_4(info)) {
static int amd_flash_write_cfibuffer (struct flash_info *info, ulong dest, const uchar * cp,
				  int len)
{
	flash_sect_t sector;
	int cnt;
	int retcode;
	volatile cfiptr_t src;
	volatile cfiptr_t dst;
	cfiword_t cword;

	src.cp = (uchar *)cp;
	dst.cp = (uchar *) dest;
	sector = find_sector (info, dest);

	flash_unlock_seq(info);
	flash_make_cmd (info, AMD_CMD_WRITE_TO_BUFFER, &cword);
	flash_write_word(info, cword, (void *)dest);

	if (bankwidth_is_1(info)) {
		cnt = len;
		flash_write_cmd (info, sector, 0,  (uchar) cnt - 1);
		while (cnt-- > 0) *dst.cp++ = *src.cp++;
	} else if (bankwidth_is_2(info)) {
		cnt = len >> 1;
		flash_write_cmd (info, sector, 0,  (uchar) cnt - 1);
		while (cnt-- > 0) *dst.wp++ = *src.wp++;
	} else if (bankwidth_is_4(info)) {
Beispiel #3
0
int main()
{
    int exit = 0;
    MAP* map = load_map("zaza.wad");
    
    init();
    
    clock_t last_clock = clock();
    
    while(!exit)
    {
        clock_t now = clock();
        float dt = (float)(now - last_clock) / CLOCKS_PER_SEC;
        last_clock = now;
        
        VEC2F view_dir = vec2f(cos(ang), sin(ang));
        VEC2F view_dir_norm = vec2f(-view_dir.y, view_dir.x);
        
        if(key[KEY_ESC]) exit = 1;
        if(key[KEY_S]) vp = vec2f_sum(vp, vec2f_uscale(view_dir, -move_speed * dt));
        if(key[KEY_W]) vp = vec2f_sum(vp, vec2f_uscale(view_dir, move_speed * dt));
        if(key[KEY_A]) vp = vec2f_sum(vp, vec2f_uscale(view_dir_norm, -move_speed * dt));
        if(key[KEY_D]) vp = vec2f_sum(vp, vec2f_uscale(view_dir_norm, move_speed * dt));
        if(key[KEY_LEFT]) ang -= rot_speed * dt;
        if(key[KEY_RIGHT]) ang += rot_speed * dt;
        
        clear_to_color(buffer, makecol(64, 64, 64));
        
        SECTOR* s = find_sector(map, map->node_num - 1, vp);
        float h = s->floor_height + 45;
        
        int i = 0;
        
        for(i = 0; i < H_RES; ++i)
        {
            float t = i - H_RES / 2;
            float u = FOCAL_DIST;
            
            VEC2F ray_dir = vec2f_sum(vec2f_uscale(view_dir, u), vec2f_uscale(view_dir_norm, t)); //vec2f(view_dir.x * FOCAL_DIST + view_dir_norm.x * t, view_dir.y * FOCAL_DIST + view_dir_norm.y * t);
            float ray_len = sqrt(ray_dir.x * ray_dir.x + ray_dir.y * ray_dir.y);
            ray_dir.x /= ray_len;
            ray_dir.y /= ray_len;
            
            int minh = 0;
            int maxh = SCREEN_H;
            
            render_col(buffer, map, map->node_num - 1, vp, -h, ray_dir, i, &minh, &maxh);
            printf("\n");
            //line(buffer, SCREEN_W / 2, SCREEN_H / 2, SCREEN_W / 2 + ray_dir.x * 200, SCREEN_H / 2 + ray_dir.y * 200, makecol(255, 255, 255));
        }
        
        draw_sprite(buffer, mouse_sprite, mouse_x, mouse_y);
        blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
    }
    
    destroy_map(map);
    deinit();
    return 0;
}END_OF_MAIN()
Beispiel #4
0
static int flash_write_cfibuffer(flash_info_t * info, ulong dest, uchar * cp,
				 int len)
{

	int sector;
	int cnt;
	int retcode;
	volatile cfiptr_t src;
	volatile cfiptr_t dst;

	src.cp = cp;
	dst.cp = (uchar *) dest;
	sector = find_sector(info, dest);
	flash_write_cmd(info, sector, 0, FLASH_CMD_CLEAR_STATUS);
	flash_write_cmd(info, sector, 0, FLASH_CMD_WRITE_TO_BUFFER);
	if ((retcode = flash_status_check(info, sector, info->buffer_write_tout,
					  "write to buffer")) == ERR_OK) {
		switch (info->portwidth) {
		case FLASH_CFI_8BIT:
			cnt = len;
			break;
		case FLASH_CFI_16BIT:
			cnt = len >> 1;
			break;
		case FLASH_CFI_32BIT:
			cnt = len >> 2;
			break;
		default:
			return ERR_INVAL;
			break;
		}
		flash_write_cmd(info, sector, 0, (uchar) cnt - 1);
		while (cnt-- > 0) {
			switch (info->portwidth) {
			case FLASH_CFI_8BIT:
				*dst.cp++ = *src.cp++;
				break;
			case FLASH_CFI_16BIT:
				*dst.wp++ = *src.wp++;
				break;
			case FLASH_CFI_32BIT:
				*dst.lp++ = *src.lp++;
				break;
			default:
				return ERR_INVAL;
				break;
			}
		}
		flash_write_cmd(info, sector, 0,
				FLASH_CMD_WRITE_BUFFER_CONFIRM);
		retcode =
		    flash_full_status_check(info, sector,
					    info->buffer_write_tout,
					    "buffer write");
	}
	flash_write_cmd(info, sector, 0, FLASH_CMD_CLEAR_STATUS);
	return retcode;
}
Beispiel #5
0
inline void cmd_read(void)
{
    t_sector *sector;

loop:
    sector = find_sector(&FDC.command[CMD_C]); // locate the requested sector on the current track
    if (sector) { // sector found
        FDC.result[RES_ST1] = sector->flags[0] & 0x25; // copy ST1 to result, ignoring unused bits
        FDC.result[RES_ST2] = sector->flags[1] & 0x61; // copy ST2 to result, ignoring unused bits
        if (FDC.command[CMD_CODE] == 0x4c) { // read deleted data command?
            FDC.result[RES_ST2] ^= 0x40; // invert Control Mark
        }
        if ((FDC.flags & SKIP_flag) && (FDC.result[RES_ST2] &= 0x40)) { // skip sector?
            if (FDC.command[CMD_R] != FDC.command[CMD_EOT]) { // continue looking?
                FDC.command[CMD_R]++; // advance to next sector
                goto loop;
            }
            else { // no data to transfer -> no execution phase
                LOAD_RESULT_WITH_STATUS

                LOAD_RESULT_WITH_CHRN

                FDC.phase = RESULT_PHASE; // switch to result phase
            }
        }
        else { // sector data is to be transferred
            int sector_size;

            if (FDC.result[RES_ST2] &= 0x40) { // does the sector have an AM opposite of what we want?
                FDC.command[CMD_EOT] = FDC.command[CMD_R]; // execution ends on this sector
            }
            if (FDC.command[CMD_N] == 0) { // use DTL for length?
                sector_size = FDC.command[CMD_DTL]; // size of sector is defined by DTL value
                if (sector_size > 0x80) {
                    sector_size = 0x80; // max DTL value is 128
                }
            }
            else {
                sector_size = 128 << FDC.command[CMD_N]; // determine number of bytes from N value
            }
            FDC.buffer_count = sector_size; // init number of bytes to transfer
            FDC.buffer_ptr = sector->data; // pointer to sector data
            FDC.buffer_endptr = active_track->data + active_track->size; // pointer beyond end of track data
            FDC.timeout = INITIAL_TIMEOUT;
            read_status_delay = 1;
        }
    }
    else { // sector not found
        FDC.result[RES_ST0] |= 0x40; // AT
        FDC.result[RES_ST1] |= 0x04; // No Data

        LOAD_RESULT_WITH_CHRN

        FDC.phase = RESULT_PHASE; // switch to result phase
    }
}
Beispiel #6
0
SECTOR* find_sector(MAP* map, int idx, VEC2F vp)
{
    if(idx & SHORT_SIGN_FLAG)
    {
        SSECTOR* ssector = &map->ssectors[(short)(idx & ~SHORT_SIGN_FLAG)];
        SEG* seg = &map->segs[ssector->first_seg_idx];
        LINEDEF* linedef = &map->linedefs[seg->linedef_idx];
        SIDEDEF* sidedef = seg->dir ? &map->sidedefs[linedef->neg_sidedef_idx] : &map->sidedefs[linedef->pos_sidedef_idx];
        return &map->sectors[sidedef->sector_idx];
    }
    else
    {
        NODE* node = &map->nodes[idx];
        
        VEC2F n = vec2f(-node->y2, node->x2);
        if(vec2f_dot(n, vec2f(vp.x - node->x1, vp.y - node->y1)) >= 0)
            return find_sector(map, node->right_child_idx, vp);
        else
            return find_sector(map, node->left_child_idx, vp);
    }
    
    return NULL;
}
Beispiel #7
0
inline void cmd_scan(void)
{
    t_sector *sector;

loop:
    sector = find_sector(&FDC.command[CMD_C]); // locate the requested sector on the current track
    if (sector) { // sector found
        FDC.result[RES_ST1] = sector->flags[0] & 0x25; // copy ST1 to result, ignoring unused bits
        FDC.result[RES_ST2] = sector->flags[1] & 0x61; // copy ST2 to result, ignoring unused bits
        if ((FDC.flags & SKIP_flag) && (FDC.result[RES_ST2] &= 0x40)) { // skip sector?
            if (FDC.command[CMD_R] != FDC.command[CMD_EOT]) { // continue looking?
                FDC.command[CMD_R] += FDC.command[CMD_STP]; // advance to next sector
                goto loop;
            }
            else { // no data to transfer -> no execution phase
                LOAD_RESULT_WITH_STATUS

                LOAD_RESULT_WITH_CHRN

                FDC.phase = RESULT_PHASE; // switch to result phase
            }
        }
        else { // sector data is to be transferred
            int sector_size;

            if (FDC.result[RES_ST2] &= 0x40) { // does the sector have an AM opposite of what we want?
                FDC.command[CMD_EOT] = FDC.command[CMD_R]; // execution ends on this sector
            }
            sector_size = 128 << FDC.command[CMD_N]; // determine number of bytes from N value
            FDC.buffer_count = sector_size; // init number of bytes to transfer
            FDC.buffer_ptr = sector->data; // pointer to sector data
            FDC.buffer_endptr = active_track->data + active_track->size; // pointer beyond end of track data
            FDC.flags &= ~SCANFAILED_flag; // reset scan failed flag
            FDC.result[RES_ST2] |= 0x08; // assume data matches: set Scan Equal Hit
            FDC.timeout = INITIAL_TIMEOUT;
            read_status_delay = 1;
        }
    }
    else { // sector not found
        FDC.result[RES_ST0] |= 0x40; // AT
        FDC.result[RES_ST1] |= 0x04; // No Data

        LOAD_RESULT_WITH_CHRN

        FDC.phase = RESULT_PHASE; // switch to result phase
    }
}
Beispiel #8
0
inline void cmd_write(void)
{
    t_sector *sector;

    sector = find_sector(&FDC.command[CMD_C]); // locate the requested sector on the current track
    if (sector) { // sector found
        int sector_size;

        sector->flags[0] = 0; // clear ST1 for this sector
        if (FDC.command[CMD_CODE] == 0x45) { // write data command?
            sector->flags[1] = 0; // clear ST2
        }
        else { // write deleted data
            sector->flags[1] = 0x40; // set Control Mark
        }

        if (FDC.command[CMD_N] == 0) { // use DTL for length?
            sector_size = FDC.command[CMD_DTL]; // size of sector is defined by DTL value
            if (sector_size > 0x80) {
                sector_size = 0x80; // max DTL value is 128
            }
        }
        else {
            sector_size = 128 << FDC.command[CMD_N]; // determine number of bytes from N value
        }
        FDC.buffer_count = sector_size; // init number of bytes to transfer
        FDC.buffer_ptr = sector->data; // pointer to sector data
        FDC.buffer_endptr = active_track->data + active_track->size; // pointer beyond end of track data
        FDC.timeout = INITIAL_TIMEOUT;
        read_status_delay = 1;
    }
    else { // sector not found
        FDC.result[RES_ST0] |= 0x40; // AT
        FDC.result[RES_ST1] |= 0x04; // No Data

        LOAD_RESULT_WITH_CHRN

        FDC.phase = RESULT_PHASE; // switch to result phase
    }
}
Beispiel #9
0
void t_FDC::cmd_read(void)
{
	auto emulator = _emulator.lock();
	t_sector *sector;
	
loop:
	sector = find_sector(&command[CMD_C]); // locate the requested sector on the current track
	emulator->fdcNotifyRead(driveA.current_side, driveA.current_track, sector);
	if (sector) { // sector found
		result[RES_ST1] = sector->flags[0] & 0x25; // copy ST1 to result, ignoring unused bits
		result[RES_ST2] = sector->flags[1] & 0x61; // copy ST2 to result, ignoring unused bits
		if (command[CMD_CODE] == 0x4c) { // read deleted data command?
			result[RES_ST2] ^= 0x40; // invert Control Mark
		}
		if ((flags & SKIP_flag) && (result[RES_ST2] &= 0x40)) { // skip sector?
			if (command[CMD_R] != command[CMD_EOT]) { // continue looking?
				command[CMD_R]++; // advance to next sector
				goto loop;
			}
			else { // no data to transfer -> no execution phase
				LOAD_RESULT_WITH_STATUS();
					
				LOAD_RESULT_WITH_CHRN();
					
					phase = RESULT_PHASE; // switch to result phase
			}
		}
		else { // sector data is to be transferred
			int sector_size;
			
			if (result[RES_ST2] &= 0x40) { // does the sector have an AM opposite of what we want?
				command[CMD_EOT] = command[CMD_R]; // execution ends on this sector
			}
			if (command[CMD_N] == 0) { // use DTL for length?
				sector_size = command[CMD_DTL]; // size of sector is defined by DTL value
				if (sector_size > 0x80) {
					sector_size = 0x80; // max DTL value is 128
				}
			}
			else {
				sector_size = 128 << command[CMD_N]; // determine number of bytes from N value
			}
			buffer_count = sector_size; // init number of bytes to transfer

			// Handle weak sectors
			int versions_count = 1;
			if(sector->declared_size != 0)
				versions_count = sector->size/sector->declared_size;
			int offset;
			if(versions_count > 1)
			{
				static int weak_counter;
				weak_counter = (weak_counter+1)%versions_count;
				offset = weak_counter;
			}
			else
				offset = 0;

			buffer_ptr = sector->data + sector->declared_size*offset; // pointer to sector data
			buffer_endptr = active_track->data + active_track->size; // pointer beyond end of track data
			timeout = INITIAL_TIMEOUT;
			read_status_delay = 1;
		}
	}
	else { // sector not found
		result[RES_ST0] |= 0x40; // AT
		result[RES_ST1] |= 0x04; // No Data

		if (active_track->sectors == 0)
		{
			// Not formatted track 
			result[RES_ST1]|=1; // set MA flag
			result[RES_ST2]|=1; // set MD flag
		}
		
		LOAD_RESULT_WITH_CHRN();
			
		phase = RESULT_PHASE; // switch to result phase
	}
}
Beispiel #10
0
int main()
{
    int exit = 0;
    MAP* map = load_map("e1m1.wad");
    VEC2F vp = vec2f(0.f, 0.f);
    float ang, move_speed = 200.f, rot_speed = 2.5f;
    
    init();
    
    //VEC2F vn = vec2f(-v.y, v.x);
    //VEC2F ray_dir = vec2f();
    
    //short s = -1;
    //s &= ~(1 << 15);
    //printf("ZOMG = %d\n", s);
    
    clock_t last_clock = clock();
    
    while(!exit)
    {
        clock_t now = clock();
        float dt = (float)(now - last_clock) / CLOCKS_PER_SEC;
        last_clock = now;
        
        VEC2F view_dir = vec2f(cos(ang), sin(ang));
        VEC2F view_dir_norm = vec2f(-view_dir.y, view_dir.x);
        
        if(key[KEY_ESC]) exit = 1;
        if(key[KEY_S]) vp = vec2f_sum(vp, vec2f_uscale(view_dir, -move_speed * dt));
        if(key[KEY_W]) vp = vec2f_sum(vp, vec2f_uscale(view_dir, move_speed * dt));
        if(key[KEY_A]) vp = vec2f_sum(vp, vec2f_uscale(view_dir_norm, -move_speed * dt));
        if(key[KEY_D]) vp = vec2f_sum(vp, vec2f_uscale(view_dir_norm, move_speed * dt));
        if(key[KEY_LEFT]) ang -= rot_speed * dt;
        if(key[KEY_RIGHT]) ang += rot_speed * dt;
        
        clear_to_color(buffer, 0);
        
        SECTOR* s = find_sector(map, map->node_num - 1, vp);
        float h = s->floor_height + 45;
        
        int i;
        
        for(i = 0; i < H_RES; ++i)
        {
            float t = i - H_RES / 2;
            float u = FOCAL_DIST;
            
            VEC2F ray_dir = vec2f_sum(vec2f_uscale(view_dir, u), vec2f_uscale(view_dir_norm, t)); //vec2f(view_dir.x * FOCAL_DIST + view_dir_norm.x * t, view_dir.y * FOCAL_DIST + view_dir_norm.y * t);
            float ray_len = sqrt(ray_dir.x * ray_dir.x + ray_dir.y * ray_dir.y);
            ray_dir.x /= ray_len;
            ray_dir.y /= ray_len;
            render_col(buffer, map, map->node_num - 1, vp, -h, ray_dir, i);
            
            //line(buffer, SCREEN_W / 2, SCREEN_H / 2, SCREEN_W / 2 + ray_dir.x * 200, SCREEN_H / 2 + ray_dir.y * 200, makecol(255, 255, 255));
        }

        
        
        if(key[KEY_TAB])
        for(i = 0; i < map->seg_num; ++i)
        {
            VERTEX v1t = map->vertexes[map->segs[i].v1_idx];
            VERTEX v2t = map->vertexes[map->segs[i].v2_idx];
            VEC2F v1 = vec2f(v1t.x, v1t.y);
            VEC2F v2 = vec2f(v2t.x, v2t.y);
            VEC2F mid = vec2f((v1.x + v2.x) / 2, (v1.y + v2.y) / 2);
            
            VEC2F n = normalized_normal(vec2f_diff(v2, v1));
            float scl = 1.f / 2.f;
            
            line(buffer, v1.x*scl + SCREEN_W / 2,
                         v1.y*scl + SCREEN_H / 2,
                         v2.x*scl + SCREEN_W / 2,
                         v2.y*scl + SCREEN_H / 2, makecol(255, 255, 255));
            circlefill(buffer, (int)vp.x*scl + SCREEN_W/2, (int)vp.y*scl +SCREEN_H/2, 3, makecol(255, 255, 255));
            
            
            line(buffer, SCREEN_W/2+ mid.x*scl,
                        SCREEN_H/2 +  mid.y*scl,
                        SCREEN_W/2+ (mid.x + n.x * 10)*scl,
                        SCREEN_H/2+ (mid.y + n.y * 10)*scl, makecol(255, 255, 255));
            
            
            line(buffer, SCREEN_W/2+vp.x*scl,
                        SCREEN_H/2+vp.y*scl,
                        SCREEN_W/2+(vp.x+view_dir.x*100)*scl,
                        SCREEN_H/2+(vp.y+view_dir.y*100)*scl, makecol(255, 255, 255));
        }
        
        //
        
        draw_sprite(buffer, mouse_sprite, mouse_x, mouse_y);
        blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
    }
    
    destroy_map(map);
    deinit();
    return 0;
}END_OF_MAIN()