diff --git a/Docs/RPiNotes b/Docs/RPiNotes
new file mode 100644
index 0000000000000000000000000000000000000000..1d7b7420fc90a5aaa2159fe84f48e5cfebf27fda
--- /dev/null
+++ b/Docs/RPiNotes
@@ -0,0 +1,36 @@
+Things remaining to be tidied:
+
+ - The starting in a non-numbered video mode; in s.vdu. Code deliberately
+   bodged (and flagged with !!!) to force starting in 1920x1080x32bpp.
+   I guess any HAL_VideoFeatures call that returns inability to handle a
+   <= 8bpp mode might be a way to activate it? Then I guess the HAL needs to
+   suggest a suitable default resolution.
+
+   Alternatively, with later start.elf images perhaps we will be able to run
+   in lower resolutions when booting.
+
+ - There's code surrounding ARM_Analyse and particularly EvaluateCache
+   where it didn't determine the correct cachetype and cachelinelen
+   for this ARM. I've not tidied this properly yet; it should be obvious
+   what's required.
+
+      ARM ID reg &410FB767
+      MRC 15,1,R0,C0,C0,1
+        cache info = &1D152152
+        ARMv6 format...ok
+
+   I'm not sure who's best-placed to sort this cleanly; my knowledge of
+   ARMs from that era is not extensive...I'd have to study the ARM ARM
+   to ascertain the 'correct' way to determine cache properties.
+
+ - The code in vdudriver that reads the framestore properties requires
+   a GraphicsV claimant if an external framestore is required. I can
+   knock up a simple asm module to do this, or we can switch to an
+   internal framestore if that can be made to work. I like the latter
+   idea because it gives us 'hardware scrolling' and possibly the
+   screen cacheing (SA), both of which would benefit us with the
+   currently unaccelerated display.
+
+ - the centisecond timer interrupt currently needs to
+   be a 'pretend Vsync' handler too at the moment. I'm unsure how you'd
+   like to go about having this workaround used for R-Pi only
diff --git a/VersionASM b/VersionASM
index 3db775c4c4b84390190ad73fd67295b1e0aa8189..2ca768e7d2fbb9456ff7d66a5ac4cb49d1a938c4 100644
--- a/VersionASM
+++ b/VersionASM
@@ -13,11 +13,11 @@
                         GBLS    Module_ComponentPath
 Module_MajorVersion     SETS    "5.35"
 Module_Version          SETA    535
-Module_MinorVersion     SETS    "4.79.2.98.2.52"
-Module_Date             SETS    "15 Sep 2011"
-Module_ApplicationDate  SETS    "15-Sep-11"
+Module_MinorVersion     SETS    "4.79.2.98.2.52.2.1"
+Module_Date             SETS    "10 May 2012"
+Module_ApplicationDate  SETS    "10-May-12"
 Module_ComponentName    SETS    "Kernel"
 Module_ComponentPath    SETS    "castle/RiscOS/Sources/Kernel"
-Module_FullVersion      SETS    "5.35 (4.79.2.98.2.52)"
-Module_HelpVersion      SETS    "5.35 (15 Sep 2011) 4.79.2.98.2.52"
+Module_FullVersion      SETS    "5.35 (4.79.2.98.2.52.2.1)"
+Module_HelpVersion      SETS    "5.35 (10 May 2012) 4.79.2.98.2.52.2.1"
                         END
diff --git a/VersionNum b/VersionNum
index ae7167e2c34d428dea78ee31e9412ee7de125c0d..5da739382a624ea6795f07498c7bf5ebf98daecc 100644
--- a/VersionNum
+++ b/VersionNum
@@ -5,19 +5,19 @@
  *
  */
 #define Module_MajorVersion_CMHG        5.35
-#define Module_MinorVersion_CMHG        4.79.2.98.2.52
-#define Module_Date_CMHG                15 Sep 2011
+#define Module_MinorVersion_CMHG        4.79.2.98.2.52.2.1
+#define Module_Date_CMHG                10 May 2012
 
 #define Module_MajorVersion             "5.35"
 #define Module_Version                  535
