/[projet1]/public/pc/tools/osdk/main/FloppyBuilder/Floppy.cpp
Defence Force logotype

Diff of /public/pc/tools/osdk/main/FloppyBuilder/Floppy.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1444 by dbug, Sat Mar 18 19:32:02 2017 UTC revision 1445 by dbug, Thu Mar 15 10:22:57 2018 UTC
# Line 301  bool Floppy::CreateDisk(int numberOfSide Line 301  bool Floppy::CreateDisk(int numberOfSide
301    
302    
303    // Heavily based on MakeDisk and Tap2DSk    // Heavily based on MakeDisk and Tap2DSk
304      // Additional comments from "Sedoric a Nu", page 62
305    int gap1,gap2,gap3;    int gap1,gap2,gap3;
306    
307    switch (numberOfSectors)    switch (numberOfSectors)
# Line 319  bool Floppy::CreateDisk(int numberOfSide Line 320  bool Floppy::CreateDisk(int numberOfSide
320    }    }
321    
322    m_BufferSize=256+numberOfSides*numberOfTracks*6400;    m_BufferSize=256+numberOfSides*numberOfTracks*6400;
323    m_Buffer=malloc(m_BufferSize);    m_Buffer=(unsigned char*)malloc(m_BufferSize);
324    if (m_Buffer)    if (m_Buffer)
325    {    {
326      m_TrackCount =numberOfTracks;      // 42      m_TrackCount =numberOfTracks;      // 42
# Line 346  bool Floppy::CreateDisk(int numberOfSide Line 347  bool Floppy::CreateDisk(int numberOfSide
347            }            }
348            for (int sector=0;sector<numberOfSectors;sector++)            for (int sector=0;sector<numberOfSectors;sector++)
349            {            {
350              for (int i=0;i<12;i++)      trackbuf[offset++]=0;              for (int i=0;i<12;i++)      trackbuf[offset++]=0;      // 00 00 00 00 00 00 00 00 00 00 00 00
351              for (int i=0;i<3;i++)       trackbuf[offset++]=0xA1;              for (int i=0;i<3;i++)       trackbuf[offset++]=0xA1;   // A1 A1 A1                             Synchronization sequence  
352              trackbuf[offset++]=0xFE;              trackbuf[offset++]=0xFE;                               // FE
353              for (int i=0;i<6;i++)       offset++;              for (int i=0;i<6;i++)       offset++;                  // TRACK SIDE SECTOR SIZE CRC CRC       (Size is 1 for 256 bytes large sectors, 2 for 512 bytes)
354              for (int i=0;i<gap2-12;i++) trackbuf[offset++]=0x22;              for (int i=0;i<gap2-12;i++) trackbuf[offset++]=0x4E;   // 4E 4E 4E 4E ...                      (more or less depending of gaps)
355              for (int i=0;i<12;i++)      trackbuf[offset++]=0;              for (int i=0;i<12;i++)      trackbuf[offset++]=0;      // 00 00 00 00 00 00 00 00 00 00 00 00
356              for (int i=0;i<3;i++)       trackbuf[offset++]=0xA1;              for (int i=0;i<3;i++)       trackbuf[offset++]=0xA1;   // A1 A1 A1                             Synchronization sequence  
357              trackbuf[offset++]=0xFB;              trackbuf[offset++]=0xFB;                               // FB
358              for (int i=0;i<258;i++)     offset++;              for (int i=0;i<258;i++)     offset++;                  // 256 bytes of DATA + 2 bytes of CRC
359              for (int i=0;i<gap3-12;i++) trackbuf[offset++]=0x4E;              for (int i=0;i<gap3-12;i++) trackbuf[offset++]=0x4E;   // 4E 4E 4E 4E ...                      (more or less depending of gaps)
360            }            }
361    
362            while (offset<6400)            while (offset<6400)
363            {            {
364              trackbuf[offset++]=0x4E;              trackbuf[offset++]=0x4E;                               // End of track padding
365            }            }
366          }          }
367          int offset=gap1;          int offset=gap1;
# Line 370  bool Floppy::CreateDisk(int numberOfSide Line 371  bool Floppy::CreateDisk(int numberOfSide
371            trackbuf[offset+5]=side;            trackbuf[offset+5]=side;
372            trackbuf[offset+6]=sectorList[sector]; //sector+1;            trackbuf[offset+6]=sectorList[sector]; //sector+1;
373            trackbuf[offset+7]=1;            trackbuf[offset+7]=1;
374            compute_crc(trackbuf+offset,4+4);            compute_crc(trackbuf+offset,4+4);      // Compute the CRC of [A1 A1 A1|FE|TRACK SIDE SECTOR SIZE]
375            offset+=4+6;            offset+=4+6;
376            offset+=gap2;            offset+=gap2;
377            memset(trackbuf+offset+4,0,256);            memset(trackbuf+offset+4,0,256);
378            compute_crc(trackbuf+offset,4+256);            compute_crc(trackbuf+offset,4+256);    // Compute the CRC of [A1 A1 A1|FB|TRACK DATA...]
379            offset+=256+6;            offset+=256+6;
380            offset+=gap3;            offset+=gap3;
381          }          }
# Line 394  bool Floppy::CreateDisk(int numberOfSide Line 395  bool Floppy::CreateDisk(int numberOfSide
395    
396  bool Floppy::LoadDisk(const char* fileName)  bool Floppy::LoadDisk(const char* fileName)
397  {  {
398    if (LoadFile(fileName,m_Buffer,m_BufferSize))    if (LoadFile(fileName,(void*)m_Buffer,m_BufferSize))
399    {    {
400      const FloppyHeader& header(*((FloppyHeader*)m_Buffer));      const FloppyHeader& header(*((FloppyHeader*)m_Buffer));
401      if (header.IsValidHeader())      if (header.IsValidHeader())
# Line 462  unsigned int Floppy::GetDskImageOffset() Line 463  unsigned int Floppy::GetDskImageOffset()
463  // 0x0319 -> 793  // 0x0319 -> 793
464  bool Floppy::WriteSector(const char *fileName)  bool Floppy::WriteSector(const char *fileName)
465  {  {
466      bool isOk=true;
467    if (!m_AllowMissingFiles)    if (!m_AllowMissingFiles)
468    {    {
469      if (!m_Buffer)      if (!m_Buffer)
# Line 484  bool Floppy::WriteSector(const char *fil Line 486  bool Floppy::WriteSector(const char *fil
486        unsigned int sectorOffset=GetDskImageOffset();        unsigned int sectorOffset=GetDskImageOffset();
487        if (m_BufferSize>sectorOffset+256)        if (m_BufferSize>sectorOffset+256)
488        {        {
489          memcpy((char*)m_Buffer+sectorOffset,buffer,bufferSize);          memset((char*)m_Buffer+sectorOffset,0,256);                           // Clear the entire content of the sector
490            memcpy((char*)m_Buffer+sectorOffset,buffer,bufferSize);               // Copy over the content of the file (maybe less than 256 bytes)
491            compute_crc((unsigned char*)m_Buffer+sectorOffset-4,4+256);           // Compute the CRC of [A1 A1 A1|FB|TRACK DATA...]
492        }        }
493        MarkCurrentSectorUsed();        MarkCurrentSectorUsed();
494        printf("Boot sector '%s' installed, %u free bytes remaining in this sector.\n",filteredFileName.c_str(),(unsigned int)(256-bufferSize));        printf("Boot sector '%s' installed, %u free bytes remaining in this sector.\n",filteredFileName.c_str(),(unsigned int)(256-bufferSize));
495    
496        MoveToNextSector();        isOk=MoveToNextSector();
497        free(buffer);        free(buffer);
498      }      }
499      else      else
# Line 497  bool Floppy::WriteSector(const char *fil Line 501  bool Floppy::WriteSector(const char *fil
501        ShowError("Boot Sector file '%s' not found",filteredFileName.c_str());        ShowError("Boot Sector file '%s' not found",filteredFileName.c_str());
502      }      }
503    }    }
504    return true;    return isOk;
505  }  }
506    
507    
# Line 551  bool Floppy::WriteLoader(const char *fil Line 555  bool Floppy::WriteLoader(const char *fil
555      MarkCurrentSectorUsed();      MarkCurrentSectorUsed();
556      memset((char*)m_Buffer+offset,0,256);      memset((char*)m_Buffer+offset,0,256);
557      memcpy((char*)m_Buffer+offset,fileData,sizeToWrite);      memcpy((char*)m_Buffer+offset,fileData,sizeToWrite);
558        compute_crc((unsigned char*)m_Buffer+offset-4,4+256);    // Compute the CRC of [A1 A1 A1|FB|TRACK DATA...]
559      fileData+=sizeToWrite;      fileData+=sizeToWrite;
560    
561      if (!MoveToNextSector())      if (!MoveToNextSector())
# Line 741  bool Floppy::WriteFile(const char *fileN Line 746  bool Floppy::WriteFile(const char *fileN
746      MarkCurrentSectorUsed();      MarkCurrentSectorUsed();
747      memset((char*)m_Buffer+offset,0,256);      memset((char*)m_Buffer+offset,0,256);
748      memcpy((char*)m_Buffer+offset,fileData,sizeToWrite);      memcpy((char*)m_Buffer+offset,fileData,sizeToWrite);
749        compute_crc((unsigned char*)m_Buffer+offset-4,4+256);           // Compute the CRC of [A1 A1 A1|FB|TRACK DATA...]
750      fileData+=sizeToWrite;      fileData+=sizeToWrite;
751    
752      if (!MoveToNextSector())      if (!MoveToNextSector())
# Line 799  bool Floppy::ReserveSectors(int sectorCo Line 805  bool Floppy::ReserveSectors(int sectorCo
805    
806      MarkCurrentSectorUsed();      MarkCurrentSectorUsed();
807      memset((char*)m_Buffer+offset,fillValue,256);      memset((char*)m_Buffer+offset,fillValue,256);
808        compute_crc((unsigned char*)m_Buffer+offset-4,4+256);             // Compute the CRC of [A1 A1 A1|FB|TRACK DATA...]
809    
810      if (!MoveToNextSector())      if (!MoveToNextSector())
811      {      {

Legend:
Removed from v.1444  
changed lines
  Added in v.1445

  ViewVC Help
Powered by ViewVC 1.1.26