diff --git a/Version b/Version
index 13483313de87ee0c02435b613d5746eb9b2fa700..c40caac23d4214fa5ec6fabf668a925bc639ceec 100644
--- a/Version
+++ b/Version
@@ -1,19 +1,28 @@
 ; > Versions.Vicky
 
-	GET	VersionASM
+        GET     VersionASM
 
         GBLA    Version
         GBLS    VString
         GBLS    Date
+        GBLA    OSVersionID         ;for OS_Byte 129
 
         [ STB
-Version SETA    Module_Version
-VString SETS    Module_MajorVersion
-Date    SETS    Module_Date      ; version for STB/NC OS
+Version     SETA    452
+VString     SETS    "4.52"
+Date        SETS    "07 Nov 1996"   ; version for STB/NC OS
+OSVersionID SETA    &A6 
+        |
+        [ M_Phoebe
+Version     SETA    400
+VString     SETS    "4.00"
+Date        SETS    "02 Feb 2000"   ; version for RISC OS on desktop computers
+OSVersionID SETA    &A8             ; was &A7 for 3.70,3.71
         |
 Version SETA    371
 VString SETS    "3.71"
 Date    SETS    "19 Feb 1997"    ; version for RISC OS on desktop computers
         ]
+        ]
 
         END
diff --git a/VersionASM b/VersionASM
index dc9fc3cb927ce5eb0bae2808ae465e0b67faa4c7..efeb77176f772ead0c0ca58cb312dcdd3017ce8e 100644
--- a/VersionASM
+++ b/VersionASM
@@ -6,9 +6,9 @@
                         GBLS    Module_MinorVersion
                         GBLS    Module_Date
                         GBLS    Module_FullVersion
-Module_MajorVersion     SETS    "5.14"
-Module_Version          SETA    514
+Module_MajorVersion     SETS    "5.15"
+Module_Version          SETA    515
 Module_MinorVersion     SETS    ""
-Module_Date             SETS    "27 Jan 2000"
-Module_FullVersion      SETS    "5.14"
+Module_Date             SETS    "02 Feb 2000"
+Module_FullVersion      SETS    "5.15"
                         END
diff --git a/VersionNum b/VersionNum
index 4055daae665a983914a65404ffd072a1ce09a50c..3939f5a77622fbb67ee4945a8b00b8cade9bd81e 100644
--- a/VersionNum
+++ b/VersionNum
@@ -1,15 +1,15 @@
-/* (5.14)
+/* (5.15)
  *
  * This file is automatically maintained by srccommit, do not edit manually.
  *
  */
-#define Module_MajorVersion_CMHG        5.14
+#define Module_MajorVersion_CMHG        5.15
 #define Module_MinorVersion_CMHG        
-#define Module_Date_CMHG                27 Jan 2000
+#define Module_Date_CMHG                02 Feb 2000
 
-#define Module_MajorVersion             "5.14"
-#define Module_Version                  514
+#define Module_MajorVersion             "5.15"
+#define Module_Version                  515
 #define Module_MinorVersion             ""
-#define Module_Date                     "27 Jan 2000"
+#define Module_Date                     "02 Feb 2000"
 
-#define Module_FullVersion              "5.14"
+#define Module_FullVersion              "5.15"
diff --git a/s/ARM600 b/s/ARM600
index 1d7069ed0ece6e291b265da09f6f27a9325e0b64..ebaee4ee654e28deb3eb3980839433b92ced0099 100644
--- a/s/ARM600
+++ b/s/ARM600
@@ -3009,6 +3009,11 @@ PAbPreVeneer    ROUT
 ; for the time being just merge lr and psr
 
         mrs     AL, r1, SPSR_all                        ; r1 = saved PSR
