home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CASM.ARJ / TIME2.ASM < prev   
Assembly Source File  |  1988-03-04  |  5KB  |  288 lines

  1. ;_ time2.asm   Fri Mar  4 1988   Modified by: Walter Bright */
  2. ; Copyright (C) 1987-1988 by Northwest Software
  3. ; All Rights Reserved
  4. ; Written by Walter Bright
  5.  
  6. include    macros.asm
  7.  
  8. ;Offsets into struct tm (must match time.h values)
  9. tm_sec    =    0
  10. tm_min    =    2
  11. tm_hour    =    4
  12. tm_mday    =    6
  13. tm_mon    =    8
  14. tm_year    =    10
  15. tm_wday    =    12
  16. tm_yday    =    14
  17. tm_isdst =    16
  18.  
  19. ifdef Atime2
  20.  
  21.     c_public    time
  22.     public        __mdays
  23.  
  24.     begdata
  25.  
  26. ;/**************************
  27. ; * # of days in year at start of month
  28. ; */
  29.  
  30. __mdays    dw    0,31,31+28,31+28+31,31+28+31+30
  31.     dw    31+28+31+30+31,31+28+31+30+31+30,31+28+31+30+31+30+31
  32.     dw    31+28+31+30+31+30+31+31,31+28+31+30+31+30+31+31+30
  33.     dw    31+28+31+30+31+30+31+31+30+31,31+28+31+30+31+30+31+31+30+31+30
  34.     dw    365
  35.  
  36.     enddata
  37.  
  38. ;#define SECSPERHOUR    (60*60)
  39. ;#define SECSPERDAY    (SECSPERHOUR*24L)
  40.  
  41.     begcode    time2
  42.  
  43. ;/****************************************
  44. ; * Return the number of seconds that have elapsed since the start
  45. ; * of 1980.
  46. ; *    time_t time(time_t *timer);
  47. ; * Input:
  48. ; *    timer    pointer to where to store result (or NULL)
  49. ; * Output:
  50. ; *    *timer = result (unless timer == NULL)
  51. ; * Returns:
  52. ; *    time
  53. ; */
  54.  
  55. func    time
  56.     push    BP
  57.     mov    BP,SP
  58.  
  59.     ; compute DX,AX = # of seconds since midnight
  60.     bdos    2Ch        ;get time
  61.     mov    AL,CH        ;hours (0..23)
  62.     mov    BX,60
  63.     mul    BL        ;AX = hours * 60
  64.     clr    CH        ;CX = minutes
  65.     add    AX,CX        ;AX = hours * 60 + minutes    
  66.     mov    CL,DH        ;CX = seconds
  67.     mul    BX        ;DX,AX = ((hours * 60) + minutes) * 60
  68.     ;DX,AX += CX
  69.     add    AX,CX
  70.     adc    DL,CH        ;can't overflow into DH
  71.     push    DX
  72.     push    AX        ;save for later
  73.  
  74.     bdos    2Ah        ;get date
  75.     sub    CX,1980        ;CX = years since 1980
  76.  
  77.     mov    BL,DH
  78. ;    clr    BH        ;BH is already 0
  79.     dec    BX        ;month (0..11)
  80.  
  81.     clr    DH        ;DX = day (1..31)
  82.  
  83. ;  if (month <= 1 || year & 3)    /* if before Feb or not a leap year    */
  84.     .if    BX be 1, L4E
  85.     test    CL,3
  86.     je    L51
  87. L4E:    dec    DX        ; don't add day for leap year
  88. L51:
  89.  
  90.     shl    BX,1
  91.     mov    BX,__mdays[BX]
  92.     add    BX,DX        ;day += __mdays[month];    (day in year)
  93.  
  94. ;  day += (year + 3) >> 2;    /* add a day for each leap year        */
  95.     mov    AX,CX
  96.     add    AX,3
  97.     shr    AX,1
  98.     shr    AX,1
  99.     add    BX,AX
  100.  
  101. ;  t = clk + ((year * 365L) + day) * SECSPERDAY;
  102.     mov    AX,365
  103.     mul    CX
  104.     add    AX,BX        ;AX = year * 365L + day
  105.                 ;if overflow into DX, we will fail anyway
  106.                 ;on multiply by SECSPERDAY
  107.     mov    BX,AX
  108.     mov    CX,05180h    ;SECSPERDAY - 64k
  109.     mul    CX
  110.     add    DX,BX        ;add the 64k
  111.  
  112.     pop    BX
  113.     pop    CX        ;CX,BX is # of seconds since midnight
  114.     add    BX,AX
  115.     adc    DX,CX        ;DX,BX = CX,BX + DX,AX
  116.     mov    AX,DX        ;AX,BX holds result
  117.     add    BX,00870h
  118.     adc    AX,012CFh    ;convert to time since 1970
  119.  
  120.     .if    <word ptr P[BP]> e 0, LAB    ;if timer is NULL
  121.     ; *timer = t;
  122.     .save    <SI>
  123.     if SPTR
  124.     mov    SI,P[BP]
  125.     mov    2[SI],AX
  126.     mov    [SI],BX
  127.     else
  128.     les    SI,P[BP]
  129.     mov    ES:2[SI],AX
  130.     mov    ES:[SI],BX
  131.     endif
  132.     .restore <SI>
  133. LAB:
  134.     ifdef MSC
  135.     mov    DX,AX
  136.     mov    AX,BX
  137.     endif
  138.     pop    BP
  139.     ret
  140. c_endp    time
  141.  
  142.     endcode    time2
  143.  
  144. endif ;Atime2
  145.  
  146. ifdef Autime
  147.  
  148.     begdata
  149.  
  150.     c_extrn    errno,word
  151.  
  152.     enddata
  153.  
  154.     if LCODE
  155.     c_extrn    time,far, localtime,far
  156.     else
  157.     c_extrn    time,near, localtime,near
  158.     endif
  159.  
  160.     begcode    utime
  161.  
  162. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  163. ; Set the time stamp on a file.
  164. ;    int utime(char *filespec,time_t timep[2]);
  165. ; Input:
  166. ;    filespec ->    ascii string giving the path and filename
  167. ;    timep ->    a 'last accessed' time and 'last modified' time,
  168. ;            respectively. MS-DOS has no concept of 'last
  169. ;            accessed' time, so that field is ignored, and the
  170. ;            time stamp is set to the 'last modified' time.
  171. ;            If timep is NULL, the current time is used.
  172. ; Returns:
  173. ;    0    success
  174. ;    -1    failure, errno will have a clue
  175.  
  176.     c_public utime
  177. func    utime
  178.     push    BP
  179.     mov    BP,SP
  180.     sub    SP,4
  181.     t = -4
  182.  
  183.     if LPTR
  184.     les    BX,P+SIZEPTR[BP]
  185.     mov    AX,ES
  186.     or    AX,BX
  187.     jz    L2
  188.     mov    AX,ES:4[BX]
  189.     mov    DX,ES:6[BX]    ;t = timep[1]; get 'last modified' time
  190.     else
  191.     mov    BX,P+SIZEPTR[BP]
  192.     or    BX,BX
  193.     jz    L2
  194.     mov    AX,4[BX]
  195.     mov    DX,6[BX]    ;t = timep[1]; get 'last modified' time
  196.     endif
  197.     jmps    L3
  198. L2:
  199.     if LPTR
  200.     push    BX
  201.     endif
  202.     push    BX        ;push NULL
  203.     callm    time
  204.     add    SP,SIZEPTR
  205. L3:
  206.     mov    t[BP],AX
  207.     mov    t+2[BP],DX
  208.  
  209.     ;bd = localtime(&t);
  210.     if LPTR
  211.     push    SS
  212.     endif
  213.     lea    BX,t[BP]
  214.     push    BX
  215.     callm    localtime    ;localtime(&t)
  216.     add    SP,SIZEPTR
  217.  
  218.     mov    BX,AX
  219.     if LPTR
  220.     push    DS
  221.     mov    DS,DX
  222.     endif
  223.  
  224.     ;date = ((((bd->tm_year - 80) << 4) + bd->tm_mon + 1) << 5) +
  225.     ;    bd->tm_mday;
  226.  
  227.     mov    AX,tm_year[BX]
  228.     sub    AX,80
  229.     mov    CL,4
  230.     shl    AX,CL
  231.     add    AX,tm_mon[BX]
  232.     inc    AX
  233.     inc    CL
  234.     shl    AX,CL
  235.     add    AX,tm_mday[BX]
  236.     mov    DX,AX
  237.  
  238.     ;tday = (((bd->tm_hour << 6) + bd->tm_min) << 5) + (bd->tm_sec >> 1);
  239.     mov    AX,tm_hour[BX]
  240.     inc    CL
  241.     shl    AX,CL
  242.     add    AX,tm_min[BX]
  243.     dec    CL
  244.     shl    AX,CL
  245.     mov    CX,tm_sec[BX]
  246.     shr    CX,1
  247.     add    CX,AX
  248.  
  249.     push    DX
  250.     mov    DX,P[BP]
  251.     mov    AX,03D00h        ;open file for reading
  252.     if LPTR
  253.     mov    DS,P+2[BP]
  254.     endif
  255.     bdos
  256.     pop    DX
  257.     if LPTR
  258.     pop    DS
  259.     endif
  260.     jc    err
  261.  
  262.     mov    BX,AX        ;handle
  263.  
  264.     mov    AX,05701h    ;set date/time
  265. ;    mov    CX,tday
  266. ;    mov    DX,date
  267.     bdos
  268.     jc    err
  269.  
  270.     bdos    3Eh        ;close file
  271.     jc    err
  272.     clr    AX
  273. L1:
  274.     add    SP,4
  275.     pop    BP
  276.     ret
  277.  
  278. err:    mov    DGROUP:errno,AX
  279.     mov    AX,-1
  280.     jmp    L1
  281. c_endp    utime
  282.  
  283.     endcode    utime
  284.  
  285. endif ;Autime
  286.  
  287.     end
  288.