Subversion Repositories pentevo

Rev

Rev 716 | Blame | Last modification | View Log | Download | RSS feed

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