Mercurial > hg > Members > kono > nitros9-code
changeset 1724:f389c6bca482
New clock2_*.asm files split from single clock2.asm for more source clarity
author | boisy |
---|---|
date | Fri, 20 Aug 2004 11:11:58 +0000 |
parents | 00d6e3a47987 |
children | 93328dc6e3f4 |
files | level1/modules/clock2_disto2.asm level1/modules/clock2_disto4.asm level1/modules/clock2_ds1315.asm level1/modules/clock2_elim.asm level1/modules/clock2_harris.asm level1/modules/clock2_jvemu.asm level1/modules/clock2_messemu.asm level1/modules/clock2_smart.asm level1/modules/clock2_soft.asm level1/modules/makefile |
diffstat | 10 files changed, 1427 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/clock2_disto2.asm Fri Aug 20 11:11:58 2004 +0000 @@ -0,0 +1,137 @@ +******************************************************************** +* Clock2 - Disto 2-N-1 RTC Driver +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 2004/08/18 Boisy G. Pitre +* Separated clock2 modules for source clarity. + + nam Clock2 + ttl Disto 2-N-1 RTC Driver + + ifp1 + use defsfile + endc + +tylg set Sbrtn+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + +RTC.Base equ $FF50 Base address of clock + + mod eom,name,tylg,atrv,JmpTable,RTC.Base + +name fcs "Clock2" + fcb edition + + IFNE MPIFlag +SlotSlct fcb MPI.Slot-1 Slot constant for MPI select code + ENDC + +JmpTable + rts RTC Init + nop + nop + bra GetTime RTC Get Time + nop + bra SetTime RTC Set Time + +GetTime pshs a,cc Save old interrupt status and mask IRQs + bsr RTCPre + + bsr GetVal Get Year + bsr GetVal Get Month + bsr GetVal Get Day + decb ldb #5 + stb 2,x + decb + lda ,x + anda #3 + bsr GetVal1 Get Hour + bsr GetVal Get Minute + bsr GetVal Get Second + +RTCPost clr >$FFD9 2 MHz (Really should check $A0 first) + puls cc,b + + IFNE MPIFlag + stb >MPI.Slct Restore saved "currently" selected MPak slot + ENDC + + clrb + rts + +RTCPre orcc #IntMasks + + IFNE MPIFlag + ldb >MPI.Slct Save currently selected MPak slot on stack + stb 3,s + andb #$F0 + orb >SlotSlct,pcr Get slot to select + stb >MPI.Slct Select MPak slot for clock + ENDC + + ldy #D.Time + ldx M$Mem,pcr + clr 1,x + ldb #12 + clr >$FFD8 1 MHz + rts + +GetVal stb 2,x + decb + lda ,x read tens digit from clock + anda #$0f +GetVal1 pshs b save b + ldb #10 + mul multiply by 10 to get value + stb ,y save 10s value + puls b set up clock for ones digit + stb 2,x + decb + lda ,x read ones digit from clock + anda #$0f + adda ,y add ones + tens + sta ,y+ store clock value into time packet + rts + + +SetTime 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 + + emod +eom equ * + end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/clock2_disto4.asm Fri Aug 20 11:11:58 2004 +0000 @@ -0,0 +1,152 @@ +******************************************************************** +* Clock2 - Disto 4-N-1 RTC Driver +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 2004/08/18 Boisy G. Pitre +* Separated clock2 modules for source clarity. + + nam Clock2 + ttl Disto 4-N-1 RTC Driver + + ifp1 + use defsfile + endc + +tylg set Sbrtn+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + +RTC.Base equ $FF50 Base address of clock + + mod eom,name,tylg,atrv,JmpTable,RTC.Base + +name fcs "Clock2" + fcb edition + + IFNE MPIFlag +SlotSlct fcb MPI.Slot-1 Slot constant for MPI select code + ENDC + +JmpTable + lbra Init + bra GetTime + nop + lbra SetTime + +GetTime equ * + IFNE MPIFlag + pshs cc Save old interrupt status and mask IRQs + orcc #IntMasks + ldb >MPI.Slct Save currently selected MPak slot on stack + pshs b + andb #$F0 + orb >SlotSlct,pcr Select MPak slot for clock + stb >MPI.Slct + ENDC + + ldx M$Mem,pcr + ldy #D.Time Start with seconds + + ldb #11 + bsr GetVal Get Year + bsr GetVal Get Month + bsr GetVal Get Day + lda #3 Mask tens digit of hour to remove AM/PM bit + bsr GetVal1 Get Hour + bsr GetVal Get Minute + bsr GetVal Get Second + + IFNE MPIFlag + puls b Restore saved "currently" selected MPak slot + stb >MPI.Slct + puls cc,pc Restore previous IRQ status + ELSE + rts No MPI, don't need to mess with slot, CC + ENDC + +GetVal lda #$0f Mask to apply to tens digit +GetVal1 stb 1,x + decb + anda ,x read ones digit from clock + pshs b save b + ldb #10 + mul multiply by 10 to get value + stb ,y Add to ones digit + puls b + stb 1,x + decb + lda ,x read tens digit from clock and mask it + anda #$0f + adda ,y + sta ,y+ + rts + + + +SetTime 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 + + +Init +* Disto 4-N-1 RTC specific initialization + ldx M$Mem,pcr + ldd #$010F Set mode for RTC chip + stb 1,x + sta ,x + ldd #$0504 + sta ,x + stb ,x + rts + + emod +eom equ * + end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/clock2_ds1315.asm Fri Aug 20 11:11:58 2004 +0000 @@ -0,0 +1,146 @@ +******************************************************************** +* Clock2 - Dallas Semiconductor DS1315 RTC Driver +* +* $Id$ +* +* The Burke & Burke HD Controller as well as Cloud-9's products +* use the DS1315. +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 2004/08/18 Boisy G. Pitre +* Separated clock2 modules for source clarity. + + nam Clock2 + ttl Dallas Semiconductor DS1315 RTC Driver + + ifp1 + use defsfile + endc + +tylg set Sbrtn+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + + IFNE BNB +RTC.Base equ $FF5C In SCS* Decode + ELSE +RTC.Base equ $FF7C Fully decoded RTC + ENDC +RTC.Zero equ -4 Send zero bit by writing this offset +RTC.One equ -3 Send one bit by writing this offset +RTC.Read equ 0 Read data from this offset + + + mod eom,name,tylg,atrv,JmpTable,RTC.Base + +name fcs "Clock2" + fcb edition + + IFNE MPIFlag +SlotSlct fcb MPI.Slot-1 Slot constant for MPI select code + ENDC + +JmpTable + rts + nop + nop + bra GetTime + nop + +SetTime pshs u,y,cc + leay SendBCD,pcr Send bytes of clock + bra TfrTime + +GetTime 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 <ClkMsg,pcr + ldb #8 +msgloop lda ,x+ + bsr SendByte + decb + bne msgloop + rts + +SendBCD pshs b Send byte to clock, first converting to BCD + bitb #$03 + bne BCDskip Send zero for day-of-week, etc. + lda #0 + bra SndBCDGo +BCDskip lda ,x +SndBCDGo tfr a,b + bra binenter +binloop adda #6 +binenter subb #10 + bhs binloop + puls b +SendByte coma Send one byte to clock + rora + bcc sendone +sendzero tst RTC.Zero,u + lsra + bcc sendone + bne sendzero + rts +sendone tst RTC.One,u + lsra + bcc sendone + bne sendzero + rts + +ReadBCD pshs b + ldb #$80 High bit will rotate out after we read 8 bits +readbit lda RTC.Read,u Read a bit + lsra + rorb Shift it into B + bcc readbit Stop when marker bit appears + tfr b,a + bra BCDEnter Convert BCD number to Binary +BCDLoop subb #6 by subtracting 6 for each $10 +BCDEnter suba #$10 + bhs BCDLoop + stb ,x + puls b,pc + + + + emod +eom equ * + end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/clock2_elim.asm Fri Aug 20 11:11:58 2004 +0000 @@ -0,0 +1,217 @@ +******************************************************************** +* Clock2 - Eliminator RTC Driver +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 2004/08/18 Boisy G. Pitre +* Separated clock2 modules for source clarity. + + nam Clock2 + ttl Eliminator RTC Driver + + ifp1 + use defsfile + endc + +tylg set Sbrtn+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + +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. + + mod eom,name,tylg,atrv,JmpTable,RTC.Base + +name fcs "Clock2" + fcb edition + +JmpTable + lbra Init + bra GetTime + nop + lbra SetTime + + +GetTime 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 <D.Tick save tick + bra UpdTExit and return + +NoUIP decb year register address + stb ,x generate address strobe + lda 1,x get year + sta <D.Year + decb month register address + stb ,x + lda 1,x + sta <D.Month + decb day of month register address + stb ,x + lda 1,x + sta <D.Day + ldb #4 hour register address + stb ,x + lda 1,x + sta <D.Hour + ldb #2 minute register address + stb ,x + lda 1,x + sta <D.Min + clrb second register address + stb ,x + lda 1,x +SaveSec sta <D.Sec +UpdTExit rts + + + +SetTime pshs cc save interrupt status + orcc #IntMasks disable IRQs + ldx M$Mem,pcr get RTC base address from fake memory requirement + ldy #D.Time point [Y] to time variables in DP + ldd #$0B*256+RTC.Stop + bsr UpdatCk0 stop clock before setting it + ldb #RTC.Sped + bsr UpdatCk0 set crystal speed, output rate + bsr UpdatClk go set year + bsr UpdatClk go set month + bsr UpdatClk go set day of month + bsr UpdatCk0 go set day of week (value doesn't matter) + bsr UpdatCk0 go set hours alarm (value doesn't matter) + bsr UpdatClk go set hour + bsr UpdatCk0 go set minutes alarm (value doesn't matter) + bsr UpdatClk go set minute + bsr UpdatCk0 go set seconds alarm (value doesn't matter) + bsr UpdatClk go set second + ldd #$0B*256+RTC.Strt + bsr UpdatCk0 go start clock + puls cc Recover IRQ status + clrb + rts + +UpdatClk ldb ,y+ get data from D.Time variables in DP +UpdatCk0 std ,x generate address strobe, save data + deca set [A] to next register down + rts + + IFGT Level-1 +* OS-9 Level Two code only (for now) +NewSvc fcb F$NVRAM Eliminator adds one new service call + fdb F.NVRAM-*-2 + fcb $80 end of service call installation table + +*------------------------------------------------------------ +* read/write RTC Non Volatile RAM (NVRAM) +* +* INPUT: [U] = pointer to caller's register stack +* R$A = access mode (1 = read, 2 = write, other = error) +* R$B = byte count (1 through 50 here, but in other implementations +* may be 1 through 256 where 0 implies 256) +* R$X = address of buffer in user map +* R$Y = start address in NVRAM +* +* OUTPUT: RTC NVRAM read/written +* +* ERROR OUTPUT: [CC] = Carry set +* [B] = error code +F.NVRAM tfr u,y copy caller's register stack pointer + ldd #$0100 ask for one page + os9 F$SRqMem + bcs NVR.Exit go report error... + pshs y,u save caller's stack and data buffer pointers + ldx R$Y,y get NVRAM start address + cmpx #50 too high? + bhs Arg.Err yes, go return error... + ldb R$B,y get NVRAM byte count + beq Arg.Err + abx check end address + cmpx #50 too high? + bhi Arg.Err yes, go return error... + lda R$A,y get direction flag + cmpa #WRITE. put caller's data into NVRAM? + bne ChkRead no, go check if read... + clra [D]=byte count + pshs d save it... + ldx <D.Proc get caller's process descriptor address + lda P$Task,x caller is source task + ldb <D.SysTsk system is destination task + ldx R$X,y get caller's source pointer + puls y recover byte count + os9 F$Move go MOVE data + bcs NVR.Err + ldy ,s get caller's register stack pointer from stack + lda R$Y+1,y get NVRAM start address + adda #$0E add offset to first RTC NVRAM address + ldb R$B,y get byte count + ldx M$Mem,pcr get clock base address from fake memory requirement + pshs cc,b save IRQ enable status and byte counter + orcc #IntMasks disable IRQs +WrNVR.Lp ldb ,u+ get caller's data + std ,x generate RTC address strobe and save data to NVRAM + inca next NVRAM address + dec 1,s done yet? + bne WrNVR.Lp no, go save another byte + puls cc,b recover IRQ enable status and clean up stack +NVR.RtM puls y,u recover register stack & data buffer pointers + ldd #$0100 return one page + os9 F$SRtMem +NVR.Exit rts + +Arg.Err ldb #E$IllArg Illegal Argument error + bra NVR.Err + +ChkRead cmpa #READ. return NVRAM data to caller? + bne Arg.Err illegal access mode, go return error... + lda R$Y+1,y get NVRAM start address + adda #$0E add offset to first RTC NVRAM address + ldx M$Mem,pcr get clock base address from fake memory requirement + pshs cc,b save IRQ enable status and byte counter + orcc #IntMasks disable IRQs +RdNVR.Lp sta ,x generate RTC address strobe + ldb 1,x get NVRAM data + stb ,u+ save it to buffer + inca next NVRAM address + dec 1,s done yet? + bne RdNVR.Lp no, go get another byte + puls cc,a recover IRQ enable status, clean up stack ([A]=0) + ldb R$B,y [D]=byte count + pshs d save it... + ldx <D.Proc get caller's process descriptor address + ldb P$Task,x caller is source task + lda <D.SysTsk system is destination task + ldu R$X,y get caller's source pointer + puls y recover byte count + ldx 2,s get data buffer (source) pointer + os9 F$Move go MOVE data + bcc NVR.RtM +NVR.Err puls y,u recover caller's stack and data pointers + pshs b save error code + ldd #$0100 return one page + os9 F$SRtMem + comb set Carry for error + puls b,pc recover error code, return... + ENDC + + +Init equ * + IFGT Level-1 +* Eliminator will install specific system calls + leay NewSvc,pcr insert syscalls + os9 F$SSvc + ENDC + rts + + emod +eom equ * + end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/clock2_harris.asm Fri Aug 20 11:11:58 2004 +0000 @@ -0,0 +1,101 @@ +******************************************************************** +* Clock2 - Harris RTC Driver +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 2004/08/18 Boisy G. Pitre +* Separated clock2 modules for source clarity. + + nam Clock2 + ttl Harris RTC Driver + + ifp1 + use defsfile + endc + +tylg set Sbrtn+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + +RTC.Base equ $FF60 Base address for clock + + mod eom,name,tylg,atrv,JmpTable,RTC.Base + +name fcs "Clock2" + fcb edition + + IFNE MPIFlag +SlotSlct fcb MPI.Slot-1 Slot constant for MPI select code + ENDC + +JmpTable + rts + nop + nop + bra GetTime + nop + lbra SetTime + + +GetTime pshs cc + orcc #IntMasks Disable interrupts + + ldu M$Mem,pcr Get base address + ldy #D.Time Pointer to time in system map + + lda #%00001100 Init command register (Normal,Int. Disabled, + sta $11,u Run,24-hour mode, 32kHz) + + lda ,u Read base address to set-up clock regs for read + lda 6,u Get year + sta ,y+ + lda 4,u Get month + sta ,y+ + lda 5,u Get day + sta ,y+ + lda 1,u Get hour + sta ,y+ + lda 2,u Get minute + sta ,y+ + lda 3,u Get second + sta ,y+ + + puls cc,pc Re-enable interrupts + + +SetTime pshs cc + orcc #IntMasks Disable interrupts + + ldu M$Mem,pcr Get base address + ldy #D.Time Pointer to time in system map + + lda #%00000100 Init command register (Normal,Int. Disabled, + sta $11,u STOP clock,24-hour mode, 32kHz) + + lda ,y+ Get year + sta 6,u + lda ,y+ Get month + sta 4,u + lda ,y+ Get day + sta 5,u + lda ,y+ Get hour + sta 1,u + lda ,y+ Get minute + sta 2,u + lda ,y Get second + sta 3,u + + lda #%00001100 Init command register (Normal,Int. Disabled, + sta $11,u START clock,24-hour mode, 32kHz) + + puls cc,pc Re-enable interrupts + + + emod +eom equ * + end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/clock2_jvemu.asm Fri Aug 20 11:11:58 2004 +0000 @@ -0,0 +1,70 @@ +******************************************************************** +* Clock2 - Jeff Vavasour CoCo 3 Emulator RTC Driver +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 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/07/31 Rodney Hamilton +* Improved RTCJVEmu code, conditionalized RTC type comments. +* +* 1 2004/08/18 Boisy G. Pitre +* Separated clock2 modules for source clarity. + + nam Clock2 + ttl Jeff Vavasour CoCo 3 Emulator RTC Driver + + ifp1 + use defsfile + endc + +tylg set Sbrtn+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + +RTC.Base equ $FFC0 + + mod eom,name,tylg,atrv,JmpTable,RTC.Base + +name fcs "Clock2" + fcb edition + +JmpTable + rts + nop + nop + bra GetTime + nop + rts + +GetTime 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 <D.Year set year (~YY) + ldd 2,x get date + std <D.Month set date (MMDD) + IFNE Level-1 + ldd 4,x get time (wwhh) + sta <D.Daywk set day of week + ELSE + ldb 5,x get hour (hh) + ENDC + stb <D.Hour set hour (hh) + ldd 6,x get time (mmss) + std <D.Min set time (mmss) + rts + + emod +eom equ * + end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/clock2_messemu.asm Fri Aug 20 11:11:58 2004 +0000 @@ -0,0 +1,99 @@ +******************************************************************** +* Clock2 - MESS Emulator RTC Driver +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 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. +* +* 1 2004/08/18 Boisy G. Pitre +* Separated clock2 modules for source clarity. + + nam Clock2 + ttl MESS Emulator RTC Driver + + ifp1 + use defsfile + endc + +tylg set Sbrtn+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + +RTC.Base equ $FF50 + + + mod eom,name,tylg,atrv,JmpTable,RTC.Base + +name fcs "Clock2" + fcb edition + +JmpTable + rts + nop + nop + bra GetTime + nop + rts + + +* MESS time update in Disto mode (ignores MPI) +* Assumes that PC clock is in AM/PM mode!!! +GetTime ldx #RTC.Base + ldy #D.Time + ldb #12 counter for data + stb 1,x + lda ,x + anda #7 + IFNE Level-1 + sta <D.Daywk + ENDC + decb + bsr getval + lda -1,y + cmpa #70 if >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 + + emod +eom equ * + end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/clock2_smart.asm Fri Aug 20 11:11:58 2004 +0000 @@ -0,0 +1,422 @@ +******************************************************************** +* Clock2 - Dallas Semiconductor 1216 RTC Driver +* +* $Id$ +* +* 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 +* ------------------------------------------------------------------ +* 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 +* time. User notified if clock not found or data memory not available. +* +* 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/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/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. +* +* 1 2004/08/18 Boisy G. Pitre +* Separated clock2 modules for source clarity. + + nam Clock2 + ttl Dallas Semiconductor 1216 RTC Driver + + ifp1 + use defsfile + endc + +tylg set Sbrtn+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + +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 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 +D.Temp equ 3 on SW page, holds "clock" data +D.Start equ 4 on SW page, code starts here + + + mod eom,name,tylg,atrv,JmpTable,RTC.Base + +name fcs "Clock2" + fcb edition + + IFNE MPIFlag +SlotSlct fcb MPI.Slot-1 Slot constant for MPI select code + ENDC + +JmpTable + lbra Init + bra GetTime + nop + lbra SetTime + +GetTime 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 + + + +* 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 +SetTime 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 <RTC.Read get a bit + rora + decb + bne L0052 + tst D.RTCFlg,u + bne maybe + cmpa D.Temp,u + beq maybe clock might look like ROM + inc D.RTCFlg,u found the clock +maybe sta ,x transfer it to time + lda ,s check loop counter + cmpa #8 + beq L006F skip if 0.1 sec + cmpa #4 + bne L006B skip if not day of week + IFGT Level-1 + lda ,x move to correct location + anda #7 + sta D.Daywk + ENDC + bra L006F +L006B cmpa #5 hour byte + bne wd + lda ,x + bita #%10000000 12/24hr + beq wd + bita #%00100000 AM/PM + pshs cc + anda #%00011111 keep only time + puls cc + bne pm + cmpa #$12 these are BCD tests + bne am + clr ,x 12AM=0hr military + bra wd +pm cmpa #$12 12PM=12hr military + beq wd + adda #$12 1-11PM add 12 for military +am sta ,x +wd leax -1,x update time slot + bsr L0087 convert from BCD to binary +L006F dec ,s + bne L0050 get the next byte from clock + lda 1,x get year + cmpa #50 half assed test for century + bhs c19 + adda #100 make it 20th +c19 sta 1,x + leas 1,s + tst D.RTCFlg,u + bne found + ldb D.RTCSlt,u + bitb #$30 + beq found + subb #$10 not found so move to next slot + stb D.RTCSlt,u + stb $FF7F + lbra findclk +found clra system DP is always 0 + tfr a,dp + IFGT Level-1 + lda D.HINIT reset system before rts + sta $FF90 + ENDC + sta $FFDF + puls a + sta $FFA6 + rts go back to normal code location + +* Convert BCD to binary +L0087 lda 1,x + clrb +L008A cmpa #$10 BCD 10 + bcs L0094 + addd #$F00A decrease BCD by $10 and add binary 10 + bra L008A +L0094 pshs a + addb ,s+ + stb 1,x +term rts + +wakeup lda <RTC.Read clear the clock for input +* When getting time data, bit0 is rotated into a full byte. This +* means the result is $00 or $FF for ROM. Any other value used for a test +* will give a false positive for the clock. + clrb + bita #1 + beq w1 + comb +w1 stb D.Temp,u + leax alert,pcr point to message +nxtbyte ldb #8 8 bytes to send + lda ,x+ + cmpa #-1 changed from 0 to -1 to accommodate settime + beq term +nxtbit lsra bits sent to clock by toggling + bcs high Zero and One + cmpa <RTC.Zero faster than tst + bra nxtbit2 +high cmpa <RTC.One +nxtbit2 decb + bne nxtbit + bra nxtbyte + +* SmartWatch wakeup sequence +alert fcb $c5,$3a,$a3,$5c,$c5,$3a,$a3,$5c +* The next 8 bytes become time data when setting the clock. Terminator is +* now $FF instead of $00 to permit $00 as data. +alrtend fcb $FF +alrtime rmb 7 + fcb $FF + +exit equ * + puls a + sta $FF7F restore MPI + tst D.RTCFlg,u was clock found? + beq noclock + puls cc,d,x,y,u,pc + + +Init equ * + clr <D.SWPage safe location for Read + pshs d,x,y,u + IFGT Level-1 + ldx <D.SysMem get memory map + ldy <D.SysDAT get MMU map + ldb #$20 first 20 pages always in use + abx point to page +A1 tst ,x+ + beq A2 found free page so go + incb update page counter + bpl A1 still in RAM only, then go +A4 lda #2 can't find RAM only memory + leax mem_mes,pcr + ldy #40 + os9 I$WritLn + puls d,x,y,u,pc +A2 pshs b save page # + andb #%11100000 modulo MMU blocks + lsrb convert to DAT byte value + lsrb page# * $100 / $2000 = MMU # + lsrb $2000/$100=$20 at 2 bytes per MMU + lsrb then page#/$10 gives answer + ldd b,y get the MMU value + cmpd #$333E is DAT unused + pshs cc save answer + inc 1,s update page # for a used page + puls cc,b get back answer and page # + beq A1 if unused keep going + lda #RAMinUse + sta ,-x flag the memory in use + ELSE + ldx <$20 D.FMBM free memory bit map + ldy <$22 top of memory bit map + ldb #-1 preset counter +A1 lda ,x+ get bits + incb update $800 counter + pshs y test for end of map + cmpx ,s+ + bhi A4 send error message + clr -1,s preset bit counter +A2 inc ,s + lsra read left to right + bcs A2 + lda ,s+ + deca convert to number of shifts + cmpa #8 overflow value + beq A1 get more map on ov + pshs a save the number of shifts + lda #8 bytes*8 + mul + addb ,s add modulo $800 + cmpb #$7E need RAM not ROM for clock data + bhs A4 + lda #%10000000 need to create mask to map the +A5 lsra unused bit, so reverse the process + dec ,s decrease shift counter + bne A5 + leas 1,s yank counter + ora -1,x mark bit used and + sta -1,x tell the system + bra A3 +A4 leas 1,s yank bit info + lda #2 error path # + leax mem_mes,pcr good memory not found + ldy #200 + os9 I$WritLn + puls d,x,y,u,pc +A3 equ * + ENDC + stb <D.SWPage keep the info for Read + tfr b,a + clrb + tfr d,x regX now points to SW data page + ldb $FF7F get MPI values + andb #3 keep IRQ info + orb #$30 force slot #4 to start search + stb D.RTCSlt,x save the info + clr D.RTCFlg,x set to no clock found + clr D.RTCMod,x set to read time + leax D.Start,x safe location for moved code + IFNE H6309 + leay reloc,pcr + ldw #exit-reloc + tfm y+,x+ + ELSE + leau reloc,pcr relocation routine to move code + ldy #exit-reloc to a RAM only location +B3 lda ,u+ + sta ,x+ + leay -1,y + bne B3 + ENDC + puls d,x,y,u,pc + +noclock equ * + ldd #7 seven time bytes to clear + ldx #D.Time + IFGT Level-1 + sta D.Daywk + ENDC +nc sta ,x+ + decb + bne nc + puls cc,d,x,y,u,pc + +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 + + emod +eom equ * + end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/modules/clock2_soft.asm Fri Aug 20 11:11:58 2004 +0000 @@ -0,0 +1,79 @@ +******************************************************************** +* Clock2 - Software Clock Driver +* +* $Id$ +* +* Edt/Rev YYYY/MM/DD Modified by +* Comment +* ------------------------------------------------------------------ +* 1 2003/08/18 Boisy G. Pitre +* Separated clock2 modules for source clarity. + + nam Clock2 + ttl Software Clock Driver + + ifp1 + use defsfile + endc + +tylg set Sbrtn+Objct +atrv set ReEnt+rev +rev set $00 +edition set 1 + + +RTC.Base equ 0 Have to have one defined. + + mod len,name,Sbrtn+Objct,ReEnt+0,JmpTable,RTC.Base + +name fcs "Clock2" + fcb edition + +JmpTable + rts + nop + nop + bra GetTime + nop + rts + +GetTime lda <D.Min grab current minute + inca minute+1 + cmpa #60 End of hour? + blo UpdMin no, Set start of minute + ldd <D.Day get day, hour + incb hour+1 + cmpb #24 End of Day? + blo UpdHour ..no + inca day+1 + leax <months-1,pcr point to months table with offset-1: Jan = +1 + ldb <D.Month this month + cmpa b,x end of month? + bls UpdDay ..no, update the day + cmpb #2 yes, is it Feb? + bne NoLeap ..no, ok + ldb <D.Year else get year + andb #$03 check for leap year: good until 2099 + cmpd #$1D00 29th on leap year? + beq UpdDay ..yes, skip it +NoLeap ldd <D.Year else month+1 + incb month+1 + cmpb #13 end of year? + blo UpdMonth ..no + inca year+1 + ldb #$01 set month to jan +UpdMonth std <D.Year save year, month + lda #$01 day=1st +UpdDay clrb hour=midnite +UpdHour std <D.Day save day,hour + clra minute=00 +UpdMin clrb seconds=00 + std <D.Min save min,secs +UpdTExit rts + +months fcb 31,28,31,30,31,30,31,31,30,31,30,31 Days in each month + + emod +len equ * + end +
--- a/level1/modules/makefile Fri Aug 20 11:10:57 2004 +0000 +++ b/level1/modules/makefile Fri Aug 20 11:11:58 2004 +0000 @@ -71,36 +71,11 @@ clock_50hz: clock.asm $(AS) $(AFLAGS) $(ASOUT)$@ $< -aPwrLnFrq=50 -clock2_elim: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKELIM) - -clock2_disto2: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKDISTO2) - -clock2_disto4: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKDISTO4) - -clock2_bnb: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKBNB) - -clock2_smart: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKSMART) +clock2_bnb: clock2_ds1315.asm + $(AS) $(AFLAGS) $(ASOUT)$@ $< -aBNB=1 -clock2_harris: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKHARRIS) - -clock2_cloud9: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKCLOUD9) - -clock2_jvemu: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKJVEMU) - -clock2_messemu: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKMESSEMU) - -clock2_soft: clock2.asm - $(AS) $(AFLAGS) $(ASOUT)$@ $< $(CLOCKSOFT) - +clock2_cloud9: clock2_ds1315.asm + $(AS) $(AFLAGS) $(ASOUT)$@ $< -aCLOUD9=1 # Floppy descriptors SSDD35 = -aCyls=35 -aSides=1 -aSectTrk=18 -aSectTrk0=18 \