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

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

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

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-2012 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.