fs_common.inc
kolibrios-nextgen_kolibrios-kernel/kernel/fs/fs_common.inc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                              ;;
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
;;  Distributed under terms of the GNU General Public License.  ;;
;;                                                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fsReadCMOS:
        out     70h, al
        in      al, 71h
        xor     ah, ah
        shl     ax, 4
        shr     al, 4
        aad
        ret

fsGetTime:
        mov     al, 7
        call    fsReadCMOS
        ror     eax, 8
        mov     al, 8
        call    fsReadCMOS
        ror     eax, 8
        mov     al, 9
        call    fsReadCMOS
        add     eax, 2000
        ror     eax, 16
        push    eax
        xor     eax, eax
        call    fsReadCMOS
        ror     eax, 8
        mov     al, 2
        call    fsReadCMOS
        ror     eax, 8
        mov     al, 4
        call    fsReadCMOS
        ror     eax, 16
        push    eax
        mov     esi, esp
        add     esp, 8
fsCalculateTime:
; in: esi -> data block
; out: eax = seconds since 01.01.2001
        movzx   eax, word [esi+6]
        sub     eax, 2001
        jnc     @f
        xor     eax, eax
@@:
        mov     edx, months
        mov     ebx, eax
        inc     eax
        test    eax, 3
        jnz     @f
        add     edx, 12
@@:
        movzx   eax, byte [esi+5]
        dec     eax
        xor     ecx, ecx
@@:
        dec     eax
        js      @f
        add     cl, [edx+eax]
        adc     ch, 0
        jmp     @b
@@:
        mov     eax, ebx    ; years
        mov     edx, 365
        mul     edx
        shr     ebx, 2
        add     eax, ebx
        add     eax, ecx
        mov     bl, [esi+4]
        dec     eax
        add     eax, ebx    ; days
        mov     dl, 24
        mul     edx
        mov     bl, [esi+2]
        add     eax, ebx    ; hours
        mov     ecx, 60
        mul     ecx
        mov     bl, [esi+1]
        add     eax, ebx    ; minutes
        mul     ecx
        mov     bl, [esi]
        add     eax, ebx
        ret

iglobal
months  db  31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
months2 db  31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
endg

fsTime2bdfe:
; in: eax = seconds since 01.01.2001
; edi -> data block
; out: edi = edi+8
        xor     edx, edx
        mov     ecx, 60
        div     ecx
        mov     [edi], dl
        xor     edx, edx
        div     ecx
        mov     [edi+1], dl
        xor     edx, edx
        mov     cl, 24
        div     ecx
        mov     [edi+2], dx
        xor     edx, edx
        mov     cx, 365
        div     ecx
        mov     ebx, eax
        add     ebx, 2001
        shr     eax, 2
        sub     edx, eax
        jns     @f
        dec     ebx
        add     edx, 365
        test    ebx, 3
        jnz     @f
        inc     edx
@@:
        xor     eax, eax
        mov     ecx, months-1
        test    ebx, 3
        jnz     @f
        add     ecx, 12
@@:
        inc     ecx
        inc     eax
        sub     dl, [ecx]
        jnc     @b
        dec     dh
        jns     @b
        add     dl, [ecx]
        inc     edx
        mov     [edi+4], dl
        mov     [edi+5], al
        mov     [edi+6], bx
        add     edi, 8
        ret
