NewReset 36.4 KB
Newer Older
Neil Turton's avatar
Neil Turton committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
; Copyright 1996 Acorn Computers Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
;     http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
        SUBT    => NewReset

Robert Sprowson's avatar
Robert Sprowson committed
17 18
; Reset types
SoftReset       * 0
Neil Turton's avatar
Neil Turton committed
19 20 21 22 23 24
PowerOnReset    * 1
ControlReset    * 2

; CMOS RAM resetting stuff:
CMOSLimit       * &F0

25 26 27 28 29 30 31 32 33
; Keyboard scan
KbdFlag_Ctrl    * 1:SHL:0
KbdFlag_Shift   * 1:SHL:1
KbdFlag_R       * 1:SHL:4
KbdFlag_T       * 1:SHL:5
KbdFlag_Delete  * 1:SHL:6
KbdFlag_Copy    * 1:SHL:7
KbdFlag_Present * 1:SHL:30
KbdFlag_Done    * 1:SHL:31
Neil Turton's avatar
Neil Turton committed
34 35 36 37 38 39 40 41

; GetConfiguredSize - convert CMOS address into amount of memory
; in:   r0 = CMOS address
; out:  r0 corrupted
;       r2 = amount in bytes

; NB this routine doesn't do screen size mangling (yet!)

42
GetConfiguredSize Entry "r1"
Jeffrey Lee's avatar
Jeffrey Lee committed
43
        LDR     r1, =ZeroPage
