Mercurial > hg > Members > kono > nitros9-code
changeset 1672:5dcddea63b5a
New SmartWatch clock support
author | boisy |
---|---|
date | Tue, 27 Jul 2004 23:17:55 +0000 |
parents | a3dc53a58aed |
children | 665959fcf601 |
files | level1/cmds/makefile level1/cmds/swread.asm |
diffstat | 2 files changed, 400 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/level1/cmds/makefile Fri Jul 23 17:40:37 2004 +0000 +++ b/level1/cmds/makefile Tue Jul 27 23:17:55 2004 +0000 @@ -11,7 +11,7 @@ free grfo help ident iniz irqs link list load login makdir \ megaread mdir merge mfree mpi os9gen padrom park prompt printerr procs pwd pxd \ rename runb save setime shellplus shell_21 sleep \ - tee tmode touch tsmon tuneport unlink verify xmode + swread tee tmode touch tsmon tuneport unlink verify xmode SUBS = gfx inkey syscall ALLOBJS = $(CMDS) $(DRAGONCMDS) $(SUBS)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/level1/cmds/swread.asm Tue Jul 27 23:17:55 2004 +0000 @@ -0,0 +1,399 @@ +******************************************************************** +* SWRead - Read SmartWatch clock +* +* $Id$ +* +* Copyright May, 1990 by Robert Gault + +* SWREAD will read smartwatch compensating for 12hr mode if active +* time will be sent to OS-9 in 24hr mode for compatability +* +* The routine does grab a large uninterruptible block of time from +* the system, but no other way seems possible. +* +* syntax swread [n&] n=1-60 minutes +* D.Daywk stored for possible use +* +* Ed. Comments Who YY/MM/DD +* ------------------------------------------------------------------ +* 1 Created RG 91/03/01 +* 1 Changed irq handling; MPI handling; RG 91/10/29 +* error handling +* 1 Removed relocation routine. Removal could be RG 92/12/26 +* dangerous if OS-9 did not grab block from the +* low addresses first. Code must not be in a +* RAM/ROM block when ROMs activated. +* 2 Relocated part of clock read routine to RG 94/12/19 +* shorten the time spent with irqs off. +* 3 Adapted module for Level-1 use. Trimmed code. RG 04/07/24 +* Forced to add back the relocation loop for Level-1. +* Attempted to write a clock2 modules but just too +* difficult to acquire needed system low ram. +* Removed 6309 code for consistency as it had +* little effect on speed or size. +* Switched from Chain to Setime to Fork. + + nam SWRead + ttl Read SmartWatch clock + + ifp1 + use defsfile + endc + +* Next three lines for testing purposes. Remove as makefile will +* handle this choice. +*Level equ 1 +*Level equ 2 +*D.TSec equ $5A + +cartI equ $FF22 cartridge IRQ report +MPI.Slct equ $FF7F +rom equ $FFDE +ram equ $FFDF +IEN equ %00100000 +FEN equ %00010000 +SCS equ %00000100 +ROM1 equ %00000010 +ROM0 equ %00000001 +RTC.Base equ $C000 +RTC.Blk equ $3E +RTC.Read equ 4 +RTC.Zero equ 0 +RTC.One equ 1 + +type set prgrm+objct +revs set reent+1 +edition set 3 + + mod pgrmend,name,type,revs,start,size + +name fcs /SWRead/ + fcb edition + +locblk0 rmb 2 pointer to block 0 +locblk3E rmb 2 pointer to block $3E ie. disk ROM +sleep rmb 1 sleep interval time in minutes +byte1 rmb 1 clock read data; if no change - no clock +clkflag rmb 1 set when clock is found +mpiimage rmb 1 +sleepflg rmb 1 indicates multiple reads requested +timer rmb 1 count down for sleep interval; per minute +century rmb 1 century flag +rawdata rmb 8 direct readout from clock chip +relocimg rmb 300 place in data for relocated code +stack rmb 200 +size equ . + +message1 fcc /no clock found/ + fcb C$CR +setime fcc /setime/ forced chain to setime routine + fcb C$CR + +errmes fcb C$LF + fcc /Swread syntax:/ + fcb C$LF,C$LF + fcc /swread [n&]/ + fcb C$LF + fcc / The parameter string is optional; n = 1 to 60 min/ + fcb C$LF + fcc / permits watch to be polled in background every/ + fcb C$LF + fcc / n minutes. Use decimal time values./ + fcb C$CR +errmes2 fcb C$LF + fcc /Don't have relocation memory./ + fcb C$LF,C$CR + +start clr sleepflg + cmpd #2 + blo noparams + ldd ,x + cmpa #'? + beq syntax + cmpa #'- + beq syntax + + cmpb #'0 if second byte is CR then only one number + blo onebyte + subd #$3030 convert from ascii to bcd + + cmpd #$600 one hour skip is max + bhi syntax + cmpb #9 must be a number from 0-9 + bhi syntax + + pshs b convert reg.D to hexidecimal + ldb #10 + mul + addb ,s+ + bra storeit + +syntax lda #2 + leax errmes,pcr + ldy #300 + os9 I$Writln + clrb + os9 F$Exit + +onebyte suba #'0 + cmpa #9 + bhi syntax + +storeit stb timer + stb sleep used to reset timer on count down + com sleepflg + +noparams equ * + lda MPI.Slct + anda #3 retain IRQ settings + ora #$30 start at slot 4; ROM setting + sta mpiimage + + IFGT Level-1 +doit pshs u + ldb #1 single block + ldx #RTC.Blk disk rom; $07C000-$07DFFF + os9 F$MapBlk map into user space clock ROM + bcs exit2 + stu locblk3E save pointer + ldx #0 system direct page + os9 F$MapBlk system direct page + bcs exit2 + stu locblk0 save pointer + bsr readclk + ldb #1 block count + ldu locblk3E + os9 F$ClrBlk unmap the block + ldu locblk0 + os9 F$ClrBlk + puls u + ELSE + tfr u,d + cmpa #$7E + lbhs noroom the assigned DP is too close to ROM + ldx #RTC.Base + stx locblk3E + ldx #0 + stx locblk0 + leax readclk,pcr + pshs u + leau relocimg,u + ldy #endrel-readclk +reloc lda ,x+ move the read routines to the data page + sta ,u+ + leay -1,y + bne reloc + puls u +doit jsr relocimg,u + ENDC + + tst clkflag was clock found? + beq error2 + tst sleepflg are we in repeat mode? + beq exit + +snooze ldx #3540 = one minute of ticks minus one second for overhead + os9 F$Sleep + cmpx #0 + bne exit received signal so quit + + dec timer + bne snooze + + lda sleep reset timer + sta timer + bra doit go and read the clock + +exit2 puls u + os9 F$Exit + +error ldb #E$IllArg + os9 F$Exit + +error2 lda #2 error path + leax message1,pcr + ldy #40 + os9 I$WritLn +* force a normal Setime as SmartWatch was not detected + lda #Prgrm+Objct modul type + ldb #2 size of data area + leax setime,pcr + ldy #0 parameter size + leas stack,u + os9 F$Fork +exit equ * + clrb + os9 F$Exit + +* this is the heart of the clock reading routine + +readclk pshs cc + IFGT Level-1 + lda d.hinit,u get $FF90 image + ENDC + ldb MPI.Slct get current setting + pshs d save them + IFGT Level-1 + anda #^(IEN+FEN+ROM1+ROM0) no GIME IRQ/FIRQ; external access + orcc #IntMasks stop interrupts + sta $FF90 + ELSE + orcc #IntMasks stop interrupts + ENDC + sta rom go to ROM mode + ldx locblk3E point to clock ROM + ldb mpiimage get new value for MPI + clr clkflag start with clock not found + +findclk stb MPI.Slct set new slot + leay <alert,pcr point to clock wakeup code + lda RTC.Read,x clear clock at $C004 +* Reading clock fills a byte with bit0. If clock not present, +* then result is either $00 or $FF. Any other test byte will +* result in a false positive for finding the clock. + clrb + bita #1 + beq f1 + comb +f1 stb byte1 set initial value and look for change + +nxtbyte ldb #8 bits/byte + lda ,y+ + beq gettime +nxtbit lsra do a serial generation + bcs high + cmpa RTC.Zero,x talk to clock at $C000; cmp faster than tst + bra high2 +high cmpa RTC.One,x talk to clock at $C001 +high2 decb + bne nxtbit + bra nxtbyte + +* Code to tell swatch socket to switch from ROM to clock. +alert fcb $C5,$3A,$A3,$5C,$C5,$3A,$A3,$5C,0 + +gettime lda #8 8 bytes to read from clock + pshs a + IFGT Level-1 + ldy #rawdata + ELSE + leay rawdata,u + ENDC +* read serial bit stream from clock +timebyte lsr RTC.Read,x this is faster than a short loop with dec/bne + rora + lsr RTC.Read,x + rora + lsr RTC.Read,x + rora + lsr RTC.Read,x + rora + lsr RTC.Read,x + rora + lsr RTC.Read,x + rora + lsr RTC.Read,x + rora + lsr RTC.Read,x + rora + sta ,y+ store in raw data + tst clkflag once clock found, bypass tests + bne maybe + cmpa byte1 + beq maybe always possible a clock byte looks like ROM + inc clkflag +maybe dec ,s + bne timebyte + leas 1,s yank counter + tst clkflag + bne found + ldb mpiimage + bitb #$30 did we get to slot 0? + beq found yes? then quick looking + subb #$10 next slot + stb mpiimage + bra findclk + +noclk rts +found equ * + sta ram go back to RAM mode + puls d + stb MPI.Slct restore to original setting + tst cartI clear CART flag for autostart ROM pack present in MPI + IFGT Level-1 + sta $FF90 restore GIME mode + ENDC + puls cc restore IRQs + tst clkflag + beq noclk + IFGT Level-1 + ldx #rawdata + leay D.Slice,u + ELSE + leax rawdata,u + ldy #D.TSec $5A + ENDC + ldb #8 + pshs b +trans lda ,x+ translate serial data into OS-9 format + ldb ,s + cmpb #1 year + bne notyr + cmpa #$80 binary coded decimal number + bhi nintn + sta century + bra notyr +nintn clr century +notyr cmpb #4 day of the week + bne notdywk + IFGT Level-1 + anda #7 + sta D.Daywk,u + ENDC + bra nxtdata +notdywk cmpb #5 special 12/24, AM/PM indicator + bne cnvrt convert any number + bita #%10000000 12/24 hour bit + beq cnvrt 24 hour time + bita #%00100000 AM/PM bit since 12 hour time, check AM/PM + pshs cc + anda #%00011111 keep only time 1-12 + puls cc + bne PMhr + cmpa #$12 bcd value + bne cnvrt + clra 12 AM = 0 hrs 24hr time + bra cnvrt +Pmhr cmpa #$12 bcd value + beq cnvrt 12PM = 1200 24 hr time + adda #$12 bcd value; other times (1-11) add 12; ie. 1300-2300 +cnvrt clrb convert BCD to binary +a1 cmpa #$10 + bcs a2 + addd #$f00a + bra a1 +a2 pshs a + addb ,s+ + stb ,-y decrease pointer and then store +nxtdata dec ,s + bne trans + tst century + beq not20 + lda #100 user convention for >1999 values + adda ,y + sta ,y +not20 puls b,pc + +* This is the end of the code to be relocated. +endrel equ * + +noroom lda #2 + leax errmes2,pcr + ldy #300 + os9 I$WritLn + clrb + os9 F$Exit + + emod +pgrmend equ * + end