Subversion Repositories Kolibri OS

Rev

Rev 19 | Rev 71 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                      ;;
  3. ;; RAMDISK functions                                                    ;;
  4. ;; (C) 2004 Ville Turjanmaa, License: GPL                               ;;
  5. ;; Addings by M.Lisovin                                                 ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. ; calculate fat chain
  9.  
  10. calculatefatchain:
  11.  
  12.    pushad
  13.  
  14.    mov  esi,0x100000+512
  15.    mov  edi,0x280000
  16.  
  17.  fcnew:
  18.    mov  eax,dword [esi]
  19.    mov  ebx,dword [esi+4]
  20.    mov  ecx,dword [esi+8]
  21.    mov  edx,ecx
  22.    shr  edx,4   ;8 ok
  23.    shr  dx,4    ;7 ok
  24.    xor  ch,ch
  25.    shld ecx,ebx,20 ;6 ok
  26.    shr  cx,4     ;5 ok
  27.    shld ebx,eax,12
  28.    and  ebx,0x0fffffff  ;4 ok
  29.    shr  bx,4    ;3 ok
  30.    shl  eax,4
  31.    and  eax,0x0fffffff  ;2 ok
  32.    shr  ax,4  ;1 ok
  33.    mov dword [edi],eax
  34.    add  edi,4
  35.    mov dword [edi],ebx
  36.    add  edi,4
  37.    mov dword [edi],ecx
  38.    add  edi,4
  39.    mov dword [edi],edx
  40.    add  edi,4  
  41.    add  esi,12
  42.  
  43.    cmp  edi,0x280000+2856*2   ;2849 clusters
  44.    jnz  fcnew
  45.  
  46.    popad
  47.    ret
  48.  
  49.  
  50. restorefatchain:   ; restore fat chain
  51.  
  52.    pushad
  53.  
  54.    mov  esi,0x280000
  55.    mov  edi,0x100000+512
  56.  
  57.   fcnew2:
  58.    mov  eax,dword [esi]
  59.    mov  ebx,dword [esi+4]
  60.    shl  ax,4
  61.    shl  eax,4
  62.    shl  bx,4
  63.    shr  ebx,4
  64.    shrd eax,ebx,8
  65.    shr  ebx,8
  66.    mov dword [edi],eax
  67.    add  edi,4
  68.    mov word [edi],bx
  69.    add  edi,2
  70.    add  esi,8
  71.  
  72.    cmp  edi,0x100000+512+4278     ;4274 bytes - all used FAT
  73.    jb   fcnew2
  74.  
  75.    mov  esi,0x100000+512           ; duplicate fat chain
  76.    mov  edi,0x100000+512+0x1200
  77.    mov  ecx,1069        ;4274/4
  78.    cld
  79.    rep  movsd
  80.  
  81.    popad
  82.    ret
  83.  
  84.  
  85. ramdisk_free_space:
  86. ;---------------------------------------------
  87. ;
  88. ; returns free space in edi
  89. ; rewr.by Mihasik
  90. ;---------------------------------------------
  91.  
  92.         push   eax ebx ecx
  93.  
  94.         mov  edi,0x280000 ;start of FAT
  95.         xor  ax,ax    ;Free cluster=0x0000 in FAT
  96.         xor  ebx,ebx  ;counter
  97.         mov  ecx,2849 ;2849 clusters
  98.         cld
  99.     rdfs1:
  100.         repne scasw
  101.         jnz  rdfs2    ;if last cluster not 0
  102.         inc  ebx
  103.         jcxz rdfs2    ;if last cluster=0
  104.         jmp  rdfs1    ;if not last
  105.     rdfs2:
  106.         shl  ebx,9    ;free clusters*512
  107.         mov  edi,ebx
  108.        
  109.         pop    ecx ebx eax
  110.         ret
  111.  
  112.  
  113. expand_filename:
  114. ;---------------------------------------------
  115. ;
  116. ; exapand filename with '.' to 11 character
  117. ; eax - pointer to filename
  118. ;---------------------------------------------
  119.  
  120.         push esi edi ebx
  121.  
  122.         mov  edi,esp                  ; check for '.' in the name
  123.         add  edi,12+8
  124.  
  125.         mov  esi,eax
  126.  
  127.         mov  eax,edi
  128.         mov  [eax+0],dword '    '
  129.         mov  [eax+4],dword '    '
  130.         mov  [eax+8],dword '    '
  131.  
  132.       flr1:
  133.  
  134.         cmp  [esi],byte '.'
  135.         jne  flr2
  136.         mov  edi,eax
  137.         add  edi,7
  138.         jmp  flr3
  139.  
  140.       flr2:
  141.  
  142.         mov  bl,[esi]
  143.         mov  [edi],bl
  144.  
  145.       flr3:
  146.  
  147.         inc  esi
  148.         inc  edi
  149.  
  150.         mov  ebx,eax
  151.         add  ebx,11
  152.  
  153.         cmp  edi,ebx
  154.         jbe  flr1
  155.  
  156.         pop  ebx edi esi
  157.         ret
  158.  
  159. fileread:
  160. ;----------------------------------------------------------------
  161. ;
  162. ;  fileread - sys floppy
  163. ;
  164. ;  eax  points to filename 11 chars
  165. ;  ebx  first wanted block       ; 1+ ; if 0 then set to 1
  166. ;  ecx  number of blocks to read ; 1+ ; if 0 then set to 1
  167. ;  edx  mem location to return data
  168. ;  esi  length of filename 12*X 0=root
  169. ;
  170. ;  ret ebx = size or 0xffffffff file not found
  171. ;      eax = 0 ok read or other = errormsg
  172. ;
  173. ;--------------------------------------------------------------
  174.         test   ebx,ebx ;if ebx=0 - set to 1
  175.         jnz    frfl5
  176.         inc    ebx
  177.       frfl5:
  178.         test   ecx,ecx ;if ecx=0 - set to 1
  179.         jnz    frfl6
  180.         inc    ecx
  181.       frfl6:
  182.         test   esi,esi          ; return ramdisk root
  183.         jnz    fr_noroot        ;if not root
  184.         cmp    ebx,14           ;14 clusters=root dir
  185.         ja     oorr
  186.         cmp    ecx,14
  187.         ja     oorr
  188.         jmp    fr_do
  189.       oorr:
  190.         mov    eax,5            ;out of root range (fnf)
  191.         xor    ebx,ebx
  192.         dec    ebx              ;0xffffffff
  193.         ret
  194.  
  195.       fr_do:                    ;reading rootdir
  196.         mov    edi,edx
  197.         dec    ebx
  198.         push   edx
  199.         mov    edx,ecx    
  200.         add    edx,ebx
  201.         cmp    edx,15     ;ebx+ecx=14+1
  202.         pushf
  203.         jbe    fr_do1
  204.         sub    edx,14
  205.         sub    ecx,edx
  206.       fr_do1:
  207.         shl    ebx,9
  208.         mov    esi,0x100000+512*19
  209.         add    esi,ebx
  210.         shl    ecx,7
  211.         cld
  212.         rep    movsd
  213.         popf
  214.         pop    edx
  215.         jae    fr_do2
  216.         xor    eax,eax ; ok read
  217.         xor    ebx,ebx
  218.         ret
  219.       fr_do2:        ;if last cluster
  220.         mov    eax,6  ;end of file
  221.         xor    ebx,ebx
  222.         ret
  223.  
  224.      fr_noroot:
  225.  
  226.         sub    esp,32
  227.         call   expand_filename
  228.  
  229.         dec    ebx
  230.  
  231.         push   eax
  232.  
  233.         push   eax ebx ecx edx esi edi
  234.         call   rd_findfile
  235.         je     fifound
  236.         add    esp,32+28   ;if file not found
  237.         ret
  238.  
  239.      fifound:
  240.  
  241.         mov    ebx,[edi-11+28]          ;file size
  242.         mov    [esp+20],ebx
  243.         mov    [esp+24],ebx
  244.         add    edi,0xf
  245.         movzx  eax,word [edi]
  246.         mov    edi,eax                  ;edi=cluster
  247.  
  248.       frnew:
  249.  
  250.         add    eax,31                   ;bootsector+2*fat+filenames
  251.         shl    eax,9                    ;*512
  252.         add    eax,0x100000             ;image base
  253.         mov    ebx,[esp+8]
  254.         mov    ecx,512                  ;[esp+4]
  255.  
  256.         cmp    [esp+16],dword 0         ; wanted cluster ?
  257.         jne    frfl7
  258.         call   memmove
  259.         add    [esp+8],dword 512
  260.         dec    dword [esp+12]           ; last wanted cluster ?
  261.         cmp    [esp+12],dword 0
  262.         je     frnoread
  263.         jmp    frfl8
  264.       frfl7:
  265.         dec    dword [esp+16]
  266.       frfl8:
  267.         shl    edi,1                    ;find next cluster from FAT
  268.         add    edi,0x280000
  269.         movzx  eax,word [edi]
  270.         mov    edi,eax
  271.         cmp    edi,4095                 ;eof  - cluster
  272.         jz     frnoread2
  273.  
  274.         cmp    [esp+24],dword 512       ;eof  - size
  275.         jb     frnoread
  276.         sub    [esp+24],dword 512
  277.  
  278.         jmp    frnew
  279.  
  280.       frnoread2:
  281.  
  282.         cmp    [esp+16],dword 0         ; eof without read ?
  283.         je     frnoread
  284.  
  285.         pop    edi esi edx ecx
  286.         add    esp,4
  287.         pop    ebx     ; ebx <- eax : size of file
  288.         add    esp,36
  289.         mov    eax,6   ; end of file
  290.         ret
  291.  
  292.       frnoread:
  293.  
  294.         pop    edi esi edx ecx
  295.         add    esp,4
  296.         pop    ebx     ; ebx <- eax : size of file
  297.         add    esp,36
  298.         xor    eax,eax  ;read ok
  299.         ret
  300.  
  301. filedelete:
  302. ;--------------------------------------------
  303. ;
  304. ; filedelete - sys floppy
  305. ; in:
  306. ; eax -  pointer to filename 11 chars
  307. ;
  308. ; out:
  309. ; eax - 0 = successful, 5 = file not found
  310. ;
  311. ;--------------------------------------------
  312.  
  313.         sub    esp,32
  314.         call   expand_filename
  315.  
  316.         push   eax ebx ecx edx esi edi
  317.        
  318.         call   rd_findfile
  319.         je     fifoundd
  320.         pop    edi esi edx ecx ebx eax ;file not found
  321.         add    esp,32
  322.         mov    eax,5
  323.         ret
  324.  
  325.      fifoundd:
  326.  
  327.         mov    [edi-11],byte 0xE5       ;mark filename deleted
  328.         add    edi,0xf
  329.         movzx  eax,word [edi]
  330.         mov    edi,eax                  ;edi = cluster
  331.  
  332.       frnewd:
  333.  
  334.         shl    edi,1                    ;find next cluster from FAT
  335.         add    edi,0x280000
  336.         movzx  eax,word [edi]
  337.         mov    [edi],word 0x0           ;clear fat chain cluster
  338.         mov    edi,eax
  339.         cmp    edi,dword 0xff8          ;last cluster ?
  340.         jb     frnewd
  341.  
  342.         pop    edi esi edx ecx ebx eax
  343.         add    esp,32
  344.         xor    eax,eax       ; file found
  345.         ret
  346.  
  347.      
  348.  
  349. filesave:
  350. ;----------------------------------------------------------
  351. ;
  352. ; filesave - sys floppy
  353. ;
  354. ; eax points to filename 11 chars
  355. ;
  356. ;        eax      ; pointer to file name
  357. ;        ebx      ; buffer
  358. ;        ecx      ; count to write in bytes
  359. ;        edx      ; 0 create new , 1 append
  360. ;
  361. ;-----------------------------------------------------------
  362.  
  363.         sub  esp,32
  364.         call expand_filename
  365.         test edx,edx
  366.         jnz  fsdel
  367.         pusha
  368.         call filedelete
  369.         popa
  370.  
  371.       fsdel:
  372.  
  373.         call   ramdisk_free_space
  374.         cmp    ecx,edi
  375.         jbe    rd_do_save
  376.         add    esp,32
  377.         mov    eax,8    ;disk full
  378.         ret
  379.  
  380.       rd_do_save:
  381.  
  382.         push   eax ebx ecx edx esi edi
  383.  
  384.         mov    edi,0x100000+512*18+512  ;Point at directory
  385.         mov    edx,224 +1
  386.         ; find an empty spot for filename in the root dir
  387.      l20ds:
  388.         dec    edx
  389.         test   edx,edx
  390.         jz     frnoreadds
  391.      l21ds:
  392.         cmp    [edi],byte 0xE5
  393.         jz     fifoundds
  394.         cmp    [edi],byte 0x0
  395.         jz     fifoundds
  396.         add    edi,32                   ; Advance to next entry
  397.         jmp    l20ds
  398.      fifoundds:
  399.  
  400.         push   edi                      ; move the filename to root dir
  401.         mov    esi,[esp+4+20]
  402.         mov    ecx,11
  403.         cld
  404.         rep    movsb
  405.         pop    edi
  406.         mov    edx,edi
  407.         add    edx,11+0xf               ; edx <- cluster save position
  408.         mov    ebx,[esp+12]             ; save file size
  409.         mov    [edi+28],ebx
  410.         mov    [edi+11],byte 0x20       ; attribute
  411. ; Ivan Poddubny 11/12/2003:
  412. call get_date_for_file   ; from FAT32.INC
  413. mov [edi+24],ax          ; date
  414. call get_time_for_file   ; from FAT32.INC
  415. mov [edi+22],ax          ; time
  416. ; End
  417.         mov    edi,0x280000            ;pointer to first cluster
  418.         mov    ecx,2849
  419.         cld
  420.       frnewds:
  421.         xor    ax,ax
  422.         repne  scasw
  423.         mov    ebx,2848
  424.         sub    ebx,ecx
  425.         mov    [edx],bx                 ; save next cluster pos. to prev cl.
  426.         mov    edx,edi                  ; next save pos abs mem add
  427.         dec    edx
  428.         dec    edx
  429.         call   fdc_filesave
  430.         pusha                           ; move save to floppy cluster
  431.         add    ebx,31
  432.         shl    ebx,9
  433.         add    ebx,0x100000
  434.         mov    eax,[esp+32+16]
  435.         mov    ecx,512
  436.         call   memmove
  437.         popa
  438.  
  439.         mov    eax,[esp+12]
  440.         cmp    eax,512
  441.         jbe    flnsa
  442.         sub    eax,512
  443.         mov    [esp+12],eax
  444.         mov    eax,[esp+16]
  445.         add    eax,512
  446.         mov    [esp+16],eax
  447.         jmp    frnewds
  448.  
  449.      flnsa:
  450.         dec    edi
  451.         dec    edi
  452.         mov    [edi],word 4095          ; mark end of file - last cluster
  453.  
  454.       frnoreadds:
  455.  
  456.         pop    edi esi edx ecx ebx eax
  457.         add    esp,32
  458.  
  459. ;        pusha
  460. ;        cli
  461. ;        call   fdc_commitfile
  462. ;        sti
  463. ;        popa
  464.  
  465.         xor    eax,eax ;ok write
  466.         ret
  467.  
  468.    rd_findfile:
  469.    ;by Mihasik
  470.    ;IN: eax - pointer to filename OUT: filestring+11 in edi or notZero in flags and fnf in eax,ebx
  471.  
  472.         mov    edi,0x100000+512*18+512  ;Point at directory
  473.         cld
  474.     rd_newsearch:
  475.         mov    esi,eax
  476.         mov    ecx,11
  477.         rep    cmpsb
  478.         je     rd_ff
  479.         add    cl,21
  480.         add    edi,ecx
  481.         cmp    edi,0x100000+512*33
  482.         jb     rd_newsearch
  483.         mov    eax,5      ;if file not found - eax=5
  484.         xor    ebx,ebx
  485.         dec    ebx    ;ebx=0xffffffff and zf=0    
  486.      rd_ff:
  487.         ret            
  488.  
  489.   rd_getfileinfo:
  490.      ;get date, time, size or attributes of file
  491.      ;IN: eax - pointer to file, ebx - type of function: 12-get filesize, 13-get fileattr, 14-get filedate
  492.      ;ecx - filelengh 0=root
  493.      ;OUT: eax=0 - Ok or 5 - file not found ebx - date/time, size or attributes
  494.         test   ecx,ecx
  495.         jnz    no_getfinfo_root
  496.         mov    eax,5      ;if root - fnf
  497.         xor    ebx,ebx
  498.         dec    ebx
  499.         ret
  500.     no_getfinfo_root:     ;if not root
  501.         sub    esp,32
  502.         call   expand_filename
  503.         call   rd_findfile
  504.         je     fifoundi
  505.         add    esp,32      ;if file not found
  506.         ret
  507.     fifoundi:    
  508.         cmp    ebx,13
  509.         jne    no_rd_attr
  510.         movzx ebx,byte [edi]    ;get attributes
  511.         jmp    rd_getfileinfo_end
  512.      no_rd_attr:
  513.         cmp    ebx,14
  514.         jne    no_rd_date
  515.         mov    ebx,dword [edi+11] ;get date/time
  516.         jmp    rd_getfileinfo_end
  517.      no_rd_date:
  518.         mov    ebx,dword [edi+17] ;get size
  519.      rd_getfileinfo_end:
  520.         xor    eax,eax
  521.         add    esp,32
  522.         ret  
  523.