Subversion Repositories NedoOS

Rev

Rev 653 | Blame | Compare with Previous | Last modification | View Log | Download

  1. #include "../_sdk/io.h"
  2. #include "../_sdk/str.h"
  3.  
  4. VAR PBYTE psystrk; //[0x900];
  5. #define BUFSECTORS 0x40
  6. #define BUFSIZE (UINT)(BUFSECTORS*0x100)
  7. VAR PBYTE buf; //[BUFSIZE]
  8.  
  9. FUNC UINT copybody(UINT from, UINT to, BYTE count)
  10. {
  11. VAR UINT nextrdsector;
  12. VAR UINT nextwrsector;
  13. VAR BYTE wrsectors;
  14. IF (from==to) {
  15.   nextwrsector = ((to&0xff00) >> 4) + (UINT)((BYTE)to&0x0f) + (UINT)count;
  16.   nextwrsector = ((nextwrsector << 4)&0xff00) + (UINT)((BYTE)nextwrsector&0x0f);
  17. }ELSE {
  18.   nextrdsector = from;
  19.   nextwrsector = to;
  20.   WHILE (count > 0x00) {
  21.     IF (count >= BUFSECTORS) {
  22.       wrsectors = BUFSECTORS;
  23.     }ELSE {
  24.       wrsectors = count;
  25.     };
  26.     nextrdsector = readsectors(buf, nextrdsector, wrsectors);
  27.     nextwrsector = writesectors(buf, nextwrsector, wrsectors);
  28.     count = count - wrsectors;
  29.   };
  30. };
  31. RETURN nextwrsector;
  32. }
  33.  
  34. PROC movedisk()
  35. {
  36. VAR UINT wasfreeplace; //
  37. VAR UINT freeplace; //ъєфр яш°хь Єхыю Їрщыр
  38. VAR PBYTE curfiledesc; //юЄъєфр ўшЄрхь фхёъЁшяЄюЁ
  39. VAR PBYTE freefiledesc; //ъєфр яш°хь фхёъЁшяЄюЁ
  40. VAR UINT nfreesectors;
  41. VAR BYTE nfiles;
  42. VAR BYTE count;
  43.   buf = (PBYTE)0x8000;
  44.   psystrk = (PBYTE)0xc000;
  45.  
  46.   //ўшЄрхь ёшёЄхьэє■ фюЁюцъє
  47.   readsectors((PBYTE)psystrk, 0x0000, 0x09);
  48.   nfiles = 0x00; //psystrk[0x8e4];
  49.   nfreesectors = *(PUINT)(&psystrk[0x8e5]);
  50.   //эрўрыю ётюсюфэюую ьхёЄр = 0x0100
  51.   freeplace = 0x0100;
  52.   freefiledesc = (PBYTE)psystrk;
  53.   //Єхъє∙шщ Їрщыют√щ фхёъЁшяЄюЁ = &psystrk[0x0000]
  54.   curfiledesc = (PBYTE)psystrk;
  55.   loop:
  56.     //ш∙хь эхєфры╕ээ√щ Їрщы
  57.     IF (*(PBYTE)curfiledesc == 0x00) goto quit;
  58.     count = curfiledesc[0x0d]; //ЁрчьхЁ т ёхъЄюЁрї
  59.     IF (*(PBYTE)curfiledesc == 0x01) {
  60.       nfreesectors = nfreesectors + (UINT)count;
  61.       goto next;
  62.     };
  63.     //яхЁхсЁрё√трхь Єхыю Їрщыр т эрўрыю яєёЄюую ьхёЄр
  64.     wasfreeplace = freeplace;
  65.     freeplace = copybody(*(PUINT)(&curfiledesc[0x0e]), freeplace, count);
  66.     //ъюЁЁхъЄшЁєхь фшЁхъЄюЁш■
  67.     memcopy(curfiledesc, 14, freefiledesc);
  68.     POKE *(PUINT)(&freefiledesc[0x0e]) = wasfreeplace;
  69.     freefiledesc = &freefiledesc[16];
  70.     INC nfiles;
  71.     next:
  72.     //яхЁхїюфшь ъ ёыхфє■∙хьє фхъёЁшяЄюЁє
  73.     curfiledesc = &curfiledesc[16];
  74.     //яютЄюЁ хь фю 0
  75.   goto loop;
  76.   quit:
  77.  
  78.   WHILE (freefiledesc[0] != 0x00) {
  79.     freefiledesc[0] = 0x00; //end of directory
  80.     freefiledesc = &freefiledesc[16];
  81.   };
  82.  
  83.   //ъюЁЁхъЄшЁєхь ёшёЄхьэ√щ ёхъЄюЁ
  84.   POKE *(PUINT)(&psystrk[0x8e1]) = freeplace;
  85.   psystrk[0x8e4] = nfiles; //number of files
  86.   POKE *(PUINT)(&psystrk[0x8e5]) = nfreesectors;
  87.   psystrk[0x8f4] = 0x00; //number of erased files
  88.   //яш°хь ёшёЄхьэє■ фюЁюцъє
  89.   writesectors((PBYTE)psystrk, 0x0000, 0x09);
  90. }
  91.