Commit 0125023e authored by Ben Avison's avatar Ben Avison
Browse files

Support for Raspberry Pi / BCM2835

Detail:
  Falls into two main areas: graphics support and ARM11 core support.
  A work in progress - in many cases the code changes need to be replaced
  with an alternative mechanism which will permit the kernel to still function
  on other platforms. Adrian marked these with "!!!" comments - I have added
  ! directives as well so that they don't get forgotten about.
Admin:
  Changes received from Adrian Lees. This revision represents the code largely
  as delivered, and is placed on its own branch (forked off from the version
  from which he worked). It is intended for reference. It doesn't build against
  current headers - this is likely to require a merge with the other changes
  to the kernel since that time.

Version 5.35, 4.79.2.98.2.52.2.1. Tagged as 'Kernel-5_35-4_79_2_98_2_52_2_1'
parent af172483
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
...@@ -13,11 +13,11 @@ ...@@ -13,11 +13,11 @@
GBLS Module_ComponentPath GBLS Module_ComponentPath
Module_MajorVersion SETS "5.35" Module_MajorVersion SETS "5.35"
Module_Version SETA 535 Module_Version SETA 535
Module_MinorVersion SETS "4.79.2.98.2.52" Module_MinorVersion SETS "4.79.2.98.2.52.2.1"
Module_Date SETS "15 Sep 2011" Module_Date SETS "10 May 2012"
Module_ApplicationDate SETS "15-Sep-11" Module_ApplicationDate SETS "10-May-12"
Module_ComponentName SETS "Kernel" Module_ComponentName SETS "Kernel"
Module_ComponentPath SETS "castle/RiscOS/Sources/Kernel" Module_ComponentPath SETS "castle/RiscOS/Sources/Kernel"
Module_FullVersion SETS "5.35 (4.79.2.98.2.52)" Module_FullVersion SETS "5.35 (4.79.2.98.2.52.2.1)"
Module_HelpVersion SETS "5.35 (15 Sep 2011) 4.79.2.98.2.52" Module_HelpVersion SETS "5.35 (10 May 2012) 4.79.2.98.2.52.2.1"
END END
...@@ -5,19 +5,19 @@ ...@@ -5,19 +5,19 @@
* *
*/ */
#define Module_MajorVersion_CMHG 5.35 #define Module_MajorVersion_CMHG 5.35
#define Module_MinorVersion_CMHG 4.79.2.98.2.52 #define Module_MinorVersion_CMHG 4.79.2.98.2.52.2.1
#define Module_Date_CMHG 15 Sep 2011 #define Module_Date_CMHG 10 May 2012
#define Module_MajorVersion "5.35" #define Module_MajorVersion "5.35"
#define Module_Version 535 #define Module_Version 535
#define Module_MinorVersion "4.79.2.98.2.52" #define Module_MinorVersion "4.79.2.98.2.52.2.1"
#define Module_Date "15 Sep 2011" #define Module_Date "10 May 2012"
#define Module_ApplicationDate "15-Sep-11" #define Module_ApplicationDate "10-May-12"
#define Module_ComponentName "Kernel" #define Module_ComponentName "Kernel"
#define Module_ComponentPath "castle/RiscOS/Sources/Kernel" #define Module_ComponentPath "castle/RiscOS/Sources/Kernel"
#define Module_FullVersion "5.35 (4.79.2.98.2.52)" #define Module_FullVersion "5.35 (4.79.2.98.2.52.2.1)"
#define Module_HelpVersion "5.35 (15 Sep 2011) 4.79.2.98.2.52" #define Module_HelpVersion "5.35 (10 May 2012) 4.79.2.98.2.52.2.1"
#define Module_LibraryVersionInfo "5:35" #define Module_LibraryVersionInfo "5:35"
...@@ -302,13 +302,13 @@ RMTidyDoesNowt SETL {TRUE} ; should really be "machine has ...@@ -302,13 +302,13 @@ RMTidyDoesNowt SETL {TRUE} ; should really be "machine has
RogerEXEY SETL {FALSE} ; Marketing don't like it! RogerEXEY SETL {FALSE} ; Marketing don't like it!
GBLL DebugROMInit 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) 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} DebugROMPostInit SETL (:LNOT: ChocolateService) :LAND: {FALSE}
GBLL DebugROMErrors GBLL DebugROMErrors
DebugROMErrors SETL {TRUE} DebugROMErrors SETL {FALSE}
GBLL DebugTerminal ; default WRCH and RDCH through HAL GBLL DebugTerminal ; default WRCH and RDCH through HAL
DebugTerminal SETL {FALSE} DebugTerminal SETL {FALSE}
......
...@@ -221,6 +221,12 @@ FindARMloop ...@@ -221,6 +221,12 @@ FindARMloop
; others ... ; others ...
WeirdARMPanic WeirdARMPanic
! 0, "FIXME: temporary code"
;!!!
MOV ip,#&C0
STR a1,[ip,#&40]
STMIA ip,{a1-ip}
B WeirdARMPanic ; stiff :) B WeirdARMPanic ; stiff :)
Analyse_ARMv3 Analyse_ARMv3
...@@ -566,6 +572,10 @@ Analyse_WB_CR7_Lx ...@@ -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?) CMP a3, #14 ; Stop after level 7 (even though an 8th level might exist on some CPUs?)
ADD a2, a2, #4 ADD a2, a2, #4
BLT %BT10 BLT %BT10
! 0, "FIXME: temporary code"
;!!!
MOV a4,#32
MOV v2,#32
STRB a4, [v6, #ICache_LineLen] ; Store log2(line size)-2 STRB a4, [v6, #ICache_LineLen] ; Store log2(line size)-2
STRB v2, [v6, #DCache_LineLen] ; log2(line size)-2 STRB v2, [v6, #DCache_LineLen] ; log2(line size)-2
...@@ -839,6 +849,12 @@ ARM_Analyse_Fancy ...@@ -839,6 +849,12 @@ ARM_Analyse_Fancy
MOV a1, v2, LSR #CT_Dsize_pos MOV a1, v2, LSR #CT_Dsize_pos
ADD a2, v6, #DCache_Info ADD a2, v6, #DCache_Info
BL EvaluateCache 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 B %FT27
25 25
......
...@@ -832,6 +832,12 @@ MMUon_nol1ptoverlap ...@@ -832,6 +832,12 @@ MMUon_nol1ptoverlap
MOV v3, #0 ; "MMU is on" signal MOV v3, #0 ; "MMU is on" signal
BL ARM_Analyse 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 ChangedProcVecs a1
......
...@@ -42,9 +42,13 @@ ...@@ -42,9 +42,13 @@
MACRO MACRO
DebugTX $str DebugTX $str
[ DebugHALTX [ DebugHALTX
! 0, "FIXME: temporary code"
;!!!
STR lr,[sp,#-4]!
BL DebugHALPrint BL DebugHALPrint
= "$str", 0 = "$str", 0
ALIGN ALIGN
LDR lr,[sp],#4
] ]
MEND MEND
| |
......
...@@ -1455,6 +1455,17 @@ TickOne ROUT ...@@ -1455,6 +1455,17 @@ TickOne ROUT
STRB R0, [R3, #IOCIRQCLRA] ; clear timer 0 interrupt 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 R1, =ZeroPage
LDR R0, [R1, #MetroGnome] LDR R0, [R1, #MetroGnome]
ADD R0, R0, #1 ADD R0, R0, #1
......
...@@ -1562,6 +1562,7 @@ WallopDuffOnes ...@@ -1562,6 +1562,7 @@ WallopDuffOnes
MOV r1, #AP_UndStackSoftCam MOV r1, #AP_UndStackSoftCam
BL AddCamEntries BL AddCamEntries
] ]
DebugTX "InitDynamicAreas"
; let's boogie with the CMOS for a bit ; let's boogie with the CMOS for a bit
; read info and move as much memory as we can ; read info and move as much memory as we can
...@@ -1709,6 +1710,7 @@ WallopDuffOnes ...@@ -1709,6 +1710,7 @@ WallopDuffOnes
STR R1, [R0, #AplWorkSize] STR R1, [R0, #AplWorkSize]
STR R1, [R0, #MemLimit] STR R1, [R0, #MemLimit]
DebugTX "InitVectors"
BL InitVectors ; ready for OsByte to read mode BL InitVectors ; ready for OsByte to read mode
LDR R1, =ZeroPage+ModuleSWI_HashTab LDR R1, =ZeroPage+ModuleSWI_HashTab
...@@ -1773,6 +1775,7 @@ ResetPart1Done ; R0 is reset type ...@@ -1773,6 +1775,7 @@ ResetPart1Done ; R0 is reset type
] ]
Push "R0, R1" ; save until after MOSInit Push "R0, R1" ; save until after MOSInit
DebugTX "InitIRQ1"
BL InitialiseIRQ1Vtable BL InitialiseIRQ1Vtable
LDR R3, =ZeroPage LDR R3, =ZeroPage
...@@ -1823,6 +1826,7 @@ ResetPart1Done ; R0 is reset type ...@@ -1823,6 +1826,7 @@ ResetPart1Done ; R0 is reset type
MOV R4, #0 MOV R4, #0
STMIA R2!, {R3,R4} STMIA R2!, {R3,R4}
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, ;we need to do an IMB type thing for modifying code in vector area,
;and for copying irq handler code ;and for copying irq handler code
...@@ -1911,7 +1915,8 @@ ResetPart1Done ; R0 is reset type ...@@ -1911,7 +1915,8 @@ ResetPart1Done ; R0 is reset type
STR R0, [R1, #DeviceTable] STR R0, [R1, #DeviceTable]
] ]
CallHAL HAL_InitDevices ; get HAL to register any devices it has 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 BL L1L2PTenhancements ; little tricks on cacheability etc for performance
] ]
......
...@@ -1090,6 +1090,23 @@ RedirectBadExit ; got an error from BGET ...@@ -1090,6 +1090,23 @@ RedirectBadExit ; got an error from BGET
; in: R1 = input buffer id (0 => keyboard, 1 => RS423) ; in: R1 = input buffer id (0 => keyboard, 1 => RS423)
RDCHG ROUT 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 Push R14
; insert check here for ECONET interception of RDCH ; insert check here for ECONET interception of RDCH
......
...@@ -100,6 +100,12 @@ PreWrchCursor ...@@ -100,6 +100,12 @@ PreWrchCursor
; state in top bit ; state in top bit
STR R0, [WsPtr, #CursorStack] STR R0, [WsPtr, #CursorStack]
MOV R2,R14
LDR R14, [WsPtr, #HALVideoFeatures]
TST R14, #2
BLEQ RemovePointer
MOV R14,R2
[ No26bitCode [ No26bitCode
MSR CPSR_c, R3 ; restore old I bit MSR CPSR_c, R3 ; restore old I bit
MOVCS PC, R14 ; already off, so exit MOVCS PC, R14 ; already off, so exit
...@@ -271,7 +277,21 @@ Cursor32loop ...@@ -271,7 +277,21 @@ Cursor32loop
; out: R6 = new CursorFlags, R5,R7 preserved, all others undefined ; 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 R6, [WsPtr, #CursorFlags]
LDR R0, [WsPtr, #CursorStack] LDR R0, [WsPtr, #CursorStack]
MOVS R0, R0, LSL #1 MOVS R0, R0, LSL #1
......
...@@ -362,7 +362,12 @@ InitialiseMode Entry ...@@ -362,7 +362,12 @@ InitialiseMode Entry
MOV r0, #1 ; no need to check for soft reset, MOV r0, #1 ; no need to check for soft reset,
SWI XOS_ReadSysInfo ; always use configured value 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 MOV r0, #ScreenModeReason_SelectMode
SWI XOS_ScreenMode SWI XOS_ScreenMode
EXIT VC EXIT VC
...@@ -374,6 +379,14 @@ InitialiseMode Entry ...@@ -374,6 +379,14 @@ InitialiseMode Entry
SWIVC XOS_WriteI+0 ; and if we can't get mode 0, we're really fooked!!! SWIVC XOS_WriteI+0 ; and if we can't get mode 0, we're really fooked!!!
EXIT 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 ...@@ -729,6 +742,10 @@ VduBadExit ; jumped to if an error in VDU code
ModeChangeSub ROUT ModeChangeSub ROUT
Push lr Push lr
! 0, "FIXME: temporary code"
; !!!
ADRL R2,mode_defn
;If its a common mode number (0..49) consider a possible mode number ;If its a common mode number (0..49) consider a possible mode number
;substitution, if hardware does not support given bits per pixel. ;substitution, if hardware does not support given bits per pixel.
;We are vaguely assuming h/w supports at least 8 bpp, otherwise we may ;We are vaguely assuming h/w supports at least 8 bpp, otherwise we may
...@@ -794,6 +811,7 @@ mchsub_3 ...@@ -794,6 +811,7 @@ mchsub_3
TEQ R0, R1 ; if substitute mode TEQ R0, R1 ; if substitute mode
MOVNE R2, #0 ; then don't use shadow MOVNE R2, #0 ; then don't use shadow
DebugTX "FindOKMode reached"
CMP r1, #&100 CMP r1, #&100
BICCC r10, r1, #&80 BICCC r10, r1, #&80
...@@ -801,6 +819,7 @@ mchsub_3 ...@@ -801,6 +819,7 @@ mchsub_3
MOV R11, R10 MOV R11, R10
BL PushModeInfo BL PushModeInfo
BVS %FT07 ; [probably duff mode selector] BVS %FT07 ; [probably duff mode selector]
DebugTX "PushModeInfo done"
LDR R11, [R13, #wkScreenSize] ; get screen size for this mode LDR R11, [R13, #wkScreenSize] ; get screen size for this mode
LDR R9, [WsPtr, #TotalScreenSize] ; maximum allowed amount LDR R9, [WsPtr, #TotalScreenSize] ; maximum allowed amount
...@@ -828,7 +847,9 @@ mchsub_3 ...@@ -828,7 +847,9 @@ mchsub_3
[ International [ International
BL TranslateError BL TranslateError
] ]
DebugTX "Can't grow framestore"
07 07
DebugTX "Mode fail"
SETV ; indicate error SETV ; indicate error
Pull PC Pull PC
...@@ -911,10 +932,20 @@ TV_Mode_string ...@@ -911,10 +932,20 @@ TV_Mode_string
[ UseGraphicsV [ UseGraphicsV
Push "r0-r4" Push "r0-r4"
! 0, "FIXME: temporary code"
;!!!
[ {FALSE}
MOV r4, #GraphicsV_FramestoreAddress MOV r4, #GraphicsV_FramestoreAddress
BL CallGraphicsV BL CallGraphicsV
TEQ r4, #0 TEQ r4, #0
BNE %FT581 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 r1, r1, LSR #20 ; round size down to 1MB
MOV r2, r1, LSL #20 MOV r2, r1, LSL #20
ADD r0, r0, #1:SHL:20 ; round addr up to 1MB ADD r0, r0, #1:SHL:20 ; round addr up to 1MB
...@@ -1199,8 +1230,13 @@ PushModeInfo ROUT ...@@ -1199,8 +1230,13 @@ PushModeInfo ROUT
BL ReadMonitorType BL ReadMonitorType
PushModeInfoCommon PushModeInfoCommon
MOV r2, r10 ; r2 = original mode MOV r2, r10 ; r2 = original mode
BL OfferModeExtension ! 0, "FIXME: temporary code"
BEQ %FT30 ; [service claimed] ;!!!
; BL OfferModeExtension
; BEQ %FT30 ; [service claimed]
MOV r3,#0
MOV r4,#0
B %FT30
CMP r2, #&100 ; service not claimed - check if mode selector CMP r2, #&100 ; service not claimed - check if mode selector
MOVCC r10, r11 ; unrecognised mode number, so use substitute MOVCC r10, r11 ; unrecognised mode number, so use substitute
...@@ -1399,9 +1435,11 @@ GenerateModeSelectorVars Entry "r0,r1,r3-r8,r10-r12" ...@@ -1399,9 +1435,11 @@ GenerateModeSelectorVars Entry "r0,r1,r3-r8,r10-r12"
TST r2, #1 ; is it a new format sprite mode word? TST r2, #1 ; is it a new format sprite mode word?
BNE %FT50 ; [yes, so skip] BNE %FT50 ; [yes, so skip]
MOV r0, r2 MOV r0, r2
; DebugTX "ValModeSel"
BL ValidateModeSelector BL ValidateModeSelector
BVS %FT95 ; invalid - return error BVS %FT95 ; invalid - return error
LDMIB r2, {r4-r6} ; r4 = xres; r5 = yres; r6 = pixdepth LDMIB r2, {r4-r6} ; r4 = xres; r5 = yres; r6 = pixdepth
; DebugTX "Passed"
STR r6, [r9, #wkLog2BPC] ; log2bpc = log2bpp = pixdepth STR r6, [r9, #wkLog2BPC] ; log2bpc = log2bpp = pixdepth
STR r6, [r9, #wkLog2BPP] STR r6, [r9, #wkLog2BPP]
......
...@@ -604,4 +604,60 @@ FlushMouse ROUT ...@@ -604,4 +604,60 @@ FlushMouse ROUT
LTORG 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 END
...@@ -698,6 +698,7 @@ NSM_yshftfactor ...@@ -698,6 +698,7 @@ NSM_yshftfactor
; ;
SWICheckModeValid ROUT SWICheckModeValid ROUT
DebugTX "CheckModeValid"
VDWS WsPtr VDWS WsPtr
Push "r1,r9,lr" Push "r1,r9,lr"
BL FindOKMode ; out: r1 = substitute mode BL FindOKMode ; out: r1 = substitute mode
...@@ -772,6 +773,11 @@ SWICheckModeValid ROUT ...@@ -772,6 +773,11 @@ SWICheckModeValid ROUT
; ;
FindOKMode ROUT FindOKMode ROUT
! 0, "FIXME: temporary code"
;!!!
ADDS R1,R0,#0
MOV pc,lr
Push "r0,r2-r4,r10,r11,lr" Push "r0,r2-r4,r10,r11,lr"
BL ReadMonitorType BL ReadMonitorType
CMP r0, #&100 ; if it's a mode number CMP r0, #&100 ; if it's a mode number
......
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