source: xtideuniversalbios/trunk/Serial_Server/library/FlatImage.cpp@ 217

Last change on this file since 217 was 217, checked in by gregli@…, 13 years ago

Serial Server: various improvements, turned on LBA28 support by default.

File size: 2.3 KB
Line 
1//======================================================================
2//
3// Project: XTIDE Universal BIOS, Serial Port Server
4//
5// File: FlatImage.cpp - Basic flat disk image file support
6//
7
8#include <stdio.h>
9#include <stdlib.h>
10#include <memory.h>
11
12#include "FlatImage.h"
13
14FlatImage::FlatImage( char *name, int p_readOnly, int p_drive, int p_create, unsigned long p_cyl, unsigned long p_head, unsigned long p_sect, int p_useCHS ) : Image( name, p_readOnly, p_drive, p_create, p_cyl, p_head, p_sect, p_useCHS )
15{
16 long filesize;
17
18 if( p_create )
19 {
20 char buff[512];
21 unsigned long size;
22 unsigned long size2;
23 double sizef;
24
25 fp = fopen( name, "r" );
26 if( fp )
27 log( -1, "Create Failure: '%s' already exists", name );
28
29 if( !(fp = fopen( name, "w" )) )
30 log( -1, "Could not create file '%s'", name );
31
32 memset( &buff[0], 0, 512 );
33 size2 = size = (unsigned long) p_cyl * (unsigned long) p_sect * (unsigned long) p_head;
34 while( size-- )
35 {
36 if( fwrite( &buff[0], 1, 512, fp ) != 512 )
37 log( -1, "Create write black sector error" );
38 }
39 fclose( fp );
40
41 sizef = size2/2048.0;
42 if( p_cyl > 1024 )
43 log( 0, "Created file '%s', size %.1lf MB", name, sizef );
44 else
45 log( 0, "Created file '%s', geometry %u:%u:%u, size %.1lf MB", name, p_cyl, p_sect, p_head, sizef );
46 }
47
48 fp = fopen( name, "r+" );
49 if( !fp )
50 log( -1, "Could not Open '%s'", name );
51
52 fseek( fp, 0, SEEK_END );
53 filesize = ftell( fp );
54
55 if( filesize == 0 || filesize == -1L )
56 log( -1, "Could not get file size for '%s', file possibly larger than 2 GB", name );
57
58 if( filesize & 0x1ff )
59 log( -1, "'%s' not made up of 512 byte sectors", name );
60
61 totallba = filesize >> 9; // 512 bytes per sector
62
63 init( name, p_readOnly, p_drive, p_cyl, p_head, p_sect, p_useCHS );
64}
65
66int FlatImage::seekSector( unsigned long cyl, unsigned long sect, unsigned long head )
67{
68 return( 0 );
69}
70
71int FlatImage::seekSector( unsigned long lba )
72{
73 return( fseek( fp, lba * 512, SEEK_SET ) );
74}
75
76int FlatImage::writeSector( void *buff )
77{
78 int r;
79
80 r = fwrite( buff, 1, 512, fp );
81 fflush( fp );
82
83 return( r == 512 ? 0 : 1 );
84}
85
86int FlatImage::readSector( void *buff )
87{
88 return( fread( buff, 1, 512, fp ) == 512 ? 0 : 1 );
89}
90
91FlatImage::~FlatImage()
92{
93 if( fp )
94 fclose( fp );
95 fp = NULL;
96}
97
98
Note: See TracBrowser for help on using the repository browser.