?login_element?

Subversion Repositories NedoOS

Rev

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

  1. #include "../_sdk/io.h"
  2. #include "../_sdk/str.h"
  3.  
  4. VAR BYTE psystrk[0x900];
  5. #define BUFSECTORS 0x10
  6. #define BUFSIZE (UINT)(BUFSECTORS*0x100)
  7. VAR BYTE buf[BUFSIZE];
  8.  
  9. FUNC UINT copybody(UINT from, UINT to, BYTE count) // TODO ъюяшЁютрэшх эр Єю цх ьхёЄю эх фхырЄ№, эю фы  ¤Єюую эрфю т√ўшёышЄ№ ёыхфє■∙шщ ёхъЄюЁ!
  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((PBYTE)buf, nextrdsector, wrsectors);
  27.     nextwrsector = writesectors((PBYTE)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.   //ўшЄрхь ёшёЄхьэє■ фюЁюцъє
  44.   readsectors((PBYTE)psystrk, 0x0000, 0x09);
  45.   nfiles = 0x00; //psystrk[0x8e4];
  46.   nfreesectors = *(PUINT)(&psystrk[0x8e5]);
  47.   //эрўрыю ётюсюфэюую ьхёЄр = 0x0100
  48.   freeplace = 0x0100;
  49.   freefiledesc = (PBYTE)psystrk;
  50.   //Єхъє∙шщ Їрщыют√щ фхёъЁшяЄюЁ = &psystrk[0x0000]
  51.   curfiledesc = (PBYTE)psystrk;
  52.   loop:
  53.     //ш∙хь эхєфры╕ээ√щ Їрщы
  54.     IF (*(PBYTE)curfiledesc == 0x00) goto quit;
  55.     count = curfiledesc[0x0d]; //ЁрчьхЁ т ёхъЄюЁрї
  56.     IF (*(PBYTE)curfiledesc == 0x01) {
  57.       nfreesectors = nfreesectors + (UINT)count;
  58.       goto next;
  59.     };
  60.     //яхЁхсЁрё√трхь Єхыю Їрщыр т эрўрыю яєёЄюую ьхёЄр
  61.     wasfreeplace = freeplace;
  62.     freeplace = copybody(*(PUINT)(&curfiledesc[0x0e]), freeplace, count);
  63.     //ъюЁЁхъЄшЁєхь фшЁхъЄюЁш■
  64.     memcopy(curfiledesc, 14, freefiledesc);
  65.     POKE *(PUINT)(&freefiledesc[0x0e]) = wasfreeplace;
  66.     freefiledesc = &freefiledesc[16];
  67.     INC nfiles;
  68.     next:
  69.     //яхЁхїюфшь ъ ёыхфє■∙хьє фхъёЁшяЄюЁє
  70.     curfiledesc = &curfiledesc[16];
  71.     //яютЄюЁ хь фю 0
  72.   goto loop;
  73.   quit:
  74.  
  75.   WHILE (freefiledesc[0] != 0x00) {
  76.     freefiledesc[0] = 0x00; //end of directory
  77.     freefiledesc = &freefiledesc[16];
  78.   };
  79.  
  80.   //ъюЁЁхъЄшЁєхь ёшёЄхьэ√щ ёхъЄюЁ
  81.   POKE *(PUINT)(&psystrk[0x8e1]) = freeplace;
  82.   psystrk[0x8e4] = nfiles; //number of files
  83.   POKE *(PUINT)(&psystrk[0x8e5]) = nfreesectors;
  84.   psystrk[0x8f4] = 0x00; //number of erased files
  85.   //яш°хь ёшёЄхьэє■ фюЁюцъє
  86.   writesectors((PBYTE)psystrk, 0x0000, 0x09);
  87. }
  88.