source: xtideuniversalbios/trunk/Serial_Server/library/FlatImage.h @ 526

Last change on this file since 526 was 526, checked in by krille_n_@…, 11 years ago

Changes:

  • Update of the copyright notices to include the year 2013.
File size: 2.5 KB
Line 
1//======================================================================
2//
3// Project:     XTIDE Universal BIOS, Serial Port Server
4//
5// File:        FlatImage.h - Header file for basic flat disk image support
6//
7
8//
9// XTIDE Universal BIOS and Associated Tools
10// Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
11//
12// This program is free software; you can redistribute it and/or modify
13// it under the terms of the GNU General Public License as published by
14// the Free Software Foundation; either version 2 of the License, or
15// (at your option) any later version.
16//
17// This program is distributed in the hope that it will be useful,
18// but WITHOUT ANY WARRANTY; without even the implied warranty of
19// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20// GNU General Public License for more details.
21// Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22//
23
24#include "library.h"
25
26class FlatImage : public Image
27{
28private:
29    class FileAccess fp;
30
31public:
32    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 )
33    {
34        long filesize;
35
36        if( p_create )
37        {
38            char buff[512];
39            unsigned long size;
40            double sizef;
41            FileAccess cf;
42            char sizeChar;
43
44            size = (unsigned long) p_cyl * (unsigned long) p_sect * (unsigned long) p_head;
45            if( size > cf.MaxSectors )
46                log( -1, "'%s', can't create flat file with size greater than %lu 512-byte sectors", name, cf.MaxSectors );
47            sizef = size / 2048.0;   // 512 byte sectors -> MB
48            sizeChar = 'M';
49            if( sizef < 1 )
50            {
51                sizef *= 1024;
52                sizeChar = 'K';
53            }
54
55            if( cf.Create( name ) )
56            {
57                memset( &buff[0], 0, 512 );
58                while( size-- )
59                    cf.Write( &buff[0], 512 );
60
61                if( p_cyl > 1024 )
62                    log( 0, "Created file '%s', size %.2lf %cB", name, sizef, sizeChar );
63                else
64                    log( 0, "Created file '%s', geometry %u:%u:%u, size %.2lf %cB", name, p_cyl, p_head, p_sect, sizef, sizeChar );
65                cf.Close();
66            }
67        }
68
69        fp.Open( name );
70
71        totallba = fp.SizeSectors();
72
73        init( name, p_readOnly, p_drive, p_cyl, p_head, p_sect, p_useCHS );
74    }
75
76    FlatImage::~FlatImage()
77    {
78        fp.Close();
79    }
80
81    void seekSector( unsigned long lba )
82    {
83        fp.SeekSectors( lba );
84    }
85
86    void writeSector( void *buff )
87    {
88        fp.Write( buff, 512 );
89    }
90
91    void readSector( void *buff )
92    {
93        fp.Read( buff, 512 );
94    }
95};
96
Note: See TracBrowser for help on using the repository browser.