+
+        LDR     r2, =Abort32_dumparea
+        STMIA   r2, {r1,lr_abort}                       ;dump 32-bit PSR, fault address (PC)
+        STR     lr_abort,[r2,#2*4]                      ;dump 32-bit PC
+
         AND     r2, r1, #&F0000003                      ; get saved NZCV and 26 bit modes
         ORR     lr_abort, lr_abort, r2
         AND     r2, r1, #I32_bit + F32_bit              ; extract I and F from new place
@@ -3050,6 +3055,10 @@ DAbPreVeneer    ROUT
         mrs     AL, r1, CPSR_all                ; r1 = CPSR
         ADD     r2, r13_abort, #8*4             ; r2 -> saved register bank for r8 onwards
 
+        LDR     r4, =Abort32_dumparea+3*4       ;use temp area (avoid overwriting main area for expected aborts)
+        ARM_read_FAR r3
+        STMIA   r4, {r0,r3,lr_abort}            ; dump 32-bit PSR, fault address, 32-bit PC
+
         MOV     r4, lr_abort                    ; move address of aborting instruction into an unbanked register
         BIC     r1, r1, #&1F                    ; knock out current mode bits
         ANDS    r3, r0, #&1F                    ; extract old mode bits (and test for USR26_mode (=0))
@@ -3469,6 +3478,16 @@ DAbPreVeneer    ROUT
 
 90
 
+; copy temp area to real area (we believe this is an unexpected data abort now)
+
+        LDR     r0, =Abort32_dumparea
+        LDR     r1, [r0,#3*4]
+        STR     r1, [r0]
+        LDR     r1, [r0,#4*4]
+        STR     r1, [r0,#4]
+        LDR     r1, [r0,#5*4]
+        STR     r1, [r0,#2*4]
+
 ; for the time being just merge lr and psr
 
         LDR     r0, [sp, #8*4]                          ; r0 = original SPSR (can't have been modified)
diff --git a/s/Copro15ops b/s/Copro15ops
index e76fce0003673489b0985a1446e55195b2a2c698..0b259c85a3b7822b6ef50a7097a178f3f9426fd6 100644
--- a/s/Copro15ops
+++ b/s/Copro15ops
@@ -20,6 +20,8 @@
 
 ; 24-01-96 MJS Created
 ; 07-10-96 MJS Updated for proper ARM 810 support (not needed for RO 3.70)
+; 10-03-97 MJS A few additions for chocolate flavour screen handling (possible
+;              Domain and FSR register use) in Phoebe OS
 
 ARM_config_cp        CP 15  ;coprocessor number for configuration control
 
@@ -27,6 +29,8 @@ ARM_ID_reg           CN  0  ;processor ID
 ARM_control_reg      CN  1  ;control
 ARM_tbase_reg        CN  2  ;translation base (MMU)
 ARM_domain_reg       CN  3  ;domain access control (MMU)
+ARM_FSR_reg          CN  5  ;Fault status reg (MMU, read only on ARM 6/7)
+ARM_FAR_reg          CN  6  ;Fault address reg (MMU, read only on ARM 6/7)
 
 ARM67_TLBflush_reg   CN  5  ;TLB flush, ARMs 6 or 7
 ARM67_TLBpurge_reg   CN  6  ;TLB purge entry, ARMs 6 or 7
@@ -89,6 +93,18 @@ C15 CN 15
         MCR$cond ARM_config_cp,0,$reg,ARM_control_reg,C0,0
         MEND
 
+;read MMU fault status
+        MACRO
+        ARM_read_FSR $reg,$cond
+        MRC$cond ARM_config_cp,0,$reg,ARM_FSR_reg,C0,0
+        MEND
+
+;read MMU fault address
+        MACRO
+        ARM_read_FAR $reg,$cond
+        MRC$cond ARM_config_cp,0,$reg,ARM_FAR_reg,C0,0
+        MEND
+
 ;read ID register to register $id
 ;bits 15:12 of returned ID will be 0,7,8,10 for ARM 6,7,8,A
         MACRO
diff --git a/s/Middle b/s/Middle
index c8d618c84f6fbe6576f92fecbf47523a352e52b1..78d60602e9f5aeea345eadbb7c42d854cb315a34 100644
--- a/s/Middle
+++ b/s/Middle
@@ -1057,8 +1057,14 @@ ReadSysInfo_Code ROUT
         CMP     r0, #5
         BCC     %FT40                   ; R0 = 4
         BEQ     %FT50                   ; R0 = 5
+        CMP     r0, #7
+        BCC     %FT60                   ; R0 = 6
+        BEQ     %FT70                   ; R0 = 7
+        CMP     r0, #9
+        BCC     %FT80                   ; R0 = 8
+                                        ; R0 = 9 not allocated yet (BEQ %FT90)
 
-        ;       R0 > 5, so illegal value
+        ;       R0 > 8, so illegal value
 
         ADR     r0, ErrorBlock_BadReadSysInfo
       [ International
@@ -1410,6 +1416,141 @@ NVRAM_TAG_MACAddressChecksum
         LDR     r0, [r0, #RawMachineID+0]
         ExitSWIHandler
 
+; OS_ReadSysInfo 6  - read kernel values (Acorn use only; eg. SoftLoad, ROMPatch)
+;
+; On entry:       r0 =  6 (reason code)
+;                 r1 -> input block, 1 word per entry, giving number of value required, terminated by -1
+;           OR:   r1 =  0 if just 1 value is required, and this is to beturned in r2
+;                 r2 -> output block, 1 word per entry, will be filled in on output
+;           OR:   r2 =  number of single value required, if r1 = 0
+;
+; On exit:
+;   if r1 entry != 0:
+;         r0,r1,r2 preserved
+;         output block filled in, filled in value(s) set to 0 if unrecognised/no longer meaningful value(s)
+;   if r1 entry = 0:
+;         r0,r1 preserved
+;         r2 = single value required, or set to 0 if if unrecognised/no longer meaningful value
+;
+;  valid value numbers available - see table below
+;
+
+60
+        Push    "r0-r3"
+        ADR     r3,osri6_table
+        CMP     r1,#0
+        BEQ     %FT64
+62
+        LDR     r0,[r1],#4
+        CMP     r0,#-1
+        BEQ     %FT66
+        CMP     r0,#osri6_maxvalue
+        MOVHI   r0,#0
+        LDRLS   r0,[r3,r0,LSL #2]
+        STR     r0,[r2],#4
+        B       %BT62
+64
+        CMP     r2,#osri6_maxvalue
+        MOVHI   r2,#0
+        LDRLS   r2,[r3,r2,LSL #2]
+        STR     r2,[sp,#2*4]
+66
+        Pull    "r0-r3"
+        ExitSWIHandler
+
+osri6_table
+    DCD  CamEntriesPointer        ;0
+    DCD  MaxCamEntry              ;1
+    DCD  PageFlags_Unavailable    ;2
+    DCD  PhysRamTable             ;3
+    DCD  ARMA_Cleaner_flipflop    ;4
+    DCD  TickNodeChain            ;5
+    DCD  ROMModuleChain           ;6
+    DCD  DAList                   ;7
+    DCD  AppSpaceDANode           ;8
+    DCD  Module_List              ;9
+    DCD  ModuleSHT_Entries        ;10
+    DCD  ModuleSWI_HashTab        ;11
+    DCD  IOSystemType             ;12
+    DCD  L1PT                     ;13
+    DCD  L2PT                     ;14
+    DCD  UNDSTK                   ;15
+    DCD  SVCSTK                   ;16
+    DCD  SysHeapStart             ;17
+osri6_maxvalue * 17
+
+
+; OS_ReadSysInfo 7  - read 32-bit Abort information for last unexpected abort
+;                     (prefetch or data)
+;
+; On entry:       r0 =  6 (reason code)
+;
+; On exit:        r1 = 32-bit PC for last abort
+;                 r2 = 32-bit PSR for last abort
+;                 r3 = fault address for last abort (same as PC for prefetch abort)
+;
+70
+        Push    "r0"
+        LDR     r0, =Abort32_dumparea
+        LDR     r1, [r0,#2*4]
+        LDR     r2, [r0]
+        LDR     r3, [r0,#4]
+        Pull    "r0"
+        ExitSWIHandler
+
+; OS_ReadSysInfo 8 - Returns summary information on host platform.
+;
+; On entry:
+;    r0 = 8 (reason code 8)
+;
+; On exit:
+;    r0 = platform class
+;         currently defined classes are:
+;            0 = unspecified platform (r1,r2 will be 0)
+;            1 = Medusa   (currently returned for Risc PC only)
+;            2 = Morris   (currently returned for A7000 only)
+;            3 = Morris+  (currently returned for A7000+ only)
+;            4 = Phoebe   (currently returned for Risc PC 2 only)
+;            all other values currently reserved
+;    r1 = 32 additional platform specifier flags (if defined)
+;         bits 0..31 = value of flags 0..31 if defined, 0 if undefined
+;    r2 = defined status of the 32 flags in r1
+;         bits 0..31 = status of flags 0..31
+;                      0 = flag is undefined in this OS version
+;                      1 = flag is defined in this OS version
+;
+; The current flag definitions for r1 (1=supported, 0=unsupported) are :
+;
+;     0     = Podule expansion card(s)
+;     1     = PCI expansion card(s)
+;     2     = additional processor(s)
+;     3     = auto power off
+;     4..31 reserved (currently undefined)
+;
+80
+        Push    "r3-r5"
+        ADR     r3, %86
+        MOV     r4, #IOMD_Base
+        LDRB    r4, [r4, #IOMD_ID0]
+82
+        LDR     r5, [r3], #4
+        TEQ     r5, #&80000000     ;terminator
+        TEQNE   r5, r4
+        LDMEQIA r3, {r0-r2}
+        BEQ     %FT84
+        ADD     r3, r3, #3*4
+        B       %BT82
+84
+        Pull    "r3-r5"
+        ExitSWIHandler
+86
+        DCD     IOMD_Original :AND: &FF,   1, &00000001, &0000000F
+        DCD     IOMD_7500     :AND: &FF,   2, &00000001, &0000000F
+        DCD     IOMD_7500FE   :AND: &FF,   3, &00000001, &0000000F
+        DCD     IOMD_IOMD2    :AND: &FF,   4, &0000000F, &0000000F
+        DCD     &80000000,                 0,         0,         0  ;terminator
+
+
         LTORG
 
         END