Neil Turton's avatar
Neil Turton committed
44 45 46 47 48 49 50 51 52 53 54 55 56 57
        LDR     r1, [r1, #Page_Size]
        ADRL    lr, PageShifts-1
        LDRB    r1, [lr, r1, LSR #12]   ; r1 = log2 pagesize
        MOV     r2, #127                ; mask of value

        TEQ     r0, #FontCMOS           ; if fontsize
        MOVEQ   r1, #12                 ; then in units of 4K, not pagesize
        MOVEQ   r2, #255                ; and use full byte

        BL      Read                    ; read CMOS ram
        AND     r2, r0, r2              ; value anded with mask
        MOV     r2, r2, LSL r1          ; and shifted up accordingly
        EXIT

58
; FudgeSomeAppSpace - move pages from free pool to application space
59 60 61 62
; r0 = number of pages to attempt to move
; r1 = where to store number of bytes moved
; r3 = base address of where to put memory
; r11 = ap + CB
63 64
FudgeSomeAppSpace
        Push    "lr"
Jeffrey Lee's avatar
Jeffrey Lee committed
65
        LDR     R10, =ZeroPage
Neil Turton's avatar
Neil Turton committed
66 67 68 69 70 71
        LDR     R10, [R10, #Page_Size]
        MUL     R0, R10, R0             ; get size in bytes
        MOV     R5, #0                  ; amount moved
        CMP     R0, #0
        BEQ     NoMoreMemory

Jeffrey Lee's avatar
Jeffrey Lee committed
72
        LDR     r4, =ZeroPage+FreePoolDANode
73 74
        LDR     r7, [r4, #DANode_PMP]
        LDR     r8, [r4, #DANode_PMPSize]
Neil Turton's avatar
Neil Turton committed
75
10
76 77 78 79 80 81 82
        CMP     r8, #0                          ; if no free memory left
        BEQ     %FT20                           ; then tidy up
        SUB     r8, r8, #1                      ; move free pool pointer backwards
        MOV     lr, #-1
        LDR     r2, [r7, r8, LSL #2]
        STR     lr, [r7, r8, LSL #2]
        BL      Call_CAM_Mapping
83 84 85 86 87 88 89 90 91 92 93 94

        ADD     r2, r3, r10                     ; end of clear
        MOV     lr, #0
        MOV     ip, lr
15
        STMIA   r3!, {ip,lr}                    ; advance "to" pointer
        STMIA   r3!, {ip,lr}
        STMIA   r3!, {ip,lr}
        STMIA   r3!, {ip,lr}
        TEQ     r2, r3
        BNE     %BT15

Neil Turton's avatar
Neil Turton committed
95 96 97 98
        ADD     r5, r5, r10                     ; one more page done
        SUBS    r0, r0, r10
        BNE     %BT10
20
99
        STR     r8, [r4, #DANode_PMPSize]
Neil Turton's avatar
Neil Turton committed
100 101 102 103
NoMoreMemory
        STR     R5, [R1]
        Pull    "PC"

104
; MassageScreenSize - called from screen DA creation and ReadSysInfo
Neil Turton's avatar
Neil Turton committed
105 106

MassageScreenSize ROUT
Kevin Bracey's avatar
Kevin Bracey committed
107
        Push    lr
Jeffrey Lee's avatar
Jeffrey Lee committed
108
        LDR     lr, =ZeroPage
109 110 111 112
        LDR     lr, [lr, #VideoSizeFlags]
        TST     lr, #OSAddRAM_VRAMNotForGeneralUse
        MOVNE   r0, lr, LSR #12
        MOVNE   r0, r0, LSL #12
Kevin Bracey's avatar
Kevin Bracey committed
113 114
        Pull    pc, NE

Neil Turton's avatar
Neil Turton committed
115 116
        CMP     r0, #0
        BNE     CmosScreenWillDo
Jeffrey Lee's avatar
Jeffrey Lee committed
117 118 119
      [ ZeroPage <> 0
        LDR     r0, =ZeroPage
      ]
Neil Turton's avatar
Neil Turton committed
120 121 122 123 124 125 126 127 128 129
        LDR     r0, [r0, #RAMLIMIT]
        CMP     r0, #512*1024
        MOVEQ   r0, #80*1024
        MOVNE   r0, #160*1024
CmosScreenWillDo
        CMP     r0, #20*1024            ; ensure mode 0 gettable
        ADDCC   r0, r0, r10             ; if not, then add another page
        BCC     CmosScreenWillDo
        CMP     r0, #ScreenMaxSize
        MOVHI   r0, #ScreenMaxSize
Kevin Bracey's avatar
Kevin Bracey committed
130
        Pull    pc
Neil Turton's avatar
Neil Turton committed
131 132 133

        LTORG

134 135
    ! 0, "*** DUMMY CONT_Break, soft breaks/resets will not work yet with HAL"
CONT_Break
136
        AddressHAL
137
        MOV     a1, #1
138
        LDR     a2, =L1PT
139
        CallHAL HAL_Reset
140

141 142 143
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Entry point from HALInit

144 145
Continue_after_HALInit

146 147 148 149 150 151
; OK, there is quite a bit of code poking below, to various addresses. We'll
; defer IMB consideration till the poking's done, then do a full IMB (full
; data cache clean). This avoids various little IMB's and removes chance of leaving
; some unnoticed poked code in data cache. The deferral should be safe, because none
; of the poked code will be used yet awhile (given that current IRQ hardware vector is
; not actually changed below).
Neil Turton's avatar
Neil Turton committed
152 153 154 155 156 157 158 159

; Copy default processor vector table and default preveneers.
; Code relies on preveneers being immediately after processor vector table
; but could easily be changed into 2 copy loops.
        ASSERT  ProcVecPreVeneers = ProcVec_End
        ASSERT  DefaultPreVeneers = DefaultProcVecs+ProcVec_End-ProcVec_Start

        ADRL    R0, DefaultProcVecs
Jeffrey Lee's avatar
Jeffrey Lee committed
160
        LDR     R1, =ZeroPage+ProcVec_Start
Neil Turton's avatar
Neil Turton committed
161 162 163 164 165 166 167 168 169 170
        MOV     R2, #ProcVec_End-ProcVec_Start+ProcVecPreVeneersSize
39
        LDR     R3, [R0], #4
        STR     R3, [R1], #4
        SUBS    R2, R2, #4
        BNE     %BT39

; copy handler addresses
        ADRL    R1, MOSROMVecs+4        ; don't copy to 0: key stuff is using
                                        ; it as workspace!
Jeffrey Lee's avatar
Jeffrey Lee committed
171 172
        LDR     R0, =ZeroPage+4
        LDR     R3, =ZeroPage+EndMOSROMVecs-MOSROMVecs
Neil Turton's avatar
Neil Turton committed
173 174 175 176

40
        LDR     R2, [R1], #4            ; N.B. IRQ handler better be same as the one in there
        STR     R2, [R0], #4
Jeffrey Lee's avatar
Jeffrey Lee committed
177
        TEQ     R0, R3
Neil Turton's avatar
Neil Turton committed
178 179
        BNE     %BT40

Kevin Bracey's avatar
Kevin Bracey committed
180 181
        ChangedProcVecs r0

Neil Turton's avatar
Neil Turton committed
182
 [ CacheCMOSRAM
Kevin Bracey's avatar
Kevin Bracey committed
183
        DebugTX "InitCMOSCache entry"
Neil Turton's avatar
Neil Turton committed
184
        BL      InitCMOSCache           ; initialise cache of CMOS RAM
185
        TEQ     R0, #0                  ; returns zero on failure
Jeffrey Lee's avatar
Jeffrey Lee committed
186 187 188
      [ ZeroPage <> 0
        LDREQ   R0, =ZeroPage
      ]
189 190 191
        LDREQ   R1, [R0, #HAL_StartFlags]
        ORREQ   R1, R1, #OSStartFlag_NoCMOS
        STREQ   R1, [R0, #HAL_StartFlags]
192 193 194 195 196 197
        BEQ     %FT41
        DebugTX "InitCMOSCache done"
        B       %FT42
41
        DebugTX "InitCMOSCache failed"
42
Neil Turton's avatar
Neil Turton committed
198 199 200
 ]

; Now copy the initialised data
Jeffrey Lee's avatar
Jeffrey Lee committed
201
        LDR     R0, =ZeroPage+IRQ1V
Neil Turton's avatar
Neil Turton committed
202
        ADRL    r1, StartData
Jeffrey Lee's avatar
Jeffrey Lee committed
203
        LDR     R3, =ZeroPage+(EndData-StartData+IRQ1V)
Neil Turton's avatar
Neil Turton committed
204 205 206
DatCopy
        LDR     R2, [R1], #4
        STR     R2, [R0], #4
Jeffrey Lee's avatar
Jeffrey Lee committed
207
        TEQ     R0, R3
Neil Turton's avatar
Neil Turton committed
208 209 210
        BNE     DatCopy

        ADR     r2, CONT_Break
Jeffrey Lee's avatar
Jeffrey Lee committed
211
        LDR     r0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
212 213
        STR     r2, [r0, #ResetIndirection]

214
        MOV     r3, #0                  ; zero-initialise abort list, and other key workspace
Jeffrey Lee's avatar
Jeffrey Lee committed
215
        STR     r3, [r0, #AbortIndirection]
216 217 218
 [ CompatibilityPage
        STRB    r3, [r0, #CompatibilityPageEnabled]
 ]
Neil Turton's avatar
Neil Turton committed
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237

; Now the SWI despatch + low part of SWI table
        ADRL    R3, DirtyBranch
        LDR     R0, =SWIDespatch
SVCTabCopy                              ; so copy the table
        LDR     R2, [R1], #4
        STR     R2, [R0], #4
        TEQ     R1, R3
        BNE     SVCTabCopy

; pad to 1K table here, rather than use ROM space
        ADRL    R2, NoSuchSWI
        LDR     R4, =1024+SvcTable      ; end of table
PadSVCTable
        CMP     R0, R4
        STRNE   R2, [R0], #4
        BNE     PadSVCTable

; now the dirty branch
Kevin Bracey's avatar
Kevin Bracey committed
238 239
        LDR     R1, [R1]
        STR     R1, [R0]
Neil Turton's avatar
Neil Turton committed
240

Robert Sprowson's avatar
Robert Sprowson committed
241
; conversion SWIs all go through same despatch point
Neil Turton's avatar
Neil Turton committed
242 243
        LDR     R0, =SvcTable
        ADRL    R1, despatchConvert
Robert Sprowson's avatar
Robert Sprowson committed
244 245 246
        STR     R1, [R0, #OS_ConvertStandardDateAndTime * 4]
        STR     R1, [R0, #OS_ConvertDateAndTime * 4]

Neil Turton's avatar
Neil Turton committed
247 248 249 250
        MOV     R2, #OS_ConvertHex1
conversionSWIfill
        STR     R1, [R0, R2, LSL #2]
        ADD     R2, R2, #1
Robert Sprowson's avatar
Robert Sprowson committed
251 252
        CMP     R2, #OS_ConvertVariform
        BLS     conversionSWIfill
Neil Turton's avatar
Neil Turton committed
253

254 255 256
; OK, that completes the poking around, some of which is code. Now let's
; do a full IMB type thing, to be safe
;
Jeffrey Lee's avatar
Jeffrey Lee committed
257
        LDR     r0, =ZeroPage
258
        ARMop   IMB_Full,,,r0
Kevin Bracey's avatar
Kevin Bracey committed
259
        DebugTX "IMB_Full done"
Neil Turton's avatar
Neil Turton committed
260

261 262 263 264 265 266 267
      [ CacheablePageTables
; If we want cacheable page tables, now is a good time to enable them
; (can't easily enable them earlier on due to the page tables being temporarily
; doubly-mapped during MMU init)
        BL      MakePageTablesCacheable
      ]

Neil Turton's avatar
Neil Turton committed
268 269
; Initialise CAO ptr to none.

Jeffrey Lee's avatar
Jeffrey Lee committed
270
        LDR     R0, =ZeroPage
271
        LDR     R1, =DuffEntry          ; nothing will be here!!
Neil Turton's avatar
Neil Turton committed
272 273 274 275 276
        STR     R1, [R0, #Curr_Active_Object]

; let's boogie with the CMOS for a bit
; read info and move as much memory as we can

277
        DebugTX "InitDynamicAreas"
Neil Turton's avatar
Neil Turton committed
278 279
        BL      InitDynamicAreas

280 281 282 283 284
; RMA
        Push    "r0-r12"
        MOV     r1, #ChangeDyn_RMA      ; Area number
        MOV     r2, #4096               ; Initial size
        MOV     r3, #RMAAddress         ; Base address
285
        MOV     r4, #AreaFlags_RMA      ; Area flags
286 287 288 289 290 291 292 293
        MOV     r5, #RMAMaxSize         ; Maximum size
        ADRL    r6, DynAreaHandler_RMA  ; Pointer to handler
        MOV     r7, r3                  ; Workspace ptr points at area itself
        ADRL    r8, AreaName_RMA        ; Title string - node will have to be reallocated
                                        ; after module init, to internationalise it
        BL      DynArea_Create          ; ignore any error, we're stuffed if we get one!
        Pull    "r0-r12"

Kevin Bracey's avatar
Kevin Bracey committed
294
; Screen
Neil Turton's avatar
Neil Turton committed
295 296 297 298
        Push    "r0-r12"
        MOV     r0, #ScreenSizeCMOS
        BL      Read

Jeffrey Lee's avatar
Jeffrey Lee committed
299
        LDR     r5, =ZeroPage
Neil Turton's avatar
Neil Turton committed
300 301
        LDR     r10, [r5, #Page_Size]   ; needed by MassageScreenSize
        MUL     r0, r10, r0             ; convert to bytes
302 303 304
        LDR     r5, [r5, #VideoSizeFlags] ; maximum size
        MOV     r5, r5, LSR #12
        MOV     r5, r5, LSL #12
Neil Turton's avatar
Neil Turton committed
305 306 307 308
        BL      MassageScreenSize

        MOV     r1, #ChangeDyn_Screen   ; area number
        MOV     r2, r0                  ; initial size
Kevin Bracey's avatar
Kevin Bracey committed
309
        MOV     r3, #-1                 ; Base address dynamic
310
        LDR     r4, =AreaFlags_Screen   ; area flags
Neil Turton's avatar
Neil Turton committed
311 312 313 314 315 316 317
        ADRL    r6, DynAreaHandler_Screen ; handler
        VDWS    r7                      ; workspace pointer
        MOV     r8, #0
        STR     r8, [r7, #CursorFlags]  ; put zero in CursorFlags as an indication that VDU not yet inited
        STR     r2, [r7, #TotalScreenSize]
        ADRL    r8, AreaName_Screen     ; area name
        BL      DynArea_Create
Kevin Bracey's avatar
Kevin Bracey committed
318
        STR     r3, [r7, #ScreenEndAddr]
Neil Turton's avatar
Neil Turton committed
319 320
        Pull    "r0-r12"

Kevin Bracey's avatar
Kevin Bracey committed
321
; SpriteArea
Neil Turton's avatar
Neil Turton committed
322 323
        Push    "r0-r12"
        MOV     r0, #0                  ; initialise SpriteSize to zero
Jeffrey Lee's avatar
Jeffrey Lee committed
324
      [ ZeroPage = 0
Neil Turton's avatar
Neil Turton committed
325
        STR     r0, [r0, #SpriteSize]   ; (fixes bug MED-00811)
Jeffrey Lee's avatar
Jeffrey Lee committed
326 327 328 329
      |
        LDR     r1, =ZeroPage
        STR     r0, [r1, #SpriteSize]   ; (fixes bug MED-00811)
      ]
Neil Turton's avatar
Neil Turton committed
330 331 332 333 334 335

        MOV     r0, #SpriteSizeCMOS     ; find out how much spritesize configured
        BL      GetConfiguredSize       ; in: r0 = CMOS address, out: r2 = size

        MOV     r1, #ChangeDyn_SpriteArea ; Area number
        MOV     r3, #-1                 ; Base address dynamic
336
        MOV     r4, #AreaFlags_Sprites  ; Area flags
337
        MOV     r5, #16*1024*1024       ; Maximum size (changed from -1, address space preservation)
Neil Turton's avatar
Neil Turton committed
338 339 340 341 342 343 344
        ADRL    r6, DynAreaHandler_Sprites ; Pointer to handler
        MOV     r7, #-1                 ; Use base address as workspace ptr
        ADRL    r8, AreaName_SpriteArea ; Title string - node will have to be reallocated
                                        ; after module init, to internationalise it
        BL      DynArea_Create          ; ignore any error, we're stuffed if we get one!
        Pull    "r0-r12"

Kevin Bracey's avatar
Kevin Bracey committed
345
; RAMDisc
Neil Turton's avatar
Neil Turton committed
346 347 348 349
        Push    "r0-r12"

        MOV     r1, #ChangeDyn_RamFS    ; Area number
        MOV     r3, #-1                 ; Base address dynamic
350 351 352
        ARM_read_ID r4
        AND     r4, r4, #&F000
        CMP     r4, #&A000
353 354
        MOVEQ   r4, #AreaFlags_RAMDisc_SA ; Area flags, if StrongARM  (introduced for Ursula)
        MOVNE   r4, #AreaFlags_RAMDisc  ; Area flags
355 356 357 358 359 360
      [ PMPRAMFS
        MOV     r5, #PMPRAMFS_Size*4096
        ORR     r4, r4, #DynAreaFlags_PMP
        MOV     r2, #0
        ORR     r4, r4, #DynAreaFlags_NeedsSpecificPages
        MOV     r9, #0
361
      |
362 363
        MOV     r0, #RAMDiscCMOS        ; find out how much RAM disc configured
        BL      GetConfiguredSize       ; in: r0 = CMOS address, out: r2 = size
364
        MOV     r5, #MaxRAMFS_Size*1024*1024      ; A trade off between nice big disc and complete waste of address space
365
      ]
Neil Turton's avatar
Neil Turton committed
366 367 368 369 370
        ADRL    r6, DynAreaHandler_RAMDisc ; Pointer to handler
        MOV     r7, #-1                 ; Use base address as workspace ptr
        ADRL    r8, AreaName_RAMDisc    ; Title string - node will have to be reallocated
                                        ; after module init, to internationalise it
        BL      DynArea_Create          ; ignore any error, we're stuffed if we get one!
371 372 373 374 375 376 377 378
      [ PMPRAMFS
        ; Currently, physical memory pools must be created with 0 size, then resized afterwards
        MOV     r0, #RAMDiscCMOS        ; find out how much RAM disc configured
        BL      GetConfiguredSize       ; in: r0 = CMOS address, out: r2 = size
        MOVS    r1, r2
        MOV     r0, #ChangeDyn_RamFS
        SWINE   XOS_ChangeDynamicArea
      ]
Neil Turton's avatar
Neil Turton committed
379 380
        Pull    "r0-r12"

Kevin Bracey's avatar
Kevin Bracey committed
381
; FontArea
Neil Turton's avatar
Neil Turton committed
382 383 384 385 386 387
        Push    "r0-r12"
        MOV     r0, #FontCMOS           ; find out how much font cache configured
        BL      GetConfiguredSize       ; in: r0 = CMOS address, out: r2 = size

        MOV     r1, #ChangeDyn_FontArea ; Area number
        MOV     r3, #-1                 ; Base address dynamic
388
        MOV     r4, #AreaFlags_FontArea ; Area flags
Kevin Bracey's avatar
Kevin Bracey committed
389 390
        MOV     r5, #32*1024*1024       ; Maximum size changed from -1 for Ursula (limit address
                                        ; space usage on large memory machines)
Neil Turton's avatar
Neil Turton committed
391 392 393 394 395 396 397
        ADRL    r6, DynAreaHandler_FontArea ; Pointer to handler
        MOV     r7, #-1                 ; Use base address as workspace ptr
        ADRL    r8, AreaName_FontArea   ; Title string - node will have to be reallocated
                                        ; after module init, to internationalise it
        BL      DynArea_Create          ; ignore any error, we're stuffed if we get one!
        Pull    "r0-r12"

398 399
        LDR     R0, =(512*1024):SHR:12  ; 512k of RAM in aplspace should be plenty for ROM init. Theoretically we don't need any at all, but having some there should make it easier to debug any ROM init failures.
        MOV     R3, #AppSpaceStart      ; aplwork start
Jeffrey Lee's avatar
Jeffrey Lee committed
400
        LDR     R1, =ZeroPage+AplWorkSize ; aplwork size
401
        MOV     r11, #AreaFlags_AppSpace
402
        BL      FudgeSomeAppSpace       ; put some memory in aplspace
Neil Turton's avatar
Neil Turton committed
403

Jeffrey Lee's avatar
Jeffrey Lee committed
404
        LDR     R0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
405
        LDR     R1, [R0, #AplWorkSize]
406
        ADD     R1, R1, #AppSpaceStart
Neil Turton's avatar
Neil Turton committed
407 408 409
        STR     R1, [R0, #AplWorkSize]
        STR     R1, [R0, #MemLimit]

410
        DebugTX "InitVectors"
411
        BL      InitVectors             ; ready for OsByte to read mode
Neil Turton's avatar
Neil Turton committed
412

Jeffrey Lee's avatar
Jeffrey Lee committed
413 414 415 416 417
        LDR     R1, =ZeroPage+ModuleSWI_HashTab
        MOV     R2, #ModuleSHT_Entries
      [ ZeroPage <> 0
        MOV     R0, #0
      ]
Neil Turton's avatar
Neil Turton committed
418 419
clearmswis
        SUBS    R2, R2, #1
Jeffrey Lee's avatar
Jeffrey Lee committed
420 421 422
        STR     R0, [R1, R2, LSL #2]
        BGT     clearmswis

423
     [  International
Jeffrey Lee's avatar
Jeffrey Lee committed
424 425 426
      [ ZeroPage <> 0
        LDR     R2, =ZeroPage
      ]
Neil Turton's avatar
Neil Turton committed
427
        MOV     R1, #-1                                 ; We don't have a message file yet !
Jeffrey Lee's avatar
Jeffrey Lee committed
428 429
        STRB    R1, [R2, #ErrorSemaphore]               ; Don't translate errors.
        STR     R0, [R2, #KernelMessagesBlock]          ; No message file open.
430
      [ CacheCommonErrors
Jeffrey Lee's avatar
Jeffrey Lee committed
431
        STR     R0, [R2, #CachedErrorBlocks]            ; No cached errors
432
      ]
Neil Turton's avatar
Neil Turton committed
433 434
     ]

435 436
        ; Make the choice between PowerOn and Hard reset based purely on
        ; the state of the POR bit and NOT on whether memory was cleared.
Jeffrey Lee's avatar
Jeffrey Lee committed
437
        LDR     R0, =ZeroPage+HAL_StartFlags
438 439
        LDR     R1, [R0]
        TST     R1, #OSStartFlag_POR
Neil Turton's avatar
Neil Turton committed
440 441
        MOVNE   R0, #PowerOnReset
        MOVEQ   R0, #ControlReset
Jeffrey Lee's avatar
Jeffrey Lee committed
442
        LDR     R1, =ZeroPage+OsbyteVars + :INDEX: LastBREAK
Neil Turton's avatar
Neil Turton committed
443 444
        STRB    R0, [R1]

445
        DebugTX "InitIRQ1"
446
        BL      InitialiseIRQ1Vtable
Neil Turton's avatar
Neil Turton committed
447

Jeffrey Lee's avatar
Jeffrey Lee committed
448
        LDR     R3, =ZeroPage
Neil Turton's avatar
Neil Turton committed
449
        ADRL    R1, Default_PIRQHandler_Node
Jeffrey Lee's avatar
Jeffrey Lee committed
450 451
        STR     R1, [R3, #PIRQ_Chain]
        STR     R1, [R3, #PFIQasIRQ_Chain]
452
        ASSERT Default_PFIQasIRQHandler_Node = Default_PIRQHandler_Node
Neil Turton's avatar
Neil Turton committed
453 454

        MOV     R0, #0                  ; put in IRQ handler, word at 0
Jeffrey Lee's avatar
Jeffrey Lee committed
455 456 457
        STRB    r0, [r3, #FIQclaim_interlock]
        STRB    r0, [r3, #CallBack_Flag]
        STR     r0, [r3, #CallBack_Vector]
458
        STR     r0, [r3, #TickNodeChain]
Neil Turton's avatar
Neil Turton committed
459

460 461 462 463 464 465 466
; Create the Branch Through 0 Trampoline in the system heap
        MOV     R3, #Branch0_Trampoline_Size
        BL      ClaimSysHeapNode
        ADRVCL  R0, Branch0_Trampoline
        ASSERT  Branch0_Trampoline_Init = 20
        LDMVCIA R0, {R1,R3,R4,R5,R14}
        STMVCIA R2, {R1,R3,R4,R5,R14}
Jeffrey Lee's avatar
Jeffrey Lee committed
467
        LDRVC   R0, =ZeroPage
468 469
        STRVC   R2, [R0, #ProcVec_Branch0]

Neil Turton's avatar
Neil Turton committed
470 471 472 473 474 475
        LDR     R1, BranchThroughZeroInstruction2
        STR     R1, [R0]                                ; put branch through 0 code at 0

        LDR     R1, RealIRQHandler
        STR     R1, [R0, #&18]

476
        DebugTX "IMB_Full"
477

478 479
        ; we need to do an IMB type thing for modifying code in vector area,
        ; and for copying irq handler code
480
        ARMop   IMB_Full,,,r0
Kevin Bracey's avatar
Kevin Bracey committed
481
        ChangedProcVecs r0
Neil Turton's avatar
Neil Turton committed
482

483
        LDR     r0,=ZeroPage
Neil Turton's avatar
Neil Turton committed
484 485
        MOV     R1, #&100
        STR     R1, [R0, #RCLimit]
Jeffrey Lee's avatar
Jeffrey Lee committed
486 487
        MOV     R1, #0
        STR     R1, [R0, #ReturnCode]
Neil Turton's avatar
Neil Turton committed
488

489
; now put in error handler and escape handler
Neil Turton's avatar
Neil Turton committed
490 491 492
        BL      DEFHAN
        BL      DEFHN2
        MOV     R0, #ExceptionDumpArea
Jeffrey Lee's avatar
Jeffrey Lee committed
493
        LDR     R1, =ZeroPage+DUMPER
Neil Turton's avatar
Neil Turton committed
494 495 496
        SWI     XOS_ChangeEnvironment

        VDWS    WsPtr                   ; main MOS initialisation
497
        DebugTX "VduInit"
Neil Turton's avatar
Neil Turton committed
498
        BL      VduInit
499
        DebugTX "ExecuteInit"
Neil Turton's avatar
Neil Turton committed
500
        BL      ExecuteInit
501
        DebugTX "KeyInit"
Neil Turton's avatar
Neil Turton committed
502
        BL      KeyInit
503
        DebugTX "MouseInit"
Neil Turton's avatar
Neil Turton committed
504
        BL      MouseInit
505
        DebugTX "OscliInit"
Neil Turton's avatar
Neil Turton committed
506 507
        BL      OscliInit               ; before initialising modules

508
        DebugTX "Enabling IRQs"
Kevin Bracey's avatar
Kevin Bracey committed
509
        WritePSRc SVC_mode, R14         ; enable IRQs
510
        DebugTX "IRQs on"
Neil Turton's avatar
Neil Turton committed
511

Kevin Bracey's avatar
Kevin Bracey committed
512 513 514
 [ DebugTerminal
        MOV     R0, #RdchV
        ADRL    R1, DebugTerminal_Rdch
Jeffrey Lee's avatar
Jeffrey Lee committed
515
        LDR     R2, =ZeroPage
Kevin Bracey's avatar
Kevin Bracey committed
516 517 518 519 520
        LDR     R2, [R2, #HAL_Workspace]
        SWI     XOS_Claim
        MOV     R0, #WrchV
        ADRL    R1, DebugTerminal_Wrch
        SWI     XOS_Claim
521
        DebugTX "Debug terminal on"
Kevin Bracey's avatar
Kevin Bracey committed
522 523
 ]

Neil Turton's avatar
Neil Turton committed
524 525 526
        BL      InitialiseMode          ; select correct screen mode, in case any
                                        ; module prints anything in initialisation

527
        DebugTX "HAL_InitDevices"
Ben Avison's avatar
Ben Avison committed
528 529
        AddressHAL
        MOV     R0, #0
Jeffrey Lee's avatar
Jeffrey Lee committed
530
      [ ZeroPage = 0
Ben Avison's avatar
Ben Avison committed
531 532
        STR     R0, [R0, #DeviceCount]
        STR     R0, [R0, #DeviceTable]
Jeffrey Lee's avatar
Jeffrey Lee committed
533 534 535 536 537
      |
        LDR     R1, =ZeroPage
        STR     R0, [R1, #DeviceCount]
        STR     R0, [R1, #DeviceTable]
      ]
Ben Avison's avatar
Ben Avison committed
538
        CallHAL HAL_InitDevices         ; get HAL to register any devices it has
539
        BL      LookForHALCacheController
540
        DebugTX "InitVariables"
Neil Turton's avatar
Neil Turton committed
541
        BL      InitVariables
542
        DebugTX "AMBControl_Init"
Neil Turton's avatar
Neil Turton committed
543
        BL      AMBControl_Init         ; initialise AMBControl section
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723

        AddressHAL
        CallHAL HAL_KbdScanDependencies
        MOV     r5, r0
        DebugTX "ModuleInitForKbdScan"
        BL      ModuleInitForKbdScan

; minimal post module setup for keyboard scan

        BL      KeyPostInit

; scan keyboard for interesting keypresses R/T/Delete/End + Ctrl/Shift or timeout

        LDR     r3, =ZeroPage
        LDR     r6, [r3, #HAL_StartFlags]
        TST     r6, #OSStartFlag_RAMCleared
        MOVEQ   r6, #0                  ; RAM clear from start of free pool
        MOVNE   r6, #-1                 ; RAM clear not needed

        LDR     r3, [r3, #MetroGnome]
        ADD     r3, r3, #300            ; timeout (cs)
02
        CMP     r5, #-1                 ; HAL gave no KbdScan details
        BEQ     %FT04

        TST     r4, #KbdFlag_Present
        BNE     %FT03

        LDR     r0, =ZeroPage+KeyWorkSpace
        LDRB    r0, [r0, #:INDEX:KbId]  ; check if anyone registered with KeyV
        CMP     r0, #&20                ; same limit as GetCountry
        BCS     %FT04

        ORR     r4, r4, #KbdFlag_Present
        DebugTX "KbdFlag_Present"
03
        MOV     r0, #OsByte_INKEY
        MOV     r1, #0 :EOR: &7F        ; scan from shift upwards
        MOV     r2, #255
        SWI     XOS_Byte
        TEQ     r1, #0
        ORREQ   r4, r4, #KbdFlag_Shift
        TEQ     r1, #1
        ORREQ   r4, r4, #KbdFlag_Ctrl
        TEQ     r1, #51
        ORREQ   r4, r4, #KbdFlag_R
        TEQ     r1, #35
        ORREQ   r4, r4, #KbdFlag_T
        TEQ     r1, #89
        ORREQ   r4, r4, #KbdFlag_Delete
        TEQ     r1, #105
        ORREQ   r4, r4, #KbdFlag_Copy
04
        SWI     XOS_LeaveOS
        SWI     XOS_EnterOS             ; callbacks

        ; Prior to getting here, ClearWkspRAM cleared low OS workspace & ScratchSpace, and
        ; Init_MapInRAM_Clear has selectively cleared other early allocations. That leaves
        ; everything from InitDynamicAreas
        ;   RMA => not cleared, it's in use
        ;   Screen => not cleared, the next CLS will do that
        ;   SpriteArea, RAMDisc, FontArea => not cleared, clients write their own data structures
        ; and
        ;   Application space (from FudgeSomeAppSpace) => cleared unconditionally
        ;   Free pool => clear now if HAL didn't
        ; left to do.
        MOV     r0, r6
        BL      ClearFreePoolSection
        MOV     r6, r0
        CMP     r6, #-1
        BNE     %BT02                   ; the show's not over until the RAM clear is done

        CMP     r5, #-1
        BEQ     %FT05                   ; HAL gave no KbdScan details

        TST     r4, #KbdFlag_Shift :OR: KbdFlag_Ctrl :OR: KbdFlag_R :OR: KbdFlag_T :OR: KbdFlag_Delete
        BNE     %FT05                   ; exciting key press beats a timeout

        LDR     r0, =ZeroPage
        LDR     r0, [r0, #MetroGnome]
        CMP     r0, r3                  ; timed out?
        BCC     %BT02
05
        ORR     r4, r4, #KbdFlag_Done
        Push    "r4"                    ; save until after MOSInit

; Clear temp ws skipped earlier
        LDR     R0, =ZeroPage+InitWsStart
        MOV     R1, #0
        MOV     R2, #InitWsEnd - InitWsStart
        BL      memset

cmos_checks
        MOV     R3, #-1                 ; do all CMOS if we do any
      [ ValidateCMOS
; Do a POR if some super-critical values are shagged or if checksum is invalid.
        BL      ValChecksum             ; Always check the checksum
        BNE     cmos_reset
      ]

; IF power-on bit set AND R/T/Del/Copy pressed THEN reset CMOS RAM

        LDR     R0, =ZeroPage+HAL_StartFlags
        LDR     R1, [R0]
        TST     R1, #OSStartFlag_NoCMOS ; If no CMOS, reset for sensible cache
        BNE     cmos_reset
        TST     R1, #OSStartFlag_POR
        BEQ     no_cmos_reset           ; not a power on reset
        DebugTX "POR detected"
        TST     R1, #OSStartFlag_NoCMOSReset
        BNE     no_cmos_reset
        TST     R1, #OSStartFlag_CMOSReset
        BNE     cmos_reset

        TST     R4, #KbdFlag_R:OR:KbdFlag_T:OR:KbdFlag_Delete:OR:KbdFlag_Copy
        LDRNE   R3, =ZeroPage
        MOVNE   R14, #1
        STRNEB  R14, [R3, #MentionCMOSReset]
        BEQ     no_cmos_reset           ; power on bit checked again there

; CMOS reset detectified.
; Wipe it, then squirt in the MOS's table of default values

        TST     R4, #KbdFlag_Copy:OR:KbdFlag_Delete
        MOVNE   R3, #-1                 ; Del or Copy does all RAM
        MOVEQ   R3, #UserCMOS           ; R or T just system
      [ ChecksumCMOS
        BL      ValChecksum             ; unless the CMOS ram's corrupt ..
        MOVNE   R3, #-1                 ; .. then blast it anyway.
      ]
cmos_reset
        DebugTX "Reset CMOS"

        MOV     R4, #0
cmrlp
        CMP     R3, #-1
        BEQ     cmrall                  ; ignore system-only wipe checks
        CMP     R4, #UserCMOS
        MOVEQ   R4, #&50                ; skip User (30-45) & 3rd party (46-59) & high podules (60-79)
        BEQ     cmrall
        CMP     R4, #PoduleCMOS
        MOVEQ   R4, #&80                ; skip low podules (112-127)
        BEQ     cmrall
        TEQ     R4, #NewADFSCMOS        ; documented in 'Troubleshooting' in
        TEQNE   R4, #CountryCMOS        ; the RISC OS 3.7 user guide as preserved
        BEQ     cmrskip
cmrall
        MOV     R1, R4
        BL      NVMemory_ResetValue     ; get the reset value
        MOVS    R1, R2                  ; when -ve, leave alone
        MOVPL   R0, R4
        BLPL    Write                   ; CMOS(R0) := R1
cmrskip
        ADD     R4, R4, #1
        CMP     R4, #CMOSLimit
        BCC     cmrlp

; IF R or Delete pressed THEN set sync 0 ELSE set sync Auto
        LDR     R4, [SP]
        TST     R4, #KbdFlag_R:OR:KbdFlag_Delete
        MOV     R0, #VduCMOS
        MOVNE   R1, #MonitorTypeAuto :OR: Sync_Auto     ; if R or Del
        MOVEQ   R1, #MonitorTypeAuto :OR: Sync_Separate ; if T or Copy
        BL      Write

      [ ChecksumCMOS
        BL      MakeChecksum            ; create a valid checksum
      ]
        B       init_other_modules

no_cmos_reset
        MOV     r0, #SystemSpeedCMOS
        BL      Read
        BIC     r1, r0, #CMOSResetBit   ; clear bit indicating CMOS reset
        MOV     r0, #SystemSpeedCMOS
        BL      Write

init_other_modules

; now go back and load the other modules, scan podules, accounting for frugal bits
724
        DebugTX "ModuleInit"
725
        BL      ModuleInit
Neil Turton's avatar
Neil Turton committed
726 727 728 729 730 731 732 733

        MOV     R0, #0                  ; shrink sysheap as far as will go.
        SUB     R1, R0, #4*1024*1024
        SWI     XOS_ChangeDynamicArea
        MOV     R0, #ReadCMOS
        MOV     R1, #SysHeapCMOS
        SWI     XOS_Byte
        AND     R2, R2, #2_111111       ; mask to same size as status
Jeffrey Lee's avatar
Jeffrey Lee committed
734
        LDR     R0, =ZeroPage
Neil Turton's avatar
Neil Turton committed
735
        LDR     R0, [R0, #Page_Size]
736
        MUL     R3, R0, R2              ; size spare wanted
Neil Turton's avatar
Neil Turton committed
737 738 739 740 741 742 743 744 745 746 747
        BL      ClaimSysHeapNode
        MOV     R0, #HeapReason_Free
        SWI     XOS_Heap

        MOV     R0, #ReadCMOS
        MOV     R1, #FileLangCMOS
        SWI     XOS_Byte
        MOV     R1, R2
        MOV     R0, #FSControl_SelectFS ; set configured filing system
        SWI     XOS_FSControl

Neil Turton's avatar
Neil Turton committed
748 749 750 751 752
  [ DebugROMInit
        SWI     XOS_WriteS
        =       "Service_PostInit",0
        SWI     XOS_NewLine
  ]
Neil Turton's avatar
Neil Turton committed
753 754 755
        MOV     r1, #Service_PostInit   ; issue post-initialisation service
        BL      Issue_Service

Neil Turton's avatar
Neil Turton committed
756 757 758 759 760
  [ DebugROMInit
        SWI     XOS_WriteS
        =       "callbacks",0
        SWI     XOS_NewLine
  ]
Ben Avison's avatar
Ben Avison committed
761
        SWI     XOS_LeaveOS
Neil Turton's avatar
Neil Turton committed
762 763
        SWI     XOS_EnterOS             ; switch back to SVC mode (IRQs, FIQs enabled)

764
      [ International                   ; Open the kernel messages file.
Jeffrey Lee's avatar
Jeffrey Lee committed
765
        LDR     r0, =ZeroPage+KernelMessagesBlock+4
766
        ADRL    r1, MessageFileName
Neil Turton's avatar
Neil Turton committed
767 768 769
        MOV     r2, #0                  ; Use file directly.
        SWI     XMessageTrans_OpenFile
        MOVVC   r0, #-1
770
        LDRVC   lr, =ZeroPage
Jeffrey Lee's avatar
Jeffrey Lee committed
771
        STRVC   r0, [lr, #KernelMessagesBlock]  ; Message file is now open.
772 773 774

        ASSERT  (ZeroPage :AND: 255) = 0  ; if we've managed to open message file
        STRVCB  lr, [lr, #ErrorSemaphore] ; then allow errors to be translated
Neil Turton's avatar
Neil Turton committed
775 776
      ]

777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802
        ; Update RTC now all the modules are running
        SWI     XOS_ResyncTime

        ; OS_ReadSysInfo 9,2 now relies on the Territory module, which may
        ; enable IRQs. But the PRMs say OS_ReadSysInfo shouldn't alter the IRQ
        ; state. So call it once here just to initialise the string which it
        ; uses the Territory module to generate.
        ; This won't account for any modules using it during ModuleInit, but
        ; that should be pretty rare (or at least rare from within IRQ-sensitive
        ; code)
        ;
        ; Must also be after Service_PostInit to give TerritoryManager opportunity
        ; to load disc based territories.
        MOV     R0, #9
        MOV     R1, #2
        SWI     XOS_ReadSysInfo

      [ UseNewFX0Error
        ; Also, *FX 0
        BL      InitNewFX0Error
      ]
      [ CompatibilityPage
        ; Enable low zero page compatibility page
        MOV     R0, #OSMemReason_Compatibility
        MOV     R1, #1
        SWI     XOS_Memory
Neil Turton's avatar
Neil Turton committed
803 804 805
      ]

        BL      InitialiseMode
Robert Sprowson's avatar
Robert Sprowson committed
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
        LDR     R0, =ZeroPage
        LDRB    R14, [R0, #MentionCMOSReset]
        TEQ     R14, #0
        BEQ     %FT12
      [ International
        SWI     XOS_WriteI+10
        BVS     %FT09
        BL      WriteS_Translated
        =       "CmosRst:CMOS RAM reset, press ESCAPE to continue",0
        ALIGN
09
      |
        SWI     XOS_WriteS
        =       10,"CMOS RAM reset, press ESCAPE to continue",0
        ALIGN
      ]
10
        SWI     XOS_ReadEscapeState
        BCC     %BT10
825
        MOV     R0, #OsByte_ClearEscape
Robert Sprowson's avatar
Robert Sprowson committed
826 827 828
        SWI     XOS_Byte                ; Clear the condition
        SWI     XOS_WriteI+12           ; Clear the screen
12
Neil Turton's avatar
Neil Turton committed
829 830 831 832
        SWI     XOS_WriteS
        =       10, "$SystemName ", 0   ; now RISC OS (no +) again
        ALIGN

Kevin Bracey's avatar
Kevin Bracey committed
833 834 835 836
        MOV     R0, #8
        ORR     R0, R0, #&500
        SWI     XOS_Memory              ; returns amount of soft ROM (pages) in r1
        MOVVS   R1, #0
Robert Sprowson's avatar
Robert Sprowson committed
837 838 839

        LDR     R0, =ZeroPage
        LDR     R0, [R0, #RAMLIMIT]
Kevin Bracey's avatar
Kevin Bracey committed
840 841 842
        MLA     R0, R1, R2, R0          ; convert pages to bytes and add in

        MOV     R0, R0, LSR #20         ; /(1024*1024) down to megabytes
Neil Turton's avatar
Neil Turton committed
843 844 845 846 847 848 849
        LDR     R1, =GeneralMOSBuffer
        MOV     R2, #?GeneralMOSBuffer
        SWI     XOS_ConvertInteger4
        SWI     XOS_Write0
        SWI     XOS_WriteS
        =       "MB", 10,13, 10, 0      ; title complete
        ALIGN
Neil Turton's avatar
Neil Turton committed
850

851
        BL      ARM_PrintProcessorType
Neil Turton's avatar
Neil Turton committed
852

Robert Sprowson's avatar
Robert Sprowson committed
853
        MOV     r0, #0                  ; Set DomainId to 0 every reset
Jeffrey Lee's avatar
Jeffrey Lee committed
854
      [ ZeroPage = 0
Neil Turton's avatar
Neil Turton committed
855
        STR     r0, [r0, #DomainId]     ; before calling anyone
Jeffrey Lee's avatar
Jeffrey Lee committed
856 857 858 859
      |
        LDR     r1, =ZeroPage
        STR     r0, [r1, #DomainId]     ; before calling anyone
      ]
Neil Turton's avatar
Neil Turton committed
860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875

; issue reset service call

        MOV     R1, #Service_Reset
        SWI     XOS_ServiceCall

; now set up the default FIQ owner

        MOV     R1, #Service_ClaimFIQ
        SWI     XOS_ServiceCall

        MOV     R1, #Service_ReleaseFIQ
        SWI     XOS_ServiceCall

        BL      PostInit

876
        SWI     XOS_WriteI+7            ; go beep! Yaay!
Neil Turton's avatar
Neil Turton committed
877

878 879 880 881 882 883 884 885 886
; Now that ROM modules have mostly finished allocating memory, move a large
; chunk of the free memory from the free pool into application space so that
; the boot sequence and configured language have something to play around with
; (particularly if booting into BASIC!)
; However be careful not to move everything, otherwise anything which locks
; application space during boot could cripple important background processes
; like USB
        LDR     r0, =ZeroPage
        LDR     r1, [r0, #AplWorkSize]
887 888 889 890
        LDR     r0, [r0, #FreePoolDANode+DANode_PMPSize]
        CMP     r0, #DynArea_PMP_BigPageCount
        MOVLO   r0, r0, LSL #12
        LDRHS   r0, =DynArea_PMP_BigByteCount
891 892 893 894 895 896
        SUB     r1, r1, #32*1024
        SUB     r1, r1, r0
        MOV     r1, r1, ASR #1          ; 50% each sounds fair
        MOV     r0, #ChangeDyn_FreePool
        SWI     XOS_ChangeDynamicArea

897 898 899 900
        MOV     r0, #OsByte_RW_LastResetType
        MOV     r1, #0
        MOV     r2, #&FF
        SWI     XOS_Byte
Neil Turton's avatar
Neil Turton committed
901
        CMP     r1, #PowerOnReset
902
        BNE     %FT70
Neil Turton's avatar
Neil Turton committed
903

Jeffrey Lee's avatar
Jeffrey Lee committed
904
        LDR     r1, =ZeroPage+HAL_StartFlags
905 906
        LDR     r1, [r1]
        TST     r1, #OSStartFlag_NoCMOSReset
907
        BNE     %FT70
Neil Turton's avatar
Neil Turton committed
908

909
; if any keypad-numeric key pressed, reconfigure monitor type
Neil Turton's avatar
Neil Turton committed
910

911
        MOV     r0, #OsByte_ScanKeyboard        ; scan keyboard
Neil Turton's avatar
Neil Turton committed
912 913 914 915 916 917
        MOV     r1, #&FF                        ; starting at (&FF + 1) AND &FF
60
        ADD     r1, r1, #1
        AND     r1, r1, #&FF
        SWI     XOS_Byte
        TEQ     r1, #&FF                        ; if no key down
918
        BEQ     %FT70                           ; then give up
Neil Turton's avatar
Neil Turton committed
919 920 921 922 923

        ADR     r2, MonitorKeypadTable
62
        LDRB    r14, [r2], #2                   ; search for key in table
        TEQ     r14, #&FF
924
        BEQ     %FT70                           ; give up, key not in table
Neil Turton's avatar
Neil Turton committed
925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946
        TEQ     r1, r14
        BNE     %BT62
        LDRB    r3, [r2, #-1]                   ; get corresponding CMOS bits
        MOV     r0, #ReadCMOS
        MOV     r1, #VduCMOS
        SWI     XOS_Byte
        BIC     r2, r2, #MonitorTypeBits
        ORR     r2, r2, r3
        MOV     r0, #WriteCMOS
        SWI     XOS_Byte

        TEQ     r3, #MonitorTypeAuto            ; if we're setting monitortype auto
        BNE     %FT64
        ADRL    r0, ModeCMOSTable +8            ; then configure mode auto
        LDR     r2, [r0, #-8]                   ; (load auto value)
        BL      WriteMultiField
        ADRL    r0, SyncCMOSTable +8            ; and configure sync auto
        LDR     r2, [r0, #-8]                   ; (load auto value)
        BL      WriteMultiField

64
        BL      InitialiseMode
Neil Turton's avatar
Neil Turton committed
947

Neil Turton's avatar
Neil Turton committed
948 949
      [ International
        SWI     XOS_WriteI+10
Robert Sprowson's avatar
Robert Sprowson committed
950 951 952
        BVS     %FT65
        BL      WriteS_Translated
        =       "MonType:Monitor type reconfigured",10,13,10,0
Neil Turton's avatar
Neil Turton committed
953
        ALIGN
Robert Sprowson's avatar
Robert Sprowson committed
954
65
Neil Turton's avatar
Neil Turton committed
955 956
      |
        SWI     XOS_WriteS
Robert Sprowson's avatar
Robert Sprowson committed
957
        =       10,"Monitor type reconfigured",10,13,10,0
Neil Turton's avatar
Neil Turton committed
958 959
        ALIGN
      ]
960 961 962 963
        B       %FT70

RealIRQHandler
        LDR     PC, .-&18+ProcVec_IRQ
Neil Turton's avatar
Neil Turton committed
964 965 966 967

BranchThroughZeroInstruction2
        LDR     PC, .+ProcVec_Branch0

968 969
        LTORG

Neil Turton's avatar
Neil Turton committed
970 971 972 973 974 975 976 977 978 979 980 981 982
MonitorKeypadTable      ; internal key number, CMOS bits
        =       106, MonitorType0
        =       107, MonitorType1
        =       124, MonitorType2
        =       108, MonitorType3
        =       122, MonitorType4
        =       123, MonitorType5
        =       26,  MonitorType6
        =       27,  MonitorType7
        =       42,  MonitorType8
        =       43,  MonitorType9
        =       76,  MonitorTypeAuto    ; keypad dot
        =       &FF
Neil Turton's avatar
Neil Turton committed
983 984
        ALIGN 32

Robert Sprowson's avatar
Robert Sprowson committed
985 986 987 988 989
      [ International
MessageFileName DCB     "Resources:$.Resources.Kernel.Messages",0
        ALIGN
      ]

Neil Turton's avatar
Neil Turton committed
990 991 992 993 994
70

; Deal with SHIFT pressed/SHIFT-BREAK configured:
; do appropriate FSControl if wanted

995
        Pull    "R4"                    ; recover KbdFlag bits
Neil Turton's avatar
Neil Turton committed
996

997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
        TST     R4, #KbdFlag_Present    ; first check kbd there
        BNE     shifty_boot

      [ International
        BL      WriteS_Translated
        =       "NoKbd:No keyboard present - autobooting", 10,13,0
        ALIGN
      |
        SWI     XOS_WriteS
        =       7, "No keyboard present - autobooting", 10,13,0
        ALIGN
      ]
        B       Hortoculture_Kicking
Neil Turton's avatar
Neil Turton committed
1010

1011 1012
shifty_boot
        MOV     R0, #OsByte_RW_StartupOptions
Neil Turton's avatar
Neil Turton committed
1013 1014 1015
        MOV     R1, #0
        MOV     R2, #&FF                ; read shifty state
        SWI     XOS_Byte
1016 1017 1018 1019
        TST     R4, #KbdFlag_Shift
        EORNE   R1, R1, #8              ; invert sense
        TST     R1, #8
        BNE     %FT80                   ; no boot when set
Neil Turton's avatar
Neil Turton committed
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037

Hortoculture_Kicking
        MOV     R0, #FSControl_BootupFS
        SWI     XOS_FSControl
        BVC     %FT80

        Push    "r3,r4"
        ADD     r1, r0, #4              ; Set Boot$Error if it failed (Desktop will report it).
        ADR     r0, str_booterror
        MOV     r2, #1024               ; Big enough that terminator will be reached.
        MOV     r3, #0
        MOV     r4, #VarType_String
        SWI     XOS_SetVarVal
        SUBVS   r0, r1, #4              ; If setting Boot$Error failed then report original error as before.
        BLVS    PrintError
        SWIVS   XOS_NewLine
        Pull    "r3,r4"
80
1038
; if keypad-* pressed, drop into * prompt
Neil Turton's avatar
Neil Turton committed
1039

1040 1041 1042 1043 1044 1045
        MOV     r0, #OsByte_INKEY
        MOV     r1, #KeyScan_NumPadStar :AND: &FF
        MOV     r2, #&FF
        SWI     XOS_Byte
        TEQ     r1, #&FF
        TEQEQ   r2, #&FF
Neil Turton's avatar
Neil Turton committed
1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
        BEQ     DoStartSuper            ; EQ -> start up supervisor

; Start configured language module if keypad-* wasn't pressed

        MOV     R0, #ReadCMOS
        MOV     R1, #LanguageCMOS
        SWI     XOS_Byte

        MOV     R0, #ModHandReason_GetNames
        SUB     R1, R2, #1
        MOV     R2, #0                  ; preferred incarnation
        SWI     XOS_Module
        ADRVSL  R3, UtilityMod
Robert Sprowson's avatar
Robert Sprowson committed
1059
        LDR     R2, [R3, #Module_TitleStr]
Neil Turton's avatar
Neil Turton committed
1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
        CMP     R2, #0
        ADDNE   R1, R3, R2
DoStartSuper
        ADREQL  R1, UtilModTitle        ; ALWAYS enter via SWI: sets CAO etc.
        MOV     R0, #ModHandReason_Enter
        ADRL    R2, crstring            ; no environment
        SWI     XOS_Module
        CMP     r0, r0                  ; set EQ if failed to enter config.lang
        B       DoStartSuper            ; -> force Super entry


Jeffrey Lee's avatar
Jeffrey Lee committed
1071
str_booterror   DCB     "Boot$$Error",0
Neil Turton's avatar
Neil Turton committed
1072 1073 1074
                ALIGN

        END