Mercurial > hg > Members > kono > nitros9-code
diff level2/modules/clock2_146818.asm @ 0:6641a883d6b0
Initial revision
author | boisy |
---|---|
date | Thu, 04 Apr 2002 16:34:12 +0000 |
parents | |
children | 02a8ba2b9092 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level2/modules/clock2_146818.asm Thu Apr 04 16:34:12 2002 +0000 @@ -0,0 +1,129 @@ +******************************************************************** +* Clock2 - Motorola 146818 clock driver +* +* $Id$ +* +* Ed. Comments Who YY/MM/DD +* ------------------------------------------------------------------ +* 1 Created BRI 88/10/06 +* 2 Shift D.Tick & exit if UIP (not wait up to +* 2228 uS for completion), general clean up BRI 88/11/17 +* 3 Re-wrote clock access to eliminate repeated +* subroutine calls to increase speed BRI 88/11/26 +* 4 Changed clock access to once per minute BRI 89/03/25 +* 5 More changes BRI 90/04/15 + + nam Clock2 + ttl Motorola 146818 clock driver + +edition equ 5 +MPISlot equ $33 (MPI Slot $00-$33) + + ifp1 + use defsfile + endc + +ClkAddr equ $FF72 clock base address +Vrsn equ 1 +SpeedClk equ $20 32.768 KHz, rate=0 +StartClk equ $06 binary, 24 Hour, DST disabled +StopClk equ $86 bit 7 set stops clock to allow setting t + +* MC146818/DS1287 clock register map: + org $00 +CRegSec rmb $01 seconds register +CRegSAl rmb $01 seconds alarm register +CRegMin rmb $01 minutes register +CRegMAl rmb $01 minutes alarm register +CRegHour rmb $01 hours register +CRegHAl rmb $01 hours alarm register +CRegDayW rmb $01 day of week register +CRegDayM rmb $01 day of month register +CRegMnth rmb $01 months register +CRegYear rmb $01 years register +CRegA rmb $01 bits 7-0: UIP (read only); DV2-DV0; RS3- +CRegB rmb $01 bits 7-0: SET; PIE; AIE; UIE; SQWE; DM; +CRegC rmb $01 bits 7-0: IRQF; PF; AF; UF; Unused3-Unus +CRegD rmb $01 bits 7-0: VRT; Unused6-Unused0 +CSRAM rmb $40-. CMOS static RAM + + mod CSize,CNam,Systm+Objct,ReEnt+Vrsn,Entry,ClkAddr + +CNam fcs "Clock2" + fcb edition +*RTCSlot fcb MPISlot + +Entry bra Init clock hardware initialization gets time + nop maintain 3 byte entry table spacing + bra GetTime get hardware time + nop save a couple cycles with short branch a +SetTime clrb no error for return... + pshs cc,d,x,y,u save regs which will be altered + ldx <M$Mem,pcr get clock base addr + leay <SetTable,pcr point [Y] to RTC register set table + ldu #D.Time point [U] to time variables in DP + ldb #(SetEnd-SetTable)/2 get loop count + stb R$B,s save counter to B reg on stack + orcc #IntMasks disable IRQs while setting clock +CSetLoop ldd ,y++ get clock set data + bmi CRegSet [A] Sign bit set, go save [B] to clock requirement + ldb b,u get system time from D.Time variables +CRegSet anda #^Sign clear sign bit + std ,x generate clock address strobe, store dat + dec R$B,s done all clock regs? + bne CSetLoop no, go do next... +L003A ldb #$01 + stb <$002E + puls cc,d,x,y,u,pc restore altered regs, return to caller + +SetTable equ * + fcb Sign+CRegB,StopClk + fcb Sign+CRegA,SpeedClk +GetTable equ * + fcb CRegYear,D.Year-D.Time + fcb CRegMnth,D.Month-D.Time + fcb CRegDayM,D.Day-D.Time + fcb CRegHour,D.Hour-D.Time + fcb CRegMin,D.Min-D.Time + fcb CRegSec,D.Sec-D.Time +GetEnd equ * + fcb Sign+CRegDayW,$01 + fcb Sign+CRegHAl,$00 + fcb Sign+CRegMAl,$00 + fcb Sign+CRegSAl,$00 + fcb Sign+CRegB,StartClk +SetEnd equ * + +Init ldb #59 last second in minute + stb <D.Sec force RTC read + +GetTime clrb no error for return... + pshs cc,d,x,y,u save regs which will be altered + ldb <D.Sec get current second + incb next... + cmpb #60 done minute? + bhs CGetT00 yes, go read RTC... + stb <D.Sec set new second + bra CGExit go clean up & return +CGetT00 ldx <M$Mem,pcr get clock base addr + lda #CRegA RTC Update In Progress status register + sta ,x generate address strobe + lda 1,x get UIP status + bmi L003A RTC Update In Progress (1:449 chance), go shft D.Ticki + leay <GetTable,pcr point [Y] to RTC "get" register info table + ldu #D.Time point [U] to time variables in DP + ldb #$06 + stb R$B,s save counter to B reg on stack +CGetLoop ldd ,y++ get clock register info from table + sta ,x generate clock address strobe + lda 1,x get clock data + sta b,u save data to D.Time variables + dec R$B,s done all D.Time vars? + bne CGetLoop no, go do next... +CGExit puls cc,d,x,y,u,pc recover regs, return to caller + + emod +CSize equ * + end + +