-#define Module_MinorVersion             "4.79.2.98.2.52"
-#define Module_Date                     "15 Sep 2011"
+#define Module_MinorVersion             "4.79.2.98.2.52.2.1"
+#define Module_Date                     "10 May 2012"
 
-#define Module_ApplicationDate          "15-Sep-11"
+#define Module_ApplicationDate          "10-May-12"
 
 #define Module_ComponentName            "Kernel"
 #define Module_ComponentPath            "castle/RiscOS/Sources/Kernel"
 
-#define Module_FullVersion              "5.35 (4.79.2.98.2.52)"
-#define Module_HelpVersion              "5.35 (15 Sep 2011) 4.79.2.98.2.52"
+#define Module_FullVersion              "5.35 (4.79.2.98.2.52.2.1)"
+#define Module_HelpVersion              "5.35 (10 May 2012) 4.79.2.98.2.52.2.1"
 #define Module_LibraryVersionInfo       "5:35"
diff --git a/hdr/Options b/hdr/Options
index 8f4fe276ebc6efba4b9a407ee99f43b71413a109..12eadb143035765f5a8b978649afa1c245c39d31 100644
--- a/hdr/Options
+++ b/hdr/Options
@@ -302,13 +302,13 @@ RMTidyDoesNowt  SETL    {TRUE}                  ; should really be "machine has
 RogerEXEY       SETL    {FALSE}                 ; Marketing don't like it!
 
                 GBLL    DebugROMInit
-DebugROMInit    SETL    {TRUE}
+DebugROMInit    SETL    {FALSE}
 
                 GBLL    DebugROMPostInit ; Displays when the PostInit service call is sent to each ROM module (currently works on vanilla service call handling only)
 DebugROMPostInit SETL    (:LNOT: ChocolateService) :LAND: {FALSE}
 
                 GBLL    DebugROMErrors
-DebugROMErrors  SETL    {TRUE}
+DebugROMErrors  SETL    {FALSE}
 
                 GBLL    DebugTerminal           ; default WRCH and RDCH through HAL
 DebugTerminal   SETL    {FALSE}
diff --git a/s/ARMops b/s/ARMops
index 0665d386a307fc84400dd3eb9af56bbc079d4938..b49c97edafb464c15c0670ef9d3b413a3beceadd 100644
--- a/s/ARMops
+++ b/s/ARMops
@@ -221,6 +221,12 @@ FindARMloop
         ; others ...
 
 WeirdARMPanic
+        ! 0, "FIXME: temporary code"
+;!!!
+  MOV ip,#&C0
+  STR a1,[ip,#&40]
+  STMIA ip,{a1-ip}
+
         B       WeirdARMPanic                   ; stiff :)
 
 Analyse_ARMv3
@@ -566,6 +572,10 @@ Analyse_WB_CR7_Lx
         CMP     a3, #14 ; Stop after level 7 (even though an 8th level might exist on some CPUs?)
         ADD     a2, a2, #4
         BLT     %BT10
