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 | } |