Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. file_handler:
  2.  .position=0
  3.  .size=4
  4.  .bufer_block=8
  5.  .operation=12
  6.  .first_block=16
  7.  .n_blocks=20
  8.  .bufer=24
  9.  .work_area=28
  10.  .name=32
  11.  .st_size=32+128
  12.  
  13. open: ;esi=name_string
  14.       ;retorna eax
  15.         pushad
  16.         push dword [work_area]
  17.         mov ecx,512 ;bufer
  18.         call malloc
  19.         push edi
  20.         mov ecx,file_handler.st_size
  21.         call mallocz
  22.         pop dword[edi+file_handler.bufer]
  23.         pop dword[edi+file_handler.work_area]
  24.         mov [esp+28],edi
  25.         mov ecx,100
  26.         add edi,file_handler.name
  27.         call movedata
  28.         mov edi,[esp+28]
  29.         mov byte[edi+file_handler.n_blocks],1
  30.         mov  eax,58
  31.         lea  ebx,[edi+file_handler.operation]
  32.         push edi
  33.         int  0x40
  34.         pop edi
  35.         test eax,eax
  36.         jnz close.b
  37.         mov [edi+file_handler.size],ebx
  38.         clc
  39.         popad
  40.         ret
  41.  
  42. close:
  43.         pushad
  44.      .b:
  45.         mov eax,[esp+28]
  46.         mov edi,[eax+file_handler.bufer]
  47.         call free
  48.         mov edi,eax
  49.         call free
  50.         popad
  51.         xor eax,eax
  52.         ret
  53.  
  54.  
  55. read:     ;(f,bufer,nbytes)  eax,edi,ecx ncr
  56.           ;retorna bytes leidos en ecx
  57.         pushad
  58.         mov edx,[eax+file_handler.size]
  59.         sub edx,[eax+file_handler.position]
  60.         cmp edx,ecx
  61.         jnc .nb_ok
  62.         mov ecx,edx
  63.         mov [esp+24],edx
  64.       .nb_ok:
  65.         jecxz .final
  66.         mov byte[eax+file_handler.operation],0
  67.         test dword[eax+file_handler.position],511
  68.         jz .l1
  69.         call .bufer
  70.       .l1:
  71.         mov edx,ecx
  72.         shr edx,9
  73.         jz .l2
  74.         mov [eax+file_handler.n_blocks],edx
  75.         mov edx,[eax+file_handler.position]
  76.         shr edx,9
  77.         mov [eax+file_handler.first_block],edx
  78.         xchg edi,[eax+file_handler.bufer]
  79.         pushad
  80.         lea ebx,[eax+file_handler.operation]
  81.         mov eax,58
  82.         int 40h
  83.  cmp eax,0ffffff00h
  84.  jnc .error
  85.         popad
  86.         xchg edi,[eax+file_handler.bufer]
  87.         mov edx,ecx
  88.         and edx,0fffffe00h
  89.         add [eax+file_handler.position],edx
  90.         add edi,edx
  91.       .l2:
  92.         and ecx,511
  93.         jz .final
  94.         call .bufer
  95.       .final:
  96.         popad
  97.         ret
  98.  
  99.    .bufer:
  100.         pushad
  101.         mov ebx,[eax+file_handler.position]
  102.         shr ebx,9
  103.         cmp ebx,[eax+file_handler.bufer_block]
  104.         je .l3
  105.         mov [eax+file_handler.first_block],ebx
  106.         mov [eax+file_handler.bufer_block],ebx
  107.         mov dword[eax+file_handler.n_blocks],1
  108.         lea ebx,[eax+file_handler.operation]
  109.         mov eax,58
  110.         int 40h
  111.  cmp eax,0ffffff00h
  112.  jnc .error
  113.    .l3:
  114.         mov eax,[esp+28]
  115.         mov edx,[eax+file_handler.position]
  116.         mov esi,[eax+file_handler.bufer]
  117.         and edx,511
  118.         add esi,edx
  119.         neg edx
  120.         add edx,512
  121.         cmp ecx,edx
  122.         jc .l4
  123.         mov ecx,edx
  124.     .l4:
  125.         add [eax+file_handler.position],ecx
  126.         sub [esp+24],ecx
  127.         pop edi
  128.         call movedata
  129.         push edi
  130.         popad
  131.         ret
  132. .error:
  133.  popad
  134.  popad
  135.  xor ecx,ecx
  136.  stc
  137.  ret
  138.  
  139.  
  140. ftell:  mov edx,[eax+file_handler.position]
  141.         ret
  142. lseek: ;eax=file edx=pos
  143.         mov [eax+file_handler.position],edx
  144.         ret
  145. skip:   ;eax=file edx=bytes to skip
  146.         add [eax+file_handler.position],edx
  147.         ret
  148.  
  149.  
  150.  
  151.  
  152.