Commit 1cd6a8f2 authored by Robert Sprowson's avatar Robert Sprowson
Browse files

Tighten up time conversions.

Convrsions.s:
Don't trash R4 in OS_ConvertDateAndTime
Reject buffer sizes > 2G (seems reasonable for a time string, and allows us to claw back a flag bit).
PMF/osword.s:
Just call Territory_ConvertDateAndTime directly since that's all OS_ConvertDateAndTime does.
Trim some now irrelevant comments and switched out code.

Version 5.35, 4.79.2.144. Tagged as 'Kernel-5_35-4_79_2_144'
parent 68f45833
......@@ -13,11 +13,11 @@
GBLS Module_ComponentPath
Module_MajorVersion SETS "5.35"
Module_Version SETA 535
Module_MinorVersion SETS "4.79.2.143"
Module_Date SETS "24 Mar 2012"
Module_ApplicationDate SETS "24-Mar-12"
Module_MinorVersion SETS "4.79.2.144"
Module_Date SETS "25 Mar 2012"
Module_ApplicationDate SETS "25-Mar-12"
Module_ComponentName SETS "Kernel"
Module_ComponentPath SETS "castle/RiscOS/Sources/Kernel"
Module_FullVersion SETS "5.35 (4.79.2.143)"
Module_HelpVersion SETS "5.35 (24 Mar 2012) 4.79.2.143"
Module_FullVersion SETS "5.35 (4.79.2.144)"
Module_HelpVersion SETS "5.35 (25 Mar 2012) 4.79.2.144"
END
......@@ -5,19 +5,19 @@
*
*/
#define Module_MajorVersion_CMHG 5.35
#define Module_MinorVersion_CMHG 4.79.2.143
#define Module_Date_CMHG 24 Mar 2012
#define Module_MinorVersion_CMHG 4.79.2.144
#define Module_Date_CMHG 25 Mar 2012
#define Module_MajorVersion "5.35"
#define Module_Version 535
#define Module_MinorVersion "4.79.2.143"
#define Module_Date "24 Mar 2012"
#define Module_MinorVersion "4.79.2.144"
#define Module_Date "25 Mar 2012"
#define Module_ApplicationDate "24-Mar-12"
#define Module_ApplicationDate "25-Mar-12"
#define Module_ComponentName "Kernel"
#define Module_ComponentPath "castle/RiscOS/Sources/Kernel"
#define Module_FullVersion "5.35 (4.79.2.143)"
#define Module_HelpVersion "5.35 (24 Mar 2012) 4.79.2.143"
#define Module_FullVersion "5.35 (4.79.2.144)"
#define Module_HelpVersion "5.35 (25 Mar 2012) 4.79.2.144"
#define Module_LibraryVersionInfo "5:35"
......@@ -737,13 +737,12 @@ ErrorBlock_BadStation
ALIGN
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; OS_ConvertDateAndTime
; ---------------------
; OS_ConvertStandardDateAndTime
; -----------------------------
; Convert from 5-byte cs representation to format specified in <SYS$DateFormat>
; In : R0 -> time block
; R1 -> buffer to accept conversion
; R2 = size of buffer
; R3 -> format string
;
; Out : R0 = input value of R1, or error block
; R1 = updated pointer to buffer
......@@ -751,8 +750,9 @@ ErrorBlock_BadStation
; V Set if error
StandardDateTime_Code ROUT
Push "R3,R14"
MOV R3, R2 ; Territory SWI wants things one register up
Push "R3, R14"
MOVS R3, R2 ; Territory SWI wants things one register up
BMI %FT10 ; Actively reject unlikely buffer sizes
MOV R2, R1
MOV R1, R0
MOV R0, #-1 ; Use configured territory
......@@ -774,15 +774,22 @@ StandardDateTime_Code ROUT
; R2 = updated size of buffer
; V Set if error
DateTime_Code ROUT
Push "R4, R14"
DateTime_Code
Push "R3-R4, R14"
MOV R4, R3 ; Territory SWI wants things one register up.
MOV R3, R2
MOVS R3, R2
BMI %FT10 ; Actively reject unlikely buffer sizes
MOV R2, R1
MOV R1, R0
MOV R0, #-1 ; Use configured territory.
SWI XTerritory_ConvertDateAndTime
Pull "R4, R14"
Pull "R3-R4, R14"
B SLVK_TestV
10
ADRL R0, ErrorBlock_BuffOverflow
[ International
BL TranslateError
]
B SLVK_SetV
END
......@@ -14,8 +14,6 @@
;
; > $.Source.PMF.osword
maxword * &16 ; highest known osword
; *****************************************************************************
MACRO
......@@ -38,8 +36,8 @@ maxword * &16 ; highest known osword
OsWord
Push "R0-R4, R11, R12, R14"
CMP R0, #(maxword+1)
BLCC OsWordGo ; Call the subsid entry pt.
CMP R0, #(WordTableEnd - WordTableStart) :SHR: 2
BLLS OsWordGo ; Call the subsid entry pt.
LDMIA R13, {R2-R4} ; R2=A, R3=X, R4=Y
MOV R1, #Service_UKWord ; osword service reason
CLRPSR V_bit, R0 ; in case there's no service
......@@ -62,11 +60,9 @@ OsWordGo ROUT
10 ; Point to despatch table
ADD PC, PC, R0, LSL #2 ; add in the action*4 and go
& 0
ASSERT DespatchWord-%BT10 = 8
; *****************************************************************************
ASSERT WordTableStart - %BT10 = 8
DespatchWord
WordTableStart
BAL OsWord00
BAL OsWord01
......@@ -94,6 +90,8 @@ DespatchWord
BAL OsWord15
BAL OsWord16
WordTableEnd
; *****************************************************************************
; That's All Folks
; *****************************************************************************
......@@ -222,7 +220,7 @@ OsWord07 ROUT
MyOsWord
; *****************************************************************************
; Read the logical colour of a Pixel ( BASIC'S POINT function)
; Read the logical colour of a Pixel ( BASIC's POINT function)
; Uses SWI ReadPoint
OsWord09 ROUT
......@@ -288,10 +286,8 @@ OsWord0D ROUT
; *****************************************************************************
; Osword 14 (&0E) -- Read Real Time Clock
; Four (was six) different calls
; Read CMOS clock
OsWord0E ROUT
Push "R5-R8, R14" ; R0-R4 saved by Osword
......@@ -304,11 +300,6 @@ OsWord0E ROUT
CMP R0, #3
BCC OsWord0EGamma
BEQ OsWord0EDelta
[ {FALSE}
CMP R0, #5
BCC OsWord0EEpsilon
BEQ OsWord0EZeta ; this is getting ridiculous !
]
Pull "R5-R8, PC" ; unknown option
......@@ -322,26 +313,22 @@ OsWord0E ROUT
OsWord0EAlpha ROUT
; TMD 30-May-89: We want to enable IRQs here, but OS_ConvertDateAndTime
; loads bytes out of the block, and if IRQs are on it might end using an
; inconsistent value, so we must make a copy of the block on the stack
; and use that. The label OsWord0EDandT was used by a commented out routine
; in file 'RealTime' which will have to be rewritten if it needs to be
; included again.
ADR R0, RealTime ; load snapshot of 5 bytes of real time
LDMIA R0, {R0, R2} ; while IRQs are still off
Push "R0, R2" ; save on stack
CLRPSR I_bit, R0 ; enable IRQs now
OSWord0EReturnString
MOV R0, R13 ; point to stacked copy
MOV R0, #-1 ; This territory
MOV R2, R1
MOV R1, R13 ; point to stacked copy
; KJB 07-Sep-98: No-one is guaranteeing anywhere the length of %w3 or %m3 -
; see PRM 1-402 and 1-415. So give an indefinite buffer length here (making
; overflow the caller's problem - this call is obsolete anyway). Problem
; first noted with territory Japan, for which %m3 is potentially 5 bytes long.
MOV R2, #&10000000
ADR R3, TimeFormat
SWI XOS_ConvertDateAndTime
MOV R3, #&10000000
ADR R4, TimeFormat
SWI XTerritory_ConvertDateAndTime
ADD R13, R13, #8 ; junk stack frame
MOVVC R0, #13 ; if no error
STRVCB R0, [R1] ; overwrite terminating 0 with CR
......
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