Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
716 lvd 1
#include "std.h"
2
 
3
#include "emul.h"
4
#include "vars.h"
5
#include "snapshot.h"
6
 
7
#include "util.h"
8
 
9
int FDD::index()
10
{
11
   return this - comp.wd.fdd;
12
}
13
 
14
// return: 0 - CANCEL, 1 - YES/SAVED, 2 - NOT SAVED
15
char FDD::test()
16
{
17
   if (!optype) return 1;
18
 
19
   static char changed[] = "Disk A: changed. Save ?"; changed[5] = index()+'A';
20
   int r = MessageBox(GetForegroundWindow(), changed, "Save disk", exitflag? MB_ICONQUESTION | MB_YESNO : MB_ICONQUESTION | MB_YESNOCANCEL);
21
   if (r == IDCANCEL) return 0;
22
   if (r == IDNO) return 2;
23
   // r == IDYES
24
   unsigned char *image = (unsigned char*)malloc(sizeof snbuf);
25
   memcpy(image, snbuf, sizeof snbuf);
26
   savesnap(index());
27
   memcpy(snbuf, image, sizeof snbuf);
28
   ::free(image);
29
 
30
   if (*(volatile char*)&optype) return 0;
31
   return 1;
32
}
33
 
34
void FDD::free()
35
{
36
   if (rawdata)
37
       VirtualFree(rawdata, 0, MEM_RELEASE);
38
 
39
   motor = 0;
40
   track = 0;
41
 
42
   rawdata = 0;
43
   rawsize = 0;
44
   cyls = 0;
45
   sides = 0;
46
   name[0] = 0;
47
   dsc[0] = 0;
48
   memset(trklen, 0,  sizeof(trklen));
49
   memset(trkd, 0,  sizeof(trkd));
50
   memset(trki, 0,  sizeof(trki));
51
   memset(trkwp, 0,  sizeof(trkwp));
52
   optype = 0;
53
   snaptype = 0;
54
   conf.trdos_wp[index()] = 0;
55
   /*comp.wd.trkcache.clear(); [vv]*/
56
   t.clear();
57
}
58
 
59
void FDD::newdisk(unsigned cyls, unsigned sides)
60
{
61
   free();
62
 
63
   FDD::cyls = cyls; FDD::sides = sides;
64
   unsigned len = MAX_TRACK_LEN;
65
   unsigned bitmap_len = unsigned(len+7U) >> 3;
66
   unsigned len2 = len + bitmap_len*2;
67
   rawsize = align_by(cyls * sides * len2, 4096);
68
   rawdata = (unsigned char*)VirtualAlloc(0, rawsize, MEM_COMMIT, PAGE_READWRITE);
69
   // ZeroMemory(rawdata, rawsize); // already done by VirtualAlloc
70
 
71
   for (unsigned c = 0; c < cyls; c++)
72
   {
73
      for (unsigned h = 0; h < sides; h++)
74
      {
75
         trklen[c][h] = len;
76
         trkd[c][h] = rawdata + len2*(c*sides + h);
77
         trki[c][h] = trkd[c][h] + len;
78
         trkwp[c][h] = trkd[c][h] + len + bitmap_len;
79
      }
80
   }
81
   // comp.wd.trkcache.clear(); // already done in free()
82
}
83
 
84
int FDD::read(unsigned char type)
85
{
86
   int ok = 0;
87
   switch(type)
88
   {
89
   case snTRD: ok = read_trd(); break;
90
   case snUDI: ok = read_udi(); break;
91
   case snHOB: ok = read_hob(); break;
92
   case snSCL: ok = read_scl(); break;
93
   case snFDI: ok = read_fdi(); break;
94
   case snTD0: ok = read_td0(); break;
95
   case snISD: ok = read_isd(); break;
96
   case snPRO: ok = read_pro(); break;
97
   }
98
   return ok;
99
}
100
 
101
bool done_fdd(bool Cancelable)
102
{
103
   for(int i = 0; i < 4; i++)
104
      if(!comp.wd.fdd[i].test() && Cancelable)
105
          return false;
106
   return true;
107
}