# HG changeset patch # User boisy # Date 1091452743 0 # Node ID 96c2b4a934839b2de332451a83cd67822946b58c # Parent a4d7f06d1797c09ca59708ab81f246c8fe4208d3 Robert's reorganized clock2.asm, with each clock supported in alphabetical order diff -r a4d7f06d1797 -r 96c2b4a93483 level1/modules/clock2.asm --- a/level1/modules/clock2.asm Sun Aug 01 18:51:38 2004 +0000 +++ b/level1/modules/clock2.asm Mon Aug 02 13:19:03 2004 +0000 @@ -3,17 +3,47 @@ * * $Id$ * +* +* RTC Specific Notes: +* +* Dallas Semiconductor DS1216 SmartWatch +* +* Wakeup sequence $C5 3A A3 5C C5 3A A3 5C +* +* Time byte sequence in Binary Coded Decimal +* +* byte bit 7 6 5 4 3 2 1 0 +* 0 | 0.1 sec MSB | 0.1 sec LSB | +* 1 | 0 | 10 sec | seconds | +* 2 | 0 | 10 min | minutes | +* 3 |12/24| 0 | AM/PM | HR | Hour | +* | 10 HR | Hour | +* 0=12, 1=24 0=AM, 1=PM +* 4 | 0 | 0 | OSC |RESET| 0 | Weekday | +* 5 | 0 | 0 | 10 Date | Date | +* 6 | 0 | 0 | 0 |10 Month| Month | +* 7 | 10 Year | Year | +* +* OSC = 1; turns off clock to save battery. RESET not used in Coco circuit. +* +* When inserted in external ROM socket, the clock is addressed at: +* $C000 bit = 0 +* $C001 bit = 1 +* $C004 read byte to wakeup then send wakeup sequence to bit toggles. +* Then either read or send time. +* +* * Edt/Rev YYYY/MM/DD Modified by * Comment * ------------------------------------------------------------------ * 1 2003/08/18 Boisy G. Pitre * Stripped from clock.asm in order to modularize clocks. * -* 2004/7/13 Robert Gault +* 2004/07/13 Robert Gault * Added Vavasour/Collyer emulator & MESS (Disto) versions and relocated * 'GetTime equ' statement so it is not within a chip heading. * -* 2004/7/28 Robert Gault +* 2004/07/28 Robert Gault * Complete rewrite of SmartWatch segment which would never have worked. * See previous versions for old code if desired. Routine now will search * through all MPI slots to find clock and accept either AM/PM or military @@ -22,12 +52,15 @@ * Initialization routine contains code that bypasses OS-9 system calls to * acquire needed low RAM that can't become ROM. This type of code is not * recommended in most cases but nothing else was usable. -* 2004/7/31 Robert Gault +* 2004/07/31 Robert Gault * Added a settime routine and changed "no clock found" routine. If the * clock is not found, the D.Time entries are cleared but no message is sent. * Date -t will never get passed one minute. -* 2004/7/31 Rodney Hamilton +* 2004/07/31 Rodney Hamilton * Improved RTCJVEmu code, conditionalized RTC type comments. +* 2004/08/2 Robert Gault +* Alphabetized all clock listings so things can be found much more easily. +* Placed list of clock types at beginning of source for record keeping. nam Clock2 ttl Real-Time Clock Subroutines @@ -36,31 +69,20 @@ use defsfile endc -* +*--------------------------------------------------------------------------- * Setup for specific RTC chip * - IFNE RTCJVEmu -RTC.Base equ $FFC0 - ENDC - - IFNE RTCMESSEmu -RTC.Base equ $FF50 - ENDC - - IFNE RTCDriveWire -RTC.Base equ $0000 - ENDC - - IFNE RTCElim -RTC.Sped equ $20 32.768 KHz, rate=0 -RTC.Strt equ $06 binary, 24 Hour, DST disabled -RTC.Stop equ $86 bit 7 set stops clock to allow setting time -RTC.Base equ $FF72 I don't know base for this chip. - ENDC - - IFNE RTCDsto2+RTCDsto4 -RTC.Base equ $FF50 Base address of clock - ENDC +* CHIP TYPES INCLUDED: +* +* RTCBB+RTCCloud9 +* RTCDriveWire +* RTCDsto2+RTCDsto4 +* RTCElim +* RTCHarrs +* RTCJVEmu +* RTCMESSEmu +* RTCSmart +* RTCSoft IFNE RTCBB+RTCCloud9 IFNE RTCBB @@ -73,12 +95,39 @@ RTC.Read equ 0 Read data from this offset ENDC + IFNE RTCDriveWire +RTC.Base equ $0000 + ENDC + + IFNE RTCDsto2+RTCDsto4 +RTC.Base equ $FF50 Base address of clock + ENDC + + IFNE RTCElim +RTC.Sped equ $20 32.768 KHz, rate=0 +RTC.Strt equ $06 binary, 24 Hour, DST disabled +RTC.Stop equ $86 bit 7 set stops clock to allow setting time +RTC.Base equ $FF72 I don't know base for this chip. + ENDC + + IFNE RTCHarrs +RTC.Base equ $FF60 Base address for clock + ENDC + + IFNE RTCJVEmu +RTC.Base equ $FFC0 + ENDC + + IFNE RTCMESSEmu +RTC.Base equ $FF50 + ENDC + IFNE RTCSmart RTC.Base equ $C000 clock mapped to $C000-$DFFF; $FFA6 MMU slot RTC.Zero equ 0 Send zero bit RTC.One equ 1 Send ones bit RTC.Read equ 4 -*D.SWPage equ $1F on system DP +*D.SWPage on system DP; Refer to os9defs. D.RTCSlt equ 0 on SmartWatch ?data? page D.RTCFlg equ 1 on SW page D.RTCMod equ 2 @@ -86,10 +135,6 @@ D.Start equ 4 on SW page, code starts here ENDC - IFNE RTCHarrs -RTC.Base equ $FF60 Base address for clock - ENDC - IFNE RTCSoft RTC.Base equ 0 Have to have one defined. ENDC @@ -119,7 +164,7 @@ nop lbra SetTime -* +*-------------------------------------------------------------------------- * GetTime Subroutine * * This subroutine is called by the main clock module. @@ -127,125 +172,129 @@ GetTime equ * - IFNE RTCJVEmu -* -* Vavasour / Collyer Emulator (ignores MPI slot) + IFNE RTCBB+RTCCloud9 * - ldx #RTC.Base - ldd ,x get year (CCYY) - suba #20 - bmi yr1 19xx, OK as is -yr0 addb #100 20xx adjustment - deca also check for - bpl yr0 21xx (optional) -yr1 stb xx70 then its 19xx - bhi not20 - adda #100 - sta -1,y -not20 bsr getval month - bsr getval day - lda #7 AM/PM mask - stb 1,x - anda ,x - bitb #4 - pshs cc - anda #3 - bsr getval1 - puls cc - beq AM - lda #12 convert to 24hr time as it is PM - adda -1,y - sta -1,y -AM bsr getval minute -* and now fall through into get second -getval lda #$0f - stb 1,x - anda ,x -getval1 decb - pshs b - ldb #10 - mul - stb ,y - puls b - stb 1,x - decb - lda ,x - anda #$0f - adda ,y - sta ,y+ -* rts fall thru to Setime/Init rts - ENDC + pshs u,y,cc + leay ReadBCD,pcr Read bytes of clock + +TfrTime orcc #IntMasks turn off interrupts + ldu M$Mem,pcr Get base address + + IFNE MPIFlag + ldb >MPI.Slct Select slot + pshs b + andb #$F0 + orb SlotSlct,pcr + stb >MPI.Slct + ENDC + + lbsr SendMsg Initialize clock + ldx #D.Sec + ldb #8 Tfr 8 bytes + +tfrloop jsr ,y Tfr 1 byte + + bitb #$03 + beq skipstuf Skip over day-of-week, etc. + leax -1,x +skipstuf decb + bne tfrloop + + IFNE MPIFlag + puls b + stb >MPI.Slct restore MPAK slot + ENDC + + puls u,y,cc,pc + +ClkMsg fcb $C5,$3A,$A3,$5C,$C5,$3A,$A3,$5C +* Enable clock with message $C53AA35CC53AA35C +SendMsg lda RTC.Read,u Send Initialization message to clock + leax MPI.Slct Select slot - pshs b - andb #$F0 - orb SlotSlct,pcr - stb >MPI.Slct - ENDC - - lbsr SendMsg Initialize clock - ldx #D.Sec - ldb #8 Tfr 8 bytes - -tfrloop jsr ,y Tfr 1 byte - - bitb #$03 - beq skipstuf Skip over day-of-week, etc. - leax -1,x -skipstuf decb - bne tfrloop - - IFNE MPIFlag - puls b - stb >MPI.Slct restore MPAK slot - ENDC - - puls u,y,cc,pc - -ClkMsg fcb $C5,$3A,$A3,$5C,$C5,$3A,$A3,$5C -* Enable clock with message $C53AA35CC53AA35C -SendMsg lda RTC.Read,u Send Initialization message to clock - leax D.Start+alrtend-reloc,y point to end of wakeup code - lda ,-x get D.Time data and store it - ldb #4 convert tenths sec, sec, min, hours - lbsr binbcd to binary coded decimal - IFGT Level-1 - lda D.Daywk - ELSE - clra - ENDC - sta ,y+ set day of week if present - lda ,x - ldb #3 convert day of month, month, year - bsr binbcd to BCD - jsr >D.Start,u send data to clock - lbra exit - -mem_mes fcc /There is no system memory for/ - fcb $0a - fcc /the SmartWatch. Please reduce/ - fcb $0a - fcc /os9boot size or use soft clock./ - fcb $0d - -Read pshs cc,d,x,y,u - orcc #$50 - lda D.SWPage - clrb - tfr d,u point to working space - lda $FF7F - pshs a - lda D.RTCSlt,u info for MPI slot - sta $FF7F - clr D.RTCMod,u set for read time - jsr D.Start,u jsr to it - lbra exit + ldx M$Mem,pcr get RTC base address from fake memory requirement + ldb #$0A UIP status register address + stb ,x generate address strobe + lda 1,x get UIP status + bpl NoUIP Update In Progress, go shift next RTC read + lda #TkPerSec/2 set up next RTC read attempt in 1/2 second + sta xx70 then its 19xx + bhi not20 + adda #100 + sta -1,y +not20 bsr getval month + bsr getval day + lda #7 AM/PM mask + stb 1,x + anda ,x + bitb #4 + pshs cc + anda #3 + bsr getval1 + puls cc + beq AM + lda #12 convert to 24hr time as it is PM + adda -1,y + sta -1,y +AM bsr getval minute +* and now fall through into get second +getval lda #$0f + stb 1,x + anda ,x +getval1 decb + pshs b + ldb #10 + mul + stb ,y + puls b + stb 1,x + decb + lda ,x + anda #$0f + adda ,y + sta ,y+ +* rts fall thru to Setime/Init rts + ENDC + + IFNE RTCSmart +* +* Update time from Smartwatch RTC +* + + pshs cc,d,x,y,u + orcc #$50 + lda D.SWPage + clrb + tfr d,u point to working space + lda $FF7F + pshs a + lda D.RTCSlt,u info for MPI slot + sta $FF7F + clr D.RTCMod,u set for read time + jsr D.Start,u jsr to it + lbra exit + ENDC + IFNE RTCSoft * * @@ -798,6 +627,111 @@ months fcb 31,28,31,30,31,30,31,31,30,31,30,31 Days in each month ENDC + +*-------------------------------------------------------------------------- +* SetTime Subroutine +* +* This subroutine is called by the main clock module. +* + +SetTime equ * + + IFNE RTCBB+RTCCloud9 +* +* Set B&B RTC from Time variables +* + pshs u,y,cc + leay SendBCD,pcr Send bytes of clock + lbra TfrTime + ENDC + + IFNE RTCDsto2 +* +* Set Disto 2-in-1 RTC from Time variables +* + pshs a,cc + lbsr RTCPre Initialize + + bsr SetVal Set Year + bsr SetVal Set Month + bsr SetVal Set Day + ldd #$0805 $08 in A, $05 in B + bsr SetVal1 Set Hour (OR value in A ($08) with hour) + bsr SetVal Set Minute + bsr SetVal Set Second + + lbra RTCPost Clean up + return + +SetVal clra +SetVal1 stb 2,x Set Clock address + decb + pshs b + ldb ,y+ Get current value +DvLoop subb #10 Get Tens digit in A, ones digit in B + bcs DvDone + inca + bra DvLoop +DvDone addb #10 + sta ,x Store tens digit + tfr b,a + puls b Get back original clock address + stb 2,x + decb + sta ,x Store ones digit + rts + ENDC + + IFNE RTCDsto4 +* +* Set Disto 4-in-1 RTC from Time variables +* + pshs cc + orcc #IntMasks + + IFNE MPIFlag + ldb >MPI.Slct Save currently selected MPak slot + pshs b + andb #$F0 + orb >SlotSlct,pcr Get slot to select + stb >MPI.Slct Select MPak slot for clock + ENDC + + ldy #D.Time+6 + ldx M$Mem,pcr + clrb + bsr SetVal Set Second + bsr SetVal Set Minute + bsr SetVal Set Hour + bsr SetVal Set Day + bsr SetVal Set Month + bsr SetVal Set Year + + IFNE MPIFlag + puls b Restore old MPAK slot + stb >MPI.Slct + ENDC + + puls cc + clrb No error + rts + +SetVal clr ,-s Create variable for tens digit + lda ,-y Get current value +DvLoop suba #10 Get Tens digit on stack, ones digit in A + bcs DvDone + inc ,s + bra DvLoop +DvDone adda #10 + stb 1,x Set Clock address + incb + sta ,x Store ones digit + stb 1,x + incb + puls a + sta ,x Store tens digit + rts + ENDC + IFNE RTCElim * * Set Eliminator RTC from D.Time @@ -927,105 +861,8 @@ os9 F$SRtMem comb set Carry for error puls b,pc recover error code, return... - ENDC - ENDC - - IFNE RTCDsto2 -* -* Set Disto 2-in-1 RTC from Time variables -* - pshs a,cc - lbsr RTCPre Initialize - - bsr SetVal Set Year - bsr SetVal Set Month - bsr SetVal Set Day - ldd #$0805 $08 in A, $05 in B - bsr SetVal1 Set Hour (OR value in A ($08) with hour) - bsr SetVal Set Minute - bsr SetVal Set Second - - lbra RTCPost Clean up + return - -SetVal clra -SetVal1 stb 2,x Set Clock address - decb - pshs b - ldb ,y+ Get current value -DvLoop subb #10 Get Tens digit in A, ones digit in B - bcs DvDone - inca - bra DvLoop -DvDone addb #10 - sta ,x Store tens digit - tfr b,a - puls b Get back original clock address - stb 2,x - decb - sta ,x Store ones digit - rts - ENDC - - IFNE RTCDsto4 -* -* Set Disto 4-in-1 RTC from Time variables -* - pshs cc - orcc #IntMasks - - IFNE MPIFlag - ldb >MPI.Slct Save currently selected MPak slot - pshs b - andb #$F0 - orb >SlotSlct,pcr Get slot to select - stb >MPI.Slct Select MPak slot for clock - ENDC - - ldy #D.Time+6 - ldx M$Mem,pcr - clrb - bsr SetVal Set Second - bsr SetVal Set Minute - bsr SetVal Set Hour - bsr SetVal Set Day - bsr SetVal Set Month - bsr SetVal Set Year - - IFNE MPIFlag - puls b Restore old MPAK slot - stb >MPI.Slct - ENDC - - puls cc - clrb No error - rts - -SetVal clr ,-s Create variable for tens digit - lda ,-y Get current value -DvLoop suba #10 Get Tens digit on stack, ones digit in A - bcs DvDone - inc ,s - bra DvLoop -DvDone adda #10 - stb 1,x Set Clock address - incb - sta ,x Store ones digit - stb 1,x - incb - puls a - sta ,x Store tens digit - rts - ENDC - - IFNE RTCBB+RTCCloud9 -* -* Set B&B RTC from Time variables -* - pshs u,y,cc - leay SendBCD,pcr Send bytes of clock - lbra TfrTime - ENDC + ENDC IFNE RTCHarrs * @@ -1059,11 +896,210 @@ puls cc,pc Re-enable interrupts ENDC + IFNE RTCSmart +* +* Update time from Smartwatch RTC +* +* This set time routine forces military time. It can't turn off clock but can +* be used as a timer if time set to 0:0:0 hr:min:sec + pshs cc,d,x,y,u + orcc #$50 + lda D.SWPage + clrb + tfr d,u point to working space + lda $FF7F + pshs a + lda D.RTCSlt,u info for MPI slot + sta $FF7F + lda #-1 + sta D.RTCMod,u indicate set time rather than read + IFGT Level-1 + ldx #D.Slice + ELSE + ldx #D.TSec + ENDC + tfr u,y get location of safe region + leay >D.Start+alrtend-reloc,y point to end of wakeup code + lda ,-x get D.Time data and store it + ldb #4 convert tenths sec, sec, min, hours + bsr binbcd to binary coded decimal + IFGT Level-1 + lda D.Daywk + ELSE + clra + ENDC + sta ,y+ set day of week if present + lda ,x + ldb #3 convert day of month, month, year + bsr binbcd to BCD + jsr >D.Start,u send data to clock + lbra exit + +binbcd pshs b +bcd3 clrb +bcd1 cmpa #10 + bcs bcd2 + addd #$f610 decrease bin regA by 10 add bcd $10 to regB + bra bcd1 +bcd2 pshs a + addb ,s+ add in remainder; BCD = binary when less than 10 + stb ,y+ place in message to clock + lda ,-x get next byte of D.Time + dec ,s decrease counter + bne bcd3 + puls b,pc -* +* This becomes D.Start +reloc equ * + IFGT Level-1 + lda D.HINIT + anda #$CC + sta $FF90 + ENDC + ldb $FFA6 choose to use normal location + pshs b + ldb #$3E + stb $FFA6 reset MMU for clock + sta $FFDE + ldd #RTC.Base + tfr a,dp DP now points to clock + tst D.RTCMod,u are we reading the clock or setting it? + beq findclk go if reading + lbsr wakeup we are setting a found clock + lbra found +findclk lda #-1 + sta alrtend,pcr + lbsr wakeup wakeup the clock + ldx #D.Sec one incoming byte dropped + lda #8 bytes to get + pshs a +L0050 ldb #8 bits to get +L0052 lsr