Commit 8622a560 authored by John Ballance's avatar John Ballance
Browse files

made HAL and Iyonix aware

Detail:

Admin:   to be released to beta software site.
         also run on an IOMD machine, but not aggessively tested
         Castle added IP


Version 0.10. Tagged as 'RTCAdjust-0_10'
parent 47c8584a
;
; This file is automatically maintained by srccommit, do not edit manually.
; Last processed by srccommit version: 1.2.
;
GBLS Module_MajorVersion
GBLA Module_Version
GBLS Module_MinorVersion
GBLS Module_Date
GBLS Module_FullVersion
GBLS Module_ApplicationDate2
GBLS Module_ApplicationDate4
GBLS Module_ApplicationDate
GBLS Module_HelpVersion
GBLS Module_ComponentName
GBLS Module_ComponentPath
Module_MajorVersion SETS "0.09"
Module_Version SETA 9
Module_MajorVersion SETS "0.10"
Module_Version SETA 10
Module_MinorVersion SETS ""
Module_Date SETS "16 Mar 2001"
Module_ApplicationDate2 SETS "16-Mar-01"
Module_ApplicationDate4 SETS "16-Mar-2001"
Module_Date SETS "16 Jan 2005"
Module_ApplicationDate SETS "16-Jan-05"
Module_ComponentName SETS "RTCAdjust"
Module_ComponentPath SETS "RiscOS/Sources/HWSupport/RTCAdjust"
Module_FullVersion SETS "0.09"
Module_HelpVersion SETS "0.09 (16 Mar 2001)"
Module_FullVersion SETS "0.10"
Module_HelpVersion SETS "0.10 (16 Jan 2005)"
END
/* (0.09)
/* (0.10)
*
* This file is automatically maintained by srccommit, do not edit manually.
* Last processed by srccommit version: 1.2.
*
*/
#define Module_MajorVersion_CMHG 0.09
#define Module_MajorVersion_CMHG 0.10
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 16 Mar 2001
#define Module_Date_CMHG 16 Jan 2005
#define Module_MajorVersion "0.09"
#define Module_Version 9
#define Module_MajorVersion "0.10"
#define Module_Version 10
#define Module_MinorVersion ""
#define Module_Date "16 Mar 2001"
#define Module_Date "16 Jan 2005"
#define Module_ApplicationDate2 "16-Mar-01"
#define Module_ApplicationDate4 "16-Mar-2001"
#define Module_ApplicationDate "16-Jan-05"
#define Module_ComponentName "RTCAdjust"
#define Module_ComponentPath "RiscOS/Sources/HWSupport/RTCAdjust"
#define Module_FullVersion "0.09"
#define Module_HelpVersion "0.09 (16 Mar 2001)"
#define Module_FullVersion "0.10"
#define Module_HelpVersion "0.10 (16 Jan 2005)"
#define Module_LibraryVersionInfo "0:10"
......@@ -43,6 +43,7 @@
GET Hdr:IIC
GET Hdr:ExtraLong
GET Hdr:MsgTrans
GET Hdr:HALEntries
GET VersionASM
......@@ -65,6 +66,10 @@ OsbyteReadCMOS * &A1
OsbyteWriteCMOS * &A2
OswordSetTime * &0F
RTCPHI * &a0
RTCDAL * &d0
; Failure modes
Failure_ReadCMOS * 1
......@@ -76,14 +81,14 @@ Failure_ReadMonoTime * 6
Failure_ErrorTooBig * 7
Failure_NewLatchTooBig * 8
; Module workspace allocation
^ 0, R12
LastLatchValue # 4
FailureMode # 4
LastError # 4
LastMonoTime # 4
LastLatchValue # 4
CallBackPending # 4
RTCCentiLo # 4
RTCCentiHi # 4
......@@ -95,13 +100,14 @@ NCorrections # 4 ;no. of corrections made - just to aid test monitoring
MessageFile_Block # 16
MessageFile_Open # 4
DefaultLatchValue # 4
MinimumLatchValue # 4
MaximumLatchValue # 4
NoHal # 1 ; NZ if no HAL
RTCAddress # 1
sparealign # 2
RTC_WorkspaceSize * :INDEX: @
; Default value to stick in IOC latch
DefaultLatchValue * 20000
MinimumLatchValue * 18000
MaximumLatchValue * 22000
; Time in centiseconds between recalibrations
......@@ -232,7 +238,7 @@ RTC_Die Entry
BL GetOffWordV
LDR R3, =DefaultLatchValue ; put back normal latch value
LDR R3, DefaultLatchValue ; put back normal latch value
BL ProgramLatch
CLRV
......@@ -254,7 +260,7 @@ NotNowImBusy
; DoInit - Set up variables on init/reset
;
DoInit Entry
DoInit Entry "R8-R9"
MOV R0, #0
STR R0, CallBackPending
STR R0, FailureMode
......@@ -264,9 +270,78 @@ DoInit Entry
BL InitVars
EXIT VS
LDR R0, =DefaultLatchValue
STR R0, LastLatchValue
; locate the RTC
MOV R8, #RTCDAL ; DALLAS
SUB R13, R13, #1*4 ; need 1 bytes rounded up
MOV R1, R13
MOV R2, #&01 ; CMOS address to start reading from
STRB R2, [R1,#0] ; and also length of block
MOV R0, R8 ; write CMOS address
SWI XIIC_Control
BVC %FT1 ; OK.. then its DALLAS
MOV R8, #RTCPHI ; Phillips 256byte cmos
MOV R0, R8 ; write CMOS address
SWI XIIC_Control
MOVVS r8, #0 ; no cmos RTC
1 STRB R8, RTCAddress
ADD R13, R13, #1*4 ; recover 1 bytes rounded up
MOV R8, #0
STRB R8, NoHal ; init flag as having HAL
MOV R9, #EntryNo_HAL_TimerGranularity
SWI XOS_Hardware
BVS NotHal
MOV R1, R0 ; preserve rate read
MOV R9, #EntryNo_HAL_TimerMaxPeriod
SWI XOS_Hardware
B HalCheckDone
NotHal
LDR R1, =2000000 ; rate
MOV R0, #65536 ; max
STRB R0, NoHal ; flag no HAL
HalCheckDone
; if (_swix(OS_Hardware, _IN(0)|_INR(8,9)|_OUT(0),
; 0, 0, EntryNo_HAL_TimerGranularity,
; &rate))
; {
; rate = 2000000;
; max = 65536;
; hal = false;
; }
; else
; {
; _swix(OS_Hardware, _IN(0)|_INR(8,9)|_OUT(0),
; 0, 0, EntryNo_HAL_TimerMaxPeriod,
; &max);
; hal = true;
; }
MOV R4, #100
ADD R2, R1, R4, LSR #1; rate + 50
MOV R6, R2 ; remember
MOV R7, R4
DivRem R3, R2, R4, lr ;
STR R3, LastLatchValue; (rate+50) / 100
STR R3, DefaultLatchValue;
DivRem R2, R3, R7, lr ; DefaultLatchValue/100
LDR R3, DefaultLatchValue;
SUB R4, R3, R2
CMP R4, #1
MOVLO R4, #1
STR R4, MinimumLatchValue
ADD R4, R3, R2
CMP R4, R0
MOVHI R4, R0
STR R4, MaximumLatchValue
; LastLatchValue = DefaultLatchValue = (rate+50) / 100;
; MinimumLatchValue = DefaultLatchValue - DefaultLatchValue/100;
; if (MinimumLatchValue < 1) MinimumLatchValue = 1;
; MaximumLatchValue = DefaultLatchValue + DefaultLatchValue/100;
; if (MaximumLatchValue > max) MaximumLatchValue = max;
MOV R0, #WordV
ADR R1, MyWordV
......@@ -336,14 +411,14 @@ MyWordV ROUT
MyCallEvery Entry "R0,R1,R8,R9"
SavePSR R9
ORR R8, R9, #SVC_mode ; IRQ->SVC (32-bit mode independent)
RestPSR R8,,c ; change mode
RestPSR R8,,fc ; change mode
NOP
Push R14
ADR R0, Recalibrate
MOV R1, R12
SWI XOS_AddCallBack
Pull R14
RestPSR R9,,c ; restore old processor mode
RestPSR R9,,fc ; restore old processor mode
NOP
LDR R0, CallBackPending
......@@ -351,6 +426,24 @@ MyCallEvery Entry "R0,R1,R8,R9"
STR R0, CallBackPending
EXIT
; *****************************************************************************
;
; BCDToHex - Convert byte in BCD to hex
;
; in: R0 = byte in BCD (ie x*16 + y)
;
; out: R0 = byte in hex (ie x*10 + y)
; All other registers preserved
;
BCDToHex ROUT
Push "R14"
MOV R14, R0, LSR #4 ; R14 := x
ADD R14, R14, R14, LSL #1 ; R14 := x*3
SUB R0, R0, R14, LSL #1 ; R0 := R0 - x*6 = x*10
Pull "PC"
; **************************************************************************
;
; Recalibrate - Recalibration routine
......@@ -391,52 +484,94 @@ Recalibrate Entry "R0-R9"
SUB R13, R13, #2*4 ; need 6 bytes rounded up
MOV R1, R13
MOV R2, #&01 ; CMOS address to start reading from
STRB R2, [R1,#0] ; and also length of block
MOV R0, #&A0 ; write CMOS address
LDRB R0, RTCAddress ; write CMOS address
TEQ R0, #0 ; RTC Fitted?
MOVEQ R0, #Failure_ReadIIC
BEQ %FT98
TEQ R0, #RTCDAL
MOVEQ R2, #&00 ; CMOS address to start reading from
MOVNE R2, #&01 ; CMOS address to start reading from
STRB R2, [R1,#0] ;
MOV R2, #&01 ; also length of this write block
SWI XIIC_Control
MOVVS R0, #Failure_WriteIIC
BVS %FT98
MOV R0, #&A1 ; read
LDRB R0, RTCAddress ; write CMOS address
ORR R0, R0, #1 ; read
MOV R2, #6 ; 6 bytes
SWI XIIC_Control
MOVVS R0, #Failure_ReadIIC
BVS %FT98
LDRB R2, [R1, #5-1] ; register 5 (top 2 bits = year)
AND R0, R4, #3 ; CMOS RAM year AND 3
RSBS R0, R0, R2, LSR #6 ; RTC year AND3 - CMOS RAM year AND3
ADDCC R0, R0, #4 ; if -ve then RTC year has wrapped
ADD R4, R4, R0 ; add onto CMOS RAM year
CMP R4, #100 ; if year lo >= 100
SUBCS R4, R4, #100 ; then wrap it
ADDCS R5, R5, #1 ; and increment year hi
CMPCS R5, #100 ; if year hi >= 100
SUBCS R5, R5, #100 ; then wrap it
AND R2, R2, #&3F ; knock out year bits from d-o-m
BCDToBinary R2, R14 ; and convert to binary
LDRB R6, [R1, #2-1] ; register 2 (seconds)
BCDToBinary R6, R14
LDRB R7, [R1, #1-1] ; register 1 (centiseconds)
BCDToBinary R7, R14
LDRB R14, [R1, #6-1] ; register 6 (weekday/month)
AND R3, R14, #&0F ; extract lo nybble
TST R14, #&10 ; only one bit in hi nybble
ADDNE R3, R3, #10 ; which adds 10
TEQ R8, #RTCPHI
BNE %FT50
; Philips specific read
LDRB R0, [R13, #0]
BL BCDToHex
MOV R7, R0 ; centiseconds
LDRB R0, [R13, #1]
BL BCDToHex
MOV R6, R0 ; seconds
LDRB R0, [R13, #2]
BL BCDToHex
MOV R1, R0 ; minutes
LDRB R0, [R13, #3]
BL BCDToHex
MOV R4, R0 ; hours
LDRB R0, [R13, #4]
AND R0, R0, #&3F ; day of month (clear year bits)
BL BCDToHex
MOV R2, R0
LDRB R0, [R13, #5]
AND R0, R0, #&1F ; month (clear day of week bits)
BL BCDToHex
MOV R3, R0
B ReadTimeYear
50
; Dallas specific read
MOV R7, #0 ; centiseconds
LDRB R0, [R13, #0]
BL BCDToHex
MOV R6, R0 ; seconds
LDRB R0, [R13, #1]
BL BCDToHex
MOV R1, R0 ; minutes
LDRB R0, [R13, #2]
BL BCDToHex
MOV R4, R0 ; hours
LDRB R0, [R13, #4]
BL BCDToHex
MOV R2, R0 ; day of month
LDRB R0, [R13, #5]
BL BCDToHex
MOV R3, R0 ; month
ReadTimeYear
Push "R1,R2"
Push "R4"
MOV R0, #OsbyteReadCMOS ; Read year MOD 100
MOV R1, #YearCMOS
SWI XOS_Byte
MOVVC R4, R2 ; and put it into R4
MOVVC R1, #YearCMOS +1 ; Read year DIV 100
SWIVC XOS_Byte
MOV R5, R2 ; and put it into R5
Pull "R0,R1,R2" ; r0..hours was originally in R4
MOVVS R0, #Failure_ReadCMOS
BVS %FT98
LDRB R0, [R1, #4-1] ; register 4 (hours/am-pm/12-24)
AND R0, R0, #&3F ; extract hours
BCDToBinary R0, R14
TEQ R2, #0 ; Ensure day/month are non-zero (LRust, fix RP-0370)
MOVEQ R2, #1 ; No then force 1st
TEQ R3, #0 ; Invalid month?
MOVEQ R3, #1 ; Yes then force Jan
LDRB R1, [R1, #3-1] ; register 3 (minutes)
BCDToBinary R1, R14
ADD R13, R13, #2*4
BL ConvertTo5Byte
CMP R8, #-1
MOVEQ R0, #Failure_Conversion
BEQ %FT99
......@@ -487,23 +622,22 @@ Recalibrate Entry "R0-R9"
; R6,R7 = L*(P+C)*P'/P
mextralong_divide R3, R4, R6, R7, R9, R1, R0, R5, R8
; R3,R4 = L*(P+C)*P'/P/(P'-(C-W))
LDR R1, =MaximumLatchValue
LDR R1, MaximumLatchValue
CMP R3, R1
SBCS R0, R4, #0
MOVGE R3, R1
MOVGE R4, #0
LDR R1, =MinimumLatchValue
LDR R1, MinimumLatchValue
CMP R3, R1
SBCS R0, R4, #0
MOVLT R3, R1
MOVLT R4, #0
CMP R3, #&10000
CMPCC R4, #1
MOVCS R0, #Failure_NewLatchTooBig
BCS %FT99
; CMP R3, #&10000
; CMPCC R4, #1
; MOVCS R0, #Failure_NewLatchTooBig
; BCS %FT99
STR R3, LastLatchValue
BL ProgramLatch
......@@ -525,10 +659,21 @@ Recalibrate Entry "R0-R9"
; **************************************************************************
;
; ProgramLatch - Program IOC Timer 0 latch with R3 value
; or use the HAL if present
;
ProgramLatch Entry "R0,R3"
SUB R3, R3, #1 ; TMD 21-May-93: Apply correction - IOC latch should be programmed with n-1
ProgramLatch Entry "R0, R1, R3, R8, R9"
LDRB lr, NoHal
TEQ lr, #0
BNE PLNoHal
MOV R0, #0
MOV R1, R3
MOV R8, R0
MOV R9, #EntryNo_HAL_TimerSetPeriod
SWI XOS_Hardware
EXIT
PLNoHal SUB R3, R3, #1 ; TMD 21-May-93: Apply correction - IOC latch should be programmed with n-1
MOV R0, #IOC
STRB R3, [R0, #Timer0LL]
MOV R3, R3, LSR #8
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment