home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / internet / tcpip / src205 / TCPIP_Src / Misc / s / realtime < prev   
Encoding:
Text File  |  1995-02-26  |  7.8 KB  |  374 lines

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