+        ! 0, "FIXME: temporary code"
+;!!!
+  MOV a4,#32
+  MOV v2,#32
         STRB    a4, [v6, #ICache_LineLen] ; Store log2(line size)-2
         STRB    v2, [v6, #DCache_LineLen] ; log2(line size)-2
 
@@ -839,6 +849,12 @@ ARM_Analyse_Fancy
         MOV     a1, v2, LSR #CT_Dsize_pos
         ADD     a2, v6, #DCache_Info
         BL      EvaluateCache
+
+;EvaluateCache isn't doing our job for us....assuming these flags are true! ;)
+        ! 0, "FIXME: temporary code"
+;!!!
+   ORR   v5, v5, #CPUFlag_SynchroniseCodeAreas+CPUFlag_SplitCache
+
         B       %FT27
 
 25
diff --git a/s/HAL b/s/HAL
index 2a882db8e8db7a7f295b4a4c543709e8c674f9b5..e8a6ef02aeb8ff0b1ec9802cb7545d2d34c4fffd 100644
--- a/s/HAL
+++ b/s/HAL
@@ -832,6 +832,12 @@ MMUon_nol1ptoverlap
         MOV     v3, #0                                  ; "MMU is on" signal
 
         BL      ARM_Analyse
+        ! 0, "FIXME: temporary code"
+;!!! STILL DON'T KNOW WHY THE BODGE IN ARM_ANALYSE ITSELF DOESN'T WORK!
+  MOV a1,#0
+  MOV a2,#32
+  STRB a2,[a1,#DCache_LineLen]
+  STRB a2,[a1,#ICache_LineLen]
 
         ChangedProcVecs a1
 
diff --git a/s/Kernel b/s/Kernel
index 6dcf59c0f31d8ade7660eb9258e6615cd7f0ac44..d393d91fa2f5adea9b2e9471dd541306a2668949 100644
--- a/s/Kernel
+++ b/s/Kernel
@@ -42,9 +42,13 @@
         MACRO
         DebugTX $str
     [ DebugHALTX
+        ! 0, "FIXME: temporary code"
+;!!!
+  STR lr,[sp,#-4]!
         BL      DebugHALPrint
         =       "$str", 0
         ALIGN
+  LDR lr,[sp],#4
     ]
         MEND
   |
diff --git a/s/NewIRQs b/s/NewIRQs
index dc22cfffb767f4764cab6156e0625087dbede41c..13e9b728e9e5de9d4dbff35b531393493a8df755 100644
--- a/s/NewIRQs
+++ b/s/NewIRQs
@@ -1455,6 +1455,17 @@ TickOne ROUT
         STRB    R0, [R3, #IOCIRQCLRA]   ; clear timer 0 interrupt
  ]
 
+
+        ! 0, "FIXME: temporary code"
+;!!! HAPPY HACK
+        STMFD   sp!,{r0-r12}
+        ADR     r0,ret_from_vs
+        Push    r0
+        B       VsyncIRQ_ExtEntry
+ret_from_vs
+        LDMFD   sp!,{r0-r12}
+;!!! HAPPY HACK
+
         LDR     R1, =ZeroPage
         LDR     R0, [R1, #MetroGnome]
         ADD     R0, R0, #1
diff --git a/s/NewReset b/s/NewReset
index f6cc34f1deec792209eaabfd4ac4359bc07f0c0e..fbc934c8e972889e9cbdf8e578b9dfb724ee5380 100644
--- a/s/NewReset
+++ b/s/NewReset
@@ -1562,6 +1562,7 @@ WallopDuffOnes
         MOV     r1, #AP_UndStackSoftCam
         BL      AddCamEntries
  ]
+        DebugTX "InitDynamicAreas"
 
 ; let's boogie with the CMOS for a bit
 ; read info and move as much memory as we can
@@ -1709,6 +1710,7 @@ WallopDuffOnes
         STR     R1, [R0, #AplWorkSize]
         STR     R1, [R0, #MemLimit]
 
+        DebugTX "InitVectors"
         BL      InitVectors               ; ready for OsByte to read mode
 
         LDR     R1, =ZeroPage+ModuleSWI_HashTab
@@ -1773,6 +1775,7 @@ ResetPart1Done                          ; R0 is reset type
  ]
         Push    "R0, R1"                ; save until after MOSInit
 
+        DebugTX "InitIRQ1"
         BL      InitialiseIRQ1Vtable
 
         LDR     R3, =ZeroPage
@@ -1823,6 +1826,7 @@ ResetPart1Done                          ; R0 is reset type
         MOV     R4, #0
         STMIA   R2!, {R3,R4}
         STMIA   R2!, {R3,R4}
+        DebugTX "IMB_Full"
 
    ;we need to do an IMB type thing for modifying code in vector area,
    ;and for copying irq handler code
@@ -1911,7 +1915,8 @@ ResetPart1Done                          ; R0 is reset type
         STR     R0, [R1, #DeviceTable]
       ]
         CallHAL HAL_InitDevices         ; get HAL to register any devices it has
-        BL      LookForHALRTC ; Check if an RTC was just added. This is currently the only place where HAL RTCs are checked for; if we wanted to check anywhere else (e.g. after ROM module initialisation) then we'd have to listen for Service_Hardware so we can cope with device removal
+        ! 0, "FIXME: we're going to need this back at some point"
+;        BL      LookForHALRTC ; Check if an RTC was just added. This is currently the only place where HAL RTCs are checked for; if we wanted to check anywhere else (e.g. after ROM module initialisation) then we'd have to listen for Service_Hardware so we can cope with device removal
  |
         BL      L1L2PTenhancements      ; little tricks on cacheability etc for performance
  ]
diff --git a/s/PMF/key b/s/PMF/key
index 3ddbd79b7955f701fc67ccb52b95a53e1a1fba8a..9cadedc59b1616e9c8df2e34c7eaf2dea0a6bfd7 100644
--- a/s/PMF/key
+++ b/s/PMF/key
@@ -1090,6 +1090,23 @@ RedirectBadExit                         ; got an error from BGET
 ; in:   R1 = input buffer id (0 => keyboard, 1 => RS423)
 
 RDCHG   ROUT
+
+  [ {FALSE}
+  STMFD sp!,{R1-R12,R14}
+  MOV a1, #0
+  AddressHAL a1
+  SUB sp,sp,#4
+  MOV a2,sp
+  CallHAL HAL_UARTReceiveByte
+  LDR a2,[sp],#4
+  TST a2,#1
+  BNE %FT00
+  SEC
+  LDMFD sp!,{R1-R12,PC}
+00
+  CLC
+  LDMFD sp!,{R1-R12,PC}
+  ]
         Push    R14
 
 ; insert check here for ECONET interception of RDCH
diff --git a/s/vdu/vducursoft b/s/vdu/vducursoft
index e25dc3635747d5e15bd3e2545d3f367953fd7770..0625d50d5c76c1f17987d44da164ab974f85ee7e 100644
--- a/s/vdu/vducursoft
+++ b/s/vdu/vducursoft
@@ -100,6 +100,12 @@ PreWrchCursor
                                                 ; state in top bit
         STR     R0, [WsPtr, #CursorStack]
 
+        MOV     R2,R14
+        LDR     R14, [WsPtr, #HALVideoFeatures]
+        TST     R14, #2
+        BLEQ    RemovePointer
+        MOV     R14,R2
+
  [ No26bitCode
         MSR     CPSR_c, R3                      ; restore old I bit
         MOVCS   PC, R14                         ; already off, so exit
@@ -271,7 +277,21 @@ Cursor32loop
 ; out:  R6 = new CursorFlags, R5,R7 preserved, all others undefined
 ;
 
-PostWrchCursor
+PostWrchCursor ROUT
+
+        MOV     R6,R14
+        LDR     R14,[WsPtr, #HALVideoFeatures]
+        TST     R14,#2
+        BNE     %FT10
+
+        MRS     R4,CPSR
+        ORR     R3,R4,#I32_bit
+        MSR CPSR_c,R3
+        BL      RestorePointer
+        MSR CPSR_c,R4
+10
+        MOV     R14,R6
+
         LDR     R6, [WsPtr, #CursorFlags]
         LDR     R0, [WsPtr, #CursorStack]
         MOVS    R0, R0, LSL #1
diff --git a/s/vdu/vdudriver b/s/vdu/vdudriver
index 109dee584377b0e527b7ea411c096afeb13802ed..df77b43d22304e78a349fe480b39a3dfd26da4aa 100644
--- a/s/vdu/vdudriver
+++ b/s/vdu/vdudriver
@@ -362,7 +362,12 @@ InitialiseMode Entry
         MOV     r0, #1                  ; no need to check for soft reset,
         SWI     XOS_ReadSysInfo         ; always use configured value
  ]
-        MOV     r1, r0
+        ! 0, "FIXME: temporary code"
+;!!!
+   ADR r1,mode_defn
+
+;        MOV     r1, r0
+
         MOV     r0, #ScreenModeReason_SelectMode
         SWI     XOS_ScreenMode
         EXIT    VC
@@ -374,6 +379,14 @@ InitialiseMode Entry
         SWIVC   XOS_WriteI+0            ; and if we can't get mode 0, we're really fooked!!!
         EXIT
 
+        ! 0, "FIXME: temporary code"
+mode_defn DCD 1
+        DCD 1920
+        DCD 1080
+        DCD 5
+        DCD -1
+        DCD -1
+
 ;
 ;------------------------------------------------------------------------------
 ;
@@ -729,6 +742,10 @@ VduBadExit                              ; jumped to if an error in VDU code
 ModeChangeSub ROUT
         Push    lr
 
+        ! 0, "FIXME: temporary code"
+; !!!
+  ADRL R2,mode_defn
+
         ;If its a common mode number (0..49) consider a possible mode number
         ;substitution, if hardware does not support given bits per pixel.
         ;We are vaguely assuming h/w supports at least 8 bpp, otherwise we may
@@ -794,6 +811,7 @@ mchsub_3
 
         TEQ     R0, R1                  ; if substitute mode
         MOVNE   R2, #0                  ; then don't use shadow
+  DebugTX "FindOKMode reached"
 
         CMP     r1, #&100
         BICCC   r10, r1, #&80
@@ -801,6 +819,7 @@ mchsub_3
         MOV     R11, R10
         BL      PushModeInfo
         BVS     %FT07                   ; [probably duff mode selector]
+  DebugTX "PushModeInfo done"
 
         LDR     R11, [R13, #wkScreenSize] ; get screen size for this mode
         LDR     R9, [WsPtr, #TotalScreenSize] ; maximum allowed amount
@@ -828,7 +847,9 @@ mchsub_3
       [ International
         BL      TranslateError
       ]
+  DebugTX "Can't grow framestore"
 07
+  DebugTX "Mode fail"
         SETV                            ; indicate error
         Pull    PC
 
@@ -911,10 +932,20 @@ TV_Mode_string
 
  [ UseGraphicsV
         Push    "r0-r4"
+        ! 0, "FIXME: temporary code"
+;!!!
+  [ {FALSE}
         MOV     r4, #GraphicsV_FramestoreAddress
         BL      CallGraphicsV
         TEQ     r4, #0
         BNE     %FT581
+  |
+  ;hardcoded values for R-Pi alpha. external framestore requires a GraphicsV client,
+  ;  but still debating the merits of external vs internal
+  MOV r0,#&2000000
+  MOV r1,#&0800000
+  MOV r4,#0
+  ]
         MOV     r1, r1, LSR #20                 ; round size down to 1MB
         MOV     r2, r1, LSL #20
         ADD     r0, r0, #1:SHL:20               ; round addr up to 1MB
@@ -1199,8 +1230,13 @@ PushModeInfo ROUT
         BL      ReadMonitorType
 PushModeInfoCommon
         MOV     r2, r10                 ; r2 = original mode
-        BL      OfferModeExtension
-        BEQ     %FT30                   ; [service claimed]
+        ! 0, "FIXME: temporary code"
+;!!!
+;        BL      OfferModeExtension
+;        BEQ     %FT30                   ; [service claimed]
+  MOV r3,#0
+  MOV r4,#0
+  B %FT30
 
         CMP     r2, #&100               ; service not claimed - check if mode selector
         MOVCC   r10, r11                ; unrecognised mode number, so use substitute
@@ -1399,9 +1435,11 @@ GenerateModeSelectorVars Entry "r0,r1,r3-r8,r10-r12"
         TST     r2, #1                          ; is it a new format sprite mode word?
         BNE     %FT50                           ; [yes, so skip]
         MOV     r0, r2
+;  DebugTX "ValModeSel"
         BL      ValidateModeSelector
         BVS     %FT95                           ; invalid - return error
         LDMIB   r2, {r4-r6}                     ; r4 = xres; r5 = yres; r6 = pixdepth
+;  DebugTX "Passed"
 
         STR     r6, [r9, #wkLog2BPC]            ; log2bpc = log2bpp = pixdepth
         STR     r6, [r9, #wkLog2BPP]
diff --git a/s/vdu/vdupointer b/s/vdu/vdupointer
index cfd769027ca76e5702c437d728fcae5b88ee9edb..6a49b5f80b42ec947f4009e42fb313fae9c93661 100644
--- a/s/vdu/vdupointer
+++ b/s/vdu/vdupointer
@@ -604,4 +604,60 @@ FlushMouse ROUT
 
         LTORG
 
+; *****************************************************************************
+;
+;       RemovePointer - Remove soft mouse pointer from screen
+;
+
+RemovePointer ROUT
+        STMFD   R13!,{R0-R6,R14}
+        LDRB    R3, [WsPtr, #PointerShapeNumber]
+        TST     R3, #&7F
+        MOVNE   R0, #0
+        MOVNE   R4, #GraphicsV_UpdatePointer
+        BLNE    CallGraphicsV
+        LDMFD   R13!,{R0-R6,PC}
+
+; *****************************************************************************
+;
+;       RestorePointer - Restore soft mouse pointer to previous state
+;
+
+RestorePointer ROUT
+        STMFD   R13!,{R0-R6,R14}
+        LDRB    R6, [WsPtr, #PointerShapeNumber]
+        ANDS    R6, R6, #&7F
+        BEQ     %FT10
+
+        ADD     R3, WsPtr, #PointerShapes-4
+        LDR     R3, [R3, R6, LSL #2]         ; R3 -> current shape block (R6 = shape 1..4)
+
+        MOV     R0, #1                       ; R0 = flags, set pointer on (bit 0 = 1)
+
+        LDR     R1, [WsPtr, #PointerShapeLA] ; last shape buffer given to HAL
+        LDR     R4, [R3, #PointerBuffLA]     ; shape buffer we're about to give
+        TEQ     R1, R4                       ; same as last time?
+        STRNE   R4, [WsPtr, #PointerShapeLA] ; update
+        ORRNE   R0, R0, #2                   ; flag new shape (bit 1 = 1)
+
+        LDR     R1, [WsPtr, #PointerX]
+        LDR     R4, [WsPtr, #PointerXEigFactor]
+        MOV     R1, R1, ASR R4                     ; R1 = pointer x, pixels
+        LDRB    R4, [R3, #PointerActiveX]
+        SUB     R1, R1, R4                         ; R1 = pointer x, adjusted for active point
+
+        LDR     R2, [WsPtr, #PointerY]
+        LDR     R4, [WsPtr, #DisplayYEigFactor]
+        LDR     R5, [WsPtr, #DisplayYWindLimit]    ; R5 = display height -1
+        SUB     R2, R5, R2, ASR R4                 ; R2 = pointer y, pixels, inverted
+        LDRB    R4, [R3, #PointerActiveY]
+        SUB     R2, R2, R4                         ; R2 = pointer y, adjusted for active point
+
+        ; and it's up to the HAL to handle clipping according to h/w capabilities
+
+        MOV     R4, #GraphicsV_UpdatePointer
+        BL      CallGraphicsV
+10
+        LDMFD   R13!,{R0-R6,PC}
+
         END
diff --git a/s/vdu/vduswis b/s/vdu/vduswis
index 37575ad7bd8c5b0356f4f5ed170ab12ddabb3328..8917f410dc5e59d0d62a59c6a8e1f71bfa6d11b6 100644
--- a/s/vdu/vduswis
+++ b/s/vdu/vduswis
@@ -698,6 +698,7 @@ NSM_yshftfactor
 ;
 
 SWICheckModeValid ROUT
+  DebugTX "CheckModeValid"
         VDWS    WsPtr
         Push    "r1,r9,lr"
         BL      FindOKMode              ; out: r1 = substitute mode
@@ -772,6 +773,11 @@ SWICheckModeValid ROUT
 ;
 
 FindOKMode ROUT
+        ! 0, "FIXME: temporary code"
+;!!!
+  ADDS R1,R0,#0
+  MOV pc,lr
+
         Push    "r0,r2-r4,r10,r11,lr"
         BL      ReadMonitorType
         CMP     r0, #&100               ; if it's a mode number