home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum16.lzh / HARDWARE / CT68020 / CLOCK / mc68230clk.a < prev    next >
Text File  |  1991-01-28  |  8KB  |  334 lines

  1.  nam clock
  2.  ttl Motorola MC68230 Clock Module with RTC72421 for ct68020 IORAM
  3.  
  4. * -----------------------------------------------------------------
  5. * Edition History
  6.  
  7. *  #    Date      Comments                                      By
  8. * -- -------- ------------------------------------------------ ---
  9. * 06 86/11/18 upgraded to version 2.0                           SMS
  10. *             <<<---- OS-9/68000 V2.0 Release ---->>>
  11. * 07 87/03/23 Changed module attr to Supervisor State process   wwb
  12. *             <<<---- OS-9/68000 V2.1 Release ---->>>
  13. * 08 91/01/17 Changed to mc68230-PIT                            ggz
  14. *
  15. Edition    equ    8    current edition number
  16.  
  17. Typ_Lang    set    (Systm<<8)+Objct    System Object module
  18. Rev    equ    1
  19. Attr_Rev    set    ((ReEnt+SupStat)<<8)+Rev    Attributes and Revision
  20.  
  21.     psect    Clock,Typ_Lang,Attr_Rev,Edition,0,ClkEnt
  22.  
  23.     use    .../defs/oskdefs.d
  24.     use    .../defs/systype.d
  25.  
  26.     opt    l
  27.     ttl definitions
  28.     pag
  29. * -----------------------------------------------------------------
  30. * definitions for the motorola mc68230 PIT
  31. * -----------------------------------------------------------------
  32.  
  33. PITmult    equ    2
  34.  
  35. TCR    equ    $10*PITmult
  36. TIVR    equ    $11*PITmult
  37. TCPR    equ    $12*PITmult
  38. TCPRH    equ    $13*PITmult
  39. TCPRM    equ    $14*PITmult
  40. TCPRL    equ    $15*PITmult
  41. TCNTR    equ    $16*PITmult
  42. TCNTRH    equ    $17*PITmult
  43. TCNTRM    equ    $18*PITmult
  44. TCNTRL    equ    $19*PITmult
  45. TSR    equ    $1a*PITmult
  46.  
  47. * -----------------------------------------------------------------
  48. *    equates for RTC 72421 used on ct68020
  49. *    defines mnemonics for register-offsets
  50. * -----------------------------------------------------------------
  51.  
  52. rtcbase    equ    $1000    * base offset to PIT
  53. rtcmult    equ    2    * rtc-multiplicator for offsets
  54.  
  55. * equates for 'time' counters
  56. S1    equ    0*rtcmult+rtcbase    * seconds low  (0-9)
  57. S10    equ    1*rtcmult+rtcbase    * seconds high (0-5)
  58. MI1    equ    2*rtcmult+rtcbase    * minutes low  (0-9)
  59. MI10    equ    3*rtcmult+rtcbase    * minutes high (0-5)
  60. H1    equ    4*rtcmult+rtcbase    * hours low    (0-9)
  61. H10    equ    5*rtcmult+rtcbase    * hours high
  62.  
  63. * equates for 'date' counters
  64. DA1    equ    6*rtcmult+rtcbase    * day low      (0-9)
  65. DA10    equ    7*rtcmult+rtcbase    * day high     (0-3)
  66. MO1    equ    8*rtcmult+rtcbase    * month low    (0-9)
  67. MO10    equ    9*rtcmult+rtcbase    * month high   (0-1)
  68. Y1    equ    10*rtcmult+rtcbase    * year low     (0-9)
  69. Y10    equ    11*rtcmult+rtcbase    * year high
  70.  
  71. * equate for 'day of week' counter
  72. W    equ    12*rtcmult+rtcbase    * day of week (0-6)
  73.  
  74. * equate for 'reset' counter ( in 'write' access )
  75. CRESD    equ    13*rtcmult+rtcbase        * 
  76. CRESE    equ    14*rtcmult+rtcbase        * 
  77. CRESF    equ    15*rtcmult+rtcbase        * 
  78.  
  79. * initialize for 10 ms intervals
  80. * PIT address and counter value
  81. *
  82. tck1    equ    (80000/32)-1    * number mpu cycles per tick
  83. TicksSec    equ    100    number of ticks per second
  84. *ClkVect set 30 clock vector number (level 6 autovector)
  85. *ClkPrior set 1 high polling table priority
  86.  
  87. PITtmode    equ    $a0    * vectored interrupt, periodic timer
  88.  ttl Clock Initialization
  89.  pag
  90. * -----------------------------------------------------------------
  91. * Subroutine ClkEntry
  92. * Clock initialization entry point.  If the month specified
  93. * in the caller's register is zero, the system time and date
  94. * is set from the clock/calendar chip.  Otherwise, the chip is
  95. * updated from caller's data.
  96.  
  97. * Passed: (a4)=current process descriptor
  98. *    (a5)=caller's registers ptr
  99. *    R$d0.l(a5)=Time (00hhmmss)
  100. *    R$d1.l(a5)=Date (yyyymmdd)
  101. *    (a6)=system global ptr
  102. *    (D_date information has already been set)
  103. * Returns: cc=carry set, d1.w=error code if error
  104.  
  105. ClkEnt:
  106.     movea.l    #ClkPort,a3    get the timer address
  107.     tst.w    D_TckSec(a6)    is clock already running?
  108.     bne.s    ClkEnt10    skip clock init if so
  109.     move.w    #TicksSec,D_TckSec(a6)    set systems tick rate
  110.     move.b    #TicksSec,D_Tick(a6)    set tick = ticks/sec
  111.     moveq.l    #ClkVect,d0    get vector number
  112.     moveq.l    #ClkPrior,d1    get priority
  113.     lea    ClkSrv(pc),a0    get address of service routine
  114.     OS9    F$IRQ    put clock on polling table
  115.     bcs    ClkEnt99    abort if error 
  116.  
  117. *    moveq.l    #30,d0    * auto-vector level 6
  118. *    moveq.l    #99,d1    * low priority for save
  119. *    lea    ClkSrva(pc),a0    get address of service routine
  120. *    OS9    F$IRQ    put clock on polling table
  121. *    bcs    ClkEnt99    abort if error 
  122.  
  123.     move.b    #ClkVect,TIVR(a3)    * set vector number
  124.     lea    TCPR(a3),a0
  125.     move.l    #tck1,d1
  126.     movep.l    d1,(a0)
  127.     move.b    #PITtmode,TCR(a3)    * set timer mode
  128.  
  129. ClkEnt10:
  130.     movem.l    R$d0(a5),d0-d1    get time/date
  131.     tst.l    d0    * if zero = then set from RTC
  132.     bne    ClkEnt20    else get value and set the RTC
  133. * d6.l =Time (00hhmmss)
  134. * d7.l =Date (yyyymmdd)
  135.     bsr    rtcgetdate
  136.     bsr    rtcgettime
  137.     move.l    d6,d0
  138.     move.l    d7,d1
  139.     bra.s    ClkEnt80
  140.  
  141. ClkEnt20:    movem.l    d0-d1,-(a7)    save time/date
  142.     move.l    d0,d6
  143.     move.l    d1,d7  * saving
  144.     bsr    rtcinit
  145.     bsr    rtcputdate
  146.     bsr    rtcputtime
  147.     movem.l    (a7)+,d0-d1    restore time/date
  148.  
  149. ClkEnt80
  150.     move.l    d1,D_Year(a6)    set system gregorian date
  151.     OS9    F$Julian    convert to julian date
  152.     move.l    d1,D_Julian(a6)    set julian date
  153.     neg.l    d0
  154.     add.l    #24*60*60,d0    convert to seconds until midnight
  155.     move.l    d0,D_Second(a6)    set julian time
  156.     addq.l    #2,d1    adjust julian date for 0=Sunday to 6=Saturday
  157.     divu    #7*256,d1    find day of week
  158. * start of ed.8
  159.     clr.w    d1    clear the quotient
  160.     swap    d1    get the remainder
  161.     divu    #7,d1    do the modulo now
  162.     clr.w    d1    clear the quotient
  163.     swap    d1    get the remainder
  164. * end ed.8
  165.     addq.l    #1,d1    adjust for clock chip
  166. * move.b    d1,Day(a3)    set clock chip day of week
  167. *
  168. * now run
  169.     bset.b    #0,TCR(a3)    enable timer to operate 
  170. *
  171. ClkEnt99 rts 
  172.     ttl mc68230 timer interrupt service routine
  173.     pag
  174. * -----------------------------------------------------------------
  175. * Clock interrupt service routine
  176.  
  177. * Passed: (a2)=global static pointer
  178. *         (a3)=port address
  179. *         (a6)=system global data pointer
  180. ClkSrv:
  181.     btst.b    #0,TSR(a3)    * causing IRQ?
  182. *    beq.s    NotClk
  183.     move.b    #1,TSR(a3)    * clear interrupt
  184.     movea.l    D_Clock(a6),a0    * jump to system clock routine
  185.     jmp (a0)
  186.     rts
  187.  
  188. NotClk    ori    #Carry,ccr    return carry set
  189.     rts
  190.  
  191. ClkSrva:
  192.     btst.b    #0,TSR(a3)    * causing IRQ?
  193.     beq.s    NotClk
  194.     move.b    #-1,TSR(a3)    * clear interrupt
  195.     movea.l    D_Clock(a6),a0    * jump to system clock routine
  196.     jmp (a0)
  197.     rts
  198. * -----------------------------------------------------------------
  199.     ttl RTC72421 routinen
  200.     pag
  201. * -------------------------------------------------------------------------
  202. * d6.l =Time (00hhmmss)
  203. * d7.l =Date (yyyymmdd)
  204. * now make date
  205. rtcgetdate
  206.     move.w    #1900,d7    * years are based 1900
  207.     move.b    Y1(a3),d0
  208.     andi.l    #$f,d0
  209.     move.b    Y10(a3),d1
  210.     andi.l    #$f,d1
  211.     mulu    #10,d1
  212.     add.l    d1,d0
  213.     add.w    d0,d7
  214.     lsl.l    #8,d7
  215.  
  216.     move.b    MO1(a3),d0
  217.     andi.l    #$f,d0
  218.     move.b    MO10(a3),d1
  219.     andi.l    #$f,d1
  220.     mulu    #10,d1
  221.     add.l    d1,d0
  222.     add.w    d0,d7
  223.     lsl.l    #8,d7
  224.     
  225.     move.b    DA1(a3),d0
  226.     andi.l    #$f,d0
  227.     move.b    DA10(a3),d1
  228.     andi.l    #$f,d1
  229.     mulu    #10,d1
  230.     add.l    d1,d0
  231.     add.w    d0,d7
  232.     rts
  233. * this was date
  234.  
  235. * -------------------------------------------------------------------------
  236.  
  237. rtcgettime
  238.     moveq    #0,d6    * sweep reg
  239.  
  240.     move.b    H1(a3),d0
  241.     andi.l    #$f,d0
  242.     move.b    H10(a3),d1
  243.     andi.l    #$3,d1    * nur 2 bit 10-er Std
  244.     mulu    #10,d1
  245.     add.l    d1,d0
  246.     add.w    d0,d6
  247.     lsl.l    #8,d6
  248.  
  249.     move.b    MI1(a3),d0
  250.     andi.l    #$f,d0
  251.     move.b    MI10(a3),d1
  252.     andi.l    #$f,d1
  253.     mulu    #10,d1
  254.     add.l    d1,d0
  255.     add.w    d0,d6
  256.     lsl.l    #8,d6
  257.  
  258.     move.b    S1(a3),d0
  259.     andi.l    #$f,d0
  260.     move.b    S10(a3),d1
  261.     andi.l    #$f,d1
  262.     mulu    #10,d1
  263.     add.l    d1,d0
  264.     add.w    d0,d6
  265.     rts
  266. * this was time
  267.  
  268. * -------------- rtc init ----------------------------------
  269. *
  270. rtcinit
  271. *    move.b    #$c,CRESE(a3)
  272. *    move.b    #4,CRESF(a3)
  273.     rts
  274.  
  275. * -------------------------------------------------------------------------
  276.  
  277. * d6.l =Time (00hhmmss)
  278. * d7.l =Date (yyyymmdd)
  279. rtcputtime
  280.     move.l    d6,d0
  281.     andi.l    #$ff,d0
  282.     divu.w    #10,d0
  283.     move.b    d0,S10(a3)
  284.     swap    d0
  285.     move.b    d0,S1(a3)
  286.     lsr.l    #8,d6
  287.  
  288.     move.l    d6,d0
  289.     andi.l    #$ff,d0
  290.     divu.w    #10,d0
  291.     move.b    d0,MI10(a3)
  292.     swap    d0
  293.     move.b    d0,MI1(a3)
  294.     lsr.l    #8,d6
  295.  
  296.     move.l    d6,d0
  297.     andi.l    #$ff,d0
  298.     divu.w    #10,d0
  299.     move.b    d0,H10(a3)
  300.     swap    d0
  301.     move.b    d0,H1(a3)
  302.     rts
  303. * -------------------------------------------------------------------------
  304. * d6.l =Time (00hhmmss)
  305. * d7.l =Date (yyyymmdd)
  306. rtcputdate
  307.     move.l    d7,d0
  308.     andi.l    #$ff,d0
  309.     divu.w    #10,d0
  310.     move.b    d0,DA10(a3)
  311.     swap    d0
  312.     move.b    d0,DA1(a3)
  313.     lsr.l    #8,d7
  314.  
  315.     move.l    d7,d0
  316.     andi.l    #$ff,d0
  317.     divu.w    #10,d0
  318.     move.b    d0,MO10(a3)
  319.     swap    d0
  320.     move.b    d0,MO1(a3)
  321.     lsr.l    #8,d7
  322.  
  323.     move.l    d7,d0
  324.     sub    #1900,d0
  325.     andi.l    #$ff,d0
  326.     divu.w    #10,d0
  327.     move.b    d0,Y10(a3)
  328.     swap    d0
  329.     move.b    d0,Y1(a3)
  330.     rts
  331. * -----------------------------------------------------------------
  332.     ends
  333.  
  334.