Subversion Repositories Kolibri OS

Rev

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