home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / tcpipsrc / h / if / Misc / s / realtime < prev   
Encoding:
Text File  |  1995-02-14  |  7.4 KB  |  336 lines

  1.         GET    a:SWICalls
  2.         GET    a:Registers
  3.  
  4. ; This call was written to get round a stupid bug in Clib's time
  5. ; functions
  6. ;
  7. ;
  8.  
  9.         AREA    |C$$code|,CODE,READONLY
  10.  
  11. r_s        RN    0    ;seconds on exit
  12. r_c        RN    1    ;centi seconds
  13. r_a        RN    2    ;LS 32 bits of 40bit Risc OS time of day
  14. r_b        RN    3    ;MS 8 bits of 40bit Risc OS time of day
  15. r_v        RN    4    ;Temp reg
  16.  
  17.         ^    0
  18. ost_csec    #    4
  19. ost_sec        #    4
  20. ost_min        #    4
  21. ost_hour    #    4
  22. ost_day        #    4
  23. ost_month    #    4
  24. ost_year    #    4
  25. ost_wday    #    4
  26. ost_yday    #    4
  27. ost_size    *    @
  28.  
  29.         ^    0
  30. tm_sec        #    4
  31. tm_min        #    4
  32. tm_hour        #    4
  33. tm_day        #    4
  34. tm_month    #    4
  35. tm_year        #    4
  36. tm_wday        #    4
  37. tm_yday        #    4
  38. tm_dst        #    4
  39. tm_size        *    @
  40.  
  41. ; -------------------------------------------------------------------------
  42. ; Convert 40 bit Risc OS time value into 32 bit time_t
  43. ;
  44. ;On entry:
  45. ;  R0 = pointer to 5 byte Risc OS time value
  46. ;On exit:
  47. ;  R0 = 32 bit time_t
  48. ;
  49. time_40to32
  50.             STMFD    sp!, {r1-r4, lr}
  51.             LDMIA    r0, {r_a, r_b}
  52.  
  53.             AND    r_b, r_b, #&ff            ;real time bits 39-32 - get rid of 40+
  54.             LDR    r_v, =&6e996a00            ;To Unix and C time range
  55.             SUBS    r_a, r_a, r_v            ;5 byte time - 0x336e996a00
  56.             SBC    r_c, r_b, #&33            ;Risc OS time on 1st Jan 1970
  57.  
  58. ; r_t is a temp,  r_v is a temp,  r_c is csecs,  r_s is secs
  59. ; The following is a 40 bit div/mod by 100
  60.  
  61.  
  62.  
  63.             MOV    r_s, #0                ;sec = 0
  64. ;;;            MOV    r_c, #0                ;csec = 0
  65.                                 ;b is real time bits 39-32
  66. ;;;            ORR    r_c, r_b, r_c, LSL #8        ;csec = (csec<<8) | t;
  67.             BL    divmod100            ;csec = csec % 100;
  68.             ORR    r_s, r_b, r_s, LSL #8        ;sec = (sec<<8) | (csec/100);
  69.  
  70. div32by100b
  71.             MOV    r_b, r_a, LSR #24        ;b is real time bits 31-24
  72.             ORR    r_c, r_b, r_c, LSL #8        ;csec = (csec<<8) | t;
  73.             BL    divmod100            ;csec = csec % 100;
  74.             ORR    r_s, r_b, r_s, LSL #8        ;sec = (sec<<8) | (csec/100);
  75.  
  76.             MOV    r_b, r_a, LSR #16
  77.             AND    r_b, r_b, #&ff            ;b is real time bits 23-16
  78.             ORR    r_c, r_b, r_c, LSL #8        ;csec = (csec<<8) | t;
  79.             BL    divmod100            ;csec = csec % 100;
  80.             ORR    r_s, r_b, r_s, LSL #8        ;sec = (sec<<8) | (csec/100);
  81.  
  82.             MOV    r_b, r_a, LSR #8
  83.             AND    r_b, r_b, #&ff            ;b is real time bits 15-8
  84.             ORR    r_c, r_b, r_c, LSL #8        ;csec = (csec<<8) | t;
  85.             BL    divmod100            ;csec = csec % 100;
  86.             ORR    r_s, r_b, r_s, LSL #8        ;sec = (sec<<8) | (csec/100);
  87.  
  88.             MOV    r_b, r_a
  89.             AND    r_b, r_a, #&ff            ;b is real time bits 7-0
  90.             ORR    r_c, r_b, r_c, LSL #8        ;csec = (csec<<8) | t;
  91.             BL    divmod100            ;csec = csec % 100;
  92.             ORR    r_s, r_b, r_s, LSL #8        ;sec = (sec<<8) | (csec/100);
  93.  
  94.             LDMFD    sp!, {r1-r4, pc}^
  95.  
  96. ; Part of timezone convertion below
  97. div32by100        STMFD    sp!, {r1-r4, lr}
  98.             MOVS    r_a, r1
  99.             RSBMI    r_a, r_a, #0            ;absolute value
  100.             MOV    r_s, #0                ;so that value of result is correct
  101.             MOV    r_c, #0                ;even if the sign isnt
  102.             B    div32by100            
  103.  
  104.  
  105. ; ----------
  106. ; Highly optimised 16 bit div/mod 100
  107. ; (r1) r_c = r_c%100
  108. ; (r3) _b = r_c/100
  109. ; (r4 used)
  110. divmod100
  111.             MOV    r_v, r_c, LSR #1              ;Divide by 100 to get seconds
  112.             RSB    r_v, r_v, r_v, LSL #3
  113.             RSB    r_v, r_v, r_v, LSL #3
  114.             RSB    r_b, r_v, r_v, LSL #7
  115.             ADD    r_v, r_v, r_v, LSL #2
  116.             SUB    r_v, r_b, r_v, LSL #2
  117.             MOV    r_b, r_v, LSR #18        ;result in r_b
  118.  
  119.             ADD    r_v, r_b, r_b, LSL #2          ;Remainder of division (0-99)
  120.             ADD    r_v, r_v, r_v, LSL #2
  121.             SUB    r_c, r_c, r_v, LSL #2        ;remainder back in r_c
  122.  
  123.             MOVS    pc, lr
  124.  
  125.  
  126. ; -------------------------------------------------------------------------
  127. ; Convert 32 bit time_t into 40 bit Risc OS time value
  128. ;
  129. ;On entry:
  130. ;  R0 = time_t
  131. ;  R1 = pointer to 5 byte buffer to time value
  132. ;On exit:
  133. ;  -
  134.             EXPORT    time_32to40
  135. time_32to40
  136.             STMFD    sp!, {r0, r2-r3, lr}
  137.  
  138.             MOV    r3, r0, LSR #24            ;32 bit * 100 -> 40 bit value
  139.             BIC    r0, r0, #&FF000000
  140.  
  141.             ADD    r3, r3, r3, LSL#2
  142.             ADD    r3, r3, r3, LSL#2
  143.             MOV    r3, r3, LSL#2
  144.  
  145.             ADD    r0, r0, r0, LSL#2
  146.             ADD    r0, r0, r0, LSL#2
  147.             MOV    r0, r0, LSL#2
  148.  
  149.             MOV    r2, r3, LSR#8
  150.             ADDS    r0, r0, r3, LSL#24
  151.             ADC    r3, r2, #0
  152.  
  153.             LDR    r2, =&6e996a00            ;To Risc OS time range
  154.             ADDS    r0, r0, r2
  155.             ADC    r3, r3, #&33
  156.  
  157.             STR    r0, [r1, #0]
  158.             STRB    r3, [r1, #4]
  159.  
  160.             LDMFD    sp!, {r0, r2-r3, pc}^
  161.  
  162.  
  163. ; -------------------------------------------------------------------------
  164. ; Convert timezone for csecs to secs
  165. ;
  166. ;On entry:
  167. ;  R1 = signed timezone in centiseconds
  168. ;On exit:
  169. ;  R0 = signed timezone in seconds
  170. ;
  171. time_convtz
  172.             STMFD    sp!, {lr}
  173.             BL    div32by100
  174.             MOVS    r1, r1
  175.             RSBMI    r0, r1, #0
  176.             LDMFD    sp!, {pc}^
  177.  
  178.  
  179. ; -------------------------------------------------------------------------
  180. ; Read current GMT time
  181. ;
  182. ;On entry:
  183. ;  -
  184. ;On exit:
  185. ;  R0 = GMT time
  186. ;
  187.             EXPORT    time_readgmt
  188. time_readgmt
  189.             STMFD    sp!, {r1, lr}
  190.             SUB    sp, sp, #8
  191.             MOV    r0, #3
  192.             STRB    r0, [sp, #0]
  193.             MOV    r0, #14
  194.             MOV    r1, sp
  195.             SWI    XOS_Word
  196.             MOV    r0, r1
  197.             BL    time_40to32
  198.             ADD    sp, sp, #8
  199.             LDMFD    sp!, {r1, pc}^
  200.  
  201.  
  202. ; -------------------------------------------------------------------------
  203. ; Convert time to ordinals
  204. ;
  205. ;On entry:
  206. ;  R0 = time
  207. ;  R1 = pointer to ANSI-C tm struture <time.h>
  208. ;On exit:
  209. ;  Buffer is filled, except DST flag is allways zero a this is GMT
  210. ;
  211.             EXPORT    time_timetoordinals
  212. time_timetoordinals
  213.             STMFD    sp!, {r0-r4, lr}
  214.             SUB    sp, sp, #8+ost_size
  215.             MOV    r3, r1
  216.             MOV    r1, sp
  217.             BL    time_32to40
  218.             MOV    r0, sp
  219.             BL    time_tolocal40
  220.             MOV    r0, #-1
  221.             ADD    r2, sp, #8
  222.             SWI    XTerritory_ConvertTimeToOrdinals
  223.  
  224.             LDR    r0, [r2, #ost_sec]
  225.             STR    r0, [r3, #tm_sec]
  226.             LDR    r0, [r2, #ost_min]
  227.             STR    r0, [r3, #tm_min]
  228.             LDR    r0, [r2, #ost_hour]
  229.             STR    r0, [r3, #tm_hour]
  230.             LDR    r0, [r2, #ost_day]
  231.             STR    r0, [r3, #tm_day]
  232.             LDR    r0, [r2, #ost_month]
  233.             SUB    r0, r0, #1
  234.             STR    r0, [r3, #tm_month]
  235.             LDR    r0, [r2, #ost_year]
  236.             LDR    r1, =1900
  237.             SUB    r0, r0, r1
  238.             STR    r0, [r3, #tm_year]
  239.             LDR    r0, [r2, #ost_wday]
  240.             STR    r0, [r3, #tm_wday]
  241.             LDR    r0, [r2, #ost_yday]
  242.             STR    r0, [r3, #tm_yday]
  243.             MOV    r0, #0
  244.             STR    r0, [r3, #tm_dst]
  245.             ADD    sp, sp, #8+ost_size
  246.             LDMFD    sp!, {r0-r4, pc}^
  247.  
  248.  
  249. ; -------------------------------------------------------------------------
  250. ; Convert ordinals to time
  251. ;
  252. ;On entry:
  253. ;  R0 = pointer to ANSI-C tm struture <time.h>
  254. ;On exit:
  255. ;  R0 = time
  256. ;
  257.             EXPORT    time_ordinalstotime
  258. time_ordinalstotime
  259.             STMFD    sp!, {r1-r3, lr}
  260.             SUB    sp, sp, #8+ost_size
  261.             ADD    r2, sp, #8
  262.             MOV    r1, #0
  263.             STR    r1, [r2, #ost_csec]
  264.             LDR    r1, [r0, #tm_sec]
  265.             STR    r1, [r2, #ost_sec]
  266.             LDR    r1, [r0, #tm_min]
  267.             STR    r1, [r2, #ost_min]
  268.             LDR    r1, [r0, #tm_hour]
  269.             STR    r1, [r2, #ost_hour]
  270.             LDR    r1, [r0, #tm_day]
  271.             STR    r1, [r2, #ost_day]
  272.             LDR    r1, [r0, #tm_month]
  273.             ADD    r1, r1, #1
  274.             STR    r1, [r2, #ost_month]
  275.             LDR    r1, [r0, #tm_year]
  276.             LDR    r3, =1900
  277.             ADD    r1, r1, r3
  278.             STR    r1, [r2, #ost_year]
  279.             LDR    r1, [r0, #tm_wday]
  280.             STR    r1, [r2, #ost_wday]
  281.             LDR    r1, [r0, #tm_yday]
  282.             STR    r1, [r2, #ost_yday]
  283.             MOV    r0, #-1
  284.             MOV    r1, sp
  285.             SWI    XTerritory_ConvertOrdinalsToTime
  286.             MOV    r0, sp
  287.             BL    time_togmt40
  288.             BL    time_40to32
  289.             ADD    sp, sp, #8+ost_size
  290.             LDMFD    sp!, {r1-r3, pc}^
  291.  
  292.  
  293.  
  294. ; -------------------------------------------------------------------------
  295. ; Convert 40 bit from local time to gmt
  296. ;
  297. ;On entry:
  298. ;  R0 = pointer to ANSI-C tm struture <time.h>
  299. ;On exit:
  300. ;  -
  301. ;
  302. time_togmt40
  303.             STMFD    sp!, {r0-r2, lr}
  304.             MOV    r2, r0
  305.             SWI    XTerritory_ReadCurrentTimeZone
  306.             LDR    r0, [r2, #0]
  307.             ADDS    r0, r0, r1
  308.             STR    r0, [r2, #0]
  309.             LDRB    r0, [r2, #4]
  310.             ADC    r0, r0, r1, ASR #31
  311.             STRB    r0, [r2, #4]
  312.             LDMFD    sp!, {r0-r2, pc}^
  313.  
  314.  
  315. ; -------------------------------------------------------------------------
  316. ; Convert 40 bit from gmt to local time
  317. ;
  318. ;On entry:
  319. ;  R0 = pointer to ANSI-C tm struture <time.h>
  320. ;On exit:
  321. ;  -
  322. ;
  323. time_tolocal40
  324.             STMFD    sp!, {r0-r2, lr}
  325.             MOV    r2, r0
  326.             SWI    XTerritory_ReadCurrentTimeZone
  327.             LDR    r0, [r2, #0]
  328.             SUBS    r0, r0, r1
  329.             STR    r0, [r2, #0]
  330.             LDRB    r0, [r2, #4]
  331.             SBC    r0, r0, r1, ASR #31
  332.             STRB    r0, [r2, #4]
  333.             LDMFD    sp!, {r0-r2, pc}^
  334.  
  335.  END
  336.